[libcamera-devel,v3,6/6] src: ipa: raspberrypi: Move initial frame drop decision to AGC/AWB
diff mbox series

Message ID 20201208204441.9356-7-david.plowman@raspberrypi.com
State Accepted
Headers show
Series
  • Raspberry Pi AGC: initial frame drop count
Related show

Commit Message

David Plowman Dec. 8, 2020, 8:44 p.m. UTC
Previously the CamHelper was returning the number of frames to drop
(on account of AGC/AWB converging). This wasn't really appropriate,
it's better for the algorithms to do it as they know how many frames
they might need.

The CamHelper::HideFramesStartup method should now just be returning
the number of frames to hide because they're bad/invalid in some way,
not worrying about the AGC/AWB. For many sensors, the correct value
for this is zero. But the ov5647 needs updating as it must return 2.

Signed-off-by: David Plowman <david.plowman@raspberrypi.com>
Reviewed-by: Naushir Patuck <naush@raspberrypi.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 src/ipa/raspberrypi/cam_helper.cpp        |  6 ++---
 src/ipa/raspberrypi/cam_helper_ov5647.cpp | 10 ++++++++
 src/ipa/raspberrypi/raspberrypi.cpp       | 28 +++++++++++++++++++++++
 3 files changed, 41 insertions(+), 3 deletions(-)

Patch
diff mbox series

diff --git a/src/ipa/raspberrypi/cam_helper.cpp b/src/ipa/raspberrypi/cam_helper.cpp
index c8ac3232..6efa0d7f 100644
--- a/src/ipa/raspberrypi/cam_helper.cpp
+++ b/src/ipa/raspberrypi/cam_helper.cpp
@@ -82,10 +82,10 @@  bool CamHelper::SensorEmbeddedDataPresent() const
 unsigned int CamHelper::HideFramesStartup() const
 {
 	/*
-	 * By default, hide 6 frames completely at start-up while AGC etc. sort
-	 * themselves out (converge).
+	 * The number of frames when a camera first starts that shouldn't be
+	 * displayed as they are invalid in some way.
 	 */
-	return 6;
+	return 0;
 }
 
 unsigned int CamHelper::HideFramesModeSwitch() const
diff --git a/src/ipa/raspberrypi/cam_helper_ov5647.cpp b/src/ipa/raspberrypi/cam_helper_ov5647.cpp
index dc5d8275..0b841cd1 100644
--- a/src/ipa/raspberrypi/cam_helper_ov5647.cpp
+++ b/src/ipa/raspberrypi/cam_helper_ov5647.cpp
@@ -19,6 +19,7 @@  public:
 	uint32_t GainCode(double gain) const override;
 	double Gain(uint32_t gain_code) const override;
 	void GetDelays(int &exposure_delay, int &gain_delay) const override;
+	unsigned int HideFramesStartup() const override;
 	unsigned int HideFramesModeSwitch() const override;
 	unsigned int MistrustFramesStartup() const override;
 	unsigned int MistrustFramesModeSwitch() const override;
@@ -54,6 +55,15 @@  void CamHelperOv5647::GetDelays(int &exposure_delay, int &gain_delay) const
 	gain_delay = 2;
 }
 
+unsigned int CamHelperOv5647::HideFramesStartup() const
+{
+	/*
+	 * On startup, we get a couple of under-exposed frames which
+	 * we don't want shown.
+	 */
+	return 2;
+}
+
 unsigned int CamHelperOv5647::HideFramesModeSwitch() const
 {
 	/*
diff --git a/src/ipa/raspberrypi/raspberrypi.cpp b/src/ipa/raspberrypi/raspberrypi.cpp
index ba63480e..8dd796ed 100644
--- a/src/ipa/raspberrypi/raspberrypi.cpp
+++ b/src/ipa/raspberrypi/raspberrypi.cpp
@@ -194,6 +194,34 @@  int IPARPi::start(const IPAOperationData &data, IPAOperationData *result)
 	if (firstStart_) {
 		dropFrame = helper_->HideFramesStartup();
 		mistrustCount_ = helper_->MistrustFramesStartup();
+
+		/*
+		 * Query the AGC/AWB for how many frames they may take to
+		 * converge sufficiently. Where these numbers are non-zero
+		 * we must allow for the frames with bad statistics
+		 * (mistrustCount_) that they won't see. But if zero (i.e.
+		 * no convergence necessary), no frames need to be dropped.
+		 */
+		unsigned int agcConvergenceFrames = 0;
+		RPiController::AgcAlgorithm *agc = dynamic_cast<RPiController::AgcAlgorithm *>(
+			controller_.GetAlgorithm("agc"));
+		if (agc) {
+			agcConvergenceFrames = agc->GetConvergenceFrames();
+			if (agcConvergenceFrames)
+				agcConvergenceFrames += mistrustCount_;
+		}
+
+		unsigned int awbConvergenceFrames = 0;
+		RPiController::AwbAlgorithm *awb = dynamic_cast<RPiController::AwbAlgorithm *>(
+			controller_.GetAlgorithm("awb"));
+		if (awb) {
+			awbConvergenceFrames = awb->GetConvergenceFrames();
+			if (awbConvergenceFrames)
+				awbConvergenceFrames += mistrustCount_;
+		}
+
+		dropFrame = std::max({ dropFrame, agcConvergenceFrames, awbConvergenceFrames });
+		LOG(IPARPI, Debug) << "Drop " << dropFrame << " frames on startup";
 	} else {
 		dropFrame = helper_->HideFramesModeSwitch();
 		mistrustCount_ = helper_->MistrustFramesModeSwitch();