Show a patch.

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

{
    "id": 22791,
    "url": "https://patchwork.libcamera.org/api/patches/22791/?format=api",
    "web_url": "https://patchwork.libcamera.org/patch/22791/",
    "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": "<20250217100203.297894-6-stefan.klug@ideasonboard.com>",
    "date": "2025-02-17T10:01:46",
    "name": "[05/10] ipa: rkisp: ccm/lsc: Fix CCM/LSC based on manual color temperature",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": false,
    "hash": "ada4125891272e4fd112a276ae3726f20a716094",
    "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/22791/mbox/",
    "series": [
        {
            "id": 5005,
            "url": "https://patchwork.libcamera.org/api/series/5005/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=5005",
            "date": "2025-02-17T10:01:41",
            "name": "Some rkisp1 awb improvements",
            "version": 1,
            "mbox": "https://patchwork.libcamera.org/series/5005/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/patches/22791/comments/",
    "check": "pending",
    "checks": "https://patchwork.libcamera.org/api/patches/22791/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 9FB04C327D\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 17 Feb 2025 10:02:27 +0000 (UTC)",
            "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 2970668672;\n\tMon, 17 Feb 2025 11:02:27 +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 7F1F76866D\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 17 Feb 2025 11:02:22 +0100 (CET)",
            "from ideasonboard.com (unknown\n\t[IPv6:2a00:6020:448c:6c00:b47f:e20a:c4c7:ece1])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 29FF61047;\n\tMon, 17 Feb 2025 11:01:01 +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=\"g/UtrzjL\"; dkim-atps=neutral",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1739786461;\n\tbh=JdIl4wlXsMPCM3woaquK6SUw9P/ZoTfxyxj/KKBuetI=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=g/UtrzjLdaaUgHvj+F3rAUTeR6SnlwFzPJJKEi6An2b6LipkeZ4zPQbjKs5Vwgjp5\n\thX3AWttXqiMsFpsyTTsgxDLGaqsNITX+jeKch0uxenFRmgrxNYD7UjIHx9NsZLJyL+\n\tIKjoi5tyPSHrKhBfo3DvN155aAW6hvdMMPoaLfZk=",
        "From": "Stefan Klug <stefan.klug@ideasonboard.com>",
        "To": "libcamera-devel@lists.libcamera.org",
        "Cc": "Stefan Klug <stefan.klug@ideasonboard.com>",
        "Subject": "[PATCH 05/10] ipa: rkisp: ccm/lsc: Fix CCM/LSC based on manual color\n\ttemperature",
        "Date": "Mon, 17 Feb 2025 11:01:46 +0100",
        "Message-ID": "<20250217100203.297894-6-stefan.klug@ideasonboard.com>",
        "X-Mailer": "git-send-email 2.43.0",
        "In-Reply-To": "<20250217100203.297894-1-stefan.klug@ideasonboard.com>",
        "References": "<20250217100203.297894-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": "In RkISP1Awb::process(), the color temperature in the active state is\nupdated unconditionally.  The CCM/LSC algorithms use that value in\nprepare() to update the CCM/LSC which is not correct if the color\ntemperature was specified manually and leads to visible flicker even\nwhen AwbEnable is set to false.\n\nTo fix that, track the auto and manual color temperature separately in\nactive state. In Awb::prepare() the current frame context is updated\nwith the corresponding value from active state. Change the algorithms to\nfetch the color temperature from the frame context instead of the active\nstate in prepare().\n\nFixes: 02308809548d (\"ipa: rkisp1: awb: Implement ColourTemperature control\")\nSigned-off-by: Stefan Klug <stefan.klug@ideasonboard.com>\n---\n src/ipa/rkisp1/algorithms/awb.cpp | 16 +++++++++-------\n src/ipa/rkisp1/algorithms/ccm.cpp |  2 +-\n src/ipa/rkisp1/algorithms/lsc.cpp |  6 +++---\n src/ipa/rkisp1/ipa_context.h      |  3 ++-\n 4 files changed, 15 insertions(+), 12 deletions(-)",
    "diff": "diff --git a/src/ipa/rkisp1/algorithms/awb.cpp b/src/ipa/rkisp1/algorithms/awb.cpp\nindex 147277c98bb2..683a08c943fa 100644\n--- a/src/ipa/rkisp1/algorithms/awb.cpp\n+++ b/src/ipa/rkisp1/algorithms/awb.cpp\n@@ -77,7 +77,8 @@ int Awb::configure(IPAContext &context,\n \tcontext.activeState.awb.manual.gains = RGB<double>{ 1.0 };\n \tcontext.activeState.awb.automatic.gains = RGB<double>{ 1.0 };\n \tcontext.activeState.awb.autoEnabled = true;\n-\tcontext.activeState.awb.temperatureK = kDefaultColourTemperature;\n+\tcontext.activeState.awb.manual.temperatureK = kDefaultColourTemperature;\n+\tcontext.activeState.awb.automatic.temperatureK = kDefaultColourTemperature;\n \n \t/*\n \t * Define the measurement window for AWB as a centered rectangle\n@@ -132,7 +133,7 @@ void Awb::queueRequest(IPAContext &context,\n \t\tconst auto &gains = colourGainCurve_->getInterpolated(*colourTemperature);\n \t\tawb.manual.gains.r() = gains[0];\n \t\tawb.manual.gains.b() = gains[1];\n-\t\tawb.temperatureK = *colourTemperature;\n+\t\tawb.manual.temperatureK = *colourTemperature;\n \t\tupdate = true;\n \t}\n \n@@ -141,7 +142,7 @@ void Awb::queueRequest(IPAContext &context,\n \t\t\t<< \"Set colour gains to \" << awb.manual.gains;\n \n \tframeContext.awb.gains = awb.manual.gains;\n-\tframeContext.awb.temperatureK = awb.temperatureK;\n+\tframeContext.awb.temperatureK = awb.manual.temperatureK;\n }\n \n /**\n@@ -155,8 +156,9 @@ void Awb::prepare(IPAContext &context, const uint32_t frame,\n \t * most up-to-date automatic values we can read.\n \t */\n \tif (frameContext.awb.autoEnabled) {\n-\t\tframeContext.awb.gains = context.activeState.awb.automatic.gains;\n-\t\tframeContext.awb.temperatureK = context.activeState.awb.temperatureK;\n+\t\tauto &awb = context.activeState.awb;\n+\t\tframeContext.awb.gains = awb.automatic.gains;\n+\t\tframeContext.awb.temperatureK = awb.automatic.temperatureK;\n \t}\n \n \tauto gainConfig = params->block<BlockType::AwbGain>();\n@@ -309,7 +311,7 @@ void Awb::process(IPAContext &context,\n \t    rgbMeans.b() < kMeanMinThreshold)\n \t\treturn;\n \n-\tactiveState.awb.temperatureK = estimateCCT(rgbMeans);\n+\tactiveState.awb.automatic.temperatureK = estimateCCT(rgbMeans);\n \n \t/*\n \t * Estimate the red and blue gains to apply in a grey world. The green\n@@ -340,7 +342,7 @@ void Awb::process(IPAContext &context,\n \t\t<< std::showpoint\n \t\t<< \"Means \" << rgbMeans << \", gains \"\n \t\t<< activeState.awb.automatic.gains << \", temp \"\n-\t\t<< activeState.awb.temperatureK << \"K\";\n+\t\t<< activeState.awb.automatic.temperatureK << \"K\";\n }\n \n REGISTER_IPA_ALGORITHM(Awb, \"Awb\")\ndiff --git a/src/ipa/rkisp1/algorithms/ccm.cpp b/src/ipa/rkisp1/algorithms/ccm.cpp\nindex eb8ca39e56a8..2e5e91006b55 100644\n--- a/src/ipa/rkisp1/algorithms/ccm.cpp\n+++ b/src/ipa/rkisp1/algorithms/ccm.cpp\n@@ -88,7 +88,7 @@ void Ccm::setParameters(struct rkisp1_cif_isp_ctk_config &config,\n void Ccm::prepare(IPAContext &context, const uint32_t frame,\n \t\t  IPAFrameContext &frameContext, RkISP1Params *params)\n {\n-\tuint32_t ct = context.activeState.awb.temperatureK;\n+\tuint32_t ct = frameContext.awb.temperatureK;\n \n \t/*\n \t * \\todo The colour temperature will likely be noisy, add filtering to\ndiff --git a/src/ipa/rkisp1/algorithms/lsc.cpp b/src/ipa/rkisp1/algorithms/lsc.cpp\nindex e47aa2f0727e..e7301bfec863 100644\n--- a/src/ipa/rkisp1/algorithms/lsc.cpp\n+++ b/src/ipa/rkisp1/algorithms/lsc.cpp\n@@ -404,12 +404,12 @@ void LensShadingCorrection::copyTable(rkisp1_cif_isp_lsc_config &config,\n /**\n  * \\copydoc libcamera::ipa::Algorithm::prepare\n  */\n-void LensShadingCorrection::prepare(IPAContext &context,\n+void LensShadingCorrection::prepare([[maybe_unused]] IPAContext &context,\n \t\t\t\t    [[maybe_unused]] const uint32_t frame,\n-\t\t\t\t    [[maybe_unused]] IPAFrameContext &frameContext,\n+\t\t\t\t    IPAFrameContext &frameContext,\n \t\t\t\t    RkISP1Params *params)\n {\n-\tuint32_t ct = context.activeState.awb.temperatureK;\n+\tuint32_t ct = frameContext.awb.temperatureK;\n \tif (std::abs(static_cast<int>(ct) - static_cast<int>(lastAppliedCt_)) <\n \t    kColourTemperatureChangeThreshhold)\n \t\treturn;\ndiff --git a/src/ipa/rkisp1/ipa_context.h b/src/ipa/rkisp1/ipa_context.h\nindex 1a374c96cd1a..b50370cd9daa 100644\n--- a/src/ipa/rkisp1/ipa_context.h\n+++ b/src/ipa/rkisp1/ipa_context.h\n@@ -90,13 +90,14 @@ struct IPAActiveState {\n \tstruct {\n \t\tstruct {\n \t\t\tRGB<double> gains;\n+\t\t\tunsigned int temperatureK;\n \t\t} manual;\n \n \t\tstruct {\n \t\t\tRGB<double> gains;\n+\t\t\tunsigned int temperatureK;\n \t\t} automatic;\n \n-\t\tunsigned int temperatureK;\n \t\tbool autoEnabled;\n \t} awb;\n \n",
    "prefixes": [
        "05/10"
    ]
}