<div dir="auto"><div><br><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, 10 Nov 2023, 4:14 pm David Plowman via libcamera-devel, <<a href="mailto:libcamera-devel@lists.libcamera.org">libcamera-devel@lists.libcamera.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">ColourTemperature is now exported as a writable control so that<br>
algorithms can set it directly. The AWB algorithm class now requires a<br>
method to be provided to perform this operation. The method should<br>
clamp the passed value to the calibrated range known to the algorithm.<br>
<br>
The default range is set very wide to cover all conceivable future AWB<br>
calibrations. It will always be clamped before use.<br>
<br>
Signed-off-by: David Plowman <<a href="mailto:david.plowman@raspberrypi.com" target="_blank" rel="noreferrer">david.plowman@raspberrypi.com</a>><br></blockquote></div></div><div dir="auto"><br></div><div dir="auto">Oops thought I had already reviewed this!</div><div dir="auto"><br></div><div dir="auto">Reviewed-by: Naushir Patuck <<a href="mailto:naush@raspberrypi.com">naush@raspberrypi.com</a>></div><div dir="auto"><br></div><div dir="auto"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
---<br>
src/ipa/rpi/common/ipa_base.cpp | 20 ++++++++++++++++++++<br>
src/ipa/rpi/controller/awb_algorithm.h | 1 +<br>
src/ipa/rpi/controller/rpi/awb.cpp | 18 ++++++++++++++++++<br>
src/ipa/rpi/controller/rpi/awb.h | 1 +<br>
4 files changed, 40 insertions(+)<br>
<br>
diff --git a/src/ipa/rpi/common/ipa_base.cpp b/src/ipa/rpi/common/ipa_base.cpp<br>
index 97a32522..cd1d6e3d 100644<br>
--- a/src/ipa/rpi/common/ipa_base.cpp<br>
+++ b/src/ipa/rpi/common/ipa_base.cpp<br>
@@ -80,6 +80,7 @@ const ControlInfoMap::Map ipaColourControls{<br>
{ &controls::AwbEnable, ControlInfo(false, true) },<br>
{ &controls::AwbMode, ControlInfo(controls::AwbModeValues) },<br>
{ &controls::ColourGains, ControlInfo(0.0f, 32.0f) },<br>
+ { &controls::ColourTemperature, ControlInfo(100, 100000) },<br>
{ &controls::Saturation, ControlInfo(0.0f, 32.0f, 1.0f) },<br>
};<br>
<br>
@@ -972,6 +973,25 @@ void IpaBase::applyControls(const ControlList &controls)<br>
break;<br>
}<br>
<br>
+ case controls::COLOUR_TEMPERATURE: {<br>
+ /* Silently ignore this control for a mono sensor. */<br>
+ if (monoSensor_)<br>
+ break;<br>
+<br>
+ auto temperatureK = ctrl.second.get<int32_t>();<br>
+ RPiController::AwbAlgorithm *awb = dynamic_cast<RPiController::AwbAlgorithm *>(<br>
+ controller_.getAlgorithm("awb"));<br>
+ if (!awb) {<br>
+ LOG(IPARPI, Warning)<br>
+ << "Could not set COLOUR_TEMPERATURE - no AWB algorithm";<br>
+ break;<br>
+ }<br>
+<br>
+ awb->setColourTemperature(temperatureK);<br>
+ /* This metadata will get reported back automatically. */<br>
+ break;<br>
+ }<br>
+<br>
case controls::BRIGHTNESS: {<br>
RPiController::ContrastAlgorithm *contrast = dynamic_cast<RPiController::ContrastAlgorithm *>(<br>
controller_.getAlgorithm("contrast"));<br>
diff --git a/src/ipa/rpi/controller/awb_algorithm.h b/src/ipa/rpi/controller/awb_algorithm.h<br>
index 8462c4db..d966dfa8 100644<br>
--- a/src/ipa/rpi/controller/awb_algorithm.h<br>
+++ b/src/ipa/rpi/controller/awb_algorithm.h<br>
@@ -18,6 +18,7 @@ public:<br>
virtual unsigned int getConvergenceFrames() const = 0;<br>
virtual void setMode(std::string const &modeName) = 0;<br>
virtual void setManualGains(double manualR, double manualB) = 0;<br>
+ virtual void setColourTemperature(double temperatureK) = 0;<br>
virtual void enableAuto() = 0;<br>
virtual void disableAuto() = 0;<br>
};<br>
diff --git a/src/ipa/rpi/controller/rpi/awb.cpp b/src/ipa/rpi/controller/rpi/awb.cpp<br>
index 5ae0c2fa..0918e20d 100644<br>
--- a/src/ipa/rpi/controller/rpi/awb.cpp<br>
+++ b/src/ipa/rpi/controller/rpi/awb.cpp<br>
@@ -275,6 +275,24 @@ void Awb::setManualGains(double manualR, double manualB)<br>
}<br>
}<br>
<br>
+void Awb::setColourTemperature(double temperatureK)<br>
+{<br>
+ if (!config_.bayes) {<br>
+ LOG(RPiAwb, Warning) << "AWB uncalibrated - cannot set colour temperature";<br>
+ return;<br>
+ }<br>
+<br>
+ temperatureK = config_.ctR.domain().clip(temperatureK);<br>
+ manualR_ = 1 / config_.ctR.eval(temperatureK);<br>
+ manualB_ = 1 / config_.ctB.eval(temperatureK);<br>
+<br>
+ syncResults_.temperatureK = temperatureK;<br>
+ syncResults_.gainR = manualR_;<br>
+ syncResults_.gainG = 1.0;<br>
+ syncResults_.gainB = manualB_;<br>
+ prevSyncResults_ = syncResults_;<br>
+}<br>
+<br>
void Awb::switchMode([[maybe_unused]] CameraMode const &cameraMode,<br>
Metadata *metadata)<br>
{<br>
diff --git a/src/ipa/rpi/controller/rpi/awb.h b/src/ipa/rpi/controller/rpi/awb.h<br>
index e7d49cd8..dbd79eda 100644<br>
--- a/src/ipa/rpi/controller/rpi/awb.h<br>
+++ b/src/ipa/rpi/controller/rpi/awb.h<br>
@@ -97,6 +97,7 @@ public:<br>
unsigned int getConvergenceFrames() const override;<br>
void setMode(std::string const &name) override;<br>
void setManualGains(double manualR, double manualB) override;<br>
+ void setColourTemperature(double temperatureK) override;<br>
void enableAuto() override;<br>
void disableAuto() override;<br>
void switchMode(CameraMode const &cameraMode, Metadata *metadata) override;<br>
-- <br>
2.39.2<br>
<br>
</blockquote></div></div></div>