ipa: simple: agc: Make sure activeState.agc expo/again are always initialized
diff mbox series

Message ID 20251220172703.321681-1-johannes.goede@oss.qualcomm.com
State New
Headers show
Series
  • ipa: simple: agc: Make sure activeState.agc expo/again are always initialized
Related show

Commit Message

Hans de Goede Dec. 20, 2025, 5:27 p.m. UTC
If the first frame of a stream is bad, the IPA will not get called with
frame == 0, leaving activeState.agc expo/again uninitialized. This causes
the agc algorithm to set a very low gain and exposure on the next run
(where it will hit the if (!stats->valid) {} path) resulting in starting
with a black image.

Fix this by using a valid flag instead of checking for frame == 0.

The entire activeState gets cleared to 0 on configure() resetting the new
valid flag.

Signed-off-by: Hans de Goede <johannes.goede@oss.qualcomm.com>
---
 src/ipa/simple/algorithms/agc.cpp | 5 +++--
 src/ipa/simple/ipa_context.h      | 1 +
 2 files changed, 4 insertions(+), 2 deletions(-)

Patch
diff mbox series

diff --git a/src/ipa/simple/algorithms/agc.cpp b/src/ipa/simple/algorithms/agc.cpp
index 189de770..2f7e040c 100644
--- a/src/ipa/simple/algorithms/agc.cpp
+++ b/src/ipa/simple/algorithms/agc.cpp
@@ -100,7 +100,7 @@  void Agc::updateExposure(IPAContext &context, IPAFrameContext &frameContext, dou
 }
 
 void Agc::process(IPAContext &context,
-		  const uint32_t frame,
+		  [[maybe_unused]] const uint32_t frame,
 		  IPAFrameContext &frameContext,
 		  const SwIspStats *stats,
 		  ControlList &metadata)
@@ -110,13 +110,14 @@  void Agc::process(IPAContext &context,
 	metadata.set(controls::ExposureTime, exposureTime.get<std::micro>());
 	metadata.set(controls::AnalogueGain, frameContext.sensor.gain);
 
-	if (frame == 0) {
+	if (!context.activeState.agc.valid) {
 		/*
 		 * Init active-state from sensor values in case updateExposure()
 		 * does not run for the first frame.
 		 */
 		context.activeState.agc.exposure = frameContext.sensor.exposure;
 		context.activeState.agc.again = frameContext.sensor.gain;
+		context.activeState.agc.valid = true;
 	}
 
 	if (!stats->valid) {
diff --git a/src/ipa/simple/ipa_context.h b/src/ipa/simple/ipa_context.h
index c3081e30..26b60fb6 100644
--- a/src/ipa/simple/ipa_context.h
+++ b/src/ipa/simple/ipa_context.h
@@ -40,6 +40,7 @@  struct IPAActiveState {
 	struct {
 		int32_t exposure;
 		double again;
+		bool valid;
 	} agc;
 
 	struct {