[{"id":39144,"web_url":"https://patchwork.libcamera.org/comment/39144/","msgid":"<178163539358.3598163.5422821443139582348@ping.linuxembedded.co.uk>","date":"2026-06-16T18:43:13","subject":"Re: [PATCH 08/10] ipa: rkisp1: goc: Re-work to use GammaAlgorithm\n\tclass","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Quoting Daniel Scally (2026-06-16 07:41:42)\n> Re-work the RkISP1 Gamma Out Correction algorithm to use the new\n> GammaAlgorithm class from libipa, which allows us to share an\n> implementation with the other IPAs.\n> \n> Signed-off-by: Daniel Scally <dan.scally@ideasonboard.com>\n> ---\n>  src/ipa/rkisp1/algorithms/goc.cpp | 49 +++++++++++----------------------------\n>  src/ipa/rkisp1/algorithms/goc.h   |  5 +++-\n>  src/ipa/rkisp1/ipa_context.h      | 10 +++-----\n>  3 files changed, 21 insertions(+), 43 deletions(-)\n> \n> diff --git a/src/ipa/rkisp1/algorithms/goc.cpp b/src/ipa/rkisp1/algorithms/goc.cpp\n> index e8f64bf3d5e028c2013d37b7ef9fe90b737fad5f..1afd7fb9538d85f771c5b743b856a4963ec8665c 100644\n> --- a/src/ipa/rkisp1/algorithms/goc.cpp\n> +++ b/src/ipa/rkisp1/algorithms/goc.cpp\n> @@ -9,7 +9,7 @@\n>  #include <cmath>\n>  \n>  #include <libcamera/base/log.h>\n> -#include <libcamera/base/utils.h>\n> +#include <libcamera/base/span.h>\n>  \n>  #include <libcamera/control_ids.h>\n>  \n> @@ -44,6 +44,7 @@ namespace ipa::rkisp1::algorithms {\n>  LOG_DEFINE_CATEGORY(RkISP1Gamma)\n>  \n>  const float kDefaultGamma = 2.2f;\n> +static constexpr unsigned int kNumLutSegments = RKISP1_CIF_ISP_GAMMA_OUT_MAX_SAMPLES_V10 - 1;\n>  \n>  /**\n>   * \\copydoc libcamera::ipa::Algorithm::init\n> @@ -57,10 +58,12 @@ int GammaOutCorrection::init(IPAContext &context, const ValueNode &tuningData)\n>                 return -EINVAL;\n>         }\n>  \n> -       defaultGamma_ = tuningData[\"gamma\"].get<double>(kDefaultGamma);\n> -       context.ctrlMap[&controls::Gamma] = ControlInfo(0.1f, 10.0f, defaultGamma_);\n> +       std::array<unsigned int, kNumLutSegments> segments = {\n> +                64,  64,  64,  64, 128, 128, 128, 128,\n> +               256, 256, 256, 512, 512, 512, 512, 512\n> +       };\n>  \n> -       return 0;\n> +       return gammaAlgo_.init(context.ctrlMap, tuningData, segments);\n>  }\n>  \n>  /**\n> @@ -69,7 +72,7 @@ int GammaOutCorrection::init(IPAContext &context, const ValueNode &tuningData)\n>  int GammaOutCorrection::configure(IPAContext &context,\n>                                   [[maybe_unused]] const IPACameraSensorInfo &configInfo)\n>  {\n> -       context.activeState.goc.gamma = defaultGamma_;\n> +       gammaAlgo_.configure(context.activeState.gamma);\n>         return 0;\n>  }\n>  \n> @@ -80,17 +83,8 @@ void GammaOutCorrection::queueRequest(IPAContext &context, const uint32_t frame,\n>                                       IPAFrameContext &frameContext,\n>                                       const ControlList &controls)\n>  {\n> -       if (frame == 0)\n> -               frameContext.goc.update = true;\n> -\n> -       const auto &gamma = controls.get(controls::Gamma);\n> -       if (gamma) {\n> -               context.activeState.goc.gamma = *gamma;\n> -               frameContext.goc.update = true;\n> -               LOG(RkISP1Gamma, Debug) << \"Set gamma to \" << *gamma;\n> -       }\n> -\n> -       frameContext.goc.gamma = context.activeState.goc.gamma;\n> +       gammaAlgo_.queueRequest(context.activeState.gamma, frame,\n> +                               frameContext.gamma, controls);\n>  }\n>  \n>  /**\n> @@ -104,29 +98,14 @@ void GammaOutCorrection::prepare(IPAContext &context,\n>         ASSERT(context.hw.numGammaOutSamples ==\n>                RKISP1_CIF_ISP_GAMMA_OUT_MAX_SAMPLES_V10);\n>  \n> -       if (!frameContext.goc.update)\n> +       if (!frameContext.gamma.update)\n>                 return;\n>  \n> -       /*\n> -        * The logarithmic segments as specified in the reference.\n> -        * Plus an additional 0 to make the loop easier\n> -        */\n> -       static constexpr std::array<unsigned int, RKISP1_CIF_ISP_GAMMA_OUT_MAX_SAMPLES_V10> segments = {\n> -               64, 64, 64, 64, 128, 128, 128, 128, 256,\n> -               256, 256, 512, 512, 512, 512, 512, 0\n> -       };\n> -\n>         auto config = params->block<BlockType::Goc>();\n>         config.setEnabled(true);\n>  \n> -       __u16 *gamma_y = config->gamma_y;\n> -\n> -       unsigned x = 0;\n> -       for (const auto [i, size] : utils::enumerate(segments)) {\n> -               gamma_y[i] = std::pow(x / 4096.0, 1.0 / frameContext.goc.gamma) * 1023.0;\n> -               x += size;\n> -       }\n> -\n> +       Span<uint16_t> lut{ config->gamma_y };\n> +       gammaAlgo_.prepare(frameContext.gamma, lut);\n>         config->mode = RKISP1_CIF_ISP_GOC_MODE_LOGARITHMIC;\n>  }\n>  \n> @@ -139,7 +118,7 @@ void GammaOutCorrection::process([[maybe_unused]] IPAContext &context,\n>                                  [[maybe_unused]] const rkisp1_stat_buffer *stats,\n>                                  ControlList &metadata)\n>  {\n> -       metadata.set(controls::Gamma, frameContext.goc.gamma);\n> +       gammaAlgo_.process(frameContext.gamma, metadata);\n>  }\n>  \n>  REGISTER_IPA_ALGORITHM(GammaOutCorrection, \"GammaOutCorrection\")\n> diff --git a/src/ipa/rkisp1/algorithms/goc.h b/src/ipa/rkisp1/algorithms/goc.h\n> index bd79fe19cc86b8aefa2603e98e9d7130b44105d9..f7059d206c935fa72195f36091cf953e5f2413e1 100644\n> --- a/src/ipa/rkisp1/algorithms/goc.h\n> +++ b/src/ipa/rkisp1/algorithms/goc.h\n> @@ -9,6 +9,9 @@\n>  \n>  #include \"algorithm.h\"\n>  \n> +#include <libipa/fixedpoint.h>\n> +#include <libipa/gamma.h>\n> +\n>  namespace libcamera {\n>  \n>  namespace ipa::rkisp1::algorithms {\n> @@ -35,7 +38,7 @@ public:\n>                      ControlList &metadata) override;\n>  \n>  private:\n> -       float defaultGamma_;\n> +       GammaAlgorithm<RKISP1_CIF_ISP_GAMMA_OUT_MAX_SAMPLES_V10, UQ<0, 10>> gammaAlgo_;\n\nQ and UQ seemed to hurt so much making them - so I'm /really/ glad to\nsee how useful they're becoming as a way to convey units and precision\nthrough these types.\n\n\n\n>  };\n>  \n>  } /* namespace ipa::rkisp1::algorithms */\n> diff --git a/src/ipa/rkisp1/ipa_context.h b/src/ipa/rkisp1/ipa_context.h\n> index 005f4102b4f6d465fd370c20060331a4f3b3a943..03be79085052d5161ec57d97fe9600f4bf7e93c4 100644\n> --- a/src/ipa/rkisp1/ipa_context.h\n> +++ b/src/ipa/rkisp1/ipa_context.h\n> @@ -30,6 +30,7 @@\n>  #include \"libipa/ccm.h\"\n>  #include \"libipa/fc_queue.h\"\n>  #include \"libipa/fixedpoint.h\"\n> +#include \"libipa/gamma.h\"\n>  #include \"libipa/lsc.h\"\n>  \n>  namespace libcamera {\n> @@ -124,9 +125,7 @@ struct IPAActiveState {\n>                 uint8_t sharpness;\n>         } filter;\n>  \n> -       struct {\n> -               double gamma;\n> -       } goc;\n> +       ipa::gamma::ActiveState gamma;\n>  \n>         struct {\n>                 double lux;\n> @@ -190,10 +189,7 @@ struct IPAFrameContext : public FrameContext {\n>                 bool update;\n>         } filter;\n>  \n> -       struct {\n> -               double gamma;\n> -               bool update;\n> -       } goc;\n> +       ipa::gamma::FrameContext gamma;\n\nOh, I'm at the bottom already.\n\nWell that was easy ... \n\nReviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n\n>  \n>         struct {\n>                 uint32_t exposure;\n> \n> -- \n> 2.43.0\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 9EE26C3261\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 16 Jun 2026 18:43:19 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id A9642626F4;\n\tTue, 16 Jun 2026 20:43:18 +0200 (CEST)","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 E3EDA623CC\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 16 Jun 2026 20:43:16 +0200 (CEST)","from monstersaurus.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 1DB842EC;\n\tTue, 16 Jun 2026 20:42:43 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"PsszBtY7\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1781635363;\n\tbh=dhaCHZ0wRCRci5cRxr+nQCqpviJ12ldoGwrUvuwR/2A=;\n\th=In-Reply-To:References:Subject:From:Cc:To:Date:From;\n\tb=PsszBtY7PKDACNslG7XfPB5ZJ+arbkhodWz4t2yKML1cPUrpcJn4U3HuvHNPcVpMA\n\t7c+90unruXCCJfIMvEPfzVER5MwaFD4QU3yAO5JcjNmtsxKb/kjrWvStEzAE51XFAc\n\tlEiivqS4UBVNfNX/wMljLvxyA4RMJrKVVT0x2fJk=","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<20260616-ipu3-libipa-rework-v1-8-d4448b54f1d8@ideasonboard.com>","References":"<20260616-ipu3-libipa-rework-v1-0-d4448b54f1d8@ideasonboard.com>\n\t<20260616-ipu3-libipa-rework-v1-8-d4448b54f1d8@ideasonboard.com>","Subject":"Re: [PATCH 08/10] ipa: rkisp1: goc: Re-work to use GammaAlgorithm\n\tclass","From":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Cc":"Daniel Scally <dan.scally@ideasonboard.com>","To":"Daniel Scally <dan.scally@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","Date":"Tue, 16 Jun 2026 19:43:13 +0100","Message-ID":"<178163539358.3598163.5422821443139582348@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":39156,"web_url":"https://patchwork.libcamera.org/comment/39156/","msgid":"<ajJuNrO_BKeSaWX9@zed>","date":"2026-06-17T09:53:39","subject":"Re: [PATCH 08/10] ipa: rkisp1: goc: Re-work to use GammaAlgorithm\n\tclass","submitter":{"id":143,"url":"https://patchwork.libcamera.org/api/people/143/","name":"Jacopo Mondi","email":"jacopo.mondi@ideasonboard.com"},"content":"Hi Dan\n\nOn Tue, Jun 16, 2026 at 07:41:42AM +0100, Daniel Scally wrote:\n> Re-work the RkISP1 Gamma Out Correction algorithm to use the new\n> GammaAlgorithm class from libipa, which allows us to share an\n> implementation with the other IPAs.\n>\n> Signed-off-by: Daniel Scally <dan.scally@ideasonboard.com>\n> ---\n>  src/ipa/rkisp1/algorithms/goc.cpp | 49 +++++++++++----------------------------\n>  src/ipa/rkisp1/algorithms/goc.h   |  5 +++-\n>  src/ipa/rkisp1/ipa_context.h      | 10 +++-----\n>  3 files changed, 21 insertions(+), 43 deletions(-)\n>\n> diff --git a/src/ipa/rkisp1/algorithms/goc.cpp b/src/ipa/rkisp1/algorithms/goc.cpp\n> index e8f64bf3d5e028c2013d37b7ef9fe90b737fad5f..1afd7fb9538d85f771c5b743b856a4963ec8665c 100644\n> --- a/src/ipa/rkisp1/algorithms/goc.cpp\n> +++ b/src/ipa/rkisp1/algorithms/goc.cpp\n> @@ -9,7 +9,7 @@\n>  #include <cmath>\n>\n>  #include <libcamera/base/log.h>\n> -#include <libcamera/base/utils.h>\n> +#include <libcamera/base/span.h>\n>\n>  #include <libcamera/control_ids.h>\n>\n> @@ -44,6 +44,7 @@ namespace ipa::rkisp1::algorithms {\n\nI think the comment\n\n/**\n * \\class GammaOutCorrection\n * \\brief RkISP1 Gamma out correction\n *\n * This algorithm implements the gamma out curve for the RkISP1. It defaults to\n * a gamma value of 2.2.\n *\n * As gamma is internally represented as a piecewise linear function with only\n * 17 knots, the difference between gamma=2.2 and sRGB gamma is minimal.\n * Therefore sRGB gamma was not implemented as special case.\n *\n * Useful links:\n * - https://www.cambridgeincolour.com/tutorials/gamma-correction.htm\n * - https://en.wikipedia.org/wiki/SRGB\n */\n\nCan now be simplified/dropped\n\n>  LOG_DEFINE_CATEGORY(RkISP1Gamma)\n>\n>  const float kDefaultGamma = 2.2f;\n> +static constexpr unsigned int kNumLutSegments = RKISP1_CIF_ISP_GAMMA_OUT_MAX_SAMPLES_V10 - 1;\n>\n>  /**\n>   * \\copydoc libcamera::ipa::Algorithm::init\n> @@ -57,10 +58,12 @@ int GammaOutCorrection::init(IPAContext &context, const ValueNode &tuningData)\n>  \t\treturn -EINVAL;\n>  \t}\n>\n> -\tdefaultGamma_ = tuningData[\"gamma\"].get<double>(kDefaultGamma);\n> -\tcontext.ctrlMap[&controls::Gamma] = ControlInfo(0.1f, 10.0f, defaultGamma_);\n> +\tstd::array<unsigned int, kNumLutSegments> segments = {\n> +\t\t 64,  64,  64,  64, 128, 128, 128, 128,\n> +\t\t256, 256, 256, 512, 512, 512, 512, 512\n> +\t};\n>\n> -\treturn 0;\n> +\treturn gammaAlgo_.init(context.ctrlMap, tuningData, segments);\n>  }\n>\n>  /**\n> @@ -69,7 +72,7 @@ int GammaOutCorrection::init(IPAContext &context, const ValueNode &tuningData)\n>  int GammaOutCorrection::configure(IPAContext &context,\n>  \t\t\t\t  [[maybe_unused]] const IPACameraSensorInfo &configInfo)\n>  {\n> -\tcontext.activeState.goc.gamma = defaultGamma_;\n> +\tgammaAlgo_.configure(context.activeState.gamma);\n>  \treturn 0;\n>  }\n>\n> @@ -80,17 +83,8 @@ void GammaOutCorrection::queueRequest(IPAContext &context, const uint32_t frame,\n>  \t\t\t\t      IPAFrameContext &frameContext,\n>  \t\t\t\t      const ControlList &controls)\n>  {\n> -\tif (frame == 0)\n> -\t\tframeContext.goc.update = true;\n> -\n> -\tconst auto &gamma = controls.get(controls::Gamma);\n> -\tif (gamma) {\n> -\t\tcontext.activeState.goc.gamma = *gamma;\n> -\t\tframeContext.goc.update = true;\n> -\t\tLOG(RkISP1Gamma, Debug) << \"Set gamma to \" << *gamma;\n> -\t}\n> -\n> -\tframeContext.goc.gamma = context.activeState.goc.gamma;\n> +\tgammaAlgo_.queueRequest(context.activeState.gamma, frame,\n> +\t\t\t\tframeContext.gamma, controls);\n>  }\n>\n>  /**\n> @@ -104,29 +98,14 @@ void GammaOutCorrection::prepare(IPAContext &context,\n>  \tASSERT(context.hw.numGammaOutSamples ==\n>  \t       RKISP1_CIF_ISP_GAMMA_OUT_MAX_SAMPLES_V10);\n>\n> -\tif (!frameContext.goc.update)\n> +\tif (!frameContext.gamma.update)\n>  \t\treturn;\n>\n> -\t/*\n> -\t * The logarithmic segments as specified in the reference.\n> -\t * Plus an additional 0 to make the loop easier\n> -\t */\n> -\tstatic constexpr std::array<unsigned int, RKISP1_CIF_ISP_GAMMA_OUT_MAX_SAMPLES_V10> segments = {\n> -\t\t64, 64, 64, 64, 128, 128, 128, 128, 256,\n> -\t\t256, 256, 512, 512, 512, 512, 512, 0\n> -\t};\n> -\n>  \tauto config = params->block<BlockType::Goc>();\n>  \tconfig.setEnabled(true);\n>\n> -\t__u16 *gamma_y = config->gamma_y;\n> -\n> -\tunsigned x = 0;\n> -\tfor (const auto [i, size] : utils::enumerate(segments)) {\n> -\t\tgamma_y[i] = std::pow(x / 4096.0, 1.0 / frameContext.goc.gamma) * 1023.0;\n> -\t\tx += size;\n> -\t}\n> -\n> +\tSpan<uint16_t> lut{ config->gamma_y };\n> +\tgammaAlgo_.prepare(frameContext.gamma, lut);\n>  \tconfig->mode = RKISP1_CIF_ISP_GOC_MODE_LOGARITHMIC;\n>  }\n>\n> @@ -139,7 +118,7 @@ void GammaOutCorrection::process([[maybe_unused]] IPAContext &context,\n>  \t\t\t\t [[maybe_unused]] const rkisp1_stat_buffer *stats,\n>  \t\t\t\t ControlList &metadata)\n>  {\n> -\tmetadata.set(controls::Gamma, frameContext.goc.gamma);\n> +\tgammaAlgo_.process(frameContext.gamma, metadata);\n>  }\n>\n>  REGISTER_IPA_ALGORITHM(GammaOutCorrection, \"GammaOutCorrection\")\n> diff --git a/src/ipa/rkisp1/algorithms/goc.h b/src/ipa/rkisp1/algorithms/goc.h\n> index bd79fe19cc86b8aefa2603e98e9d7130b44105d9..f7059d206c935fa72195f36091cf953e5f2413e1 100644\n> --- a/src/ipa/rkisp1/algorithms/goc.h\n> +++ b/src/ipa/rkisp1/algorithms/goc.h\n> @@ -9,6 +9,9 @@\n>\n>  #include \"algorithm.h\"\n>\n> +#include <libipa/fixedpoint.h>\n> +#include <libipa/gamma.h>\n> +\n\nSame comment as per the previous patch: please check headers\n\n>  namespace libcamera {\n>\n>  namespace ipa::rkisp1::algorithms {\n> @@ -35,7 +38,7 @@ public:\n>  \t\t     ControlList &metadata) override;\n>\n>  private:\n> -\tfloat defaultGamma_;\n> +\tGammaAlgorithm<RKISP1_CIF_ISP_GAMMA_OUT_MAX_SAMPLES_V10, UQ<0, 10>> gammaAlgo_;\n>  };\n>\n>  } /* namespace ipa::rkisp1::algorithms */\n> diff --git a/src/ipa/rkisp1/ipa_context.h b/src/ipa/rkisp1/ipa_context.h\n> index 005f4102b4f6d465fd370c20060331a4f3b3a943..03be79085052d5161ec57d97fe9600f4bf7e93c4 100644\n> --- a/src/ipa/rkisp1/ipa_context.h\n> +++ b/src/ipa/rkisp1/ipa_context.h\n> @@ -30,6 +30,7 @@\n>  #include \"libipa/ccm.h\"\n>  #include \"libipa/fc_queue.h\"\n>  #include \"libipa/fixedpoint.h\"\n> +#include \"libipa/gamma.h\"\n>  #include \"libipa/lsc.h\"\n>\n>  namespace libcamera {\n> @@ -124,9 +125,7 @@ struct IPAActiveState {\n>  \t\tuint8_t sharpness;\n>  \t} filter;\n>\n> -\tstruct {\n> -\t\tdouble gamma;\n> -\t} goc;\n> +\tipa::gamma::ActiveState gamma;\n>\n>  \tstruct {\n>  \t\tdouble lux;\n> @@ -190,10 +189,7 @@ struct IPAFrameContext : public FrameContext {\n>  \t\tbool update;\n>  \t} filter;\n>\n> -\tstruct {\n> -\t\tdouble gamma;\n> -\t\tbool update;\n> -\t} goc;\n> +\tipa::gamma::FrameContext gamma;\n>\n>  \tstruct {\n>  \t\tuint32_t exposure;\n>\n\nAll minors\nReviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>\n\n> --\n> 2.43.0\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 56DEEC3261\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 17 Jun 2026 09:53:46 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 6580562886;\n\tWed, 17 Jun 2026 11:53:45 +0200 (CEST)","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 2A32D60579\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 17 Jun 2026 11:53:44 +0200 (CEST)","from ideasonboard.com (mob-109-113-4-199.net.vodafone.it\n\t[109.113.4.199])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id A73052F8;\n\tWed, 17 Jun 2026 11:53:09 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"qvNNPUEJ\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1781689990;\n\tbh=chQqS/wjH2O4azj22d6cJ3fAaGFRq55Ja7pYFRnGFcw=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=qvNNPUEJzHX7SOkZGWQde0UE1x5PtotmLk8h9yQpFQNTB0nz6bw5Slmg6UlDNbDZD\n\teIIvz0W+MxE9iblSNBe+VgJa+EwgtxVnlYzapvWeYBs64nuHyUOg/10gRMdIlkRtsz\n\tGXXtDvVdmQTlpmvAPlvnbgCChHJ0uMD/WeRTFTE4=","Date":"Wed, 17 Jun 2026 11:53:39 +0200","From":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>","To":"Daniel Scally <dan.scally@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Subject":"Re: [PATCH 08/10] ipa: rkisp1: goc: Re-work to use GammaAlgorithm\n\tclass","Message-ID":"<ajJuNrO_BKeSaWX9@zed>","References":"<20260616-ipu3-libipa-rework-v1-0-d4448b54f1d8@ideasonboard.com>\n\t<20260616-ipu3-libipa-rework-v1-8-d4448b54f1d8@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20260616-ipu3-libipa-rework-v1-8-d4448b54f1d8@ideasonboard.com>","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>"}}]