[PATCH v3 1/9] libcamera: software_isp: Determine color temperature

Milan Zamazal mzamazal at redhat.com
Tue Dec 10 16:34:31 CET 2024


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 at redhat.com>
---
 src/ipa/simple/algorithms/awb.cpp | 13 ++++++++++---
 src/ipa/simple/algorithms/lut.cpp |  2 +-
 src/ipa/simple/ipa_context.h      | 11 +++++++----
 3 files changed, 18 insertions(+), 8 deletions(-)

diff --git a/src/ipa/simple/algorithms/awb.cpp b/src/ipa/simple/algorithms/awb.cpp
index 195de41d..f4fe1af6 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,18 @@ 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 } };
+	uint32_t temperature = estimateCCT(rgbGains);
+	context.activeState.awb.temperatureK = temperature;
+
+	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 0ba2391f..d75ff710 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();
 
diff --git a/src/ipa/simple/ipa_context.h b/src/ipa/simple/ipa_context.h
index 4af51306..607af45a 100644
--- a/src/ipa/simple/ipa_context.h
+++ b/src/ipa/simple/ipa_context.h
@@ -36,10 +36,13 @@ struct IPAActiveState {
 	} blc;
 
 	struct {
-		double red;
-		double green;
-		double blue;
-	} gains;
+		struct {
+			double red;
+			double green;
+			double blue;
+		} gains;
+		unsigned int temperatureK;
+	} awb;
 
 	static constexpr unsigned int kGammaLookupSize = 1024;
 	struct {
-- 
2.44.2



More information about the libcamera-devel mailing list