From patchwork Mon May 15 12:45:46 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kieran Bingham X-Patchwork-Id: 18630 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 429B4BDE6B for ; Mon, 15 May 2023 12:45:58 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 712C66286D; Mon, 15 May 2023 14:45:55 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1684154755; bh=aaZMqUPcooHCbX/fwLlmEMqE0g1nrz40v8z9hWQhgWE=; h=To:Date:In-Reply-To:References:Subject:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=HRh0x1FC5ALEZH1zJ4x7RWrEe/QWLmjnwE6cDYBi+LZdv5MSg0xi9F5esIdQeKKXd C+FgexVoY5wSvi3WEBfmBx3wjzVLR+f3f9QeMTOSifAhtB3iQNAggm9ecpPE8y6++g qYsMnCu7Vwj9WKyXMM0skKm7dOis8ywVwgbSYTWw6x4sdbKCJfjToPZ5uHC1zuljAp cq8Elbj3+4ks7ifkQy1NWEOqG4VGJxOLtlAw4qd6bdS0U/Rx3Bw5+jR1NA5sglrw8b 8X6KpkTCJi1+zSP8dfhIRKIu6JOkMksmtQR5/vaogShh7u7BDXvuskcBYiGEr4vy04 faoRbYsSofGmQ== Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id EDE4F60493 for ; Mon, 15 May 2023 14:45:53 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="AVmXYFMI"; dkim-atps=neutral Received: from Monstersaurus.local (aztw-30-b2-v4wan-166917-cust845.vm26.cable.virginm.net [82.37.23.78]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 2256D7E1; Mon, 15 May 2023 14:45:43 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1684154743; bh=aaZMqUPcooHCbX/fwLlmEMqE0g1nrz40v8z9hWQhgWE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=AVmXYFMIsp11qhVQniD/L6WzYPcqfm+Rr9nXVbi3oT4V+xOcdh7UiLIJzicK0qevq AmZ6QPTHQioh+3dDt5uIcVMg0l3SR4N/ZnnLCkbIRR5whShz5hAmsznu+Zrl5BNPh/ D/0Pq7QyyxfPncXD+SXRzUW7rCJ6KKfpoNNPBnco= To: libcamera devel Date: Mon, 15 May 2023 13:45:46 +0100 Message-Id: <20230515124550.3601128-2-kieran.bingham@ideasonboard.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230515124550.3601128-1-kieran.bingham@ideasonboard.com> References: <20230515124550.3601128-1-kieran.bingham@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v3 1/5] libcamera: internal: request: convert to pragma once X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Kieran Bingham via libcamera-devel From: Kieran Bingham Reply-To: Kieran Bingham Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" Remove the verbose #ifndef/#define/#endif pattern for maintaining header idempotency, and replace it with a simple #pragma once. This simplifies the headers, and prevents redundant changes when header files get moved. The internal/request.h was missed at the time of the original conversion. Update it. Fixes: df131ad08893 ("libcamera: internal: Convert to pragma once") Signed-off-by: Kieran Bingham Tested-by: Ashok Sidipotu Signed-off-by: Kieran Bingham Reviewed-by: Laurent Pinchart Reviewed-by: Jacopo Mondi --- include/libcamera/internal/request.h | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/include/libcamera/internal/request.h b/include/libcamera/internal/request.h index 8c92a27a95e5..3454cf5a72f5 100644 --- a/include/libcamera/internal/request.h +++ b/include/libcamera/internal/request.h @@ -4,8 +4,8 @@ * * request.h - Request class private data */ -#ifndef __LIBCAMERA_INTERNAL_REQUEST_H__ -#define __LIBCAMERA_INTERNAL_REQUEST_H__ + +#pragma once #include #include @@ -62,5 +62,3 @@ private: }; } /* namespace libcamera */ - -#endif /* __LIBCAMERA_INTERNAL_REQUEST_H__ */ From patchwork Mon May 15 12:45:47 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kieran Bingham X-Patchwork-Id: 18631 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 169CEC3285 for ; Mon, 15 May 2023 12:45:59 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 7A18E62864; Mon, 15 May 2023 14:45:56 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1684154756; bh=YJ2NhkXjQIO23I37hFg2q+9LaZMSe9xW+qEQVScHmqk=; h=To:Date:In-Reply-To:References:Subject:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc: From; b=dzgELdtO0N65vKgt7ymYQ9QFcnc9vGIkwMxupaKnpu5UILcKrLXrlQ9aNdogellb4 QXDkEVvZxsDqopsEnUCi2uDluvIVR1/2aVuHkJyWsOjUUm/xqMpTCN9rycH7ZXgfB9 PMY90+xbfT1XzWM38RpQmKovxQdVQZC2y4ZPggzHgf8ZqdV3sBNGTF99xX9wAMqExN pjWkfHDmDWEixFRJE4IhPgDbGaF8GqjJG24vM3OvfQEGVJfPvtu/vJ6LGiJSxlf3na XBp5oIUyjHrFDz9yPtSCRLDy9XMHD7NZMfqUbk+1W6nMxLjo43iHPX+4dClgJrQCEo oO6Ja/1hWhKFA== Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 3D72C6039F for ; Mon, 15 May 2023 14:45:54 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="Je26vaot"; dkim-atps=neutral Received: from Monstersaurus.local (aztw-30-b2-v4wan-166917-cust845.vm26.cable.virginm.net [82.37.23.78]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 6D52BDE5; Mon, 15 May 2023 14:45:43 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1684154743; bh=YJ2NhkXjQIO23I37hFg2q+9LaZMSe9xW+qEQVScHmqk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Je26vaotGdkAAlkqRzR6gM0nEjuYZjof6veSHH4WG6ALHp8NGlQEj8bdAiZsG8oPn 4viO4wvMlbW0OM5RSqt6789sILjxio+OAzI6SrS6qcMuD6f2MizLCnOYqOEbNQpTwt KwX4MYe84QN+4hoMhQ+UNN/hgnzGZ13hnXXDt7WA= To: libcamera devel Date: Mon, 15 May 2023 13:45:47 +0100 Message-Id: <20230515124550.3601128-3-kieran.bingham@ideasonboard.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230515124550.3601128-1-kieran.bingham@ideasonboard.com> References: <20230515124550.3601128-1-kieran.bingham@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v3 2/5] libcamera: camera_manager: Move private implementation to internal X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Kieran Bingham via libcamera-devel From: Kieran Bingham Reply-To: Kieran Bingham Cc: Jacopo Mondi Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" The CameraManager makes use of the Extensible pattern to provide an internal private implementation that is not exposed in the public API. Move the Private declaration to an internal header to make it available from other internal components in preperation for reducing the surface area of the public interface of the Camera Manager. Signed-off-by: Kieran Bingham Reviewed-by: Jacopo Mondi Tested-by: Ashok Sidipotu Signed-off-by: Kieran Bingham Reviewed-by: Jacopo Mondi --- include/libcamera/internal/camera_manager.h | 64 +++++++++++++++++++++ include/libcamera/internal/meson.build | 1 + src/libcamera/camera_manager.cpp | 50 ++-------------- 3 files changed, 69 insertions(+), 46 deletions(-) create mode 100644 include/libcamera/internal/camera_manager.h diff --git a/include/libcamera/internal/camera_manager.h b/include/libcamera/internal/camera_manager.h new file mode 100644 index 000000000000..05a1e4df8add --- /dev/null +++ b/include/libcamera/internal/camera_manager.h @@ -0,0 +1,64 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +/* + * Copyright (C) 2023, Ideas on Board Oy. + * + * camera_manager.h - Camera manager private data + */ + +#pragma once + +#include + +#include +#include + +#include + +#include "libcamera/internal/ipa_manager.h" +#include "libcamera/internal/process.h" + +namespace libcamera { + +class DeviceEnumerator; + +class CameraManager::Private : public Extensible::Private, public Thread +{ + LIBCAMERA_DECLARE_PUBLIC(CameraManager) + +public: + Private(); + + int start(); + void addCamera(std::shared_ptr camera, + const std::vector &devnums) LIBCAMERA_TSA_EXCLUDES(mutex_); + void removeCamera(Camera *camera) LIBCAMERA_TSA_EXCLUDES(mutex_); + + /* + * This mutex protects + * + * - initialized_ and status_ during initialization + * - cameras_ and camerasByDevnum_ after initialization + */ + mutable Mutex mutex_; + std::vector> cameras_ LIBCAMERA_TSA_GUARDED_BY(mutex_); + std::map> camerasByDevnum_ LIBCAMERA_TSA_GUARDED_BY(mutex_); + +protected: + void run() override; + +private: + int init(); + void createPipelineHandlers(); + void cleanup() LIBCAMERA_TSA_EXCLUDES(mutex_); + + ConditionVariable cv_; + bool initialized_ LIBCAMERA_TSA_GUARDED_BY(mutex_); + int status_ LIBCAMERA_TSA_GUARDED_BY(mutex_); + + std::unique_ptr enumerator_; + + IPAManager ipaManager_; + ProcessManager processManager_; +}; + +} /* namespace libcamera */ diff --git a/include/libcamera/internal/meson.build b/include/libcamera/internal/meson.build index d75088059996..0028ed0dc27f 100644 --- a/include/libcamera/internal/meson.build +++ b/include/libcamera/internal/meson.build @@ -13,6 +13,7 @@ libcamera_internal_headers = files([ 'bayer_format.h', 'byte_stream_buffer.h', 'camera.h', + 'camera_manager.h', 'camera_controls.h', 'camera_lens.h', 'camera_sensor.h', diff --git a/src/libcamera/camera_manager.cpp b/src/libcamera/camera_manager.cpp index c1edefdad160..d3c297b888d8 100644 --- a/src/libcamera/camera_manager.cpp +++ b/src/libcamera/camera_manager.cpp @@ -5,24 +5,22 @@ * camera_manager.h - Camera management */ -#include +#include "libcamera/internal/camera_manager.h" #include -#include - #include #include #include #include +#include + #include "libcamera/internal/device_enumerator.h" -#include "libcamera/internal/ipa_manager.h" #include "libcamera/internal/pipeline_handler.h" -#include "libcamera/internal/process.h" /** - * \file camera_manager.h + * \file libcamera/camera_manager.h * \brief The camera manager */ @@ -33,46 +31,6 @@ namespace libcamera { LOG_DEFINE_CATEGORY(Camera) -class CameraManager::Private : public Extensible::Private, public Thread -{ - LIBCAMERA_DECLARE_PUBLIC(CameraManager) - -public: - Private(); - - int start(); - void addCamera(std::shared_ptr camera, - const std::vector &devnums) LIBCAMERA_TSA_EXCLUDES(mutex_); - void removeCamera(Camera *camera) LIBCAMERA_TSA_EXCLUDES(mutex_); - - /* - * This mutex protects - * - * - initialized_ and status_ during initialization - * - cameras_ and camerasByDevnum_ after initialization - */ - mutable Mutex mutex_; - std::vector> cameras_ LIBCAMERA_TSA_GUARDED_BY(mutex_); - std::map> camerasByDevnum_ LIBCAMERA_TSA_GUARDED_BY(mutex_); - -protected: - void run() override; - -private: - int init(); - void createPipelineHandlers(); - void cleanup() LIBCAMERA_TSA_EXCLUDES(mutex_); - - ConditionVariable cv_; - bool initialized_ LIBCAMERA_TSA_GUARDED_BY(mutex_); - int status_ LIBCAMERA_TSA_GUARDED_BY(mutex_); - - std::unique_ptr enumerator_; - - IPAManager ipaManager_; - ProcessManager processManager_; -}; - CameraManager::Private::Private() : initialized_(false) { From patchwork Mon May 15 12:45:48 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kieran Bingham X-Patchwork-Id: 18632 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id C04F6C32A4 for ; Mon, 15 May 2023 12:45:59 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 5A1646286A; Mon, 15 May 2023 14:45:57 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1684154757; bh=juwQpXlxYx5UTLypgYogVpfznQ6d1mTM7kD/GgkZLNo=; h=To:Date:In-Reply-To:References:Subject:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc: From; b=wHwU7N5PS5ziuLYkiYvBrnUDawiJBRMmbOVQ6LKxJjBOorNKr2+gtplBhZECPOJzf s59x0yALbSEzLsvNFn3I5hx8R8y502L/y51AtARY0Ssf2ynDHCQA8tz74t87yz8sXO 3uXdm6aKF+W5UKLSiWD5bYg1reC9JB56Mo8MrDHFQz+SunfOiBrZavMVwDpspZtVgm EJ7/H26GqLlrmVI0dfndI9imAAFczg+Y2WARgmkK42udhxhwm/CfGf9Pl/yNoGY4CK oamzpJ0DZrk3v7oRJHW8faRtH++3rvCx4TxL2UmeVwc/RixRh0IPuGUywky/4YoVo/ qjSwKA0qBSulA== Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 89A826039F for ; Mon, 15 May 2023 14:45:54 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="gf0371wp"; dkim-atps=neutral Received: from Monstersaurus.local (aztw-30-b2-v4wan-166917-cust845.vm26.cable.virginm.net [82.37.23.78]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id C564E4DB; Mon, 15 May 2023 14:45:43 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1684154744; bh=juwQpXlxYx5UTLypgYogVpfznQ6d1mTM7kD/GgkZLNo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=gf0371wp4hJrI6YWCo8rd1rTLGjjzOdNmZ+OY5ll/V6t1HrATAjddHY6yzVgWdOYd eT1+M8YXdO3sWQ8hfZzHTWUKqkGXR4VBjWwSE0j3/TCy0p2aMPs3EUYbZO4AzUrfbm 2VXugB8ee9RGKrKOug9rrcTYk/mhdji+XdEBgP9Q= To: libcamera devel Date: Mon, 15 May 2023 13:45:48 +0100 Message-Id: <20230515124550.3601128-4-kieran.bingham@ideasonboard.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230515124550.3601128-1-kieran.bingham@ideasonboard.com> References: <20230515124550.3601128-1-kieran.bingham@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v3 3/5] libcamera: camera_manager: Move {add, remove}Camera to internal X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Kieran Bingham via libcamera-devel From: Kieran Bingham Reply-To: Kieran Bingham Cc: Jacopo Mondi Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" The CameraManager exposes addCamera and removeCamera as public API calls, while they should never be called from an application. These calls are only expected to be used by PipelineHandlers to update the CameraManager that a new Camera has been created and allow the Camera Manager to expose it to applications. Remove the public calls and update the private implementations such that they can be used directly by the PipelineHandler through the internal CameraManager::Private provided by the Extensible class. Signed-off-by: Kieran Bingham Reviewed-by: Jacopo Mondi Tested-by: Ashok Sidipotu Signed-off-by: Kieran Bingham Reviewed-by: Jacopo Mondi Reviewed-by: Laurent Pinchart --- include/libcamera/camera_manager.h | 4 - include/libcamera/internal/camera_manager.h | 2 +- src/libcamera/camera_manager.cpp | 87 +++++++++------------ src/libcamera/pipeline_handler.cpp | 6 +- 4 files changed, 43 insertions(+), 56 deletions(-) diff --git a/include/libcamera/camera_manager.h b/include/libcamera/camera_manager.h index 4b1fb7568e83..9767acc42c89 100644 --- a/include/libcamera/camera_manager.h +++ b/include/libcamera/camera_manager.h @@ -34,10 +34,6 @@ public: std::shared_ptr get(const std::string &id); std::shared_ptr get(dev_t devnum); - void addCamera(std::shared_ptr camera, - const std::vector &devnums); - void removeCamera(std::shared_ptr camera); - static const std::string &version() { return version_; } Signal> cameraAdded; diff --git a/include/libcamera/internal/camera_manager.h b/include/libcamera/internal/camera_manager.h index 05a1e4df8add..885bb2825687 100644 --- a/include/libcamera/internal/camera_manager.h +++ b/include/libcamera/internal/camera_manager.h @@ -31,7 +31,7 @@ public: int start(); void addCamera(std::shared_ptr camera, const std::vector &devnums) LIBCAMERA_TSA_EXCLUDES(mutex_); - void removeCamera(Camera *camera) LIBCAMERA_TSA_EXCLUDES(mutex_); + void removeCamera(std::shared_ptr camera) LIBCAMERA_TSA_EXCLUDES(mutex_); /* * This mutex protects diff --git a/src/libcamera/camera_manager.cpp b/src/libcamera/camera_manager.cpp index d3c297b888d8..70eb4e455e54 100644 --- a/src/libcamera/camera_manager.cpp +++ b/src/libcamera/camera_manager.cpp @@ -147,9 +147,25 @@ void CameraManager::Private::cleanup() enumerator_.reset(nullptr); } +/** + * \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. + * + * \context This function shall be called from the CameraManager thread. + */ void CameraManager::Private::addCamera(std::shared_ptr camera, const std::vector &devnums) { + ASSERT(Thread::current() == this); + MutexLocker locker(mutex_); for (const std::shared_ptr &c : cameras_) { @@ -166,15 +182,31 @@ void CameraManager::Private::addCamera(std::shared_ptr camera, unsigned int index = cameras_.size() - 1; for (dev_t devnum : devnums) camerasByDevnum_[devnum] = cameras_[index]; + + /* Report the addition to the public signal */ + CameraManager *const o = LIBCAMERA_O_PTR(); + o->cameraAdded.emit(cameras_[index]); } -void CameraManager::Private::removeCamera(Camera *camera) +/** + * \brief Remove a camera from the camera manager + * \param[in] camera The camera to be removed + * + * This function is called by pipeline handlers to unregister cameras from the + * camera manager. Unregistered cameras won't be reported anymore by the + * cameras() and get() calls, but references may still exist in applications. + * + * \context This function shall be called from the CameraManager thread. + */ +void CameraManager::Private::removeCamera(std::shared_ptr camera) { + ASSERT(Thread::current() == this); + MutexLocker locker(mutex_); auto iter = std::find_if(cameras_.begin(), cameras_.end(), [camera](std::shared_ptr &c) { - return c.get() == camera; + return c.get() == camera.get(); }); if (iter == cameras_.end()) return; @@ -184,12 +216,16 @@ void CameraManager::Private::removeCamera(Camera *camera) auto iter_d = std::find_if(camerasByDevnum_.begin(), camerasByDevnum_.end(), [camera](const std::pair> &p) { - return p.second.lock().get() == camera; + return p.second.lock().get() == camera.get(); }); if (iter_d != camerasByDevnum_.end()) camerasByDevnum_.erase(iter_d); cameras_.erase(iter); + + /* Report the removal to the public signal */ + CameraManager *const o = LIBCAMERA_O_PTR(); + o->cameraRemoved.emit(camera); } /** @@ -382,51 +418,6 @@ std::shared_ptr CameraManager::get(dev_t devnum) * perform any blocking operation. */ -/** - * \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. - * - * \context This function shall be called from the CameraManager thread. - */ -void CameraManager::addCamera(std::shared_ptr camera, - const std::vector &devnums) -{ - Private *const d = _d(); - - ASSERT(Thread::current() == d); - - d->addCamera(camera, devnums); - cameraAdded.emit(camera); -} - -/** - * \brief Remove a camera from the camera manager - * \param[in] camera The camera to be removed - * - * This function is called by pipeline handlers to unregister cameras from the - * camera manager. Unregistered cameras won't be reported anymore by the - * cameras() and get() calls, but references may still exist in applications. - * - * \context This function shall be called from the CameraManager thread. - */ -void CameraManager::removeCamera(std::shared_ptr camera) -{ - Private *const d = _d(); - - ASSERT(Thread::current() == d); - - d->removeCamera(camera.get()); - cameraRemoved.emit(camera); -} - /** * \fn const std::string &CameraManager::version() * \brief Retrieve the libcamera version string diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp index f72613b8e515..49092ea88a58 100644 --- a/src/libcamera/pipeline_handler.cpp +++ b/src/libcamera/pipeline_handler.cpp @@ -16,10 +16,10 @@ #include #include -#include #include #include "libcamera/internal/camera.h" +#include "libcamera/internal/camera_manager.h" #include "libcamera/internal/device_enumerator.h" #include "libcamera/internal/framebuffer.h" #include "libcamera/internal/media_device.h" @@ -624,7 +624,7 @@ void PipelineHandler::registerCamera(std::shared_ptr camera) } } - manager_->addCamera(std::move(camera), devnums); + manager_->_d()->addCamera(std::move(camera), devnums); } /** @@ -691,7 +691,7 @@ void PipelineHandler::disconnect() continue; camera->disconnect(); - manager_->removeCamera(camera); + manager_->_d()->removeCamera(camera); } } From patchwork Mon May 15 12:45:49 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kieran Bingham X-Patchwork-Id: 18633 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 65B4EBDE6B for ; Mon, 15 May 2023 12:46:00 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id CAC8B62874; Mon, 15 May 2023 14:45:58 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1684154758; bh=nkmIwIDV+c6Zm28BaUrSUiED+XpiaHVz4gwzJTTmlmU=; h=To:Date:In-Reply-To:References:Subject:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc: From; b=RXTShXqDCJm8hzCBmebSzNqROdtBWutdQ/98KcgNbkFjnqp3lpJB1GqcxJ5ETIStS EIaJGUycvgfEqojTx68lkK6LZvaNXfh5YiDjUvZeyEBMOKqUMclVr1Y3vfD4Y+ArGr s89mKYyrZwDBmdeAlV0cR3+UvehgBd9Miu3VV/50rRnxXfb/ezj6J1BsKv80pIfmf7 u6XFraw/w/3wRAMn0wtpljiI2x+U3BiHdXvKgGapH2bfrrJtvOFcJSxv5yBVqH6+XR OBkl3JlVUR2BxXINLm2smTGyzGBTNleHox8uT/BRTUKro6B9AOgxWTIeOqGdBPnaBt V/mIXQ/bofdsA== Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id E499A6039F for ; Mon, 15 May 2023 14:45:54 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="ZvINU7fu"; dkim-atps=neutral Received: from Monstersaurus.local (aztw-30-b2-v4wan-166917-cust845.vm26.cable.virginm.net [82.37.23.78]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 29D1F7E1; Mon, 15 May 2023 14:45:44 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1684154744; bh=nkmIwIDV+c6Zm28BaUrSUiED+XpiaHVz4gwzJTTmlmU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ZvINU7fuexH6SO67eLvS9936bH0qhxQUerjO1vap7aDq1EU0+phShSxe7Tj2QsCtp M7i28tzv/y1tb8AjvITUUpq+uI5vzeglTZ/vKdfAA4XJrLlk4PekA8YRcA3MDqFTZB rw2X+AFr8lW41MiyvjAgyp+nzIjU9FxykwySLgUw= To: libcamera devel Date: Mon, 15 May 2023 13:45:49 +0100 Message-Id: <20230515124550.3601128-5-kieran.bingham@ideasonboard.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230515124550.3601128-1-kieran.bingham@ideasonboard.com> References: <20230515124550.3601128-1-kieran.bingham@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v3 4/5] libcamera: properties: Provide a Devices camera property X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Kieran Bingham via libcamera-devel From: Kieran Bingham Reply-To: Kieran Bingham Cc: Jacopo Mondi Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" Provide a new Camera property that allows pipeline handlers to list any devices used to operate the device. This allows other frameworks and daemons such as Pipewire to better understand the resources consumed by a Camera and consider ignoring those resources when enumerating camera devices on a system. Signed-off-by: Kieran Bingham Reviewed-by: Jacopo Mondi Tested-by: Ashok Sidipotu Signed-off-by: Kieran Bingham Reviewed-by: Jacopo Mondi Reviewed-by: Laurent Pinchart --- src/libcamera/property_ids.yaml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/libcamera/property_ids.yaml b/src/libcamera/property_ids.yaml index cb55e0ed2283..6141942969f9 100644 --- a/src/libcamera/property_ids.yaml +++ b/src/libcamera/property_ids.yaml @@ -690,6 +690,13 @@ controls: that is twice that of the full resolution mode. This value will be valid after the configure method has returned successfully. + - Devices: + type: int64_t + size: [n] + description: | + A list of integer values of type dev_t denoting major and minor device + number of the underlying devices used in the operation of this camera. + # ---------------------------------------------------------------------------- # Draft properties section From patchwork Mon May 15 12:45:50 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kieran Bingham X-Patchwork-Id: 18634 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id C5855C32A5 for ; Mon, 15 May 2023 12:46:00 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id CDC5862861; Mon, 15 May 2023 14:45:59 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1684154759; bh=NAHs9FK9AVfQThDyoQpZ9B+QTH6lGyz46GyQML1npQk=; h=To:Date:In-Reply-To:References:Subject:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=SRKdkizuacsuZezajvJSBh9S0A0LvYcV5oanbQcgcAoapEU9vFSgoLO0IAsJ0d0d6 1EMweegIOYhzrsGIaPNH21fFfjAmUPG6n0w2JRaejhIFAWrkc4n6pSi4MTYKTAF0+s znlgTDSL2IK9y9kKmKEdfnVoDFt7eLdc0ArTlzgjUZOSClY/h2zDgtZTXIDF0P269Z YNK8CQRrORjWIGVpJl/kNPVamnJX7PRrMU2EjJPSoLQiDtRk+3ljfhTmUfYVb5YqVN BgG2Plvgjgn84fShhpwbKfTfKUKhxBTyv8gFuGMk+EccEQY+awBt5bw3WPM9hjlFOH P8UcAKICSCXPg== Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 36E58627DE for ; Mon, 15 May 2023 14:45:55 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="OE5LmTpu"; dkim-atps=neutral Received: from Monstersaurus.local (aztw-30-b2-v4wan-166917-cust845.vm26.cable.virginm.net [82.37.23.78]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 8316B4DB; Mon, 15 May 2023 14:45:44 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1684154744; bh=NAHs9FK9AVfQThDyoQpZ9B+QTH6lGyz46GyQML1npQk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=OE5LmTpun/B/RtF9RndIh07JG5regN/iLOfEzLOAkQarQCbIO+uP4ydyutvCXwxIR 5XchaAFex0rysNLIbWVjfXD0YfUC/L7RmdjPr+w78jkbs0d8Q0/LJeeDCjSZoncsLb iOwk+pZsMFooUrhrty05ST8FIz88/GUij4QzFOso= To: libcamera devel Date: Mon, 15 May 2023 13:45:50 +0100 Message-Id: <20230515124550.3601128-6-kieran.bingham@ideasonboard.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230515124550.3601128-1-kieran.bingham@ideasonboard.com> References: <20230515124550.3601128-1-kieran.bingham@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v3 5/5] libcamera: pipeline: Register device numbers with camera X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Kieran Bingham via libcamera-devel From: Kieran Bingham Reply-To: Kieran Bingham Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" 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 Tested-by: Ashok Sidipotu Signed-off-by: Kieran Bingham Reviewed-by: Laurent Pinchart Reviewed-by: Jacopo Mondi --- 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, - const std::vector &devnums) LIBCAMERA_TSA_EXCLUDES(mutex_); + void addCamera(std::shared_ptr camera) LIBCAMERA_TSA_EXCLUDES(mutex_); void removeCamera(std::shared_ptr 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 #include +#include +#include "libcamera/internal/camera.h" #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, - const std::vector &devnums) +void CameraManager::Private::addCamera(std::shared_ptr camera) { ASSERT(Thread::current() == this); @@ -177,6 +177,10 @@ void CameraManager::Private::addCamera(std::shared_ptr camera, } } + auto devnums = camera->properties() + .get(properties::Devices) + .value_or(Span{}); + 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 #include +#include #include "libcamera/internal/camera.h" #include "libcamera/internal/camera_manager.h" @@ -612,7 +613,7 @@ void PipelineHandler::registerCamera(std::shared_ptr camera) * Walk the entity list and map the devnums of all capture video nodes * to the camera. */ - std::vector devnums; + std::vector devnums; for (const std::shared_ptr &media : mediaDevices_) { for (const MediaEntity *entity : media->entities()) { if (entity->pads().size() == 1 && @@ -624,7 +625,14 @@ void PipelineHandler::registerCamera(std::shared_ptr 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)); } /**