Mandate creationg of pipeline-specific data by pipeline handlers. This allows simplifying the API by passing the pipeline-specific data to the registerCamera() method and removing the separate setCameraData() method. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
113 lines
2.8 KiB
C++
113 lines
2.8 KiB
C++
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
|
/*
|
|
* Copyright (C) 2018, Google Inc.
|
|
*
|
|
* pipeline_handler.h - Pipeline handler infrastructure
|
|
*/
|
|
#ifndef __LIBCAMERA_PIPELINE_HANDLER_H__
|
|
#define __LIBCAMERA_PIPELINE_HANDLER_H__
|
|
|
|
#include <map>
|
|
#include <memory>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
namespace libcamera {
|
|
|
|
class BufferPool;
|
|
class Camera;
|
|
class CameraManager;
|
|
class DeviceEnumerator;
|
|
class MediaDevice;
|
|
class PipelineHandler;
|
|
class Request;
|
|
class Stream;
|
|
class StreamConfiguration;
|
|
|
|
class CameraData
|
|
{
|
|
public:
|
|
explicit CameraData(PipelineHandler *pipe)
|
|
: pipe_(pipe)
|
|
{
|
|
}
|
|
virtual ~CameraData() {}
|
|
|
|
Camera *camera_;
|
|
PipelineHandler *pipe_;
|
|
|
|
private:
|
|
CameraData(const CameraData &) = delete;
|
|
CameraData &operator=(const CameraData &) = delete;
|
|
};
|
|
|
|
class PipelineHandler : public std::enable_shared_from_this<PipelineHandler>
|
|
{
|
|
public:
|
|
PipelineHandler(CameraManager *manager);
|
|
virtual ~PipelineHandler();
|
|
|
|
virtual bool match(DeviceEnumerator *enumerator) = 0;
|
|
|
|
virtual std::map<Stream *, StreamConfiguration>
|
|
streamConfiguration(Camera *camera, std::set<Stream *> &streams) = 0;
|
|
virtual int configureStreams(Camera *camera,
|
|
std::map<Stream *, StreamConfiguration> &config) = 0;
|
|
|
|
virtual int allocateBuffers(Camera *camera, Stream *stream) = 0;
|
|
virtual int freeBuffers(Camera *camera, Stream *stream) = 0;
|
|
|
|
virtual int start(Camera *camera) = 0;
|
|
virtual void stop(Camera *camera) = 0;
|
|
|
|
virtual int queueRequest(Camera *camera, Request *request) = 0;
|
|
|
|
protected:
|
|
void registerCamera(std::shared_ptr<Camera> camera,
|
|
std::unique_ptr<CameraData> data);
|
|
void hotplugMediaDevice(MediaDevice *media);
|
|
|
|
CameraData *cameraData(const Camera *camera);
|
|
|
|
CameraManager *manager_;
|
|
|
|
private:
|
|
void mediaDeviceDisconnected(MediaDevice *media);
|
|
virtual void disconnect();
|
|
|
|
std::vector<std::weak_ptr<Camera>> cameras_;
|
|
std::map<const Camera *, std::unique_ptr<CameraData>> cameraData_;
|
|
};
|
|
|
|
class PipelineHandlerFactory
|
|
{
|
|
public:
|
|
PipelineHandlerFactory(const char *name);
|
|
virtual ~PipelineHandlerFactory() { };
|
|
|
|
virtual std::shared_ptr<PipelineHandler> create(CameraManager *manager) = 0;
|
|
|
|
const std::string &name() const { return name_; }
|
|
|
|
static void registerType(PipelineHandlerFactory *factory);
|
|
static std::vector<PipelineHandlerFactory *> &factories();
|
|
|
|
private:
|
|
std::string name_;
|
|
};
|
|
|
|
#define REGISTER_PIPELINE_HANDLER(handler) \
|
|
class handler##Factory final : public PipelineHandlerFactory \
|
|
{ \
|
|
public: \
|
|
handler##Factory() : PipelineHandlerFactory(#handler) {} \
|
|
std::shared_ptr<PipelineHandler> create(CameraManager *manager) \
|
|
{ \
|
|
return std::make_shared<handler>(manager); \
|
|
} \
|
|
}; \
|
|
static handler##Factory global_##handler##Factory;
|
|
|
|
} /* namespace libcamera */
|
|
|
|
#endif /* __LIBCAMERA_PIPELINE_HANDLER_H__ */
|