[{"id":36784,"web_url":"https://patchwork.libcamera.org/comment/36784/","msgid":"<176294289787.567526.2996598450909386784@ping.linuxembedded.co.uk>","date":"2025-11-12T10:21:37","subject":"Re: [RFC PATCH 7/7] libcamera: ipa: simple: Move contrast settings\n\tto adjust.cpp","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Quoting Milan Zamazal (2025-11-12 08:27:15)\n> Let's move the contrast settings from lut.cpp to adjust.cpp, where they\n> belong, similarly to saturation.\n> \n> Signed-off-by: Milan Zamazal <mzamazal@redhat.com>\n> ---\n>  src/ipa/simple/algorithms/adjust.cpp | 14 +++++++++++\n>  src/ipa/simple/algorithms/lut.cpp    | 35 +---------------------------\n>  src/ipa/simple/algorithms/lut.h      | 11 ---------\n>  3 files changed, 15 insertions(+), 45 deletions(-)\n> \n> diff --git a/src/ipa/simple/algorithms/adjust.cpp b/src/ipa/simple/algorithms/adjust.cpp\n> index 282b3ccb0..b9a9fc710 100644\n> --- a/src/ipa/simple/algorithms/adjust.cpp\n> +++ b/src/ipa/simple/algorithms/adjust.cpp\n> @@ -23,6 +23,7 @@ LOG_DEFINE_CATEGORY(IPASoftAdjust)\n>  \n>  int Adjust::init(IPAContext &context, [[maybe_unused]] const YamlObject &tuningData)\n>  {\n\n\n> +       context.ctrlMap[&controls::Contrast] = ControlInfo(0.0f, 2.0f, 1.0f);\n\nShouldn't this be dependent upon LUT/Gamma being enabled?\n\n>         if (context.ccmEnabled)\n\nFor both of these I think we have a ciruclar dependency though :-(\n\nTo be able to know if they are enabled/available ccm/lut(gamma) would\nhave to be before adjust to set it before Adjust::init().\n\nBut then if ccm/lut is in front of the chain, then the processing in\nadjust won't have happened in time for the values to be applied?\n\n\n\n>                 context.ctrlMap[&controls::Saturation] = ControlInfo(0.0f, 2.0f, 1.0f);\n>         return 0;\n> @@ -31,6 +32,7 @@ int Adjust::init(IPAContext &context, [[maybe_unused]] const YamlObject &tuningD\n>  int Adjust::configure(IPAContext &context,\n>                       [[maybe_unused]] const IPAConfigInfo &configInfo)\n>  {\n> +       context.activeState.knobs.contrast = std::optional<double>();\n>         context.activeState.knobs.saturation = std::optional<double>();\n>         context.activeState.correctionMatrix =\n>                 Matrix<float, 3, 3>{ { 1, 0, 0, 0, 1, 0, 0, 0, 1 } };\n> @@ -43,6 +45,12 @@ void Adjust::queueRequest(typename Module::Context &context,\n>                           [[maybe_unused]] typename Module::FrameContext &frameContext,\n>                           const ControlList &controls)\n>  {\n> +       const auto &contrast = controls.get(controls::Contrast);\n> +       if (contrast.has_value()) {\n> +               context.activeState.knobs.contrast = contrast;\n> +               LOG(IPASoftAdjust, Debug) << \"Setting contrast to \" << contrast.value();\n> +       }\n> +\n>         const auto &saturation = controls.get(controls::Saturation);\n>         if (saturation.has_value()) {\n>                 context.activeState.knobs.saturation = saturation;\n> @@ -77,6 +85,8 @@ void Adjust::prepare(IPAContext &context,\n>                      IPAFrameContext &frameContext,\n>                      [[maybe_unused]] DebayerParams *params)\n>  {\n> +       frameContext.contrast = context.activeState.knobs.contrast;\n> +\n>         if (!context.ccmEnabled)\n>                 return;\n>  \n> @@ -100,6 +110,10 @@ void Adjust::process([[maybe_unused]] IPAContext &context,\n>                      [[maybe_unused]] const SwIspStats *stats,\n>                      ControlList &metadata)\n>  {\n> +       const auto &contrast = frameContext.contrast;\n> +       if (contrast)\n> +               metadata.set(controls::Contrast, contrast.value());\n> +\n>         const auto &saturation = frameContext.saturation;\n>         metadata.set(controls::Saturation, saturation.value_or(1.0));\n>  }\n> diff --git a/src/ipa/simple/algorithms/lut.cpp b/src/ipa/simple/algorithms/lut.cpp\n> index 8751bb31c..876cd5cb3 100644\n> --- a/src/ipa/simple/algorithms/lut.cpp\n> +++ b/src/ipa/simple/algorithms/lut.cpp\n> @@ -24,36 +24,16 @@ LOG_DEFINE_CATEGORY(IPASoftLut)\n>  \n>  namespace ipa::soft::algorithms {\n>  \n> -int Lut::init(IPAContext &context,\n> -             [[maybe_unused]] const YamlObject &tuningData)\n> -{\n> -       context.ctrlMap[&controls::Contrast] = ControlInfo(0.0f, 2.0f, 1.0f);\n> -       return 0;\n> -}\n> -\n>  int Lut::configure(IPAContext &context,\n>                    [[maybe_unused]] const IPAConfigInfo &configInfo)\n>  {\n>         /* Gamma value is fixed */\n\nSeems easy to give this a control now ?\n\n>         context.configuration.gamma = 0.5;\n> -       context.activeState.knobs.contrast = std::optional<double>();\n>         updateGammaTable(context);\n\nI guess LUT could now be called 'gamma.cpp' ?\n\n>  \n>         return 0;\n>  }\n>  \n> -void Lut::queueRequest(typename Module::Context &context,\n> -                      [[maybe_unused]] const uint32_t frame,\n> -                      [[maybe_unused]] typename Module::FrameContext &frameContext,\n> -                      const ControlList &controls)\n> -{\n> -       const auto &contrast = controls.get(controls::Contrast);\n> -       if (contrast.has_value()) {\n> -               context.activeState.knobs.contrast = contrast;\n> -               LOG(IPASoftLut, Debug) << \"Setting contrast to \" << contrast.value();\n> -       }\n> -}\n> -\n>  void Lut::updateGammaTable(IPAContext &context)\n>  {\n>         auto &gammaTable = context.activeState.gamma.gammaTable;\n> @@ -87,11 +67,9 @@ int16_t Lut::matrixValue(unsigned int i, float ccm) const\n>  \n>  void Lut::prepare(IPAContext &context,\n>                   [[maybe_unused]] const uint32_t frame,\n> -                 IPAFrameContext &frameContext,\n> +                 [[maybe_unused]] IPAFrameContext &frameContext,\n>                   DebayerParams *params)\n>  {\n> -       frameContext.contrast = context.activeState.knobs.contrast;\n> -\n>         /*\n>          * Update the gamma table if needed. This means if black level changes\n>          * and since the black level gets updated only if a lower value is\n> @@ -143,17 +121,6 @@ void Lut::prepare(IPAContext &context,\n>         }\n>  }\n>  \n> -void Lut::process([[maybe_unused]] IPAContext &context,\n> -                 [[maybe_unused]] const uint32_t frame,\n> -                 [[maybe_unused]] IPAFrameContext &frameContext,\n> -                 [[maybe_unused]] const SwIspStats *stats,\n> -                 ControlList &metadata)\n> -{\n> -       const auto &contrast = frameContext.contrast;\n> -       if (contrast)\n> -               metadata.set(controls::Contrast, contrast.value());\n> -}\n> -\n>  REGISTER_IPA_ALGORITHM(Lut, \"Lut\")\n>  \n>  } /* namespace ipa::soft::algorithms */\n> diff --git a/src/ipa/simple/algorithms/lut.h b/src/ipa/simple/algorithms/lut.h\n> index 0eafd0695..ad16d1e8e 100644\n> --- a/src/ipa/simple/algorithms/lut.h\n> +++ b/src/ipa/simple/algorithms/lut.h\n> @@ -19,22 +19,11 @@ public:\n>         Lut() = default;\n>         ~Lut() = default;\n>  \n> -       int init(IPAContext &context, const YamlObject &tuningData) override;\n>         int configure(IPAContext &context, const IPAConfigInfo &configInfo) override;\n> -       void queueRequest(typename Module::Context &context,\n> -                         const uint32_t frame,\n> -                         typename Module::FrameContext &frameContext,\n> -                         const ControlList &controls)\n> -               override;\n>         void prepare(IPAContext &context,\n>                      const uint32_t frame,\n>                      IPAFrameContext &frameContext,\n>                      DebayerParams *params) override;\n> -       void process(IPAContext &context,\n> -                    const uint32_t frame,\n> -                    IPAFrameContext &frameContext,\n> -                    const SwIspStats *stats,\n> -                    ControlList &metadata) override;\n>  \n>  private:\n>         void updateGammaTable(IPAContext &context);\n> -- \n> 2.51.1\n>","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 65568C3241\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 12 Nov 2025 10:21:44 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 51C00606E6;\n\tWed, 12 Nov 2025 11:21:43 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 408DF606E6\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 12 Nov 2025 11:21:41 +0100 (CET)","from pendragon.ideasonboard.com\n\t(cpc89244-aztw30-2-0-cust6594.18-1.cable.virginm.net [86.31.185.195])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id BD655E77;\n\tWed, 12 Nov 2025 11:19:41 +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=\"gS2g71+p\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1762942781;\n\tbh=YqRymRI5+KmT3Z9o2hmJWcmz2FYJH07xGbWMS3VQ2Eg=;\n\th=In-Reply-To:References:Subject:From:Cc:To:Date:From;\n\tb=gS2g71+pvZuW7u7uI3mfyoryOQu37txYVYm+P+2hh3EPc8oeB2nWEC+HRdbOt67Eh\n\tervRjN7UuE7rRHIJGF8CETx8Yldh3ZFhW0Iiiq2VX7NRCTPNg6W7+OFVQSTNNIzBLs\n\tFBUj6lUgTaThsBvHb4P7K1Da0+O/2t3O/ri7XUeM=","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<20251112082715.17823-8-mzamazal@redhat.com>","References":"<20251112082715.17823-1-mzamazal@redhat.com>\n\t<20251112082715.17823-8-mzamazal@redhat.com>","Subject":"Re: [RFC PATCH 7/7] libcamera: ipa: simple: Move contrast settings\n\tto adjust.cpp","From":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Cc":"Milan Zamazal <mzamazal@redhat.com>","To":"Milan Zamazal <mzamazal@redhat.com>, libcamera-devel@lists.libcamera.org","Date":"Wed, 12 Nov 2025 10:21:37 +0000","Message-ID":"<176294289787.567526.2996598450909386784@ping.linuxembedded.co.uk>","User-Agent":"alot/0.9.1","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>"}},{"id":36802,"web_url":"https://patchwork.libcamera.org/comment/36802/","msgid":"<85o6p60z7q.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","date":"2025-11-13T14:44:09","subject":"Re: [RFC PATCH 7/7] libcamera: ipa: simple: Move contrast settings\n\tto adjust.cpp","submitter":{"id":177,"url":"https://patchwork.libcamera.org/api/people/177/","name":"Milan Zamazal","email":"mzamazal@redhat.com"},"content":"Hi Kieran,\n\nKieran Bingham <kieran.bingham@ideasonboard.com> writes:\n\n> Quoting Milan Zamazal (2025-11-12 08:27:15)\n>> Let's move the contrast settings from lut.cpp to adjust.cpp, where they\n>> belong, similarly to saturation.\n>\n>> \n>> Signed-off-by: Milan Zamazal <mzamazal@redhat.com>\n>> ---\n>>  src/ipa/simple/algorithms/adjust.cpp | 14 +++++++++++\n>>  src/ipa/simple/algorithms/lut.cpp    | 35 +---------------------------\n>>  src/ipa/simple/algorithms/lut.h      | 11 ---------\n>>  3 files changed, 15 insertions(+), 45 deletions(-)\n>> \n>> diff --git a/src/ipa/simple/algorithms/adjust.cpp b/src/ipa/simple/algorithms/adjust.cpp\n>> index 282b3ccb0..b9a9fc710 100644\n>> --- a/src/ipa/simple/algorithms/adjust.cpp\n>> +++ b/src/ipa/simple/algorithms/adjust.cpp\n>> @@ -23,6 +23,7 @@ LOG_DEFINE_CATEGORY(IPASoftAdjust)\n>>  \n>>  int Adjust::init(IPAContext &context, [[maybe_unused]] const YamlObject &tuningData)\n>>  {\n>\n>\n>> +       context.ctrlMap[&controls::Contrast] = ControlInfo(0.0f, 2.0f, 1.0f);\n>\n> Shouldn't this be dependent upon LUT/Gamma being enabled?\n\nWell, LUT is really not optional, without it, at least CPU ISP cannot\noperate at all.  Maybe the table constructions should be moved out of\nthe algorithms to debayering.\n\n>>         if (context.ccmEnabled)\n>\n> For both of these I think we have a ciruclar dependency though :-(\n>\n> To be able to know if they are enabled/available ccm/lut(gamma) would\n> have to be before adjust to set it before Adjust::init().\n>\n> But then if ccm/lut is in front of the chain, then the processing in\n> adjust won't have happened in time for the values to be applied?\n>\n>\n>\n>>                 context.ctrlMap[&controls::Saturation] = ControlInfo(0.0f, 2.0f, 1.0f);\n>>         return 0;\n>> @@ -31,6 +32,7 @@ int Adjust::init(IPAContext &context, [[maybe_unused]] const YamlObject &tuningD\n>>  int Adjust::configure(IPAContext &context,\n>>                       [[maybe_unused]] const IPAConfigInfo &configInfo)\n>>  {\n>> +       context.activeState.knobs.contrast = std::optional<double>();\n>>         context.activeState.knobs.saturation = std::optional<double>();\n>>         context.activeState.correctionMatrix =\n>>                 Matrix<float, 3, 3>{ { 1, 0, 0, 0, 1, 0, 0, 0, 1 } };\n>> @@ -43,6 +45,12 @@ void Adjust::queueRequest(typename Module::Context &context,\n>>                           [[maybe_unused]] typename Module::FrameContext &frameContext,\n>>                           const ControlList &controls)\n>>  {\n>> +       const auto &contrast = controls.get(controls::Contrast);\n>> +       if (contrast.has_value()) {\n>> +               context.activeState.knobs.contrast = contrast;\n>> +               LOG(IPASoftAdjust, Debug) << \"Setting contrast to \" << contrast.value();\n>> +       }\n>> +\n>>         const auto &saturation = controls.get(controls::Saturation);\n>>         if (saturation.has_value()) {\n>>                 context.activeState.knobs.saturation = saturation;\n>> @@ -77,6 +85,8 @@ void Adjust::prepare(IPAContext &context,\n>>                      IPAFrameContext &frameContext,\n>>                      [[maybe_unused]] DebayerParams *params)\n>>  {\n>> +       frameContext.contrast = context.activeState.knobs.contrast;\n>> +\n>>         if (!context.ccmEnabled)\n>>                 return;\n>>  \n>> @@ -100,6 +110,10 @@ void Adjust::process([[maybe_unused]] IPAContext &context,\n>>                      [[maybe_unused]] const SwIspStats *stats,\n>>                      ControlList &metadata)\n>>  {\n>> +       const auto &contrast = frameContext.contrast;\n>> +       if (contrast)\n>> +               metadata.set(controls::Contrast, contrast.value());\n>> +\n>>         const auto &saturation = frameContext.saturation;\n>>         metadata.set(controls::Saturation, saturation.value_or(1.0));\n>>  }\n>> diff --git a/src/ipa/simple/algorithms/lut.cpp b/src/ipa/simple/algorithms/lut.cpp\n>> index 8751bb31c..876cd5cb3 100644\n>> --- a/src/ipa/simple/algorithms/lut.cpp\n>> +++ b/src/ipa/simple/algorithms/lut.cpp\n>> @@ -24,36 +24,16 @@ LOG_DEFINE_CATEGORY(IPASoftLut)\n>>  \n>>  namespace ipa::soft::algorithms {\n>>  \n>> -int Lut::init(IPAContext &context,\n>> -             [[maybe_unused]] const YamlObject &tuningData)\n>> -{\n>> -       context.ctrlMap[&controls::Contrast] = ControlInfo(0.0f, 2.0f, 1.0f);\n>> -       return 0;\n>> -}\n>> -\n>>  int Lut::configure(IPAContext &context,\n>>                    [[maybe_unused]] const IPAConfigInfo &configInfo)\n>>  {\n>>         /* Gamma value is fixed */\n>\n> Seems easy to give this a control now ?\n\nYes, it would be useful, will try.\n\n>>         context.configuration.gamma = 0.5;\n>> -       context.activeState.knobs.contrast = std::optional<double>();\n>>         updateGammaTable(context);\n>\n> I guess LUT could now be called 'gamma.cpp' ?\n\nI think it would be better to set up the gamma value in adjust.cpp.\nThen perhaps the rest of lut.cpp could be moved out of ipa.  Let's see\nin v2.\n\n>>  \n>>         return 0;\n>>  }\n>>  \n>> -void Lut::queueRequest(typename Module::Context &context,\n>> -                      [[maybe_unused]] const uint32_t frame,\n>> -                      [[maybe_unused]] typename Module::FrameContext &frameContext,\n>> -                      const ControlList &controls)\n>> -{\n>> -       const auto &contrast = controls.get(controls::Contrast);\n>> -       if (contrast.has_value()) {\n>> -               context.activeState.knobs.contrast = contrast;\n>> -               LOG(IPASoftLut, Debug) << \"Setting contrast to \" << contrast.value();\n>> -       }\n>> -}\n>> -\n>>  void Lut::updateGammaTable(IPAContext &context)\n>>  {\n>>         auto &gammaTable = context.activeState.gamma.gammaTable;\n>> @@ -87,11 +67,9 @@ int16_t Lut::matrixValue(unsigned int i, float ccm) const\n>>  \n>>  void Lut::prepare(IPAContext &context,\n>>                   [[maybe_unused]] const uint32_t frame,\n>> -                 IPAFrameContext &frameContext,\n>> +                 [[maybe_unused]] IPAFrameContext &frameContext,\n>>                   DebayerParams *params)\n>>  {\n>> -       frameContext.contrast = context.activeState.knobs.contrast;\n>> -\n>>         /*\n>>          * Update the gamma table if needed. This means if black level changes\n>>          * and since the black level gets updated only if a lower value is\n>> @@ -143,17 +121,6 @@ void Lut::prepare(IPAContext &context,\n>>         }\n>>  }\n>>  \n>> -void Lut::process([[maybe_unused]] IPAContext &context,\n>> -                 [[maybe_unused]] const uint32_t frame,\n>> -                 [[maybe_unused]] IPAFrameContext &frameContext,\n>> -                 [[maybe_unused]] const SwIspStats *stats,\n>> -                 ControlList &metadata)\n>> -{\n>> -       const auto &contrast = frameContext.contrast;\n>> -       if (contrast)\n>> -               metadata.set(controls::Contrast, contrast.value());\n>> -}\n>> -\n>>  REGISTER_IPA_ALGORITHM(Lut, \"Lut\")\n>>  \n>>  } /* namespace ipa::soft::algorithms */\n>> diff --git a/src/ipa/simple/algorithms/lut.h b/src/ipa/simple/algorithms/lut.h\n>> index 0eafd0695..ad16d1e8e 100644\n>> --- a/src/ipa/simple/algorithms/lut.h\n>> +++ b/src/ipa/simple/algorithms/lut.h\n>> @@ -19,22 +19,11 @@ public:\n>>         Lut() = default;\n>>         ~Lut() = default;\n>>  \n>> -       int init(IPAContext &context, const YamlObject &tuningData) override;\n>>         int configure(IPAContext &context, const IPAConfigInfo &configInfo) override;\n>> -       void queueRequest(typename Module::Context &context,\n>> -                         const uint32_t frame,\n>> -                         typename Module::FrameContext &frameContext,\n>> -                         const ControlList &controls)\n>> -               override;\n>>         void prepare(IPAContext &context,\n>>                      const uint32_t frame,\n>>                      IPAFrameContext &frameContext,\n>>                      DebayerParams *params) override;\n>> -       void process(IPAContext &context,\n>> -                    const uint32_t frame,\n>> -                    IPAFrameContext &frameContext,\n>> -                    const SwIspStats *stats,\n>> -                    ControlList &metadata) override;\n>>  \n>>  private:\n>>         void updateGammaTable(IPAContext &context);\n>> -- \n>> 2.51.1\n>>","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 CE65FC3263\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 13 Nov 2025 14:44:17 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id B042460A80;\n\tThu, 13 Nov 2025 15:44:16 +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 7F5B060805\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 13 Nov 2025 15:44:15 +0100 (CET)","from mail-wm1-f69.google.com (mail-wm1-f69.google.com\n\t[209.85.128.69]) by relay.mimecast.com with ESMTP with STARTTLS\n\t(version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id\n\tus-mta-391-evVFWg-DMpaGjfqzQw3cGw-1; Thu, 13 Nov 2025 09:44:12 -0500","by mail-wm1-f69.google.com with SMTP id\n\t5b1f17b1804b1-47106720618so13492075e9.1\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 13 Nov 2025 06:44:12 -0800 (PST)","from mzamazal-thinkpadp1gen7.tpbc.csb\n\t(ip-77-48-47-2.net.vodafone.cz. [77.48.47.2])\n\tby smtp.gmail.com with ESMTPSA id\n\t5b1f17b1804b1-47787e953e3sm93043835e9.14.2025.11.13.06.44.09\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tThu, 13 Nov 2025 06:44:10 -0800 (PST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=redhat.com header.i=@redhat.com\n\theader.b=\"FXfuEdHG\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1763045054;\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=EUmZ+9pDdeoUuBFrSmLHwLVCKKWL7lBIfGk+BJbYx+Y=;\n\tb=FXfuEdHGF6/r2ZxjnsfL1B9UZQGLDXriCOYhsxyeVEP2hTq4rMdOUFwsHmKGDoZACJYwnF\n\tqKDGgq4XCWfRPSFhOOCGMIPMeggJN8E7sKkwfbKxuidQ/v3oDN0aj+X0ZkoHlRqDHJnMG8\n\tzq+iXAJZSLfICPWw9RFoKnsaFFNX2Is=","X-MC-Unique":"evVFWg-DMpaGjfqzQw3cGw-1","X-Mimecast-MFC-AGG-ID":"evVFWg-DMpaGjfqzQw3cGw_1763045052","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20230601; t=1763045051; x=1763649851;\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=EUmZ+9pDdeoUuBFrSmLHwLVCKKWL7lBIfGk+BJbYx+Y=;\n\tb=vM6PRYDMReZUPSixUjpPU8q6CPkU9Nsnuk/C5i5Z4L5maxEwBLEzg4BFoqaJsu8q+3\n\tmoQHSX3oir+8G0OIQ4sV7UeQs6tQGPWQ8YBBalw9VVfupUAC8dqwFId3cSKjHH9aXHTW\n\t5a23L+B6agZTee4PgQJ3HpVVLrQhsQBU4OjUvJE/nUDOG0OeNdjO3WmLfhq2WAyK9q1d\n\t8wApbVqC+4MzMaMKl8imil+GooAWdzeG7tVdHAECaCvNvF8gf6Zvzx7/qiIsR7ga6lIU\n\tlExH9xCkfyOC1HLCr7sj36Nxc55Tup4txUJNiGqMzBj0nNyyt4g6/rHUOcNMZ67Kf9By\n\tHosg==","X-Gm-Message-State":"AOJu0Ywz3GZ72lz1Op5GSlqciqu1huCNalg9N/3Mt3YMv9co6kCEXfGB\n\tnTWTVRAjLsDqZbjrhg1e5D8LZiwNtbeUwyYFh2DUyy537f3XikC54U/jKq4WzTKoY54d6zI9IPK\n\tbEECh+2jntv/HrY78lNHWyQBbWZcnwIHMiqX/eQlby4+El8w4DLFFCbZopdTLEL8MDwkQiN17Z6\n\t+g1aAwEOU6GSqdiZ1OvQLaxslc9YCtNgfoPqlIFTfbjK4JOGFdvAu2CCUj2dM=","X-Gm-Gg":"ASbGncvr88IMwhssQk/ZmFfQVF0GA7r4gsM+JmcWoakoA4gUdQOtTJTUBmlJLXR0CxK\n\tuOUGWcN7i78wbgNPHjcyWt+VXiyAkY1GxufSOWV9AZ3DiZKSWqPCsJnLyt4suhHiXz4eicgWuxA\n\tLLO6pCITqwgEJuxu2bMPvfzFpRSpqb4OHMUOGI+71WYazxHoKFW5MCogMpc10FDr/38/G92Rxva\n\tjuzI2BgHguKc1ciFh5U7r/rMkwjBKRhF3hemwD09aBVy/MOv+UGGTqUjnIeSMG8h2A0rz6xO/x3\n\t+waiWdOlLCfS1SAXkAP3m0TNbl2JmtY2xYdpMBEl2oVYWU+cmVlaBP28Ami/8sLMYYW5X/Dzdkw\n\tWl9LhpJ1Fki5ORlEP4Gt/9fMK8pl2YN5Wh94L8s0yF1jQhMqLpsh6","X-Received":["by 2002:a05:600c:6289:b0:471:56:6f79 with SMTP id\n\t5b1f17b1804b1-477870bccf4mr62459585e9.41.1763045051152; \n\tThu, 13 Nov 2025 06:44:11 -0800 (PST)","by 2002:a05:600c:6289:b0:471:56:6f79 with SMTP id\n\t5b1f17b1804b1-477870bccf4mr62459175e9.41.1763045050574; \n\tThu, 13 Nov 2025 06:44:10 -0800 (PST)"],"X-Google-Smtp-Source":"AGHT+IENdwHcsbwEp3beX8XxQydA55y0DLkqzytZoOaYMxPKhpA5XGIYaLNe0Ou9NP9uVtyBHdgBHA==","From":"Milan Zamazal <mzamazal@redhat.com>","To":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Subject":"Re: [RFC PATCH 7/7] libcamera: ipa: simple: Move contrast settings\n\tto adjust.cpp","In-Reply-To":"<176294289787.567526.2996598450909386784@ping.linuxembedded.co.uk>\n\t(Kieran Bingham's message of \"Wed, 12 Nov 2025 10:21:37 +0000\")","References":"<20251112082715.17823-1-mzamazal@redhat.com>\n\t<20251112082715.17823-8-mzamazal@redhat.com>\n\t<176294289787.567526.2996598450909386784@ping.linuxembedded.co.uk>","Date":"Thu, 13 Nov 2025 15:44:09 +0100","Message-ID":"<85o6p60z7q.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":"H7b1KrwG9wdmFm2VoX2Q6wShD68ouA_X6B7vyGxl71U_1763045052","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>"}}]