[libcamera-devel,RFC,4/4] libcamera: pipeline: rkisp1: Support the new AE controls
diff mbox series

Message ID 20210928074959.3489544-5-paul.elder@ideasonboard.com
State Superseded
Headers show
Series
  • Fix pipelines for the new AE-related controls
Related show

Commit Message

Paul Elder Sept. 28, 2021, 7:49 a.m. UTC
Add support for the new AE controls in the rkisp1 pipeline handler, and
in the IPA.

Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>

---
It seems that the rkisp1 pipeline handler doesn't properly expose its
control capabilities? And even though it exposed AeEnable with both true
and false it didn't expose or handle AnalogueGain nor ExposureTime
either? So I just simply replaced AeEnable with ExposureTimeMode for
now.
---
 src/ipa/rkisp1/rkisp1.cpp                | 18 ++++++++++--------
 src/libcamera/pipeline/rkisp1/rkisp1.cpp |  4 ++--
 2 files changed, 12 insertions(+), 10 deletions(-)

Patch
diff mbox series

diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp
index bf2c13b6..708adfc9 100644
--- a/src/ipa/rkisp1/rkisp1.cpp
+++ b/src/ipa/rkisp1/rkisp1.cpp
@@ -52,7 +52,7 @@  private:
 			      const rkisp1_stat_buffer *stats);
 
 	void setControls(unsigned int frame);
-	void metadataReady(unsigned int frame, unsigned int aeState);
+	void metadataReady(unsigned int frame, int aeState);
 
 	std::map<unsigned int, FrameBuffer> buffers_;
 	std::map<unsigned int, MappedFrameBuffer> mappedBuffers_;
@@ -221,8 +221,9 @@  void IPARkISP1::queueRequest(unsigned int frame, rkisp1_params_cfg *params,
 	memset(params, 0, sizeof(*params));
 
 	/* Auto Exposure on/off. */
-	if (controls.contains(controls::AeEnable)) {
-		autoExposure_ = controls.get(controls::AeEnable);
+	if (controls.contains(controls::ExposureTimeMode)) {
+		autoExposure_ = (controls.get(controls::ExposureTimeMode) ==
+				 controls::ExposureTimeModeAuto);
 		if (autoExposure_)
 			params->module_ens = RKISP1_CIF_ISP_MODULE_AEC;
 
@@ -239,7 +240,7 @@  void IPARkISP1::updateStatistics(unsigned int frame,
 				 const rkisp1_stat_buffer *stats)
 {
 	const rkisp1_cif_isp_stat *params = &stats->params;
-	unsigned int aeState = 0;
+	int aeState = controls::AeStateInactive;
 
 	if (stats->meas_type & RKISP1_CIF_ISP_STAT_AUTOEXP) {
 		const rkisp1_cif_isp_ae_stat *ae = &params->ae;
@@ -274,7 +275,9 @@  void IPARkISP1::updateStatistics(unsigned int frame,
 			setControls(frame + 1);
 		}
 
-		aeState = fabs(factor - 1.0f) < 0.05f ? 2 : 1;
+		aeState = fabs(factor - 1.0f) < 0.05f ?
+			  controls::AeStateConverged :
+			  controls::AeStateSearching;
 	}
 
 	metadataReady(frame, aeState);
@@ -293,12 +296,11 @@  void IPARkISP1::setControls(unsigned int frame)
 	queueFrameAction.emit(frame, op);
 }
 
-void IPARkISP1::metadataReady(unsigned int frame, unsigned int aeState)
+void IPARkISP1::metadataReady(unsigned int frame, int aeState)
 {
 	ControlList ctrls(controls::controls);
 
-	if (aeState)
-		ctrls.set(controls::AeLocked, aeState == 2);
+	ctrls.set(controls::AeState, aeState);
 
 	RkISP1Action op;
 	op.op = ActionMetadata;
diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
index 98008862..1ed4522f 100644
--- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
+++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
@@ -935,8 +935,8 @@  int PipelineHandlerRkISP1::createCamera(MediaEntity *sensor)
 
 	ControlInfoMap::Map ctrls;
 	ctrls.emplace(std::piecewise_construct,
-		      std::forward_as_tuple(&controls::AeEnable),
-		      std::forward_as_tuple(false, true));
+		      std::forward_as_tuple(&controls::ExposureTimeMode),
+		      std::forward_as_tuple(ControlInfo(controls::AeExposureModeValues)));
 
 	data->controlInfo_ = ControlInfoMap(std::move(ctrls),
 					    controls::controls);