Show a patch.

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

{
    "id": 26353,
    "url": "https://patchwork.libcamera.org/api/patches/26353/?format=api",
    "web_url": "https://patchwork.libcamera.org/patch/26353/",
    "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": "<20260325151416.2114564-12-stefan.klug@ideasonboard.com>",
    "date": "2026-03-25T15:13:43",
    "name": "[v2,11/32] ipa: rkisp1: Move setSensorControls signal to computeParams",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "16d3640fe6d63d98216b13a82bdbc8d26829bf64",
    "submitter": {
        "id": 184,
        "url": "https://patchwork.libcamera.org/api/people/184/?format=api",
        "name": "Stefan Klug",
        "email": "stefan.klug@ideasonboard.com"
    },
    "delegate": null,
    "mbox": "https://patchwork.libcamera.org/patch/26353/mbox/",
    "series": [
        {
            "id": 5849,
            "url": "https://patchwork.libcamera.org/api/series/5849/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=5849",
            "date": "2026-03-25T15:13:32",
            "name": "rkisp1: pipeline rework for PFC",
            "version": 2,
            "mbox": "https://patchwork.libcamera.org/series/5849/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/patches/26353/comments/",
    "check": "pending",
    "checks": "https://patchwork.libcamera.org/api/patches/26353/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 CFBA3C32DE\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 25 Mar 2026 15:15:13 +0000 (UTC)",
            "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 86CD062854;\n\tWed, 25 Mar 2026 16:15:13 +0100 (CET)",
            "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 34DBB62854\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 25 Mar 2026 16:15:12 +0100 (CET)",
            "from ideasonboard.com (unknown\n\t[IPv6:2a00:6020:448c:6c00:b16a:5ed9:4ada:a95a])\n\tby perceval.ideasonboard.com (Postfix) with UTF8SMTPSA id 42D3512BB; \n\tWed, 25 Mar 2026 16:13:54 +0100 (CET)"
        ],
        "Authentication-Results": "lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"U7o2P0YW\"; dkim-atps=neutral",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1774451634;\n\tbh=frnossdUElVa3lOkrWeRsZUq7113G56zV2qRkDwG0Wk=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=U7o2P0YWEOxDog4YQJ63Mdw549zPp9DvL2Rsa13vwj+6kM4xVMVEaZDClnHBNm4DR\n\tEs4o4yqG/eenmVbet2jQ7MlxtZ6c19+jv2metJMxUd3+6ltoseZzjJ+iGqv0nK8p3G\n\tllDjEvGeeWHKWrVxPB/ofqvBos75dmw5fdLcB1vE=",
        "From": "Stefan Klug <stefan.klug@ideasonboard.com>",
        "To": "libcamera-devel@lists.libcamera.org",
        "Cc": "Stefan Klug <stefan.klug@ideasonboard.com>,\n\tPaul Elder <paul.elder@ideasonboard.com>",
        "Subject": "[PATCH v2 11/32] ipa: rkisp1: Move setSensorControls signal to\n\tcomputeParams",
        "Date": "Wed, 25 Mar 2026 16:13:43 +0100",
        "Message-ID": "<20260325151416.2114564-12-stefan.klug@ideasonboard.com>",
        "X-Mailer": "git-send-email 2.51.0",
        "In-Reply-To": "<20260325151416.2114564-1-stefan.klug@ideasonboard.com>",
        "References": "<20260325151416.2114564-1-stefan.klug@ideasonboard.com>",
        "MIME-Version": "1.0",
        "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 setSensorControls event is emitted in the processStats() function.\nOn first sight this looks reasonable as in processStats() we got the\nlatest statistics and can therefore calculate the most up to date sensor\ncontrols.\n\nIn the light of per-frame-controls however it produces difficult to\nsolve timing issues:\n\n- The frame context in processStats() is the frame context of the frame\n  that produced the stats, not for the frame that should be prepared and\nsent to the sensor.\n\n- To synchronize digital gain applied in the ISP with the analog gain\n  applied in the sensor the set of parameters prepared for sensor and\nISP must also be synchronized, which is not the case.\n\nTo fix that, move the calculation and setting of sensor controls into\nthe computeParams(). This way the model is far more easy to understand.\n\nWe loose a tiny option for optimizations in that (in theory) we could\ndelay the calculation of ISP parameters by another frame (assuming the\nsensor has a typical 2-frame delay). But all discussions and tests\nshowed that keeping all parameters in sync is more important than that\npossible optimization for one frame.\n\nSigned-off-by: Stefan Klug <stefan.klug@ideasonboard.com>\nReviewed-by: Paul Elder <paul.elder@ideasonboard.com>\n\n---\n\nChanges in v2:\n- Collected tag\n---\n src/ipa/rkisp1/rkisp1.cpp | 10 +++-------\n 1 file changed, 3 insertions(+), 7 deletions(-)",
    "diff": "diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp\nindex 991843e29a5d..81430d6532ac 100644\n--- a/src/ipa/rkisp1/rkisp1.cpp\n+++ b/src/ipa/rkisp1/rkisp1.cpp\n@@ -349,6 +349,9 @@ void IPARkISP1::computeParams(const uint32_t frame, const uint32_t bufferId)\n \tfor (const auto &algo : algorithms())\n \t\talgo->prepare(context_, frame, frameContext, &params);\n \n+\tControlList ctrls = getSensorControls(frameContext);\n+\tsetSensorControls.emit(frame, ctrls);\n+\n \tparamsComputed.emit(frame, params.bytesused());\n }\n \n@@ -380,13 +383,6 @@ void IPARkISP1::processStats(const uint32_t frame, const uint32_t bufferId,\n \t\talgo->process(context_, frame, frameContext, stats, metadata);\n \t}\n \n-\t/*\n-\t * \\todo: Here we should do a lookahead that takes the sensor delays\n-\t * into account.\n-\t */\n-\tControlList ctrls = getSensorControls(frameContext);\n-\tsetSensorControls.emit(frame, ctrls);\n-\n \tcontext_.debugMetadata.moveEntries(metadata);\n \tmetadataReady.emit(frame, metadata);\n }\n",
    "prefixes": [
        "v2",
        "11/32"
    ]
}