[libcamera-devel] [PATCH 1/2] libcamera: pipeline_handler: Add CameraData
Jacopo Mondi
jacopo at jmondi.org
Thu Jan 24 12:30:19 CET 2019
Add class definition and methods to associate a Camera with specific data
in the pipeline_handler base class.
Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
---
src/libcamera/include/pipeline_handler.h | 24 +++++++-
src/libcamera/pipeline_handler.cpp | 73 ++++++++++++++++++++++++
2 files changed, 96 insertions(+), 1 deletion(-)
diff --git a/src/libcamera/include/pipeline_handler.h b/src/libcamera/include/pipeline_handler.h
index b03217d..41699a5 100644
--- a/src/libcamera/include/pipeline_handler.h
+++ b/src/libcamera/include/pipeline_handler.h
@@ -11,17 +11,39 @@
#include <string>
#include <vector>
+#include <libcamera/camera.h>
+
namespace libcamera {
class CameraManager;
class DeviceEnumerator;
+class CameraData
+{
+public:
+ virtual ~CameraData() {}
+
+protected:
+ CameraData() {}
+
+private:
+ CameraData(const CameraData &) = delete;
+ void operator=(const CameraData &) = delete;
+};
+
class PipelineHandler
{
public:
- virtual ~PipelineHandler() { };
+ virtual ~PipelineHandler();
virtual bool match(CameraManager *manager, DeviceEnumerator *enumerator) = 0;
+
+protected:
+ CameraData *cameraData(const Camera *camera);
+ void setCameraData(const Camera *camera, std::unique_ptr<CameraData> data);
+
+private:
+ 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 c24feea..fb49fde 100644
--- a/src/libcamera/pipeline_handler.cpp
+++ b/src/libcamera/pipeline_handler.cpp
@@ -8,6 +8,8 @@
#include "log.h"
#include "pipeline_handler.h"
+#include <libcamera/camera.h>
+
/**
* \file pipeline_handler.h
* \brief Create pipelines and cameras from a set of media devices
@@ -26,6 +28,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
@@ -66,6 +82,63 @@ LOG_DEFINE_CATEGORY(Pipeline)
* created, or false otherwise
*/
+/**
+ * \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();
+};
+
+/**
+ * \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
--
2.20.1
More information about the libcamera-devel
mailing list