[{"id":20979,"web_url":"https://patchwork.libcamera.org/comment/20979/","msgid":"<049ef7ef-e66a-b7a2-b624-d24b982ec2d8@ideasonboard.com>","date":"2021-11-17T10:22:53","subject":"Re: [libcamera-devel] [PATCH 4/5] ipa: ipu3: agc: Return the\n\tinter-quantile mean from measureBrightness()","submitter":{"id":75,"url":"https://patchwork.libcamera.org/api/people/75/","name":"Jean-Michel Hautbois","email":"jeanmichel.hautbois@ideasonboard.com"},"content":"Hi Laurent,\n\nThanks for the patch !\n\nOn 16/11/2021 17:26, Laurent Pinchart wrote:\n> The inter-quantile mean is a value that is computed as part of the AGC\n> run. It doesn't need to be stored in a member variable. Return it from\n> measureBrightness(), which makes the flow of data easier to follow.\n> \n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\nReviewed-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>\n\n> ---\n>   src/ipa/ipu3/algorithms/agc.cpp | 53 ++++++++++++++++++---------------\n>   src/ipa/ipu3/algorithms/agc.h   |  9 +++---\n>   2 files changed, 33 insertions(+), 29 deletions(-)\n> \n> diff --git a/src/ipa/ipu3/algorithms/agc.cpp b/src/ipa/ipu3/algorithms/agc.cpp\n> index 6aab9fd5ebb5..71398fdd96a6 100644\n> --- a/src/ipa/ipu3/algorithms/agc.cpp\n> +++ b/src/ipa/ipu3/algorithms/agc.cpp\n> @@ -70,7 +70,7 @@ static constexpr uint32_t kNumStartupFrames = 10;\n>   static constexpr double kRelativeLuminanceTarget = 0.16;\n>   \n>   Agc::Agc()\n> -\t: frameCount_(0), iqMean_(0.0), lineDuration_(0s), minShutterSpeed_(0s),\n> +\t: frameCount_(0), lineDuration_(0s), minShutterSpeed_(0s),\n>   \t  maxShutterSpeed_(0s), filteredExposure_(0s), currentExposure_(0s)\n>   {\n>   }\n> @@ -108,9 +108,10 @@ int Agc::configure(IPAContext &context, const IPAConfigInfo &configInfo)\n>    * \\brief Estimate the mean value of the top 2% of the histogram\n>    * \\param[in] stats The statistics computed by the ImgU\n>    * \\param[in] grid The grid used to store the statistics in the IPU3\n> + * \\return The mean value of the top 2% of the histogram\n>    */\n> -void Agc::measureBrightness(const ipu3_uapi_stats_3a *stats,\n> -\t\t\t    const ipu3_uapi_grid_config &grid)\n> +double Agc::measureBrightness(const ipu3_uapi_stats_3a *stats,\n> +\t\t\t      const ipu3_uapi_grid_config &grid) const\n>   {\n>   \t/* Initialise the histogram array */\n>   \tuint32_t hist[knumHistogramBins] = { 0 };\n> @@ -135,8 +136,8 @@ void Agc::measureBrightness(const ipu3_uapi_stats_3a *stats,\n>   \t\t}\n>   \t}\n>   \n> -\t/* Estimate the quantile mean of the top 2% of the histogram */\n> -\tiqMean_ = Histogram(Span<uint32_t>(hist)).interQuantileMean(0.98, 1.0);\n> +\t/* Estimate the quantile mean of the top 2% of the histogram. */\n> +\treturn Histogram(Span<uint32_t>(hist)).interQuantileMean(0.98, 1.0);\n>   }\n>   \n>   /**\n> @@ -174,28 +175,22 @@ void Agc::filterExposure()\n>    * \\brief Estimate the new exposure and gain values\n>    * \\param[inout] frameContext The shared IPA frame Context\n>    * \\param[in] yGain The gain calculated based on the relative luminance target\n> + * \\param[in] iqMeanGain The gain calculated based on the relative luminance target\n>    */\n> -void Agc::computeExposure(IPAFrameContext &frameContext, double yGain)\n> +void Agc::computeExposure(IPAFrameContext &frameContext, double yGain,\n> +\t\t\t  double iqMeanGain)\n>   {\n>   \t/* Get the effective exposure and gain applied on the sensor. */\n>   \tuint32_t exposure = frameContext.sensor.exposure;\n>   \tdouble analogueGain = frameContext.sensor.gain;\n>   \n> -\t/*\n> -\t * Estimate the gain needed to have the proportion of pixels in a given\n> -\t * desired range. iqMean_ returns the mean value of the top 2% of the\n> -\t * cumulative histogram, and we want it to be as close as possible to a\n> -\t * configured target.\n> -\t */\n> -\tdouble evGain = kEvGainTarget * knumHistogramBins / iqMean_;\n> -\n> -\tif (evGain < yGain)\n> -\t\tevGain = yGain;\n> +\t/* Use the highest of the two gain estimates. */\n> +\tdouble evGain = std::max(yGain, iqMeanGain);\n>   \n>   \t/* Consider within 1% of the target as correctly exposed */\n>   \tif (std::abs(evGain - 1.0) < 0.01)\n> -\t\tLOG(IPU3Agc, Debug) << \"We are well exposed (iqMean = \"\n> -\t\t\t\t    << iqMean_ << \")\";\n> +\t\tLOG(IPU3Agc, Debug) << \"We are well exposed (evGain = \"\n> +\t\t\t\t    << evGain << \")\";\n>   \n>   \t/* extracted from Rpi::Agc::computeTargetExposure */\n>   \n> @@ -308,15 +303,25 @@ double Agc::estimateLuminance(IPAFrameContext &frameContext,\n>    */\n>   void Agc::process(IPAContext &context, const ipu3_uapi_stats_3a *stats)\n>   {\n> -\tmeasureBrightness(stats, context.configuration.grid.bdsGrid);\n> +\t/*\n> +\t * Estimate the gain needed to have the proportion of pixels in a given\n> +\t * desired range. iqMean is the mean value of the top 2% of the\n> +\t * cumulative histogram, and we want it to be as close as possible to a\n> +\t * configured target.\n> +\t */\n> +\tdouble iqMean = measureBrightness(stats, context.configuration.grid.bdsGrid);\n> +\tdouble iqMeanGain = kEvGainTarget * knumHistogramBins / iqMean;\n>   \n> +\t/*\n> +\t * Estimate the gain needed to achieve a relative luminance target. To\n> +\t * account for non-linearity caused by saturation, the value needs to be\n> +\t * estimated in an iterative process, as multiplying by a gain will not\n> +\t * increase the relative luminance by the same factor if some image\n> +\t * regions are saturated.\n> +\t */\n>   \tdouble yGain = 1.0;\n>   \tdouble yTarget = kRelativeLuminanceTarget;\n>   \n> -\t/*\n> -\t * Do this calculation a few times as brightness increase can be\n> -\t * non-linear when there are saturated regions.\n> -\t */\n>   \tfor (unsigned int i = 0; i < 8; i++) {\n>   \t\tdouble yValue = estimateLuminance(context.frameContext,\n>   \t\t\t\t\t\t  context.configuration.grid.bdsGrid,\n> @@ -331,7 +336,7 @@ void Agc::process(IPAContext &context, const ipu3_uapi_stats_3a *stats)\n>   \t\t\tbreak;\n>   \t}\n>   \n> -\tcomputeExposure(context.frameContext, yGain);\n> +\tcomputeExposure(context.frameContext, yGain, iqMeanGain);\n>   \tframeCount_++;\n>   }\n>   \n> diff --git a/src/ipa/ipu3/algorithms/agc.h b/src/ipa/ipu3/algorithms/agc.h\n> index 0c868d6737f1..a04a81fb8eae 100644\n> --- a/src/ipa/ipu3/algorithms/agc.h\n> +++ b/src/ipa/ipu3/algorithms/agc.h\n> @@ -31,10 +31,11 @@ public:\n>   \tvoid process(IPAContext &context, const ipu3_uapi_stats_3a *stats) override;\n>   \n>   private:\n> -\tvoid measureBrightness(const ipu3_uapi_stats_3a *stats,\n> -\t\t\t       const ipu3_uapi_grid_config &grid);\n> +\tdouble measureBrightness(const ipu3_uapi_stats_3a *stats,\n> +\t\t\t\t const ipu3_uapi_grid_config &grid) const;\n>   \tvoid filterExposure();\n> -\tvoid computeExposure(IPAFrameContext &frameContext, double yGain);\n> +\tvoid computeExposure(IPAFrameContext &frameContext, double yGain,\n> +\t\t\t     double iqMeanGain);\n>   \tdouble estimateLuminance(IPAFrameContext &frameContext,\n>   \t\t\t\t const ipu3_uapi_grid_config &grid,\n>   \t\t\t\t const ipu3_uapi_stats_3a *stats,\n> @@ -42,8 +43,6 @@ private:\n>   \n>   \tuint64_t frameCount_;\n>   \n> -\tdouble iqMean_;\n> -\n>   \tutils::Duration lineDuration_;\n>   \tutils::Duration minShutterSpeed_;\n>   \tutils::Duration maxShutterSpeed_;\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 86C13BDB1C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 17 Nov 2021 10:22:58 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 0ADB860376;\n\tWed, 17 Nov 2021 11:22:58 +0100 (CET)","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 585E0600B5\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 17 Nov 2021 11:22:56 +0100 (CET)","from [IPV6:2a01:e0a:169:7140:f372:e247:b88:b5dd] (unknown\n\t[IPv6:2a01:e0a:169:7140:f372:e247:b88:b5dd])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id EE802E7;\n\tWed, 17 Nov 2021 11:22:55 +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=\"XVQSqoZ4\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1637144576;\n\tbh=BoYg+7fG5qT4tBxM7OXryFge7YJSpKKvnLULminQ1yo=;\n\th=Date:Subject:To:References:From:In-Reply-To:From;\n\tb=XVQSqoZ4/FoKkOEW+6Pzk/khFmfHMri4rd0yRWDyFdAGWMWa3vXtE3r+h4cyMb3L7\n\tPHhHnDoXSYsOUVGvoiELU/U31JZy8iQOh+Iqa0xvYsj61ZF/sVBt2S/+GyPMaOAMwm\n\todUbVxhuBZ/9vYotSaE/E95f8JCcWT/W7X+qEIrw=","Message-ID":"<049ef7ef-e66a-b7a2-b624-d24b982ec2d8@ideasonboard.com>","Date":"Wed, 17 Nov 2021 11:22:53 +0100","MIME-Version":"1.0","User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101\n\tThunderbird/91.2.1","Content-Language":"en-US","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","References":"<20211116162615.27777-1-laurent.pinchart@ideasonboard.com>\n\t<20211116162615.27777-5-laurent.pinchart@ideasonboard.com>","From":"Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>","In-Reply-To":"<20211116162615.27777-5-laurent.pinchart@ideasonboard.com>","Content-Type":"text/plain; charset=UTF-8; format=flowed","Content-Transfer-Encoding":"7bit","Subject":"Re: [libcamera-devel] [PATCH 4/5] ipa: ipu3: agc: Return the\n\tinter-quantile mean from measureBrightness()","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":20995,"web_url":"https://patchwork.libcamera.org/comment/20995/","msgid":"<163722890689.420308.15261891110645922878@Monstersaurus>","date":"2021-11-18T09:48:26","subject":"Re: [libcamera-devel] [PATCH 4/5] ipa: ipu3: agc: Return the\n\tinter-quantile mean from measureBrightness()","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Quoting Jean-Michel Hautbois (2021-11-17 10:22:53)\n> Hi Laurent,\n> \n> Thanks for the patch !\n> \n> On 16/11/2021 17:26, Laurent Pinchart wrote:\n> > The inter-quantile mean is a value that is computed as part of the AGC\n> > run. It doesn't need to be stored in a member variable. Return it from\n> > measureBrightness(), which makes the flow of data easier to follow.\n> > \n> > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> \n> Reviewed-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>\n\n\nReviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n\n> \n> > ---\n> >   src/ipa/ipu3/algorithms/agc.cpp | 53 ++++++++++++++++++---------------\n> >   src/ipa/ipu3/algorithms/agc.h   |  9 +++---\n> >   2 files changed, 33 insertions(+), 29 deletions(-)\n> > \n> > diff --git a/src/ipa/ipu3/algorithms/agc.cpp b/src/ipa/ipu3/algorithms/agc.cpp\n> > index 6aab9fd5ebb5..71398fdd96a6 100644\n> > --- a/src/ipa/ipu3/algorithms/agc.cpp\n> > +++ b/src/ipa/ipu3/algorithms/agc.cpp\n> > @@ -70,7 +70,7 @@ static constexpr uint32_t kNumStartupFrames = 10;\n> >   static constexpr double kRelativeLuminanceTarget = 0.16;\n> >   \n> >   Agc::Agc()\n> > -     : frameCount_(0), iqMean_(0.0), lineDuration_(0s), minShutterSpeed_(0s),\n> > +     : frameCount_(0), lineDuration_(0s), minShutterSpeed_(0s),\n> >         maxShutterSpeed_(0s), filteredExposure_(0s), currentExposure_(0s)\n> >   {\n> >   }\n> > @@ -108,9 +108,10 @@ int Agc::configure(IPAContext &context, const IPAConfigInfo &configInfo)\n> >    * \\brief Estimate the mean value of the top 2% of the histogram\n> >    * \\param[in] stats The statistics computed by the ImgU\n> >    * \\param[in] grid The grid used to store the statistics in the IPU3\n> > + * \\return The mean value of the top 2% of the histogram\n> >    */\n> > -void Agc::measureBrightness(const ipu3_uapi_stats_3a *stats,\n> > -                         const ipu3_uapi_grid_config &grid)\n> > +double Agc::measureBrightness(const ipu3_uapi_stats_3a *stats,\n> > +                           const ipu3_uapi_grid_config &grid) const\n> >   {\n> >       /* Initialise the histogram array */\n> >       uint32_t hist[knumHistogramBins] = { 0 };\n> > @@ -135,8 +136,8 @@ void Agc::measureBrightness(const ipu3_uapi_stats_3a *stats,\n> >               }\n> >       }\n> >   \n> > -     /* Estimate the quantile mean of the top 2% of the histogram */\n> > -     iqMean_ = Histogram(Span<uint32_t>(hist)).interQuantileMean(0.98, 1.0);\n> > +     /* Estimate the quantile mean of the top 2% of the histogram. */\n> > +     return Histogram(Span<uint32_t>(hist)).interQuantileMean(0.98, 1.0);\n> >   }\n> >   \n> >   /**\n> > @@ -174,28 +175,22 @@ void Agc::filterExposure()\n> >    * \\brief Estimate the new exposure and gain values\n> >    * \\param[inout] frameContext The shared IPA frame Context\n> >    * \\param[in] yGain The gain calculated based on the relative luminance target\n> > + * \\param[in] iqMeanGain The gain calculated based on the relative luminance target\n> >    */\n> > -void Agc::computeExposure(IPAFrameContext &frameContext, double yGain)\n> > +void Agc::computeExposure(IPAFrameContext &frameContext, double yGain,\n> > +                       double iqMeanGain)\n> >   {\n> >       /* Get the effective exposure and gain applied on the sensor. */\n> >       uint32_t exposure = frameContext.sensor.exposure;\n> >       double analogueGain = frameContext.sensor.gain;\n> >   \n> > -     /*\n> > -      * Estimate the gain needed to have the proportion of pixels in a given\n> > -      * desired range. iqMean_ returns the mean value of the top 2% of the\n> > -      * cumulative histogram, and we want it to be as close as possible to a\n> > -      * configured target.\n> > -      */\n> > -     double evGain = kEvGainTarget * knumHistogramBins / iqMean_;\n> > -\n> > -     if (evGain < yGain)\n> > -             evGain = yGain;\n> > +     /* Use the highest of the two gain estimates. */\n> > +     double evGain = std::max(yGain, iqMeanGain);\n> >   \n> >       /* Consider within 1% of the target as correctly exposed */\n> >       if (std::abs(evGain - 1.0) < 0.01)\n> > -             LOG(IPU3Agc, Debug) << \"We are well exposed (iqMean = \"\n> > -                                 << iqMean_ << \")\";\n> > +             LOG(IPU3Agc, Debug) << \"We are well exposed (evGain = \"\n> > +                                 << evGain << \")\";\n> >   \n> >       /* extracted from Rpi::Agc::computeTargetExposure */\n> >   \n> > @@ -308,15 +303,25 @@ double Agc::estimateLuminance(IPAFrameContext &frameContext,\n> >    */\n> >   void Agc::process(IPAContext &context, const ipu3_uapi_stats_3a *stats)\n> >   {\n> > -     measureBrightness(stats, context.configuration.grid.bdsGrid);\n> > +     /*\n> > +      * Estimate the gain needed to have the proportion of pixels in a given\n> > +      * desired range. iqMean is the mean value of the top 2% of the\n> > +      * cumulative histogram, and we want it to be as close as possible to a\n> > +      * configured target.\n> > +      */\n> > +     double iqMean = measureBrightness(stats, context.configuration.grid.bdsGrid);\n> > +     double iqMeanGain = kEvGainTarget * knumHistogramBins / iqMean;\n> >   \n> > +     /*\n> > +      * Estimate the gain needed to achieve a relative luminance target. To\n> > +      * account for non-linearity caused by saturation, the value needs to be\n> > +      * estimated in an iterative process, as multiplying by a gain will not\n> > +      * increase the relative luminance by the same factor if some image\n> > +      * regions are saturated.\n> > +      */\n> >       double yGain = 1.0;\n> >       double yTarget = kRelativeLuminanceTarget;\n> >   \n> > -     /*\n> > -      * Do this calculation a few times as brightness increase can be\n> > -      * non-linear when there are saturated regions.\n> > -      */\n> >       for (unsigned int i = 0; i < 8; i++) {\n> >               double yValue = estimateLuminance(context.frameContext,\n> >                                                 context.configuration.grid.bdsGrid,\n> > @@ -331,7 +336,7 @@ void Agc::process(IPAContext &context, const ipu3_uapi_stats_3a *stats)\n> >                       break;\n> >       }\n> >   \n> > -     computeExposure(context.frameContext, yGain);\n> > +     computeExposure(context.frameContext, yGain, iqMeanGain);\n> >       frameCount_++;\n> >   }\n> >   \n> > diff --git a/src/ipa/ipu3/algorithms/agc.h b/src/ipa/ipu3/algorithms/agc.h\n> > index 0c868d6737f1..a04a81fb8eae 100644\n> > --- a/src/ipa/ipu3/algorithms/agc.h\n> > +++ b/src/ipa/ipu3/algorithms/agc.h\n> > @@ -31,10 +31,11 @@ public:\n> >       void process(IPAContext &context, const ipu3_uapi_stats_3a *stats) override;\n> >   \n> >   private:\n> > -     void measureBrightness(const ipu3_uapi_stats_3a *stats,\n> > -                            const ipu3_uapi_grid_config &grid);\n> > +     double measureBrightness(const ipu3_uapi_stats_3a *stats,\n> > +                              const ipu3_uapi_grid_config &grid) const;\n> >       void filterExposure();\n> > -     void computeExposure(IPAFrameContext &frameContext, double yGain);\n> > +     void computeExposure(IPAFrameContext &frameContext, double yGain,\n> > +                          double iqMeanGain);\n> >       double estimateLuminance(IPAFrameContext &frameContext,\n> >                                const ipu3_uapi_grid_config &grid,\n> >                                const ipu3_uapi_stats_3a *stats,\n> > @@ -42,8 +43,6 @@ private:\n> >   \n> >       uint64_t frameCount_;\n> >   \n> > -     double iqMean_;\n> > -\n> >       utils::Duration lineDuration_;\n> >       utils::Duration minShutterSpeed_;\n> >       utils::Duration maxShutterSpeed_;\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 7E764BF415\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 18 Nov 2021 09:48:31 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id B23CB60378;\n\tThu, 18 Nov 2021 10:48:30 +0100 (CET)","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 EDCDF60230\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 18 Nov 2021 10:48:28 +0100 (CET)","from pendragon.ideasonboard.com\n\t(cpc89244-aztw30-2-0-cust3082.18-1.cable.virginm.net [86.31.172.11])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 79FF13E5;\n\tThu, 18 Nov 2021 10:48:28 +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=\"dzOdd0lF\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1637228908;\n\tbh=ThIRnvV3X6ZEp5wUWYwM5A8nCItXIEfqum4M6+2wekw=;\n\th=In-Reply-To:References:Subject:From:To:Date:From;\n\tb=dzOdd0lFEtknVL6D6Eu0olERDNIgd+Uu5RcHULSoAUfN6XF2aNoeByqtuhcJp08xg\n\tuVhl5z0NGBNfPD9dj5+y8N4D9eE6f8A6iwDA33uhIFKBg7QtRuP1dQI9JgD4hwXYUn\n\tUDW2sDvr1HD0+tjHq0u5JT06hWAYaOik2bGZgVXE=","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<049ef7ef-e66a-b7a2-b624-d24b982ec2d8@ideasonboard.com>","References":"<20211116162615.27777-1-laurent.pinchart@ideasonboard.com>\n\t<20211116162615.27777-5-laurent.pinchart@ideasonboard.com>\n\t<049ef7ef-e66a-b7a2-b624-d24b982ec2d8@ideasonboard.com>","From":"Kieran Bingham <kieran.bingham@ideasonboard.com>","To":"Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>,\n\tLaurent Pinchart <laurent.pinchart@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","Date":"Thu, 18 Nov 2021 09:48:26 +0000","Message-ID":"<163722890689.420308.15261891110645922878@Monstersaurus>","User-Agent":"alot/0.10","Subject":"Re: [libcamera-devel] [PATCH 4/5] ipa: ipu3: agc: Return the\n\tinter-quantile mean from measureBrightness()","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>"}}]