From patchwork Fri Jul 23 04:00:20 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 13087 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 3DADFC322B for ; Fri, 23 Jul 2021 04:00:48 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id BAC29687B4; Fri, 23 Jul 2021 06:00:45 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="pvqHwvME"; dkim-atps=neutral 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 700CE6877A for ; Fri, 23 Jul 2021 06:00:43 +0200 (CEST) Received: from pendragon.lan (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id E5BC03F2 for ; Fri, 23 Jul 2021 06:00:42 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1627012843; bh=UG9ct1KXXPEd4vIWbovc+WYBYilIrGIsVtS/6JPe8Hk=; h=From:To:Subject:Date:In-Reply-To:References:From; b=pvqHwvMEn2B4ll5y0rXz9MdRJ9nq62zEYKRTpmh4JP0eN0KUJ3tV68rpFyeb8UJP5 WSqbPQMmlZIDsRgMrY/QmC4wv1Tn6hp7GipB9GZosRO3gLB4fhz0NsLJ4MVF8a4L3Z aezC0qjPBdE361C3j0BIXMdzYG1kNDGa9nAjJaj8= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Fri, 23 Jul 2021 07:00:20 +0300 Message-Id: <20210723040036.32346-2-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210723040036.32346-1-laurent.pinchart@ideasonboard.com> References: <20210723040036.32346-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [RFC PATCH 01/17] libcamera: base: class: Document Extensible::_d() functions 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: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" The Extensible::_d() functions are meant to be called by users of the class. Document them. Signed-off-by: Laurent Pinchart Reviewed-by: Niklas Söderlund Reviewed-by: Jacopo Mondi --- include/libcamera/base/class.h | 2 -- src/libcamera/base/class.cpp | 17 +++++++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/include/libcamera/base/class.h b/include/libcamera/base/class.h index c2e1d3534ed1..9c7f0f2e6e27 100644 --- a/include/libcamera/base/class.h +++ b/include/libcamera/base/class.h @@ -88,7 +88,6 @@ public: Extensible(Private *d); protected: -#ifndef __DOXYGEN__ template const T *_d() const { @@ -100,7 +99,6 @@ protected: { return static_cast(d_.get()); } -#endif private: const std::unique_ptr d_; diff --git a/src/libcamera/base/class.cpp b/src/libcamera/base/class.cpp index 26b4967726d6..d0899671ca11 100644 --- a/src/libcamera/base/class.cpp +++ b/src/libcamera/base/class.cpp @@ -150,6 +150,23 @@ Extensible::Extensible(Extensible::Private *d) { } +/** + * \fn Extensible::_d() const + * \brief Retrieve the private data instance + * + * This template function isn't meant to be called directly. Instead, classes + * derived from Extensible get, through the LIBCAMERA_DECLARE_PRIVATE() macro, + * overriden _d() functions that return the correct pointer type to the + * corresponding derived Private class. + * + * \return A pointer to the private data instance + */ + +/** + * \fn Extensible::_d() + * \copydoc Extensible::_d() const + */ + /** * \var Extensible::d_ * \brief Pointer to the private data instance From patchwork Fri Jul 23 04:00:21 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 13088 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 6DA9BC322B for ; Fri, 23 Jul 2021 04:00:49 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id B102B6877A; Fri, 23 Jul 2021 06:00:46 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="hqPQOeTn"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id DEA906877B for ; Fri, 23 Jul 2021 06:00:43 +0200 (CEST) Received: from pendragon.lan (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 4B73451D for ; Fri, 23 Jul 2021 06:00:43 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1627012843; bh=zZ4eRByRelK4Hy7sB2jnK1mah6FZXElm/2tCUqnfzeI=; h=From:To:Subject:Date:In-Reply-To:References:From; b=hqPQOeTnYwm9GB1LGoIo7QfcEn2PrFQ4ThoC9/QE74n55WqJGo8mH8SyAaXSNqFEd tc0E8m6JzB0HG8+qJ4SfPGB6G4qmx7qVQ1q5tOPZk1CxEnemWG+SsDGlL5nVPFnVK2 +frr8x/FSMU4Zi+CZJQH4kOI/3zRrlvEtJyuCNTk= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Fri, 23 Jul 2021 07:00:21 +0300 Message-Id: <20210723040036.32346-3-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210723040036.32346-1-laurent.pinchart@ideasonboard.com> References: <20210723040036.32346-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [RFC PATCH 02/17] libcamera: base: class: Link LIBCAMERA_O_PTR to Extensible documentation 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: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" The LIBCAMERA_O_PTR macro is part of the Extensible class infrastructure, but doesn't link to it. This makes the generated documentation unclear. Fix it. Signed-off-by: Laurent Pinchart Reviewed-by: Niklas Söderlund Reviewed-by: Jacopo Mondi --- src/libcamera/base/class.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/libcamera/base/class.cpp b/src/libcamera/base/class.cpp index d0899671ca11..d4f0ac64ad48 100644 --- a/src/libcamera/base/class.cpp +++ b/src/libcamera/base/class.cpp @@ -98,8 +98,9 @@ namespace libcamera { * \def LIBCAMERA_O_PTR() * \brief Retrieve the public instance corresponding to the private data * - * This macro is used in any member function of the private data class to access - * the public class instance corresponding to the private data. + * This macro is part of the libcamera::Extensible class infrastructure. It may + * be used in any member function of a libcamera::Extensible::Private subclass + * to access the public class instance corresponding to the private data. */ /** @@ -139,6 +140,8 @@ namespace libcamera { * protected and private members. * * The PublicClass exposes its Private data pointer through the _d() function. + * In the other direction, the pointer to the PublicClass can be retrieved in + * functions of the Private class using the LIBCAMERA_O_PTR() macro. */ /** From patchwork Fri Jul 23 04:00:22 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 13089 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 5E4F8C322B for ; Fri, 23 Jul 2021 04:00:50 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 8DF70687BB; Fri, 23 Jul 2021 06:00:47 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="KpEmgCeq"; dkim-atps=neutral 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 019F7687A3 for ; Fri, 23 Jul 2021 06:00:44 +0200 (CEST) Received: from pendragon.lan (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 9AF2B56B for ; Fri, 23 Jul 2021 06:00:43 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1627012843; bh=XbfCclM8e+cytzdWbwgdQ40lB1HdldzVI1F/nxcc5bA=; h=From:To:Subject:Date:In-Reply-To:References:From; b=KpEmgCeqwRMgI7/0p41xS0q6+XSZM1Xr7D/6mBGG6xCDUQ8tB6W5Tj0GYabQWd8Ct +B9/UTIwYjHkGSdkYehBnVYGkD1k5Z7+sYbG8ALjXGXk1R45skifuItwjPiQ6ThVYy 4eaBwtTFxMVnnFc1QpO5tJSg8Qr1vd971xX6YTm8= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Fri, 23 Jul 2021 07:00:22 +0300 Message-Id: <20210723040036.32346-4-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210723040036.32346-1-laurent.pinchart@ideasonboard.com> References: <20210723040036.32346-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [RFC PATCH 03/17] libcamera: base: class: Don't pass Extensible pointer to Private constructor 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: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" The Extensible and Extensible::Private classes contain pointers to each other. These pointers are initialized in the respective class's constructor, by passing a pointer to the other class to each constructor. This particular construct reduces the flexibility of the Extensible pattern, as the Private class instance has to be allocated and constructed in the members initializer list of the Extensible class's constructor. It is thus impossible to perform any operation on the Private class between its construction and the construction of the Extensible class, or to subclass the Private class without subclassing the Extensible class. To make the design pattern more flexible, don't pass the pointer to the Extensible class to the Private class's constructor, but initialize the pointer manually in the Extensible class's constructor. This requires a const_cast as the o_ member of the Private class is const. Signed-off-by: Laurent Pinchart Reviewed-by: Niklas Söderlund Reviewed-by: Jacopo Mondi --- include/libcamera/base/class.h | 3 ++- include/libcamera/internal/framebuffer.h | 2 +- src/android/camera_hal_config.cpp | 7 +++---- src/android/mm/cros_camera_buffer.cpp | 4 ++-- src/android/mm/generic_camera_buffer.cpp | 3 +-- src/libcamera/base/class.cpp | 6 +++--- src/libcamera/camera.cpp | 10 +++++----- src/libcamera/camera_manager.cpp | 8 ++++---- src/libcamera/framebuffer.cpp | 6 +++--- 9 files changed, 24 insertions(+), 25 deletions(-) diff --git a/include/libcamera/base/class.h b/include/libcamera/base/class.h index 9c7f0f2e6e27..c9d9cd949ca1 100644 --- a/include/libcamera/base/class.h +++ b/include/libcamera/base/class.h @@ -64,7 +64,7 @@ public: class Private { public: - Private(Extensible *o); + Private(); virtual ~Private(); #ifndef __DOXYGEN__ @@ -82,6 +82,7 @@ public: #endif private: + friend class Extensible; Extensible *const o_; }; diff --git a/include/libcamera/internal/framebuffer.h b/include/libcamera/internal/framebuffer.h index a11e895d9b88..8c187adf70c7 100644 --- a/include/libcamera/internal/framebuffer.h +++ b/include/libcamera/internal/framebuffer.h @@ -52,7 +52,7 @@ class FrameBuffer::Private : public Extensible::Private LIBCAMERA_DECLARE_PUBLIC(FrameBuffer) public: - Private(FrameBuffer *buffer); + Private(); void setRequest(Request *request) { request_ = request; } diff --git a/src/android/camera_hal_config.cpp b/src/android/camera_hal_config.cpp index 833cf4ba98a9..bbbb1410b52c 100644 --- a/src/android/camera_hal_config.cpp +++ b/src/android/camera_hal_config.cpp @@ -32,7 +32,7 @@ class CameraHalConfig::Private : public Extensible::Private LIBCAMERA_DECLARE_PUBLIC(CameraHalConfig) public: - Private(CameraHalConfig *halConfig); + Private(); int parseConfigFile(FILE *fh, std::map *cameras); @@ -50,8 +50,7 @@ private: std::map *cameras_; }; -CameraHalConfig::Private::Private(CameraHalConfig *halConfig) - : Extensible::Private(halConfig) +CameraHalConfig::Private::Private() { } @@ -344,7 +343,7 @@ int CameraHalConfig::Private::parseConfigFile(FILE *fh, } CameraHalConfig::CameraHalConfig() - : Extensible(new Private(this)), exists_(false), valid_(false) + : Extensible(new Private()), exists_(false), valid_(false) { parseConfigurationFile(); } diff --git a/src/android/mm/cros_camera_buffer.cpp b/src/android/mm/cros_camera_buffer.cpp index bb55b95e3a39..437502fb8276 100644 --- a/src/android/mm/cros_camera_buffer.cpp +++ b/src/android/mm/cros_camera_buffer.cpp @@ -47,8 +47,8 @@ private: CameraBuffer::Private::Private(CameraBuffer *cameraBuffer, buffer_handle_t camera3Buffer, [[maybe_unused]] int flags) - : Extensible::Private(cameraBuffer), handle_(camera3Buffer), - numPlanes_(0), valid_(false), registered_(false) + : handle_(camera3Buffer), numPlanes_(0), valid_(false), + registered_(false) { bufferManager_ = cros::CameraBufferManager::GetInstance(); diff --git a/src/android/mm/generic_camera_buffer.cpp b/src/android/mm/generic_camera_buffer.cpp index 166be36efd5b..2a4b77ea5236 100644 --- a/src/android/mm/generic_camera_buffer.cpp +++ b/src/android/mm/generic_camera_buffer.cpp @@ -34,9 +34,8 @@ public: size_t jpegBufferSize(size_t maxJpegBufferSize) const; }; -CameraBuffer::Private::Private(CameraBuffer *cameraBuffer, +CameraBuffer::Private::Private([[maybe_unused]] CameraBuffer *cameraBuffer, buffer_handle_t camera3Buffer, int flags) - : Extensible::Private(cameraBuffer) { maps_.reserve(camera3Buffer->numFds); error_ = 0; diff --git a/src/libcamera/base/class.cpp b/src/libcamera/base/class.cpp index d4f0ac64ad48..d24043c20e55 100644 --- a/src/libcamera/base/class.cpp +++ b/src/libcamera/base/class.cpp @@ -151,6 +151,7 @@ namespace libcamera { Extensible::Extensible(Extensible::Private *d) : d_(d) { + *const_cast(&d_->o_) = this; } /** @@ -182,10 +183,9 @@ Extensible::Extensible(Extensible::Private *d) /** * \brief Construct an instance of an Extensible class private data - * \param[in] o Pointer to the public class object */ -Extensible::Private::Private(Extensible *o) - : o_(o) +Extensible::Private::Private() + : o_(nullptr) { } diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp index c8858e71d105..c126b49290ce 100644 --- a/src/libcamera/camera.cpp +++ b/src/libcamera/camera.cpp @@ -344,7 +344,7 @@ public: CameraRunning, }; - Private(Camera *camera, PipelineHandler *pipe, const std::string &id, + Private(PipelineHandler *pipe, const std::string &id, const std::set &streams); ~Private(); @@ -368,11 +368,11 @@ private: std::atomic state_; }; -Camera::Private::Private(Camera *camera, PipelineHandler *pipe, +Camera::Private::Private(PipelineHandler *pipe, const std::string &id, const std::set &streams) - : Extensible::Private(camera), pipe_(pipe->shared_from_this()), id_(id), - streams_(streams), disconnected_(false), state_(CameraAvailable) + : pipe_(pipe->shared_from_this()), id_(id), streams_(streams), + disconnected_(false), state_(CameraAvailable) { } @@ -632,7 +632,7 @@ const std::string &Camera::id() const Camera::Camera(PipelineHandler *pipe, const std::string &id, const std::set &streams) - : Extensible(new Private(this, pipe, id, streams)) + : Extensible(new Private(pipe, id, streams)) { } diff --git a/src/libcamera/camera_manager.cpp b/src/libcamera/camera_manager.cpp index 1c79308ad4b5..384a574f2baa 100644 --- a/src/libcamera/camera_manager.cpp +++ b/src/libcamera/camera_manager.cpp @@ -39,7 +39,7 @@ class CameraManager::Private : public Extensible::Private, public Thread LIBCAMERA_DECLARE_PUBLIC(CameraManager) public: - Private(CameraManager *cm); + Private(); int start(); void addCamera(std::shared_ptr camera, @@ -74,8 +74,8 @@ private: ProcessManager processManager_; }; -CameraManager::Private::Private(CameraManager *cm) - : Extensible::Private(cm), initialized_(false) +CameraManager::Private::Private() + : initialized_(false) { } @@ -258,7 +258,7 @@ void CameraManager::Private::removeCamera(Camera *camera) CameraManager *CameraManager::self_ = nullptr; CameraManager::CameraManager() - : Extensible(new CameraManager::Private(this)) + : Extensible(new CameraManager::Private()) { if (self_) LOG(Camera, Fatal) diff --git a/src/libcamera/framebuffer.cpp b/src/libcamera/framebuffer.cpp index 40bf64b0a4fe..48d14b31f68d 100644 --- a/src/libcamera/framebuffer.cpp +++ b/src/libcamera/framebuffer.cpp @@ -100,8 +100,8 @@ LOG_DEFINE_CATEGORY(Buffer) * \brief Array of per-plane metadata */ -FrameBuffer::Private::Private(FrameBuffer *buffer) - : Extensible::Private(buffer), request_(nullptr) +FrameBuffer::Private::Private() + : request_(nullptr) { } @@ -176,7 +176,7 @@ FrameBuffer::Private::Private(FrameBuffer *buffer) * \param[in] cookie Cookie */ FrameBuffer::FrameBuffer(const std::vector &planes, unsigned int cookie) - : Extensible(new Private(this)), planes_(planes), cookie_(cookie) + : Extensible(new Private()), planes_(planes), cookie_(cookie) { } From patchwork Fri Jul 23 04:00:23 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 13090 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 209A8C322C for ; Fri, 23 Jul 2021 04:00:51 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 6F02E687B3; Fri, 23 Jul 2021 06:00:49 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="CPnWosNZ"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 48FAE687A4 for ; Fri, 23 Jul 2021 06:00:44 +0200 (CEST) Received: from pendragon.lan (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id ECF42255 for ; Fri, 23 Jul 2021 06:00:43 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1627012844; bh=EgQZAWRXuJZ3TraObXH5yBubwwgOsqbQL/0mjNMWWcE=; h=From:To:Subject:Date:In-Reply-To:References:From; b=CPnWosNZp9fzW4afGoRd5jHmLmQJB3wxk+O/JvxESnfn3DAnLw+13dCiH5WB5tA26 WsX+ikVtFwmcHuNTqDpAN643Odh3darP4MXP5CAMqBU4KW94JLPOm9q65PwO2/QtGc FqphcNHI0g1NHaE0SzVs6ULrR35IFqlLwW+FZcaY= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Fri, 23 Jul 2021 07:00:23 +0300 Message-Id: <20210723040036.32346-5-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210723040036.32346-1-laurent.pinchart@ideasonboard.com> References: <20210723040036.32346-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [RFC PATCH 04/17] libcamera: frame_buffer: Document the FrameBuffer::Private class 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: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" The FrameBuffer::Private class is exposed to pipeline handlers, and is thus part of the internal libcamera API. As such, it should be documented. Signed-off-by: Laurent Pinchart Reviewed-by: Niklas Söderlund Reviewed-by: Jacopo Mondi --- src/libcamera/framebuffer.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/libcamera/framebuffer.cpp b/src/libcamera/framebuffer.cpp index 48d14b31f68d..a59e93fbdf91 100644 --- a/src/libcamera/framebuffer.cpp +++ b/src/libcamera/framebuffer.cpp @@ -100,6 +100,16 @@ LOG_DEFINE_CATEGORY(Buffer) * \brief Array of per-plane metadata */ +/** + * \class FrameBuffer::Private + * \brief Base class for FrameBuffer private data + * + * The FrameBuffer::Private class stores all private data associated with a + * framebuffer. It implements the d-pointer design pattern to hide core + * FrameBuffer data from the public API, and exposes utility functions to + * pipeline handlers. + */ + FrameBuffer::Private::Private() : request_(nullptr) { From patchwork Fri Jul 23 04:00:24 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 13091 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 E10BEC322B for ; Fri, 23 Jul 2021 04:00:51 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 35F24687B0; Fri, 23 Jul 2021 06:00:50 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="luz+aMG8"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 9EC546877A for ; Fri, 23 Jul 2021 06:00:44 +0200 (CEST) Received: from pendragon.lan (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 467B23F2 for ; Fri, 23 Jul 2021 06:00:44 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1627012844; bh=GYTCUJZ+gf0ppeFr7pBaVlzJJBJJQ0exmBO+dMpGw2w=; h=From:To:Subject:Date:In-Reply-To:References:From; b=luz+aMG8RtwU0KaC1j+durgnpKWhW9OK8ANVWJ3DgEylFEQ8e8Q/oVBYXb6NMEUKe TlUdnTigAcrh6t0l44nZDYn0UfqP+EKu+AcQZzaDMYLuNpmYDhINHhJeJUy0/UOXHE I05hHF1KiqmuuZFWs9RXU/jKvcCaEig4S5rYx51A= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Fri, 23 Jul 2021 07:00:24 +0300 Message-Id: <20210723040036.32346-6-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210723040036.32346-1-laurent.pinchart@ideasonboard.com> References: <20210723040036.32346-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [RFC PATCH 05/17] Documentation: Doxygen: Don't exclude Private classes 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: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" Some of the libcamera Private classes are part of the internal API exposed to pipeline handlers, and should thus be documented as such. Drop the wildcard exclusion, and exclude fully private classes explicitly instead. Signed-off-by: Laurent Pinchart Reviewed-by: Niklas Söderlund Reviewed-by: Jacopo Mondi --- Documentation/Doxyfile.in | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Documentation/Doxyfile.in b/Documentation/Doxyfile.in index a79d37706faf..aee5c9fd7e59 100644 --- a/Documentation/Doxyfile.in +++ b/Documentation/Doxyfile.in @@ -882,8 +882,9 @@ EXCLUDE_SYMBOLS = libcamera::BoundMethodArgs \ libcamera::BoundMethodPack \ libcamera::BoundMethodPackBase \ libcamera::BoundMethodStatic \ + libcamera::Camera::Private \ + libcamera::CameraManager::Private \ libcamera::SignalBase \ - libcamera::*::Private \ *::details \ std::* From patchwork Fri Jul 23 04:00:25 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 13092 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 7476FC322C for ; Fri, 23 Jul 2021 04:00:52 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 1012A687C0; Fri, 23 Jul 2021 06:00:51 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="pJwx6V/8"; dkim-atps=neutral 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 01E166877A for ; Fri, 23 Jul 2021 06:00:45 +0200 (CEST) Received: from pendragon.lan (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 99F8F255 for ; Fri, 23 Jul 2021 06:00:44 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1627012844; bh=hZHmJc1F8VeVoHYny0nzxnMLTmz4eq976ToNO+jehXQ=; h=From:To:Subject:Date:In-Reply-To:References:From; b=pJwx6V/8cfvRrwc3V1ef2d9CDTtRnf1owUljqpvNKNEGsn8gs7LSFAkOvVBeNwcqc DcPKyre27BJVbREzfeRXu0AS2kS69y56dGoniywI3om6pxDwEOCT48706iKmnP5cWE T5S+WFeCx4WKRm3LfwdixtrKiOoV+HnhFdWA8xb8= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Fri, 23 Jul 2021 07:00:25 +0300 Message-Id: <20210723040036.32346-7-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210723040036.32346-1-laurent.pinchart@ideasonboard.com> References: <20210723040036.32346-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [RFC PATCH 06/17] libcamera: camera: Move Camera::Private to header file 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: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" The Camera::Private class is defined in camera.cpp. To prepare for allowing it to be subclassed by pipeline handlers, move it to a new internal/camera.h header. Signed-off-by: Laurent Pinchart Reviewed-by: Niklas Söderlund Reviewed-by: Jacopo Mondi --- include/libcamera/internal/camera.h | 63 ++++++++++++++++++++++++++ include/libcamera/internal/meson.build | 1 + src/libcamera/camera.cpp | 40 +--------------- 3 files changed, 66 insertions(+), 38 deletions(-) create mode 100644 include/libcamera/internal/camera.h diff --git a/include/libcamera/internal/camera.h b/include/libcamera/internal/camera.h new file mode 100644 index 000000000000..9ef5d8ae98a6 --- /dev/null +++ b/include/libcamera/internal/camera.h @@ -0,0 +1,63 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +/* + * Copyright (C) 2021, Google Inc. + * + * camera.h - Camera private data + */ +#ifndef __LIBCAMERA_INTERNAL_CAMERA_H__ +#define __LIBCAMERA_INTERNAL_CAMERA_H__ + +#include +#include +#include +#include + +#include + +#include + +namespace libcamera { + +class PipelineHandler; +class Stream; + +class Camera::Private : public Extensible::Private +{ + LIBCAMERA_DECLARE_PUBLIC(Camera) + +public: + enum State { + CameraAvailable, + CameraAcquired, + CameraConfigured, + CameraStopping, + CameraRunning, + }; + + Private(PipelineHandler *pipe, const std::string &id, + const std::set &streams); + ~Private(); + + bool isRunning() const; + int isAccessAllowed(State state, bool allowDisconnected = false, + const char *from = __builtin_FUNCTION()) const; + int isAccessAllowed(State low, State high, + bool allowDisconnected = false, + const char *from = __builtin_FUNCTION()) const; + + void disconnect(); + void setState(State state); + + std::shared_ptr pipe_; + std::string id_; + std::set streams_; + std::set activeStreams_; + +private: + bool disconnected_; + std::atomic state_; +}; + +} /* namespace libcamera */ + +#endif /* __LIBCAMERA_INTERNAL_CAMERA_H__ */ diff --git a/include/libcamera/internal/meson.build b/include/libcamera/internal/meson.build index 6d4eb7ed3df6..dac1a2d36fa8 100644 --- a/include/libcamera/internal/meson.build +++ b/include/libcamera/internal/meson.build @@ -12,6 +12,7 @@ libcamera_tracepoint_header = custom_target( libcamera_internal_headers = files([ 'bayer_format.h', 'byte_stream_buffer.h', + 'camera.h', 'camera_controls.h', 'camera_sensor.h', 'camera_sensor_properties.h', diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp index c126b49290ce..4b5bc891fc37 100644 --- a/src/libcamera/camera.cpp +++ b/src/libcamera/camera.cpp @@ -18,10 +18,11 @@ #include #include +#include "libcamera/internal/camera.h" #include "libcamera/internal/pipeline_handler.h" /** - * \file camera.h + * \file libcamera/camera.h * \brief Camera device handling * * \page camera-model Camera Model @@ -331,43 +332,6 @@ std::size_t CameraConfiguration::size() const * \brief The vector of stream configurations */ -class Camera::Private : public Extensible::Private -{ - LIBCAMERA_DECLARE_PUBLIC(Camera) - -public: - enum State { - CameraAvailable, - CameraAcquired, - CameraConfigured, - CameraStopping, - CameraRunning, - }; - - Private(PipelineHandler *pipe, const std::string &id, - const std::set &streams); - ~Private(); - - bool isRunning() const; - int isAccessAllowed(State state, bool allowDisconnected = false, - const char *from = __builtin_FUNCTION()) const; - int isAccessAllowed(State low, State high, - bool allowDisconnected = false, - const char *from = __builtin_FUNCTION()) const; - - void disconnect(); - void setState(State state); - - std::shared_ptr pipe_; - std::string id_; - std::set streams_; - std::set activeStreams_; - -private: - bool disconnected_; - std::atomic state_; -}; - Camera::Private::Private(PipelineHandler *pipe, const std::string &id, const std::set &streams) From patchwork Fri Jul 23 04:00:26 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 13093 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 061B6C322D for ; Fri, 23 Jul 2021 04:00:52 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id C4CF8687B7; Fri, 23 Jul 2021 06:00:51 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="EvXER4A7"; dkim-atps=neutral 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 52667687AF for ; Fri, 23 Jul 2021 06:00:45 +0200 (CEST) Received: from pendragon.lan (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id EC97F3F2 for ; Fri, 23 Jul 2021 06:00:44 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1627012845; bh=2dapEB1s8HjLGPfNSyHNQ4skTYwINAySQpEVV8WsSiM=; h=From:To:Subject:Date:In-Reply-To:References:From; b=EvXER4A7Kjifz0F7sN11whkHaLMidGKbC3RJW32Z6mthuAzszOe95A2Q4oz2o2c5y nvrSau89QDWjX+SO+wtBxYu5rWzUzHf48R2L0d/TkQVk/nV5s8nGhRqYwKRwfm52g9 fasNFOzrQfM/NVVr+b24NQ/aS1csfqJqXYNgA8zI= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Fri, 23 Jul 2021 07:00:26 +0300 Message-Id: <20210723040036.32346-8-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210723040036.32346-1-laurent.pinchart@ideasonboard.com> References: <20210723040036.32346-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [RFC PATCH 07/17] libcamera: camera: Make Camera::Private members private 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: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" To prepare for the Camera::Private structure being used by pipeline handlers, turn all its members to private. Members that are useful for pipeline handlers will be made public again, or will be exposed through accessor functions, on a case-by-case basis. Signed-off-by: Laurent Pinchart Reviewed-by: Niklas Söderlund Reviewed-by: Jacopo Mondi --- include/libcamera/internal/camera.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/include/libcamera/internal/camera.h b/include/libcamera/internal/camera.h index 9ef5d8ae98a6..b60ed140356a 100644 --- a/include/libcamera/internal/camera.h +++ b/include/libcamera/internal/camera.h @@ -26,6 +26,11 @@ class Camera::Private : public Extensible::Private LIBCAMERA_DECLARE_PUBLIC(Camera) public: + Private(PipelineHandler *pipe, const std::string &id, + const std::set &streams); + ~Private(); + +private: enum State { CameraAvailable, CameraAcquired, @@ -34,10 +39,6 @@ public: CameraRunning, }; - Private(PipelineHandler *pipe, const std::string &id, - const std::set &streams); - ~Private(); - bool isRunning() const; int isAccessAllowed(State state, bool allowDisconnected = false, const char *from = __builtin_FUNCTION()) const; @@ -53,7 +54,6 @@ public: std::set streams_; std::set activeStreams_; -private: bool disconnected_; std::atomic state_; }; From patchwork Fri Jul 23 04:00:27 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 13094 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 18F64C322B for ; Fri, 23 Jul 2021 04:00:54 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 9C884687A6; Fri, 23 Jul 2021 06:00:53 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="gXYFxuDT"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id A10DD687B3 for ; Fri, 23 Jul 2021 06:00:45 +0200 (CEST) Received: from pendragon.lan (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 4886C255 for ; Fri, 23 Jul 2021 06:00:45 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1627012845; bh=4dx/v2c8jRR9FRY0TwaObkwD357G4HhrpQ0on5oxlW0=; h=From:To:Subject:Date:In-Reply-To:References:From; b=gXYFxuDTQV4ImzNSZixPpP38wYtkn3Oh/yDEUD9PVf9eGuMFE6mjX8zjtzWiVPonE /3Lyyyve0WbCTO4LXygvvuflNLCAvGko7iyH0hWQgWfDzuOCdR7/q6uTmIQviJfYUV 2mVOCku3XxL2mf06hOxu4R0P5XeY1EsxhPgi5Eug= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Fri, 23 Jul 2021 07:00:27 +0300 Message-Id: <20210723040036.32346-9-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210723040036.32346-1-laurent.pinchart@ideasonboard.com> References: <20210723040036.32346-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [RFC PATCH 08/17] libcamera: camera: Pass Private pointer to Camera constructor 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: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" In order to allow subclassing Camera::Private in pipeline handlers, pass the pointer to the private data to the Camera constructor, and to the Camera::createCamera() function. The Camera::Private id_ and streams_ members now need to be initialized by the Camera constructor instead of the Camera::Private constructor, to allow storage of the streams in a pipeline handler-specific subclass of Camera::Private. Signed-off-by: Laurent Pinchart Reviewed-by: Niklas Söderlund --- include/libcamera/camera.h | 5 ++-- include/libcamera/internal/camera.h | 3 +-- src/libcamera/camera.cpp | 26 ++++++++++++------- src/libcamera/pipeline/ipu3/ipu3.cpp | 4 ++- .../pipeline/raspberrypi/raspberrypi.cpp | 4 ++- src/libcamera/pipeline/rkisp1/rkisp1.cpp | 4 ++- src/libcamera/pipeline/simple/simple.cpp | 4 ++- src/libcamera/pipeline/uvcvideo/uvcvideo.cpp | 4 ++- src/libcamera/pipeline/vimc/vimc.cpp | 4 ++- 9 files changed, 37 insertions(+), 21 deletions(-) diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h index b081907e0cb1..17ddddc2722a 100644 --- a/include/libcamera/camera.h +++ b/include/libcamera/camera.h @@ -78,8 +78,7 @@ class Camera final : public Object, public std::enable_shared_from_this, LIBCAMERA_DECLARE_PRIVATE() public: - static std::shared_ptr create(PipelineHandler *pipe, - const std::string &id, + static std::shared_ptr create(Private *d, const std::string &id, const std::set &streams); const std::string &id() const; @@ -107,7 +106,7 @@ public: private: LIBCAMERA_DISABLE_COPY(Camera) - Camera(PipelineHandler *pipe, const std::string &id, + Camera(Private *d, const std::string &id, const std::set &streams); ~Camera(); diff --git a/include/libcamera/internal/camera.h b/include/libcamera/internal/camera.h index b60ed140356a..9ec8321a9a21 100644 --- a/include/libcamera/internal/camera.h +++ b/include/libcamera/internal/camera.h @@ -26,8 +26,7 @@ class Camera::Private : public Extensible::Private LIBCAMERA_DECLARE_PUBLIC(Camera) public: - Private(PipelineHandler *pipe, const std::string &id, - const std::set &streams); + Private(PipelineHandler *pipe); ~Private(); private: diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp index 4b5bc891fc37..a5bb60c698bc 100644 --- a/src/libcamera/camera.cpp +++ b/src/libcamera/camera.cpp @@ -332,11 +332,13 @@ std::size_t CameraConfiguration::size() const * \brief The vector of stream configurations */ -Camera::Private::Private(PipelineHandler *pipe, - const std::string &id, - const std::set &streams) - : pipe_(pipe->shared_from_this()), id_(id), streams_(streams), - disconnected_(false), state_(CameraAvailable) +/** + * \brief Construct a Camera::Private instance + * \param[in] pipe The pipeline handler responsible for the camera device + */ +Camera::Private::Private(PipelineHandler *pipe) + : pipe_(pipe->shared_from_this()), disconnected_(false), + state_(CameraAvailable) { } @@ -513,7 +515,7 @@ void Camera::Private::setState(State state) /** * \brief Create a camera instance - * \param[in] pipe The pipeline handler responsible for the camera device + * \param[in] d Camera private data * \param[in] id The ID of the camera device * \param[in] streams Array of streams the camera provides * @@ -527,10 +529,12 @@ void Camera::Private::setState(State state) * * \return A shared pointer to the newly created camera object */ -std::shared_ptr Camera::create(PipelineHandler *pipe, +std::shared_ptr Camera::create(Private *d, const std::string &id, const std::set &streams) { + ASSERT(d); + struct Deleter : std::default_delete { void operator()(Camera *camera) { @@ -541,7 +545,7 @@ std::shared_ptr Camera::create(PipelineHandler *pipe, } }; - Camera *camera = new Camera(pipe, id, streams); + Camera *camera = new Camera(d, id, streams); return std::shared_ptr(camera, Deleter()); } @@ -594,10 +598,12 @@ const std::string &Camera::id() const * application API calls by returning errors immediately. */ -Camera::Camera(PipelineHandler *pipe, const std::string &id, +Camera::Camera(Private *d, const std::string &id, const std::set &streams) - : Extensible(new Private(pipe, id, streams)) + : Extensible(d) { + d->id_ = id; + d->streams_ = streams; } Camera::~Camera() diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp index 76c3bb3d8aa9..15d6cca609ff 100644 --- a/src/libcamera/pipeline/ipu3/ipu3.cpp +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp @@ -23,6 +23,7 @@ #include #include +#include "libcamera/internal/camera.h" #include "libcamera/internal/camera_sensor.h" #include "libcamera/internal/delayed_controls.h" #include "libcamera/internal/device_enumerator.h" @@ -1185,7 +1186,8 @@ int PipelineHandlerIPU3::registerCameras() /* Create and register the Camera instance. */ std::string cameraId = cio2->sensor()->id(); std::shared_ptr camera = - Camera::create(this, cameraId, streams); + Camera::create(new Camera::Private(this), cameraId, + streams); registerCamera(std::move(camera), std::move(data)); diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp index f821d8fe1b6c..2411f73f48e0 100644 --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp @@ -30,6 +30,7 @@ #include #include "libcamera/internal/bayer_format.h" +#include "libcamera/internal/camera.h" #include "libcamera/internal/camera_sensor.h" #include "libcamera/internal/delayed_controls.h" #include "libcamera/internal/device_enumerator.h" @@ -1106,7 +1107,8 @@ bool PipelineHandlerRPi::match(DeviceEnumerator *enumerator) /* Create and register the camera. */ std::shared_ptr camera = - Camera::create(this, data->sensor_->id(), streams); + Camera::create(new Camera::Private(this), data->sensor_->id(), + streams); registerCamera(std::move(camera), std::move(data)); return true; diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp index 42911a8fdfdb..4a8ac97d5ef0 100644 --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp @@ -27,6 +27,7 @@ #include #include +#include "libcamera/internal/camera.h" #include "libcamera/internal/camera_sensor.h" #include "libcamera/internal/delayed_controls.h" #include "libcamera/internal/device_enumerator.h" @@ -970,7 +971,8 @@ int PipelineHandlerRkISP1::createCamera(MediaEntity *sensor) &data->selfPathStream_, }; std::shared_ptr camera = - Camera::create(this, data->sensor_->id(), streams); + Camera::create(new Camera::Private(this), data->sensor_->id(), + streams); registerCamera(std::move(camera), std::move(data)); return 0; diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp index b29fff9820e5..43af3fafa475 100644 --- a/src/libcamera/pipeline/simple/simple.cpp +++ b/src/libcamera/pipeline/simple/simple.cpp @@ -28,6 +28,7 @@ #include #include +#include "libcamera/internal/camera.h" #include "libcamera/internal/camera_sensor.h" #include "libcamera/internal/device_enumerator.h" #include "libcamera/internal/media_device.h" @@ -1046,7 +1047,8 @@ bool SimplePipelineHandler::match(DeviceEnumerator *enumerator) [](Stream &stream) { return &stream; }); std::shared_ptr camera = - Camera::create(this, data->sensor_->id(), streams); + Camera::create(new Camera::Private(this), + data->sensor_->id(), streams); registerCamera(std::move(camera), std::move(data)); registered = true; } diff --git a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp index 0f634b8da609..63cb1daaae22 100644 --- a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp +++ b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp @@ -22,6 +22,7 @@ #include #include +#include "libcamera/internal/camera.h" #include "libcamera/internal/device_enumerator.h" #include "libcamera/internal/media_device.h" #include "libcamera/internal/pipeline_handler.h" @@ -470,7 +471,8 @@ bool PipelineHandlerUVC::match(DeviceEnumerator *enumerator) } std::set streams{ &data->stream_ }; - std::shared_ptr camera = Camera::create(this, id, streams); + std::shared_ptr camera = + Camera::create(new Camera::Private(this), id, streams); registerCamera(std::move(camera), std::move(data)); /* Enable hot-unplug notifications. */ diff --git a/src/libcamera/pipeline/vimc/vimc.cpp b/src/libcamera/pipeline/vimc/vimc.cpp index 12f7517fd0ae..d63562b1ee54 100644 --- a/src/libcamera/pipeline/vimc/vimc.cpp +++ b/src/libcamera/pipeline/vimc/vimc.cpp @@ -29,6 +29,7 @@ #include #include +#include "libcamera/internal/camera.h" #include "libcamera/internal/camera_sensor.h" #include "libcamera/internal/device_enumerator.h" #include "libcamera/internal/ipa_manager.h" @@ -438,7 +439,8 @@ bool PipelineHandlerVimc::match(DeviceEnumerator *enumerator) /* Create and register the camera. */ std::set streams{ &data->stream_ }; std::shared_ptr camera = - Camera::create(this, data->sensor_->id(), streams); + Camera::create(new Camera::Private(this), data->sensor_->id(), + streams); registerCamera(std::move(camera), std::move(data)); return true; From patchwork Fri Jul 23 04:00:28 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 13095 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 B8F5FC322C for ; Fri, 23 Jul 2021 04:00:54 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 66925687A3; Fri, 23 Jul 2021 06:00:54 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="seJyCIEA"; dkim-atps=neutral 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 0803C687B6 for ; Fri, 23 Jul 2021 06:00:46 +0200 (CEST) Received: from pendragon.lan (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 9E7683F2 for ; Fri, 23 Jul 2021 06:00:45 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1627012845; bh=jEwNRp4l3LwS3qZ1t2bpDTdIYaFl4P4ixpYnI2f1Bwc=; h=From:To:Subject:Date:In-Reply-To:References:From; b=seJyCIEAHiJccfu1XnN254lJUhWxrOinH6fsb2cifLL7fBWh4VbGahq7wgp5CwSvI D37NDt/jW1xIDe3LX589Hs3KANl5lBF61MoWt5pYvhwXDsE4lnL2fG96Zb3gYVoTb5 4HLx8fdRSehYiMdRA36RCnG+A4RRj05LQq3uaGGM= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Fri, 23 Jul 2021 07:00:28 +0300 Message-Id: <20210723040036.32346-10-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210723040036.32346-1-laurent.pinchart@ideasonboard.com> References: <20210723040036.32346-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [RFC PATCH 09/17] libcamera: pipeline_handler: Move CameraData members to Camera::Private 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: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" With pipeline handlers now being able to subclass Camera::Private, start the migration from CameraData to Camera::Private by moving the members of the base CameraData class. The controlInfo_, properties_ and pipe_ members are duplicated for now, to allow migrating pipeline handlers one by one. The Camera::Private class is now properly documented, don't exclude it from documentation generation. Signed-off-by: Laurent Pinchart Reviewed-by: Niklas Söderlund --- Documentation/Doxyfile.in | 1 - include/libcamera/internal/camera.h | 8 +++ include/libcamera/internal/pipeline_handler.h | 5 +- src/libcamera/camera.cpp | 60 ++++++++++++++++++- src/libcamera/pipeline/rkisp1/rkisp1.cpp | 2 +- src/libcamera/pipeline_handler.cpp | 45 +++++--------- 6 files changed, 83 insertions(+), 38 deletions(-) diff --git a/Documentation/Doxyfile.in b/Documentation/Doxyfile.in index aee5c9fd7e59..b8777b0c4522 100644 --- a/Documentation/Doxyfile.in +++ b/Documentation/Doxyfile.in @@ -882,7 +882,6 @@ EXCLUDE_SYMBOLS = libcamera::BoundMethodArgs \ libcamera::BoundMethodPack \ libcamera::BoundMethodPackBase \ libcamera::BoundMethodStatic \ - libcamera::Camera::Private \ libcamera::CameraManager::Private \ libcamera::SignalBase \ *::details \ diff --git a/include/libcamera/internal/camera.h b/include/libcamera/internal/camera.h index 9ec8321a9a21..44242332a52f 100644 --- a/include/libcamera/internal/camera.h +++ b/include/libcamera/internal/camera.h @@ -29,6 +29,14 @@ public: Private(PipelineHandler *pipe); ~Private(); + PipelineHandler *pipe() { return pipe_.get(); } + + std::list queuedRequests_; + ControlInfoMap controlInfo_; + ControlList properties_; + + uint32_t requestSequence_; + private: enum State { CameraAvailable, diff --git a/include/libcamera/internal/pipeline_handler.h b/include/libcamera/internal/pipeline_handler.h index 9e2d65d6f2c5..86727f90bb65 100644 --- a/include/libcamera/internal/pipeline_handler.h +++ b/include/libcamera/internal/pipeline_handler.h @@ -39,18 +39,15 @@ class CameraData { public: explicit CameraData(PipelineHandler *pipe) - : pipe_(pipe), requestSequence_(0) + : pipe_(pipe) { } virtual ~CameraData() = default; PipelineHandler *pipe_; - std::list queuedRequests_; ControlInfoMap controlInfo_; ControlList properties_; - uint32_t requestSequence_; - private: LIBCAMERA_DISABLE_COPY(CameraData) }; diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp index a5bb60c698bc..72a42dbeb3d3 100644 --- a/src/libcamera/camera.cpp +++ b/src/libcamera/camera.cpp @@ -332,13 +332,25 @@ std::size_t CameraConfiguration::size() const * \brief The vector of stream configurations */ +/** + * \class Camera::Private + * \brief Base class for camera private data + * + * The Camera::Private class stores all private data associated with a camera. + * In addition to hiding core Camera data from the public API, it is expected to + * be subclassed by pipeline handlers to store pipeline-specific data. + * + * Pipeline handlers can obtain the Camera::Private instance associated with a + * camera by calling Camera::_d(). + */ + /** * \brief Construct a Camera::Private instance * \param[in] pipe The pipeline handler responsible for the camera device */ Camera::Private::Private(PipelineHandler *pipe) - : pipe_(pipe->shared_from_this()), disconnected_(false), - state_(CameraAvailable) + : requestSequence_(0), pipe_(pipe->shared_from_this()), + disconnected_(false), state_(CameraAvailable) { } @@ -348,6 +360,50 @@ Camera::Private::~Private() LOG(Camera, Error) << "Removing camera while still in use"; } +/** + * \fn Camera::Private::pipe() + * \brief Retrieve the pipeline handler related to this camera + * \return The pipeline handler for this camera + */ + +/** + * \var Camera::Private::queuedRequests_ + * \brief The list of queued and not yet completed request + * + * The list of queued request is used to track requests queued in order to + * ensure completion of all requests when the pipeline handler is stopped. + * + * \sa PipelineHandler::queueRequest(), PipelineHandler::stop(), + * PipelineHandler::completeRequest() + */ + +/** + * \var Camera::Private::controlInfo_ + * \brief The set of controls supported by the camera + * + * The control information shall be initialised by the pipeline handler when + * creating the camera, and shall not be modified afterwards. + */ + +/** + * \var Camera::Private::properties_ + * \brief The list of properties supported by the camera + * + * The list of camera properties shall be initialised by the pipeline handler + * when creating the camera, and shall not be modified afterwards. + */ + +/** + * \var Camera::Private::requestSequence_ + * \brief The queuing sequence of the request + * + * When requests are queued, they are given a per-camera sequence number to + * facilitate debugging of internal request usage. + * + * The requestSequence_ tracks the number of requests queued to a camera + * over its lifetime. + */ + static const char *const camera_state_names[] = { "Available", "Acquired", diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp index 4a8ac97d5ef0..cc279ce733ef 100644 --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp @@ -847,7 +847,7 @@ void PipelineHandlerRkISP1::stop(Camera *camera) LOG(RkISP1, Warning) << "Failed to stop parameters for " << camera->id(); - ASSERT(data->queuedRequests_.empty()); + ASSERT(camera->_d()->queuedRequests_.empty()); data->frameInfo_.clear(); freeBuffers(camera); diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp index c9928d444b04..1f1de19d81c5 100644 --- a/src/libcamera/pipeline_handler.cpp +++ b/src/libcamera/pipeline_handler.cpp @@ -16,6 +16,7 @@ #include #include +#include "libcamera/internal/camera.h" #include "libcamera/internal/device_enumerator.h" #include "libcamera/internal/media_device.h" #include "libcamera/internal/tracepoints.h" @@ -71,17 +72,6 @@ LOG_DEFINE_CATEGORY(Pipeline) * and remains valid until the instance is destroyed. */ -/** - * \var CameraData::queuedRequests_ - * \brief The list of queued and not yet completed request - * - * The list of queued request is used to track requests queued in order to - * ensure completion of all requests when the pipeline handler is stopped. - * - * \sa PipelineHandler::queueRequest(), PipelineHandler::stop(), - * PipelineHandler::completeRequest() - */ - /** * \var CameraData::controlInfo_ * \brief The set of controls supported by the camera @@ -98,17 +88,6 @@ LOG_DEFINE_CATEGORY(Pipeline) * when creating the camera, and shall not be modified afterwards. */ -/** - * \var CameraData::requestSequence_ - * \brief The queuing sequence of the request - * - * When requests are queued, they are given a per-camera sequence number to - * facilitate debugging of internal request usage. - * - * The requestSequence_ tracks the number of requests queued to a camera - * over its lifetime. - */ - /** * \class PipelineHandler * \brief Create and manage cameras based on a set of media devices @@ -254,8 +233,7 @@ void PipelineHandler::unlock() */ const ControlInfoMap &PipelineHandler::controls(const Camera *camera) const { - const CameraData *data = cameraData(camera); - return data->controlInfo_; + return camera->_d()->controlInfo_; } /** @@ -265,8 +243,7 @@ const ControlInfoMap &PipelineHandler::controls(const Camera *camera) const */ const ControlList &PipelineHandler::properties(const Camera *camera) const { - const CameraData *data = cameraData(camera); - return data->properties_; + return camera->_d()->properties_; } /** @@ -380,8 +357,7 @@ const ControlList &PipelineHandler::properties(const Camera *camera) const */ bool PipelineHandler::hasPendingRequests(const Camera *camera) const { - const CameraData *data = cameraData(camera); - return !data->queuedRequests_.empty(); + return !camera->_d()->queuedRequests_.empty(); } /** @@ -406,7 +382,7 @@ void PipelineHandler::queueRequest(Request *request) LIBCAMERA_TRACEPOINT(request_queue, request); Camera *camera = request->camera_; - CameraData *data = cameraData(camera); + Camera::Private *data = camera->_d(); data->queuedRequests_.push_back(request); request->sequence_ = data->requestSequence_++; @@ -479,7 +455,7 @@ void PipelineHandler::completeRequest(Request *request) request->complete(); - CameraData *data = cameraData(camera); + Camera::Private *data = camera->_d(); while (!data->queuedRequests_.empty()) { Request *req = data->queuedRequests_.front(); @@ -507,6 +483,15 @@ void PipelineHandler::completeRequest(Request *request) void PipelineHandler::registerCamera(std::shared_ptr camera, std::unique_ptr data) { + /* + * To be removed once all pipeline handlers will have migrated from + * CameraData to Camera::Private. + */ + if (data) { + camera->_d()->controlInfo_ = std::move(data->controlInfo_); + camera->_d()->properties_ = std::move(data->properties_); + } + cameraData_[camera.get()] = std::move(data); cameras_.push_back(camera); From patchwork Fri Jul 23 04:00:29 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 13096 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 45311C322D for ; Fri, 23 Jul 2021 04:00:55 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id F0F35687B8; Fri, 23 Jul 2021 06:00:54 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="rsF0PSRS"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 48B3F687B7 for ; Fri, 23 Jul 2021 06:00:46 +0200 (CEST) Received: from pendragon.lan (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id EF0A3255 for ; Fri, 23 Jul 2021 06:00:45 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1627012846; bh=+aXGq3GFx8h1Hd35k/8Hn5d7WNmsQ53jjBd5VUsrVsE=; h=From:To:Subject:Date:In-Reply-To:References:From; b=rsF0PSRS1v8J3FLDX3WHvmiWVL+CRQBRkURHjIYh/9A5prpveuic95SZVwlz9vvLe 8sgy5Y9RvWDba/h841BYbgliMB8K/EoynXYAwKnV1wy+xtTvfQfJ90cNXnHo9nCMWC kDPLg1QwIQuZF02G3rVF/I4oKmWCE2Pccyru9XWE= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Fri, 23 Jul 2021 07:00:29 +0300 Message-Id: <20210723040036.32346-11-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210723040036.32346-1-laurent.pinchart@ideasonboard.com> References: <20210723040036.32346-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [RFC PATCH 10/17] libcamera: pipeline: simple: Migrate to Camera::Private 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: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" As part of the effort to remove the CameraData class, migrate the pipeline handler-specific camera data from CameraData to the Camera::Private class. Signed-off-by: Laurent Pinchart --- src/libcamera/pipeline/simple/simple.cpp | 25 ++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp index 43af3fafa475..81d342a3fa73 100644 --- a/src/libcamera/pipeline/simple/simple.cpp +++ b/src/libcamera/pipeline/simple/simple.cpp @@ -147,7 +147,7 @@ static const SimplePipelineInfo supportedDevices[] = { } /* namespace */ -class SimpleCameraData : public CameraData +class SimpleCameraData : public Camera::Private { public: SimpleCameraData(SimplePipelineHandler *pipe, @@ -213,7 +213,7 @@ private: * reference to the camera data, store a new reference to the camera. */ std::shared_ptr camera_; - const SimpleCameraData *data_; + SimpleCameraData *data_; const SimpleCameraData::Configuration *pipeConfig_; bool needConversion_; @@ -246,10 +246,9 @@ protected: private: static constexpr unsigned int kNumInternalBuffers = 3; - SimpleCameraData *cameraData(const Camera *camera) + SimpleCameraData *cameraData(Camera *camera) { - return static_cast( - PipelineHandler::cameraData(camera)); + return static_cast(camera->_d()); } std::vector locateSensors(); @@ -274,7 +273,7 @@ private: SimpleCameraData::SimpleCameraData(SimplePipelineHandler *pipe, unsigned int numStreams, MediaEntity *sensor) - : CameraData(pipe), streams_(numStreams) + : Camera::Private(pipe), streams_(numStreams) { int ret; @@ -355,7 +354,8 @@ SimpleCameraData::SimpleCameraData(SimplePipelineHandler *pipe, int SimpleCameraData::init() { - SimplePipelineHandler *pipe = static_cast(pipe_); + SimplePipelineHandler *pipe = + static_cast(this->pipe()); SimpleConverter *converter = pipe->converter(); int ret; @@ -480,7 +480,8 @@ int SimpleCameraData::setupLinks() int SimpleCameraData::setupFormats(V4L2SubdeviceFormat *format, V4L2Subdevice::Whence whence) { - SimplePipelineHandler *pipe = static_cast(pipe_); + SimplePipelineHandler *pipe = + static_cast(this->pipe()); int ret; /* @@ -581,7 +582,7 @@ CameraConfiguration::Status SimpleCameraConfiguration::validate() } /* Adjust the requested streams. */ - SimplePipelineHandler *pipe = static_cast(data_->pipe_); + SimplePipelineHandler *pipe = static_cast(data_->pipe()); SimpleConverter *converter = pipe->converter(); /* @@ -1046,10 +1047,10 @@ bool SimplePipelineHandler::match(DeviceEnumerator *enumerator) std::inserter(streams, streams.end()), [](Stream &stream) { return &stream; }); + const std::string &id = data->sensor_->id(); std::shared_ptr camera = - Camera::create(new Camera::Private(this), - data->sensor_->id(), streams); - registerCamera(std::move(camera), std::move(data)); + Camera::create(data.release(), id, streams); + registerCamera(std::move(camera), nullptr); registered = true; } From patchwork Fri Jul 23 04:00:30 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 13097 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 DA7D3C322B for ; Fri, 23 Jul 2021 04:00:55 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 8120A687B0; Fri, 23 Jul 2021 06:00:55 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="hZ5crH3Q"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id A0E8E687B8 for ; Fri, 23 Jul 2021 06:00:46 +0200 (CEST) Received: from pendragon.lan (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 480793F2 for ; Fri, 23 Jul 2021 06:00:46 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1627012846; bh=3DtBBVxGIVC49GG2tY0w3L2TSGfDvX473+kQYROvREs=; h=From:To:Subject:Date:In-Reply-To:References:From; b=hZ5crH3QhLK9ttV/cvRc3kXId/7LoKlpVQZsQzQurjLvtV7L5aMGi1+cTdgDvjwc+ 5qWnW4xdBkuaAcc4o8ukGVR3lnLe/y99vIUKDupvD4kcKdy+cbXjdPLKormFf3343b Dwh/29p/YDPfCp4S4Ar06XRKaOIq1QaEEYtK+P0g= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Fri, 23 Jul 2021 07:00:30 +0300 Message-Id: <20210723040036.32346-12-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210723040036.32346-1-laurent.pinchart@ideasonboard.com> References: <20210723040036.32346-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [RFC PATCH 11/17] libcamera: pipeline: uvcvideo: Migrate to Camera::Private 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: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" As part of the effort to remove the CameraData class, migrate the pipeline handler-specific camera data from CameraData to the Camera::Private class. Signed-off-by: Laurent Pinchart Reviewed-by: Niklas Söderlund --- src/libcamera/pipeline/uvcvideo/uvcvideo.cpp | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp index 63cb1daaae22..bbeeda97a91a 100644 --- a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp +++ b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp @@ -33,11 +33,11 @@ namespace libcamera { LOG_DEFINE_CATEGORY(UVC) -class UVCCameraData : public CameraData +class UVCCameraData : public Camera::Private { public: UVCCameraData(PipelineHandler *pipe) - : CameraData(pipe) + : Camera::Private(pipe) { } @@ -87,10 +87,9 @@ private: const ControlValue &value); int processControls(UVCCameraData *data, Request *request); - UVCCameraData *cameraData(const Camera *camera) + UVCCameraData *cameraData(Camera *camera) { - return static_cast( - PipelineHandler::cameraData(camera)); + return static_cast(camera->_d()); } }; @@ -472,8 +471,8 @@ bool PipelineHandlerUVC::match(DeviceEnumerator *enumerator) std::set streams{ &data->stream_ }; std::shared_ptr camera = - Camera::create(new Camera::Private(this), id, streams); - registerCamera(std::move(camera), std::move(data)); + Camera::create(data.release(), id, streams); + registerCamera(std::move(camera), nullptr); /* Enable hot-unplug notifications. */ hotplugMediaDevice(media); @@ -668,8 +667,8 @@ void UVCCameraData::bufferReady(FrameBuffer *buffer) request->metadata().set(controls::SensorTimestamp, buffer->metadata().timestamp); - pipe_->completeBuffer(request, buffer); - pipe_->completeRequest(request); + pipe()->completeBuffer(request, buffer); + pipe()->completeRequest(request); } REGISTER_PIPELINE_HANDLER(PipelineHandlerUVC) From patchwork Fri Jul 23 04:00:31 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 13098 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 4A1CCC322C for ; Fri, 23 Jul 2021 04:00:57 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 042B5687CB; Fri, 23 Jul 2021 06:00:57 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="ZDoVXtQs"; dkim-atps=neutral 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 F3AC2687A3 for ; Fri, 23 Jul 2021 06:00:46 +0200 (CEST) Received: from pendragon.lan (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 9536A255 for ; Fri, 23 Jul 2021 06:00:46 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1627012846; bh=oLWVGlAghpTVZY6CsjfeE0hLQ54uAKGFLU+OP5wm6Ho=; h=From:To:Subject:Date:In-Reply-To:References:From; b=ZDoVXtQsLFOr218Lyezm6PAo8HwvrWXudFxQjDIL8/kUX8HEOZOMOvBR8YegKFVOo n+2D0U69PgpYb+DbMJLmK7uAWGsDavDFp46f7HazTMC+E96dhyOL49Xuzse2JT8CyU Df5MDeSf3FUQxLi21fWBonUUqvsDLV2JBzLN5knE= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Fri, 23 Jul 2021 07:00:31 +0300 Message-Id: <20210723040036.32346-13-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210723040036.32346-1-laurent.pinchart@ideasonboard.com> References: <20210723040036.32346-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [RFC PATCH 12/17] libcamera: pipeline: vimc: Migrate to Camera::Private 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: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" As part of the effort to remove the CameraData class, migrate the pipeline handler-specific camera data from CameraData to the Camera::Private class. Signed-off-by: Laurent Pinchart Reviewed-by: Niklas Söderlund --- src/libcamera/pipeline/vimc/vimc.cpp | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/libcamera/pipeline/vimc/vimc.cpp b/src/libcamera/pipeline/vimc/vimc.cpp index d63562b1ee54..866c993d7e50 100644 --- a/src/libcamera/pipeline/vimc/vimc.cpp +++ b/src/libcamera/pipeline/vimc/vimc.cpp @@ -42,11 +42,11 @@ namespace libcamera { LOG_DEFINE_CATEGORY(VIMC) -class VimcCameraData : public CameraData +class VimcCameraData : public Camera::Private { public: VimcCameraData(PipelineHandler *pipe, MediaDevice *media) - : CameraData(pipe), media_(media) + : Camera::Private(pipe), media_(media) { } @@ -97,10 +97,9 @@ public: private: int processControls(VimcCameraData *data, Request *request); - VimcCameraData *cameraData(const Camera *camera) + VimcCameraData *cameraData(Camera *camera) { - return static_cast( - PipelineHandler::cameraData(camera)); + return static_cast(camera->_d()); } }; @@ -438,10 +437,10 @@ bool PipelineHandlerVimc::match(DeviceEnumerator *enumerator) /* Create and register the camera. */ std::set streams{ &data->stream_ }; + const std::string &id = data->sensor_->id(); std::shared_ptr camera = - Camera::create(new Camera::Private(this), data->sensor_->id(), - streams); - registerCamera(std::move(camera), std::move(data)); + Camera::create(data.release(), id, streams); + registerCamera(std::move(camera), nullptr); return true; } @@ -530,8 +529,8 @@ void VimcCameraData::bufferReady(FrameBuffer *buffer) request->metadata().set(controls::SensorTimestamp, buffer->metadata().timestamp); - pipe_->completeBuffer(request, buffer); - pipe_->completeRequest(request); + pipe()->completeBuffer(request, buffer); + pipe()->completeRequest(request); } REGISTER_PIPELINE_HANDLER(PipelineHandlerVimc) From patchwork Fri Jul 23 04:00:32 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 13099 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 D0C51C322D for ; Fri, 23 Jul 2021 04:00:57 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 67C44687CE; Fri, 23 Jul 2021 06:00:57 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="XmNxSl3J"; dkim-atps=neutral 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 4AD55687A6 for ; Fri, 23 Jul 2021 06:00:47 +0200 (CEST) Received: from pendragon.lan (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id E535A51D for ; Fri, 23 Jul 2021 06:00:46 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1627012847; bh=r7pL0ew8khhXdcN3ZhlYoPwX+890wNmG5Qb5YE2ZOhY=; h=From:To:Subject:Date:In-Reply-To:References:From; b=XmNxSl3JrgQsjpcVV9jySgggJBHoWQoEQLIPtZgde27lrY7DtHlbjXfqVY3yW1v24 kk5OXkHKU9v1U6PCNTKIATEnBnNX4Gmh8mtYKy0z5J+pS/1zBCS7dgsmdv+qXqsaxZ zCuOZLfUbBPxwOYk8TS9o8qbNDMdpd3oRWQvV6To= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Fri, 23 Jul 2021 07:00:32 +0300 Message-Id: <20210723040036.32346-14-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210723040036.32346-1-laurent.pinchart@ideasonboard.com> References: <20210723040036.32346-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [RFC PATCH 13/17] libcamera: pipeline: rkisp1: Migrate to Camera::Private 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: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" As part of the effort to remove the CameraData class, migrate the pipeline handler-specific camera data from CameraData to the Camera::Private class. Signed-off-by: Laurent Pinchart Reviewed-by: Niklas Söderlund --- src/libcamera/pipeline/rkisp1/rkisp1.cpp | 28 ++++++++++++------------ 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp index cc279ce733ef..eab892785fb0 100644 --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp @@ -77,12 +77,12 @@ private: std::map frameInfo_; }; -class RkISP1CameraData : public CameraData +class RkISP1CameraData : public Camera::Private { public: RkISP1CameraData(PipelineHandler *pipe, RkISP1MainPath *mainPath, RkISP1SelfPath *selfPath) - : CameraData(pipe), frame_(0), frameInfo_(pipe), + : Camera::Private(pipe), frame_(0), frameInfo_(pipe), mainPath_(mainPath), selfPath_(selfPath) { } @@ -152,16 +152,15 @@ public: bool match(DeviceEnumerator *enumerator) override; private: - RkISP1CameraData *cameraData(const Camera *camera) + RkISP1CameraData *cameraData(Camera *camera) { - return static_cast( - PipelineHandler::cameraData(camera)); + return static_cast(camera->_d()); } friend RkISP1CameraData; friend RkISP1Frames; - int initLinks(const Camera *camera, const CameraSensor *sensor, + int initLinks(Camera *camera, const CameraSensor *sensor, const RkISP1CameraConfiguration &config); int createCamera(MediaEntity *sensor); void tryCompleteRequest(Request *request); @@ -307,7 +306,7 @@ RkISP1FrameInfo *RkISP1Frames::find(Request *request) int RkISP1CameraData::loadIPA(unsigned int hwRevision) { - ipa_ = IPAManager::createIPA(pipe_, 1, 1); + ipa_ = IPAManager::createIPA(pipe(), 1, 1); if (!ipa_) return -ENOENT; @@ -333,7 +332,8 @@ void RkISP1CameraData::queueFrameAction(unsigned int frame, break; } case ipa::rkisp1::ActionParamFilled: { - PipelineHandlerRkISP1 *pipe = static_cast(pipe_); + PipelineHandlerRkISP1 *pipe = + static_cast(this->pipe()); RkISP1FrameInfo *info = frameInfo_.find(frame); if (!info) break; @@ -361,7 +361,7 @@ void RkISP1CameraData::queueFrameAction(unsigned int frame, void RkISP1CameraData::metadataReady(unsigned int frame, const ControlList &metadata) { PipelineHandlerRkISP1 *pipe = - static_cast(pipe_); + static_cast(this->pipe()); RkISP1FrameInfo *info = frameInfo_.find(frame); if (!info) @@ -847,7 +847,7 @@ void PipelineHandlerRkISP1::stop(Camera *camera) LOG(RkISP1, Warning) << "Failed to stop parameters for " << camera->id(); - ASSERT(camera->_d()->queuedRequests_.empty()); + ASSERT(data->queuedRequests_.empty()); data->frameInfo_.clear(); freeBuffers(camera); @@ -879,7 +879,7 @@ int PipelineHandlerRkISP1::queueRequestDevice(Camera *camera, Request *request) * Match and Setup */ -int PipelineHandlerRkISP1::initLinks(const Camera *camera, +int PipelineHandlerRkISP1::initLinks(Camera *camera, const CameraSensor *sensor, const RkISP1CameraConfiguration &config) { @@ -970,10 +970,10 @@ int PipelineHandlerRkISP1::createCamera(MediaEntity *sensor) &data->mainPathStream_, &data->selfPathStream_, }; + const std::string &id = data->sensor_->id(); std::shared_ptr camera = - Camera::create(new Camera::Private(this), data->sensor_->id(), - streams); - registerCamera(std::move(camera), std::move(data)); + Camera::create(data.release(), id, streams); + registerCamera(std::move(camera), nullptr); return 0; } From patchwork Fri Jul 23 04:00:33 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 13100 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 3B78AC322E for ; Fri, 23 Jul 2021 04:00:58 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id E7071687B4; Fri, 23 Jul 2021 06:00:57 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="vXV5YPTz"; dkim-atps=neutral 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 9AD0B687BC for ; Fri, 23 Jul 2021 06:00:47 +0200 (CEST) Received: from pendragon.lan (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 403AB255 for ; Fri, 23 Jul 2021 06:00:47 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1627012847; bh=D1R6ksVXPbSumN2Q+kkiXcP5p3Vfyezaib68Mqnh3Dk=; h=From:To:Subject:Date:In-Reply-To:References:From; b=vXV5YPTzaIIhOPr6ouT/mGfmkZqy+5K4ZgVJZkkAXEX6bY/PUtck1pscoLO7HEJXa ChtZTztLx9wGmPOgYu200qicccDub7icizEf2uBmR54khaOzkiQ+IMh0KsHgtlkekz ThLNr2nT+4zoyn7lNoZlJwBbr+6RKdpW4ACkl9WI= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Fri, 23 Jul 2021 07:00:33 +0300 Message-Id: <20210723040036.32346-15-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210723040036.32346-1-laurent.pinchart@ideasonboard.com> References: <20210723040036.32346-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [RFC PATCH 14/17] libcamera: pipeline: raspberrypi: Migrate to Camera::Private 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: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" As part of the effort to remove the CameraData class, migrate the pipeline handler-specific camera data from CameraData to the Camera::Private class. Signed-off-by: Laurent Pinchart Reviewed-by: Niklas Söderlund --- .../pipeline/raspberrypi/raspberrypi.cpp | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp index 2411f73f48e0..be8dcdc67a15 100644 --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp @@ -135,11 +135,11 @@ enum class Isp : unsigned int { Input, Output0, Output1, Stats }; } /* namespace */ -class RPiCameraData : public CameraData +class RPiCameraData : public Camera::Private { public: RPiCameraData(PipelineHandler *pipe) - : CameraData(pipe), state_(State::Stopped), + : Camera::Private(pipe), state_(State::Stopped), supportsFlips_(false), flipsAlterBayerOrder_(false), dropFrameCount_(0), ispOutputCount_(0) { @@ -263,9 +263,9 @@ public: bool match(DeviceEnumerator *enumerator) override; private: - RPiCameraData *cameraData(const Camera *camera) + RPiCameraData *cameraData(Camera *camera) { - return static_cast(PipelineHandler::cameraData(camera)); + return static_cast(camera->_d()); } int queueAllBuffers(Camera *camera); @@ -1106,10 +1106,10 @@ bool PipelineHandlerRPi::match(DeviceEnumerator *enumerator) streams.insert(&data->isp_[Isp::Output1]); /* Create and register the camera. */ + const std::string &id = data->sensor_->id(); std::shared_ptr camera = - Camera::create(new Camera::Private(this), data->sensor_->id(), - streams); - registerCamera(std::move(camera), std::move(data)); + Camera::create(data.release(), id, streams); + registerCamera(std::move(camera), nullptr); return true; } @@ -1224,7 +1224,7 @@ void RPiCameraData::frameStarted(uint32_t sequence) int RPiCameraData::loadIPA(ipa::RPi::SensorConfig *sensorConfig) { - ipa_ = IPAManager::createIPA(pipe_, 1, 1); + ipa_ = IPAManager::createIPA(pipe(), 1, 1); if (!ipa_) return -ENOENT; @@ -1523,10 +1523,10 @@ void RPiCameraData::clearIncompleteRequests() for (auto &b : request->buffers()) { FrameBuffer *buffer = b.second; buffer->cancel(); - pipe_->completeBuffer(request, buffer); + pipe()->completeBuffer(request, buffer); } - pipe_->completeRequest(request); + pipe()->completeRequest(request); requestQueue_.pop_front(); } } @@ -1550,7 +1550,7 @@ void RPiCameraData::handleStreamBuffer(FrameBuffer *buffer, RPi::Stream *stream) * Tag the buffer as completed, returning it to the * application. */ - pipe_->completeBuffer(request, buffer); + pipe()->completeBuffer(request, buffer); } else { /* * This buffer was not part of the Request, or there is no @@ -1613,7 +1613,7 @@ void RPiCameraData::checkRequestCompleted() if (state_ != State::IpaComplete) return; - pipe_->completeRequest(request); + pipe()->completeRequest(request); requestQueue_.pop_front(); requestCompleted = true; } From patchwork Fri Jul 23 04:00:34 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 13101 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 D2163C322B for ; Fri, 23 Jul 2021 04:00:58 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 8517A687BE; Fri, 23 Jul 2021 06:00:58 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="P1HTC/ca"; dkim-atps=neutral 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 F02C5687AA for ; Fri, 23 Jul 2021 06:00:47 +0200 (CEST) Received: from pendragon.lan (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 8FB813F2 for ; Fri, 23 Jul 2021 06:00:47 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1627012847; bh=d7R3DLTRH+CMHwPmKMDbDCJQPXT3Nn5Q8EtlxnLOZ3Y=; h=From:To:Subject:Date:In-Reply-To:References:From; b=P1HTC/caftlODFE0yNclo+27cZIVjSMvZrjWf6zW0lUsvh6fURSgQpFjDhg/KVnqI vNZy16VdkqFnjX5e+FSB+zTHovT5rg+k54SR9KuS0qQuU7nuiMbl8bp9ZavX7FJ5G9 5fo/NrepFx7yxPucrxlrEsjjTyNJOaBWnB9D/JU8= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Fri, 23 Jul 2021 07:00:34 +0300 Message-Id: <20210723040036.32346-16-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210723040036.32346-1-laurent.pinchart@ideasonboard.com> References: <20210723040036.32346-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [RFC PATCH 15/17] libcamera: pipeline: ipu3: Migrate to Camera::Private 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: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" As part of the effort to remove the CameraData class, migrate the pipeline handler-specific camera data from CameraData to the Camera::Private class. Signed-off-by: Laurent Pinchart Reviewed-by: Niklas Söderlund --- src/libcamera/pipeline/ipu3/ipu3.cpp | 38 +++++++++++++--------------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp index 15d6cca609ff..6d097ac91d2e 100644 --- a/src/libcamera/pipeline/ipu3/ipu3.cpp +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp @@ -53,11 +53,11 @@ static const ControlInfoMap::Map IPU3Controls = { { &controls::draft::PipelineDepth, ControlInfo(2, 3) }, }; -class IPU3CameraData : public CameraData +class IPU3CameraData : public Camera::Private { public: IPU3CameraData(PipelineHandler *pipe) - : CameraData(pipe), exposureTime_(0), supportsFlips_(false) + : Camera::Private(pipe), exposureTime_(0), supportsFlips_(false) { } @@ -146,10 +146,9 @@ public: bool match(DeviceEnumerator *enumerator) override; private: - IPU3CameraData *cameraData(const Camera *camera) + IPU3CameraData *cameraData(Camera *camera) { - return static_cast( - PipelineHandler::cameraData(camera)); + return static_cast(camera->_d()); } int initControls(IPU3CameraData *data); @@ -800,10 +799,10 @@ void IPU3CameraData::cancelPendingRequests() for (auto it : request->buffers()) { FrameBuffer *buffer = it.second; buffer->cancel(); - pipe_->completeBuffer(request, buffer); + pipe()->completeBuffer(request, buffer); } - pipe_->completeRequest(request); + pipe()->completeRequest(request); pendingRequests_.pop(); } } @@ -1184,12 +1183,11 @@ int PipelineHandlerIPU3::registerCameras() &IPU3CameraData::statBufferReady); /* Create and register the Camera instance. */ - std::string cameraId = cio2->sensor()->id(); + const std::string &cameraId = cio2->sensor()->id(); std::shared_ptr camera = - Camera::create(new Camera::Private(this), cameraId, - streams); + Camera::create(data.release(), cameraId, streams); - registerCamera(std::move(camera), std::move(data)); + registerCamera(std::move(camera), nullptr); LOG(IPU3, Info) << "Registered Camera[" << numCameras << "] \"" @@ -1204,7 +1202,7 @@ int PipelineHandlerIPU3::registerCameras() int IPU3CameraData::loadIPA() { - ipa_ = IPAManager::createIPA(pipe_, 1, 1); + ipa_ = IPAManager::createIPA(pipe(), 1, 1); if (!ipa_) return -ENOENT; @@ -1261,7 +1259,7 @@ void IPU3CameraData::queueFrameAction(unsigned int id, info->metadataProcessed = true; if (frameInfos_.tryComplete(info)) - pipe_->completeRequest(request); + pipe()->completeRequest(request); break; } @@ -1289,7 +1287,7 @@ void IPU3CameraData::imguOutputBufferReady(FrameBuffer *buffer) Request *request = info->request; - pipe_->completeBuffer(request, buffer); + pipe()->completeBuffer(request, buffer); request->metadata().set(controls::draft::PipelineDepth, 3); /* \todo Move the ExposureTime control to the IPA. */ @@ -1300,7 +1298,7 @@ void IPU3CameraData::imguOutputBufferReady(FrameBuffer *buffer) request->metadata().set(controls::ScalerCrop, cropRegion_); if (frameInfos_.tryComplete(info)) - pipe_->completeRequest(request); + pipe()->completeRequest(request); } /** @@ -1332,16 +1330,16 @@ void IPU3CameraData::cio2BufferReady(FrameBuffer *buffer) for (auto it : request->buffers()) { FrameBuffer *b = it.second; b->cancel(); - pipe_->completeBuffer(request, b); + pipe()->completeBuffer(request, b); } frameInfos_.remove(info); - pipe_->completeRequest(request); + pipe()->completeRequest(request); return; } if (request->findBuffer(&rawStream_)) - pipe_->completeBuffer(request, buffer); + pipe()->completeBuffer(request, buffer); ipa::ipu3::IPU3Event ev; ev.op = ipa::ipu3::EventFillParams; @@ -1367,7 +1365,7 @@ void IPU3CameraData::paramBufferReady(FrameBuffer *buffer) Request *request = info->request; if (frameInfos_.tryComplete(info)) - pipe_->completeRequest(request); + pipe()->completeRequest(request); } void IPU3CameraData::statBufferReady(FrameBuffer *buffer) @@ -1386,7 +1384,7 @@ void IPU3CameraData::statBufferReady(FrameBuffer *buffer) * In that event, we must have obtained the Request before hand. */ if (frameInfos_.tryComplete(info)) - pipe_->completeRequest(request); + pipe()->completeRequest(request); return; } From patchwork Fri Jul 23 04:00:35 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 13102 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 60364C3230 for ; Fri, 23 Jul 2021 04:00:59 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 05C57687BF; Fri, 23 Jul 2021 06:00:59 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="h6Nsz/j1"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 411ED687BE for ; Fri, 23 Jul 2021 06:00:48 +0200 (CEST) Received: from pendragon.lan (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id E5431255 for ; Fri, 23 Jul 2021 06:00:47 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1627012848; bh=P0RGGyqpNqjeuNdwM8q26IofwAflvK3FHu2yiCXmrpw=; h=From:To:Subject:Date:In-Reply-To:References:From; b=h6Nsz/j118LxWhKm1bo3AQtBNwaHseh4E3vhUfSmOWQFlmgiSHAJlU7xVqpR+hCs0 R9d6CBHc2MD1UxHxpDHbEuzZSjH4YAcrxz1atmYH+mZpRatVfJY2pV6758Jgij3oH2 hXU448AqjIRz3ixJ8yatSL1fnXwQvp5zEwQxM9iM= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Fri, 23 Jul 2021 07:00:35 +0300 Message-Id: <20210723040036.32346-17-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210723040036.32346-1-laurent.pinchart@ideasonboard.com> References: <20210723040036.32346-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [RFC PATCH 16/17] libcamera: pipeline_handler: Drop CameraData class 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: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" The CameraData class isn't used anymore. Drop it. Signed-off-by: Laurent Pinchart Reviewed-by: Niklas Söderlund --- include/libcamera/internal/pipeline_handler.h | 26 +---- src/libcamera/pipeline/ipu3/ipu3.cpp | 2 +- .../pipeline/raspberrypi/raspberrypi.cpp | 2 +- src/libcamera/pipeline/rkisp1/rkisp1.cpp | 2 +- src/libcamera/pipeline/simple/simple.cpp | 2 +- src/libcamera/pipeline/uvcvideo/uvcvideo.cpp | 2 +- src/libcamera/pipeline/vimc/vimc.cpp | 2 +- src/libcamera/pipeline_handler.cpp | 94 +------------------ 8 files changed, 9 insertions(+), 123 deletions(-) diff --git a/include/libcamera/internal/pipeline_handler.h b/include/libcamera/internal/pipeline_handler.h index 86727f90bb65..2f814753f2ae 100644 --- a/include/libcamera/internal/pipeline_handler.h +++ b/include/libcamera/internal/pipeline_handler.h @@ -8,14 +8,12 @@ #define __LIBCAMERA_INTERNAL_PIPELINE_HANDLER_H__ #include -#include #include #include #include #include #include -#include #include #include @@ -35,23 +33,6 @@ class MediaDevice; class PipelineHandler; class Request; -class CameraData -{ -public: - explicit CameraData(PipelineHandler *pipe) - : pipe_(pipe) - { - } - virtual ~CameraData() = default; - - PipelineHandler *pipe_; - ControlInfoMap controlInfo_; - ControlList properties_; - -private: - LIBCAMERA_DISABLE_COPY(CameraData) -}; - class PipelineHandler : public std::enable_shared_from_this, public Object { @@ -88,15 +69,11 @@ public: const char *name() const { return name_; } protected: - void registerCamera(std::shared_ptr camera, - std::unique_ptr data); + void registerCamera(std::shared_ptr camera); void hotplugMediaDevice(MediaDevice *media); virtual int queueRequestDevice(Camera *camera, Request *request) = 0; - CameraData *cameraData(const Camera *camera); - const CameraData *cameraData(const Camera *camera) const; - CameraManager *manager_; private: @@ -105,7 +82,6 @@ private: std::vector> mediaDevices_; std::vector> cameras_; - std::map> cameraData_; const char *name_; diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp index 6d097ac91d2e..713fbec4daae 100644 --- a/src/libcamera/pipeline/ipu3/ipu3.cpp +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp @@ -1187,7 +1187,7 @@ int PipelineHandlerIPU3::registerCameras() std::shared_ptr camera = Camera::create(data.release(), cameraId, streams); - registerCamera(std::move(camera), nullptr); + registerCamera(std::move(camera)); LOG(IPU3, Info) << "Registered Camera[" << numCameras << "] \"" diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp index be8dcdc67a15..895ab3fee329 100644 --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp @@ -1109,7 +1109,7 @@ bool PipelineHandlerRPi::match(DeviceEnumerator *enumerator) const std::string &id = data->sensor_->id(); std::shared_ptr camera = Camera::create(data.release(), id, streams); - registerCamera(std::move(camera), nullptr); + registerCamera(std::move(camera)); return true; } diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp index eab892785fb0..22be1a03e4dc 100644 --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp @@ -973,7 +973,7 @@ int PipelineHandlerRkISP1::createCamera(MediaEntity *sensor) const std::string &id = data->sensor_->id(); std::shared_ptr camera = Camera::create(data.release(), id, streams); - registerCamera(std::move(camera), nullptr); + registerCamera(std::move(camera)); return 0; } diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp index 81d342a3fa73..8594520f520c 100644 --- a/src/libcamera/pipeline/simple/simple.cpp +++ b/src/libcamera/pipeline/simple/simple.cpp @@ -1050,7 +1050,7 @@ bool SimplePipelineHandler::match(DeviceEnumerator *enumerator) const std::string &id = data->sensor_->id(); std::shared_ptr camera = Camera::create(data.release(), id, streams); - registerCamera(std::move(camera), nullptr); + registerCamera(std::move(camera)); registered = true; } diff --git a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp index bbeeda97a91a..882d3f82839a 100644 --- a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp +++ b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp @@ -472,7 +472,7 @@ bool PipelineHandlerUVC::match(DeviceEnumerator *enumerator) std::set streams{ &data->stream_ }; std::shared_ptr camera = Camera::create(data.release(), id, streams); - registerCamera(std::move(camera), nullptr); + registerCamera(std::move(camera)); /* Enable hot-unplug notifications. */ hotplugMediaDevice(media); diff --git a/src/libcamera/pipeline/vimc/vimc.cpp b/src/libcamera/pipeline/vimc/vimc.cpp index 866c993d7e50..bd7cbcebe3ff 100644 --- a/src/libcamera/pipeline/vimc/vimc.cpp +++ b/src/libcamera/pipeline/vimc/vimc.cpp @@ -440,7 +440,7 @@ bool PipelineHandlerVimc::match(DeviceEnumerator *enumerator) const std::string &id = data->sensor_->id(); std::shared_ptr camera = Camera::create(data.release(), id, streams); - registerCamera(std::move(camera), nullptr); + registerCamera(std::move(camera)); return true; } diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp index 1f1de19d81c5..28e09bc00771 100644 --- a/src/libcamera/pipeline_handler.cpp +++ b/src/libcamera/pipeline_handler.cpp @@ -39,55 +39,6 @@ namespace libcamera { LOG_DEFINE_CATEGORY(Pipeline) -/** - * \class CameraData - * \brief Base class for platform-specific data associated with a camera - * - * The CameraData base abstract class represents platform specific-data - * a pipeline handler might want to associate with a Camera to access them - * at a later time. - * - * Pipeline handlers are expected to extend this base class with platform - * specific implementation, associate instances of the derived classes - * using the registerCamera() method, and access them at a later time - * with cameraData(). - */ - -/** - * \fn CameraData::CameraData(PipelineHandler *pipe) - * \brief Construct a CameraData instance for the given pipeline handler - * \param[in] pipe The pipeline handler - * - * The reference to the pipeline handler is stored internally, the caller shall - * guarantee that the pointer remains valid as long as the CameraData instance - * exists. - */ - -/** - * \var CameraData::pipe_ - * \brief The pipeline handler related to this CameraData instance - * - * The pipe_ pointer provides access to the PipelineHandler object that this - * instance is related to. It is set when the CameraData instance is created - * and remains valid until the instance is destroyed. - */ - -/** - * \var CameraData::controlInfo_ - * \brief The set of controls supported by the camera - * - * The control information shall be initialised by the pipeline handler when - * creating the camera, and shall not be modified afterwards. - */ - -/** - * \var CameraData::properties_ - * \brief The list of properties supported by the camera - * - * The list of camera properties shall be initialised by the pipeline handler - * when creating the camera, and shall not be modified afterwards. - */ - /** * \class PipelineHandler * \brief Create and manage cameras based on a set of media devices @@ -471,28 +422,14 @@ void PipelineHandler::completeRequest(Request *request) /** * \brief Register a camera to the camera manager and pipeline handler * \param[in] camera The camera to be added - * \param[in] data Pipeline-specific data for the camera * * This method is called by pipeline handlers to register the cameras they - * handle with the camera manager. It associates the pipeline-specific \a data - * with the camera, for later retrieval with cameraData(). Ownership of \a data - * is transferred to the PipelineHandler. + * handle with the camera manager. * * \context This function shall be called from the CameraManager thread. */ -void PipelineHandler::registerCamera(std::shared_ptr camera, - std::unique_ptr data) +void PipelineHandler::registerCamera(std::shared_ptr camera) { - /* - * To be removed once all pipeline handlers will have migrated from - * CameraData to Camera::Private. - */ - if (data) { - camera->_d()->controlInfo_ = std::move(data->controlInfo_); - camera->_d()->properties_ = std::move(data->properties_); - } - - cameraData_[camera.get()] = std::move(data); cameras_.push_back(camera); if (mediaDevices_.empty()) @@ -586,33 +523,6 @@ void PipelineHandler::disconnect() } } -/** - * \brief Retrieve the pipeline-specific data associated with a Camera - * \param[in] camera The camera whose data to retrieve - * \return A pointer to the pipeline-specific data passed to registerCamera(). - * The returned pointer is a borrowed reference and is guaranteed to remain - * valid until the pipeline handler is destroyed. It shall not be deleted - * manually by the caller. - */ -CameraData *PipelineHandler::cameraData(const Camera *camera) -{ - ASSERT(cameraData_.count(camera)); - return cameraData_[camera].get(); -} - -/** - * \brief Retrieve the pipeline-specific data associated with a Camera - * \param[in] camera The camera whose data to retrieve - * \sa cameraData() - * \return A const pointer to the pipeline-specific data passed to - * registerCamera(). - */ -const CameraData *PipelineHandler::cameraData(const Camera *camera) const -{ - ASSERT(cameraData_.count(camera)); - return cameraData_.at(camera).get(); -} - /** * \var PipelineHandler::manager_ * \brief The Camera manager associated with the pipeline handler From patchwork Fri Jul 23 04:00:36 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 13103 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 00EB5C3231 for ; Fri, 23 Jul 2021 04:00:59 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 7C4F8687D0; Fri, 23 Jul 2021 06:00:59 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="ZnAKo5Le"; dkim-atps=neutral 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 9D25E60274 for ; Fri, 23 Jul 2021 06:00:48 +0200 (CEST) Received: from pendragon.lan (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 413DA3F2 for ; Fri, 23 Jul 2021 06:00:48 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1627012848; bh=PwB2hskSDdZ+F+/R7J/JPSoLHHc7r8SiwB2V7al17lA=; h=From:To:Subject:Date:In-Reply-To:References:From; b=ZnAKo5LepfoxnC5ILlo/2hTYEVFLXEoth77m3JiC8KF9rMqRPAhnuV0VhOKIPVjdc FyoVqz0iOkH25Oj/MQOehTGfSd31Q45154Tyqljr9yHMT+78R66bbdwC9jCNZ7hcYa VjLJYJLNpGTiP3S2dEGFF9gyWsDMTmF4HHMngNM0= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Fri, 23 Jul 2021 07:00:36 +0300 Message-Id: <20210723040036.32346-18-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210723040036.32346-1-laurent.pinchart@ideasonboard.com> References: <20210723040036.32346-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [RFC PATCH 17/17] Documentation: guides: pipeline-handler: Migrate to Camera::Private 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: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" Update the pipeline handler guide following the migration from the CameraData class to the Camera::Private class. Signed-off-by: Laurent Pinchart Reviewed-by: Niklas Söderlund --- Documentation/guides/pipeline-handler.rst | 67 ++++++++++++----------- 1 file changed, 34 insertions(+), 33 deletions(-) diff --git a/Documentation/guides/pipeline-handler.rst b/Documentation/guides/pipeline-handler.rst index 152776935a33..7e9ff824dd50 100644 --- a/Documentation/guides/pipeline-handler.rst +++ b/Documentation/guides/pipeline-handler.rst @@ -106,7 +106,7 @@ functionalities descibed above. Below is a brief overview of each of those: Abstracts camera sensor handling by hiding the details of the V4L2 subdevice kernel API and caching sensor information. -- `CameraData `_: +- `Camera::Private `_: Represents device-specific data a pipeline handler associates to each Camera instance. @@ -416,26 +416,26 @@ receivers port output. The Pipeline Handler is responsible for defining the set of Streams associated with the Camera. -Each Camera has instance-specific data represented using the `CameraData`_ +Each Camera has instance-specific data represented using the `Camera::Private`_ class, which can be extended for the specific needs of the pipeline handler. -.. _CameraData: http://libcamera.org/api-html/classlibcamera_1_1CameraData.html +.. _Camera::Private: http://libcamera.org/api-html/classlibcamera_1_1Camera_1_1Private.html -To support the Camera we will later register, we need to create a CameraData +To support the Camera we will later register, we need to create a Camera::Private class that we can implement for our specific Pipeline Handler. -Define a new ``VividCameraData()`` class derived from ``CameraData`` by adding -the following code before the PipelineHandlerVivid class definition where it -will be used: +Define a new ``VividCameraPrivate()`` class derived from ``Camera::Private`` by +adding the following code before the PipelineHandlerVivid class definition where +it will be used: .. code-block:: cpp - class VividCameraData : public CameraData + class VividCameraData : public Camera::Private { public: VividCameraData(PipelineHandler *pipe, MediaDevice *media) - : CameraData(pipe), media_(media), video_(nullptr) + : Camera::Private(pipe), media_(media), video_(nullptr) { } @@ -457,17 +457,17 @@ single stream, represented by the ``VividCameraData`` class members. More complex pipeline handlers might register cameras composed of several video devices and sub-devices, or multiple streams per camera that represent the several components of the image capture pipeline. You should represent all these -components in the ``CameraData`` derived class when developing a custom +components in the ``Camera::Private`` derived class when developing a custom PipelineHandler. In our example VividCameraData we implement an ``init()`` function to prepare -the object from our PipelineHandler, however the CameraData class does not +the object from our PipelineHandler, however the Camera::Private class does not specify the interface for initialisation and PipelineHandlers can manage this -based on their own needs. Derived CameraData classes are used only by their +based on their own needs. Derived Camera::Private classes are used only by their respective pipeline handlers. -The CameraData class stores the context required for each camera instance and -is usually responsible for opening all Devices used in the capture pipeline. +The Camera::Private class stores the context required for each camera instance +and is usually responsible for opening all Devices used in the capture pipeline. We can now implement the ``init`` method for our example Pipeline Handler to create a new V4L2 video device from the media entity, which we can specify using @@ -488,11 +488,11 @@ capture device named 'vivid-000-vid-cap' by the device. return 0; } -The CameraData should be created and initialised before we move on to register a -new Camera device so we need to construct and initialise our +The VividCameraData should be created and initialised before we move on to +register a new Camera device so we need to construct and initialise our VividCameraData after we have identified our device within PipelineHandlerVivid::match(). The VividCameraData is wrapped by a -std::unique_ptr to help manage the lifetime of our CameraData instance. +std::unique_ptr to help manage the lifetime of the instance. If the camera data initialization fails, return ``false`` to indicate the failure to the ``match()`` method and prevent retrying of the pipeline handler. @@ -508,9 +508,9 @@ failure to the ``match()`` method and prevent retrying of the pipeline handler. Once the camera data has been initialized, the Camera device instances and the associated streams have to be registered. Create a set of streams for the camera, which for this device is only one. You create a camera using the static -`Camera::create`_ method, passing the pipeline handler, the id of the camera, -and the streams available. Then register the camera and its data with the -pipeline handler and camera manager using `registerCamera`_. +`Camera::create`_ method, passing the Camera::Private instance, the id of the +camera, and the streams available. Then register the camera with the pipeline +handler and camera manager using `registerCamera`_. Finally with a successful construction, we return 'true' indicating that the PipelineHandler successfully matched and constructed a device. @@ -548,23 +548,24 @@ Our match function should now look like the following: /* Create and register the camera. */ std::set streams{ &data->stream_ }; - std::shared_ptr camera = Camera::create(this, data->video_->deviceName(), streams); - registerCamera(std::move(camera), std::move(data)); + const std::string &id = data->video_->deviceName(); + std::shared_ptr camera = Camera::create(data.release(), id, streams); + registerCamera(std::move(camera)); return true; } -We will need to use our custom CameraData class frequently throughout the +We will need to use our custom VividCameraData class frequently throughout the pipeline handler, so we add a private convenience helper to our Pipeline handler -to obtain and cast the custom CameraData instance from a Camera instance. +to obtain and cast the custom VividCameraData instance from a Camera::Private +instance. .. code-block:: cpp private: - VividCameraData *cameraData(const Camera *camera) + VividCameraData *cameraData(Camera *camera) { - return static_cast( - PipelineHandler::cameraData(camera)); + return static_cast(camera->_d()); } At this point, you need to add the following new includes to provide the Camera @@ -594,12 +595,12 @@ are defined by src/libcamera/`properties_ids.yaml`_. Pipeline handlers can optionally register the list of controls an application can set as well as a list of immutable camera properties. Being both -Camera-specific values, they are represented in the ``CameraData`` base class, -which provides two members for this purpose: the `CameraData::controlInfo_`_ and -the `CameraData::properties_`_ fields. +Camera-specific values, they are represented in the ``Camera::Private`` base +class, which provides two members for this purpose: the +`Camera::Private::controlInfo_`_ and the `Camera::Private::properties_`_ fields. -.. _CameraData::controlInfo_: http://libcamera.org/api-html/classlibcamera_1_1CameraData.html#ab9fecd05c655df6084a2233872144a52 -.. _CameraData::properties_: http://libcamera.org/api-html/classlibcamera_1_1CameraData.html#a84002c29f45bd35566c172bb65e7ec0b +.. _Camera::Private::controlInfo_: http://libcamera.org/api-html/classlibcamera_1_1Camera_1_1Private.html#ab4e183eb4dabe929d1b2bbbb519b969f +.. _Camera::Private::properties_: http://libcamera.org/api-html/classlibcamera_1_1Camera_1_1Private.html#ad31f12f5ed9c1fbe25750902f4791064 The ``controlInfo_`` field represents a map of ``ControlId`` instances associated with the limits of valid values supported for the control. More @@ -617,7 +618,7 @@ Complete the initialization of the ``VividCameraData`` class by adding the following code to the ``VividCameraData::init()`` method to initialise the controls. For more complex control configurations, this could of course be broken out to a separate function, but for now we just initialise the small set -inline in our CameraData init: +inline in our VividCameraData init: .. code-block:: cpp From patchwork Fri Jul 30 21:57:13 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 13173 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 DF340C322E for ; Fri, 30 Jul 2021 21:57:30 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 29561687C3; Fri, 30 Jul 2021 23:57:30 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="GNZjfydq"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 96EC7687BE for ; Fri, 30 Jul 2021 23:57:28 +0200 (CEST) Received: from pendragon.lan (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 20E1B2A3 for ; Fri, 30 Jul 2021 23:57:28 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1627682248; bh=gXmYBGkKkthAgkEL9HcBQWLBZ13fAZR27+XeYOmrScw=; h=From:To:Subject:Date:In-Reply-To:References:From; b=GNZjfydq5jeodkAfH7lH4ejgOkewdfNvwLzrO5OadbRfsjS6V0zfX3WI9SJpA+91s dWaDt9MkfnUW7rh8rMdO46YrQsqAl3QMqmoJ3TAfVGBVgwp9Q7T5Bby6oHH9UGUMDc aDwKcWJYpJ8yWL7BLjulhpXGACKoEJENSkvjb7gQ= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Sat, 31 Jul 2021 00:57:13 +0300 Message-Id: <20210730215713.27440-1-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210723040036.32346-1-laurent.pinchart@ideasonboard.com> References: <20210723040036.32346-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [RFC PATCH 18/17] libcamera: pipeline_handler: Drop controls() and properties() functions 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: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" The PipelineHandler controls() and properties() functions are only used by the Camera class. Now that the controls and properties are stored in the Camera::Private class, we can drop those functions and access the private data directly in Camera::controls() and Camera::properties(). Suggested-by: Jacopo Mondi Signed-off-by: Laurent Pinchart --- include/libcamera/internal/pipeline_handler.h | 3 --- src/libcamera/camera.cpp | 4 ++-- src/libcamera/pipeline_handler.cpp | 21 ------------------- 3 files changed, 2 insertions(+), 26 deletions(-) diff --git a/include/libcamera/internal/pipeline_handler.h b/include/libcamera/internal/pipeline_handler.h index 2f814753f2ae..79e9839fa0de 100644 --- a/include/libcamera/internal/pipeline_handler.h +++ b/include/libcamera/internal/pipeline_handler.h @@ -47,9 +47,6 @@ public: bool lock(); void unlock(); - const ControlInfoMap &controls(const Camera *camera) const; - const ControlList &properties(const Camera *camera) const; - virtual CameraConfiguration *generateConfiguration(Camera *camera, const StreamRoles &roles) = 0; virtual int configure(Camera *camera, CameraConfiguration *config) = 0; diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp index 72a42dbeb3d3..ff9fc92e3344 100644 --- a/src/libcamera/camera.cpp +++ b/src/libcamera/camera.cpp @@ -795,7 +795,7 @@ int Camera::release() */ const ControlInfoMap &Camera::controls() const { - return _d()->pipe_->controls(this); + return _d()->controlInfo_; } /** @@ -808,7 +808,7 @@ const ControlInfoMap &Camera::controls() const */ const ControlList &Camera::properties() const { - return _d()->pipe_->properties(this); + return _d()->properties_; } /** diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp index 28e09bc00771..bf238377c67a 100644 --- a/src/libcamera/pipeline_handler.cpp +++ b/src/libcamera/pipeline_handler.cpp @@ -176,27 +176,6 @@ void PipelineHandler::unlock() media->unlock(); } -/** - * \brief Retrieve the list of controls for a camera - * \param[in] camera The camera - * \context This function is \threadsafe. - * \return A ControlInfoMap listing the controls support by \a camera - */ -const ControlInfoMap &PipelineHandler::controls(const Camera *camera) const -{ - return camera->_d()->controlInfo_; -} - -/** - * \brief Retrieve the list of properties for a camera - * \param[in] camera The camera - * \return A ControlList of properties supported by \a camera - */ -const ControlList &PipelineHandler::properties(const Camera *camera) const -{ - return camera->_d()->properties_; -} - /** * \fn PipelineHandler::generateConfiguration() * \brief Generate a camera configuration for a specified camera