[libcamera-devel] [PATCH v3 4/6] libcamera: camera_manager: allow retrieving cameras by devnum
Jacopo Mondi
jacopo at jmondi.org
Fri Dec 27 13:58:05 CET 2019
Hi Paul,
On Mon, Dec 23, 2019 at 01:26:18AM -0600, Paul Elder wrote:
> Expose a method to retrieve Cameras by devnum. The map of devnum to
Camera instances by device number ?
> Camera is gathered from all PipelineHandlers. This method is mainly for
ipeline handlers
> the V4L2 compatibility layer, in order to match V4L2 devices to
> libcamera Cameras.
Camera
Do not pluralize class names :)
>
> 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_;
Do you need to store these as shared pointers ?
I don't think it's a big deal, but CameraManager already has a vector
of Camera shared_ptr, adding one reference (for some cameras only, the
ones created with a devnum associated) might not be needed. I would
store them as weak_ptr and return iter->second.lock() in the get()
implementation.
The implications are minor, so it's really up to you.
>
> 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();
&devMap
> + 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
"Retrieve a camera" ? Even if the other get() impmentation has this
very same documentation
> + * \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;
> +}
> +
Minors apart:
Reviewed-by: Jacopo Mondi <jacopo at jmondi.org>
Thanks
j
> /**
> * \brief Add a camera to the camera manager
> * \param[in] camera The camera to be added
> --
> 2.23.0
>
> _______________________________________________
> libcamera-devel mailing list
> libcamera-devel at lists.libcamera.org
> https://lists.libcamera.org/listinfo/libcamera-devel
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <https://lists.libcamera.org/pipermail/libcamera-devel/attachments/20191227/81783be9/attachment.sig>
More information about the libcamera-devel
mailing list