diff options
-rw-r--r-- | src/libcamera/include/pipeline_handler.h | 18 | ||||
-rw-r--r-- | src/libcamera/pipeline_handler.cpp | 71 |
2 files changed, 88 insertions, 1 deletions
diff --git a/src/libcamera/include/pipeline_handler.h b/src/libcamera/include/pipeline_handler.h index 804cce48..0db84217 100644 --- a/src/libcamera/include/pipeline_handler.h +++ b/src/libcamera/include/pipeline_handler.h @@ -18,6 +18,20 @@ class CameraManager; class DeviceEnumerator; class MediaDevice; +class Camera; +class CameraData +{ +public: + virtual ~CameraData() {} + +protected: + CameraData() {} + +private: + CameraData(const CameraData &) = delete; + void operator=(const CameraData &) = delete; +}; + class PipelineHandler : public std::enable_shared_from_this<PipelineHandler> { public: @@ -32,11 +46,15 @@ protected: void registerCamera(std::shared_ptr<Camera> camera); void hotplugMediaDevice(MediaDevice *media); + CameraData *cameraData(const Camera *camera); + void setCameraData(const Camera *camera, std::unique_ptr<CameraData> data); + private: virtual void disconnect(); void mediaDeviceDisconnected(MediaDevice *media); std::vector<std::weak_ptr<Camera>> cameras_; + std::map<const Camera *, std::unique_ptr<CameraData>> cameraData_; }; class PipelineHandlerFactory diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp index 23631314..4d534498 100644 --- a/src/libcamera/pipeline_handler.cpp +++ b/src/libcamera/pipeline_handler.cpp @@ -12,6 +12,8 @@ #include "media_device.h" #include "pipeline_handler.h" +#include <libcamera/camera.h> + /** * \file pipeline_handler.h * \brief Create pipelines and cameras from a set of media devices @@ -31,6 +33,20 @@ namespace libcamera { LOG_DEFINE_CATEGORY(Pipeline) /** + * \class CameraData + * \brief Base class for platform-specific data associated with a camera + * + * The CameraData base abstract class represents platform specific-data + * a pipeline handler might want to associate with a Camera to access them + * at a later time. + * + * Pipeline handlers are expected to extend this base class with platform + * specific implementation, associate instances of the derived classes + * using the setCameraData() method, and access them at a later time + * with cameraData(). + */ + +/** * \class PipelineHandler * \brief Create and manage cameras based on a set of media devices * @@ -57,9 +73,16 @@ PipelineHandler::PipelineHandler(CameraManager *manager) { } +/** + * \brief Delete the pipeline handler + * + * Release the cameraData_ map, causing all data there referenced to be + * deleted, as they are stored as unique_ptr<CameraData> + */ PipelineHandler::~PipelineHandler() { -} + cameraData_.clear(); +}; /** * \fn PipelineHandler::match(DeviceEnumerator *enumerator) @@ -169,6 +192,52 @@ void PipelineHandler::mediaDeviceDisconnected(MediaDevice *media) } /** + * \brief Retrieve the pipeline-specific data associated with a Camera + * \param camera The camera data is associate with + * + * \return A pointer to the pipeline-specific data set with setCameraData(). + * The returned pointer lifetime is associated with the one of the pipeline + * handler, and caller of this function shall never release it manually. + */ +CameraData *PipelineHandler::cameraData(const Camera *camera) +{ + if (!cameraData_.count(camera)) { + LOG(Pipeline, Error) + << "Cannot get data associated with camera " + << camera->name(); + return nullptr; + } + + return cameraData_[camera].get(); +} + +/** + * \brief Set pipeline-specific data in the camera + * \param camera The camera to associate data to + * \param data The pipeline-specific data + * + * This method allows pipeline handlers to associate pipeline-specific + * information with \a camera. The \a data lifetime gets associated with + * the pipeline handler one, and gets released at deletion time. + * + * If pipeline-specific data has already been associated with the camera by a + * previous call to this method, is it replaced by \a data and the previous data + * are deleted, rendering all references to them invalid. + * + * The data can be retrieved by pipeline handlers using the cameraData() method. + */ +void PipelineHandler::setCameraData(const Camera *camera, + std::unique_ptr<CameraData> data) +{ + if (cameraData_.count(camera)) + LOG(Pipeline, Debug) + << "Replacing data associated with " + << camera->name(); + + cameraData_[camera] = std::move(data); +} + +/** * \class PipelineHandlerFactory * \brief Registration of PipelineHandler classes and creation of instances * |