[libcamera-devel] [PATCH v3 5/5] libcamera: pipeline: Register device numbers with camera
Kieran Bingham
kieran.bingham at ideasonboard.com
Thu Jun 15 19:19:43 CEST 2023
Quoting Kieran Bingham (2023-06-15 13:41:16)
> Quoting Jacopo Mondi (2023-06-15 12:40:36)
> > Hi Kieran
> >
> > On Mon, May 15, 2023 at 01:45:50PM +0100, Kieran Bingham via libcamera-devel wrote:
> > > Register the identified device numbers with each camera as the Devices
> > > property.
> > >
> > > This facilitates camera daemons or other systems to identify which
> > > devices are being managed by libcamera, and can prevent duplication of
> > > camera resources.
> > >
> > > As the Devices property now provides this list of devices, use it
> > > directly from within the CameraManager when adding a Camera rather than
> > > passing it through the internal API.
> > >
> > > Signed-off-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
> > > ---
> > > include/libcamera/internal/camera_manager.h | 3 +--
> > > src/libcamera/camera_manager.cpp | 14 +++++++++-----
> > > src/libcamera/pipeline_handler.cpp | 12 ++++++++++--
> > > 3 files changed, 20 insertions(+), 9 deletions(-)
> > >
> > > diff --git a/include/libcamera/internal/camera_manager.h b/include/libcamera/internal/camera_manager.h
> > > index 885bb2825687..680e1f58cb02 100644
> > > --- a/include/libcamera/internal/camera_manager.h
> > > +++ b/include/libcamera/internal/camera_manager.h
> > > @@ -29,8 +29,7 @@ public:
> > > Private();
> > >
> > > int start();
> > > - void addCamera(std::shared_ptr<Camera> camera,
> > > - const std::vector<dev_t> &devnums) LIBCAMERA_TSA_EXCLUDES(mutex_);
> > > + void addCamera(std::shared_ptr<Camera> camera) LIBCAMERA_TSA_EXCLUDES(mutex_);
> > > void removeCamera(std::shared_ptr<Camera> camera) LIBCAMERA_TSA_EXCLUDES(mutex_);
> > >
> > > /*
> > > diff --git a/src/libcamera/camera_manager.cpp b/src/libcamera/camera_manager.cpp
> > > index 70eb4e455e54..7e499def9ddc 100644
> > > --- a/src/libcamera/camera_manager.cpp
> > > +++ b/src/libcamera/camera_manager.cpp
> > > @@ -15,7 +15,9 @@
> > > #include <libcamera/base/utils.h>
> > >
> > > #include <libcamera/camera.h>
> > > +#include <libcamera/property_ids.h>
> > >
> > > +#include "libcamera/internal/camera.h"
> >
> > This already includes <libcamera/camera.h>
> >
> > doesn't hurt though
> >
> > > #include "libcamera/internal/device_enumerator.h"
> > > #include "libcamera/internal/pipeline_handler.h"
> > >
> > > @@ -150,19 +152,17 @@ void CameraManager::Private::cleanup()
> > > /**
> > > * \brief Add a camera to the camera manager
> > > * \param[in] camera The camera to be added
> > > - * \param[in] devnums The device numbers 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 devnums are used by the V4L2 compatibility layer to map V4L2 device nodes
> > > - * to Camera instances.
> > > + * Device numbers from the Devices property are used by the V4L2 compatibility
> > > + * layer to map V4L2 device nodes to Camera instances.
> > > *
> > > * \context This function shall be called from the CameraManager thread.
> > > */
> > > -void CameraManager::Private::addCamera(std::shared_ptr<Camera> camera,
> > > - const std::vector<dev_t> &devnums)
> > > +void CameraManager::Private::addCamera(std::shared_ptr<Camera> camera)
> > > {
> > > ASSERT(Thread::current() == this);
> > >
> > > @@ -177,6 +177,10 @@ void CameraManager::Private::addCamera(std::shared_ptr<Camera> camera,
> > > }
> > > }
> > >
> > > + auto devnums = camera->properties()
> > > + .get(properties::Devices)
> > > + .value_or(Span<int64_t>{});
> > > +
> >
> > Weird indent
This gets through checkstyle, while
> >
> > auto devnums = camera->properties().get(properties::Devices)
> > .value_or(Span<int64_t>{});
If I apply the above it causes:
--- src/libcamera/camera_manager.cpp
+++ src/libcamera/camera_manager.cpp
@@ -178,8 +178,7 @@
}
}
- auto devnums = camera->properties().get(properties::SystemDevices)
- .value_or(Span<int64_t>{});
+ auto devnums = camera->properties().get(properties::SystemDevices).value_or(Span<int64_t>{});
cameras_.push_back(std::move(camera));
To fit all on one line which is longer than 80 chars.
I prefer the hanging indent for the chained calls, so I'll leave it as
it is in this patch.
> >
> > ?
> >
> > I guess we don't need to make sure devnums is populated, right ?
>
> No - if we end up with Virtual pipeline handlers there wouldn't be any
> devnums anyway.
>
> I'd expect we can later update the V4L2 Adaptation layer to use the
> Property directly and clean up this 'extra registration' too.
>
> I wanted to get the core implementation handled first though.
>
> --
> Kieran
>
>
> >
> > > cameras_.push_back(std::move(camera));
> > >
> > > unsigned int index = cameras_.size() - 1;
> > > diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp
> > > index 49092ea88a58..0b5fac7ad113 100644
> > > --- a/src/libcamera/pipeline_handler.cpp
> > > +++ b/src/libcamera/pipeline_handler.cpp
> > > @@ -17,6 +17,7 @@
> > >
> > > #include <libcamera/camera.h>
> > > #include <libcamera/framebuffer.h>
> > > +#include <libcamera/property_ids.h>
> > >
> > > #include "libcamera/internal/camera.h"
> > > #include "libcamera/internal/camera_manager.h"
> > > @@ -612,7 +613,7 @@ void PipelineHandler::registerCamera(std::shared_ptr<Camera> camera)
> > > * Walk the entity list and map the devnums of all capture video nodes
> > > * to the camera.
> > > */
> > > - std::vector<dev_t> devnums;
> > > + std::vector<int64_t> devnums;
> > > for (const std::shared_ptr<MediaDevice> &media : mediaDevices_) {
> > > for (const MediaEntity *entity : media->entities()) {
> > > if (entity->pads().size() == 1 &&
> > > @@ -624,7 +625,14 @@ void PipelineHandler::registerCamera(std::shared_ptr<Camera> camera)
> > > }
> > > }
> > >
> > > - manager_->_d()->addCamera(std::move(camera), devnums);
> > > + /*
> > > + * Store the associated devices as a property of the camera to allow
> > > + * systems to identify which devices are managed by libcamera.
> > > + */
> > > + Camera::Private *data = camera->_d();
> > > + data->properties_.set(properties::Devices, devnums);
> > > +
> > > + manager_->_d()->addCamera(std::move(camera));
> >
> > The rest looks good
> > Reviewed-by: Jacopo Mondi <jacopo.mondi at ideasonboard.com>
> >
> > Thanks
> > j
> >
> > > }
> > >
> > > /**
> > > --
> > > 2.34.1
> > >
More information about the libcamera-devel
mailing list