summaryrefslogtreecommitdiff
path: root/src/ipa/rkisp1/algorithms
diff options
context:
space:
mode:
Diffstat (limited to 'src/ipa/rkisp1/algorithms')
-rw-r--r--src/ipa/rkisp1/algorithms/awb.cpp36
-rw-r--r--src/ipa/rkisp1/algorithms/awb.h2
2 files changed, 36 insertions, 2 deletions
diff --git a/src/ipa/rkisp1/algorithms/awb.cpp b/src/ipa/rkisp1/algorithms/awb.cpp
index 9f00364d..a3c14a9a 100644
--- a/src/ipa/rkisp1/algorithms/awb.cpp
+++ b/src/ipa/rkisp1/algorithms/awb.cpp
@@ -12,6 +12,7 @@
#include <libcamera/base/log.h>
+#include <libcamera/control_ids.h>
#include <libcamera/ipa/core_ipa_interface.h>
/**
@@ -38,6 +39,7 @@ int Awb::configure(IPAContext &context,
context.frameContext.awb.gains.red = 1.0;
context.frameContext.awb.gains.blue = 1.0;
context.frameContext.awb.gains.green = 1.0;
+ context.frameContext.awb.autoEnabled = true;
/*
* Define the measurement window for AWB as a centered rectangle
@@ -117,6 +119,34 @@ void Awb::prepare(IPAContext &context, rkisp1_params_cfg *params)
}
/**
+ * \copydoc libcamera::ipa::Algorithm::queueRequest
+ */
+void Awb::queueRequest(IPAContext &context,
+ [[maybe_unused]] const uint32_t frame,
+ const ControlList &controls)
+{
+ auto &awb = context.frameContext.awb;
+
+ const auto &awbEnable = controls.get(controls::AwbEnable);
+ if (awbEnable && *awbEnable != awb.autoEnabled) {
+ awb.autoEnabled = *awbEnable;
+
+ LOG(RkISP1Awb, Debug)
+ << (*awbEnable ? "Enabling" : "Disabling") << " AWB";
+ }
+
+ const auto &colourGains = controls.get(controls::ColourGains);
+ if (colourGains && !awb.autoEnabled) {
+ awb.gains.red = (*colourGains)[0];
+ awb.gains.blue = (*colourGains)[1];
+
+ LOG(RkISP1Awb, Debug)
+ << "Set colour gains to red: " << awb.gains.red
+ << ", blue: " << awb.gains.blue;
+ }
+}
+
+/**
* \copydoc libcamera::ipa::Algorithm::process
*/
void Awb::process([[maybe_unused]] IPAContext &context,
@@ -164,8 +194,10 @@ void Awb::process([[maybe_unused]] IPAContext &context,
* Gain values are unsigned integer value, range 0 to 4 with 8 bit
* fractional part.
*/
- frameContext.awb.gains.red = std::clamp(redGain, 0.0, 1023.0 / 256);
- frameContext.awb.gains.blue = std::clamp(blueGain, 0.0, 1023.0 / 256);
+ if (frameContext.awb.autoEnabled) {
+ frameContext.awb.gains.red = std::clamp(redGain, 0.0, 1023.0 / 256);
+ frameContext.awb.gains.blue = std::clamp(blueGain, 0.0, 1023.0 / 256);
+ }
/* Hardcode the green gain to 1.0. */
frameContext.awb.gains.green = 1.0;
diff --git a/src/ipa/rkisp1/algorithms/awb.h b/src/ipa/rkisp1/algorithms/awb.h
index 667a8beb..4917267b 100644
--- a/src/ipa/rkisp1/algorithms/awb.h
+++ b/src/ipa/rkisp1/algorithms/awb.h
@@ -21,6 +21,8 @@ public:
int configure(IPAContext &context, const IPACameraSensorInfo &configInfo) override;
void prepare(IPAContext &context, rkisp1_params_cfg *params) override;
+ void queueRequest(IPAContext &context, const uint32_t frame,
+ const ControlList &controls) override;
void process(IPAContext &context, IPAFrameContext *frameCtx,
const rkisp1_stat_buffer *stats) override;