<div dir="ltr"><div dir="ltr">Hi David,<div><br></div></div><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, 14 Apr 2021 at 11:30, David Plowman <<a href="mailto:david.plowman@raspberrypi.com">david.plowman@raspberrypi.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">If the sensor exposes V4L2_CID_RED_BALANCE and V4L2_CID_BLUE_BALANCE<br>
controls, assume it wants to be told the colour gains.<br>
<br>
We want these to be applied as soon as possible so we add a new<br>
setSensorControls signal to the IPA which passes these back to the<br>
pipeline handler without using the DelayedControls mechanism.<br>
<br>
Signed-off-by: David Plowman <<a href="mailto:david.plowman@raspberrypi.com" target="_blank">david.plowman@raspberrypi.com</a>><br>
Reviewed-by: Kieran Bingham <<a href="mailto:kieran.bingham@ideasonboard.com" target="_blank">kieran.bingham@ideasonboard.com</a>><br>
---<br></blockquote><div><br></div><div>Reviewed-by: Naushir Patuck <<a href="mailto:naush@raspberrypi.com">naush@raspberrypi.com</a>></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
 include/libcamera/ipa/raspberrypi.mojom            |  1 +<br>
 src/ipa/raspberrypi/raspberrypi.cpp                | 13 +++++++++++++<br>
 src/libcamera/pipeline/raspberrypi/raspberrypi.cpp | 10 ++++++++++<br>
 3 files changed, 24 insertions(+)<br>
<br>
diff --git a/include/libcamera/ipa/raspberrypi.mojom b/include/libcamera/ipa/raspberrypi.mojom<br>
index f38c2261..ebaf0a04 100644<br>
--- a/include/libcamera/ipa/raspberrypi.mojom<br>
+++ b/include/libcamera/ipa/raspberrypi.mojom<br>
@@ -117,6 +117,7 @@ interface IPARPiEventInterface {<br>
        statsMetadataComplete(uint32 bufferId, ControlList controls);<br>
        runIsp(uint32 bufferId);<br>
        embeddedComplete(uint32 bufferId);<br>
+       setSensorControls(ControlList controls);<br>
        setIspControls(ControlList controls);<br>
        setDelayedControls(ControlList controls);<br>
 };<br>
diff --git a/src/ipa/raspberrypi/raspberrypi.cpp b/src/ipa/raspberrypi/raspberrypi.cpp<br>
index dad6395f..f95896d2 100644<br>
--- a/src/ipa/raspberrypi/raspberrypi.cpp<br>
+++ b/src/ipa/raspberrypi/raspberrypi.cpp<br>
@@ -1036,6 +1036,19 @@ void IPARPi::processStats(unsigned int bufferId)<br>
<br>
                setDelayedControls.emit(ctrls);<br>
        }<br>
+<br>
+       struct AwbStatus awbStatus;<br>
+       if (rpiMetadata_.Get("awb.status", awbStatus) == 0 &&<br>
+           sensorCtrls_.find(V4L2_CID_RED_BALANCE) != sensorCtrls_.end() &&<br>
+           sensorCtrls_.find(V4L2_CID_BLUE_BALANCE) != sensorCtrls_.end()) {<br>
+               ControlList ctrls(sensorCtrls_);<br>
+               ctrls.set(V4L2_CID_RED_BALANCE,<br>
+                         static_cast<int32_t>(helper_->ColourGainCode(awbStatus.gain_r)));<br>
+               ctrls.set(V4L2_CID_BLUE_BALANCE,<br>
+                         static_cast<int32_t>(helper_->ColourGainCode(awbStatus.gain_b)));<br>
+<br>
+               setSensorControls.emit(ctrls);<br>
+       }<br>
 }<br>
<br>
 void IPARPi::applyAWB(const struct AwbStatus *awbStatus, ControlList &ctrls)<br>
diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp<br>
index f22e286e..8dae4912 100644<br>
--- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp<br>
+++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp<br>
@@ -152,6 +152,7 @@ public:<br>
        void statsMetadataComplete(uint32_t bufferId, const ControlList &controls);<br>
        void runIsp(uint32_t bufferId);<br>
        void embeddedComplete(uint32_t bufferId);<br>
+       void setSensorControls(const ControlList &controls);<br>
        void setIspControls(const ControlList &controls);<br>
        void setDelayedControls(const ControlList &controls);<br>
<br>
@@ -1219,6 +1220,7 @@ int RPiCameraData::loadIPA(ipa::RPi::SensorConfig *sensorConfig)<br>
        ipa_->statsMetadataComplete.connect(this, &RPiCameraData::statsMetadataComplete);<br>
        ipa_->runIsp.connect(this, &RPiCameraData::runIsp);<br>
        ipa_->embeddedComplete.connect(this, &RPiCameraData::embeddedComplete);<br>
+       ipa_->setSensorControls.connect(this, &RPiCameraData::setSensorControls);<br>
        ipa_->setIspControls.connect(this, &RPiCameraData::setIspControls);<br>
        ipa_->setDelayedControls.connect(this, &RPiCameraData::setDelayedControls);<br>
<br>
@@ -1361,6 +1363,14 @@ void RPiCameraData::embeddedComplete(uint32_t bufferId)<br>
        handleState();<br>
 }<br>
<br>
+void RPiCameraData::setSensorControls(const ControlList &controls)<br>
+{<br>
+       ControlList ctrls = controls;<br>
+<br>
+       unicam_[Unicam::Image].dev()->setControls(&ctrls);<br>
+       handleState();<br>
+}<br>
+<br>
 void RPiCameraData::setIspControls(const ControlList &controls)<br>
 {<br>
        ControlList ctrls = controls;<br>
-- <br>
2.20.1<br>
<br>
_______________________________________________<br>
libcamera-devel mailing list<br>
<a href="mailto:libcamera-devel@lists.libcamera.org" target="_blank">libcamera-devel@lists.libcamera.org</a><br>
<a href="https://lists.libcamera.org/listinfo/libcamera-devel" rel="noreferrer" target="_blank">https://lists.libcamera.org/listinfo/libcamera-devel</a><br>
</blockquote></div></div>