<html>Tested-by: Ashok Sidipotu <ashok.sidipotu@collabora.com><br /><br />On Monday, May 15, 2023 18:15 IST, Kieran Bingham <kieran.bingham@ideasonboard.com> wrote:<br /> <blockquote type="cite" cite="20230515124550.3601128-6-kieran.bingham@ideasonboard.com">Register the identified device numbers with each camera as the Devices<br />property.<br /><br />This facilitates camera daemons or other systems to identify which<br />devices are being managed by libcamera, and can prevent duplication of<br />camera resources.<br /><br />As the Devices property now provides this list of devices, use it<br />directly from within the CameraManager when adding a Camera rather than<br />passing it through the internal API.<br /><br />Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com><br />---<br />include/libcamera/internal/camera_manager.h | 3 +--<br />src/libcamera/camera_manager.cpp | 14 +++++++++-----<br />src/libcamera/pipeline_handler.cpp | 12 ++++++++++--<br />3 files changed, 20 insertions(+), 9 deletions(-)<br /><br />diff --git a/include/libcamera/internal/camera_manager.h b/include/libcamera/internal/camera_manager.h<br />index 885bb2825687..680e1f58cb02 100644<br />--- a/include/libcamera/internal/camera_manager.h<br />+++ b/include/libcamera/internal/camera_manager.h<br />@@ -29,8 +29,7 @@ public:<br />Private();<br /><br />int start();<br />- void addCamera(std::shared_ptr<Camera> camera,<br />- const std::vector<dev_t> &devnums) LIBCAMERA_TSA_EXCLUDES(mutex_);<br />+ void addCamera(std::shared_ptr<Camera> camera) LIBCAMERA_TSA_EXCLUDES(mutex_);<br />void removeCamera(std::shared_ptr<Camera> camera) LIBCAMERA_TSA_EXCLUDES(mutex_);<br /><br />/*<br />diff --git a/src/libcamera/camera_manager.cpp b/src/libcamera/camera_manager.cpp<br />index 70eb4e455e54..7e499def9ddc 100644<br />--- a/src/libcamera/camera_manager.cpp<br />+++ b/src/libcamera/camera_manager.cpp<br />@@ -15,7 +15,9 @@<br />#include <libcamera/base/utils.h><br /><br />#include <libcamera/camera.h><br />+#include <libcamera/property_ids.h><br /><br />+#include "libcamera/internal/camera.h"<br />#include "libcamera/internal/device_enumerator.h"<br />#include "libcamera/internal/pipeline_handler.h"<br /><br />@@ -150,19 +152,17 @@ void CameraManager::Private::cleanup()<br />/**<br />* \brief Add a camera to the camera manager<br />* \param[in] camera The camera to be added<br />- * \param[in] devnums The device numbers to associate with \a camera<br />*<br />* This function is called by pipeline handlers to register the cameras they<br />* handle with the camera manager. Registered cameras are immediately made<br />* available to the system.<br />*<br />- * \a devnums are used by the V4L2 compatibility layer to map V4L2 device nodes<br />- * to Camera instances.<br />+ * Device numbers from the Devices property are used by the V4L2 compatibility<br />+ * layer to map V4L2 device nodes to Camera instances.<br />*<br />* \context This function shall be called from the CameraManager thread.<br />*/<br />-void CameraManager::Private::addCamera(std::shared_ptr<Camera> camera,<br />- const std::vector<dev_t> &devnums)<br />+void CameraManager::Private::addCamera(std::shared_ptr<Camera> camera)<br />{<br />ASSERT(Thread::current() == this);<br /><br />@@ -177,6 +177,10 @@ void CameraManager::Private::addCamera(std::shared_ptr<Camera> camera,<br />}<br />}<br /><br />+ auto devnums = camera->properties()<br />+ .get(properties::Devices)<br />+ .value_or(Span<int64_t>{});<br />+<br />cameras_.push_back(std::move(camera));<br /><br />unsigned int index = cameras_.size() - 1;<br />diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp<br />index 49092ea88a58..0b5fac7ad113 100644<br />--- a/src/libcamera/pipeline_handler.cpp<br />+++ b/src/libcamera/pipeline_handler.cpp<br />@@ -17,6 +17,7 @@<br /><br />#include <libcamera/camera.h><br />#include <libcamera/framebuffer.h><br />+#include <libcamera/property_ids.h><br /><br />#include "libcamera/internal/camera.h"<br />#include "libcamera/internal/camera_manager.h"<br />@@ -612,7 +613,7 @@ void PipelineHandler::registerCamera(std::shared_ptr<Camera> camera)<br />* Walk the entity list and map the devnums of all capture video nodes<br />* to the camera.<br />*/<br />- std::vector<dev_t> devnums;<br />+ std::vector<int64_t> devnums;<br />for (const std::shared_ptr<MediaDevice> &media : mediaDevices_) {<br />for (const MediaEntity *entity : media->entities()) {<br />if (entity->pads().size() == 1 &&<br />@@ -624,7 +625,14 @@ void PipelineHandler::registerCamera(std::shared_ptr<Camera> camera)<br />}<br />}<br /><br />- manager_->_d()->addCamera(std::move(camera), devnums);<br />+ /*<br />+ * Store the associated devices as a property of the camera to allow<br />+ * systems to identify which devices are managed by libcamera.<br />+ */<br />+ Camera::Private *data = camera->_d();<br />+ data->properties_.set(properties::Devices, devnums);<br />+<br />+ manager_->_d()->addCamera(std::move(camera));<br />}<br /><br />/**<br />--<br />2.34.1<br /> </blockquote><br /><br /> </html>