[libcamera-devel] [PATCH v2 1/4] ipa: rkisp1: Use frame index

Jean-Michel Hautbois jeanmichel.hautbois at ideasonboard.com
Wed Feb 23 11:48:21 CET 2022


Instead of incrementing the frameCount manually in a local counter, use
the frame index on the EventStatReay event and store it in a new
IPAFrameContext variable named frameId.

The frameId may be used by other algorithms later.

Signed-off-by: Jean-Michel Hautbois <jeanmichel.hautbois at ideasonboard.com>
Tested-by: Peter Griffin <peter.griffin at linaro.org>
---
 src/ipa/rkisp1/algorithms/agc.cpp |  5 ++---
 src/ipa/rkisp1/ipa_context.cpp    |  5 +++++
 src/ipa/rkisp1/ipa_context.h      |  2 ++
 src/ipa/rkisp1/rkisp1.cpp         | 11 +++++------
 4 files changed, 14 insertions(+), 9 deletions(-)

diff --git a/src/ipa/rkisp1/algorithms/agc.cpp b/src/ipa/rkisp1/algorithms/agc.cpp
index dd97afc0..50980835 100644
--- a/src/ipa/rkisp1/algorithms/agc.cpp
+++ b/src/ipa/rkisp1/algorithms/agc.cpp
@@ -82,8 +82,6 @@ int Agc::configure(IPAContext &context,
 	else
 		numCells_ = RKISP1_CIF_ISP_AE_MEAN_MAX_V12;
 
-	/* \todo Use actual frame index by populating it in the frameContext. */
-	frameCount_ = 0;
 	return 0;
 }
 
@@ -255,6 +253,8 @@ void Agc::process(IPAContext &context, const rkisp1_stat_buffer *stats)
 
 	const rkisp1_cif_isp_ae_stat *ae = &params->ae;
 
+	frameCount_ = context.frameContext.frameId;
+
 	/*
 	 * Estimate the gain needed to achieve a relative luminance target. To
 	 * account for non-linearity caused by saturation, the value needs to be
@@ -278,7 +278,6 @@ void Agc::process(IPAContext &context, const rkisp1_stat_buffer *stats)
 	}
 
 	computeExposure(context, yGain);
-	frameCount_++;
 }
 
 void Agc::prepare([[maybe_unused]] IPAContext &context,
diff --git a/src/ipa/rkisp1/ipa_context.cpp b/src/ipa/rkisp1/ipa_context.cpp
index 9cb2a9fd..992c9225 100644
--- a/src/ipa/rkisp1/ipa_context.cpp
+++ b/src/ipa/rkisp1/ipa_context.cpp
@@ -113,4 +113,9 @@ namespace libcamera::ipa::rkisp1 {
  * \brief Analogue gain multiplier
  */
 
+/**
+ * \var IPAFrameContext::frameId
+ * \brief Frame number for this frame context
+ */
+
 } /* namespace libcamera::ipa::rkisp1 */
diff --git a/src/ipa/rkisp1/ipa_context.h b/src/ipa/rkisp1/ipa_context.h
index b94ade0c..c447369f 100644
--- a/src/ipa/rkisp1/ipa_context.h
+++ b/src/ipa/rkisp1/ipa_context.h
@@ -43,6 +43,8 @@ struct IPAFrameContext {
 		uint32_t exposure;
 		double gain;
 	} sensor;
+
+	unsigned int frameId;
 };
 
 struct IPAContext {
diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp
index 2d79f15f..732ca2bb 100644
--- a/src/ipa/rkisp1/rkisp1.cpp
+++ b/src/ipa/rkisp1/rkisp1.cpp
@@ -56,8 +56,7 @@ public:
 private:
 	void queueRequest(unsigned int frame, rkisp1_params_cfg *params,
 			  const ControlList &controls);
-	void updateStatistics(unsigned int frame,
-			      const rkisp1_stat_buffer *stats);
+	void updateStatistics(const rkisp1_stat_buffer *stats);
 
 	void setControls(unsigned int frame);
 	void metadataReady(unsigned int frame, unsigned int aeState);
@@ -239,7 +238,6 @@ void IPARkISP1::processEvent(const RkISP1Event &event)
 {
 	switch (event.op) {
 	case EventSignalStatBuffer: {
-		unsigned int frame = event.frame;
 		unsigned int bufferId = event.bufferId;
 
 		const rkisp1_stat_buffer *stats =
@@ -250,8 +248,9 @@ void IPARkISP1::processEvent(const RkISP1Event &event)
 			event.sensorControls.get(V4L2_CID_EXPOSURE).get<int32_t>();
 		context_.frameContext.sensor.gain =
 			camHelper_->gain(event.sensorControls.get(V4L2_CID_ANALOGUE_GAIN).get<int32_t>());
+		context_.frameContext.frameId = event.frame;
 
-		updateStatistics(frame, stats);
+		updateStatistics(stats);
 		break;
 	}
 	case EventQueueRequest: {
@@ -286,10 +285,10 @@ void IPARkISP1::queueRequest(unsigned int frame, rkisp1_params_cfg *params,
 	queueFrameAction.emit(frame, op);
 }
 
-void IPARkISP1::updateStatistics(unsigned int frame,
-				 const rkisp1_stat_buffer *stats)
+void IPARkISP1::updateStatistics(const rkisp1_stat_buffer *stats)
 {
 	unsigned int aeState = 0;
+	unsigned int frame = context_.frameContext.frameId;
 
 	for (auto const &algo : algorithms_)
 		algo->process(context_, stats);
-- 
2.32.0



More information about the libcamera-devel mailing list