[libcamera-devel] [PATCH 1/2] v4l2: Use SystemDevices properties to identify cameras
Kieran Bingham
kieran.bingham at ideasonboard.com
Sun Jun 18 00:10:35 CEST 2023
Quoting Barnabás Pőcze (2023-06-16 15:27:27)
> Hi
>
>
> 2023. június 16., péntek 0:51 keltezéssel, Kieran Bingham via libcamera-devel <libcamera-devel at lists.libcamera.org> írta:
>
> > The CameraManager->get(dev_t) helper was implemented only to support the
> > V4L2 Adaptation layer, and has been deprecated now that a new camera
> > property - SystemDevices has been introduced.
> >
> > Rework the implementation of getCameraIndex() to use the SystemDevices
> > property and remove reliance on the now deprecated call.
> >
> > Signed-off-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
> > ---
> > src/v4l2/v4l2_compat_manager.cpp | 28 +++++++++++++++++++++++-----
> > 1 file changed, 23 insertions(+), 5 deletions(-)
> >
> > diff --git a/src/v4l2/v4l2_compat_manager.cpp b/src/v4l2/v4l2_compat_manager.cpp
> > index 0f7575c54b22..c49124290b42 100644
> > --- a/src/v4l2/v4l2_compat_manager.cpp
> > +++ b/src/v4l2/v4l2_compat_manager.cpp
> > @@ -24,6 +24,7 @@
> >
> > #include <libcamera/camera.h>
> > #include <libcamera/camera_manager.h>
> > +#include <libcamera/property_ids.h>
> >
> > #include "v4l2_camera_file.h"
> >
> > @@ -113,14 +114,31 @@ int V4L2CompatManager::getCameraIndex(int fd)
> > if (ret < 0)
> > return -1;
> >
> > - std::shared_ptr<Camera> target = cm_->get(statbuf.st_rdev);
> > - if (!target)
> > - return -1;
> > + const dev_t devnum = statbuf.st_rdev;
> >
> > + /*
> > + * Iterate each known camera and identify if it reports this nodes
> > + * device number in its list of SystemDevices.
> > + */
> > auto cameras = cm_->cameras();
> > for (auto [index, camera] : utils::enumerate(cameras)) {
> > - if (camera == target)
> > - return index;
> > + const auto devices = camera->properties()
> > + .get(properties::SystemDevices)
> > + .value_or(std::vector<int64_t>{});
>
> Why a vector? Why not `Span<int64_t>{}`?
I think I just used vector because that's the control type. But I think
you're right, a Span could potentially work here.
I'll try it and if it works I'll use that.
--
Kieran
>
>
> > +
> > + /*
> > + * While there may be multiple Cameras that could reference the
> > + * same device node, we take a first match as a best effort for
> > + * now.
> > + *
> > + * \todo Consider reworking the V4L2 adaptation layer to stop
> > + * trying to map video nodes directly to a camera and instead
> > + * hide all devices that may be used by libcamera and expose a
> > + * consistent 1:1 mapping with each Camera instance.
> > + */
> > + for (const int64_t dev : devices)
> > + if (dev == static_cast<int64_t>(devnum))
> > + return index;
> > }
> >
> > return -1;
> > --
> > 2.34.1
> >
>
>
> Regards,
> Barnabás Pőcze
More information about the libcamera-devel
mailing list