[PATCH 1/3] ipa: rkisp1: Initialise AGC from FrameDurationLimits controls

Laurent Pinchart laurent.pinchart at ideasonboard.com
Sun Oct 27 19:54:02 CET 2024


On Mon, Oct 14, 2024 at 04:47:45PM +0100, Kieran Bingham wrote:
> The IPA calculates and reports the FrameDurationLimits to applications
> by configuring the ControlInfo accordingly during
> IPARkISP1::updateControls()
> 
> We later need to know these limits during Agc::configure() for
> initialising the ActiveState of the AGC implementation with the limits.
> 
> Store the FrameDurationLimits ControlInfo in the ControlInfoMap which is
> now present in the IPAContext so that it is commonly available for the
> AGC algorithm, removing the 'todo' accordingly.
> 
> Signed-off-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
> ---
>  src/ipa/rkisp1/algorithms/agc.cpp | 9 +++------
>  src/ipa/rkisp1/rkisp1.cpp         | 5 ++---
>  2 files changed, 5 insertions(+), 9 deletions(-)
> 
> diff --git a/src/ipa/rkisp1/algorithms/agc.cpp b/src/ipa/rkisp1/algorithms/agc.cpp
> index 17d074d9c03e..33f902862c4a 100644
> --- a/src/ipa/rkisp1/algorithms/agc.cpp
> +++ b/src/ipa/rkisp1/algorithms/agc.cpp
> @@ -178,12 +178,9 @@ int Agc::configure(IPAContext &context, const IPACameraSensorInfo &configInfo)
>  	context.activeState.agc.meteringMode =
>  		static_cast<controls::AeMeteringModeEnum>(meteringModes_.begin()->first);
>  
> -	/*
> -	 * \todo This should probably come from FrameDurationLimits instead,
> -	 * except it's computed in the IPA and not here so we'd have to
> -	 * recompute it.
> -	 */
> -	context.activeState.agc.maxFrameDuration = context.configuration.sensor.maxShutterSpeed;
> +	/* Limit the frame duration to match current initialisation */
> +	ControlInfo &frameDurationLimits = context.ctrlMap[&controls::FrameDurationLimits];

const

> +	context.activeState.agc.maxFrameDuration = std::chrono::microseconds(frameDurationLimits.max().get<int64_t>());

That's long, maybe

	context.activeState.agc.maxFrameDuration =
		std::chrono::microseconds(frameDurationLimits.max().get<int64_t>());

or

	int64_t maxFrameDuration = frameDurationLimits.max().get<int64_t>();
	context.activeState.agc.maxFrameDuration = std::chrono::microseconds(maxFrameDuration);
>  
>  	/*
>  	 * Define the measurement window for AGC as a centered rectangle
> diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp
> index 9e161cabdea4..47777ece783f 100644
> --- a/src/ipa/rkisp1/rkisp1.cpp
> +++ b/src/ipa/rkisp1/rkisp1.cpp
> @@ -432,9 +432,8 @@ void IPARkISP1::updateControls(const IPACameraSensorInfo &sensorInfo,
>  		frameDurations[i] = frameSize / (sensorInfo.pixelRate / 1000000U);
>  	}
>  
> -	ctrlMap[&controls::FrameDurationLimits] = ControlInfo(frameDurations[0],
> -							      frameDurations[1],
> -							      frameDurations[2]);
> +	context_.ctrlMap[&controls::FrameDurationLimits] =
> +		ControlInfo(frameDurations[0], frameDurations[1], frameDurations[2]);

I wonder if all this should be moved to the AGC algorithm. There are
cross-dependencies between the IPARkISP1 class and the AGC algorithm
that make the code fragile. Cleanups would be nice.

>  
>  	ctrlMap.insert(context_.ctrlMap.begin(), context_.ctrlMap.end());
>  	*ipaControls = ControlInfoMap(std::move(ctrlMap), controls::controls);

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list