[{"id":31142,"web_url":"https://patchwork.libcamera.org/comment/31142/","msgid":"<172591569816.2319503.824060652025572417@ping.linuxembedded.co.uk>","date":"2024-09-09T21:01:38","subject":"Re: [PATCH v6 15/18] libcamera: software_isp: Use floating point for\n\tcolor parameters","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Quoting Milan Zamazal (2024-09-06 13:09:24)\n> It's more natural to represent color gains and black level as floating\n> point numbers rather than using a particular pixel-related\n> representation.\n> \n> double is used rather than float because it's a more common floating\n> point type in libcamera algorithms.  Otherwise there is no obvious\n> reason to select one over the other here.\n> \n> The constructed color tables still use integer representation for\n> efficiency.\n\nOhh look at this, one comment I was going to try to make on earlier code\nalready handled \\o/\n\nI can't spot any gotchas here ... (And I've tested this series, so I\nbelieve it's working well)\n\n\nReviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n\n> \n> Signed-off-by: Milan Zamazal <mzamazal@redhat.com>\n> ---\n>  src/ipa/simple/algorithms/awb.cpp | 11 +++++------\n>  src/ipa/simple/algorithms/blc.cpp |  8 ++++----\n>  src/ipa/simple/algorithms/lut.cpp | 15 +++++++++------\n>  src/ipa/simple/ipa_context.h      | 11 +++++------\n>  4 files changed, 23 insertions(+), 22 deletions(-)\n> \n> diff --git a/src/ipa/simple/algorithms/awb.cpp b/src/ipa/simple/algorithms/awb.cpp\n> index f89f1d3d..61d9fc73 100644\n> --- a/src/ipa/simple/algorithms/awb.cpp\n> +++ b/src/ipa/simple/algorithms/awb.cpp\n> @@ -24,7 +24,7 @@ int Awb::init(IPAContext &context,\n>               [[maybe_unused]] const YamlObject &tuningData)\n>  {\n>         auto &gains = context.activeState.gains;\n> -       gains.red = gains.green = gains.blue = 256;\n> +       gains.red = gains.green = gains.blue = 1.0;\n>  \n>         return 0;\n>  }\n> @@ -36,7 +36,7 @@ void Awb::process(IPAContext &context,\n>                   [[maybe_unused]] ControlList &metadata)\n>  {\n>         const SwIspStats::Histogram &histogram = stats->yHistogram;\n> -       const uint8_t blackLevel = context.activeState.blc.level;\n> +       const double blackLevel = context.activeState.blc.level;\n>  \n>         /*\n>          * Black level must be subtracted to get the correct AWB ratios, they\n> @@ -53,12 +53,11 @@ void Awb::process(IPAContext &context,\n>         /*\n>          * Calculate red and blue gains for AWB.\n>          * Clamp max gain at 4.0, this also avoids 0 division.\n> -        * Gain: 128 = 0.5, 256 = 1.0, 512 = 2.0, etc.\n>          */\n>         auto &gains = context.activeState.gains;\n> -       gains.red = sumR <= sumG / 4 ? 1024 : 256 * sumG / sumR;\n> -       gains.blue = sumB <= sumG / 4 ? 1024 : 256 * sumG / sumB;\n> -       /* Green gain is fixed to 256 */\n> +       gains.red = sumR <= sumG / 4 ? 4.0 : static_cast<double>(sumG) / sumR;\n> +       gains.blue = sumB <= sumG / 4 ? 4.0 : static_cast<double>(sumG) / sumB;\n> +       /* Green gain is fixed to 1.0 */\n>  \n>         LOG(IPASoftAwb, Debug) << \"gain R/B \" << gains.red << \"/\" << gains.blue;\n>  }\n> diff --git a/src/ipa/simple/algorithms/blc.cpp b/src/ipa/simple/algorithms/blc.cpp\n> index 08f4345e..1ceae85d 100644\n> --- a/src/ipa/simple/algorithms/blc.cpp\n> +++ b/src/ipa/simple/algorithms/blc.cpp\n> @@ -24,7 +24,7 @@ BlackLevel::BlackLevel()\n>  int BlackLevel::init(IPAContext &context,\n>                      [[maybe_unused]] const YamlObject &tuningData)\n>  {\n> -       context.activeState.blc.level = 255;\n> +       context.activeState.blc.level = 1.0;\n>         return 0;\n>  }\n>  \n> @@ -44,16 +44,16 @@ void BlackLevel::process(IPAContext &context,\n>         const unsigned int total =\n>                 std::accumulate(begin(histogram), end(histogram), 0);\n>         const unsigned int pixelThreshold = ignoredPercentage * total;\n> -       const unsigned int histogramRatio = 256 / SwIspStats::kYHistogramSize;\n>         const unsigned int currentBlackIdx =\n> -               context.activeState.blc.level / histogramRatio;\n> +               context.activeState.blc.level * SwIspStats::kYHistogramSize;\n>  \n>         for (unsigned int i = 0, seen = 0;\n>              i < currentBlackIdx && i < SwIspStats::kYHistogramSize;\n>              i++) {\n>                 seen += histogram[i];\n>                 if (seen >= pixelThreshold) {\n> -                       context.activeState.blc.level = i * histogramRatio;\n> +                       context.activeState.blc.level =\n> +                               static_cast<double>(i) / SwIspStats::kYHistogramSize;\n>                         LOG(IPASoftBL, Debug)\n>                                 << \"Auto-set black level: \"\n>                                 << i << \"/\" << SwIspStats::kYHistogramSize\n> diff --git a/src/ipa/simple/algorithms/lut.cpp b/src/ipa/simple/algorithms/lut.cpp\n> index 6781f34e..d3b33710 100644\n> --- a/src/ipa/simple/algorithms/lut.cpp\n> +++ b/src/ipa/simple/algorithms/lut.cpp\n> @@ -32,7 +32,7 @@ void Lut::updateGammaTable(IPAContext &context)\n>  {\n>         auto &gammaTable = context.activeState.gamma.gammaTable;\n>         auto blackLevel = context.activeState.blc.level;\n> -       const unsigned int blackIndex = blackLevel * gammaTable.size() / 256;\n> +       const unsigned int blackIndex = blackLevel * gammaTable.size();\n>         std::fill(gammaTable.begin(), gammaTable.begin() + blackIndex, 0);\n>         const float divisor = gammaTable.size() - blackIndex - 1.0;\n>         for (unsigned int i = blackIndex; i < gammaTable.size(); i++)\n> @@ -58,15 +58,18 @@ void Lut::prepare(IPAContext &context,\n>         auto &gammaTable = context.activeState.gamma.gammaTable;\n>         const unsigned int gammaTableSize = gammaTable.size();\n>         for (unsigned int i = 0; i < DebayerParams::kRGBLookupSize; i++) {\n> -               const unsigned int div = static_cast<double>(DebayerParams::kRGBLookupSize) *\n> -                                        256 / gammaTableSize;\n> +               const double div = static_cast<double>(DebayerParams::kRGBLookupSize) /\n> +                                  gammaTableSize;\n>                 /* Apply gamma after gain! */\n>                 unsigned int idx;\n> -               idx = std::min({ i * gains.red / div, gammaTableSize - 1 });\n> +               idx = std::min({ static_cast<unsigned int>(i * gains.red / div),\n> +                                gammaTableSize - 1 });\n>                 params->red[i] = gammaTable[idx];\n> -               idx = std::min({ i * gains.green / div, gammaTableSize - 1 });\n> +               idx = std::min({ static_cast<unsigned int>(i * gains.green / div),\n> +                                gammaTableSize - 1 });\n>                 params->green[i] = gammaTable[idx];\n> -               idx = std::min({ i * gains.blue / div, gammaTableSize - 1 });\n> +               idx = std::min({ static_cast<unsigned int>(i * gains.blue / div),\n> +                                gammaTableSize - 1 });\n>                 params->blue[i] = gammaTable[idx];\n>         }\n>  }\n> diff --git a/src/ipa/simple/ipa_context.h b/src/ipa/simple/ipa_context.h\n> index 737bbbc3..d09de9a9 100644\n> --- a/src/ipa/simple/ipa_context.h\n> +++ b/src/ipa/simple/ipa_context.h\n> @@ -8,7 +8,6 @@\n>  #pragma once\n>  \n>  #include <array>\n> -#include <stdint.h>\n>  \n>  #include <libipa/fc_queue.h>\n>  \n> @@ -22,19 +21,19 @@ struct IPASessionConfiguration {\n>  \n>  struct IPAActiveState {\n>         struct {\n> -               uint8_t level;\n> +               double level;\n>         } blc;\n>  \n>         struct {\n> -               unsigned int red;\n> -               unsigned int green;\n> -               unsigned int blue;\n> +               double red;\n> +               double green;\n> +               double blue;\n>         } gains;\n>  \n>         static constexpr unsigned int kGammaLookupSize = 1024;\n>         struct {\n>                 std::array<double, kGammaLookupSize> gammaTable;\n> -               uint8_t blackLevel;\n> +               double blackLevel;\n>         } gamma;\n>  };\n>  \n> -- \n> 2.44.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 78045BF415\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon,  9 Sep 2024 21:01:44 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 01ED6634F7;\n\tMon,  9 Sep 2024 23:01:42 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 8CE38634EB\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon,  9 Sep 2024 23:01:41 +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 E8478827;\n\tMon,  9 Sep 2024 23:00:24 +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=\"J+8OUm/g\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1725915625;\n\tbh=udL6ygozIR1h7KX9uOozmYmGLPisqVkVMvLoUlxcUks=;\n\th=In-Reply-To:References:Subject:From:Cc:To:Date:From;\n\tb=J+8OUm/gBSzii4wO09T8UcsspbAvPFbWrJJceBWzpzNj6snslwZbS5YQyNXj1Vd+k\n\tRb84IHSTK2exKJuNiZ4AzKouUzve53Z2Iz+k0CWYd0RV4pnPR4FJKOAxG4SfxA4G+s\n\tmv6ArRQ5FfjwUGaq/y/GdetWiApuntSevhhun98Y=","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<20240906120927.4071508-16-mzamazal@redhat.com>","References":"<20240906120927.4071508-1-mzamazal@redhat.com>\n\t<20240906120927.4071508-16-mzamazal@redhat.com>","Subject":"Re: [PATCH v6 15/18] libcamera: software_isp: Use floating point for\n\tcolor parameters","From":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Cc":"Milan Zamazal <mzamazal@redhat.com>,\n\tUmang Jain <umang.jain@ideasonboard.com>,\n\tLaurent Pinchart <laurent.pinchart@ideasonboard.com>,\n\tDaniel Scally <dan.scally@ideasonboard.com>","To":"Milan Zamazal <mzamazal@redhat.com>, libcamera-devel@lists.libcamera.org","Date":"Mon, 09 Sep 2024 22:01:38 +0100","Message-ID":"<172591569816.2319503.824060652025572417@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":31250,"web_url":"https://patchwork.libcamera.org/comment/31250/","msgid":"<87ldzr8uva.fsf@redhat.com>","date":"2024-09-16T15:46:01","subject":"Re: [PATCH v6 15/18] libcamera: software_isp: Use floating point\n\tfor color parameters","submitter":{"id":177,"url":"https://patchwork.libcamera.org/api/people/177/","name":"Milan Zamazal","email":"mzamazal@redhat.com"},"content":"Kieran Bingham <kieran.bingham@ideasonboard.com> writes:\n\n> Quoting Milan Zamazal (2024-09-06 13:09:24)\n>> It's more natural to represent color gains and black level as floating\n>> point numbers rather than using a particular pixel-related\n>\n>> representation.\n>> \n>> double is used rather than float because it's a more common floating\n>> point type in libcamera algorithms.  Otherwise there is no obvious\n>> reason to select one over the other here.\n>> \n>> The constructed color tables still use integer representation for\n>> efficiency.\n>\n> Ohh look at this, one comment I was going to try to make on earlier code\n> already handled \\o/\n>\n> I can't spot any gotchas here ... (And I've tested this series, so I\n> believe it's working well)\n\nHi Kieran,\n\nthank you for testing and reviews.  I'll look at your comments more\nclosely later this week.\n\n> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n>\n>> \n>> Signed-off-by: Milan Zamazal <mzamazal@redhat.com>\n>> ---\n>>  src/ipa/simple/algorithms/awb.cpp | 11 +++++------\n>>  src/ipa/simple/algorithms/blc.cpp |  8 ++++----\n>>  src/ipa/simple/algorithms/lut.cpp | 15 +++++++++------\n>>  src/ipa/simple/ipa_context.h      | 11 +++++------\n>>  4 files changed, 23 insertions(+), 22 deletions(-)\n>> \n>> diff --git a/src/ipa/simple/algorithms/awb.cpp b/src/ipa/simple/algorithms/awb.cpp\n>> index f89f1d3d..61d9fc73 100644\n>> --- a/src/ipa/simple/algorithms/awb.cpp\n>> +++ b/src/ipa/simple/algorithms/awb.cpp\n>> @@ -24,7 +24,7 @@ int Awb::init(IPAContext &context,\n>>               [[maybe_unused]] const YamlObject &tuningData)\n>>  {\n>>         auto &gains = context.activeState.gains;\n>> -       gains.red = gains.green = gains.blue = 256;\n>> +       gains.red = gains.green = gains.blue = 1.0;\n>>  \n>>         return 0;\n>>  }\n>> @@ -36,7 +36,7 @@ void Awb::process(IPAContext &context,\n>>                   [[maybe_unused]] ControlList &metadata)\n>>  {\n>>         const SwIspStats::Histogram &histogram = stats->yHistogram;\n>> -       const uint8_t blackLevel = context.activeState.blc.level;\n>> +       const double blackLevel = context.activeState.blc.level;\n>>  \n>>         /*\n>>          * Black level must be subtracted to get the correct AWB ratios, they\n>> @@ -53,12 +53,11 @@ void Awb::process(IPAContext &context,\n>>         /*\n>>          * Calculate red and blue gains for AWB.\n>>          * Clamp max gain at 4.0, this also avoids 0 division.\n>> -        * Gain: 128 = 0.5, 256 = 1.0, 512 = 2.0, etc.\n>>          */\n>>         auto &gains = context.activeState.gains;\n>> -       gains.red = sumR <= sumG / 4 ? 1024 : 256 * sumG / sumR;\n>> -       gains.blue = sumB <= sumG / 4 ? 1024 : 256 * sumG / sumB;\n>> -       /* Green gain is fixed to 256 */\n>> +       gains.red = sumR <= sumG / 4 ? 4.0 : static_cast<double>(sumG) / sumR;\n>> +       gains.blue = sumB <= sumG / 4 ? 4.0 : static_cast<double>(sumG) / sumB;\n>> +       /* Green gain is fixed to 1.0 */\n>>  \n>>         LOG(IPASoftAwb, Debug) << \"gain R/B \" << gains.red << \"/\" << gains.blue;\n>>  }\n>> diff --git a/src/ipa/simple/algorithms/blc.cpp b/src/ipa/simple/algorithms/blc.cpp\n>> index 08f4345e..1ceae85d 100644\n>> --- a/src/ipa/simple/algorithms/blc.cpp\n>> +++ b/src/ipa/simple/algorithms/blc.cpp\n>> @@ -24,7 +24,7 @@ BlackLevel::BlackLevel()\n>>  int BlackLevel::init(IPAContext &context,\n>>                      [[maybe_unused]] const YamlObject &tuningData)\n>>  {\n>> -       context.activeState.blc.level = 255;\n>> +       context.activeState.blc.level = 1.0;\n>>         return 0;\n>>  }\n>>  \n>> @@ -44,16 +44,16 @@ void BlackLevel::process(IPAContext &context,\n>>         const unsigned int total =\n>>                 std::accumulate(begin(histogram), end(histogram), 0);\n>>         const unsigned int pixelThreshold = ignoredPercentage * total;\n>> -       const unsigned int histogramRatio = 256 / SwIspStats::kYHistogramSize;\n>>         const unsigned int currentBlackIdx =\n>> -               context.activeState.blc.level / histogramRatio;\n>> +               context.activeState.blc.level * SwIspStats::kYHistogramSize;\n>>  \n>>         for (unsigned int i = 0, seen = 0;\n>>              i < currentBlackIdx && i < SwIspStats::kYHistogramSize;\n>>              i++) {\n>>                 seen += histogram[i];\n>>                 if (seen >= pixelThreshold) {\n>> -                       context.activeState.blc.level = i * histogramRatio;\n>> +                       context.activeState.blc.level =\n>> +                               static_cast<double>(i) / SwIspStats::kYHistogramSize;\n>>                         LOG(IPASoftBL, Debug)\n>>                                 << \"Auto-set black level: \"\n>>                                 << i << \"/\" << SwIspStats::kYHistogramSize\n>> diff --git a/src/ipa/simple/algorithms/lut.cpp b/src/ipa/simple/algorithms/lut.cpp\n>> index 6781f34e..d3b33710 100644\n>> --- a/src/ipa/simple/algorithms/lut.cpp\n>> +++ b/src/ipa/simple/algorithms/lut.cpp\n>> @@ -32,7 +32,7 @@ void Lut::updateGammaTable(IPAContext &context)\n>>  {\n>>         auto &gammaTable = context.activeState.gamma.gammaTable;\n>>         auto blackLevel = context.activeState.blc.level;\n>> -       const unsigned int blackIndex = blackLevel * gammaTable.size() / 256;\n>> +       const unsigned int blackIndex = blackLevel * gammaTable.size();\n>>         std::fill(gammaTable.begin(), gammaTable.begin() + blackIndex, 0);\n>>         const float divisor = gammaTable.size() - blackIndex - 1.0;\n>>         for (unsigned int i = blackIndex; i < gammaTable.size(); i++)\n>> @@ -58,15 +58,18 @@ void Lut::prepare(IPAContext &context,\n>>         auto &gammaTable = context.activeState.gamma.gammaTable;\n>>         const unsigned int gammaTableSize = gammaTable.size();\n>>         for (unsigned int i = 0; i < DebayerParams::kRGBLookupSize; i++) {\n>> -               const unsigned int div = static_cast<double>(DebayerParams::kRGBLookupSize) *\n>> -                                        256 / gammaTableSize;\n>> +               const double div = static_cast<double>(DebayerParams::kRGBLookupSize) /\n>> +                                  gammaTableSize;\n>>                 /* Apply gamma after gain! */\n>>                 unsigned int idx;\n>> -               idx = std::min({ i * gains.red / div, gammaTableSize - 1 });\n>> +               idx = std::min({ static_cast<unsigned int>(i * gains.red / div),\n>> +                                gammaTableSize - 1 });\n>>                 params->red[i] = gammaTable[idx];\n>> -               idx = std::min({ i * gains.green / div, gammaTableSize - 1 });\n>> +               idx = std::min({ static_cast<unsigned int>(i * gains.green / div),\n>> +                                gammaTableSize - 1 });\n>>                 params->green[i] = gammaTable[idx];\n>> -               idx = std::min({ i * gains.blue / div, gammaTableSize - 1 });\n>> +               idx = std::min({ static_cast<unsigned int>(i * gains.blue / div),\n>> +                                gammaTableSize - 1 });\n>>                 params->blue[i] = gammaTable[idx];\n>>         }\n>>  }\n>> diff --git a/src/ipa/simple/ipa_context.h b/src/ipa/simple/ipa_context.h\n>> index 737bbbc3..d09de9a9 100644\n>> --- a/src/ipa/simple/ipa_context.h\n>> +++ b/src/ipa/simple/ipa_context.h\n>> @@ -8,7 +8,6 @@\n>>  #pragma once\n>>  \n>>  #include <array>\n>> -#include <stdint.h>\n>>  \n>>  #include <libipa/fc_queue.h>\n>>  \n>> @@ -22,19 +21,19 @@ struct IPASessionConfiguration {\n>>  \n>>  struct IPAActiveState {\n>>         struct {\n>> -               uint8_t level;\n>> +               double level;\n>>         } blc;\n>>  \n>>         struct {\n>> -               unsigned int red;\n>> -               unsigned int green;\n>> -               unsigned int blue;\n>> +               double red;\n>> +               double green;\n>> +               double blue;\n>>         } gains;\n>>  \n>>         static constexpr unsigned int kGammaLookupSize = 1024;\n>>         struct {\n>>                 std::array<double, kGammaLookupSize> gammaTable;\n>> -               uint8_t blackLevel;\n>> +               double blackLevel;\n>>         } gamma;\n>>  };\n>>  \n>> -- \n>> 2.44.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 BD6C7C324C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 16 Sep 2024 15:46:10 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id BEB94634FD;\n\tMon, 16 Sep 2024 17:46:09 +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 8EC7C634F5\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 16 Sep 2024 17:46:07 +0200 (CEST)","from mail-wm1-f71.google.com (mail-wm1-f71.google.com\n\t[209.85.128.71]) by relay.mimecast.com with ESMTP with STARTTLS\n\t(version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id\n\tus-mta-621-ebyzztQlOKiOR8asNn5DXg-1; Mon, 16 Sep 2024 11:46:04 -0400","by mail-wm1-f71.google.com with SMTP id\n\t5b1f17b1804b1-42cb998fd32so32176745e9.1\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 16 Sep 2024 08:46:04 -0700 (PDT)","from nuthatch (ip-77-48-47-2.net.vodafone.cz. [77.48.47.2])\n\tby smtp.gmail.com with ESMTPSA id\n\t5b1f17b1804b1-42d9b054d2dsm116746265e9.3.2024.09.16.08.46.01\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tMon, 16 Sep 2024 08:46:02 -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=\"OKEoEi0a\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1726501566;\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=RXz9A2MCC0t4FfZz49IWVcSpZdexiIE9gCy31NNG5vE=;\n\tb=OKEoEi0axPdIPa8Vy3RtJaf05eoTYL/6jXuE4mbnglVLepMBS3Bd+CE+EgsB/fzqbKnOHr\n\tFRGlk5pRQdWY1vqSRqGCwAjqXiBs1NnTyxptAhK8p1llfF65+oOEHspOSkQdernRh3hVGx\n\tPhKi0wE4C22t2ghp4tmTENnxqnR15Bw=","X-MC-Unique":"ebyzztQlOKiOR8asNn5DXg-1","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20230601; t=1726501563; x=1727106363;\n\th=mime-version:user-agent:message-id:date:references:in-reply-to\n\t:subject:cc:to:from:x-gm-message-state:from:to:cc:subject:date\n\t:message-id:reply-to;\n\tbh=RXz9A2MCC0t4FfZz49IWVcSpZdexiIE9gCy31NNG5vE=;\n\tb=cGZZNr7p/DrtPkSeRMGYT52UY+Q78O5280kdRgKsWeYuYbTXxu0oziUIdSINNuGSaR\n\tWr9T0SV89N9uSlncqpHg7X/0hVuygkb6vUuDzwtIMfWnkClN5lv6+8eZkYBf6BEGdw56\n\tNZBkFis1VDMbR+vZ3HCeEeTQD0rpfvN9YYF91w9tEzsVjOnWuo8Do7REOGXf2L2h33hf\n\taczGKe0IH8kKyCFCrJekRr4lnCcYkyW6PfLNs3p38CjZTLf//jOyszZYwkV4/dn5ieQu\n\tzFA10zVpw014LLXi36z5hz2d5Zh5WRNoO1Yanxl/N1hLnCKWLkOcQMiCCCsaI8uw5xq2\n\tEAGg==","X-Gm-Message-State":"AOJu0YyPLmDHb67X0M0IbvLtepPx7PyJhqZP8jQ9T/NqgPAyaZ5nHoBX\n\tmi3mEGeIr4V14nZ3tjH+zsjo90ihmtpmYE5aWUKYvgYRoNF2ACWTghOLnzom4uW/5yY5axJ0uKQ\n\tn1sauTU0xYGdziciH9ThGadVRepMAYHTr/csGs0WaMTgNw2Bmj45SJe8TWF9KEhNn4+MUgERA+T\n\trzPnI=","X-Received":["by 2002:a05:600c:3b14:b0:426:6710:223c with SMTP id\n\t5b1f17b1804b1-42cdb522c81mr113128145e9.9.1726501563301; \n\tMon, 16 Sep 2024 08:46:03 -0700 (PDT)","by 2002:a05:600c:3b14:b0:426:6710:223c with SMTP id\n\t5b1f17b1804b1-42cdb522c81mr113128025e9.9.1726501562753; \n\tMon, 16 Sep 2024 08:46:02 -0700 (PDT)"],"X-Google-Smtp-Source":"AGHT+IHBV2lE2FWxZ1Ao+hhwFDIH8amIaKQQMViO2tKK6fEvtkZ7b7KLERPglMfStbY1BMTmDlQZ/w==","From":"Milan Zamazal <mzamazal@redhat.com>","To":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org,  Umang Jain\n\t<umang.jain@ideasonboard.com>,  Laurent Pinchart\n\t<laurent.pinchart@ideasonboard.com>,  Daniel Scally\n\t<dan.scally@ideasonboard.com>","Subject":"Re: [PATCH v6 15/18] libcamera: software_isp: Use floating point\n\tfor color parameters","In-Reply-To":"<172591569816.2319503.824060652025572417@ping.linuxembedded.co.uk>\n\t(Kieran Bingham's message of \"Mon, 09 Sep 2024 22:01:38 +0100\")","References":"<20240906120927.4071508-1-mzamazal@redhat.com>\n\t<20240906120927.4071508-16-mzamazal@redhat.com>\n\t<172591569816.2319503.824060652025572417@ping.linuxembedded.co.uk>","Date":"Mon, 16 Sep 2024 17:46:01 +0200","Message-ID":"<87ldzr8uva.fsf@redhat.com>","User-Agent":"Gnus/5.13 (Gnus v5.13)","MIME-Version":"1.0","X-Mimecast-Spam-Score":"0","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>"}}]