[libcamera-devel] [PATCH v3 4/6] libcamera: camera_manager: allow retrieving cameras by devnum

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


Expose a method to retrieve Cameras by devnum. The map of devnum to
Camera is gathered from all PipelineHandlers. This method is mainly for
the V4L2 compatibility layer, in order to match V4L2 devices to
libcamera Cameras.

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

---
New in v3
---
 include/libcamera/camera_manager.h |  3 +++
 src/libcamera/camera_manager.cpp   | 24 ++++++++++++++++++++++++
 2 files changed, 27 insertions(+)

diff --git a/include/libcamera/camera_manager.h b/include/libcamera/camera_manager.h
index 8331898c..6ce63912 100644
--- a/include/libcamera/camera_manager.h
+++ b/include/libcamera/camera_manager.h
@@ -7,6 +7,7 @@
 #ifndef __LIBCAMERA_CAMERA_MANAGER_H__
 #define __LIBCAMERA_CAMERA_MANAGER_H__
 
+#include <map>
 #include <memory>
 #include <string>
 #include <vector>
@@ -33,6 +34,7 @@ public:
 
 	const std::vector<std::shared_ptr<Camera>> &cameras() const { return cameras_; }
 	std::shared_ptr<Camera> get(const std::string &name);
+	std::shared_ptr<Camera> get(dev_t devnum);
 
 	void addCamera(std::shared_ptr<Camera> camera);
 	void removeCamera(Camera *camera);
@@ -46,6 +48,7 @@ private:
 	std::unique_ptr<DeviceEnumerator> enumerator_;
 	std::vector<std::shared_ptr<PipelineHandler>> pipes_;
 	std::vector<std::shared_ptr<Camera>> cameras_;
+	std::map<dev_t, std::shared_ptr<Camera>> camerasByDevnum_;
 
 	static const std::string version_;
 	static CameraManager *self_;
diff --git a/src/libcamera/camera_manager.cpp b/src/libcamera/camera_manager.cpp
index 7c6f72bb..1354df4c 100644
--- a/src/libcamera/camera_manager.cpp
+++ b/src/libcamera/camera_manager.cpp
@@ -121,6 +121,11 @@ int CameraManager::start()
 		}
 	}
 
+	for (std::shared_ptr<PipelineHandler> pipe : pipes_) {
+		const std::map<dev_t, std::weak_ptr<Camera>> devMap = pipe->camerasByDevnum();
+		camerasByDevnum_.insert(devMap.begin(), devMap.end());
+	}
+
 	/* TODO: register hot-plug callback here */
 
 	return 0;
@@ -180,6 +185,25 @@ std::shared_ptr<Camera> CameraManager::get(const std::string &name)
 	return nullptr;
 }
 
+/**
+ * \brief Get a camera based on devnum
+ * \param[in] devnum Device number of camera to get
+ *
+ * Before calling this function the caller is responsible for ensuring that
+ * the camera manager is running.
+ *
+ * \return Shared pointer to Camera object or nullptr if camera not found
+ */
+std::shared_ptr<Camera> CameraManager::get(dev_t devnum)
+{
+	auto iter = camerasByDevnum_.find(devnum);
+
+	if (iter == camerasByDevnum_.end())
+		return nullptr;
+
+	return iter->second;
+}
+
 /**
  * \brief Add a camera to the camera manager
  * \param[in] camera The camera to be added
-- 
2.23.0



More information about the libcamera-devel mailing list