Show a patch.

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

{
    "id": 26976,
    "url": "https://patchwork.libcamera.org/api/patches/26976/?format=api",
    "web_url": "https://patchwork.libcamera.org/patch/26976/",
    "project": {
        "id": 1,
        "url": "https://patchwork.libcamera.org/api/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": "<20260618123844.656396-13-barnabas.pocze@ideasonboard.com>",
    "date": "2026-06-18T12:38:29",
    "name": "[RFC,v1,12/27] libcamera: pipeline: rpi: Remove `requestQueue_`",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "a94e9403889f6b53300435ad4bc678deadbdb908",
    "submitter": {
        "id": 216,
        "url": "https://patchwork.libcamera.org/api/people/216/?format=api",
        "name": "Barnabás Pőcze",
        "email": "barnabas.pocze@ideasonboard.com"
    },
    "delegate": null,
    "mbox": "https://patchwork.libcamera.org/patch/26976/mbox/",
    "series": [
        {
            "id": 6006,
            "url": "https://patchwork.libcamera.org/api/series/6006/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=6006",
            "date": "2026-06-18T12:38:17",
            "name": "Misc. changes before request-buffer split",
            "version": 1,
            "mbox": "https://patchwork.libcamera.org/series/6006/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/patches/26976/comments/",
    "check": "pending",
    "checks": "https://patchwork.libcamera.org/api/patches/26976/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 180F3C3307\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 18 Jun 2026 12:39:18 +0000 (UTC)",
            "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 2890065713;\n\tThu, 18 Jun 2026 14:39:12 +0200 (CEST)",
            "from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id BE74B629E0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 18 Jun 2026 14:38:50 +0200 (CEST)",
            "from pb-laptop.local (185.182.214.63.nat.pool.zt.hu\n\t[185.182.214.63])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id DAED6DF3\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 18 Jun 2026 14:38:15 +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=\"L1xyu23F\"; dkim-atps=neutral",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1781786295;\n\tbh=oy05+rxbDZ7R2o7AbVBp2jD7UhTXB1amh2TQyRbO8Gc=;\n\th=From:To:Subject:Date:In-Reply-To:References:From;\n\tb=L1xyu23F7DSD93vAS7gsltbvUJStU8nsKQFhLCtB2AaiZTw/a3B1Dj4E2Pmns8BrY\n\t1elEXKb/iQPKUxIqo3C5FnE+kFSPkw4vYCvzqwLEEunOgo75V5lmlITv7C0PXmGsaS\n\twkWHRIgR/Vx8xKq4bMJh+eKRqZEPSMRwB6sEfDyU=",
        "From": "=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>",
        "To": "libcamera-devel@lists.libcamera.org",
        "Subject": "[RFC PATCH v1 12/27] libcamera: pipeline: rpi: Remove\n\t`requestQueue_`",
        "Date": "Thu, 18 Jun 2026 14:38:29 +0200",
        "Message-ID": "<20260618123844.656396-13-barnabas.pocze@ideasonboard.com>",
        "X-Mailer": "git-send-email 2.54.0",
        "In-Reply-To": "<20260618123844.656396-1-barnabas.pocze@ideasonboard.com>",
        "References": "<20260618123844.656396-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": "The pipeline handler base class already tracks the queued requests of a camera\nin the `Camera::Private` type, so there is no reason to have another queue\nin the derived camera type that does the same. So remove it.\n\nThe only significant difference is that if `queueRequestDevice()` fails, the\nrequest can still stay in `queuedRequests_` if there were successfully queued\nrequests before it. This, however, does not cause issues as only the oldest\nqueued request is accessed in the rpi pipeline handler, and that cannot be a\ncancelled request (it would have already been completed).\n\nSigned-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>\n---\n .../pipeline/rpi/common/pipeline_base.cpp       | 17 ++++++-----------\n .../pipeline/rpi/common/pipeline_base.h         |  2 --\n src/libcamera/pipeline/rpi/pisp/pisp.cpp        |  6 +++---\n src/libcamera/pipeline/rpi/vc4/vc4.cpp          |  6 +++---\n 4 files changed, 12 insertions(+), 19 deletions(-)",
    "diff": "diff --git a/src/libcamera/pipeline/rpi/common/pipeline_base.cpp b/src/libcamera/pipeline/rpi/common/pipeline_base.cpp\nindex 6a6be5c820..efe06c6807 100644\n--- a/src/libcamera/pipeline/rpi/common/pipeline_base.cpp\n+++ b/src/libcamera/pipeline/rpi/common/pipeline_base.cpp\n@@ -786,8 +786,6 @@ int PipelineHandlerBase::queueRequestDevice(Camera *camera, Request *request)\n \t\t\treturn ret;\n \t}\n \n-\t/* Push the request to the back of the queue. */\n-\tdata->requestQueue_.push(request);\n \tdata->handleState();\n \n \treturn 0;\n@@ -1241,7 +1239,7 @@ void CameraData::metadataReady(const ControlList &metadata)\n \n \t/* Add to the Request metadata buffer what the IPA has provided. */\n \t/* Last thing to do is to fill up the request metadata. */\n-\tRequest *request = requestQueue_.front();\n+\tRequest *request = queuedRequests_.front();\n \trequest->_d()->metadata().merge(metadata);\n \n \t/*\n@@ -1400,10 +1398,8 @@ void CameraData::clearIncompleteRequests()\n \t * All outstanding requests (and associated buffers) must be returned\n \t * back to the application.\n \t */\n-\twhile (!requestQueue_.empty()) {\n-\t\tpipe()->cancelRequest(requestQueue_.front());\n-\t\trequestQueue_.pop();\n-\t}\n+\twhile (!queuedRequests_.empty())\n+\t\tpipe()->cancelRequest(queuedRequests_.front());\n }\n \n void CameraData::handleStreamBuffer(FrameBuffer *buffer, RPi::Stream *stream)\n@@ -1413,7 +1409,7 @@ void CameraData::handleStreamBuffer(FrameBuffer *buffer, RPi::Stream *stream)\n \t * that we actually have one to action, otherwise we just return\n \t * buffer back to the stream.\n \t */\n-\tRequest *request = requestQueue_.empty() ? nullptr : requestQueue_.front();\n+\tRequest *request = queuedRequests_.empty() ? nullptr : queuedRequests_.front();\n \tif (request && request->findBuffer(stream) == buffer) {\n \t\tFrameMetadata &md = buffer->_d()->metadata();\n \n@@ -1468,7 +1464,7 @@ void CameraData::handleState()\n \n void CameraData::checkRequestCompleted()\n {\n-\tRequest *request = requestQueue_.front();\n+\tRequest *request = queuedRequests_.front();\n \tif (request->hasPendingBuffers())\n \t\treturn;\n \n@@ -1480,7 +1476,6 @@ void CameraData::checkRequestCompleted()\n \t\t\t<< request->sequence();\n \n \tpipe()->completeRequest(request);\n-\trequestQueue_.pop();\n \n \tLOG(RPI, Debug) << \"Going into Idle state\";\n \tstate_ = State::Idle;\n@@ -1536,7 +1531,7 @@ void CameraData::handleControlLists(uint32_t delayContext, ControlList &paramCon\n \t * in the metadata, being the sequence number of the request whose ControlList\n \t * has just been applied.\n \t */\n-\tRequest *request = requestQueue_.front();\n+\tRequest *request = queuedRequests_.front();\n \trequest->_d()->metadata().set(controls::rpi::ControlListSequence, delayContext);\n \n \t/*\ndiff --git a/src/libcamera/pipeline/rpi/common/pipeline_base.h b/src/libcamera/pipeline/rpi/common/pipeline_base.h\nindex 758155ee0d..4a8a769fd8 100644\n--- a/src/libcamera/pipeline/rpi/common/pipeline_base.h\n+++ b/src/libcamera/pipeline/rpi/common/pipeline_base.h\n@@ -129,8 +129,6 @@ public:\n \t\treturn state_ != State::Stopped && state_ != State::Error;\n \t}\n \n-\tstd::queue<Request *> requestQueue_;\n-\n \t/* For handling digital zoom. */\n \tIPACameraSensorInfo sensorInfo_;\n \ndiff --git a/src/libcamera/pipeline/rpi/pisp/pisp.cpp b/src/libcamera/pipeline/rpi/pisp/pisp.cpp\nindex b744c901f7..ef34be8338 100644\n--- a/src/libcamera/pipeline/rpi/pisp/pisp.cpp\n+++ b/src/libcamera/pipeline/rpi/pisp/pisp.cpp\n@@ -2308,13 +2308,13 @@ void PiSPCameraData::prepareBe(uint32_t bufferId, bool stitchSwapBuffers)\n void PiSPCameraData::tryRunPipeline()\n {\n \t/* If any of our request or buffer queues are empty, we cannot proceed. */\n-\tif (state_ != State::Idle || requestQueue_.empty() || !cfeJobComplete())\n+\tif (state_ != State::Idle || queuedRequests_.empty() || !cfeJobComplete())\n \t\treturn;\n \n \tCfeJob &job = cfeJobQueue_.front();\n \n \t/* Take the first request from the queue and action the IPA. */\n-\tRequest *request = requestQueue_.front();\n+\tRequest *request = queuedRequests_.front();\n \tASSERT(request->metadata().empty());\n \n \t/* See if a new ScalerCrop value needs to be applied. */\n@@ -2335,7 +2335,7 @@ void PiSPCameraData::tryRunPipeline()\n \tparams.buffers.bayer = RPi::MaskBayerData | bayerId;\n \tparams.buffers.stats = RPi::MaskStats | statsId;\n \tparams.buffers.embedded = 0;\n-\tparams.ipaContext = requestQueue_.front()->sequence();\n+\tparams.ipaContext = request->sequence();\n \tparams.delayContext = job.delayContext;\n \tparams.sensorControls = std::move(job.sensorControls);\n \t/* params.requestControls is set by handleControlLists. */\ndiff --git a/src/libcamera/pipeline/rpi/vc4/vc4.cpp b/src/libcamera/pipeline/rpi/vc4/vc4.cpp\nindex 3e9a490589..4c159527be 100644\n--- a/src/libcamera/pipeline/rpi/vc4/vc4.cpp\n+++ b/src/libcamera/pipeline/rpi/vc4/vc4.cpp\n@@ -839,7 +839,7 @@ void Vc4CameraData::ispOutputDequeue(FrameBuffer *buffer)\n \tif (stream == &isp_[Isp::Stats]) {\n \t\tipa::RPi::ProcessParams params;\n \t\tparams.buffers.stats = index | RPi::MaskStats;\n-\t\tparams.ipaContext = requestQueue_.front()->sequence();\n+\t\tparams.ipaContext = queuedRequests_.front()->sequence();\n \t\tipa_->processStats(params);\n \t} else {\n \t\t/* Any other ISP output can be handed back to the application now. */\n@@ -923,7 +923,7 @@ void Vc4CameraData::tryRunPipeline()\n \tBayerFrame bayerFrame;\n \n \t/* If any of our request or buffer queues are empty, we cannot proceed. */\n-\tif (state_ != State::Idle || requestQueue_.empty() ||\n+\tif (state_ != State::Idle || queuedRequests_.empty() ||\n \t    bayerQueue_.empty() || (embeddedQueue_.empty() && sensorMetadata_))\n \t\treturn;\n \n@@ -931,7 +931,7 @@ void Vc4CameraData::tryRunPipeline()\n \t\treturn;\n \n \t/* Take the first request from the queue and action the IPA. */\n-\tRequest *request = requestQueue_.front();\n+\tRequest *request = queuedRequests_.front();\n \tASSERT(request->metadata().empty());\n \n \t/* See if a new ScalerCrop value needs to be applied. */\n",
    "prefixes": [
        "RFC",
        "v1",
        "12/27"
    ]
}