[{"id":18929,"web_url":"https://patchwork.libcamera.org/comment/18929/","msgid":"<fd611728-2514-ae3f-eb6e-0aadbc715be6@ideasonboard.com>","date":"2021-08-18T21:19:59","subject":"Re: [libcamera-devel] [PATCH v3 3/9] ipa: ipu3: Add the functions\n\tto the Algorithm class","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"On 18/08/2021 16:53, Jean-Michel Hautbois wrote:\n> Introduce three functions in the Algorithm class to manage algorithms:\n> - configure which is called when IPA is configured only\n> - prepare called on EventFillParams event at each frame\n... at each frame when the request is queued\n\n> - process called on EventStatReady event at each frame\n\nat each frame completion when the statistics have been generated.\n\n\n> As AGC already has a process function with different arguments, let's\n> temporarily disable the warnings from the compiler in this same commit.\n> It will be removed when AGC will be fully modular.\n\nI'd write that paragraph as:\n\n\"\"\"\nThe existing AGC implementation already has a function named process(),\nthough it has different arguments. Adding the new virtual process()\ninterface causes a compiler warning due to the AGC implementation\noverloading a virtual function, even though the overload can be resolved\ncorrectly.\n\nTemporarily disable the warning in this commit to maintain bisection\nuntil the AGC is converted to the new interface.\n\"\"\"\n\n\n> Signed-off-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>\n> ---\n>  meson.build                           |  4 +++\n>  src/ipa/ipu3/algorithms/algorithm.cpp | 46 +++++++++++++++++++++++++++\n>  src/ipa/ipu3/algorithms/algorithm.h   |  9 ++++++\n>  3 files changed, 59 insertions(+)\n> \n> diff --git a/meson.build b/meson.build\n> index a49c484f..4a10e2b6 100644\n> --- a/meson.build\n> +++ b/meson.build\n> @@ -108,6 +108,10 @@ if cc.has_argument('-Wno-c99-designator')\n>      ]\n>  endif\n>  \n> +# Do not warn when a function declaration hides virtual functions from\n> +# a base class\n> +cpp_arguments += '-Wno-overloaded-virtual'\n> +\n>  c_arguments += common_arguments\n>  cpp_arguments += common_arguments\n>  \n> diff --git a/src/ipa/ipu3/algorithms/algorithm.cpp b/src/ipa/ipu3/algorithms/algorithm.cpp\n> index 325d34f0..d43a0e90 100644\n> --- a/src/ipa/ipu3/algorithms/algorithm.cpp\n> +++ b/src/ipa/ipu3/algorithms/algorithm.cpp\n> @@ -25,6 +25,52 @@ namespace ipa::ipu3 {\n>   * to manage algorithms regardless of their specific type.\n>   */\n>  \n> +/**\n> + * \\param[in] context The IPAContext structure reference\n\nShould be updated the same as prepare below.\n\n> + * \\param[in] configInfo The IPAConfigInfo structure reference\n> + * \\return 0 if sucess, an error code otherwise\n\ns/sucess/successful/\n\n> + *\n> + * \\brief Sets the IPAconfiguration to the proper values based on the\n\n/IPAconfiguration/IPAConfiguration provided by the IPAContext/\n\nBut this isn't just about 'setting values in the IPAConfiguration'...\n\n\"\"\"\n\\brief Configure the Algorithm given an IPAConfigInfo\n\nAlgorithms may implement a configure operation to pre-calculate\nparameters prior to commencing streaming.\n\nConfiguration state may be stored in the IPAConfiguration structure of\nthe IPAContext.\n\"\"\"\n\n> + * IPAConfigInfo values.\n> + *\n> + * It is called one time when IPA is configured. It is meant to prepare everything\n> + * needed by the algorithms for their calculations.\n> + */\n> +int Algorithm::configure([[maybe_unused]] IPAContext &context, [[maybe_unused]] const IPAConfigInfo &configInfo)\n> +{\n> +\treturn 0;\n> +}\n> +\n> +/**\n> + * \\param[in] context The IPAContext structure reference\n\nShould this be inout? I'm not entirely certain.\n\nI'd probably just list it as \"The shared IPA context\" or \"The global IPA\ncontext\" ?\n\n\n\n> + * \\param[in] params The parameters structure reference to fill\n\n\\param[out] params The IPU3 specific parameters.\n\n> + *\n> + * \\brief Fill the parameter buffer with the updated context values\n> + *\n> + * While streaming, an EventFillParams event is received from the pipeline handler.\n> + * The algorithms should then fill the parameter structure with any updated value\n> + * they have calculated before the IPA passes it back to the ISP.\n\n\"\"\"\nWhile streaming, the IPA will configure the IPU3 IMGU through it's\nparameter structure.\n\nAlgorithms shall fill in the parameter structure fields appropriately to\nconfigure algorithm blocks that they are responsible for.\n\nThe structure should be updated to set the enable fields and use flags\nof any algorithms they are responsible for.\n\"\"\"\n\n> + */\n> +void Algorithm::prepare([[maybe_unused]] IPAContext &context, [[maybe_unused]] ipu3_uapi_params &params)\n> +{\n> +}\n> +\n> +/**\n> + * \\param[in] context The IPAContext structure reference\n\nSame as the usage in prepare, however you chose to update that one.\n\n> + * \\param[in] stats The statistics structure to use\n\n\\param[in] stats The IPU3 statistics and ISP results\n\n> + *\n> + * \\brief Fill the context buffer using the received statistics buffer\n\n\\brief Process ISP statistics, and run algorithm operations.\n\n> + *\n> + * While streaming, an EventStatReady event is received from the pipeline handler.\n> + * The algorithms can then use the statistics buffer received to update their\n> + * internal state. This state can be shared with other algorithms through the\n> + * context->frameContext structure.\n\n\"\"\"\nWhile streaming, the IPA will receive the generated statistics from the\nIPU3 IMGU of processed frames.\n\nAlgorithms shall use this data to run calculations and update their\nstate accordingly.\n\nProcessing shall not take an undue amount of time, and any extended or\ncomputationally expensive calculations or operations must be handled\nasynchronously in a separate thread.\n\nAlgorithms can store state in their respective IPAFrameContext\nstructures, and reference state from the IPAFrameContext of other\nalgorithms.\n\n\\todo Historical data may be required as part of the processing.\n\nEither the previous frame, or the IPAFrameContext state of the frame\nthat generated the statistics for this operation may be required for\nsome advanced algorithms to prevent oscillations or support control\nloops correctly. Only a single IPAFrameContext is available currently,\nand so any data stored may represent the results of the previously\ncompleted operations.\n\nCare shall be taken to ensure the ordering of access to the information\nsuch that the algorithms use up to date state as required.\n\"\"\"\n\n\n> + */\n> +void Algorithm::process([[maybe_unused]] IPAContext &context, [[maybe_unused]] const ipu3_uapi_stats_3a *stats)\n> +{\n> +}\n> +\n>  } /* namespace ipa::ipu3 */\n>  \n>  } /* namespace libcamera */\n> +\n> diff --git a/src/ipa/ipu3/algorithms/algorithm.h b/src/ipa/ipu3/algorithms/algorithm.h\n> index 072f01c4..bd1f923d 100644\n> --- a/src/ipa/ipu3/algorithms/algorithm.h\n> +++ b/src/ipa/ipu3/algorithms/algorithm.h\n> @@ -7,6 +7,9 @@\n>  #ifndef __LIBCAMERA_IPA_IPU3_ALGORITHM_H__\n>  #define __LIBCAMERA_IPA_IPU3_ALGORITHM_H__\n>  \n> +#include <libcamera/ipa/ipu3_ipa_interface.h>\n> +\n> +#include \"ipa_context.h\"\n>  namespace libcamera {\n>  \n>  namespace ipa::ipu3 {\n> @@ -15,6 +18,12 @@ class Algorithm\n>  {\n>  public:\n>  \tvirtual ~Algorithm() {}\n> +\n> +\tvirtual int configure(IPAContext &context, const IPAConfigInfo &configInfo);\n> +\n> +\tvirtual void prepare(IPAContext &context, ipu3_uapi_params &params);\n> +\n> +\tvirtual void process(IPAContext &context, const ipu3_uapi_stats_3a *stats);\n\nHow is the params able to be passed as a reference, while the stats is a\npointer ...\n\nCan/should they both be the same?\n\n(Can stats be passed by reference? or is it already a pointer, and if so\n- shouldn't params be the same?, or vice-versa)\n\n\n>  };\n>  \n>  } /* namespace ipa::ipu3 */\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 AA595BD87C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 18 Aug 2021 21:20:05 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 381F4688A3;\n\tWed, 18 Aug 2021 23:20:05 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 608AE6888A\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 18 Aug 2021 23:20:03 +0200 (CEST)","from [192.168.0.20]\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 D5837EE;\n\tWed, 18 Aug 2021 23:20:02 +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=\"cYsZsS7G\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1629321603;\n\tbh=ucrrLTAetSqZZmNBRgNbvn63YPRdVizz2p3CMvmvdpc=;\n\th=To:References:From:Subject:Date:In-Reply-To:From;\n\tb=cYsZsS7G5KDm6Z/a5mpoXpsEEUqxjCMPh2rdLJub+Y8QBr4jlE3LCd7mvZQqRYClm\n\tlmSxK2n+X58e0W/aroOJnwLVADa847I8Ur9cu+eXKoQfFEUyWOP1hjWpiP8ltujSQL\n\tDDamQkdM5XFEQfgbpkAoNQiIylnEgI/AGAfu8XuA=","To":"Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","References":"<20210818155403.268694-1-jeanmichel.hautbois@ideasonboard.com>\n\t<20210818155403.268694-4-jeanmichel.hautbois@ideasonboard.com>","From":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Message-ID":"<fd611728-2514-ae3f-eb6e-0aadbc715be6@ideasonboard.com>","Date":"Wed, 18 Aug 2021 22:19:59 +0100","User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101\n\tThunderbird/78.11.0","MIME-Version":"1.0","In-Reply-To":"<20210818155403.268694-4-jeanmichel.hautbois@ideasonboard.com>","Content-Type":"text/plain; charset=utf-8","Content-Language":"en-GB","Content-Transfer-Encoding":"8bit","Subject":"Re: [libcamera-devel] [PATCH v3 3/9] ipa: ipu3: Add the functions\n\tto the Algorithm class","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":18934,"web_url":"https://patchwork.libcamera.org/comment/18934/","msgid":"<YR2DGtiYST+ZNRnF@pendragon.ideasonboard.com>","date":"2021-08-18T22:00:58","subject":"Re: [libcamera-devel] [PATCH v3 7/9] ipa: ipu3: convert AGC to the\n\tnew algorithm interface","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 Wed, Aug 18, 2021 at 05:54:01PM +0200, Jean-Michel Hautbois wrote:\n> In preparation for using the AGC through the new algorithm interfaces,\n> convert the existing code to use the new function types.\n> \n> Now that the process call is rewritten, re-enable the compiler flag to\n> warn when a function declaration hides virtual functions from a base class\n> (-Woverloaded-virtual).\n> \n> We never use converged_ so remove its declaration.\n> The controls may not need to be updated at each call, but it should be\n> decided on the context side and not by a specific call by using a lock\n> status in the Agc structure for instance.\n> \n> Signed-off-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>\n> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n> ---\n>  meson.build               |  4 ----\n>  src/ipa/ipu3/ipu3.cpp     |  8 +++-----\n>  src/ipa/ipu3/ipu3_agc.cpp | 19 +++++++------------\n>  src/ipa/ipu3/ipu3_agc.h   |  9 ++-------\n>  4 files changed, 12 insertions(+), 28 deletions(-)\n> \n> diff --git a/meson.build b/meson.build\n> index 4a10e2b6..a49c484f 100644\n> --- a/meson.build\n> +++ b/meson.build\n> @@ -108,10 +108,6 @@ if cc.has_argument('-Wno-c99-designator')\n>      ]\n>  endif\n>  \n> -# Do not warn when a function declaration hides virtual functions from\n> -# a base class\n> -cpp_arguments += '-Wno-overloaded-virtual'\n> -\n>  c_arguments += common_arguments\n>  cpp_arguments += common_arguments\n>  \n> diff --git a/src/ipa/ipu3/ipu3.cpp b/src/ipa/ipu3/ipu3.cpp\n> index 2b4a4c8c..423cc957 100644\n> --- a/src/ipa/ipu3/ipu3.cpp\n> +++ b/src/ipa/ipu3/ipu3.cpp\n> @@ -341,7 +341,7 @@ int IPAIPU3::configure(const IPAConfigInfo &configInfo)\n>  \tawbAlgo_ = std::make_unique<IPU3Awb>();\n>  \n>  \tagcAlgo_ = std::make_unique<IPU3Agc>();\n> -\tagcAlgo_->initialise(context_.configuration.grid.bdsGrid, sensorInfo_);\n> +\tagcAlgo_->configure(context_, configInfo);\n>  \n>  \treturn 0;\n>  }\n> @@ -418,8 +418,7 @@ void IPAIPU3::fillParams(unsigned int frame, ipu3_uapi_params *params)\n>  \tfor (auto const &algo : algorithms_)\n>  \t\talgo->prepare(context_, params_);\n>  \n> -\tif (agcAlgo_->updateControls())\n> -\t\tawbAlgo_->prepare(context_, params_);\n> +\tawbAlgo_->prepare(context_, params_);\n>  \n>  \t*params = params_;\n>  \n> @@ -447,8 +446,7 @@ void IPAIPU3::parseStatistics(unsigned int frame,\n>  \n>  \tawbAlgo_->process(context_, stats);\n>  \n> -\tif (agcAlgo_->updateControls())\n> -\t\tsetControls(frame);\n> +\tsetControls(frame);\n>  \n>  \t/* \\todo Use VBlank value calculated from each frame exposure. */\n>  \tint64_t frameDuration = sensorInfo_.lineLength * (defVBlank_ + sensorInfo_.outputSize.height) /\n> diff --git a/src/ipa/ipu3/ipu3_agc.cpp b/src/ipa/ipu3/ipu3_agc.cpp\n> index c6782ff4..1c1f5fb5 100644\n> --- a/src/ipa/ipu3/ipu3_agc.cpp\n> +++ b/src/ipa/ipu3/ipu3_agc.cpp\n> @@ -51,20 +51,20 @@ static constexpr double kEvGainTarget = 0.5;\n>  static constexpr uint8_t kCellSize = 8;\n>  \n>  IPU3Agc::IPU3Agc()\n> -\t: frameCount_(0), lastFrame_(0), converged_(false),\n> -\t  updateControls_(false), iqMean_(0.0),\n> -\t  lineDuration_(0s), maxExposureTime_(0s),\n> -\t  prevExposure_(0s), prevExposureNoDg_(0s),\n> +\t: frameCount_(0), lastFrame_(0), iqMean_(0.0), lineDuration_(0s),\n> +\t  maxExposureTime_(0s), prevExposure_(0s), prevExposureNoDg_(0s),\n>  \t  currentExposure_(0s), currentExposureNoDg_(0s)\n>  {\n>  }\n>  \n> -void IPU3Agc::initialise(struct ipu3_uapi_grid_config &bdsGrid, const IPACameraSensorInfo &sensorInfo)\n> +int IPU3Agc::configure(IPAContext &context, const IPAConfigInfo &configInfo)\n>  {\n> -\taeGrid_ = bdsGrid;\n> +\taeGrid_ = context.configuration.grid.bdsGrid;\n\nDo we need to keep a copy of the grid, can't we git it from the context\nwhen needed ? It doesn't have to be addressed in this patch, could be\ndone on top if easier.\n\n>  \n> -\tlineDuration_ = sensorInfo.lineLength * 1.0s / sensorInfo.pixelRate;\n> +\tlineDuration_ = configInfo.sensorInfo.lineLength * 1.0s / configInfo.sensorInfo.pixelRate;\n\nLine wrap again :-)\n\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\n>  \tmaxExposureTime_ = kMaxExposure * lineDuration_;\n> +\n> +\treturn 0;\n>  }\n>  \n>  void IPU3Agc::processBrightness(const ipu3_uapi_stats_3a *stats)\n> @@ -144,8 +144,6 @@ void IPU3Agc::filterExposure()\n>  \n>  void IPU3Agc::lockExposureGain(uint32_t &exposure, double &gain)\n>  {\n> -\tupdateControls_ = false;\n> -\n>  \t/* Algorithm initialization should wait for first valid frames */\n>  \t/* \\todo - have a number of frames given by DelayedControls ?\n>  \t * - implement a function for IIR */\n> @@ -155,7 +153,6 @@ void IPU3Agc::lockExposureGain(uint32_t &exposure, double &gain)\n>  \t/* Are we correctly exposed ? */\n>  \tif (std::abs(iqMean_ - kEvGainTarget * knumHistogramBins) <= 1) {\n>  \t\tLOG(IPU3Agc, Debug) << \"!!! Good exposure with iqMean = \" << iqMean_;\n> -\t\tconverged_ = true;\n>  \t} else {\n>  \t\tdouble newGain = kEvGainTarget * knumHistogramBins / iqMean_;\n>  \n> @@ -178,12 +175,10 @@ void IPU3Agc::lockExposureGain(uint32_t &exposure, double &gain)\n>  \t\t\texposure = std::clamp(static_cast<uint32_t>(exposure * currentExposure_ / currentExposureNoDg_), kMinExposure, kMaxExposure);\n>  \t\t\tnewExposure = currentExposure_ / exposure;\n>  \t\t\tgain = std::clamp(static_cast<uint32_t>(gain * currentExposure_ / newExposure), kMinGain, kMaxGain);\n> -\t\t\tupdateControls_ = true;\n>  \t\t} else if (currentShutter >= maxExposureTime_) {\n>  \t\t\tgain = std::clamp(static_cast<uint32_t>(gain * currentExposure_ / currentExposureNoDg_), kMinGain, kMaxGain);\n>  \t\t\tnewExposure = currentExposure_ / gain;\n>  \t\t\texposure = std::clamp(static_cast<uint32_t>(exposure * currentExposure_ / newExposure), kMinExposure, kMaxExposure);\n> -\t\t\tupdateControls_ = true;\n>  \t\t}\n>  \t\tLOG(IPU3Agc, Debug) << \"Adjust exposure \" << exposure * lineDuration_ << \" and gain \" << gain;\n>  \t}\n> diff --git a/src/ipa/ipu3/ipu3_agc.h b/src/ipa/ipu3/ipu3_agc.h\n> index f8290abd..0e922664 100644\n> --- a/src/ipa/ipu3/ipu3_agc.h\n> +++ b/src/ipa/ipu3/ipu3_agc.h\n> @@ -29,10 +29,8 @@ public:\n>  \tIPU3Agc();\n>  \t~IPU3Agc() = default;\n>  \n> -\tvoid initialise(struct ipu3_uapi_grid_config &bdsGrid, const IPACameraSensorInfo &sensorInfo);\n> -\tvoid process(IPAContext &context, const ipu3_uapi_stats_3a *stats);\n> -\tbool converged() { return converged_; }\n> -\tbool updateControls() { return updateControls_; }\n> +\tint configure(IPAContext &context, const IPAConfigInfo &configInfo) override;\n> +\tvoid process(IPAContext &context, const ipu3_uapi_stats_3a *stats) override;\n>  \n>  private:\n>  \tvoid processBrightness(const ipu3_uapi_stats_3a *stats);\n> @@ -44,9 +42,6 @@ private:\n>  \tuint64_t frameCount_;\n>  \tuint64_t lastFrame_;\n>  \n> -\tbool converged_;\n> -\tbool updateControls_;\n> -\n>  \tdouble iqMean_;\n>  \n>  \tDuration lineDuration_;","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 3124CBD87D\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 18 Aug 2021 22:01:10 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 5C15568895;\n\tThu, 19 Aug 2021 00:01:09 +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 5538C6025C\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 19 Aug 2021 00:01:07 +0200 (CEST)","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 B97CA2A8;\n\tThu, 19 Aug 2021 00:01: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=\"s5eOAVOO\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1629324066;\n\tbh=0OV1yuK+nJ7tFbiSSht0euUD+hsyn9KJ2qa56w9YDag=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=s5eOAVOOnDYpB2cqvlPiXjqsnpr6u9GEZw9KXJ+l+uf0RycwmUD2iMgx7+7z8F1e9\n\tlOBEX9D4gQY9u4h0zIo3NuOGetMnx8EsdXDqdHMi7zryODSCcn69kIkwq/uDdgA3XC\n\t0d2jN5yZUv6pJBZWPFHTY3J5/0QWcYaY8DTTZmTI=","Date":"Thu, 19 Aug 2021 01:00:58 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>","Message-ID":"<YR2DGtiYST+ZNRnF@pendragon.ideasonboard.com>","References":"<20210818155403.268694-1-jeanmichel.hautbois@ideasonboard.com>\n\t<20210818155403.268694-8-jeanmichel.hautbois@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20210818155403.268694-8-jeanmichel.hautbois@ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH v3 7/9] ipa: ipu3: convert AGC to the\n\tnew algorithm interface","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>"}}]