Show a patch.

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

{
    "id": 26660,
    "url": "https://patchwork.libcamera.org/api/patches/26660/?format=api",
    "web_url": "https://patchwork.libcamera.org/patch/26660/",
    "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": "<20260506230722.1041596-4-devve.3@gmail.com>",
    "date": "2026-05-06T23:07:15",
    "name": "[v2,03/10] ipa: simple: adjust: Support gamma, contrast, saturation defaults from YAML",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "1e165112cacff0b334d31c7670d9b820e4a3704e",
    "submitter": {
        "id": 271,
        "url": "https://patchwork.libcamera.org/api/people/271/?format=api",
        "name": "devve",
        "email": "devve.3@gmail.com"
    },
    "delegate": null,
    "mbox": "https://patchwork.libcamera.org/patch/26660/mbox/",
    "series": [
        {
            "id": 5915,
            "url": "https://patchwork.libcamera.org/api/series/5915/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=5915",
            "date": "2026-05-06T23:07:12",
            "name": "OV01A10 sensor support and simple IPA improvements",
            "version": 2,
            "mbox": "https://patchwork.libcamera.org/series/5915/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/patches/26660/comments/",
    "check": "pending",
    "checks": "https://patchwork.libcamera.org/api/patches/26660/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 4CDCCC3300\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed,  6 May 2026 23:07:34 +0000 (UTC)",
            "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 8A0AC6302D;\n\tThu,  7 May 2026 01:07:33 +0200 (CEST)",
            "from mail-qk1-x72b.google.com (mail-qk1-x72b.google.com\n\t[IPv6:2607:f8b0:4864:20::72b])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 4984963024\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu,  7 May 2026 01:07:30 +0200 (CEST)",
            "by mail-qk1-x72b.google.com with SMTP id\n\taf79cd13be357-8cbc593a67aso20497185a.2\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 06 May 2026 16:07:30 -0700 (PDT)",
            "from dexps.speedport.ip\n\t(p200300eda74453cf3cf3f7929e513b94.dip0.t-ipconnect.de.\n\t[2003:ed:a744:53cf:3cf3:f792:9e51:3b94])\n\tby smtp.gmail.com with ESMTPSA id\n\taf79cd13be357-8fc2c25324esm2035266385a.23.2026.05.06.16.07.28\n\tfor <libcamera-devel@lists.libcamera.org>\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tWed, 06 May 2026 16:07:28 -0700 (PDT)"
        ],
        "Authentication-Results": "lancelot.ideasonboard.com; dkim=pass (2048-bit key;\n\tunprotected) header.d=gmail.com header.i=@gmail.com\n\theader.b=\"FzsouHG/\"; dkim-atps=neutral",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=gmail.com; s=20251104; t=1778108849; x=1778713649;\n\tdarn=lists.libcamera.org; \n\th=content-transfer-encoding:mime-version:references:in-reply-to\n\t:message-id:date:subject:to:from:from:to:cc:subject:date:message-id\n\t:reply-to; bh=TdmC3s5OWUslsg0CaqrHDC/ToejoU6twUaRb3QtsRVI=;\n\tb=FzsouHG/eg8YUKdALa8MY/IeHUIZ9FQESUDeGOiwl4ii4WSwAJGjnSmTsd9Zc9RDmr\n\tYkBVlfFHi26yjwx9S1UOsiyHMnAz+Bwo158KggbNU/qgTbjXmRyUpzacdGdn3G78xoJo\n\tb4Ce09sjwVOZ0LyLkULaW7CL8GdJR+BydQsS0XQdvkwsMqQBjiQhOdYg0COU0Yq0PVL0\n\t+gpmXfbdah46XzcB+RlDrEdwM/qQ1tBQxdBR3dfdpm9S8IyzJicil/Yd4+Y4voE7ugpr\n\tmWFwjCn7FjThiYDW6ksbKCBclA48L2BtjMgqFXXEDhqTc23Zo6mHVymqhxVlkMCdoxCw\n\tPPtA==",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20251104; t=1778108849; x=1778713649;\n\th=content-transfer-encoding:mime-version:references:in-reply-to\n\t:message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to\n\t:cc:subject:date:message-id:reply-to;\n\tbh=TdmC3s5OWUslsg0CaqrHDC/ToejoU6twUaRb3QtsRVI=;\n\tb=irfBMbjM1UYA3Nr+wnIRSjENACIJLD0wNQzTBM+eme243kR/12rIOA/0Zb9NKgYrTw\n\tzCjmpZ/hqJstoBHZJy1NK+lyI32cakAxu5uhDPqSLJcOsGjErv6ofgafYuqC9ganKWTY\n\tFX6DYgE806Xj08HsmvT/MDY+CwTlBt9DF5T2cogveKSZK+OEf0YMyRzpwljVQ0tLVVXH\n\taO24Eur1ZZ/1fVXmcY4UEwt0xI1gX/C3guD6UyHLpQDfmBBGAPYFevT6KRnqiSwOrQxT\n\tlqoKuvysiMpEUICIs6rH3WpOlJa2+rR9oELHXUe55PwGd4GJvmHbd0Zhz+imYP7KOYGu\n\tYnyA==",
        "X-Gm-Message-State": "AOJu0Yx+her1lhivfetdSZKA7BS4CDogimiM2yD80TDbdG4H8mRx/8Gg\n\tCratFoydcc+Vr8vsEQrPSfqjFjOQiAqAkc38kvDxDtbxh83c7RqiYVdt5Gg+XA==",
        "X-Gm-Gg": "AeBDieugnjyqV9VRQCsTcueNHvDBHVAicJuFN2OCcMRBeYGZNj4hACTh/aKIWJAGXDh\n\tK68RcfL6hXJEhTrPfIiW5O2PrafhzcUpBopFDNAj5ACJ2fhAZrwxlQA8soNQS5V/80BKQjC7ZRk\n\ttBPaN++z74YE/XHX9AMyvOzvExB6VTcakP6VHcRI2NbdkrZ7FQkKoi2j8j9hLOSc1qUgR3d5T3W\n\tdlr09yAvfPDIrZLDerH/85h9DS9ajmcvR7YKR9AzynRj3Bh7wGmVjmV2+EK60QRl7XPDPjqHqGA\n\tP1nNGZyw7rfYpP0jG+LhE0Cy5on4mjSqwzY6I3fV2O80pPog+Mbogt7+X3+5FCdzpqYAF4lXyut\n\tM5LaC8U7mZZr4DhIU8ghwMKOy5aWQIqGMf+O4zKmrd9Cv12T5rNGffTsQCGohILdSuX6mDDec/r\n\tdDi5VCVike7a8OiSlOG/ZrwYAihFGhS9o3Qu7SfwiaIn3PKrTyYW/yE/5zo7/IqzJKJSLCDPhZr\n\tq5yesxgx6U0uPKnokVHove/J0XOUX0m",
        "X-Received": "by 2002:a05:620a:2890:b0:8f4:3895:25d7 with SMTP id\n\taf79cd13be357-904d486edb2mr858797885a.23.1778108849148; \n\tWed, 06 May 2026 16:07:29 -0700 (PDT)",
        "From": "d3vv3 <devve.3@gmail.com>",
        "To": "libcamera-devel@lists.libcamera.org",
        "Subject": "[PATCH v2 03/10] ipa: simple: adjust: Support gamma, contrast,\n\tsaturation defaults from YAML",
        "Date": "Thu,  7 May 2026 01:07:15 +0200",
        "Message-ID": "<20260506230722.1041596-4-devve.3@gmail.com>",
        "X-Mailer": "git-send-email 2.54.0",
        "In-Reply-To": "<20260506230722.1041596-1-devve.3@gmail.com>",
        "References": "<20260506230722.1041596-1-devve.3@gmail.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": "Read default values for gamma, contrast, and saturation from the tuning\nfile so sensors can specify different image processing defaults without\ncode changes. Falls back to prior defaults (gamma 2.2, contrast 1.0,\nsaturation 1.0) when not specified in YAML.\n\nSigned-off-by: d3vv3 <devve.3@gmail.com>\n---\n src/ipa/simple/algorithms/adjust.cpp | 48 +++++++++++++---------------\n src/ipa/simple/algorithms/adjust.h   |  4 +++\n src/ipa/simple/ipa_context.h         |  8 ++---\n 3 files changed, 31 insertions(+), 29 deletions(-)",
    "diff": "diff --git a/src/ipa/simple/algorithms/adjust.cpp b/src/ipa/simple/algorithms/adjust.cpp\nindex 8bf39c4c..a03a6f1f 100644\n--- a/src/ipa/simple/algorithms/adjust.cpp\n+++ b/src/ipa/simple/algorithms/adjust.cpp\n@@ -14,34 +14,37 @@\n #include <libcamera/control_ids.h>\n \n #include \"libcamera/internal/matrix.h\"\n+#include \"libcamera/internal/yaml_parser.h\"\n \n namespace libcamera {\n \n namespace ipa::soft::algorithms {\n \n-constexpr float kDefaultContrast = 1.0f;\n-constexpr float kDefaultSaturation = 1.0f;\n-\n LOG_DEFINE_CATEGORY(IPASoftAdjust)\n \n-int Adjust::init(IPAContext &context, [[maybe_unused]] const ValueNode &tuningData)\n+int Adjust::init(IPAContext &context, const ValueNode &tuningData)\n {\n+\tdefaultGamma_ = tuningData[\"gamma\"].get<float>().value_or(kDefaultGamma);\n+\tdefaultContrast_ = tuningData[\"contrast\"].get<float>().value_or(1.0f);\n+\tdefaultSaturation_ = tuningData[\"saturation\"].get<float>().value_or(1.0f);\n+\n \tcontext.ctrlMap[&controls::Gamma] =\n-\t\tControlInfo(0.1f, 10.0f, kDefaultGamma);\n+\t\tControlInfo(0.1f, 10.0f, defaultGamma_);\n \tcontext.ctrlMap[&controls::Contrast] =\n-\t\tControlInfo(0.0f, 2.0f, kDefaultContrast);\n+\t\tControlInfo(0.0f, 2.0f, defaultContrast_);\n \tif (context.ccmEnabled)\n \t\tcontext.ctrlMap[&controls::Saturation] =\n-\t\t\tControlInfo(0.0f, 2.0f, kDefaultSaturation);\n+\t\t\tControlInfo(0.0f, 2.0f, defaultSaturation_);\n+\n \treturn 0;\n }\n \n int Adjust::configure(IPAContext &context,\n \t\t      [[maybe_unused]] const IPAConfigInfo &configInfo)\n {\n-\tcontext.activeState.knobs.gamma = kDefaultGamma;\n-\tcontext.activeState.knobs.contrast = std::optional<float>();\n-\tcontext.activeState.knobs.saturation = std::optional<float>();\n+\tcontext.activeState.knobs.gamma = defaultGamma_;\n+\tcontext.activeState.knobs.contrast = defaultContrast_;\n+\tcontext.activeState.knobs.saturation = defaultSaturation_;\n \n \treturn 0;\n }\n@@ -59,13 +62,13 @@ void Adjust::queueRequest(typename Module::Context &context,\n \n \tconst auto &contrast = controls.get(controls::Contrast);\n \tif (contrast.has_value()) {\n-\t\tcontext.activeState.knobs.contrast = contrast;\n+\t\tcontext.activeState.knobs.contrast = contrast.value();\n \t\tLOG(IPASoftAdjust, Debug) << \"Setting contrast to \" << contrast.value();\n \t}\n \n \tconst auto &saturation = controls.get(controls::Saturation);\n \tif (saturation.has_value()) {\n-\t\tcontext.activeState.knobs.saturation = saturation;\n+\t\tcontext.activeState.knobs.saturation = saturation.value();\n \t\tLOG(IPASoftAdjust, Debug) << \"Setting saturation to \" << saturation.value();\n \t}\n }\n@@ -100,15 +103,15 @@ void Adjust::prepare(IPAContext &context,\n \tframeContext.gamma = context.activeState.knobs.gamma;\n \tframeContext.contrast = context.activeState.knobs.contrast;\n \n-\tauto &saturation = context.activeState.knobs.saturation;\n-\tif (context.ccmEnabled && saturation) {\n-\t\tapplySaturation(context.activeState.combinedMatrix, saturation.value());\n+\tconst float saturation = context.activeState.knobs.saturation;\n+\tif (context.ccmEnabled) {\n+\t\tapplySaturation(context.activeState.combinedMatrix, saturation);\n \t\tframeContext.saturation = saturation;\n \t}\n \n \tparams->gamma = 1.0 / context.activeState.knobs.gamma;\n-\tconst float contrast = context.activeState.knobs.contrast.value_or(kDefaultContrast);\n-\tparams->contrastExp = tan(std::clamp(contrast * M_PI_4, 0.0, M_PI_2 - 0.00001));\n+\tparams->contrastExp = tan(std::clamp(context.activeState.knobs.contrast * M_PI_4,\n+\t\t\t\t\t     0.0, M_PI_2 - 0.00001));\n }\n \n void Adjust::process([[maybe_unused]] IPAContext &context,\n@@ -117,14 +120,9 @@ void Adjust::process([[maybe_unused]] IPAContext &context,\n \t\t     [[maybe_unused]] const SwIspStats *stats,\n \t\t     ControlList &metadata)\n {\n-\tconst auto &gamma = frameContext.gamma;\n-\tmetadata.set(controls::Gamma, gamma);\n-\n-\tconst auto &contrast = frameContext.contrast;\n-\tmetadata.set(controls::Contrast, contrast.value_or(kDefaultContrast));\n-\n-\tconst auto &saturation = frameContext.saturation;\n-\tmetadata.set(controls::Saturation, saturation.value_or(kDefaultSaturation));\n+\tmetadata.set(controls::Gamma, frameContext.gamma);\n+\tmetadata.set(controls::Contrast, frameContext.contrast);\n+\tmetadata.set(controls::Saturation, frameContext.saturation);\n }\n \n REGISTER_IPA_ALGORITHM(Adjust, \"Adjust\")\ndiff --git a/src/ipa/simple/algorithms/adjust.h b/src/ipa/simple/algorithms/adjust.h\nindex 49c1f26c..a836b51b 100644\n--- a/src/ipa/simple/algorithms/adjust.h\n+++ b/src/ipa/simple/algorithms/adjust.h\n@@ -43,6 +43,10 @@ public:\n \n private:\n \tvoid applySaturation(Matrix<float, 3, 3> &ccm, float saturation);\n+\n+\tfloat defaultGamma_;\n+\tfloat defaultContrast_;\n+\tfloat defaultSaturation_;\n };\n \n } /* namespace ipa::soft::algorithms */\ndiff --git a/src/ipa/simple/ipa_context.h b/src/ipa/simple/ipa_context.h\nindex 34f7403a..cd9a8eda 100644\n--- a/src/ipa/simple/ipa_context.h\n+++ b/src/ipa/simple/ipa_context.h\n@@ -58,8 +58,8 @@ struct IPAActiveState {\n \tstruct {\n \t\tfloat gamma;\n \t\t/* 0..2 range, 1.0 = normal */\n-\t\tstd::optional<float> contrast;\n-\t\tstd::optional<float> saturation;\n+\t\tfloat contrast;\n+\t\tfloat saturation;\n \t} knobs;\n };\n \n@@ -77,8 +77,8 @@ struct IPAFrameContext : public FrameContext {\n \t} gains;\n \n \tfloat gamma;\n-\tstd::optional<float> contrast;\n-\tstd::optional<float> saturation;\n+\tfloat contrast;\n+\tfloat saturation;\n };\n \n struct IPAContext {\n",
    "prefixes": [
        "v2",
        "03/10"
    ]
}