[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