[1/9] libcamera: software_isp: Determine color temperature
diff mbox series

Message ID 20241120180104.1221846-2-mzamazal@redhat.com
State New
Headers show
Series
  • Software ISP support for CCM
Related show

Commit Message

Milan Zamazal Nov. 20, 2024, 6 p.m. UTC
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>
---
 src/ipa/simple/algorithms/awb.cpp | 12 +++++++++---
 src/ipa/simple/algorithms/lut.cpp |  2 +-
 src/ipa/simple/ipa_context.h      | 11 +++++++----
 3 files changed, 17 insertions(+), 8 deletions(-)

Patch
diff mbox series

diff --git a/src/ipa/simple/algorithms/awb.cpp b/src/ipa/simple/algorithms/awb.cpp
index 195de41dc..db384c3fa 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;
+	context.activeState.awb.temperatureK =
+		estimateCCT(1 / gains.red, 1 / gains.green, 1 / gains.blue);
+
+	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 9744e773a..7fc87fc5f 100644
--- a/src/ipa/simple/algorithms/lut.cpp
+++ b/src/ipa/simple/algorithms/lut.cpp
@@ -58,7 +58,7 @@  void Lut::prepare(IPAContext &context,
 	if (context.activeState.gamma.blackLevel != context.activeState.blc.level)
 		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 fd121eebe..268ba9cec 100644
--- a/src/ipa/simple/ipa_context.h
+++ b/src/ipa/simple/ipa_context.h
@@ -34,10 +34,13 @@  struct IPAActiveState {
 	} blc;
 
 	struct {
-		double red;
-		double green;
-		double blue;
-	} gains;
+		struct {
+			double red;
+			double green;
+			double blue;
+		} gains;
+		unsigned int temperatureK;
+	} awb;
 
 	struct {
 		int32_t exposure;