Show a patch.

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

{
    "id": 20878,
    "url": "https://patchwork.libcamera.org/api/1.1/patches/20878/?format=api",
    "web_url": "https://patchwork.libcamera.org/patch/20878/",
    "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": "<20240812115009.946036-5-mzamazal@redhat.com>",
    "date": "2024-08-12T11:49:53",
    "name": "[04/16] libcamera: software_isp: Track unused parameters buffers",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "a6f3dcb494a8d9867e1286d4c0428d70472a32f7",
    "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/20878/mbox/",
    "series": [
        {
            "id": 4511,
            "url": "https://patchwork.libcamera.org/api/1.1/series/4511/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=4511",
            "date": "2024-08-12T11:49:49",
            "name": "Software ISP: Share params and stats buffers",
            "version": 1,
            "mbox": "https://patchwork.libcamera.org/series/4511/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/patches/20878/comments/",
    "check": "pending",
    "checks": "https://patchwork.libcamera.org/api/patches/20878/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 984A7C323E\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 12 Aug 2024 11:50:33 +0000 (UTC)",
            "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 19B53633C8;\n\tMon, 12 Aug 2024 13:50:33 +0200 (CEST)",
            "from us-smtp-delivery-124.mimecast.com\n\t(us-smtp-delivery-124.mimecast.com [170.10.129.124])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 455A9633C3\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 12 Aug 2024 13:50:29 +0200 (CEST)",
            "from mx-prod-mc-05.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-357-lTtgKFUMMMm7NSo5x9L-jw-1;\n\tMon, 12 Aug 2024 07:50:26 -0400",
            "from mx-prod-int-02.mail-002.prod.us-west-2.aws.redhat.com\n\t(mx-prod-int-02.mail-002.prod.us-west-2.aws.redhat.com\n\t[10.30.177.15])\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-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix)\n\twith ESMTPS\n\tid 05A421955D5A for <libcamera-devel@lists.libcamera.org>;\n\tMon, 12 Aug 2024 11:50:26 +0000 (UTC)",
            "from nuthatch.redhat.com (unknown [10.45.225.57])\n\tby mx-prod-int-02.mail-002.prod.us-west-2.aws.redhat.com (Postfix)\n\twith ESMTP id D022219772C4; Mon, 12 Aug 2024 11:50:24 +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=\"FXfaqRP1\"; dkim-atps=neutral",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1723463428;\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=CPqZkoFnoMEU874j+kZXP8wCNZx/M3NBdrBgOYAhvVY=;\n\tb=FXfaqRP1f59yHhasvaV9m7hUOj1saFIzUpPC/MZRwZXxFYvay6jOF6rdvPn3tzlRhWDESc\n\t8vB6nz6mk/oZVwvQNDZJmb4t246VGEuiA7Ztva5qmtmect7fZMUPAjtqbCxfcGA91tTB6+\n\tY11c5ztDKfNTSGagmk79kR+/8M2kmmo=",
        "X-MC-Unique": "lTtgKFUMMMm7NSo5x9L-jw-1",
        "From": "Milan Zamazal <mzamazal@redhat.com>",
        "To": "libcamera-devel@lists.libcamera.org",
        "Cc": "Milan Zamazal <mzamazal@redhat.com>",
        "Subject": "[PATCH 04/16] libcamera: software_isp: Track unused parameters\n\tbuffers",
        "Date": "Mon, 12 Aug 2024 13:49:53 +0200",
        "Message-ID": "<20240812115009.946036-5-mzamazal@redhat.com>",
        "In-Reply-To": "<20240812115009.946036-1-mzamazal@redhat.com>",
        "References": "<20240812115009.946036-1-mzamazal@redhat.com>",
        "MIME-Version": "1.0",
        "X-Scanned-By": "MIMEDefang 3.0 on 10.30.177.15",
        "X-Mimecast-Spam-Score": "0",
        "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 introducing a ring of parameters buffers, this\npatch introduces tracking of parameters buffers available for use.\n\nSofwareIsp::availableParams_ is a queue of ids of the buffers available\nfor use.  When a fresh parameter 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\nIf a parameters buffer is requested but there is no free available, it\nis an erroneous situation.  To recover from it, we have currently no\nbetter mechanism than to wait for an available buffer.  Simply returning\nfrom the processing would mean the finishing signals are not called,\nresulting in e.g. the input buffer not being returned.  This is\ndifferent from the hardware pipelines, which are structured somewhat\ndifferently.\n\nWe use buffers' file descriptors as buffer ids.  The parameters buffers\nwill be shared with the IPA and debayering and we need their common\nidentification everywhere.  The buffer file descriptors are shared\nunchanged so they can be used for the purpose, avoiding a need to pass a\nspecial id->buffer mapping to the IPA and debayering on initialization.\n\nNote that the parameters buffer id is still actually unused and the only\nbuffer currently used is still copied when passed to debayering.  This\npatch is just preparation for followup patches that will introduce\nmultiple buffers.\n\nSigned-off-by: Milan Zamazal <mzamazal@redhat.com>\n---\n .../internal/software_isp/software_isp.h       |  2 ++\n src/libcamera/software_isp/software_isp.cpp    | 18 +++++++++++++++---\n 2 files changed, 17 insertions(+), 3 deletions(-)",
    "diff": "diff --git a/include/libcamera/internal/software_isp/software_isp.h b/include/libcamera/internal/software_isp/software_isp.h\nindex fc9200dd..74f5b952 100644\n--- a/include/libcamera/internal/software_isp/software_isp.h\n+++ b/include/libcamera/internal/software_isp/software_isp.h\n@@ -10,6 +10,7 @@\n #include <functional>\n #include <map>\n #include <memory>\n+#include <queue>\n #include <stdint.h>\n #include <string>\n #include <tuple>\n@@ -95,6 +96,7 @@ private:\n \tThread ispWorkerThread_;\n \tSharedMemObject<DebayerParams> sharedParams_;\n \tDebayerParams debayerParams_;\n+\tstd::queue<uint32_t> availableParams_;\n \tbool allocateParamsBuffers();\n \tDmaBufAllocator dmaHeap_;\n \ndiff --git a/src/libcamera/software_isp/software_isp.cpp b/src/libcamera/software_isp/software_isp.cpp\nindex 3f41b71d..a9865398 100644\n--- a/src/libcamera/software_isp/software_isp.cpp\n+++ b/src/libcamera/software_isp/software_isp.cpp\n@@ -149,6 +149,10 @@ bool SoftwareIsp::allocateParamsBuffers()\n \t\treturn false;\n \t}\n \n+\tASSERT(sharedParams_.fd().get() >= 0);\n+\tconst uint32_t bufferId = sharedParams_.fd().get();\n+\tavailableParams_.push(bufferId);\n+\n \treturn true;\n }\n \n@@ -360,8 +364,15 @@ void SoftwareIsp::stop()\n  */\n void SoftwareIsp::process(uint32_t frame, FrameBuffer *input, FrameBuffer *output)\n {\n-\t/* \\todo Provide a real value */\n-\tconstexpr uint32_t paramsBufferId = 0;\n+\tif (availableParams_.empty()) {\n+\t\tLOG(SoftwareIsp, Error) << \"Parameters buffer underrun\";\n+\t\t/* Well, busy loop, but this situation shouldn't normally happen. */\n+\t\twhile (availableParams_.empty())\n+\t\t\t;\n+\t}\n+\n+\tconst uint32_t paramsBufferId = availableParams_.front();\n+\tavailableParams_.pop();\n \tipa_->prepare(frame, paramsBufferId);\n \tdebayer_->invokeMethod(&DebayerCpu::process,\n \t\t\t       ConnectionTypeQueued, frame, paramsBufferId, input, output, debayerParams_);\n@@ -372,8 +383,9 @@ void SoftwareIsp::saveIspParams([[maybe_unused]] uint32_t paramsBufferId)\n \tdebayerParams_ = *sharedParams_;\n }\n \n-void SoftwareIsp::releaseIspParams([[maybe_unused]] uint32_t paramsBufferId)\n+void SoftwareIsp::releaseIspParams(uint32_t paramsBufferId)\n {\n+\tavailableParams_.push(paramsBufferId);\n }\n \n void SoftwareIsp::setSensorCtrls(const ControlList &sensorControls)\n",
    "prefixes": [
        "04/16"
    ]
}