From patchwork Mon Jun 29 16:29:50 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= X-Patchwork-Id: 27106 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 D62B8C3261 for ; Mon, 29 Jun 2026 16:31:17 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 6418A65F64; Mon, 29 Jun 2026 18:31:17 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="cYiweoaS"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 1402D65F2B for ; Mon, 29 Jun 2026 18:30:27 +0200 (CEST) Received: from pb-laptop.local (185.221.140.128.nat.pool.zt.hu [185.221.140.128]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id E0F7B1044 for ; Mon, 29 Jun 2026 18:29:43 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1782750584; bh=m199Ycdt1zqJxthRezUaGD9zYzpy0v3FKAV4DN0S9AA=; h=From:To:Subject:Date:In-Reply-To:References:From; b=cYiweoaSDhhOWtMizMJOhmXbdxnai3TOxaB2dIYsQ7ukfA8q14WAcaM0u5ttPClDC fhIFb4TV2fLJ3HcVTdwZBmWex62ES5eQ47IEjZmu6AlckjDG6zoQW89BmZH7UvCJzi u5jmOvCUdBmjAJr+JcY+cCT/nrKEywGSKS/QHk1o= From: =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= To: libcamera-devel@lists.libcamera.org Subject: [RFC PATCH v1 27/54] libcamera: pipeline_handler: Move constructor options to a separate type Date: Mon, 29 Jun 2026 18:29:50 +0200 Message-ID: <20260629163017.863145-28-barnabas.pocze@ideasonboard.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260629163017.863145-1-barnabas.pocze@ideasonboard.com> References: <20260629163017.863145-1-barnabas.pocze@ideasonboard.com> MIME-Version: 1.0 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" Add a new `Options` type that stores the optional parameters for the pipeline handler base class. Currently there is only one, which is "maxQueuedRequestsDevice". TODO: `options = {}` does not work in the arg list, should it be worked around or is it fine? Signed-off-by: Barnabás Pőcze --- Documentation/guides/pipeline-handler.rst | 2 +- include/libcamera/internal/pipeline_handler.h | 10 +++-- src/libcamera/pipeline/imx8-isi/imx8-isi.cpp | 2 +- src/libcamera/pipeline/ipu3/ipu3.cpp | 2 +- src/libcamera/pipeline/mali-c55/mali-c55.cpp | 3 +- src/libcamera/pipeline/rkisp1/rkisp1.cpp | 3 +- .../pipeline/rpi/common/pipeline_base.h | 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/virtual/virtual.cpp | 2 +- src/libcamera/pipeline_handler.cpp | 45 ++++++++++--------- 12 files changed, 43 insertions(+), 34 deletions(-) diff --git a/Documentation/guides/pipeline-handler.rst b/Documentation/guides/pipeline-handler.rst index 2d2231eb68..31affee4af 100644 --- a/Documentation/guides/pipeline-handler.rst +++ b/Documentation/guides/pipeline-handler.rst @@ -217,7 +217,7 @@ stub implementations for the overridden class members. }; PipelineHandlerVivid::PipelineHandlerVivid(CameraManager *manager) - : PipelineHandler(manager) + : PipelineHandler(manager, {}) { } diff --git a/include/libcamera/internal/pipeline_handler.h b/include/libcamera/internal/pipeline_handler.h index f90cae253f..e978557036 100644 --- a/include/libcamera/internal/pipeline_handler.h +++ b/include/libcamera/internal/pipeline_handler.h @@ -37,8 +37,11 @@ class PipelineHandler : public std::enable_shared_from_this, public Object { public: - PipelineHandler(CameraManager *manager, - unsigned int maxQueuedRequestsDevice = 32); + struct Options { + unsigned int maxQueuedRequestsDevice = 32; + }; + + PipelineHandler(CameraManager *manager, const Options &options); virtual ~PipelineHandler(); virtual bool match(DeviceEnumerator *enumerator) = 0; @@ -100,7 +103,6 @@ protected: virtual void releaseDevice(Camera *camera); CameraManager *manager_; - const unsigned int maxQueuedRequestsDevice_; private: void unlockMediaDevices(); @@ -117,6 +119,8 @@ private: const char *name_; unsigned int useCount_; + const Options options_; + friend class PipelineHandlerFactoryBase; }; diff --git a/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp b/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp index d3f152aa1e..f995fa50d5 100644 --- a/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp +++ b/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp @@ -612,7 +612,7 @@ CameraConfiguration::Status ISICameraConfiguration::validate() */ PipelineHandlerISI::PipelineHandlerISI(CameraManager *manager) - : PipelineHandler(manager) + : PipelineHandler(manager, {}) { } diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp index af1b79d708..7e22388d02 100644 --- a/src/libcamera/pipeline/ipu3/ipu3.cpp +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp @@ -385,7 +385,7 @@ CameraConfiguration::Status IPU3CameraConfiguration::validate() } PipelineHandlerIPU3::PipelineHandlerIPU3(CameraManager *manager) - : PipelineHandler(manager), cio2MediaDev_(nullptr), imguMediaDev_(nullptr) + : PipelineHandler(manager, {}), cio2MediaDev_(nullptr), imguMediaDev_(nullptr) { } diff --git a/src/libcamera/pipeline/mali-c55/mali-c55.cpp b/src/libcamera/pipeline/mali-c55/mali-c55.cpp index 0c7b7ed370..114179f49d 100644 --- a/src/libcamera/pipeline/mali-c55/mali-c55.cpp +++ b/src/libcamera/pipeline/mali-c55/mali-c55.cpp @@ -786,7 +786,8 @@ private: }; PipelineHandlerMaliC55::PipelineHandlerMaliC55(CameraManager *manager) - : PipelineHandler(manager, kMaliC55BufferCount), dsFitted_(true) + : PipelineHandler(manager, { .maxQueuedRequestsDevice = kMaliC55BufferCount }), + dsFitted_(true) { } diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp index 0c1e5767b4..2aa273d220 100644 --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp @@ -782,7 +782,8 @@ CameraConfiguration::Status RkISP1CameraConfiguration::validate() */ PipelineHandlerRkISP1::PipelineHandlerRkISP1(CameraManager *manager) - : PipelineHandler(manager, kRkISP1MaxQueuedRequests), hasSelfPath_(true) + : PipelineHandler(manager, { .maxQueuedRequestsDevice = kRkISP1MaxQueuedRequests }), + hasSelfPath_(true) { } diff --git a/src/libcamera/pipeline/rpi/common/pipeline_base.h b/src/libcamera/pipeline/rpi/common/pipeline_base.h index 758155ee0d..1b16a6e6a5 100644 --- a/src/libcamera/pipeline/rpi/common/pipeline_base.h +++ b/src/libcamera/pipeline/rpi/common/pipeline_base.h @@ -203,7 +203,7 @@ class PipelineHandlerBase : public PipelineHandler { public: PipelineHandlerBase(CameraManager *manager) - : PipelineHandler(manager) + : PipelineHandler(manager, {}) { } diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp index 381f8db3ee..2a4f03df72 100644 --- a/src/libcamera/pipeline/simple/simple.cpp +++ b/src/libcamera/pipeline/simple/simple.cpp @@ -1402,7 +1402,7 @@ CameraConfiguration::Status SimpleCameraConfiguration::validate() */ SimplePipelineHandler::SimplePipelineHandler(CameraManager *manager) - : PipelineHandler(manager, kMaxQueuedRequestsDevice), + : PipelineHandler(manager, { .maxQueuedRequestsDevice = kMaxQueuedRequestsDevice }), converter_(nullptr) { } diff --git a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp index f8d49d9122..928ee79559 100644 --- a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp +++ b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp @@ -230,7 +230,7 @@ CameraConfiguration::Status UVCCameraConfiguration::validate() } PipelineHandlerUVC::PipelineHandlerUVC(CameraManager *manager) - : PipelineHandler(manager) + : PipelineHandler(manager, {}) { } diff --git a/src/libcamera/pipeline/vimc/vimc.cpp b/src/libcamera/pipeline/vimc/vimc.cpp index 528022776e..490f693da4 100644 --- a/src/libcamera/pipeline/vimc/vimc.cpp +++ b/src/libcamera/pipeline/vimc/vimc.cpp @@ -196,7 +196,7 @@ CameraConfiguration::Status VimcCameraConfiguration::validate() } PipelineHandlerVimc::PipelineHandlerVimc(CameraManager *manager) - : PipelineHandler(manager) + : PipelineHandler(manager, {}) { } diff --git a/src/libcamera/pipeline/virtual/virtual.cpp b/src/libcamera/pipeline/virtual/virtual.cpp index f9e2cecea3..011e31d9d5 100644 --- a/src/libcamera/pipeline/virtual/virtual.cpp +++ b/src/libcamera/pipeline/virtual/virtual.cpp @@ -243,7 +243,7 @@ CameraConfiguration::Status VirtualCameraConfiguration::validate() bool PipelineHandlerVirtual::created_ = false; PipelineHandlerVirtual::PipelineHandlerVirtual(CameraManager *manager) - : PipelineHandler(manager), + : PipelineHandler(manager, {}), dmaBufAllocator_(DmaBufAllocator::DmaBufAllocatorFlag::CmaHeap | DmaBufAllocator::DmaBufAllocatorFlag::SystemHeap | DmaBufAllocator::DmaBufAllocatorFlag::UDmaBuf) diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp index 29a21a0d70..efea534649 100644 --- a/src/libcamera/pipeline_handler.cpp +++ b/src/libcamera/pipeline_handler.cpp @@ -59,20 +59,37 @@ LOG_DEFINE_CATEGORY(Pipeline) * PipelineHandler class where only the 'this' pointer is available. */ +/** + * \class PipelineHandler::Options + * \brief The collection of optional options of the base class + */ + +/** + * \var PipelineHandler::Options::maxQueuedRequestsDevice + * \brief The maximum number of requests the pipeline handler shall queue to the + * device + * + * maxQueuedRequestsDevice limits the number of request that the + * pipeline handler shall queue to the underlying hardware, in order to + * saturate the pipeline with requests. The application may choose to queue + * as many requests as it desires, however only maxQueuedRequestsDevice + * requests will be queued to the hardware at a given point in time. The + * remaining requests will be kept waiting in the internal waiting + * queue, to be queued at a later stage. + */ + /** * \brief Construct a PipelineHandler instance * \param[in] manager The camera manager - * \param[in] maxQueuedRequestsDevice The maximum number of requests queued to - * the device + * \param[in] options The options options for the pipeline handler base class * * In order to honour the std::enable_shared_from_this<> contract, * PipelineHandler instances shall never be constructed manually, but always * through the PipelineHandlerFactoryBase::create() function. */ PipelineHandler::PipelineHandler(CameraManager *manager, - unsigned int maxQueuedRequestsDevice) - : manager_(manager), maxQueuedRequestsDevice_(maxQueuedRequestsDevice), - useCount_(0) + const Options &options) + : manager_(manager), useCount_(0), options_(options) { } @@ -453,7 +470,7 @@ bool PipelineHandler::hasPendingRequests(const Camera *camera) const * queued to the pipeline handler. * * The queue of waiting requests is iterated and up to \a - * maxQueuedRequestsDevice_ prepared requests are passed to the pipeline handler + * maxQueuedRequestsDevice prepared requests are passed to the pipeline handler * in the same order they have been queued by calling this function. * * If a Request fails during the preparation phase or if the pipeline handler @@ -509,7 +526,7 @@ void PipelineHandler::doQueueRequests(Camera *camera) { Camera::Private *data = camera->_d(); while (!data->waitingRequests_.empty()) { - if (data->queuedRequests_.size() == maxQueuedRequestsDevice_) + if (data->queuedRequests_.size() == options_.maxQueuedRequestsDevice) break; Request *request = data->waitingRequests_.front(); @@ -862,20 +879,6 @@ void PipelineHandler::disconnect() * constant for the whole lifetime of the pipeline handler. */ -/** - * \var PipelineHandler::maxQueuedRequestsDevice_ - * \brief The maximum number of requests the pipeline handler shall queue to the - * device - * - * maxQueuedRequestsDevice_ limits the number of request that the - * pipeline handler shall queue to the underlying hardware, in order to - * saturate the pipeline with requests. The application may choose to queue - * as many requests as it desires, however only maxQueuedRequestsDevice_ - * requests will be queued to the hardware at a given point in time. The - * remaining requests will be kept waiting in the internal waiting - * queue, to be queued at a later stage. - */ - /** * \fn PipelineHandler::name() * \brief Retrieve the pipeline handler name