[{"id":23272,"web_url":"https://patchwork.libcamera.org/comment/23272/","msgid":"<4455d5bd-8aa3-abfc-12e4-c9e7aefeb29d@ideasonboard.com>","date":"2022-06-01T07:56:42","subject":"Re: [libcamera-devel] [RFC PATCH v2 3/3] ipa: algorithm: process()\n\tshould take in frame number instead of context","submitter":{"id":75,"url":"https://patchwork.libcamera.org/api/people/75/","name":"Jean-Michel Hautbois","email":"jeanmichel.hautbois@ideasonboard.com"},"content":"Hi Umang,\n\nThanks for the patch !\n\nOn 27/05/2022 21:17, Umang Jain via libcamera-devel wrote:\n> This will enable algorithms to extract a frame context from the FCQueue\n> using the frame number. This is required because algorithms can operate\n> on different frames at different points in time (according to frame latency\n> they need to respect).\n> \n> Signed-off-by: Umang Jain <umang.jain@ideasonboard.com>\n> Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>\n> ---\n>   src/ipa/ipu3/algorithms/af.cpp           |  2 +-\n>   src/ipa/ipu3/algorithms/af.h             |  2 +-\n>   src/ipa/ipu3/algorithms/agc.cpp          | 13 +++++++------\n>   src/ipa/ipu3/algorithms/agc.h            |  4 ++--\n>   src/ipa/ipu3/algorithms/algorithm.h      |  4 ++--\n>   src/ipa/ipu3/algorithms/awb.cpp          |  2 +-\n>   src/ipa/ipu3/algorithms/awb.h            |  2 +-\n>   src/ipa/ipu3/algorithms/tone_mapping.cpp |  2 +-\n>   src/ipa/ipu3/algorithms/tone_mapping.h   |  2 +-\n>   src/ipa/ipu3/ipu3.cpp                    |  2 +-\n>   src/ipa/libipa/algorithm.cpp             |  2 +-\n>   src/ipa/libipa/algorithm.h               |  6 +++---\n>   src/ipa/rkisp1/algorithms/agc.cpp        |  3 +--\n>   src/ipa/rkisp1/algorithms/agc.h          |  2 +-\n>   src/ipa/rkisp1/algorithms/algorithm.h    |  5 ++---\n>   src/ipa/rkisp1/algorithms/awb.cpp        |  2 +-\n>   src/ipa/rkisp1/algorithms/awb.h          |  2 +-\n>   src/ipa/rkisp1/rkisp1.cpp                |  2 +-\n>   18 files changed, 29 insertions(+), 30 deletions(-)\n> \n> diff --git a/src/ipa/ipu3/algorithms/af.cpp b/src/ipa/ipu3/algorithms/af.cpp\n> index d07521a0..24462c6b 100644\n> --- a/src/ipa/ipu3/algorithms/af.cpp\n> +++ b/src/ipa/ipu3/algorithms/af.cpp\n> @@ -420,7 +420,7 @@ bool Af::afIsOutOfFocus(IPAContext context)\n>    *\n>    * [1] Hill Climbing Algorithm, https://en.wikipedia.org/wiki/Hill_climbing\n>    */\n> -void Af::process(IPAContext &context, [[maybe_unused]] IPAFrameContext *frameContext,\n> +void Af::process(IPAContext &context, [[maybe_unused]] uint32_t frame,\n>   \t\t const ipu3_uapi_stats_3a *stats)\n>   {\n\nYou need to document it properly:\n'''\n/home/jm/libcamera/src/ipa/ipu3/algorithms/af.cpp:408: warning: argument \n'frameContext' of command @param is not found in the argument list of \nlibcamera::ipa::ipu3::algorithms::Af::process(IPAContext &context, \nuint32_t frame, const ipu3_uapi_stats_3a *stats)\n/home/jm/libcamera/src/ipa/ipu3/algorithms/af.cpp:408: warning: The \nfollowing parameter of \nlibcamera::ipa::ipu3::algorithms::Af::process(IPAContext &context, \nuint32_t frame, const ipu3_uapi_stats_3a *stats) is not documented:\n   parameter 'frame'\n'''\n\nSame for agc and tonemapping functions below :-).\n\nWith it:\nReviewed-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>\n\n>   \t/* Evaluate the AF buffer length */\n> diff --git a/src/ipa/ipu3/algorithms/af.h b/src/ipa/ipu3/algorithms/af.h\n> index ccf015f3..69aeb3e2 100644\n> --- a/src/ipa/ipu3/algorithms/af.h\n> +++ b/src/ipa/ipu3/algorithms/af.h\n> @@ -32,7 +32,7 @@ public:\n>   \n>   \tvoid prepare(IPAContext &context, ipu3_uapi_params *params) override;\n>   \tint configure(IPAContext &context, const IPAConfigInfo &configInfo) override;\n> -\tvoid process(IPAContext &context, IPAFrameContext *frameContext,\n> +\tvoid process(IPAContext &context, uint32_t frame,\n>   \t\t     const ipu3_uapi_stats_3a *stats) override;\n>   \n>   private:\n> diff --git a/src/ipa/ipu3/algorithms/agc.cpp b/src/ipa/ipu3/algorithms/agc.cpp\n> index f16be534..41766007 100644\n> --- a/src/ipa/ipu3/algorithms/agc.cpp\n> +++ b/src/ipa/ipu3/algorithms/agc.cpp\n> @@ -183,13 +183,14 @@ utils::Duration Agc::filterExposure(utils::Duration exposureValue)\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(IPAContext &context, IPAFrameContext *frameContext,\n> -\t\t\t  double yGain, double iqMeanGain)\n> +void Agc::computeExposure(IPAContext &context, uint32_t frame, double yGain,\n> +\t\t\t  double iqMeanGain)\n>   {\n>   \tconst IPASessionConfiguration &configuration = context.configuration;\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> +\tIPAFrameContext &frameContext = context.frameContexts.get(frame);\n> +\tuint32_t exposure = frameContext.sensor.exposure;\n> +\tdouble analogueGain = frameContext.sensor.gain;\n>   \n>   \t/* Use the highest of the two gain estimates. */\n>   \tdouble evGain = std::max(yGain, iqMeanGain);\n> @@ -323,7 +324,7 @@ double Agc::estimateLuminance(IPAActiveState &activeState,\n>    * Identify the current image brightness, and use that to estimate the optimal\n>    * new exposure and gain for the scene.\n>    */\n> -void Agc::process(IPAContext &context, [[maybe_unused]] IPAFrameContext *frameContext,\n> +void Agc::process(IPAContext &context, [[maybe_unused]] uint32_t frame,\n>   \t\t  const ipu3_uapi_stats_3a *stats)\n>   {\n>   \t/*\n> @@ -359,7 +360,7 @@ void Agc::process(IPAContext &context, [[maybe_unused]] IPAFrameContext *frameCo\n>   \t\t\tbreak;\n>   \t}\n>   \n> -\tcomputeExposure(context, frameContext, yGain, iqMeanGain);\n> +\tcomputeExposure(context, frame, 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 105ae0f2..8ef2a2d8 100644\n> --- a/src/ipa/ipu3/algorithms/agc.h\n> +++ b/src/ipa/ipu3/algorithms/agc.h\n> @@ -28,14 +28,14 @@ public:\n>   \t~Agc() = default;\n>   \n>   \tint configure(IPAContext &context, const IPAConfigInfo &configInfo) override;\n> -\tvoid process(IPAContext &context, IPAFrameContext *frameContext,\n> +\tvoid process(IPAContext &context, uint32_t frame,\n>   \t\t     const ipu3_uapi_stats_3a *stats) override;\n>   \n>   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(IPAContext &context, IPAFrameContext *frameContext,\n> +\tvoid computeExposure(IPAContext &context, uint32_t frame,\n>   \t\t\t     double yGain, double iqMeanGain);\n>   \tdouble estimateLuminance(IPAActiveState &activeState,\n>   \t\t\t\t const ipu3_uapi_grid_config &grid,\n> diff --git a/src/ipa/ipu3/algorithms/algorithm.h b/src/ipa/ipu3/algorithms/algorithm.h\n> index 234b2bd7..3e0c60d3 100644\n> --- a/src/ipa/ipu3/algorithms/algorithm.h\n> +++ b/src/ipa/ipu3/algorithms/algorithm.h\n> @@ -17,8 +17,8 @@ namespace libcamera {\n>   \n>   namespace ipa::ipu3 {\n>   \n> -using Algorithm = libcamera::ipa::Algorithm<IPAContext, IPAFrameContext,\n> -\t\t\t\t\t    IPAConfigInfo, ipu3_uapi_params,\n> +using Algorithm = libcamera::ipa::Algorithm<IPAContext, IPAConfigInfo,\n> +\t\t\t\t\t    ipu3_uapi_params,\n>   \t\t\t\t\t    ipu3_uapi_stats_3a>;\n>   \n>   } /* namespace ipa::ipu3 */\n> diff --git a/src/ipa/ipu3/algorithms/awb.cpp b/src/ipa/ipu3/algorithms/awb.cpp\n> index 5c232d92..35f35ebe 100644\n> --- a/src/ipa/ipu3/algorithms/awb.cpp\n> +++ b/src/ipa/ipu3/algorithms/awb.cpp\n> @@ -387,7 +387,7 @@ void Awb::calculateWBGains(const ipu3_uapi_stats_3a *stats)\n>   /**\n>    * \\copydoc libcamera::ipa::Algorithm::process\n>    */\n> -void Awb::process(IPAContext &context, [[maybe_unused]] IPAFrameContext *frameContext,\n> +void Awb::process(IPAContext &context, [[maybe_unused]] uint32_t frame,\n>   \t\t  const ipu3_uapi_stats_3a *stats)\n>   {\n>   \tcalculateWBGains(stats);\n> diff --git a/src/ipa/ipu3/algorithms/awb.h b/src/ipa/ipu3/algorithms/awb.h\n> index 9a50a985..f263540c 100644\n> --- a/src/ipa/ipu3/algorithms/awb.h\n> +++ b/src/ipa/ipu3/algorithms/awb.h\n> @@ -40,7 +40,7 @@ public:\n>   \n>   \tint configure(IPAContext &context, const IPAConfigInfo &configInfo) override;\n>   \tvoid prepare(IPAContext &context, ipu3_uapi_params *params) override;\n> -\tvoid process(IPAContext &context, IPAFrameContext *frameContext,\n> +\tvoid process(IPAContext &context, uint32_t frame,\n>   \t\t     const ipu3_uapi_stats_3a *stats) override;\n>   \n>   private:\n> diff --git a/src/ipa/ipu3/algorithms/tone_mapping.cpp b/src/ipa/ipu3/algorithms/tone_mapping.cpp\n> index f86e79b2..0f70b8aa 100644\n> --- a/src/ipa/ipu3/algorithms/tone_mapping.cpp\n> +++ b/src/ipa/ipu3/algorithms/tone_mapping.cpp\n> @@ -78,7 +78,7 @@ void ToneMapping::prepare([[maybe_unused]] IPAContext &context,\n>    * The tone mapping look up table is generated as an inverse power curve from\n>    * our gamma setting.\n>    */\n> -void ToneMapping::process(IPAContext &context, [[maybe_unused]] IPAFrameContext *frameContext,\n> +void ToneMapping::process(IPAContext &context, [[maybe_unused]] uint32_t frame,\n>   \t\t\t  [[maybe_unused]] const ipu3_uapi_stats_3a *stats)\n>   {\n>   \t/*\n> diff --git a/src/ipa/ipu3/algorithms/tone_mapping.h b/src/ipa/ipu3/algorithms/tone_mapping.h\n> index d7d48006..61474085 100644\n> --- a/src/ipa/ipu3/algorithms/tone_mapping.h\n> +++ b/src/ipa/ipu3/algorithms/tone_mapping.h\n> @@ -20,7 +20,7 @@ public:\n>   \n>   \tint configure(IPAContext &context, const IPAConfigInfo &configInfo) override;\n>   \tvoid prepare(IPAContext &context, ipu3_uapi_params *params) override;\n> -\tvoid process(IPAContext &context, IPAFrameContext *frameContext,\n> +\tvoid process(IPAContext &context, uint32_t frame,\n>   \t\t     const ipu3_uapi_stats_3a *stats) override;\n>   \n>   private:\n> diff --git a/src/ipa/ipu3/ipu3.cpp b/src/ipa/ipu3/ipu3.cpp\n> index e09c5d05..4f33b1a6 100644\n> --- a/src/ipa/ipu3/ipu3.cpp\n> +++ b/src/ipa/ipu3/ipu3.cpp\n> @@ -582,7 +582,7 @@ void IPAIPU3::processStatsBuffer(const uint32_t frame,\n>   \tControlList ctrls(controls::controls);\n>   \n>   \tfor (auto const &algo : algorithms_)\n> -\t\talgo->process(context_, &frameContext, stats);\n> +\t\talgo->process(context_, frame, stats);\n>   \n>   \tsetControls(frame);\n>   \n> diff --git a/src/ipa/libipa/algorithm.cpp b/src/ipa/libipa/algorithm.cpp\n> index cce2ed62..c0a9bbeb 100644\n> --- a/src/ipa/libipa/algorithm.cpp\n> +++ b/src/ipa/libipa/algorithm.cpp\n> @@ -64,7 +64,7 @@ namespace ipa {\n>    * \\fn Algorithm::process()\n>    * \\brief Process ISP statistics, and run algorithm operations\n>    * \\param[in] context The shared IPA context\n> - * \\param[in] frameContext The current frame's context\n> + * \\param[in] frame The current frame id\n>    * \\param[in] stats The IPA statistics and ISP results\n>    *\n>    * This function is called while camera is running for every frame processed by\n> diff --git a/src/ipa/libipa/algorithm.h b/src/ipa/libipa/algorithm.h\n> index 032a05b5..d1ca0883 100644\n> --- a/src/ipa/libipa/algorithm.h\n> +++ b/src/ipa/libipa/algorithm.h\n> @@ -10,8 +10,8 @@ namespace libcamera {\n>   \n>   namespace ipa {\n>   \n> -template<typename Context, typename FrameContext, typename Config,\n> -\t typename Params, typename Stats>\n> +template<typename Context, typename Config, typename Params, typename Stats>\n> +\n>   class Algorithm\n>   {\n>   public:\n> @@ -29,7 +29,7 @@ public:\n>   \t}\n>   \n>   \tvirtual void process([[maybe_unused]] Context &context,\n> -\t\t\t     [[maybe_unused]] FrameContext *frameContext,\n> +\t\t\t     [[maybe_unused]] uint32_t frame,\n>   \t\t\t     [[maybe_unused]] const Stats *stats)\n>   \t{\n>   \t}\n> diff --git a/src/ipa/rkisp1/algorithms/agc.cpp b/src/ipa/rkisp1/algorithms/agc.cpp\n> index b5a184d9..9418b533 100644\n> --- a/src/ipa/rkisp1/algorithms/agc.cpp\n> +++ b/src/ipa/rkisp1/algorithms/agc.cpp\n> @@ -280,8 +280,7 @@ double Agc::measureBrightness(const rkisp1_cif_isp_hist_stat *hist) const\n>    * Identify the current image brightness, and use that to estimate the optimal\n>    * new exposure and gain for the scene.\n>    */\n> -void Agc::process(IPAContext &context,\n> -\t\t  [[maybe_unused]] IPAFrameContext *frameContext,\n> +void Agc::process(IPAContext &context, [[maybe_unused]] uint32_t frame,\n>   \t\t  const rkisp1_stat_buffer *stats)\n>   {\n>   \tconst rkisp1_cif_isp_stat *params = &stats->params;\n> diff --git a/src/ipa/rkisp1/algorithms/agc.h b/src/ipa/rkisp1/algorithms/agc.h\n> index 22c02779..a749f1c3 100644\n> --- a/src/ipa/rkisp1/algorithms/agc.h\n> +++ b/src/ipa/rkisp1/algorithms/agc.h\n> @@ -29,7 +29,7 @@ public:\n>   \n>   \tint configure(IPAContext &context, const IPACameraSensorInfo &configInfo) override;\n>   \tvoid prepare(IPAContext &context, rkisp1_params_cfg *params) override;\n> -\tvoid process(IPAContext &context, IPAFrameContext *frameContext,\n> +\tvoid process(IPAContext &context, uint32_t frame,\n>   \t\t     const rkisp1_stat_buffer *stats) override;\n>   \n>   private:\n> diff --git a/src/ipa/rkisp1/algorithms/algorithm.h b/src/ipa/rkisp1/algorithms/algorithm.h\n> index 68e3a44e..069c744c 100644\n> --- a/src/ipa/rkisp1/algorithms/algorithm.h\n> +++ b/src/ipa/rkisp1/algorithms/algorithm.h\n> @@ -19,9 +19,8 @@ namespace libcamera {\n>   \n>   namespace ipa::rkisp1 {\n>   \n> -using Algorithm = libcamera::ipa::Algorithm<IPAContext, IPAFrameContext,\n> -\t\t\t\t\t    IPACameraSensorInfo, rkisp1_params_cfg,\n> -\t\t\t\t\t    rkisp1_stat_buffer>;\n> +using Algorithm = libcamera::ipa::Algorithm<IPAContext, IPACameraSensorInfo,\n> +\t\t\t\t\t    rkisp1_params_cfg, rkisp1_stat_buffer>;\n>   \n>   } /* namespace ipa::rkisp1 */\n>   \n> diff --git a/src/ipa/rkisp1/algorithms/awb.cpp b/src/ipa/rkisp1/algorithms/awb.cpp\n> index 88441382..1e7fd11a 100644\n> --- a/src/ipa/rkisp1/algorithms/awb.cpp\n> +++ b/src/ipa/rkisp1/algorithms/awb.cpp\n> @@ -120,7 +120,7 @@ void Awb::prepare(IPAContext &context, rkisp1_params_cfg *params)\n>    * \\copydoc libcamera::ipa::Algorithm::process\n>    */\n>   void Awb::process([[maybe_unused]] IPAContext &context,\n> -\t\t  [[maybe_unused]] IPAFrameContext *frameCtx,\n> +\t\t  [[maybe_unused]] uint32_t frame,\n>   \t\t  const rkisp1_stat_buffer *stats)\n>   {\n>   \tconst rkisp1_cif_isp_stat *params = &stats->params;\n> diff --git a/src/ipa/rkisp1/algorithms/awb.h b/src/ipa/rkisp1/algorithms/awb.h\n> index 7647842f..82921f34 100644\n> --- a/src/ipa/rkisp1/algorithms/awb.h\n> +++ b/src/ipa/rkisp1/algorithms/awb.h\n> @@ -23,7 +23,7 @@ public:\n>   \n>   \tint configure(IPAContext &context, const IPACameraSensorInfo &configInfo) override;\n>   \tvoid prepare(IPAContext &context, rkisp1_params_cfg *params) override;\n> -\tvoid process(IPAContext &context, IPAFrameContext *frameCtx,\n> +\tvoid process(IPAContext &context, uint32_t frame,\n>   \t\t     const rkisp1_stat_buffer *stats) override;\n>   \n>   private:\n> diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp\n> index c818a6d7..ad33d817 100644\n> --- a/src/ipa/rkisp1/rkisp1.cpp\n> +++ b/src/ipa/rkisp1/rkisp1.cpp\n> @@ -272,7 +272,7 @@ void IPARkISP1::processStatsBuffer(const uint32_t frame, const uint32_t bufferId\n>   \tunsigned int aeState = 0;\n>   \n>   \tfor (auto const &algo : algorithms_)\n> -\t\talgo->process(context_, nullptr, stats);\n> +\t\talgo->process(context_, frame, stats);\n>   \n>   \tsetControls(frame);\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 3982EBD161\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed,  1 Jun 2022 07:56:49 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 59667633A7;\n\tWed,  1 Jun 2022 09:56:48 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id A243260414\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed,  1 Jun 2022 09:56:46 +0200 (CEST)","from [IPV6:2a01:e0a:169:7140:2d00:c89c:70b:c9ee] (unknown\n\t[IPv6:2a01:e0a:169:7140:2d00:c89c:70b:c9ee])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id EB4AA6F0;\n\tWed,  1 Jun 2022 09:56:45 +0200 (CEST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1654070208;\n\tbh=CPMz8PBmldFR0ZixK7sWIy98Q43LRm6Hny/yxrv0knI=;\n\th=Date:To:References:In-Reply-To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:\n\tFrom;\n\tb=dc/lEKqEOC7yEBYwxI85bbVqARiCnF24wbl5D+a2V8o1H4Lv+/MeblMt8UiuC+zjQ\n\tyvy1+zfAv4JIDuKVbJRhlN30V2n4fmDonqQdRXpcorAZizxHsgtzQ0Vh879tm8M7Of\n\tKBCFfZwMFfwE9RrEm5d3bAKIJIb4aWoZeu6t6J3JsaJIOsGVW1zUbM0txYZQ1vTNUD\n\t6wal0Z4SPej+XPQrY1cE/O2xK5ncKq1G9laqgrHT6dlnTtPJrrxBxKYyrJPZGXXSUv\n\toNqfJ3yUAePJLE03V1HSzzFm0bp79p1pbuorH6VBXSODv/4lY4a1EGh5UwGommxVRk\n\t6lP6lHLsjpipQ==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1654070206;\n\tbh=CPMz8PBmldFR0ZixK7sWIy98Q43LRm6Hny/yxrv0knI=;\n\th=Date:Subject:To:References:From:In-Reply-To:From;\n\tb=qHDdYJBfwA/6PoPfcLx0xv5mQE1teP/lON7i/eZ/MCnZc8I/7+blhoantYbtR24Vg\n\tbNU7wd6a78j2LA+/PnZTOzwWcVa4iSb9iztETVeT8ph2kF9rI+IYbRly1iRbu0/tyi\n\t9NojFspZHFqd1rZ7T7V6PTFn7n/nxiSGoVvHd2+g="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"qHDdYJBf\"; dkim-atps=neutral","Message-ID":"<4455d5bd-8aa3-abfc-12e4-c9e7aefeb29d@ideasonboard.com>","Date":"Wed, 1 Jun 2022 09:56:42 +0200","MIME-Version":"1.0","User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101\n\tThunderbird/91.9.1","Content-Language":"en-US","To":"Umang Jain <umang.jain@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","References":"<20220527191740.242300-1-umang.jain@ideasonboard.com>\n\t<20220527191740.242300-4-umang.jain@ideasonboard.com>","In-Reply-To":"<20220527191740.242300-4-umang.jain@ideasonboard.com>","Content-Type":"text/plain; charset=UTF-8; format=flowed","Content-Transfer-Encoding":"7bit","Subject":"Re: [libcamera-devel] [RFC PATCH v2 3/3] ipa: algorithm: process()\n\tshould take in frame number instead of context","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>","From":"Jean-Michel Hautbois via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":23273,"web_url":"https://patchwork.libcamera.org/comment/23273/","msgid":"<c0d16942-9e62-8535-2b0c-d724c3589b1e@ideasonboard.com>","date":"2022-06-01T07:58:30","subject":"Re: [libcamera-devel] [RFC PATCH v2 3/3] ipa: algorithm: process()\n\tshould take in frame number instead of context","submitter":{"id":86,"url":"https://patchwork.libcamera.org/api/people/86/","name":"Umang Jain","email":"umang.jain@ideasonboard.com"},"content":"Hi JM\n\nOn 6/1/22 09:56, Jean-Michel Hautbois wrote:\n> Hi Umang,\n>\n> Thanks for the patch !\n>\n> On 27/05/2022 21:17, Umang Jain via libcamera-devel wrote:\n>> This will enable algorithms to extract a frame context from the FCQueue\n>> using the frame number. This is required because algorithms can operate\n>> on different frames at different points in time (according to frame \n>> latency\n>> they need to respect).\n>>\n>> Signed-off-by: Umang Jain <umang.jain@ideasonboard.com>\n>> Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>\n>> ---\n>>   src/ipa/ipu3/algorithms/af.cpp           |  2 +-\n>>   src/ipa/ipu3/algorithms/af.h             |  2 +-\n>>   src/ipa/ipu3/algorithms/agc.cpp          | 13 +++++++------\n>>   src/ipa/ipu3/algorithms/agc.h            |  4 ++--\n>>   src/ipa/ipu3/algorithms/algorithm.h      |  4 ++--\n>>   src/ipa/ipu3/algorithms/awb.cpp          |  2 +-\n>>   src/ipa/ipu3/algorithms/awb.h            |  2 +-\n>>   src/ipa/ipu3/algorithms/tone_mapping.cpp |  2 +-\n>>   src/ipa/ipu3/algorithms/tone_mapping.h   |  2 +-\n>>   src/ipa/ipu3/ipu3.cpp                    |  2 +-\n>>   src/ipa/libipa/algorithm.cpp             |  2 +-\n>>   src/ipa/libipa/algorithm.h               |  6 +++---\n>>   src/ipa/rkisp1/algorithms/agc.cpp        |  3 +--\n>>   src/ipa/rkisp1/algorithms/agc.h          |  2 +-\n>>   src/ipa/rkisp1/algorithms/algorithm.h    |  5 ++---\n>>   src/ipa/rkisp1/algorithms/awb.cpp        |  2 +-\n>>   src/ipa/rkisp1/algorithms/awb.h          |  2 +-\n>>   src/ipa/rkisp1/rkisp1.cpp                |  2 +-\n>>   18 files changed, 29 insertions(+), 30 deletions(-)\n>>\n>> diff --git a/src/ipa/ipu3/algorithms/af.cpp \n>> b/src/ipa/ipu3/algorithms/af.cpp\n>> index d07521a0..24462c6b 100644\n>> --- a/src/ipa/ipu3/algorithms/af.cpp\n>> +++ b/src/ipa/ipu3/algorithms/af.cpp\n>> @@ -420,7 +420,7 @@ bool Af::afIsOutOfFocus(IPAContext context)\n>>    *\n>>    * [1] Hill Climbing Algorithm, \n>> https://en.wikipedia.org/wiki/Hill_climbing\n>>    */\n>> -void Af::process(IPAContext &context, [[maybe_unused]] \n>> IPAFrameContext *frameContext,\n>> +void Af::process(IPAContext &context, [[maybe_unused]] uint32_t frame,\n>>            const ipu3_uapi_stats_3a *stats)\n>>   {\n>\n> You need to document it properly:\n> '''\n> /home/jm/libcamera/src/ipa/ipu3/algorithms/af.cpp:408: warning: \n> argument 'frameContext' of command @param is not found in the argument \n> list of libcamera::ipa::ipu3::algorithms::Af::process(IPAContext \n> &context, uint32_t frame, const ipu3_uapi_stats_3a *stats)\n> /home/jm/libcamera/src/ipa/ipu3/algorithms/af.cpp:408: warning: The \n> following parameter of \n> libcamera::ipa::ipu3::algorithms::Af::process(IPAContext &context, \n> uint32_t frame, const ipu3_uapi_stats_3a *stats) is not documented:\n>   parameter 'frame'\n> '''\n\n\nI have mentioned in the cover that the documentation might be 'broken'. \nI ran out of time when I was writing this design hence, left fixing \ndocumentation\n\n>\n> Same for agc and tonemapping functions below :-).\n>\n> With it:\n> Reviewed-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>\n>\n>>       /* Evaluate the AF buffer length */\n>> diff --git a/src/ipa/ipu3/algorithms/af.h b/src/ipa/ipu3/algorithms/af.h\n>> index ccf015f3..69aeb3e2 100644\n>> --- a/src/ipa/ipu3/algorithms/af.h\n>> +++ b/src/ipa/ipu3/algorithms/af.h\n>> @@ -32,7 +32,7 @@ public:\n>>         void prepare(IPAContext &context, ipu3_uapi_params *params) \n>> override;\n>>       int configure(IPAContext &context, const IPAConfigInfo \n>> &configInfo) override;\n>> -    void process(IPAContext &context, IPAFrameContext *frameContext,\n>> +    void process(IPAContext &context, uint32_t frame,\n>>                const ipu3_uapi_stats_3a *stats) override;\n>>     private:\n>> diff --git a/src/ipa/ipu3/algorithms/agc.cpp \n>> b/src/ipa/ipu3/algorithms/agc.cpp\n>> index f16be534..41766007 100644\n>> --- a/src/ipa/ipu3/algorithms/agc.cpp\n>> +++ b/src/ipa/ipu3/algorithms/agc.cpp\n>> @@ -183,13 +183,14 @@ utils::Duration \n>> Agc::filterExposure(utils::Duration exposureValue)\n>>    * \\param[in] yGain The gain calculated based on the relative \n>> luminance target\n>>    * \\param[in] iqMeanGain The gain calculated based on the relative \n>> luminance target\n>>    */\n>> -void Agc::computeExposure(IPAContext &context, IPAFrameContext \n>> *frameContext,\n>> -              double yGain, double iqMeanGain)\n>> +void Agc::computeExposure(IPAContext &context, uint32_t frame, \n>> double yGain,\n>> +              double iqMeanGain)\n>>   {\n>>       const IPASessionConfiguration &configuration = \n>> context.configuration;\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>> +    IPAFrameContext &frameContext = context.frameContexts.get(frame);\n>> +    uint32_t exposure = frameContext.sensor.exposure;\n>> +    double analogueGain = frameContext.sensor.gain;\n>>         /* Use the highest of the two gain estimates. */\n>>       double evGain = std::max(yGain, iqMeanGain);\n>> @@ -323,7 +324,7 @@ double Agc::estimateLuminance(IPAActiveState \n>> &activeState,\n>>    * Identify the current image brightness, and use that to estimate \n>> the optimal\n>>    * new exposure and gain for the scene.\n>>    */\n>> -void Agc::process(IPAContext &context, [[maybe_unused]] \n>> IPAFrameContext *frameContext,\n>> +void Agc::process(IPAContext &context, [[maybe_unused]] uint32_t frame,\n>>             const ipu3_uapi_stats_3a *stats)\n>>   {\n>>       /*\n>> @@ -359,7 +360,7 @@ void Agc::process(IPAContext &context, \n>> [[maybe_unused]] IPAFrameContext *frameCo\n>>               break;\n>>       }\n>>   -    computeExposure(context, frameContext, yGain, iqMeanGain);\n>> +    computeExposure(context, frame, yGain, iqMeanGain);\n>>       frameCount_++;\n>>   }\n>>   diff --git a/src/ipa/ipu3/algorithms/agc.h \n>> b/src/ipa/ipu3/algorithms/agc.h\n>> index 105ae0f2..8ef2a2d8 100644\n>> --- a/src/ipa/ipu3/algorithms/agc.h\n>> +++ b/src/ipa/ipu3/algorithms/agc.h\n>> @@ -28,14 +28,14 @@ public:\n>>       ~Agc() = default;\n>>         int configure(IPAContext &context, const IPAConfigInfo \n>> &configInfo) override;\n>> -    void process(IPAContext &context, IPAFrameContext *frameContext,\n>> +    void process(IPAContext &context, uint32_t frame,\n>>                const ipu3_uapi_stats_3a *stats) override;\n>>     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(IPAContext &context, IPAFrameContext \n>> *frameContext,\n>> +    void computeExposure(IPAContext &context, uint32_t frame,\n>>                    double yGain, double iqMeanGain);\n>>       double estimateLuminance(IPAActiveState &activeState,\n>>                    const ipu3_uapi_grid_config &grid,\n>> diff --git a/src/ipa/ipu3/algorithms/algorithm.h \n>> b/src/ipa/ipu3/algorithms/algorithm.h\n>> index 234b2bd7..3e0c60d3 100644\n>> --- a/src/ipa/ipu3/algorithms/algorithm.h\n>> +++ b/src/ipa/ipu3/algorithms/algorithm.h\n>> @@ -17,8 +17,8 @@ namespace libcamera {\n>>     namespace ipa::ipu3 {\n>>   -using Algorithm = libcamera::ipa::Algorithm<IPAContext, \n>> IPAFrameContext,\n>> -                        IPAConfigInfo, ipu3_uapi_params,\n>> +using Algorithm = libcamera::ipa::Algorithm<IPAContext, IPAConfigInfo,\n>> +                        ipu3_uapi_params,\n>>                           ipu3_uapi_stats_3a>;\n>>     } /* namespace ipa::ipu3 */\n>> diff --git a/src/ipa/ipu3/algorithms/awb.cpp \n>> b/src/ipa/ipu3/algorithms/awb.cpp\n>> index 5c232d92..35f35ebe 100644\n>> --- a/src/ipa/ipu3/algorithms/awb.cpp\n>> +++ b/src/ipa/ipu3/algorithms/awb.cpp\n>> @@ -387,7 +387,7 @@ void Awb::calculateWBGains(const \n>> ipu3_uapi_stats_3a *stats)\n>>   /**\n>>    * \\copydoc libcamera::ipa::Algorithm::process\n>>    */\n>> -void Awb::process(IPAContext &context, [[maybe_unused]] \n>> IPAFrameContext *frameContext,\n>> +void Awb::process(IPAContext &context, [[maybe_unused]] uint32_t frame,\n>>             const ipu3_uapi_stats_3a *stats)\n>>   {\n>>       calculateWBGains(stats);\n>> diff --git a/src/ipa/ipu3/algorithms/awb.h \n>> b/src/ipa/ipu3/algorithms/awb.h\n>> index 9a50a985..f263540c 100644\n>> --- a/src/ipa/ipu3/algorithms/awb.h\n>> +++ b/src/ipa/ipu3/algorithms/awb.h\n>> @@ -40,7 +40,7 @@ public:\n>>         int configure(IPAContext &context, const IPAConfigInfo \n>> &configInfo) override;\n>>       void prepare(IPAContext &context, ipu3_uapi_params *params) \n>> override;\n>> -    void process(IPAContext &context, IPAFrameContext *frameContext,\n>> +    void process(IPAContext &context, uint32_t frame,\n>>                const ipu3_uapi_stats_3a *stats) override;\n>>     private:\n>> diff --git a/src/ipa/ipu3/algorithms/tone_mapping.cpp \n>> b/src/ipa/ipu3/algorithms/tone_mapping.cpp\n>> index f86e79b2..0f70b8aa 100644\n>> --- a/src/ipa/ipu3/algorithms/tone_mapping.cpp\n>> +++ b/src/ipa/ipu3/algorithms/tone_mapping.cpp\n>> @@ -78,7 +78,7 @@ void ToneMapping::prepare([[maybe_unused]] \n>> IPAContext &context,\n>>    * The tone mapping look up table is generated as an inverse power \n>> curve from\n>>    * our gamma setting.\n>>    */\n>> -void ToneMapping::process(IPAContext &context, [[maybe_unused]] \n>> IPAFrameContext *frameContext,\n>> +void ToneMapping::process(IPAContext &context, [[maybe_unused]] \n>> uint32_t frame,\n>>                 [[maybe_unused]] const ipu3_uapi_stats_3a *stats)\n>>   {\n>>       /*\n>> diff --git a/src/ipa/ipu3/algorithms/tone_mapping.h \n>> b/src/ipa/ipu3/algorithms/tone_mapping.h\n>> index d7d48006..61474085 100644\n>> --- a/src/ipa/ipu3/algorithms/tone_mapping.h\n>> +++ b/src/ipa/ipu3/algorithms/tone_mapping.h\n>> @@ -20,7 +20,7 @@ public:\n>>         int configure(IPAContext &context, const IPAConfigInfo \n>> &configInfo) override;\n>>       void prepare(IPAContext &context, ipu3_uapi_params *params) \n>> override;\n>> -    void process(IPAContext &context, IPAFrameContext *frameContext,\n>> +    void process(IPAContext &context, uint32_t frame,\n>>                const ipu3_uapi_stats_3a *stats) override;\n>>     private:\n>> diff --git a/src/ipa/ipu3/ipu3.cpp b/src/ipa/ipu3/ipu3.cpp\n>> index e09c5d05..4f33b1a6 100644\n>> --- a/src/ipa/ipu3/ipu3.cpp\n>> +++ b/src/ipa/ipu3/ipu3.cpp\n>> @@ -582,7 +582,7 @@ void IPAIPU3::processStatsBuffer(const uint32_t \n>> frame,\n>>       ControlList ctrls(controls::controls);\n>>         for (auto const &algo : algorithms_)\n>> -        algo->process(context_, &frameContext, stats);\n>> +        algo->process(context_, frame, stats);\n>>         setControls(frame);\n>>   diff --git a/src/ipa/libipa/algorithm.cpp \n>> b/src/ipa/libipa/algorithm.cpp\n>> index cce2ed62..c0a9bbeb 100644\n>> --- a/src/ipa/libipa/algorithm.cpp\n>> +++ b/src/ipa/libipa/algorithm.cpp\n>> @@ -64,7 +64,7 @@ namespace ipa {\n>>    * \\fn Algorithm::process()\n>>    * \\brief Process ISP statistics, and run algorithm operations\n>>    * \\param[in] context The shared IPA context\n>> - * \\param[in] frameContext The current frame's context\n>> + * \\param[in] frame The current frame id\n>>    * \\param[in] stats The IPA statistics and ISP results\n>>    *\n>>    * This function is called while camera is running for every frame \n>> processed by\n>> diff --git a/src/ipa/libipa/algorithm.h b/src/ipa/libipa/algorithm.h\n>> index 032a05b5..d1ca0883 100644\n>> --- a/src/ipa/libipa/algorithm.h\n>> +++ b/src/ipa/libipa/algorithm.h\n>> @@ -10,8 +10,8 @@ namespace libcamera {\n>>     namespace ipa {\n>>   -template<typename Context, typename FrameContext, typename Config,\n>> -     typename Params, typename Stats>\n>> +template<typename Context, typename Config, typename Params, \n>> typename Stats>\n>> +\n>>   class Algorithm\n>>   {\n>>   public:\n>> @@ -29,7 +29,7 @@ public:\n>>       }\n>>         virtual void process([[maybe_unused]] Context &context,\n>> -                 [[maybe_unused]] FrameContext *frameContext,\n>> +                 [[maybe_unused]] uint32_t frame,\n>>                    [[maybe_unused]] const Stats *stats)\n>>       {\n>>       }\n>> diff --git a/src/ipa/rkisp1/algorithms/agc.cpp \n>> b/src/ipa/rkisp1/algorithms/agc.cpp\n>> index b5a184d9..9418b533 100644\n>> --- a/src/ipa/rkisp1/algorithms/agc.cpp\n>> +++ b/src/ipa/rkisp1/algorithms/agc.cpp\n>> @@ -280,8 +280,7 @@ double Agc::measureBrightness(const \n>> rkisp1_cif_isp_hist_stat *hist) const\n>>    * Identify the current image brightness, and use that to estimate \n>> the optimal\n>>    * new exposure and gain for the scene.\n>>    */\n>> -void Agc::process(IPAContext &context,\n>> -          [[maybe_unused]] IPAFrameContext *frameContext,\n>> +void Agc::process(IPAContext &context, [[maybe_unused]] uint32_t frame,\n>>             const rkisp1_stat_buffer *stats)\n>>   {\n>>       const rkisp1_cif_isp_stat *params = &stats->params;\n>> diff --git a/src/ipa/rkisp1/algorithms/agc.h \n>> b/src/ipa/rkisp1/algorithms/agc.h\n>> index 22c02779..a749f1c3 100644\n>> --- a/src/ipa/rkisp1/algorithms/agc.h\n>> +++ b/src/ipa/rkisp1/algorithms/agc.h\n>> @@ -29,7 +29,7 @@ public:\n>>         int configure(IPAContext &context, const IPACameraSensorInfo \n>> &configInfo) override;\n>>       void prepare(IPAContext &context, rkisp1_params_cfg *params) \n>> override;\n>> -    void process(IPAContext &context, IPAFrameContext *frameContext,\n>> +    void process(IPAContext &context, uint32_t frame,\n>>                const rkisp1_stat_buffer *stats) override;\n>>     private:\n>> diff --git a/src/ipa/rkisp1/algorithms/algorithm.h \n>> b/src/ipa/rkisp1/algorithms/algorithm.h\n>> index 68e3a44e..069c744c 100644\n>> --- a/src/ipa/rkisp1/algorithms/algorithm.h\n>> +++ b/src/ipa/rkisp1/algorithms/algorithm.h\n>> @@ -19,9 +19,8 @@ namespace libcamera {\n>>     namespace ipa::rkisp1 {\n>>   -using Algorithm = libcamera::ipa::Algorithm<IPAContext, \n>> IPAFrameContext,\n>> -                        IPACameraSensorInfo, rkisp1_params_cfg,\n>> -                        rkisp1_stat_buffer>;\n>> +using Algorithm = libcamera::ipa::Algorithm<IPAContext, \n>> IPACameraSensorInfo,\n>> +                        rkisp1_params_cfg, rkisp1_stat_buffer>;\n>>     } /* namespace ipa::rkisp1 */\n>>   diff --git a/src/ipa/rkisp1/algorithms/awb.cpp \n>> b/src/ipa/rkisp1/algorithms/awb.cpp\n>> index 88441382..1e7fd11a 100644\n>> --- a/src/ipa/rkisp1/algorithms/awb.cpp\n>> +++ b/src/ipa/rkisp1/algorithms/awb.cpp\n>> @@ -120,7 +120,7 @@ void Awb::prepare(IPAContext &context, \n>> rkisp1_params_cfg *params)\n>>    * \\copydoc libcamera::ipa::Algorithm::process\n>>    */\n>>   void Awb::process([[maybe_unused]] IPAContext &context,\n>> -          [[maybe_unused]] IPAFrameContext *frameCtx,\n>> +          [[maybe_unused]] uint32_t frame,\n>>             const rkisp1_stat_buffer *stats)\n>>   {\n>>       const rkisp1_cif_isp_stat *params = &stats->params;\n>> diff --git a/src/ipa/rkisp1/algorithms/awb.h \n>> b/src/ipa/rkisp1/algorithms/awb.h\n>> index 7647842f..82921f34 100644\n>> --- a/src/ipa/rkisp1/algorithms/awb.h\n>> +++ b/src/ipa/rkisp1/algorithms/awb.h\n>> @@ -23,7 +23,7 @@ public:\n>>         int configure(IPAContext &context, const IPACameraSensorInfo \n>> &configInfo) override;\n>>       void prepare(IPAContext &context, rkisp1_params_cfg *params) \n>> override;\n>> -    void process(IPAContext &context, IPAFrameContext *frameCtx,\n>> +    void process(IPAContext &context, uint32_t frame,\n>>                const rkisp1_stat_buffer *stats) override;\n>>     private:\n>> diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp\n>> index c818a6d7..ad33d817 100644\n>> --- a/src/ipa/rkisp1/rkisp1.cpp\n>> +++ b/src/ipa/rkisp1/rkisp1.cpp\n>> @@ -272,7 +272,7 @@ void IPARkISP1::processStatsBuffer(const uint32_t \n>> frame, const uint32_t bufferId\n>>       unsigned int aeState = 0;\n>>         for (auto const &algo : algorithms_)\n>> -        algo->process(context_, nullptr, stats);\n>> +        algo->process(context_, frame, stats);\n>>         setControls(frame);","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 BF656BD161\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed,  1 Jun 2022 07:58:36 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 08F4E65632;\n\tWed,  1 Jun 2022 09:58:36 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 889D860414\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed,  1 Jun 2022 09:58:34 +0200 (CEST)","from [192.168.1.68] (235.red-81-36-186.dynamicip.rima-tde.net\n\t[81.36.186.235])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 0541030A;\n\tWed,  1 Jun 2022 09:58:33 +0200 (CEST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1654070316;\n\tbh=iQhr0CH3pjn0sM6Q4eYBIjYeiqkMctCL1gzsAWInzRI=;\n\th=Date:To:References:In-Reply-To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:\n\tFrom;\n\tb=XKA76YYeMrSF11qfUuYdl0AOP8zyb/E2VXksBTgU9R5nDYtcVtm6l7keUuxvwa/6U\n\tVgIE+2nnTjDRdhg/P7mnXMwHzVn3CF8I0e3cWDW0jGqqRcYN4ayKOO3YESr0cZ9Eio\n\t55RC+7fvcZRuySRbf8Tl3DMBb244ergXX1fAxsKfK4lPq3K78rG44hHIz/Pq/dMPjg\n\tX8xhjFWmud5SnNEewylLSRQbt2UvJqQhbT1GkQPsEk860MY94c0XkAYxTZHwmMSgSU\n\tcuMkV952n9uBDPecM2/OgfasvOWfpiV+tpJlVTL4N/N5OS/2HMO8L96wa/H8uCeaY0\n\tzpOh2pRiZQXHw==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1654070314;\n\tbh=iQhr0CH3pjn0sM6Q4eYBIjYeiqkMctCL1gzsAWInzRI=;\n\th=Date:Subject:To:References:From:In-Reply-To:From;\n\tb=VhPTR5dKWwujWY61JRdltYo292lMtLxmzQfj2fHuKIwIphEsKxG6CdHHpg2NQwWb8\n\tve+ib3NPMPut2t6ezPOqVI+vd3y1u7aOMwGTq+cEaTykvJyxwpq+MRrCRopq+15aFr\n\tnDe3zRJI3c/nLj/dpzBgYpF7SkAA5N9LA9MkKkZ4="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"VhPTR5dK\"; dkim-atps=neutral","Message-ID":"<c0d16942-9e62-8535-2b0c-d724c3589b1e@ideasonboard.com>","Date":"Wed, 1 Jun 2022 09:58:30 +0200","MIME-Version":"1.0","User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101\n\tThunderbird/91.4.1","Content-Language":"en-US","To":"Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","References":"<20220527191740.242300-1-umang.jain@ideasonboard.com>\n\t<20220527191740.242300-4-umang.jain@ideasonboard.com>\n\t<4455d5bd-8aa3-abfc-12e4-c9e7aefeb29d@ideasonboard.com>","In-Reply-To":"<4455d5bd-8aa3-abfc-12e4-c9e7aefeb29d@ideasonboard.com>","Content-Type":"text/plain; charset=UTF-8; format=flowed","Content-Transfer-Encoding":"8bit","Subject":"Re: [libcamera-devel] [RFC PATCH v2 3/3] ipa: algorithm: process()\n\tshould take in frame number instead of context","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>","From":"Umang Jain via libcamera-devel <libcamera-devel@lists.libcamera.org>","Reply-To":"Umang Jain <umang.jain@ideasonboard.com>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]