[libcamera-devel,v4,4/4] ipa: raspberrypi: Update sensor's V4L2_CID_NOTIFY_GAIN_RED/BLUE controls when present
diff mbox series

Message ID 20210427130844.11357-5-david.plowman@raspberrypi.com
State Superseded
Headers show
Series
  • Raspberry Pi: handle sensors more flexibly
Related show

Commit Message

David Plowman April 27, 2021, 1:08 p.m. UTC
If the sensor exposes V4L2_CID_NOTIFY_GAIN_RED and
V4L2_CID_NOTIFY_GAIN_BLUE controls, we pass it the colour gains.

We want these to be applied as soon as possible so we add a new
setSensorControls signal to the IPA which passes these back to the
pipeline handler without using the DelayedControls mechanism.

Signed-off-by: David Plowman <david.plowman@raspberrypi.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Naushir Patuck <naush@raspberrypi.com>
---
 include/libcamera/ipa/raspberrypi.mojom            |  1 +
 src/ipa/raspberrypi/raspberrypi.cpp                | 13 +++++++++++++
 src/libcamera/pipeline/raspberrypi/raspberrypi.cpp | 10 ++++++++++
 3 files changed, 24 insertions(+)

Patch
diff mbox series

diff --git a/include/libcamera/ipa/raspberrypi.mojom b/include/libcamera/ipa/raspberrypi.mojom
index 42321bee..24015263 100644
--- a/include/libcamera/ipa/raspberrypi.mojom
+++ b/include/libcamera/ipa/raspberrypi.mojom
@@ -118,6 +118,7 @@  interface IPARPiEventInterface {
 	statsMetadataComplete(uint32 bufferId, libcamera.ControlList controls);
 	runIsp(uint32 bufferId);
 	embeddedComplete(uint32 bufferId);
+	setSensorControls(libcamera.ControlList controls);
 	setIspControls(libcamera.ControlList controls);
 	setDelayedControls(libcamera.ControlList controls);
 };
diff --git a/src/ipa/raspberrypi/raspberrypi.cpp b/src/ipa/raspberrypi/raspberrypi.cpp
index dad6395f..f7d1aa0a 100644
--- a/src/ipa/raspberrypi/raspberrypi.cpp
+++ b/src/ipa/raspberrypi/raspberrypi.cpp
@@ -1036,6 +1036,19 @@  void IPARPi::processStats(unsigned int bufferId)
 
 		setDelayedControls.emit(ctrls);
 	}
+
+	struct AwbStatus awbStatus;
+	if (rpiMetadata_.Get("awb.status", awbStatus) == 0 &&
+	    sensorCtrls_.find(V4L2_CID_NOTIFY_GAIN_RED) != sensorCtrls_.end() &&
+	    sensorCtrls_.find(V4L2_CID_NOTIFY_GAIN_BLUE) != sensorCtrls_.end()) {
+		ControlList ctrls(sensorCtrls_);
+		ctrls.set(V4L2_CID_NOTIFY_GAIN_RED,
+			  static_cast<int32_t>(helper_->ColourGainCode(awbStatus.gain_r)));
+		ctrls.set(V4L2_CID_NOTIFY_GAIN_BLUE,
+			  static_cast<int32_t>(helper_->ColourGainCode(awbStatus.gain_b)));
+
+		setSensorControls.emit(ctrls);
+	}
 }
 
 void IPARPi::applyAWB(const struct AwbStatus *awbStatus, ControlList &ctrls)
diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
index 2a917455..054171d8 100644
--- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
+++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
@@ -152,6 +152,7 @@  public:
 	void statsMetadataComplete(uint32_t bufferId, const ControlList &controls);
 	void runIsp(uint32_t bufferId);
 	void embeddedComplete(uint32_t bufferId);
+	void setSensorControls(const ControlList &controls);
 	void setIspControls(const ControlList &controls);
 	void setDelayedControls(const ControlList &controls);
 
@@ -1219,6 +1220,7 @@  int RPiCameraData::loadIPA(ipa::RPi::SensorConfig *sensorConfig)
 	ipa_->statsMetadataComplete.connect(this, &RPiCameraData::statsMetadataComplete);
 	ipa_->runIsp.connect(this, &RPiCameraData::runIsp);
 	ipa_->embeddedComplete.connect(this, &RPiCameraData::embeddedComplete);
+	ipa_->setSensorControls.connect(this, &RPiCameraData::setSensorControls);
 	ipa_->setIspControls.connect(this, &RPiCameraData::setIspControls);
 	ipa_->setDelayedControls.connect(this, &RPiCameraData::setDelayedControls);
 
@@ -1361,6 +1363,14 @@  void RPiCameraData::embeddedComplete(uint32_t bufferId)
 	handleState();
 }
 
+void RPiCameraData::setSensorControls(const ControlList &controls)
+{
+	ControlList ctrls = controls;
+
+	unicam_[Unicam::Image].dev()->setControls(&ctrls);
+	handleState();
+}
+
 void RPiCameraData::setIspControls(const ControlList &controls)
 {
 	ControlList ctrls = controls;