[{"id":29598,"web_url":"https://patchwork.libcamera.org/comment/29598/","msgid":"<171641761583.2920551.16350904175419447682@ping.linuxembedded.co.uk>","date":"2024-05-22T22:40:15","subject":"Re: [PATCH v2 1/4] ipa: rkisp1: Add gamma algorithm","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Quoting Stefan Klug (2024-05-22 15:54:35)\n> Add a gamma algorithm for the rkisp1. It defaults to a gamma of 2.2 which\n> closely resembles sRGB.  No seperate sRGB mode was implemented because the pwl\n> that models the gamma curve is so coarse that there is basically no difference\n> between srgb and gamma=2.2\n> \n> The gamma algorithm is not enabled by default. This will be done in future\n> tuning file updates.\n> \n> Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>\n> ---\n> \n> Note:\n> \n> This patch breaks the naming conventions. It is implemented inside goc.h/cpp\n> because the hardware block and params inside the rkisp1 are called \"goc\". The\n> class itself is called Gamma, and the algorithm is registered with the name\n> \"Gamma\". The idea was that similar functionalities should be named the same\n> inside the tuning files (even among multipe isps).  It still feels a bit\n> awkward. So thoughts are welcome :-)\n> \n> \n> v1 -> v2:\n> - fixed some style issues\n> - fail in case of a V12 isp\n> \n>  src/ipa/rkisp1/algorithms/goc.cpp     | 100 ++++++++++++++++++++++++++\n>  src/ipa/rkisp1/algorithms/goc.h       |  32 +++++++++\n>  src/ipa/rkisp1/algorithms/meson.build |   1 +\n>  3 files changed, 133 insertions(+)\n>  create mode 100644 src/ipa/rkisp1/algorithms/goc.cpp\n>  create mode 100644 src/ipa/rkisp1/algorithms/goc.h\n> \n> diff --git a/src/ipa/rkisp1/algorithms/goc.cpp b/src/ipa/rkisp1/algorithms/goc.cpp\n> new file mode 100644\n> index 00000000..6f313820\n> --- /dev/null\n> +++ b/src/ipa/rkisp1/algorithms/goc.cpp\n> @@ -0,0 +1,100 @@\n> +/* SPDX-License-Identifier: LGPL-2.1-or-later */\n> +/*\n> + * Copyright (C) 2024, Ideas On Board\n> + *\n> + * RkISP1 Gamma out control\n> + */\n> +#include \"goc.h\"\n> +\n> +#include <cmath>\n> +\n> +#include <libcamera/base/log.h>\n> +#include <libcamera/base/utils.h>\n> +\n> +#include \"libcamera/internal/yaml_parser.h\"\n> +\n> +#include \"linux/rkisp1-config.h\"\n> +\n> +/**\n> + * \\file goc.h\n> + */\n> +\n> +namespace libcamera {\n> +\n> +namespace ipa::rkisp1::algorithms {\n> +\n> +/**\n> + * \\class Gamma\n> + * \\brief RkISP1 Gamma out control\n> + *\n> + * This algorithm implements the gamma out curve for the RkISP1.\n> + * It defaults to a gamma value of 2.2\n> + * As gamma is internally represented as a piecewise linear function with only\n> + * 16 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> +\n> +LOG_DEFINE_CATEGORY(RkISP1Gamma)\n> +\n> +Gamma::Gamma()\n> +{\n> +}\n\nI see this and think why not = default ... but I see it gets updated\nlater ...\n\n> +\n> +/**\n> + * \\copydoc libcamera::ipa::Algorithm::init\n> + */\n> +int Gamma::init([[maybe_unused]] IPAContext &context,\n> +               [[maybe_unused]] const YamlObject &tuningData)\n> +{\n> +       if (context.hw->numGammaOutSamples !=\n> +           RKISP1_CIF_ISP_GAMMA_OUT_MAX_SAMPLES_V10) {\n> +               LOG(RkISP1Gamma, Error)\n> +                       << \"Gamma is not implemented for RkISP1 V12\";\n> +               return -EINVAL;\n> +       }\n> +\n> +       return 0;\n> +}\n> +\n> +/**\n> + * \\copydoc libcamera::ipa::Algorithm::prepare\n> + */\n> +void Gamma::prepare([[maybe_unused]] IPAContext &context,\n> +                   const uint32_t frame,\n> +                   [[maybe_unused]] IPAFrameContext &frameContext,\n> +                   rkisp1_params_cfg *params)\n> +{\n> +       /* The logarithmic segments as specified in the reference.\n\n\t/*\n\t * nit: multiline comments have an empty first and last\n\t * line for the leading '/*' and trailing '*/'\n\t */\n\n> +        * Plus an additional 0 to make the loop easier\n> +        */\n> +       int segments[] = { 64, 64, 64, 64, 128, 128, 128, 128, 256, 256, 256,\n> +                          512, 512, 512, 512, 512, 0 };\n> +       auto gamma_y = params->others.goc_config.gamma_y;\n> +\n> +       ASSERT(context.hw->numGammaOutSamples ==\n> +              RKISP1_CIF_ISP_GAMMA_OUT_MAX_SAMPLES_V10);\n> +\n> +       if (frame > 0)\n> +               return;\n> +\n> +       int x = 0;\n> +       for (unsigned i = 0; i < context.hw->numGammaOutSamples; i++) {\n> +               gamma_y[i] = std::pow(x / 4096.0, 1.0 / gamma_) * 1023.0;\n> +               x += segments[i];\n> +       }\n> +\n> +       params->others.goc_config.mode = RKISP1_CIF_ISP_GOC_MODE_LOGARITHMIC;\n> +       params->module_en_update |= RKISP1_CIF_ISP_MODULE_GOC;\n> +       params->module_ens |= RKISP1_CIF_ISP_MODULE_GOC;\n> +       params->module_cfg_update |= RKISP1_CIF_ISP_MODULE_GOC;\n> +}\n> +\n> +REGISTER_IPA_ALGORITHM(Gamma, \"Gamma\")\n> +\n> +} /* namespace ipa::rkisp1::algorithms */\n> +\n> +} /* namespace libcamera */\n> diff --git a/src/ipa/rkisp1/algorithms/goc.h b/src/ipa/rkisp1/algorithms/goc.h\n> new file mode 100644\n> index 00000000..fe7caba3\n> --- /dev/null\n> +++ b/src/ipa/rkisp1/algorithms/goc.h\n> @@ -0,0 +1,32 @@\n> +/* SPDX-License-Identifier: LGPL-2.1-or-later */\n> +/*\n> + * Copyright (C) 2024, Ideas On Board\n> + *\n> + * RkISP1 Gamma out control\n> + */\n> +\n> +#pragma once\n> +\n> +#include \"algorithm.h\"\n> +\n> +namespace libcamera {\n> +\n> +namespace ipa::rkisp1::algorithms {\n> +\n> +class Gamma : public Algorithm\n> +{\n> +public:\n> +       Gamma();\n> +       ~Gamma() = default;\n> +\n> +       int init(IPAContext &context, const YamlObject &tuningData) override;\n> +       void prepare(IPAContext &context, const uint32_t frame,\n> +                    IPAFrameContext &frameContext,\n> +                    rkisp1_params_cfg *params) override;\n> +\n> +private:\n> +       float gamma_ = 2.2;\n> +};\n> +\n> +} /* namespace ipa::rkisp1::algorithms */\n> +} /* namespace libcamera */\n> diff --git a/src/ipa/rkisp1/algorithms/meson.build b/src/ipa/rkisp1/algorithms/meson.build\n> index 93a48329..6ee71a9b 100644\n> --- a/src/ipa/rkisp1/algorithms/meson.build\n> +++ b/src/ipa/rkisp1/algorithms/meson.build\n> @@ -8,6 +8,7 @@ rkisp1_ipa_algorithms = files([\n>      'dpcc.cpp',\n>      'dpf.cpp',\n>      'filter.cpp',\n> +    'goc.cpp',\n>      'gsl.cpp',\n>      'lsc.cpp',\n>  ])\n> -- \n> 2.40.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 BCA92BDE6B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 22 May 2024 22:40:29 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id E42606349B;\n\tThu, 23 May 2024 00:40:27 +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 A6E7361A55\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 23 May 2024 00:40:19 +0200 (CEST)","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 78666475;\n\tThu, 23 May 2024 00:40:06 +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=\"W+A4J7ET\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1716417606;\n\tbh=BlPNyTXISBLjnqC/dmJEZq9oysdtKMohWLaYIi1RI9Y=;\n\th=In-Reply-To:References:Subject:From:Cc:To:Date:From;\n\tb=W+A4J7ETW6v2p1SxCxslOddEHgRFF5w8wF3WYdl6L/Pmk4y8LBknDcDh8Cd3qqMik\n\t/L0Q0R0YThe4Xb/N+3btggj+w3+nZJcI8Dp103D8tpGP4y81EyV559eBGwXdwOffaK\n\tTtN3EPgrq4SMUwMir9HCzOn2aLxvVHM1xLFNxHZ0=","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<20240522145438.436688-2-stefan.klug@ideasonboard.com>","References":"<20240522145438.436688-1-stefan.klug@ideasonboard.com>\n\t<20240522145438.436688-2-stefan.klug@ideasonboard.com>","Subject":"Re: [PATCH v2 1/4] ipa: rkisp1: Add gamma algorithm","From":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Cc":"Stefan Klug <stefan.klug@ideasonboard.com>","To":"Stefan Klug <stefan.klug@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","Date":"Wed, 22 May 2024 23:40:15 +0100","Message-ID":"<171641761583.2920551.16350904175419447682@ping.linuxembedded.co.uk>","User-Agent":"alot/0.10","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":29603,"web_url":"https://patchwork.libcamera.org/comment/29603/","msgid":"<s2azfbyqn7uotg4cj2ci4hbthk4jfdp7ogwkqdavyfuuu4cl3z@e4iqnvmsr4uj>","date":"2024-05-23T07:47:03","subject":"Re: [PATCH v2 1/4] ipa: rkisp1: Add gamma algorithm","submitter":{"id":143,"url":"https://patchwork.libcamera.org/api/people/143/","name":"Jacopo Mondi","email":"jacopo.mondi@ideasonboard.com"},"content":"Hi Stefan\n\nOn Wed, May 22, 2024 at 11:40:15PM GMT, Kieran Bingham wrote:\n> Quoting Stefan Klug (2024-05-22 15:54:35)\n> > Add a gamma algorithm for the rkisp1. It defaults to a gamma of 2.2 which\n> > closely resembles sRGB.  No seperate sRGB mode was implemented because the pwl\n> > that models the gamma curve is so coarse that there is basically no difference\n> > between srgb and gamma=2.2\n> >\n> > The gamma algorithm is not enabled by default. This will be done in future\n> > tuning file updates.\n> >\n> > Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>\n> > ---\n> >\n> > Note:\n> >\n> > This patch breaks the naming conventions. It is implemented inside goc.h/cpp\n> > because the hardware block and params inside the rkisp1 are called \"goc\". The\n> > class itself is called Gamma, and the algorithm is registered with the name\n> > \"Gamma\". The idea was that similar functionalities should be named the same\n> > inside the tuning files (even among multipe isps).  It still feels a bit\n> > awkward. So thoughts are welcome :-)\n> >\n> >\n> > v1 -> v2:\n> > - fixed some style issues\n> > - fail in case of a V12 isp\n> >\n> >  src/ipa/rkisp1/algorithms/goc.cpp     | 100 ++++++++++++++++++++++++++\n> >  src/ipa/rkisp1/algorithms/goc.h       |  32 +++++++++\n> >  src/ipa/rkisp1/algorithms/meson.build |   1 +\n> >  3 files changed, 133 insertions(+)\n> >  create mode 100644 src/ipa/rkisp1/algorithms/goc.cpp\n> >  create mode 100644 src/ipa/rkisp1/algorithms/goc.h\n> >\n> > diff --git a/src/ipa/rkisp1/algorithms/goc.cpp b/src/ipa/rkisp1/algorithms/goc.cpp\n> > new file mode 100644\n> > index 00000000..6f313820\n> > --- /dev/null\n> > +++ b/src/ipa/rkisp1/algorithms/goc.cpp\n> > @@ -0,0 +1,100 @@\n> > +/* SPDX-License-Identifier: LGPL-2.1-or-later */\n> > +/*\n> > + * Copyright (C) 2024, Ideas On Board\n> > + *\n> > + * RkISP1 Gamma out control\n> > + */\n> > +#include \"goc.h\"\n> > +\n> > +#include <cmath>\n> > +\n> > +#include <libcamera/base/log.h>\n> > +#include <libcamera/base/utils.h>\n> > +\n> > +#include \"libcamera/internal/yaml_parser.h\"\n> > +\n> > +#include \"linux/rkisp1-config.h\"\n> > +\n> > +/**\n> > + * \\file goc.h\n> > + */\n> > +\n> > +namespace libcamera {\n> > +\n> > +namespace ipa::rkisp1::algorithms {\n> > +\n> > +/**\n> > + * \\class Gamma\n> > + * \\brief RkISP1 Gamma out control\n> > + *\n> > + * This algorithm implements the gamma out curve for the RkISP1.\n> > + * It defaults to a gamma value of 2.2\n> > + * As gamma is internally represented as a piecewise linear function with only\n> > + * 16 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> > +\n> > +LOG_DEFINE_CATEGORY(RkISP1Gamma)\n> > +\n> > +Gamma::Gamma()\n> > +{\n> > +}\n>\n> I see this and think why not = default ... but I see it gets updated\n> later ...\n>\n> > +\n> > +/**\n> > + * \\copydoc libcamera::ipa::Algorithm::init\n> > + */\n> > +int Gamma::init([[maybe_unused]] IPAContext &context,\n> > +               [[maybe_unused]] const YamlObject &tuningData)\n> > +{\n> > +       if (context.hw->numGammaOutSamples !=\n> > +           RKISP1_CIF_ISP_GAMMA_OUT_MAX_SAMPLES_V10) {\n> > +               LOG(RkISP1Gamma, Error)\n> > +                       << \"Gamma is not implemented for RkISP1 V12\";\n> > +               return -EINVAL;\n> > +       }\n> > +\n> > +       return 0;\n> > +}\n> > +\n> > +/**\n> > + * \\copydoc libcamera::ipa::Algorithm::prepare\n> > + */\n> > +void Gamma::prepare([[maybe_unused]] IPAContext &context,\n> > +                   const uint32_t frame,\n> > +                   [[maybe_unused]] IPAFrameContext &frameContext,\n> > +                   rkisp1_params_cfg *params)\n> > +{\n> > +       /* The logarithmic segments as specified in the reference.\n>\n> \t/*\n> \t * nit: multiline comments have an empty first and last\n> \t * line for the leading '/*' and trailing '*/'\n> \t */\n>\n> > +        * Plus an additional 0 to make the loop easier\n> > +        */\n> > +       int segments[] = { 64, 64, 64, 64, 128, 128, 128, 128, 256, 256, 256,\n\nAny reason for using int instead of unsigned ?\n\nAlso, this has to have a fixed size which corresponds to\nRKISP1_CIF_ISP_GAMMA_OUT_MAX_SAMPLES_V10. std::array<> is safer in\nthis case\n\n> > +                          512, 512, 512, 512, 512, 0 };\n\nThis gamma curve segmentation only applies if\nISP_GAMMA_OUT_MODE[0] = 0, which is the default. Should this be\nconfigured or do we assume POR value for ISP registers ?\n\n> > +       auto gamma_y = params->others.goc_config.gamma_y;\n> > +\n> > +       ASSERT(context.hw->numGammaOutSamples ==\n> > +              RKISP1_CIF_ISP_GAMMA_OUT_MAX_SAMPLES_V10);\n> > +\n> > +       if (frame > 0)\n> > +               return;\n> > +\n> > +       int x = 0;\n\nAlso this is an unsigned\n\n> > +       for (unsigned i = 0; i < context.hw->numGammaOutSamples; i++) {\n\nAnd if you utils::enumerate(segments) you make sure you can't get out\nof bounds\n\n> > +               gamma_y[i] = std::pow(x / 4096.0, 1.0 / gamma_) * 1023.0;\n\nThis curve uses the same 2.2 gamma and the same segments as the\ndefault programmed gamma curve in the POR register values ?\n\n> > +               x += segments[i];\n> > +       }\n> > +\n> > +       params->others.goc_config.mode = RKISP1_CIF_ISP_GOC_MODE_LOGARITHMIC;\n> > +       params->module_en_update |= RKISP1_CIF_ISP_MODULE_GOC;\n> > +       params->module_ens |= RKISP1_CIF_ISP_MODULE_GOC;\n> > +       params->module_cfg_update |= RKISP1_CIF_ISP_MODULE_GOC;\n> > +}\n> > +\n> > +REGISTER_IPA_ALGORITHM(Gamma, \"Gamma\")\n> > +\n> > +} /* namespace ipa::rkisp1::algorithms */\n> > +\n> > +} /* namespace libcamera */\n> > diff --git a/src/ipa/rkisp1/algorithms/goc.h b/src/ipa/rkisp1/algorithms/goc.h\n> > new file mode 100644\n> > index 00000000..fe7caba3\n> > --- /dev/null\n> > +++ b/src/ipa/rkisp1/algorithms/goc.h\n> > @@ -0,0 +1,32 @@\n> > +/* SPDX-License-Identifier: LGPL-2.1-or-later */\n> > +/*\n> > + * Copyright (C) 2024, Ideas On Board\n> > + *\n> > + * RkISP1 Gamma out control\n> > + */\n> > +\n> > +#pragma once\n> > +\n> > +#include \"algorithm.h\"\n> > +\n> > +namespace libcamera {\n> > +\n> > +namespace ipa::rkisp1::algorithms {\n> > +\n> > +class Gamma : public Algorithm\n> > +{\n> > +public:\n> > +       Gamma();\n> > +       ~Gamma() = default;\n> > +\n> > +       int init(IPAContext &context, const YamlObject &tuningData) override;\n> > +       void prepare(IPAContext &context, const uint32_t frame,\n> > +                    IPAFrameContext &frameContext,\n> > +                    rkisp1_params_cfg *params) override;\n> > +\n> > +private:\n> > +       float gamma_ = 2.2;\n\nthis might be a static constexpr\n\nTo be honest I would make the segments a static constexpr std::array<>\nas they come from the HW (and we can have different ones depending on\nthe HW revision maybe ?)\n\nThanks\n  j\n\n> > +};\n> > +\n> > +} /* namespace ipa::rkisp1::algorithms */\n> > +} /* namespace libcamera */\n> > diff --git a/src/ipa/rkisp1/algorithms/meson.build b/src/ipa/rkisp1/algorithms/meson.build\n> > index 93a48329..6ee71a9b 100644\n> > --- a/src/ipa/rkisp1/algorithms/meson.build\n> > +++ b/src/ipa/rkisp1/algorithms/meson.build\n> > @@ -8,6 +8,7 @@ rkisp1_ipa_algorithms = files([\n> >      'dpcc.cpp',\n> >      'dpf.cpp',\n> >      'filter.cpp',\n> > +    'goc.cpp',\n> >      'gsl.cpp',\n> >      'lsc.cpp',\n> >  ])\n> > --\n> > 2.40.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 76BAABDE6B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 23 May 2024 07:47:13 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 247B863495;\n\tThu, 23 May 2024 09:47:12 +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 3DBBE63482\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 23 May 2024 09:47:07 +0200 (CEST)","from ideasonboard.com (unknown\n\t[IPv6:2001:b07:5d2e:52c9:cc1e:e404:491f:e6ea])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id C6817D01;\n\tThu, 23 May 2024 09:46:53 +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=\"CFlByUks\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1716450413;\n\tbh=Fft3cd86GU4JGFZ7sPTJxM6mzbP+3IwlS86kkSlzMJ8=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=CFlByUkspjmAcdstE5cMtjc123xpccPb6ovcgwP7XzpMnead4d0ZpavhE4BiMApzM\n\t7opD/xbFMPd2eF3oaiGszVyrHDwbc1NqIsmCKyirhCsWJWa5wEjH30Nbb7BGuB3Quk\n\tL78LNUnFV0xzMPHblRgzVCOzO2XDcxyqszUkrkjI=","Date":"Thu, 23 May 2024 09:47:03 +0200","From":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>","To":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Cc":"Stefan Klug <stefan.klug@ideasonboard.com>, \n\tlibcamera-devel@lists.libcamera.org","Subject":"Re: [PATCH v2 1/4] ipa: rkisp1: Add gamma algorithm","Message-ID":"<s2azfbyqn7uotg4cj2ci4hbthk4jfdp7ogwkqdavyfuuu4cl3z@e4iqnvmsr4uj>","References":"<20240522145438.436688-1-stefan.klug@ideasonboard.com>\n\t<20240522145438.436688-2-stefan.klug@ideasonboard.com>\n\t<171641761583.2920551.16350904175419447682@ping.linuxembedded.co.uk>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<171641761583.2920551.16350904175419447682@ping.linuxembedded.co.uk>","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>"}}]