diff options
Diffstat (limited to 'src/libcamera/camera_manager.cpp')
-rw-r--r-- | src/libcamera/camera_manager.cpp | 61 |
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); } /** |