[{"id":21239,"web_url":"https://patchwork.libcamera.org/comment/21239/","msgid":"<163784189263.3059017.1910609159997065301@Monstersaurus>","date":"2021-11-25T12:04:52","subject":"Re: [libcamera-devel] [PATCH 3/4] ipa: ipu3: Remove local cached\n\tlimits for shutter speed and gain","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-25 10:21:42)\n> The limits for shutter speed and analogue gain are stored locally while\n> those are only used in computeExposure(). Remove those local variables,\n> and use the IPASessionConfiguration values directly.\n> \n> While at it, set default analogue gain and shutter speed.\n> \n\nReviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n\n> Signed-off-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>\n> ---\n>  src/ipa/ipu3/algorithms/agc.cpp | 42 ++++++++++++++++++---------------\n>  src/ipa/ipu3/algorithms/agc.h   |  8 +------\n>  2 files changed, 24 insertions(+), 26 deletions(-)\n> \n> diff --git a/src/ipa/ipu3/algorithms/agc.cpp b/src/ipa/ipu3/algorithms/agc.cpp\n> index 2945a138..b822c79b 100644\n> --- a/src/ipa/ipu3/algorithms/agc.cpp\n> +++ b/src/ipa/ipu3/algorithms/agc.cpp\n> @@ -70,8 +70,7 @@ static constexpr uint32_t kNumStartupFrames = 10;\n>  static constexpr double kRelativeLuminanceTarget = 0.16;\n>  \n>  Agc::Agc()\n> -       : frameCount_(0), lineDuration_(0s), minShutterSpeed_(0s),\n> -         maxShutterSpeed_(0s), filteredExposure_(0s)\n> +       : frameCount_(0), lineDuration_(0s), filteredExposure_(0s)\n>  {\n>  }\n>  \n> @@ -90,16 +89,10 @@ int Agc::configure(IPAContext &context, const IPAConfigInfo &configInfo)\n>         lineDuration_ = configInfo.sensorInfo.lineLength * 1.0s\n>                       / configInfo.sensorInfo.pixelRate;\n>  \n> -       minShutterSpeed_ = context.configuration.agc.minShutterSpeed;\n> -       maxShutterSpeed_ = std::min(context.configuration.agc.maxShutterSpeed,\n> -                                   kMaxShutterSpeed);\n> -\n> -       minAnalogueGain_ = std::max(context.configuration.agc.minAnalogueGain, kMinAnalogueGain);\n> -       maxAnalogueGain_ = std::min(context.configuration.agc.maxAnalogueGain, kMaxAnalogueGain);\n> -\n>         /* Configure the default exposure and gain. */\n> -       context.frameContext.agc.gain = minAnalogueGain_;\n> -       context.frameContext.agc.exposure = minShutterSpeed_ / lineDuration_;\n> +       context.frameContext.agc.gain =\n> +               std::max(context.configuration.agc.minAnalogueGain, kMinAnalogueGain);\n> +       context.frameContext.agc.exposure = 10ms / lineDuration_;\n>  \n>         return 0;\n>  }\n> @@ -174,17 +167,28 @@ utils::Duration Agc::filterExposure(utils::Duration currentExposure)\n>  \n>  /**\n>   * \\brief Estimate the new exposure and gain values\n> - * \\param[inout] frameContext The shared IPA frame Context\n> + * \\param[inout] context The shared IPA 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> -                         double iqMeanGain)\n> +void Agc::computeExposure(IPAContext &context, double yGain, double iqMeanGain)\n>  {\n> +       IPASessionConfiguration &configuration = context.configuration;\n> +       IPAFrameContext &frameContext = context.frameContext;\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> +       utils::Duration minShutterSpeed = configuration.agc.minShutterSpeed;\n> +       utils::Duration maxShutterSpeed = std::min(configuration.agc.maxShutterSpeed,\n> +                                                  kMaxShutterSpeed);\n> +\n> +       double minAnalogueGain = std::max(configuration.agc.minAnalogueGain,\n> +                                         kMinAnalogueGain);\n> +       double maxAnalogueGain = std::min(configuration.agc.maxAnalogueGain,\n> +                                         kMaxAnalogueGain);\n> +\n>         /* Use the highest of the two gain estimates. */\n>         double evGain = std::max(yGain, iqMeanGain);\n>  \n> @@ -216,7 +220,7 @@ void Agc::computeExposure(IPAFrameContext &frameContext, double yGain,\n>         utils::Duration currentExposure = effectiveExposureValue * evGain;\n>  \n>         /* Clamp the exposure value to the min and max authorized */\n> -       utils::Duration maxTotalExposure = maxShutterSpeed_ * maxAnalogueGain_;\n> +       utils::Duration maxTotalExposure = maxShutterSpeed * maxAnalogueGain;\n>         currentExposure = std::min(currentExposure, maxTotalExposure);\n>         LOG(IPU3Agc, Debug) << \"Target total exposure \" << currentExposure\n>                             << \", maximum is \" << maxTotalExposure;\n> @@ -232,10 +236,10 @@ void Agc::computeExposure(IPAFrameContext &frameContext, double yGain,\n>         * Push the shutter time up to the maximum first, and only then\n>         * increase the gain.\n>         */\n> -       shutterTime = std::clamp<utils::Duration>(exposureValue / minAnalogueGain_,\n> -                                                 minShutterSpeed_, maxShutterSpeed_);\n> +       shutterTime = std::clamp<utils::Duration>(exposureValue / minAnalogueGain,\n> +                                                 minShutterSpeed, maxShutterSpeed);\n>         double stepGain = std::clamp(exposureValue / shutterTime,\n> -                                    minAnalogueGain_, maxAnalogueGain_);\n> +                                    minAnalogueGain, maxAnalogueGain);\n>         LOG(IPU3Agc, Debug) << \"Divided up shutter and gain are \"\n>                             << shutterTime << \" and \"\n>                             << stepGain;\n> @@ -348,7 +352,7 @@ void Agc::process(IPAContext &context, const ipu3_uapi_stats_3a *stats)\n>                         break;\n>         }\n>  \n> -       computeExposure(context.frameContext, yGain, iqMeanGain);\n> +       computeExposure(context, 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 84bfe045..d9f17e6f 100644\n> --- a/src/ipa/ipu3/algorithms/agc.h\n> +++ b/src/ipa/ipu3/algorithms/agc.h\n> @@ -34,8 +34,7 @@ private:\n>         double measureBrightness(const ipu3_uapi_stats_3a *stats,\n>                                  const ipu3_uapi_grid_config &grid) const;\n>         utils::Duration filterExposure(utils::Duration currentExposure);\n> -       void computeExposure(IPAFrameContext &frameContext, double yGain,\n> -                            double iqMeanGain);\n> +       void computeExposure(IPAContext &context, double yGain, double iqMeanGain);\n>         double estimateLuminance(IPAFrameContext &frameContext,\n>                                  const ipu3_uapi_grid_config &grid,\n>                                  const ipu3_uapi_stats_3a *stats,\n> @@ -44,11 +43,6 @@ private:\n>         uint64_t frameCount_;\n>  \n>         utils::Duration lineDuration_;\n> -       utils::Duration minShutterSpeed_;\n> -       utils::Duration maxShutterSpeed_;\n> -\n> -       double minAnalogueGain_;\n> -       double maxAnalogueGain_;\n>  \n>         utils::Duration filteredExposure_;\n>  \n> -- \n> 2.32.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 73086BF415\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 25 Nov 2021 12:04:57 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id B930060376;\n\tThu, 25 Nov 2021 13:04:56 +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 575D160231\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 25 Nov 2021 13:04:55 +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 E945D90E;\n\tThu, 25 Nov 2021 13:04:54 +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=\"tHGcwJvp\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1637841895;\n\tbh=YKrdqbISU9HXgKTXPxzr1Gsx+Ia0WoUh5k8FblROP38=;\n\th=In-Reply-To:References:Subject:From:To:Date:From;\n\tb=tHGcwJvpoVi2RhpkKXDak7ILlmr/Y23K0zQBZWGwOgGBYkYDICO5I9xqxoWTijl8V\n\tSbzGZYX6hVnH20NBgw822s9zrHry59K6zXIiIPAU0quoxfC96XSyOPxL6Xw3e6ENer\n\tCAbb1gagdlPkjQHeuDX5+GB4yPsc7DrIo8T8JLQQ=","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<20211125102143.52556-4-jeanmichel.hautbois@ideasonboard.com>","References":"<20211125102143.52556-1-jeanmichel.hautbois@ideasonboard.com>\n\t<20211125102143.52556-4-jeanmichel.hautbois@ideasonboard.com>","From":"Kieran Bingham <kieran.bingham@ideasonboard.com>","To":"Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","Date":"Thu, 25 Nov 2021 12:04:52 +0000","Message-ID":"<163784189263.3059017.1910609159997065301@Monstersaurus>","User-Agent":"alot/0.10","Subject":"Re: [libcamera-devel] [PATCH 3/4] ipa: ipu3: Remove local cached\n\tlimits for shutter speed and gain","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":21243,"web_url":"https://patchwork.libcamera.org/comment/21243/","msgid":"<YZ99OZAD4VL7APhj@pendragon.ideasonboard.com>","date":"2021-11-25T12:10:33","subject":"Re: [libcamera-devel] [PATCH 3/4] ipa: ipu3: Remove local cached\n\tlimits for shutter speed and gain","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Jean-Michel,\n\nThank you for the patch.\n\nOn Thu, Nov 25, 2021 at 11:21:42AM +0100, Jean-Michel Hautbois wrote:\n> The limits for shutter speed and analogue gain are stored locally while\n> those are only used in computeExposure(). Remove those local variables,\n> and use the IPASessionConfiguration values directly.\n> \n> While at it, set default analogue gain and shutter speed.\n> \n> Signed-off-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>\n> ---\n>  src/ipa/ipu3/algorithms/agc.cpp | 42 ++++++++++++++++++---------------\n>  src/ipa/ipu3/algorithms/agc.h   |  8 +------\n>  2 files changed, 24 insertions(+), 26 deletions(-)\n> \n> diff --git a/src/ipa/ipu3/algorithms/agc.cpp b/src/ipa/ipu3/algorithms/agc.cpp\n> index 2945a138..b822c79b 100644\n> --- a/src/ipa/ipu3/algorithms/agc.cpp\n> +++ b/src/ipa/ipu3/algorithms/agc.cpp\n> @@ -70,8 +70,7 @@ static constexpr uint32_t kNumStartupFrames = 10;\n>  static constexpr double kRelativeLuminanceTarget = 0.16;\n>  \n>  Agc::Agc()\n> -\t: frameCount_(0), lineDuration_(0s), minShutterSpeed_(0s),\n> -\t  maxShutterSpeed_(0s), filteredExposure_(0s)\n> +\t: frameCount_(0), lineDuration_(0s), filteredExposure_(0s)\n>  {\n>  }\n>  \n> @@ -90,16 +89,10 @@ int Agc::configure(IPAContext &context, const IPAConfigInfo &configInfo)\n>  \tlineDuration_ = configInfo.sensorInfo.lineLength * 1.0s\n>  \t\t      / configInfo.sensorInfo.pixelRate;\n>  \n> -\tminShutterSpeed_ = context.configuration.agc.minShutterSpeed;\n> -\tmaxShutterSpeed_ = std::min(context.configuration.agc.maxShutterSpeed,\n> -\t\t\t\t    kMaxShutterSpeed);\n> -\n> -\tminAnalogueGain_ = std::max(context.configuration.agc.minAnalogueGain, kMinAnalogueGain);\n> -\tmaxAnalogueGain_ = std::min(context.configuration.agc.maxAnalogueGain, kMaxAnalogueGain);\n> -\n>  \t/* Configure the default exposure and gain. */\n> -\tcontext.frameContext.agc.gain = minAnalogueGain_;\n> -\tcontext.frameContext.agc.exposure = minShutterSpeed_ / lineDuration_;\n> +\tcontext.frameContext.agc.gain =\n> +\t\tstd::max(context.configuration.agc.minAnalogueGain, kMinAnalogueGain);\n> +\tcontext.frameContext.agc.exposure = 10ms / lineDuration_;\n\nThis is a functional change that should be explained in the commit\nmessage.\n\n>  \n>  \treturn 0;\n>  }\n> @@ -174,17 +167,28 @@ utils::Duration Agc::filterExposure(utils::Duration currentExposure)\n>  \n>  /**\n>   * \\brief Estimate the new exposure and gain values\n> - * \\param[inout] frameContext The shared IPA frame Context\n> + * \\param[inout] context The shared IPA 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> -\t\t\t  double iqMeanGain)\n> +void Agc::computeExposure(IPAContext &context, double yGain, double iqMeanGain)\n>  {\n> +\tIPASessionConfiguration &configuration = context.configuration;\n\nMake it const.\n\n> +\tIPAFrameContext &frameContext = context.frameContext;\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> +\tutils::Duration minShutterSpeed = configuration.agc.minShutterSpeed;\n> +\tutils::Duration maxShutterSpeed = std::min(configuration.agc.maxShutterSpeed,\n> +\t\t\t\t\t\t   kMaxShutterSpeed);\n> +\n> +\tdouble minAnalogueGain = std::max(configuration.agc.minAnalogueGain,\n> +\t\t\t\t\t  kMinAnalogueGain);\n> +\tdouble maxAnalogueGain = std::min(configuration.agc.maxAnalogueGain,\n> +\t\t\t\t\t  kMaxAnalogueGain);\n\nAs those values are constant for a session, caching them in the Agc\nclass avoids recomputing them for every frame. Is there a particular\nreason why you think we shouldn't cache them ?\n\n> +\n>  \t/* Use the highest of the two gain estimates. */\n>  \tdouble evGain = std::max(yGain, iqMeanGain);\n>  \n> @@ -216,7 +220,7 @@ void Agc::computeExposure(IPAFrameContext &frameContext, double yGain,\n>  \tutils::Duration currentExposure = effectiveExposureValue * evGain;\n>  \n>  \t/* Clamp the exposure value to the min and max authorized */\n> -\tutils::Duration maxTotalExposure = maxShutterSpeed_ * maxAnalogueGain_;\n> +\tutils::Duration maxTotalExposure = maxShutterSpeed * maxAnalogueGain;\n>  \tcurrentExposure = std::min(currentExposure, maxTotalExposure);\n>  \tLOG(IPU3Agc, Debug) << \"Target total exposure \" << currentExposure\n>  \t\t\t    << \", maximum is \" << maxTotalExposure;\n> @@ -232,10 +236,10 @@ void Agc::computeExposure(IPAFrameContext &frameContext, double yGain,\n>  \t* Push the shutter time up to the maximum first, and only then\n>  \t* increase the gain.\n>  \t*/\n> -\tshutterTime = std::clamp<utils::Duration>(exposureValue / minAnalogueGain_,\n> -\t\t\t\t\t\t  minShutterSpeed_, maxShutterSpeed_);\n> +\tshutterTime = std::clamp<utils::Duration>(exposureValue / minAnalogueGain,\n> +\t\t\t\t\t\t  minShutterSpeed, maxShutterSpeed);\n>  \tdouble stepGain = std::clamp(exposureValue / shutterTime,\n> -\t\t\t\t     minAnalogueGain_, maxAnalogueGain_);\n> +\t\t\t\t     minAnalogueGain, maxAnalogueGain);\n>  \tLOG(IPU3Agc, Debug) << \"Divided up shutter and gain are \"\n>  \t\t\t    << shutterTime << \" and \"\n>  \t\t\t    << stepGain;\n> @@ -348,7 +352,7 @@ void Agc::process(IPAContext &context, const ipu3_uapi_stats_3a *stats)\n>  \t\t\tbreak;\n>  \t}\n>  \n> -\tcomputeExposure(context.frameContext, yGain, iqMeanGain);\n> +\tcomputeExposure(context, 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 84bfe045..d9f17e6f 100644\n> --- a/src/ipa/ipu3/algorithms/agc.h\n> +++ b/src/ipa/ipu3/algorithms/agc.h\n> @@ -34,8 +34,7 @@ private:\n>  \tdouble measureBrightness(const ipu3_uapi_stats_3a *stats,\n>  \t\t\t\t const ipu3_uapi_grid_config &grid) const;\n>  \tutils::Duration filterExposure(utils::Duration currentExposure);\n> -\tvoid computeExposure(IPAFrameContext &frameContext, double yGain,\n> -\t\t\t     double iqMeanGain);\n> +\tvoid computeExposure(IPAContext &context, double yGain, 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> @@ -44,11 +43,6 @@ private:\n>  \tuint64_t frameCount_;\n>  \n>  \tutils::Duration lineDuration_;\n> -\tutils::Duration minShutterSpeed_;\n> -\tutils::Duration maxShutterSpeed_;\n> -\n> -\tdouble minAnalogueGain_;\n> -\tdouble maxAnalogueGain_;\n>  \n>  \tutils::Duration filteredExposure_;\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 2D70BBF415\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 25 Nov 2021 12:10:58 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 8C2636036F;\n\tThu, 25 Nov 2021 13:10:57 +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 5425760231\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 25 Nov 2021 13:10:56 +0100 (CET)","from pendragon.ideasonboard.com (62-78-145-57.bb.dnainternet.fi\n\t[62.78.145.57])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id C48DC90E;\n\tThu, 25 Nov 2021 13:10: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=\"f9Uww/kB\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1637842256;\n\tbh=p98YnhSA7RCYbZ8w2HAwdGP930v82fyo8FgfTqjhPoo=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=f9Uww/kBodgRjgnIjWHRnPqt2VOgZFIEa6zLdq8Kkr+yWNzX0GSKhx6SCcdft6S1A\n\tJXeLSeG6mU2jFTKOCZOrk7pX6Q2L3PHbdWpiLK+tJzIJVA3tBewwANmueWP3rR47RJ\n\tXMOMd42fgqtpzI6s3gYZV3pfjZBzAKBZndIV+0Lg=","Date":"Thu, 25 Nov 2021 14:10:33 +0200","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>","Message-ID":"<YZ99OZAD4VL7APhj@pendragon.ideasonboard.com>","References":"<20211125102143.52556-1-jeanmichel.hautbois@ideasonboard.com>\n\t<20211125102143.52556-4-jeanmichel.hautbois@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20211125102143.52556-4-jeanmichel.hautbois@ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH 3/4] ipa: ipu3: Remove local cached\n\tlimits for shutter speed and gain","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>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]