summaryrefslogtreecommitdiff
path: root/src/libcamera/camera_manager.cpp
diff options
context:
space:
mode:
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);
}
/**