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