From bff6d952816ba0d516785eb57953285a5b324370 Mon Sep 17 00:00:00 2001 From: Kieran Bingham Date: Tue, 4 Jul 2023 23:57:45 +0100 Subject: v4l2: Use SystemDevices properties to identify cameras 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. Reviewed-by: Laurent Pinchart Signed-off-by: Kieran Bingham --- src/v4l2/v4l2_compat_manager.cpp | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/src/v4l2/v4l2_compat_manager.cpp b/src/v4l2/v4l2_compat_manager.cpp index 0f7575c5..5e8cdb4f 100644 --- a/src/v4l2/v4l2_compat_manager.cpp +++ b/src/v4l2/v4l2_compat_manager.cpp @@ -24,6 +24,7 @@ #include #include +#include #include "v4l2_camera_file.h" @@ -113,14 +114,35 @@ int V4L2CompatManager::getCameraIndex(int fd) if (ret < 0) return -1; - std::shared_ptr 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; + Span devices = camera->properties() + .get(properties::SystemDevices) + .value_or(Span{}); + + /* + * 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 Each camera can be accessed through any of the video + * device nodes that it uses. This may confuse applications. + * Consider reworking the V4L2 adaptation layer to instead + * expose each Camera instance through a single video device + * node (with a consistent and stable mapping). The other + * device nodes could possibly be hidden from the application + * by intercepting additional calls to the C library. + */ + for (const int64_t dev : devices) { + if (dev == static_cast(devnum)) + return index; + } } return -1; -- cgit v1.2.1