Show a patch.

GET /api/1.1/patches/27106/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 27106,
    "url": "https://patchwork.libcamera.org/api/1.1/patches/27106/?format=api",
    "web_url": "https://patchwork.libcamera.org/patch/27106/",
    "project": {
        "id": 1,
        "url": "https://patchwork.libcamera.org/api/1.1/projects/1/?format=api",
        "name": "libcamera",
        "link_name": "libcamera",
        "list_id": "libcamera_core",
        "list_email": "libcamera-devel@lists.libcamera.org",
        "web_url": "",
        "scm_url": "",
        "webscm_url": ""
    },
    "msgid": "<20260629163017.863145-28-barnabas.pocze@ideasonboard.com>",
    "date": "2026-06-29T16:29:50",
    "name": "[RFC,v1,27/54] libcamera: pipeline_handler: Move constructor options to a separate type",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "70fdea4b442d39fdecb95ffef59d658eb87f8174",
    "submitter": {
        "id": 216,
        "url": "https://patchwork.libcamera.org/api/1.1/people/216/?format=api",
        "name": "Barnabás Pőcze",
        "email": "barnabas.pocze@ideasonboard.com"
    },
    "delegate": null,
    "mbox": "https://patchwork.libcamera.org/patch/27106/mbox/",
    "series": [
        {
            "id": 6025,
            "url": "https://patchwork.libcamera.org/api/1.1/series/6025/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=6025",
            "date": "2026-06-29T16:29:23",
            "name": "libcamera: Split requests and buffers",
            "version": 1,
            "mbox": "https://patchwork.libcamera.org/series/6025/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/patches/27106/comments/",
    "check": "pending",
    "checks": "https://patchwork.libcamera.org/api/patches/27106/checks/",
    "tags": {},
    "headers": {
        "Return-Path": "<libcamera-devel-bounces@lists.libcamera.org>",
        "X-Original-To": "parsemail@patchwork.libcamera.org",
        "Delivered-To": "parsemail@patchwork.libcamera.org",
        "Received": [
            "from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id D62B8C3261\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 29 Jun 2026 16:31:17 +0000 (UTC)",
            "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 6418A65F64;\n\tMon, 29 Jun 2026 18:31:17 +0200 (CEST)",
            "from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 1402D65F2B\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 29 Jun 2026 18:30:27 +0200 (CEST)",
            "from pb-laptop.local (185.221.140.128.nat.pool.zt.hu\n\t[185.221.140.128])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id E0F7B1044\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 29 Jun 2026 18:29:43 +0200 (CEST)"
        ],
        "Authentication-Results": "lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"cYiweoaS\"; dkim-atps=neutral",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1782750584;\n\tbh=m199Ycdt1zqJxthRezUaGD9zYzpy0v3FKAV4DN0S9AA=;\n\th=From:To:Subject:Date:In-Reply-To:References:From;\n\tb=cYiweoaSDhhOWtMizMJOhmXbdxnai3TOxaB2dIYsQ7ukfA8q14WAcaM0u5ttPClDC\n\tfhIFb4TV2fLJ3HcVTdwZBmWex62ES5eQ47IEjZmu6AlckjDG6zoQW89BmZH7UvCJzi\n\tu5jmOvCUdBmjAJr+JcY+cCT/nrKEywGSKS/QHk1o=",
        "From": "=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>",
        "To": "libcamera-devel@lists.libcamera.org",
        "Subject": "[RFC PATCH v1 27/54] libcamera: pipeline_handler: Move constructor\n\toptions 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",
        "Content-Type": "text/plain; charset=UTF-8",
        "Content-Transfer-Encoding": "8bit",
        "X-BeenThere": "libcamera-devel@lists.libcamera.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "<libcamera-devel.lists.libcamera.org>",
        "List-Unsubscribe": "<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>",
        "List-Archive": "<https://lists.libcamera.org/pipermail/libcamera-devel/>",
        "List-Post": "<mailto:libcamera-devel@lists.libcamera.org>",
        "List-Help": "<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>",
        "List-Subscribe": "<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>",
        "Errors-To": "libcamera-devel-bounces@lists.libcamera.org",
        "Sender": "\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"
    },
    "content": "Add a new `Options` type that stores the optional parameters for\nthe pipeline handler base class. Currently there is only one, which\nis \"maxQueuedRequestsDevice\".\n\nTODO: `options = {}` does not work in the arg list, should it be worked\naround or is it fine?\n\nSigned-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>\n---\n Documentation/guides/pipeline-handler.rst     |  2 +-\n include/libcamera/internal/pipeline_handler.h | 10 +++--\n src/libcamera/pipeline/imx8-isi/imx8-isi.cpp  |  2 +-\n src/libcamera/pipeline/ipu3/ipu3.cpp          |  2 +-\n src/libcamera/pipeline/mali-c55/mali-c55.cpp  |  3 +-\n src/libcamera/pipeline/rkisp1/rkisp1.cpp      |  3 +-\n .../pipeline/rpi/common/pipeline_base.h       |  2 +-\n src/libcamera/pipeline/simple/simple.cpp      |  2 +-\n src/libcamera/pipeline/uvcvideo/uvcvideo.cpp  |  2 +-\n src/libcamera/pipeline/vimc/vimc.cpp          |  2 +-\n src/libcamera/pipeline/virtual/virtual.cpp    |  2 +-\n src/libcamera/pipeline_handler.cpp            | 45 ++++++++++---------\n 12 files changed, 43 insertions(+), 34 deletions(-)",
    "diff": "diff --git a/Documentation/guides/pipeline-handler.rst b/Documentation/guides/pipeline-handler.rst\nindex 2d2231eb68..31affee4af 100644\n--- a/Documentation/guides/pipeline-handler.rst\n+++ b/Documentation/guides/pipeline-handler.rst\n@@ -217,7 +217,7 @@ stub implementations for the overridden class members.\n    };\n \n    PipelineHandlerVivid::PipelineHandlerVivid(CameraManager *manager)\n-          : PipelineHandler(manager)\n+          : PipelineHandler(manager, {})\n    {\n    }\n \ndiff --git a/include/libcamera/internal/pipeline_handler.h b/include/libcamera/internal/pipeline_handler.h\nindex f90cae253f..e978557036 100644\n--- a/include/libcamera/internal/pipeline_handler.h\n+++ b/include/libcamera/internal/pipeline_handler.h\n@@ -37,8 +37,11 @@ class PipelineHandler : public std::enable_shared_from_this<PipelineHandler>,\n \t\t\tpublic Object\n {\n public:\n-\tPipelineHandler(CameraManager *manager,\n-\t\t\tunsigned int maxQueuedRequestsDevice = 32);\n+\tstruct Options {\n+\t\tunsigned int maxQueuedRequestsDevice = 32;\n+\t};\n+\n+\tPipelineHandler(CameraManager *manager, const Options &options);\n \tvirtual ~PipelineHandler();\n \n \tvirtual bool match(DeviceEnumerator *enumerator) = 0;\n@@ -100,7 +103,6 @@ protected:\n \tvirtual void releaseDevice(Camera *camera);\n \n \tCameraManager *manager_;\n-\tconst unsigned int maxQueuedRequestsDevice_;\n \n private:\n \tvoid unlockMediaDevices();\n@@ -117,6 +119,8 @@ private:\n \tconst char *name_;\n \tunsigned int useCount_;\n \n+\tconst Options options_;\n+\n \tfriend class PipelineHandlerFactoryBase;\n };\n \ndiff --git a/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp b/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp\nindex d3f152aa1e..f995fa50d5 100644\n--- a/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp\n+++ b/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp\n@@ -612,7 +612,7 @@ CameraConfiguration::Status ISICameraConfiguration::validate()\n  */\n \n PipelineHandlerISI::PipelineHandlerISI(CameraManager *manager)\n-\t: PipelineHandler(manager)\n+\t: PipelineHandler(manager, {})\n {\n }\n \ndiff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp\nindex af1b79d708..7e22388d02 100644\n--- a/src/libcamera/pipeline/ipu3/ipu3.cpp\n+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp\n@@ -385,7 +385,7 @@ CameraConfiguration::Status IPU3CameraConfiguration::validate()\n }\n \n PipelineHandlerIPU3::PipelineHandlerIPU3(CameraManager *manager)\n-\t: PipelineHandler(manager), cio2MediaDev_(nullptr), imguMediaDev_(nullptr)\n+\t: PipelineHandler(manager, {}), cio2MediaDev_(nullptr), imguMediaDev_(nullptr)\n {\n }\n \ndiff --git a/src/libcamera/pipeline/mali-c55/mali-c55.cpp b/src/libcamera/pipeline/mali-c55/mali-c55.cpp\nindex 0c7b7ed370..114179f49d 100644\n--- a/src/libcamera/pipeline/mali-c55/mali-c55.cpp\n+++ b/src/libcamera/pipeline/mali-c55/mali-c55.cpp\n@@ -786,7 +786,8 @@ private:\n };\n \n PipelineHandlerMaliC55::PipelineHandlerMaliC55(CameraManager *manager)\n-\t: PipelineHandler(manager, kMaliC55BufferCount), dsFitted_(true)\n+\t: PipelineHandler(manager, { .maxQueuedRequestsDevice = kMaliC55BufferCount }),\n+\t  dsFitted_(true)\n {\n }\n \ndiff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\nindex 0c1e5767b4..2aa273d220 100644\n--- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n+++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n@@ -782,7 +782,8 @@ CameraConfiguration::Status RkISP1CameraConfiguration::validate()\n  */\n \n PipelineHandlerRkISP1::PipelineHandlerRkISP1(CameraManager *manager)\n-\t: PipelineHandler(manager, kRkISP1MaxQueuedRequests), hasSelfPath_(true)\n+\t: PipelineHandler(manager, { .maxQueuedRequestsDevice = kRkISP1MaxQueuedRequests }),\n+\t  hasSelfPath_(true)\n {\n }\n \ndiff --git a/src/libcamera/pipeline/rpi/common/pipeline_base.h b/src/libcamera/pipeline/rpi/common/pipeline_base.h\nindex 758155ee0d..1b16a6e6a5 100644\n--- a/src/libcamera/pipeline/rpi/common/pipeline_base.h\n+++ b/src/libcamera/pipeline/rpi/common/pipeline_base.h\n@@ -203,7 +203,7 @@ class PipelineHandlerBase : public PipelineHandler\n {\n public:\n \tPipelineHandlerBase(CameraManager *manager)\n-\t\t: PipelineHandler(manager)\n+\t\t: PipelineHandler(manager, {})\n \t{\n \t}\n \ndiff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp\nindex 381f8db3ee..2a4f03df72 100644\n--- a/src/libcamera/pipeline/simple/simple.cpp\n+++ b/src/libcamera/pipeline/simple/simple.cpp\n@@ -1402,7 +1402,7 @@ CameraConfiguration::Status SimpleCameraConfiguration::validate()\n  */\n \n SimplePipelineHandler::SimplePipelineHandler(CameraManager *manager)\n-\t: PipelineHandler(manager, kMaxQueuedRequestsDevice),\n+\t: PipelineHandler(manager, { .maxQueuedRequestsDevice = kMaxQueuedRequestsDevice }),\n \t  converter_(nullptr)\n {\n }\ndiff --git a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\nindex f8d49d9122..928ee79559 100644\n--- a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n+++ b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n@@ -230,7 +230,7 @@ CameraConfiguration::Status UVCCameraConfiguration::validate()\n }\n \n PipelineHandlerUVC::PipelineHandlerUVC(CameraManager *manager)\n-\t: PipelineHandler(manager)\n+\t: PipelineHandler(manager, {})\n {\n }\n \ndiff --git a/src/libcamera/pipeline/vimc/vimc.cpp b/src/libcamera/pipeline/vimc/vimc.cpp\nindex 528022776e..490f693da4 100644\n--- a/src/libcamera/pipeline/vimc/vimc.cpp\n+++ b/src/libcamera/pipeline/vimc/vimc.cpp\n@@ -196,7 +196,7 @@ CameraConfiguration::Status VimcCameraConfiguration::validate()\n }\n \n PipelineHandlerVimc::PipelineHandlerVimc(CameraManager *manager)\n-\t: PipelineHandler(manager)\n+\t: PipelineHandler(manager, {})\n {\n }\n \ndiff --git a/src/libcamera/pipeline/virtual/virtual.cpp b/src/libcamera/pipeline/virtual/virtual.cpp\nindex f9e2cecea3..011e31d9d5 100644\n--- a/src/libcamera/pipeline/virtual/virtual.cpp\n+++ b/src/libcamera/pipeline/virtual/virtual.cpp\n@@ -243,7 +243,7 @@ CameraConfiguration::Status VirtualCameraConfiguration::validate()\n bool PipelineHandlerVirtual::created_ = false;\n \n PipelineHandlerVirtual::PipelineHandlerVirtual(CameraManager *manager)\n-\t: PipelineHandler(manager),\n+\t: PipelineHandler(manager, {}),\n \t  dmaBufAllocator_(DmaBufAllocator::DmaBufAllocatorFlag::CmaHeap |\n \t\t\t   DmaBufAllocator::DmaBufAllocatorFlag::SystemHeap |\n \t\t\t   DmaBufAllocator::DmaBufAllocatorFlag::UDmaBuf)\ndiff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp\nindex 29a21a0d70..efea534649 100644\n--- a/src/libcamera/pipeline_handler.cpp\n+++ b/src/libcamera/pipeline_handler.cpp\n@@ -59,20 +59,37 @@ LOG_DEFINE_CATEGORY(Pipeline)\n  * PipelineHandler class where only the 'this' pointer is available.\n  */\n \n+/**\n+ * \\class PipelineHandler::Options\n+ * \\brief The collection of optional options of the base class\n+ */\n+\n+/**\n+ * \\var PipelineHandler::Options::maxQueuedRequestsDevice\n+ * \\brief The maximum number of requests the pipeline handler shall queue to the\n+ * device\n+ *\n+ * maxQueuedRequestsDevice limits the number of request that the\n+ * pipeline handler shall queue to the underlying hardware, in order to\n+ * saturate the pipeline with requests. The application may choose to queue\n+ * as many requests as it desires, however only maxQueuedRequestsDevice\n+ * requests will be queued to the hardware at a given point in time. The\n+ * remaining requests will be kept waiting in the internal waiting\n+ * queue, to be queued at a later stage.\n+ */\n+\n /**\n  * \\brief Construct a PipelineHandler instance\n  * \\param[in] manager The camera manager\n- * \\param[in] maxQueuedRequestsDevice The maximum number of requests queued to\n- * the device\n+ * \\param[in] options The options options for the pipeline handler base class\n  *\n  * In order to honour the std::enable_shared_from_this<> contract,\n  * PipelineHandler instances shall never be constructed manually, but always\n  * through the PipelineHandlerFactoryBase::create() function.\n  */\n PipelineHandler::PipelineHandler(CameraManager *manager,\n-\t\t\t\t unsigned int maxQueuedRequestsDevice)\n-\t: manager_(manager), maxQueuedRequestsDevice_(maxQueuedRequestsDevice),\n-\t  useCount_(0)\n+\t\t\t\t const Options &options)\n+\t: manager_(manager), useCount_(0), options_(options)\n {\n }\n \n@@ -453,7 +470,7 @@ bool PipelineHandler::hasPendingRequests(const Camera *camera) const\n  * queued to the pipeline handler.\n  *\n  * The queue of waiting requests is iterated and up to \\a\n- * maxQueuedRequestsDevice_ prepared requests are passed to the pipeline handler\n+ * maxQueuedRequestsDevice prepared requests are passed to the pipeline handler\n  * in the same order they have been queued by calling this function.\n  *\n  * If a Request fails during the preparation phase or if the pipeline handler\n@@ -509,7 +526,7 @@ void PipelineHandler::doQueueRequests(Camera *camera)\n {\n \tCamera::Private *data = camera->_d();\n \twhile (!data->waitingRequests_.empty()) {\n-\t\tif (data->queuedRequests_.size() == maxQueuedRequestsDevice_)\n+\t\tif (data->queuedRequests_.size() == options_.maxQueuedRequestsDevice)\n \t\t\tbreak;\n \n \t\tRequest *request = data->waitingRequests_.front();\n@@ -862,20 +879,6 @@ void PipelineHandler::disconnect()\n  * constant for the whole lifetime of the pipeline handler.\n  */\n \n-/**\n- * \\var PipelineHandler::maxQueuedRequestsDevice_\n- * \\brief The maximum number of requests the pipeline handler shall queue to the\n- * device\n- *\n- * maxQueuedRequestsDevice_ limits the number of request that the\n- * pipeline handler shall queue to the underlying hardware, in order to\n- * saturate the pipeline with requests. The application may choose to queue\n- * as many requests as it desires, however only maxQueuedRequestsDevice_\n- * requests will be queued to the hardware at a given point in time. The\n- * remaining requests will be kept waiting in the internal waiting\n- * queue, to be queued at a later stage.\n- */\n-\n /**\n  * \\fn PipelineHandler::name()\n  * \\brief Retrieve the pipeline handler name\n",
    "prefixes": [
        "RFC",
        "v1",
        "27/54"
    ]
}