[{"id":38851,"web_url":"https://patchwork.libcamera.org/comment/38851/","msgid":"<85lddqtfvn.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","date":"2026-05-11T10:11:40","subject":"Re: [PATCH v2 03/10] ipa: simple: adjust: Support gamma, contrast, \n\tsaturation defaults from YAML","submitter":{"id":177,"url":"https://patchwork.libcamera.org/api/people/177/","name":"Milan Zamazal","email":"mzamazal@redhat.com"},"content":"d3vv3 <devve.3@gmail.com> writes:\n\n> Read default values for gamma, contrast, and saturation from the tuning\n> file so sensors can specify different image processing defaults without\n> code changes. Falls back to prior defaults (gamma 2.2, contrast 1.0,\n> saturation 1.0) when not specified in YAML.\n>\n> Signed-off-by: d3vv3 <devve.3@gmail.com>\n\nReviewed-by: Milan Zamazal <mzamazal@redhat.com>\n\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(-)\n>\n> diff --git a/src/ipa/simple/algorithms/adjust.cpp b/src/ipa/simple/algorithms/adjust.cpp\n> index 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\")\n> diff --git a/src/ipa/simple/algorithms/adjust.h b/src/ipa/simple/algorithms/adjust.h\n> index 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 */\n> diff --git a/src/ipa/simple/ipa_context.h b/src/ipa/simple/ipa_context.h\n> index 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 {","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 1F3F1BDB1C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 11 May 2026 10:11:49 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id AC8456301E;\n\tMon, 11 May 2026 12:11:47 +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 A6BC362DC4\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 11 May 2026 12:11:46 +0200 (CEST)","from mail-wr1-f71.google.com (mail-wr1-f71.google.com\n\t[209.85.221.71]) by relay.mimecast.com with ESMTP with STARTTLS\n\t(version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id\n\tus-mta-3-lIZyYJpcMzC7bHTwtnT5uA-1; Mon, 11 May 2026 06:11:44 -0400","by mail-wr1-f71.google.com with SMTP id\n\tffacd0b85a97d-43d789cebcfso3653463f8f.1\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 11 May 2026 03:11:43 -0700 (PDT)","from mzamazal-thinkpadp1gen7.tpbc.csb\n\t(ip-77-48-47-4.net.vodafone.cz. [77.48.47.4])\n\tby smtp.gmail.com with ESMTPSA id\n\t5b1f17b1804b1-48e6fff9a90sm182099345e9.3.2026.05.11.03.11.41\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tMon, 11 May 2026 03:11:41 -0700 (PDT)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=redhat.com header.i=@redhat.com\n\theader.b=\"cmjBhd42\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1778494305;\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\tin-reply-to:in-reply-to:references:references;\n\tbh=fxdegsCfuqCREVwaExfVhwkOohIQAFjjY4afN8gheKk=;\n\tb=cmjBhd421cCaeRvmVRlkrHsXgkX3V1quE9mmC4fcUVd92dp4J6Ark6YD1t0ZPQb2TkNcXm\n\t5e4eUF/WOOIXCRRBBVDHZc1tJcITwIm4YCjBOEm1G4Q5jO1eeC2Qvg8VCnbgYxXOWr6RHx\n\tAaYVMQXe14oZTbNb1gzKjqCfmMUXBp8=","X-MC-Unique":"lIZyYJpcMzC7bHTwtnT5uA-1","X-Mimecast-MFC-AGG-ID":"lIZyYJpcMzC7bHTwtnT5uA_1778494303","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20251104; t=1778494302; x=1779099102;\n\th=mime-version:user-agent:message-id:date:references:in-reply-to\n\t:subject:cc:to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject\n\t:date:message-id:reply-to;\n\tbh=fxdegsCfuqCREVwaExfVhwkOohIQAFjjY4afN8gheKk=;\n\tb=sdnk1S+m+aJ23JY96R0FZbPFfZYyG8N7ZQf8a8mIXFMH5lGmUTo1HtyIuSVBIvU9mZ\n\tnZuq9/wy2KMVkm7Khp36glY6sFqqAj3pkY+HI3TWFDpMwSuGxfwPFvwKi0gUgolTedL9\n\tMgr17/8jTITgk5su311jBVgjUQcSnQi0AKzU75xUgBmaOsY/2vDwaErZV5M6olV8/yuN\n\txIRUA5ltaOUOCZ9Et9HXMVQcjex5k6ves25uqd6ON8Nme0VYTJTQ5mx6Zn9Qjs8l/nae\n\tE7Lxw/IULFgRsfUDLaab+KImrIG4vby3GzUkPbuFrzrKqJMAqD7IMZva6Z9R9VwPKzkK\n\tv57g==","X-Gm-Message-State":"AOJu0Yz19I73SeXN0ZVHLE7cO0aHxNTUWe8SdrA+JwAEvrwD1Fc9HSDG\n\tNzNsx1LBRaIpnsYaMVGxPRo1vJHwY+rtutd0mFk1hXJ6OyiZDbitlyAruxEIlv6qa85FgR6JI1R\n\tA5JdJ89Bs+C9/1lsBGBpxNA4Z+Jl1w5FnlzhCbikdcXtJBoRW9Iy0DpFAhfwRTAkOrVyxa7DTUF\n\t8G6jDARGLaignncTpAa9bFjtCDw+49xg3mccnURCNwF5nYQ48SFLsi0gVatWI=","X-Gm-Gg":"Acq92OEIDmy78JzMxN3mqxujnICWsFAdw7uanMLcrIMezlOxS+iDcfZVNvbHEcSJ9SR\n\tC88khj/VqaEq/CDP0fodyqvYG6/UdrTRFzPAYERn2Fq5/668JpLVjy7+eSVUtpR3yKVaSjbIxY3\n\tUPmbxrooBP89Hk8BwT4Ra2aES26n2zbbHvKZyU/f9IApU/wxJF6YExiwITL5biJfHl6cvIYzBB1\n\te6DI89tj0iNAPU5hjJhaUbYld27dy9nzLrjFNfI+ADTk1vuESN39B10fTg1RKYQKVJzmRSOHvUr\n\tGt930nyuRe+10ZI+xgLd9N7GJQjEk13oUtuWYUzC/Mdz1ysqdWNYcQHa1gCg7SHnJD7Z/RcQhw+\n\tDP6CDxgrEzqVO7PKHs4vrhHbj3eEEG3dw0uin3IaLXvXCRjAkeIYc5tSd9ZMLGwu+3o6p795C5F\n\tI=","X-Received":["by 2002:a05:600c:8b6e:b0:485:3c2e:60d5 with SMTP id\n\t5b1f17b1804b1-48e5dfcd72emr295729555e9.2.1778494302631; \n\tMon, 11 May 2026 03:11:42 -0700 (PDT)","by 2002:a05:600c:8b6e:b0:485:3c2e:60d5 with SMTP id\n\t5b1f17b1804b1-48e5dfcd72emr295728885e9.2.1778494302113; \n\tMon, 11 May 2026 03:11:42 -0700 (PDT)"],"From":"Milan Zamazal <mzamazal@redhat.com>","To":"d3vv3 <devve.3@gmail.com>","Cc":"libcamera-devel@lists.libcamera.org","Subject":"Re: [PATCH v2 03/10] ipa: simple: adjust: Support gamma, contrast, \n\tsaturation defaults from YAML","In-Reply-To":"<20260506230722.1041596-4-devve.3@gmail.com> (d3vv3's message of\n\t\"Thu, 7 May 2026 01:07:15 +0200\")","References":"<20260506230722.1041596-1-devve.3@gmail.com>\n\t<20260506230722.1041596-4-devve.3@gmail.com>","Date":"Mon, 11 May 2026 12:11:40 +0200","Message-ID":"<85lddqtfvn.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","User-Agent":"Gnus/5.13 (Gnus v5.13)","MIME-Version":"1.0","X-Mimecast-Spam-Score":"0","X-Mimecast-MFC-PROC-ID":"jeMKwmdNTxaUMvALtNPYBCTijDnoHuyvvmfVbXSR1Vw_1778494303","X-Mimecast-Originator":"redhat.com","Content-Type":"text/plain","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>"}}]