[libcamera-devel,RFC,v2,3/3] ipa: algorithm: process() should take in frame number instead of context
diff mbox series

Message ID 20220527191740.242300-4-umang.jain@ideasonboard.com
State Superseded
Delegated to: Umang Jain
Headers show
Series
  • Move frame contexts queue to a separate
Related show

Commit Message

Umang Jain May 27, 2022, 7:17 p.m. UTC
This will enable algorithms to extract a frame context from the FCQueue
using the frame number. This is required because algorithms can operate
on different frames at different points in time (according to frame latency
they need to respect).

Signed-off-by: Umang Jain <umang.jain@ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
---
 src/ipa/ipu3/algorithms/af.cpp           |  2 +-
 src/ipa/ipu3/algorithms/af.h             |  2 +-
 src/ipa/ipu3/algorithms/agc.cpp          | 13 +++++++------
 src/ipa/ipu3/algorithms/agc.h            |  4 ++--
 src/ipa/ipu3/algorithms/algorithm.h      |  4 ++--
 src/ipa/ipu3/algorithms/awb.cpp          |  2 +-
 src/ipa/ipu3/algorithms/awb.h            |  2 +-
 src/ipa/ipu3/algorithms/tone_mapping.cpp |  2 +-
 src/ipa/ipu3/algorithms/tone_mapping.h   |  2 +-
 src/ipa/ipu3/ipu3.cpp                    |  2 +-
 src/ipa/libipa/algorithm.cpp             |  2 +-
 src/ipa/libipa/algorithm.h               |  6 +++---
 src/ipa/rkisp1/algorithms/agc.cpp        |  3 +--
 src/ipa/rkisp1/algorithms/agc.h          |  2 +-
 src/ipa/rkisp1/algorithms/algorithm.h    |  5 ++---
 src/ipa/rkisp1/algorithms/awb.cpp        |  2 +-
 src/ipa/rkisp1/algorithms/awb.h          |  2 +-
 src/ipa/rkisp1/rkisp1.cpp                |  2 +-
 18 files changed, 29 insertions(+), 30 deletions(-)

Comments

Jean-Michel Hautbois June 1, 2022, 7:56 a.m. UTC | #1
Hi Umang,

Thanks for the patch !

On 27/05/2022 21:17, Umang Jain via libcamera-devel wrote:
> This will enable algorithms to extract a frame context from the FCQueue
> using the frame number. This is required because algorithms can operate
> on different frames at different points in time (according to frame latency
> they need to respect).
> 
> Signed-off-by: Umang Jain <umang.jain@ideasonboard.com>
> Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
> ---
>   src/ipa/ipu3/algorithms/af.cpp           |  2 +-
>   src/ipa/ipu3/algorithms/af.h             |  2 +-
>   src/ipa/ipu3/algorithms/agc.cpp          | 13 +++++++------
>   src/ipa/ipu3/algorithms/agc.h            |  4 ++--
>   src/ipa/ipu3/algorithms/algorithm.h      |  4 ++--
>   src/ipa/ipu3/algorithms/awb.cpp          |  2 +-
>   src/ipa/ipu3/algorithms/awb.h            |  2 +-
>   src/ipa/ipu3/algorithms/tone_mapping.cpp |  2 +-
>   src/ipa/ipu3/algorithms/tone_mapping.h   |  2 +-
>   src/ipa/ipu3/ipu3.cpp                    |  2 +-
>   src/ipa/libipa/algorithm.cpp             |  2 +-
>   src/ipa/libipa/algorithm.h               |  6 +++---
>   src/ipa/rkisp1/algorithms/agc.cpp        |  3 +--
>   src/ipa/rkisp1/algorithms/agc.h          |  2 +-
>   src/ipa/rkisp1/algorithms/algorithm.h    |  5 ++---
>   src/ipa/rkisp1/algorithms/awb.cpp        |  2 +-
>   src/ipa/rkisp1/algorithms/awb.h          |  2 +-
>   src/ipa/rkisp1/rkisp1.cpp                |  2 +-
>   18 files changed, 29 insertions(+), 30 deletions(-)
> 
> diff --git a/src/ipa/ipu3/algorithms/af.cpp b/src/ipa/ipu3/algorithms/af.cpp
> index d07521a0..24462c6b 100644
> --- a/src/ipa/ipu3/algorithms/af.cpp
> +++ b/src/ipa/ipu3/algorithms/af.cpp
> @@ -420,7 +420,7 @@ bool Af::afIsOutOfFocus(IPAContext context)
>    *
>    * [1] Hill Climbing Algorithm, https://en.wikipedia.org/wiki/Hill_climbing
>    */
> -void Af::process(IPAContext &context, [[maybe_unused]] IPAFrameContext *frameContext,
> +void Af::process(IPAContext &context, [[maybe_unused]] uint32_t frame,
>   		 const ipu3_uapi_stats_3a *stats)
>   {

You need to document it properly:
'''
/home/jm/libcamera/src/ipa/ipu3/algorithms/af.cpp:408: warning: argument 
'frameContext' of command @param is not found in the argument list of 
libcamera::ipa::ipu3::algorithms::Af::process(IPAContext &context, 
uint32_t frame, const ipu3_uapi_stats_3a *stats)
/home/jm/libcamera/src/ipa/ipu3/algorithms/af.cpp:408: warning: The 
following parameter of 
libcamera::ipa::ipu3::algorithms::Af::process(IPAContext &context, 
uint32_t frame, const ipu3_uapi_stats_3a *stats) is not documented:
   parameter 'frame'
'''

Same for agc and tonemapping functions below :-).

With it:
Reviewed-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>

>   	/* Evaluate the AF buffer length */
> diff --git a/src/ipa/ipu3/algorithms/af.h b/src/ipa/ipu3/algorithms/af.h
> index ccf015f3..69aeb3e2 100644
> --- a/src/ipa/ipu3/algorithms/af.h
> +++ b/src/ipa/ipu3/algorithms/af.h
> @@ -32,7 +32,7 @@ public:
>   
>   	void prepare(IPAContext &context, ipu3_uapi_params *params) override;
>   	int configure(IPAContext &context, const IPAConfigInfo &configInfo) override;
> -	void process(IPAContext &context, IPAFrameContext *frameContext,
> +	void process(IPAContext &context, uint32_t frame,
>   		     const ipu3_uapi_stats_3a *stats) override;
>   
>   private:
> diff --git a/src/ipa/ipu3/algorithms/agc.cpp b/src/ipa/ipu3/algorithms/agc.cpp
> index f16be534..41766007 100644
> --- a/src/ipa/ipu3/algorithms/agc.cpp
> +++ b/src/ipa/ipu3/algorithms/agc.cpp
> @@ -183,13 +183,14 @@ utils::Duration Agc::filterExposure(utils::Duration exposureValue)
>    * \param[in] yGain The gain calculated based on the relative luminance target
>    * \param[in] iqMeanGain The gain calculated based on the relative luminance target
>    */
> -void Agc::computeExposure(IPAContext &context, IPAFrameContext *frameContext,
> -			  double yGain, double iqMeanGain)
> +void Agc::computeExposure(IPAContext &context, uint32_t frame, double yGain,
> +			  double iqMeanGain)
>   {
>   	const IPASessionConfiguration &configuration = context.configuration;
>   	/* Get the effective exposure and gain applied on the sensor. */
> -	uint32_t exposure = frameContext->sensor.exposure;
> -	double analogueGain = frameContext->sensor.gain;
> +	IPAFrameContext &frameContext = context.frameContexts.get(frame);
> +	uint32_t exposure = frameContext.sensor.exposure;
> +	double analogueGain = frameContext.sensor.gain;
>   
>   	/* Use the highest of the two gain estimates. */
>   	double evGain = std::max(yGain, iqMeanGain);
> @@ -323,7 +324,7 @@ double Agc::estimateLuminance(IPAActiveState &activeState,
>    * Identify the current image brightness, and use that to estimate the optimal
>    * new exposure and gain for the scene.
>    */
> -void Agc::process(IPAContext &context, [[maybe_unused]] IPAFrameContext *frameContext,
> +void Agc::process(IPAContext &context, [[maybe_unused]] uint32_t frame,
>   		  const ipu3_uapi_stats_3a *stats)
>   {
>   	/*
> @@ -359,7 +360,7 @@ void Agc::process(IPAContext &context, [[maybe_unused]] IPAFrameContext *frameCo
>   			break;
>   	}
>   
> -	computeExposure(context, frameContext, yGain, iqMeanGain);
> +	computeExposure(context, frame, yGain, iqMeanGain);
>   	frameCount_++;
>   }
>   
> diff --git a/src/ipa/ipu3/algorithms/agc.h b/src/ipa/ipu3/algorithms/agc.h
> index 105ae0f2..8ef2a2d8 100644
> --- a/src/ipa/ipu3/algorithms/agc.h
> +++ b/src/ipa/ipu3/algorithms/agc.h
> @@ -28,14 +28,14 @@ public:
>   	~Agc() = default;
>   
>   	int configure(IPAContext &context, const IPAConfigInfo &configInfo) override;
> -	void process(IPAContext &context, IPAFrameContext *frameContext,
> +	void process(IPAContext &context, uint32_t frame,
>   		     const ipu3_uapi_stats_3a *stats) override;
>   
>   private:
>   	double measureBrightness(const ipu3_uapi_stats_3a *stats,
>   				 const ipu3_uapi_grid_config &grid) const;
>   	utils::Duration filterExposure(utils::Duration currentExposure);
> -	void computeExposure(IPAContext &context, IPAFrameContext *frameContext,
> +	void computeExposure(IPAContext &context, uint32_t frame,
>   			     double yGain, double iqMeanGain);
>   	double estimateLuminance(IPAActiveState &activeState,
>   				 const ipu3_uapi_grid_config &grid,
> diff --git a/src/ipa/ipu3/algorithms/algorithm.h b/src/ipa/ipu3/algorithms/algorithm.h
> index 234b2bd7..3e0c60d3 100644
> --- a/src/ipa/ipu3/algorithms/algorithm.h
> +++ b/src/ipa/ipu3/algorithms/algorithm.h
> @@ -17,8 +17,8 @@ namespace libcamera {
>   
>   namespace ipa::ipu3 {
>   
> -using Algorithm = libcamera::ipa::Algorithm<IPAContext, IPAFrameContext,
> -					    IPAConfigInfo, ipu3_uapi_params,
> +using Algorithm = libcamera::ipa::Algorithm<IPAContext, IPAConfigInfo,
> +					    ipu3_uapi_params,
>   					    ipu3_uapi_stats_3a>;
>   
>   } /* namespace ipa::ipu3 */
> diff --git a/src/ipa/ipu3/algorithms/awb.cpp b/src/ipa/ipu3/algorithms/awb.cpp
> index 5c232d92..35f35ebe 100644
> --- a/src/ipa/ipu3/algorithms/awb.cpp
> +++ b/src/ipa/ipu3/algorithms/awb.cpp
> @@ -387,7 +387,7 @@ void Awb::calculateWBGains(const ipu3_uapi_stats_3a *stats)
>   /**
>    * \copydoc libcamera::ipa::Algorithm::process
>    */
> -void Awb::process(IPAContext &context, [[maybe_unused]] IPAFrameContext *frameContext,
> +void Awb::process(IPAContext &context, [[maybe_unused]] uint32_t frame,
>   		  const ipu3_uapi_stats_3a *stats)
>   {
>   	calculateWBGains(stats);
> diff --git a/src/ipa/ipu3/algorithms/awb.h b/src/ipa/ipu3/algorithms/awb.h
> index 9a50a985..f263540c 100644
> --- a/src/ipa/ipu3/algorithms/awb.h
> +++ b/src/ipa/ipu3/algorithms/awb.h
> @@ -40,7 +40,7 @@ public:
>   
>   	int configure(IPAContext &context, const IPAConfigInfo &configInfo) override;
>   	void prepare(IPAContext &context, ipu3_uapi_params *params) override;
> -	void process(IPAContext &context, IPAFrameContext *frameContext,
> +	void process(IPAContext &context, uint32_t frame,
>   		     const ipu3_uapi_stats_3a *stats) override;
>   
>   private:
> diff --git a/src/ipa/ipu3/algorithms/tone_mapping.cpp b/src/ipa/ipu3/algorithms/tone_mapping.cpp
> index f86e79b2..0f70b8aa 100644
> --- a/src/ipa/ipu3/algorithms/tone_mapping.cpp
> +++ b/src/ipa/ipu3/algorithms/tone_mapping.cpp
> @@ -78,7 +78,7 @@ void ToneMapping::prepare([[maybe_unused]] IPAContext &context,
>    * The tone mapping look up table is generated as an inverse power curve from
>    * our gamma setting.
>    */
> -void ToneMapping::process(IPAContext &context, [[maybe_unused]] IPAFrameContext *frameContext,
> +void ToneMapping::process(IPAContext &context, [[maybe_unused]] uint32_t frame,
>   			  [[maybe_unused]] const ipu3_uapi_stats_3a *stats)
>   {
>   	/*
> diff --git a/src/ipa/ipu3/algorithms/tone_mapping.h b/src/ipa/ipu3/algorithms/tone_mapping.h
> index d7d48006..61474085 100644
> --- a/src/ipa/ipu3/algorithms/tone_mapping.h
> +++ b/src/ipa/ipu3/algorithms/tone_mapping.h
> @@ -20,7 +20,7 @@ public:
>   
>   	int configure(IPAContext &context, const IPAConfigInfo &configInfo) override;
>   	void prepare(IPAContext &context, ipu3_uapi_params *params) override;
> -	void process(IPAContext &context, IPAFrameContext *frameContext,
> +	void process(IPAContext &context, uint32_t frame,
>   		     const ipu3_uapi_stats_3a *stats) override;
>   
>   private:
> diff --git a/src/ipa/ipu3/ipu3.cpp b/src/ipa/ipu3/ipu3.cpp
> index e09c5d05..4f33b1a6 100644
> --- a/src/ipa/ipu3/ipu3.cpp
> +++ b/src/ipa/ipu3/ipu3.cpp
> @@ -582,7 +582,7 @@ void IPAIPU3::processStatsBuffer(const uint32_t frame,
>   	ControlList ctrls(controls::controls);
>   
>   	for (auto const &algo : algorithms_)
> -		algo->process(context_, &frameContext, stats);
> +		algo->process(context_, frame, stats);
>   
>   	setControls(frame);
>   
> diff --git a/src/ipa/libipa/algorithm.cpp b/src/ipa/libipa/algorithm.cpp
> index cce2ed62..c0a9bbeb 100644
> --- a/src/ipa/libipa/algorithm.cpp
> +++ b/src/ipa/libipa/algorithm.cpp
> @@ -64,7 +64,7 @@ namespace ipa {
>    * \fn Algorithm::process()
>    * \brief Process ISP statistics, and run algorithm operations
>    * \param[in] context The shared IPA context
> - * \param[in] frameContext The current frame's context
> + * \param[in] frame The current frame id
>    * \param[in] stats The IPA statistics and ISP results
>    *
>    * This function is called while camera is running for every frame processed by
> diff --git a/src/ipa/libipa/algorithm.h b/src/ipa/libipa/algorithm.h
> index 032a05b5..d1ca0883 100644
> --- a/src/ipa/libipa/algorithm.h
> +++ b/src/ipa/libipa/algorithm.h
> @@ -10,8 +10,8 @@ namespace libcamera {
>   
>   namespace ipa {
>   
> -template<typename Context, typename FrameContext, typename Config,
> -	 typename Params, typename Stats>
> +template<typename Context, typename Config, typename Params, typename Stats>
> +
>   class Algorithm
>   {
>   public:
> @@ -29,7 +29,7 @@ public:
>   	}
>   
>   	virtual void process([[maybe_unused]] Context &context,
> -			     [[maybe_unused]] FrameContext *frameContext,
> +			     [[maybe_unused]] uint32_t frame,
>   			     [[maybe_unused]] const Stats *stats)
>   	{
>   	}
> diff --git a/src/ipa/rkisp1/algorithms/agc.cpp b/src/ipa/rkisp1/algorithms/agc.cpp
> index b5a184d9..9418b533 100644
> --- a/src/ipa/rkisp1/algorithms/agc.cpp
> +++ b/src/ipa/rkisp1/algorithms/agc.cpp
> @@ -280,8 +280,7 @@ double Agc::measureBrightness(const rkisp1_cif_isp_hist_stat *hist) const
>    * Identify the current image brightness, and use that to estimate the optimal
>    * new exposure and gain for the scene.
>    */
> -void Agc::process(IPAContext &context,
> -		  [[maybe_unused]] IPAFrameContext *frameContext,
> +void Agc::process(IPAContext &context, [[maybe_unused]] uint32_t frame,
>   		  const rkisp1_stat_buffer *stats)
>   {
>   	const rkisp1_cif_isp_stat *params = &stats->params;
> diff --git a/src/ipa/rkisp1/algorithms/agc.h b/src/ipa/rkisp1/algorithms/agc.h
> index 22c02779..a749f1c3 100644
> --- a/src/ipa/rkisp1/algorithms/agc.h
> +++ b/src/ipa/rkisp1/algorithms/agc.h
> @@ -29,7 +29,7 @@ public:
>   
>   	int configure(IPAContext &context, const IPACameraSensorInfo &configInfo) override;
>   	void prepare(IPAContext &context, rkisp1_params_cfg *params) override;
> -	void process(IPAContext &context, IPAFrameContext *frameContext,
> +	void process(IPAContext &context, uint32_t frame,
>   		     const rkisp1_stat_buffer *stats) override;
>   
>   private:
> diff --git a/src/ipa/rkisp1/algorithms/algorithm.h b/src/ipa/rkisp1/algorithms/algorithm.h
> index 68e3a44e..069c744c 100644
> --- a/src/ipa/rkisp1/algorithms/algorithm.h
> +++ b/src/ipa/rkisp1/algorithms/algorithm.h
> @@ -19,9 +19,8 @@ namespace libcamera {
>   
>   namespace ipa::rkisp1 {
>   
> -using Algorithm = libcamera::ipa::Algorithm<IPAContext, IPAFrameContext,
> -					    IPACameraSensorInfo, rkisp1_params_cfg,
> -					    rkisp1_stat_buffer>;
> +using Algorithm = libcamera::ipa::Algorithm<IPAContext, IPACameraSensorInfo,
> +					    rkisp1_params_cfg, rkisp1_stat_buffer>;
>   
>   } /* namespace ipa::rkisp1 */
>   
> diff --git a/src/ipa/rkisp1/algorithms/awb.cpp b/src/ipa/rkisp1/algorithms/awb.cpp
> index 88441382..1e7fd11a 100644
> --- a/src/ipa/rkisp1/algorithms/awb.cpp
> +++ b/src/ipa/rkisp1/algorithms/awb.cpp
> @@ -120,7 +120,7 @@ void Awb::prepare(IPAContext &context, rkisp1_params_cfg *params)
>    * \copydoc libcamera::ipa::Algorithm::process
>    */
>   void Awb::process([[maybe_unused]] IPAContext &context,
> -		  [[maybe_unused]] IPAFrameContext *frameCtx,
> +		  [[maybe_unused]] uint32_t frame,
>   		  const rkisp1_stat_buffer *stats)
>   {
>   	const rkisp1_cif_isp_stat *params = &stats->params;
> diff --git a/src/ipa/rkisp1/algorithms/awb.h b/src/ipa/rkisp1/algorithms/awb.h
> index 7647842f..82921f34 100644
> --- a/src/ipa/rkisp1/algorithms/awb.h
> +++ b/src/ipa/rkisp1/algorithms/awb.h
> @@ -23,7 +23,7 @@ public:
>   
>   	int configure(IPAContext &context, const IPACameraSensorInfo &configInfo) override;
>   	void prepare(IPAContext &context, rkisp1_params_cfg *params) override;
> -	void process(IPAContext &context, IPAFrameContext *frameCtx,
> +	void process(IPAContext &context, uint32_t frame,
>   		     const rkisp1_stat_buffer *stats) override;
>   
>   private:
> diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp
> index c818a6d7..ad33d817 100644
> --- a/src/ipa/rkisp1/rkisp1.cpp
> +++ b/src/ipa/rkisp1/rkisp1.cpp
> @@ -272,7 +272,7 @@ void IPARkISP1::processStatsBuffer(const uint32_t frame, const uint32_t bufferId
>   	unsigned int aeState = 0;
>   
>   	for (auto const &algo : algorithms_)
> -		algo->process(context_, nullptr, stats);
> +		algo->process(context_, frame, stats);
>   
>   	setControls(frame);
>
Umang Jain June 1, 2022, 7:58 a.m. UTC | #2
Hi JM

On 6/1/22 09:56, Jean-Michel Hautbois wrote:
> Hi Umang,
>
> Thanks for the patch !
>
> On 27/05/2022 21:17, Umang Jain via libcamera-devel wrote:
>> This will enable algorithms to extract a frame context from the FCQueue
>> using the frame number. This is required because algorithms can operate
>> on different frames at different points in time (according to frame 
>> latency
>> they need to respect).
>>
>> Signed-off-by: Umang Jain <umang.jain@ideasonboard.com>
>> Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
>> ---
>>   src/ipa/ipu3/algorithms/af.cpp           |  2 +-
>>   src/ipa/ipu3/algorithms/af.h             |  2 +-
>>   src/ipa/ipu3/algorithms/agc.cpp          | 13 +++++++------
>>   src/ipa/ipu3/algorithms/agc.h            |  4 ++--
>>   src/ipa/ipu3/algorithms/algorithm.h      |  4 ++--
>>   src/ipa/ipu3/algorithms/awb.cpp          |  2 +-
>>   src/ipa/ipu3/algorithms/awb.h            |  2 +-
>>   src/ipa/ipu3/algorithms/tone_mapping.cpp |  2 +-
>>   src/ipa/ipu3/algorithms/tone_mapping.h   |  2 +-
>>   src/ipa/ipu3/ipu3.cpp                    |  2 +-
>>   src/ipa/libipa/algorithm.cpp             |  2 +-
>>   src/ipa/libipa/algorithm.h               |  6 +++---
>>   src/ipa/rkisp1/algorithms/agc.cpp        |  3 +--
>>   src/ipa/rkisp1/algorithms/agc.h          |  2 +-
>>   src/ipa/rkisp1/algorithms/algorithm.h    |  5 ++---
>>   src/ipa/rkisp1/algorithms/awb.cpp        |  2 +-
>>   src/ipa/rkisp1/algorithms/awb.h          |  2 +-
>>   src/ipa/rkisp1/rkisp1.cpp                |  2 +-
>>   18 files changed, 29 insertions(+), 30 deletions(-)
>>
>> diff --git a/src/ipa/ipu3/algorithms/af.cpp 
>> b/src/ipa/ipu3/algorithms/af.cpp
>> index d07521a0..24462c6b 100644
>> --- a/src/ipa/ipu3/algorithms/af.cpp
>> +++ b/src/ipa/ipu3/algorithms/af.cpp
>> @@ -420,7 +420,7 @@ bool Af::afIsOutOfFocus(IPAContext context)
>>    *
>>    * [1] Hill Climbing Algorithm, 
>> https://en.wikipedia.org/wiki/Hill_climbing
>>    */
>> -void Af::process(IPAContext &context, [[maybe_unused]] 
>> IPAFrameContext *frameContext,
>> +void Af::process(IPAContext &context, [[maybe_unused]] uint32_t frame,
>>            const ipu3_uapi_stats_3a *stats)
>>   {
>
> You need to document it properly:
> '''
> /home/jm/libcamera/src/ipa/ipu3/algorithms/af.cpp:408: warning: 
> argument 'frameContext' of command @param is not found in the argument 
> list of libcamera::ipa::ipu3::algorithms::Af::process(IPAContext 
> &context, uint32_t frame, const ipu3_uapi_stats_3a *stats)
> /home/jm/libcamera/src/ipa/ipu3/algorithms/af.cpp:408: warning: The 
> following parameter of 
> libcamera::ipa::ipu3::algorithms::Af::process(IPAContext &context, 
> uint32_t frame, const ipu3_uapi_stats_3a *stats) is not documented:
>   parameter 'frame'
> '''


I have mentioned in the cover that the documentation might be 'broken'. 
I ran out of time when I was writing this design hence, left fixing 
documentation

>
> Same for agc and tonemapping functions below :-).
>
> With it:
> Reviewed-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>
>
>>       /* Evaluate the AF buffer length */
>> diff --git a/src/ipa/ipu3/algorithms/af.h b/src/ipa/ipu3/algorithms/af.h
>> index ccf015f3..69aeb3e2 100644
>> --- a/src/ipa/ipu3/algorithms/af.h
>> +++ b/src/ipa/ipu3/algorithms/af.h
>> @@ -32,7 +32,7 @@ public:
>>         void prepare(IPAContext &context, ipu3_uapi_params *params) 
>> override;
>>       int configure(IPAContext &context, const IPAConfigInfo 
>> &configInfo) override;
>> -    void process(IPAContext &context, IPAFrameContext *frameContext,
>> +    void process(IPAContext &context, uint32_t frame,
>>                const ipu3_uapi_stats_3a *stats) override;
>>     private:
>> diff --git a/src/ipa/ipu3/algorithms/agc.cpp 
>> b/src/ipa/ipu3/algorithms/agc.cpp
>> index f16be534..41766007 100644
>> --- a/src/ipa/ipu3/algorithms/agc.cpp
>> +++ b/src/ipa/ipu3/algorithms/agc.cpp
>> @@ -183,13 +183,14 @@ utils::Duration 
>> Agc::filterExposure(utils::Duration exposureValue)
>>    * \param[in] yGain The gain calculated based on the relative 
>> luminance target
>>    * \param[in] iqMeanGain The gain calculated based on the relative 
>> luminance target
>>    */
>> -void Agc::computeExposure(IPAContext &context, IPAFrameContext 
>> *frameContext,
>> -              double yGain, double iqMeanGain)
>> +void Agc::computeExposure(IPAContext &context, uint32_t frame, 
>> double yGain,
>> +              double iqMeanGain)
>>   {
>>       const IPASessionConfiguration &configuration = 
>> context.configuration;
>>       /* Get the effective exposure and gain applied on the sensor. */
>> -    uint32_t exposure = frameContext->sensor.exposure;
>> -    double analogueGain = frameContext->sensor.gain;
>> +    IPAFrameContext &frameContext = context.frameContexts.get(frame);
>> +    uint32_t exposure = frameContext.sensor.exposure;
>> +    double analogueGain = frameContext.sensor.gain;
>>         /* Use the highest of the two gain estimates. */
>>       double evGain = std::max(yGain, iqMeanGain);
>> @@ -323,7 +324,7 @@ double Agc::estimateLuminance(IPAActiveState 
>> &activeState,
>>    * Identify the current image brightness, and use that to estimate 
>> the optimal
>>    * new exposure and gain for the scene.
>>    */
>> -void Agc::process(IPAContext &context, [[maybe_unused]] 
>> IPAFrameContext *frameContext,
>> +void Agc::process(IPAContext &context, [[maybe_unused]] uint32_t frame,
>>             const ipu3_uapi_stats_3a *stats)
>>   {
>>       /*
>> @@ -359,7 +360,7 @@ void Agc::process(IPAContext &context, 
>> [[maybe_unused]] IPAFrameContext *frameCo
>>               break;
>>       }
>>   -    computeExposure(context, frameContext, yGain, iqMeanGain);
>> +    computeExposure(context, frame, yGain, iqMeanGain);
>>       frameCount_++;
>>   }
>>   diff --git a/src/ipa/ipu3/algorithms/agc.h 
>> b/src/ipa/ipu3/algorithms/agc.h
>> index 105ae0f2..8ef2a2d8 100644
>> --- a/src/ipa/ipu3/algorithms/agc.h
>> +++ b/src/ipa/ipu3/algorithms/agc.h
>> @@ -28,14 +28,14 @@ public:
>>       ~Agc() = default;
>>         int configure(IPAContext &context, const IPAConfigInfo 
>> &configInfo) override;
>> -    void process(IPAContext &context, IPAFrameContext *frameContext,
>> +    void process(IPAContext &context, uint32_t frame,
>>                const ipu3_uapi_stats_3a *stats) override;
>>     private:
>>       double measureBrightness(const ipu3_uapi_stats_3a *stats,
>>                    const ipu3_uapi_grid_config &grid) const;
>>       utils::Duration filterExposure(utils::Duration currentExposure);
>> -    void computeExposure(IPAContext &context, IPAFrameContext 
>> *frameContext,
>> +    void computeExposure(IPAContext &context, uint32_t frame,
>>                    double yGain, double iqMeanGain);
>>       double estimateLuminance(IPAActiveState &activeState,
>>                    const ipu3_uapi_grid_config &grid,
>> diff --git a/src/ipa/ipu3/algorithms/algorithm.h 
>> b/src/ipa/ipu3/algorithms/algorithm.h
>> index 234b2bd7..3e0c60d3 100644
>> --- a/src/ipa/ipu3/algorithms/algorithm.h
>> +++ b/src/ipa/ipu3/algorithms/algorithm.h
>> @@ -17,8 +17,8 @@ namespace libcamera {
>>     namespace ipa::ipu3 {
>>   -using Algorithm = libcamera::ipa::Algorithm<IPAContext, 
>> IPAFrameContext,
>> -                        IPAConfigInfo, ipu3_uapi_params,
>> +using Algorithm = libcamera::ipa::Algorithm<IPAContext, IPAConfigInfo,
>> +                        ipu3_uapi_params,
>>                           ipu3_uapi_stats_3a>;
>>     } /* namespace ipa::ipu3 */
>> diff --git a/src/ipa/ipu3/algorithms/awb.cpp 
>> b/src/ipa/ipu3/algorithms/awb.cpp
>> index 5c232d92..35f35ebe 100644
>> --- a/src/ipa/ipu3/algorithms/awb.cpp
>> +++ b/src/ipa/ipu3/algorithms/awb.cpp
>> @@ -387,7 +387,7 @@ void Awb::calculateWBGains(const 
>> ipu3_uapi_stats_3a *stats)
>>   /**
>>    * \copydoc libcamera::ipa::Algorithm::process
>>    */
>> -void Awb::process(IPAContext &context, [[maybe_unused]] 
>> IPAFrameContext *frameContext,
>> +void Awb::process(IPAContext &context, [[maybe_unused]] uint32_t frame,
>>             const ipu3_uapi_stats_3a *stats)
>>   {
>>       calculateWBGains(stats);
>> diff --git a/src/ipa/ipu3/algorithms/awb.h 
>> b/src/ipa/ipu3/algorithms/awb.h
>> index 9a50a985..f263540c 100644
>> --- a/src/ipa/ipu3/algorithms/awb.h
>> +++ b/src/ipa/ipu3/algorithms/awb.h
>> @@ -40,7 +40,7 @@ public:
>>         int configure(IPAContext &context, const IPAConfigInfo 
>> &configInfo) override;
>>       void prepare(IPAContext &context, ipu3_uapi_params *params) 
>> override;
>> -    void process(IPAContext &context, IPAFrameContext *frameContext,
>> +    void process(IPAContext &context, uint32_t frame,
>>                const ipu3_uapi_stats_3a *stats) override;
>>     private:
>> diff --git a/src/ipa/ipu3/algorithms/tone_mapping.cpp 
>> b/src/ipa/ipu3/algorithms/tone_mapping.cpp
>> index f86e79b2..0f70b8aa 100644
>> --- a/src/ipa/ipu3/algorithms/tone_mapping.cpp
>> +++ b/src/ipa/ipu3/algorithms/tone_mapping.cpp
>> @@ -78,7 +78,7 @@ void ToneMapping::prepare([[maybe_unused]] 
>> IPAContext &context,
>>    * The tone mapping look up table is generated as an inverse power 
>> curve from
>>    * our gamma setting.
>>    */
>> -void ToneMapping::process(IPAContext &context, [[maybe_unused]] 
>> IPAFrameContext *frameContext,
>> +void ToneMapping::process(IPAContext &context, [[maybe_unused]] 
>> uint32_t frame,
>>                 [[maybe_unused]] const ipu3_uapi_stats_3a *stats)
>>   {
>>       /*
>> diff --git a/src/ipa/ipu3/algorithms/tone_mapping.h 
>> b/src/ipa/ipu3/algorithms/tone_mapping.h
>> index d7d48006..61474085 100644
>> --- a/src/ipa/ipu3/algorithms/tone_mapping.h
>> +++ b/src/ipa/ipu3/algorithms/tone_mapping.h
>> @@ -20,7 +20,7 @@ public:
>>         int configure(IPAContext &context, const IPAConfigInfo 
>> &configInfo) override;
>>       void prepare(IPAContext &context, ipu3_uapi_params *params) 
>> override;
>> -    void process(IPAContext &context, IPAFrameContext *frameContext,
>> +    void process(IPAContext &context, uint32_t frame,
>>                const ipu3_uapi_stats_3a *stats) override;
>>     private:
>> diff --git a/src/ipa/ipu3/ipu3.cpp b/src/ipa/ipu3/ipu3.cpp
>> index e09c5d05..4f33b1a6 100644
>> --- a/src/ipa/ipu3/ipu3.cpp
>> +++ b/src/ipa/ipu3/ipu3.cpp
>> @@ -582,7 +582,7 @@ void IPAIPU3::processStatsBuffer(const uint32_t 
>> frame,
>>       ControlList ctrls(controls::controls);
>>         for (auto const &algo : algorithms_)
>> -        algo->process(context_, &frameContext, stats);
>> +        algo->process(context_, frame, stats);
>>         setControls(frame);
>>   diff --git a/src/ipa/libipa/algorithm.cpp 
>> b/src/ipa/libipa/algorithm.cpp
>> index cce2ed62..c0a9bbeb 100644
>> --- a/src/ipa/libipa/algorithm.cpp
>> +++ b/src/ipa/libipa/algorithm.cpp
>> @@ -64,7 +64,7 @@ namespace ipa {
>>    * \fn Algorithm::process()
>>    * \brief Process ISP statistics, and run algorithm operations
>>    * \param[in] context The shared IPA context
>> - * \param[in] frameContext The current frame's context
>> + * \param[in] frame The current frame id
>>    * \param[in] stats The IPA statistics and ISP results
>>    *
>>    * This function is called while camera is running for every frame 
>> processed by
>> diff --git a/src/ipa/libipa/algorithm.h b/src/ipa/libipa/algorithm.h
>> index 032a05b5..d1ca0883 100644
>> --- a/src/ipa/libipa/algorithm.h
>> +++ b/src/ipa/libipa/algorithm.h
>> @@ -10,8 +10,8 @@ namespace libcamera {
>>     namespace ipa {
>>   -template<typename Context, typename FrameContext, typename Config,
>> -     typename Params, typename Stats>
>> +template<typename Context, typename Config, typename Params, 
>> typename Stats>
>> +
>>   class Algorithm
>>   {
>>   public:
>> @@ -29,7 +29,7 @@ public:
>>       }
>>         virtual void process([[maybe_unused]] Context &context,
>> -                 [[maybe_unused]] FrameContext *frameContext,
>> +                 [[maybe_unused]] uint32_t frame,
>>                    [[maybe_unused]] const Stats *stats)
>>       {
>>       }
>> diff --git a/src/ipa/rkisp1/algorithms/agc.cpp 
>> b/src/ipa/rkisp1/algorithms/agc.cpp
>> index b5a184d9..9418b533 100644
>> --- a/src/ipa/rkisp1/algorithms/agc.cpp
>> +++ b/src/ipa/rkisp1/algorithms/agc.cpp
>> @@ -280,8 +280,7 @@ double Agc::measureBrightness(const 
>> rkisp1_cif_isp_hist_stat *hist) const
>>    * Identify the current image brightness, and use that to estimate 
>> the optimal
>>    * new exposure and gain for the scene.
>>    */
>> -void Agc::process(IPAContext &context,
>> -          [[maybe_unused]] IPAFrameContext *frameContext,
>> +void Agc::process(IPAContext &context, [[maybe_unused]] uint32_t frame,
>>             const rkisp1_stat_buffer *stats)
>>   {
>>       const rkisp1_cif_isp_stat *params = &stats->params;
>> diff --git a/src/ipa/rkisp1/algorithms/agc.h 
>> b/src/ipa/rkisp1/algorithms/agc.h
>> index 22c02779..a749f1c3 100644
>> --- a/src/ipa/rkisp1/algorithms/agc.h
>> +++ b/src/ipa/rkisp1/algorithms/agc.h
>> @@ -29,7 +29,7 @@ public:
>>         int configure(IPAContext &context, const IPACameraSensorInfo 
>> &configInfo) override;
>>       void prepare(IPAContext &context, rkisp1_params_cfg *params) 
>> override;
>> -    void process(IPAContext &context, IPAFrameContext *frameContext,
>> +    void process(IPAContext &context, uint32_t frame,
>>                const rkisp1_stat_buffer *stats) override;
>>     private:
>> diff --git a/src/ipa/rkisp1/algorithms/algorithm.h 
>> b/src/ipa/rkisp1/algorithms/algorithm.h
>> index 68e3a44e..069c744c 100644
>> --- a/src/ipa/rkisp1/algorithms/algorithm.h
>> +++ b/src/ipa/rkisp1/algorithms/algorithm.h
>> @@ -19,9 +19,8 @@ namespace libcamera {
>>     namespace ipa::rkisp1 {
>>   -using Algorithm = libcamera::ipa::Algorithm<IPAContext, 
>> IPAFrameContext,
>> -                        IPACameraSensorInfo, rkisp1_params_cfg,
>> -                        rkisp1_stat_buffer>;
>> +using Algorithm = libcamera::ipa::Algorithm<IPAContext, 
>> IPACameraSensorInfo,
>> +                        rkisp1_params_cfg, rkisp1_stat_buffer>;
>>     } /* namespace ipa::rkisp1 */
>>   diff --git a/src/ipa/rkisp1/algorithms/awb.cpp 
>> b/src/ipa/rkisp1/algorithms/awb.cpp
>> index 88441382..1e7fd11a 100644
>> --- a/src/ipa/rkisp1/algorithms/awb.cpp
>> +++ b/src/ipa/rkisp1/algorithms/awb.cpp
>> @@ -120,7 +120,7 @@ void Awb::prepare(IPAContext &context, 
>> rkisp1_params_cfg *params)
>>    * \copydoc libcamera::ipa::Algorithm::process
>>    */
>>   void Awb::process([[maybe_unused]] IPAContext &context,
>> -          [[maybe_unused]] IPAFrameContext *frameCtx,
>> +          [[maybe_unused]] uint32_t frame,
>>             const rkisp1_stat_buffer *stats)
>>   {
>>       const rkisp1_cif_isp_stat *params = &stats->params;
>> diff --git a/src/ipa/rkisp1/algorithms/awb.h 
>> b/src/ipa/rkisp1/algorithms/awb.h
>> index 7647842f..82921f34 100644
>> --- a/src/ipa/rkisp1/algorithms/awb.h
>> +++ b/src/ipa/rkisp1/algorithms/awb.h
>> @@ -23,7 +23,7 @@ public:
>>         int configure(IPAContext &context, const IPACameraSensorInfo 
>> &configInfo) override;
>>       void prepare(IPAContext &context, rkisp1_params_cfg *params) 
>> override;
>> -    void process(IPAContext &context, IPAFrameContext *frameCtx,
>> +    void process(IPAContext &context, uint32_t frame,
>>                const rkisp1_stat_buffer *stats) override;
>>     private:
>> diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp
>> index c818a6d7..ad33d817 100644
>> --- a/src/ipa/rkisp1/rkisp1.cpp
>> +++ b/src/ipa/rkisp1/rkisp1.cpp
>> @@ -272,7 +272,7 @@ void IPARkISP1::processStatsBuffer(const uint32_t 
>> frame, const uint32_t bufferId
>>       unsigned int aeState = 0;
>>         for (auto const &algo : algorithms_)
>> -        algo->process(context_, nullptr, stats);
>> +        algo->process(context_, frame, stats);
>>         setControls(frame);

Patch
diff mbox series

diff --git a/src/ipa/ipu3/algorithms/af.cpp b/src/ipa/ipu3/algorithms/af.cpp
index d07521a0..24462c6b 100644
--- a/src/ipa/ipu3/algorithms/af.cpp
+++ b/src/ipa/ipu3/algorithms/af.cpp
@@ -420,7 +420,7 @@  bool Af::afIsOutOfFocus(IPAContext context)
  *
  * [1] Hill Climbing Algorithm, https://en.wikipedia.org/wiki/Hill_climbing
  */
-void Af::process(IPAContext &context, [[maybe_unused]] IPAFrameContext *frameContext,
+void Af::process(IPAContext &context, [[maybe_unused]] uint32_t frame,
 		 const ipu3_uapi_stats_3a *stats)
 {
 	/* Evaluate the AF buffer length */
diff --git a/src/ipa/ipu3/algorithms/af.h b/src/ipa/ipu3/algorithms/af.h
index ccf015f3..69aeb3e2 100644
--- a/src/ipa/ipu3/algorithms/af.h
+++ b/src/ipa/ipu3/algorithms/af.h
@@ -32,7 +32,7 @@  public:
 
 	void prepare(IPAContext &context, ipu3_uapi_params *params) override;
 	int configure(IPAContext &context, const IPAConfigInfo &configInfo) override;
-	void process(IPAContext &context, IPAFrameContext *frameContext,
+	void process(IPAContext &context, uint32_t frame,
 		     const ipu3_uapi_stats_3a *stats) override;
 
 private:
diff --git a/src/ipa/ipu3/algorithms/agc.cpp b/src/ipa/ipu3/algorithms/agc.cpp
index f16be534..41766007 100644
--- a/src/ipa/ipu3/algorithms/agc.cpp
+++ b/src/ipa/ipu3/algorithms/agc.cpp
@@ -183,13 +183,14 @@  utils::Duration Agc::filterExposure(utils::Duration exposureValue)
  * \param[in] yGain The gain calculated based on the relative luminance target
  * \param[in] iqMeanGain The gain calculated based on the relative luminance target
  */
-void Agc::computeExposure(IPAContext &context, IPAFrameContext *frameContext,
-			  double yGain, double iqMeanGain)
+void Agc::computeExposure(IPAContext &context, uint32_t frame, double yGain,
+			  double iqMeanGain)
 {
 	const IPASessionConfiguration &configuration = context.configuration;
 	/* Get the effective exposure and gain applied on the sensor. */
-	uint32_t exposure = frameContext->sensor.exposure;
-	double analogueGain = frameContext->sensor.gain;
+	IPAFrameContext &frameContext = context.frameContexts.get(frame);
+	uint32_t exposure = frameContext.sensor.exposure;
+	double analogueGain = frameContext.sensor.gain;
 
 	/* Use the highest of the two gain estimates. */
 	double evGain = std::max(yGain, iqMeanGain);
@@ -323,7 +324,7 @@  double Agc::estimateLuminance(IPAActiveState &activeState,
  * Identify the current image brightness, and use that to estimate the optimal
  * new exposure and gain for the scene.
  */
-void Agc::process(IPAContext &context, [[maybe_unused]] IPAFrameContext *frameContext,
+void Agc::process(IPAContext &context, [[maybe_unused]] uint32_t frame,
 		  const ipu3_uapi_stats_3a *stats)
 {
 	/*
@@ -359,7 +360,7 @@  void Agc::process(IPAContext &context, [[maybe_unused]] IPAFrameContext *frameCo
 			break;
 	}
 
-	computeExposure(context, frameContext, yGain, iqMeanGain);
+	computeExposure(context, frame, yGain, iqMeanGain);
 	frameCount_++;
 }
 
diff --git a/src/ipa/ipu3/algorithms/agc.h b/src/ipa/ipu3/algorithms/agc.h
index 105ae0f2..8ef2a2d8 100644
--- a/src/ipa/ipu3/algorithms/agc.h
+++ b/src/ipa/ipu3/algorithms/agc.h
@@ -28,14 +28,14 @@  public:
 	~Agc() = default;
 
 	int configure(IPAContext &context, const IPAConfigInfo &configInfo) override;
-	void process(IPAContext &context, IPAFrameContext *frameContext,
+	void process(IPAContext &context, uint32_t frame,
 		     const ipu3_uapi_stats_3a *stats) override;
 
 private:
 	double measureBrightness(const ipu3_uapi_stats_3a *stats,
 				 const ipu3_uapi_grid_config &grid) const;
 	utils::Duration filterExposure(utils::Duration currentExposure);
-	void computeExposure(IPAContext &context, IPAFrameContext *frameContext,
+	void computeExposure(IPAContext &context, uint32_t frame,
 			     double yGain, double iqMeanGain);
 	double estimateLuminance(IPAActiveState &activeState,
 				 const ipu3_uapi_grid_config &grid,
diff --git a/src/ipa/ipu3/algorithms/algorithm.h b/src/ipa/ipu3/algorithms/algorithm.h
index 234b2bd7..3e0c60d3 100644
--- a/src/ipa/ipu3/algorithms/algorithm.h
+++ b/src/ipa/ipu3/algorithms/algorithm.h
@@ -17,8 +17,8 @@  namespace libcamera {
 
 namespace ipa::ipu3 {
 
-using Algorithm = libcamera::ipa::Algorithm<IPAContext, IPAFrameContext,
-					    IPAConfigInfo, ipu3_uapi_params,
+using Algorithm = libcamera::ipa::Algorithm<IPAContext, IPAConfigInfo,
+					    ipu3_uapi_params,
 					    ipu3_uapi_stats_3a>;
 
 } /* namespace ipa::ipu3 */
diff --git a/src/ipa/ipu3/algorithms/awb.cpp b/src/ipa/ipu3/algorithms/awb.cpp
index 5c232d92..35f35ebe 100644
--- a/src/ipa/ipu3/algorithms/awb.cpp
+++ b/src/ipa/ipu3/algorithms/awb.cpp
@@ -387,7 +387,7 @@  void Awb::calculateWBGains(const ipu3_uapi_stats_3a *stats)
 /**
  * \copydoc libcamera::ipa::Algorithm::process
  */
-void Awb::process(IPAContext &context, [[maybe_unused]] IPAFrameContext *frameContext,
+void Awb::process(IPAContext &context, [[maybe_unused]] uint32_t frame,
 		  const ipu3_uapi_stats_3a *stats)
 {
 	calculateWBGains(stats);
diff --git a/src/ipa/ipu3/algorithms/awb.h b/src/ipa/ipu3/algorithms/awb.h
index 9a50a985..f263540c 100644
--- a/src/ipa/ipu3/algorithms/awb.h
+++ b/src/ipa/ipu3/algorithms/awb.h
@@ -40,7 +40,7 @@  public:
 
 	int configure(IPAContext &context, const IPAConfigInfo &configInfo) override;
 	void prepare(IPAContext &context, ipu3_uapi_params *params) override;
-	void process(IPAContext &context, IPAFrameContext *frameContext,
+	void process(IPAContext &context, uint32_t frame,
 		     const ipu3_uapi_stats_3a *stats) override;
 
 private:
diff --git a/src/ipa/ipu3/algorithms/tone_mapping.cpp b/src/ipa/ipu3/algorithms/tone_mapping.cpp
index f86e79b2..0f70b8aa 100644
--- a/src/ipa/ipu3/algorithms/tone_mapping.cpp
+++ b/src/ipa/ipu3/algorithms/tone_mapping.cpp
@@ -78,7 +78,7 @@  void ToneMapping::prepare([[maybe_unused]] IPAContext &context,
  * The tone mapping look up table is generated as an inverse power curve from
  * our gamma setting.
  */
-void ToneMapping::process(IPAContext &context, [[maybe_unused]] IPAFrameContext *frameContext,
+void ToneMapping::process(IPAContext &context, [[maybe_unused]] uint32_t frame,
 			  [[maybe_unused]] const ipu3_uapi_stats_3a *stats)
 {
 	/*
diff --git a/src/ipa/ipu3/algorithms/tone_mapping.h b/src/ipa/ipu3/algorithms/tone_mapping.h
index d7d48006..61474085 100644
--- a/src/ipa/ipu3/algorithms/tone_mapping.h
+++ b/src/ipa/ipu3/algorithms/tone_mapping.h
@@ -20,7 +20,7 @@  public:
 
 	int configure(IPAContext &context, const IPAConfigInfo &configInfo) override;
 	void prepare(IPAContext &context, ipu3_uapi_params *params) override;
-	void process(IPAContext &context, IPAFrameContext *frameContext,
+	void process(IPAContext &context, uint32_t frame,
 		     const ipu3_uapi_stats_3a *stats) override;
 
 private:
diff --git a/src/ipa/ipu3/ipu3.cpp b/src/ipa/ipu3/ipu3.cpp
index e09c5d05..4f33b1a6 100644
--- a/src/ipa/ipu3/ipu3.cpp
+++ b/src/ipa/ipu3/ipu3.cpp
@@ -582,7 +582,7 @@  void IPAIPU3::processStatsBuffer(const uint32_t frame,
 	ControlList ctrls(controls::controls);
 
 	for (auto const &algo : algorithms_)
-		algo->process(context_, &frameContext, stats);
+		algo->process(context_, frame, stats);
 
 	setControls(frame);
 
diff --git a/src/ipa/libipa/algorithm.cpp b/src/ipa/libipa/algorithm.cpp
index cce2ed62..c0a9bbeb 100644
--- a/src/ipa/libipa/algorithm.cpp
+++ b/src/ipa/libipa/algorithm.cpp
@@ -64,7 +64,7 @@  namespace ipa {
  * \fn Algorithm::process()
  * \brief Process ISP statistics, and run algorithm operations
  * \param[in] context The shared IPA context
- * \param[in] frameContext The current frame's context
+ * \param[in] frame The current frame id
  * \param[in] stats The IPA statistics and ISP results
  *
  * This function is called while camera is running for every frame processed by
diff --git a/src/ipa/libipa/algorithm.h b/src/ipa/libipa/algorithm.h
index 032a05b5..d1ca0883 100644
--- a/src/ipa/libipa/algorithm.h
+++ b/src/ipa/libipa/algorithm.h
@@ -10,8 +10,8 @@  namespace libcamera {
 
 namespace ipa {
 
-template<typename Context, typename FrameContext, typename Config,
-	 typename Params, typename Stats>
+template<typename Context, typename Config, typename Params, typename Stats>
+
 class Algorithm
 {
 public:
@@ -29,7 +29,7 @@  public:
 	}
 
 	virtual void process([[maybe_unused]] Context &context,
-			     [[maybe_unused]] FrameContext *frameContext,
+			     [[maybe_unused]] uint32_t frame,
 			     [[maybe_unused]] const Stats *stats)
 	{
 	}
diff --git a/src/ipa/rkisp1/algorithms/agc.cpp b/src/ipa/rkisp1/algorithms/agc.cpp
index b5a184d9..9418b533 100644
--- a/src/ipa/rkisp1/algorithms/agc.cpp
+++ b/src/ipa/rkisp1/algorithms/agc.cpp
@@ -280,8 +280,7 @@  double Agc::measureBrightness(const rkisp1_cif_isp_hist_stat *hist) const
  * Identify the current image brightness, and use that to estimate the optimal
  * new exposure and gain for the scene.
  */
-void Agc::process(IPAContext &context,
-		  [[maybe_unused]] IPAFrameContext *frameContext,
+void Agc::process(IPAContext &context, [[maybe_unused]] uint32_t frame,
 		  const rkisp1_stat_buffer *stats)
 {
 	const rkisp1_cif_isp_stat *params = &stats->params;
diff --git a/src/ipa/rkisp1/algorithms/agc.h b/src/ipa/rkisp1/algorithms/agc.h
index 22c02779..a749f1c3 100644
--- a/src/ipa/rkisp1/algorithms/agc.h
+++ b/src/ipa/rkisp1/algorithms/agc.h
@@ -29,7 +29,7 @@  public:
 
 	int configure(IPAContext &context, const IPACameraSensorInfo &configInfo) override;
 	void prepare(IPAContext &context, rkisp1_params_cfg *params) override;
-	void process(IPAContext &context, IPAFrameContext *frameContext,
+	void process(IPAContext &context, uint32_t frame,
 		     const rkisp1_stat_buffer *stats) override;
 
 private:
diff --git a/src/ipa/rkisp1/algorithms/algorithm.h b/src/ipa/rkisp1/algorithms/algorithm.h
index 68e3a44e..069c744c 100644
--- a/src/ipa/rkisp1/algorithms/algorithm.h
+++ b/src/ipa/rkisp1/algorithms/algorithm.h
@@ -19,9 +19,8 @@  namespace libcamera {
 
 namespace ipa::rkisp1 {
 
-using Algorithm = libcamera::ipa::Algorithm<IPAContext, IPAFrameContext,
-					    IPACameraSensorInfo, rkisp1_params_cfg,
-					    rkisp1_stat_buffer>;
+using Algorithm = libcamera::ipa::Algorithm<IPAContext, IPACameraSensorInfo,
+					    rkisp1_params_cfg, rkisp1_stat_buffer>;
 
 } /* namespace ipa::rkisp1 */
 
diff --git a/src/ipa/rkisp1/algorithms/awb.cpp b/src/ipa/rkisp1/algorithms/awb.cpp
index 88441382..1e7fd11a 100644
--- a/src/ipa/rkisp1/algorithms/awb.cpp
+++ b/src/ipa/rkisp1/algorithms/awb.cpp
@@ -120,7 +120,7 @@  void Awb::prepare(IPAContext &context, rkisp1_params_cfg *params)
  * \copydoc libcamera::ipa::Algorithm::process
  */
 void Awb::process([[maybe_unused]] IPAContext &context,
-		  [[maybe_unused]] IPAFrameContext *frameCtx,
+		  [[maybe_unused]] uint32_t frame,
 		  const rkisp1_stat_buffer *stats)
 {
 	const rkisp1_cif_isp_stat *params = &stats->params;
diff --git a/src/ipa/rkisp1/algorithms/awb.h b/src/ipa/rkisp1/algorithms/awb.h
index 7647842f..82921f34 100644
--- a/src/ipa/rkisp1/algorithms/awb.h
+++ b/src/ipa/rkisp1/algorithms/awb.h
@@ -23,7 +23,7 @@  public:
 
 	int configure(IPAContext &context, const IPACameraSensorInfo &configInfo) override;
 	void prepare(IPAContext &context, rkisp1_params_cfg *params) override;
-	void process(IPAContext &context, IPAFrameContext *frameCtx,
+	void process(IPAContext &context, uint32_t frame,
 		     const rkisp1_stat_buffer *stats) override;
 
 private:
diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp
index c818a6d7..ad33d817 100644
--- a/src/ipa/rkisp1/rkisp1.cpp
+++ b/src/ipa/rkisp1/rkisp1.cpp
@@ -272,7 +272,7 @@  void IPARkISP1::processStatsBuffer(const uint32_t frame, const uint32_t bufferId
 	unsigned int aeState = 0;
 
 	for (auto const &algo : algorithms_)
-		algo->process(context_, nullptr, stats);
+		algo->process(context_, frame, stats);
 
 	setControls(frame);