[v2,1/3] ipa: rkisp1: Initialise AGC from FrameDurationLimits controls
diff mbox series

Message ID 20250221092045.3896021-2-paul.elder@ideasonboard.com
State Accepted
Commit 443ac36e12597bcb30b4ac706bce815afc294073
Headers show
Series
  • ipa: rkisp1: Honor FrameDurationLimits
Related show

Commit Message

Paul Elder Feb. 21, 2025, 9:20 a.m. UTC
From: Kieran Bingham <kieran.bingham@ideasonboard.com>

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@ideasonboard.com>
Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>
Reviewed-by: Umang Jain <umang.jain@ideasonboard.com>
Reviewed-by: Daniel Scally <dan.scally@ideasonboard.com>
Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>

---
Changes in v2:
- recover from bitrot
- add a todo for moving handling control infos related to
  exposure/frame-duration from the IPA to the agc algo
---
 src/ipa/rkisp1/algorithms/agc.cpp | 9 +++------
 src/ipa/rkisp1/rkisp1.cpp         | 6 +++---
 2 files changed, 6 insertions(+), 9 deletions(-)

Patch
diff mbox series

diff --git a/src/ipa/rkisp1/algorithms/agc.cpp b/src/ipa/rkisp1/algorithms/agc.cpp
index 9a558a1ce29a..03dc56c96996 100644
--- a/src/ipa/rkisp1/algorithms/agc.cpp
+++ b/src/ipa/rkisp1/algorithms/agc.cpp
@@ -188,12 +188,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.maxExposureTime;
+	/* Limit the frame duration to match current initialisation */
+	ControlInfo &frameDurationLimits = context.ctrlMap[&controls::FrameDurationLimits];
+	context.activeState.agc.maxFrameDuration = std::chrono::microseconds(frameDurationLimits.max().get<int64_t>());
 
 	/*
 	 * 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 2ffdd99b158a..0e761249d27c 100644
--- a/src/ipa/rkisp1/rkisp1.cpp
+++ b/src/ipa/rkisp1/rkisp1.cpp
@@ -435,9 +435,9 @@  void IPARkISP1::updateControls(const IPACameraSensorInfo &sensorInfo,
 		frameDurations[i] = frameSize / (sensorInfo.pixelRate / 1000000U);
 	}
 
-	ctrlMap[&controls::FrameDurationLimits] = ControlInfo(frameDurations[0],
-							      frameDurations[1],
-							      frameDurations[2]);
+	/* \todo Move this (and other agc-related controls) to agc */
+	context_.ctrlMap[&controls::FrameDurationLimits] =
+		ControlInfo(frameDurations[0], frameDurations[1], frameDurations[2]);
 
 	ctrlMap.insert(context_.ctrlMap.begin(), context_.ctrlMap.end());
 	*ipaControls = ControlInfoMap(std::move(ctrlMap), controls::controls);