summaryrefslogtreecommitdiff
path: root/src/ipa/simple/algorithms
diff options
context:
space:
mode:
authorMilan Zamazal <mzamazal@redhat.com>2025-03-26 10:08:38 +0100
committerKieran Bingham <kieran.bingham@ideasonboard.com>2025-03-26 10:45:01 +0000
commit84f82c6b3ca9c90d6fc8e55678a39968f16b255c (patch)
tree2e45b52d32ad254b6976fc5d21ac5a2b144ff804 /src/ipa/simple/algorithms
parentd505bd5360cc1681ae639c19cc48bdd28d24d9f7 (diff)
libcamera: software_isp: Determine color temperature
The AWB algorithm has data to determine color temperature of the image. Let's compute the temperature from it and store it into the context. This piece of information is currently unused but it will be needed in a followup patch introducing support for color correction matrix. Let's store the white balance related information under `awb' subsection of the active state, as the hardware pipelines do. Signed-off-by: Milan Zamazal <mzamazal@redhat.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Milan Zamazal <mzamazal@redhat.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Diffstat (limited to 'src/ipa/simple/algorithms')
-rw-r--r--src/ipa/simple/algorithms/awb.cpp12
-rw-r--r--src/ipa/simple/algorithms/lut.cpp2
2 files changed, 10 insertions, 4 deletions
diff --git a/src/ipa/simple/algorithms/awb.cpp b/src/ipa/simple/algorithms/awb.cpp
index 195de41d..1efc7090 100644
--- a/src/ipa/simple/algorithms/awb.cpp
+++ b/src/ipa/simple/algorithms/awb.cpp
@@ -12,6 +12,7 @@
#include <libcamera/base/log.h>
+#include "libipa/colours.h"
#include "simple/ipa_context.h"
namespace libcamera {
@@ -23,7 +24,7 @@ namespace ipa::soft::algorithms {
int Awb::configure(IPAContext &context,
[[maybe_unused]] const IPAConfigInfo &configInfo)
{
- auto &gains = context.activeState.gains;
+ auto &gains = context.activeState.awb.gains;
gains.red = gains.green = gains.blue = 1.0;
return 0;
@@ -54,12 +55,17 @@ void Awb::process(IPAContext &context,
* Calculate red and blue gains for AWB.
* Clamp max gain at 4.0, this also avoids 0 division.
*/
- auto &gains = context.activeState.gains;
+ auto &gains = context.activeState.awb.gains;
gains.red = sumR <= sumG / 4 ? 4.0 : static_cast<double>(sumG) / sumR;
gains.blue = sumB <= sumG / 4 ? 4.0 : static_cast<double>(sumG) / sumB;
/* Green gain is fixed to 1.0 */
- LOG(IPASoftAwb, Debug) << "gain R/B " << gains.red << "/" << gains.blue;
+ RGB<double> rgbGains{ { 1 / gains.red, 1 / gains.green, 1 / gains.blue } };
+ context.activeState.awb.temperatureK = estimateCCT(rgbGains);
+
+ LOG(IPASoftAwb, Debug)
+ << "gain R/B: " << gains.red << "/" << gains.blue
+ << "; temperature: " << context.activeState.awb.temperatureK;
}
REGISTER_IPA_ALGORITHM(Awb, "Awb")
diff --git a/src/ipa/simple/algorithms/lut.cpp b/src/ipa/simple/algorithms/lut.cpp
index 18f3a550..a2e11d3b 100644
--- a/src/ipa/simple/algorithms/lut.cpp
+++ b/src/ipa/simple/algorithms/lut.cpp
@@ -95,7 +95,7 @@ void Lut::prepare(IPAContext &context,
context.activeState.gamma.contrast != context.activeState.knobs.contrast)
updateGammaTable(context);
- auto &gains = context.activeState.gains;
+ auto &gains = context.activeState.awb.gains;
auto &gammaTable = context.activeState.gamma.gammaTable;
const unsigned int gammaTableSize = gammaTable.size();