Show a patch.

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

{
    "id": 25001,
    "url": "https://patchwork.libcamera.org/api/patches/25001/?format=api",
    "web_url": "https://patchwork.libcamera.org/patch/25001/",
    "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": "<20251112082715.17823-4-mzamazal@redhat.com>",
    "date": "2025-11-12T08:27:11",
    "name": "[RFC,3/7] libcamera: ipa: simple: Generalise tracking matrix changes",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": false,
    "hash": "0aa80c5dde40b7e0e39026833e42ea526db74a34",
    "submitter": {
        "id": 177,
        "url": "https://patchwork.libcamera.org/api/people/177/?format=api",
        "name": "Milan Zamazal",
        "email": "mzamazal@redhat.com"
    },
    "delegate": null,
    "mbox": "https://patchwork.libcamera.org/patch/25001/mbox/",
    "series": [
        {
            "id": 5582,
            "url": "https://patchwork.libcamera.org/api/series/5582/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=5582",
            "date": "2025-11-12T08:27:08",
            "name": "Simple pipeline IPA cleanup",
            "version": 1,
            "mbox": "https://patchwork.libcamera.org/series/5582/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/patches/25001/comments/",
    "check": "pending",
    "checks": "https://patchwork.libcamera.org/api/patches/25001/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 5197BC3241\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 12 Nov 2025 08:27:33 +0000 (UTC)",
            "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id D910A60AA1;\n\tWed, 12 Nov 2025 09:27:32 +0100 (CET)",
            "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 0D94860AA3\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 12 Nov 2025 09:27:28 +0100 (CET)",
            "from mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com\n\t(ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97])\n\tby relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3,\n\tcipher=TLS_AES_256_GCM_SHA384) id us-mta-257-F6fX83nsPzmP7hmzyXEoRQ-1;\n\tWed, 12 Nov 2025 03:27:26 -0500",
            "from mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com\n\t(mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com\n\t[10.30.177.93])\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-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix)\n\twith ESMTPS\n\tid EE45F180048E for <libcamera-devel@lists.libcamera.org>;\n\tWed, 12 Nov 2025 08:27:25 +0000 (UTC)",
            "from mzamazal-thinkpadp1gen7.tpbc.com (unknown [10.44.33.149])\n\tby mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix)\n\twith ESMTP id B9CA31800451; Wed, 12 Nov 2025 08:27: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=\"d6O/vGJp\"; dkim-atps=neutral",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1762936048;\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=Rwk4rnUicsh9TNc31DxLqPiiN+eLGOdhYhZyVjTr5Nw=;\n\tb=d6O/vGJpqdtSq93yETYzZL/HWxOCs3epdJlE/+3wQB3Q0/zZfEYwFgMZk63Ds2t28iiTTl\n\teucuOSTWJf+pxjM6tOlJoB4ZVQ9t0sjgtIBMmX8867j732qPzadJ4Eqw4/spG7vmjZ3i+6\n\tH632rmS6Bk144HtyqxYQ5/NKeu+IIr8=",
        "X-MC-Unique": "F6fX83nsPzmP7hmzyXEoRQ-1",
        "X-Mimecast-MFC-AGG-ID": "F6fX83nsPzmP7hmzyXEoRQ_1762936046",
        "From": "Milan Zamazal <mzamazal@redhat.com>",
        "To": "libcamera-devel@lists.libcamera.org",
        "Cc": "Milan Zamazal <mzamazal@redhat.com>",
        "Subject": "[RFC PATCH 3/7] libcamera: ipa: simple: Generalise tracking matrix\n\tchanges",
        "Date": "Wed, 12 Nov 2025 09:27:11 +0100",
        "Message-ID": "<20251112082715.17823-4-mzamazal@redhat.com>",
        "In-Reply-To": "<20251112082715.17823-1-mzamazal@redhat.com>",
        "References": "<20251112082715.17823-1-mzamazal@redhat.com>",
        "MIME-Version": "1.0",
        "X-Scanned-By": "MIMEDefang 3.4.1 on 10.30.177.93",
        "X-Mimecast-Spam-Score": "0",
        "X-Mimecast-MFC-PROC-ID": "2pW0pRLCrxpKmAfLsmSXsXCbTmPOnhlDB7Q8Lpw3sTE_1762936046",
        "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": "IPAActiveState::ccm stores the colour correction matrix (CCM) and\nwhether it has been changed.  The change flag is later used when\nrecomputing or not the lookup tables.\n\nBut the CCM may include other corrections than just the sensor colour\ncorrection, for example white balance and saturation adjustments.  These\nthings should be separated and IPAActiveState::ccm should represent just\nthe CCM itself.\n\nAs the first step towards that cleanup, let's separate the change flag\nfrom the CCM.  And wrap the only remaining member of\nIPAActiveState::ccm.\n\nAlso, let's reset the separated change flag in the lookup tables; it'll\nbe no longer tight to just CCM handling.\n\nSigned-off-by: Milan Zamazal <mzamazal@redhat.com>\n---\n src/ipa/simple/algorithms/ccm.cpp | 7 +++----\n src/ipa/simple/algorithms/lut.cpp | 6 ++++--\n src/ipa/simple/ipa_context.h      | 6 ++----\n 3 files changed, 9 insertions(+), 10 deletions(-)",
    "diff": "diff --git a/src/ipa/simple/algorithms/ccm.cpp b/src/ipa/simple/algorithms/ccm.cpp\nindex d7d3dda76..e05e5bc28 100644\n--- a/src/ipa/simple/algorithms/ccm.cpp\n+++ b/src/ipa/simple/algorithms/ccm.cpp\n@@ -94,8 +94,7 @@ void Ccm::prepare(IPAContext &context, const uint32_t frame,\n \tif (frame > 0 &&\n \t    utils::abs_diff(ct, lastCt_) < kTemperatureThreshold &&\n \t    saturation == lastSaturation_) {\n-\t\tframeContext.ccm = context.activeState.ccm.ccm;\n-\t\tcontext.activeState.ccm.changed = false;\n+\t\tframeContext.ccm = context.activeState.ccm;\n \t\treturn;\n \t}\n \n@@ -105,9 +104,9 @@ void Ccm::prepare(IPAContext &context, const uint32_t frame,\n \tif (saturation)\n \t\tapplySaturation(ccm, saturation.value());\n \n-\tcontext.activeState.ccm.ccm = ccm;\n+\tcontext.activeState.ccm = ccm;\n \tframeContext.saturation = saturation;\n-\tcontext.activeState.ccm.changed = true;\n+\tcontext.activeState.matrixChanged = true;\n \tframeContext.ccm = ccm;\n }\n \ndiff --git a/src/ipa/simple/algorithms/lut.cpp b/src/ipa/simple/algorithms/lut.cpp\nindex d1d5f7271..dead55f34 100644\n--- a/src/ipa/simple/algorithms/lut.cpp\n+++ b/src/ipa/simple/algorithms/lut.cpp\n@@ -118,11 +118,12 @@ void Lut::prepare(IPAContext &context,\n \t\t\tparams->green[i] = gammaTable[static_cast<unsigned int>(lutGains.g())];\n \t\t\tparams->blue[i] = gammaTable[static_cast<unsigned int>(lutGains.b())];\n \t\t}\n-\t} else if (context.activeState.ccm.changed || gammaUpdateNeeded) {\n+\n+\t} else if (context.activeState.matrixChanged || gammaUpdateNeeded) {\n \t\tMatrix<float, 3, 3> gainCcm = { { gains.r(), 0, 0,\n \t\t\t\t\t\t  0, gains.g(), 0,\n \t\t\t\t\t\t  0, 0, gains.b() } };\n-\t\tauto ccm = context.activeState.ccm.ccm * gainCcm;\n+\t\tauto ccm = context.activeState.ccm * gainCcm;\n \t\tauto &red = params->redCcm;\n \t\tauto &green = params->greenCcm;\n \t\tauto &blue = params->blueCcm;\n@@ -138,6 +139,7 @@ void Lut::prepare(IPAContext &context,\n \t\t\tblue[i].b = ccmValue(i, ccm[2][2]);\n \t\t\tparams->gammaLut[i] = gammaTable[i / div];\n \t\t}\n+\t\tcontext.activeState.matrixChanged = false;\n \t}\n }\n \ndiff --git a/src/ipa/simple/ipa_context.h b/src/ipa/simple/ipa_context.h\nindex 330fe39cb..b6b3cbfed 100644\n--- a/src/ipa/simple/ipa_context.h\n+++ b/src/ipa/simple/ipa_context.h\n@@ -60,10 +60,8 @@ struct IPAActiveState {\n \t\tdouble contrast;\n \t} gamma;\n \n-\tstruct {\n-\t\tMatrix<float, 3, 3> ccm;\n-\t\tbool changed;\n-\t} ccm;\n+\tMatrix<float, 3, 3> ccm;\n+\tbool matrixChanged = false;\n \n \tstruct {\n \t\t/* 0..2 range, 1.0 = normal */\n",
    "prefixes": [
        "RFC",
        "3/7"
    ]
}