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 <laurent.pinchart@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
This commit is contained in:
parent
f7a9f14156
commit
bff6d95281
1 changed files with 27 additions and 5 deletions
|
@ -24,6 +24,7 @@
|
||||||
|
|
||||||
#include <libcamera/camera.h>
|
#include <libcamera/camera.h>
|
||||||
#include <libcamera/camera_manager.h>
|
#include <libcamera/camera_manager.h>
|
||||||
|
#include <libcamera/property_ids.h>
|
||||||
|
|
||||||
#include "v4l2_camera_file.h"
|
#include "v4l2_camera_file.h"
|
||||||
|
|
||||||
|
@ -113,14 +114,35 @@ int V4L2CompatManager::getCameraIndex(int fd)
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
std::shared_ptr<Camera> target = cm_->get(statbuf.st_rdev);
|
const dev_t devnum = statbuf.st_rdev;
|
||||||
if (!target)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Iterate each known camera and identify if it reports this nodes
|
||||||
|
* device number in its list of SystemDevices.
|
||||||
|
*/
|
||||||
auto cameras = cm_->cameras();
|
auto cameras = cm_->cameras();
|
||||||
for (auto [index, camera] : utils::enumerate(cameras)) {
|
for (auto [index, camera] : utils::enumerate(cameras)) {
|
||||||
if (camera == target)
|
Span<const int64_t> devices = camera->properties()
|
||||||
return index;
|
.get(properties::SystemDevices)
|
||||||
|
.value_or(Span<int64_t>{});
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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<int64_t>(devnum))
|
||||||
|
return index;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue