Show a patch.

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

{
    "id": 26858,
    "url": "https://patchwork.libcamera.org/api/1.1/patches/26858/?format=api",
    "web_url": "https://patchwork.libcamera.org/patch/26858/",
    "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": "<20260608150349.134371-16-mzamazal@redhat.com>",
    "date": "2026-06-08T15:03:44",
    "name": "[RFC,v4,15/17] libcamera: software_isp: Track statistics buffers",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "a23126a84f65b309937713f2cd608bed5b6c254a",
    "submitter": {
        "id": 177,
        "url": "https://patchwork.libcamera.org/api/1.1/people/177/?format=api",
        "name": "Milan Zamazal",
        "email": "mzamazal@redhat.com"
    },
    "delegate": null,
    "mbox": "https://patchwork.libcamera.org/patch/26858/mbox/",
    "series": [
        {
            "id": 5982,
            "url": "https://patchwork.libcamera.org/api/1.1/series/5982/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=5982",
            "date": "2026-06-08T15:03:29",
            "name": "Software ISP: Share params and stats buffers",
            "version": 4,
            "mbox": "https://patchwork.libcamera.org/series/5982/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/patches/26858/comments/",
    "check": "pending",
    "checks": "https://patchwork.libcamera.org/api/patches/26858/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 ADAD9C328C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon,  8 Jun 2026 15:04:42 +0000 (UTC)",
            "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 668F861F2B;\n\tMon,  8 Jun 2026 17:04:42 +0200 (CEST)",
            "from us-smtp-delivery-124.mimecast.com\n\t(us-smtp-delivery-124.mimecast.com [170.10.133.124])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id CC8AE61F00\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon,  8 Jun 2026 17:04:40 +0200 (CEST)",
            "from mx-prod-mc-03.mail-002.prod.us-west-2.aws.redhat.com\n\t(ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63])\n\tby relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3,\n\tcipher=TLS_AES_256_GCM_SHA384) id us-mta-64-fhUOWtPbM7msSJ-ckZ2T-A-1;\n\tMon, 08 Jun 2026 11:04:35 -0400",
            "from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com\n\t(mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com\n\t[10.30.177.111])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\tkey-exchange X25519 server-signature RSA-PSS (2048 bits)\n\tserver-digest SHA256) (No client certificate requested)\n\tby mx-prod-mc-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix)\n\twith ESMTPS id 2ADB81956060; Mon,  8 Jun 2026 15:04:34 +0000 (UTC)",
            "from mzamazal-thinkpadp1gen7.tpbc.com (unknown [10.44.48.51])\n\tby mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix)\n\twith ESMTP id 199E51800361; Mon,  8 Jun 2026 15:04:31 +0000 (UTC)"
        ],
        "Authentication-Results": "lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=redhat.com header.i=@redhat.com\n\theader.b=\"KNzLYBwn\"; dkim-atps=neutral",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1780931079;\n\th=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n\tto:to:cc:cc:mime-version:mime-version:content-type:content-type:\n\tcontent-transfer-encoding:content-transfer-encoding:\n\tin-reply-to:in-reply-to:references:references;\n\tbh=m+olcwCj5Ulh/lBxoFrBk2sY2gZlONais/vMZvoQpzI=;\n\tb=KNzLYBwnhb1SJGDZrhVcKZR8mwdgPAnfe1aWLrzBZwUf3/JW87wgfJL54TV/95cvEAaUB6\n\tjAz0HpW1yDbJxoXWUQkNH/knEvKbDEH/09Mh9BOiLpSM5QC5q2iEDUWOhuE8UqMtSK4HzG\n\tOhtQYjtznDFGBQhz2GgSNgux+MuKmDo=",
        "X-MC-Unique": "fhUOWtPbM7msSJ-ckZ2T-A-1",
        "X-Mimecast-MFC-AGG-ID": "fhUOWtPbM7msSJ-ckZ2T-A_1780931074",
        "From": "Milan Zamazal <mzamazal@redhat.com>",
        "To": "libcamera-devel@lists.libcamera.org",
        "Cc": "Milan Zamazal <mzamazal@redhat.com>, Kieran Bingham\n\t<kieran.bingham@ideasonboard.com>, =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?=\n\t<barnabas.pocze@ideasonboard.com>,  johannes.goede@oss.qualcomm.com",
        "Subject": "[RFC PATCH v4 15/17] libcamera: software_isp: Track statistics\n\tbuffers",
        "Date": "Mon,  8 Jun 2026 17:03:44 +0200",
        "Message-ID": "<20260608150349.134371-16-mzamazal@redhat.com>",
        "In-Reply-To": "<20260608150349.134371-1-mzamazal@redhat.com>",
        "References": "<20260608150349.134371-1-mzamazal@redhat.com>",
        "MIME-Version": "1.0",
        "X-Scanned-By": "MIMEDefang 3.4.1 on 10.30.177.111",
        "X-Mimecast-Spam-Score": "0",
        "X-Mimecast-MFC-PROC-ID": "lCiaCTHW3Rgud8tl8nFKjE6lEeSqI-pqzNQSO67aUAE_1780931074",
        "X-Mimecast-Originator": "redhat.com",
        "Content-Transfer-Encoding": "8bit",
        "content-type": "text/plain; charset=\"US-ASCII\"; x-default=true",
        "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": "As a preparation for passing the shared statistics buffers to IPA, this\npatch introduces tracking statistics buffer ids.\n\nSofwareIsp::availableStats_ is a vector of ids of the buffers available\nfor use.  When a fresh statistics buffer is needed, its id is retrieved\nfrom there and once the buffer is no longer needed, it's put back there,\nin a method invoked by a signal.  This is similar to what the hardware\npipelines do.\n\nWe use buffers' file descriptors as buffer ids.  The statistics buffers\nwill be shared with the IPA, SwIspStats and debayering and we need their\ncommon identification everywhere.  The buffer file descriptors are\nshared unchanged so they can be used for the purpose, avoiding a need to\npass a special mapping to the IPA and debayering on initialization.\n\nNote that the statistics buffer id is still actually unused, this will\nbe changed once the buffers are shared with the IPA.\n\nSigned-off-by: Milan Zamazal <mzamazal@redhat.com>\n---\n .../libcamera/internal/software_isp/software_isp.h |  1 +\n src/libcamera/software_isp/debayer_egl.cpp         |  4 ++--\n src/libcamera/software_isp/software_isp.cpp        | 14 +++++++++++---\n 3 files changed, 14 insertions(+), 5 deletions(-)",
    "diff": "diff --git a/include/libcamera/internal/software_isp/software_isp.h b/include/libcamera/internal/software_isp/software_isp.h\nindex 451596163..24eeaeb86 100644\n--- a/include/libcamera/internal/software_isp/software_isp.h\n+++ b/include/libcamera/internal/software_isp/software_isp.h\n@@ -105,6 +105,7 @@ private:\n \tThread ispWorkerThread_;\n \tstd::map<uint32_t, SharedMemObject<DebayerParams>> sharedParams_;\n \tstd::vector<uint32_t> availableParams_;\n+\tstd::vector<uint32_t> availableStats_;\n \tDmaBufAllocator dmaHeap_;\n \tbool ccmEnabled_;\n \ndiff --git a/src/libcamera/software_isp/debayer_egl.cpp b/src/libcamera/software_isp/debayer_egl.cpp\nindex aacaaa66e..f5a74637d 100644\n--- a/src/libcamera/software_isp/debayer_egl.cpp\n+++ b/src/libcamera/software_isp/debayer_egl.cpp\n@@ -559,7 +559,7 @@ int DebayerEGL::debayerGPU(FrameBuffer *input, FrameBuffer *output, const Debaye\n }\n \n void DebayerEGL::process(uint32_t frame,\n-\t\t\t [[maybe_unused]] const uint32_t statsBufferId,\n+\t\t\t const uint32_t statsBufferId,\n \t\t\t const uint32_t paramsBufferId,\n \t\t\t FrameBuffer *input,\n \t\t\t FrameBuffer *output)\n@@ -599,7 +599,7 @@ void DebayerEGL::process(uint32_t frame,\n \t\t\tinDmaSyncer.emplace(input->planes()[0].fd, DmaSyncer::SyncType::Read);\n \t\t\tinMapped.emplace(input, MappedFrameBuffer::MapFlag::Read);\n \t\t}\n-\t\tstats_->processFrame(frame, 0, inMapped.value());\n+\t\tstats_->processFrame(frame, statsBufferId, inMapped.value());\n \t}\n \tinDmaSyncer.reset();\n \ndiff --git a/src/libcamera/software_isp/software_isp.cpp b/src/libcamera/software_isp/software_isp.cpp\nindex c4da647e8..2a019e6bc 100644\n--- a/src/libcamera/software_isp/software_isp.cpp\n+++ b/src/libcamera/software_isp/software_isp.cpp\n@@ -225,6 +225,7 @@ std::unique_ptr<SwStatsCpu> SoftwareIsp::allocateStatsBuffers(\n \n \t\tfdStats[bufferId] = shared.fd();\n \t\tsharedStats->emplace(bufferId, std::move(shared));\n+\t\tavailableStats_.push_back(bufferId);\n \t}\n \n \tauto stats = std::make_unique<SwStatsCpu>(cm, std::move(sharedStats));\n@@ -463,7 +464,8 @@ void SoftwareIsp::stop()\n  * \\param[in] frame The frame number\n  * \\param[in] input The input framebuffer\n  * \\param[out] output The framebuffer to write the processed frame to\n- * \\return 0 on success, -EAGAIN if a parameter buffer underrun occurs\n+ * \\return 0 on success, -EAGAIN if a parameter or statistics buffer underrun\n+ *   occurs\n  */\n int SoftwareIsp::process(uint32_t frame, FrameBuffer *input, FrameBuffer *output)\n {\n@@ -471,11 +473,16 @@ int SoftwareIsp::process(uint32_t frame, FrameBuffer *input, FrameBuffer *output\n \t\tLOG(SoftwareIsp, Error) << \"Parameters buffer underrun\";\n \t\treturn -EAGAIN;\n \t}\n+\tif (availableStats_.empty()) {\n+\t\tLOG(SoftwareIsp, Error) << \"Statistics buffer underrun\";\n+\t\treturn -EAGAIN;\n+\t}\n \n \tconst uint32_t paramsBufferId = availableParams_.back();\n \tavailableParams_.pop_back();\n+\tconst uint32_t statsBufferId = availableStats_.back();\n+\tavailableStats_.pop_back();\n \tipa_->computeParams(frame, paramsBufferId);\n-\tconst uint32_t statsBufferId = 0;\n \tdebayer_->invokeMethod(&Debayer::process,\n \t\t\t       ConnectionTypeQueued, frame,\n \t\t\t       statsBufferId, paramsBufferId, input, output);\n@@ -498,8 +505,9 @@ void SoftwareIsp::statsReady(uint32_t frame, const uint32_t statsBufferId)\n \tispStatsReady.emit(frame, statsBufferId);\n }\n \n-void SoftwareIsp::statsProcessed([[maybe_unused]] const uint32_t statsBufferId)\n+void SoftwareIsp::statsProcessed(const uint32_t statsBufferId)\n {\n+\tavailableStats_.push_back(statsBufferId);\n }\n \n void SoftwareIsp::inputReady(FrameBuffer *input)\n",
    "prefixes": [
        "RFC",
        "v4",
        "15/17"
    ]
}