<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>