[libcamera-devel] [PATCH v3 2/6] libcamera: pipeline_handler: Add map from devnum to cameras

Paul Elder paul.elder at ideasonboard.com
Mon Dec 23 08:26:16 CET 2019


The V4L2 compatibility layer will need a way to map device numbers to
libcamera Cameras. As a first step, we add a map from devnum to Cameras
to PipelineHandler, as well as an overloaded registerCamera() method to
add to this map.

Signed-off-by: Paul Elder <paul.elder at ideasonboard.com>

---
New in v3
---
 src/libcamera/include/pipeline_handler.h |  6 +++++
 src/libcamera/pipeline_handler.cpp       | 30 ++++++++++++++++++++++++
 2 files changed, 36 insertions(+)

diff --git a/src/libcamera/include/pipeline_handler.h b/src/libcamera/include/pipeline_handler.h
index f3622631..563de72a 100644
--- a/src/libcamera/include/pipeline_handler.h
+++ b/src/libcamera/include/pipeline_handler.h
@@ -12,6 +12,7 @@
 #include <memory>
 #include <set>
 #include <string>
+#include <sys/sysmacros.h>
 #include <vector>
 
 #include <ipa/ipa_interface.h>
@@ -84,9 +85,13 @@ public:
 
 	const char *name() const { return name_; }
 
+	const std::map<dev_t, std::weak_ptr<Camera>> &camerasByDevnum() const { return camerasByDevnum_; }
+
 protected:
 	void registerCamera(std::shared_ptr<Camera> camera,
 			    std::unique_ptr<CameraData> data);
+	void registerCamera(std::shared_ptr<Camera> camera,
+			    std::unique_ptr<CameraData> data, dev_t devnum);
 	void hotplugMediaDevice(MediaDevice *media);
 
 	virtual int queueRequestDevice(Camera *camera, Request *request) = 0;
@@ -102,6 +107,7 @@ private:
 	std::vector<std::shared_ptr<MediaDevice>> mediaDevices_;
 	std::vector<std::weak_ptr<Camera>> cameras_;
 	std::map<const Camera *, std::unique_ptr<CameraData>> cameraData_;
+	std::map<dev_t, std::weak_ptr<Camera>> camerasByDevnum_;
 
 	const char *name_;
 
diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp
index 5badf31c..90211f12 100644
--- a/src/libcamera/pipeline_handler.cpp
+++ b/src/libcamera/pipeline_handler.cpp
@@ -7,6 +7,8 @@
 
 #include "pipeline_handler.h"
 
+#include <sys/sysmacros.h>
+
 #include <libcamera/buffer.h>
 #include <libcamera/camera.h>
 #include <libcamera/camera_manager.h>
@@ -453,6 +455,28 @@ void PipelineHandler::registerCamera(std::shared_ptr<Camera> camera,
 	manager_->addCamera(std::move(camera));
 }
 
+/**
+ * \brief Register a camera to the camera manager and pipeline handler
+ * \param[in] camera The camera to be added
+ * \param[in] data Pipeline-specific data for the camera
+ * \param[in] devnum Device number of the camera
+ *
+ * This method is called by pipeline handlers to register the cameras they
+ * handle with the camera manager. It associates the pipeline-specific \a data
+ * with the camera, for later retrieval with cameraData(). Ownership of \a data
+ * is transferred to the PipelineHandler.
+ *
+ * \a devnum is the device number (as returned by makedev) that the \a camera
+ * is to be associated with.
+ */
+void PipelineHandler::registerCamera(std::shared_ptr<Camera> camera,
+				     std::unique_ptr<CameraData> data,
+				     dev_t devnum)
+{
+	registerCamera(camera, std::move(data));
+	camerasByDevnum_[devnum] = camera;
+}
+
 /**
  * \brief Enable hotplug handling for a media device
  * \param[in] media The media device
@@ -538,6 +562,12 @@ CameraData *PipelineHandler::cameraData(const Camera *camera)
  * \return The pipeline handler name
  */
 
+/**
+ * \fn PipelineHandler::camerasByDevnum()
+ * \brief Retrieve the map of devnums to cameras
+ * \return The map of devnums to cameras
+ */
+
 /**
  * \class PipelineHandlerFactory
  * \brief Registration of PipelineHandler classes and creation of instances
-- 
2.23.0



More information about the libcamera-devel mailing list