summaryrefslogtreecommitdiff
path: root/src/libcamera/camera_manager.cpp
diff options
context:
space:
mode:
authorPaul Elder <paul.elder@ideasonboard.com>2019-12-22 02:31:56 -0600
committerPaul Elder <paul.elder@ideasonboard.com>2020-01-03 19:53:14 -0500
commiteffe4d6ced881486ef1d17448c7a53aa36ef41eb (patch)
tree8396311e1587ae93842f68baced2ecbe72ec6aec /src/libcamera/camera_manager.cpp
parent58a19b9d56e5002367794ef0d2e9cf8dcd8d0be5 (diff)
libcamera: camera_manager, pipeline_handler: allow retrieving cameras by device numbers
The V4L2 compatibility layer will need a way to map device numbers to libcamera Camera instances. Expose a method in the camera manager to retrieve Camera instances by devnum. The mapping from device numbers to Camera instances is optionally declared by pipeline handlers when they register cameras with the camera manager. Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Diffstat (limited to 'src/libcamera/camera_manager.cpp')
-rw-r--r--src/libcamera/camera_manager.cpp61
1 files changed, 51 insertions, 10 deletions
diff --git a/src/libcamera/camera_manager.cpp b/src/libcamera/camera_manager.cpp
index 7c6f72bb..a71caf85 100644
--- a/src/libcamera/camera_manager.cpp
+++ b/src/libcamera/camera_manager.cpp
@@ -181,14 +181,41 @@ std::shared_ptr<Camera> CameraManager::get(const std::string &name)
}
/**
+ * \brief Retrieve a camera based on device number
+ * \param[in] devnum Device number of camera to get
+ *
+ * This method is meant solely for the use of the V4L2 compatibility
+ * layer, to map device nodes to Camera instances. Applications shall
+ * not use it and shall instead retrieve cameras by name.
+ *
+ * Before calling this function the caller is responsible for ensuring that
+ * the camera manager is running.
+ *
+ * \return Shared pointer to Camera object, which is empty if the camera is
+ * 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.lock();
+}
+
+/**
* \brief Add a camera to the camera manager
* \param[in] camera The camera to be added
+ * \param[in] devnum The device number to associate with \a camera
*
* This function is called by pipeline handlers to register the cameras they
* handle with the camera manager. Registered cameras are immediately made
* available to the system.
+ *
+ * \a devnum is used by the V4L2 compatibility layer to map V4L2 device nodes
+ * to Camera instances.
*/
-void CameraManager::addCamera(std::shared_ptr<Camera> camera)
+void CameraManager::addCamera(std::shared_ptr<Camera> camera, dev_t devnum)
{
for (std::shared_ptr<Camera> c : cameras_) {
if (c->name() == camera->name()) {
@@ -200,6 +227,11 @@ void CameraManager::addCamera(std::shared_ptr<Camera> camera)
}
cameras_.push_back(std::move(camera));
+
+ if (devnum) {
+ unsigned int index = cameras_.size() - 1;
+ camerasByDevnum_[devnum] = cameras_[index];
+ }
}
/**
@@ -212,15 +244,24 @@ void CameraManager::addCamera(std::shared_ptr<Camera> camera)
*/
void CameraManager::removeCamera(Camera *camera)
{
- for (auto iter = cameras_.begin(); iter != cameras_.end(); ++iter) {
- if (iter->get() == camera) {
- LOG(Camera, Debug)
- << "Unregistering camera '"
- << camera->name() << "'";
- cameras_.erase(iter);
- return;
- }
- }
+ auto iter = std::find_if(cameras_.begin(), cameras_.end(),
+ [camera](std::shared_ptr<Camera> &c) {
+ return c.get() == camera;
+ });
+ if (iter == cameras_.end())
+ return;
+
+ LOG(Camera, Debug)
+ << "Unregistering camera '" << camera->name() << "'";
+
+ auto iter_d = std::find_if(camerasByDevnum_.begin(), camerasByDevnum_.end(),
+ [camera](const std::pair<dev_t, std::weak_ptr<Camera>> &p) {
+ return p.second.lock().get() == camera;
+ });
+ if (iter_d != camerasByDevnum_.end())
+ camerasByDevnum_.erase(iter_d);
+
+ cameras_.erase(iter);
}
/**