[20/22] libcamera: software_isp: blacklevel: Make black level available in debayer params
diff mbox series

Message ID 20251120232019.3590-21-bryan.odonoghue@linaro.org
State New
Headers show
Series
  • GPUISP precursor series
Related show

Commit Message

Bryan O'Donoghue Nov. 20, 2025, 11:20 p.m. UTC
Populate black level gain in blacklevel::prepare(). A copy is made of the gain
value in the DebayerParams structure.

Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
---
 .../internal/software_isp/debayer_params.h          |  6 ++++++
 src/ipa/simple/algorithms/blc.cpp                   | 13 +++++++++++++
 src/ipa/simple/algorithms/blc.h                     |  4 ++++
 3 files changed, 23 insertions(+)

Patch
diff mbox series

diff --git a/include/libcamera/internal/software_isp/debayer_params.h b/include/libcamera/internal/software_isp/debayer_params.h
index 019df2048..1a319833c 100644
--- a/include/libcamera/internal/software_isp/debayer_params.h
+++ b/include/libcamera/internal/software_isp/debayer_params.h
@@ -14,6 +14,7 @@ 
 #include <stdint.h>
 
 #include "libcamera/internal/matrix.h"
+#include "libcamera/internal/vector.h"
 
 namespace libcamera {
 
@@ -56,6 +57,11 @@  struct DebayerParams {
 	 * Per frame CCM values as calcualted by the IPA
 	 */
 	Matrix<float, 3, 3> ccm;	/**< Per frame colour correction matrix for GPUISP */
+
+	/*
+	 * Per frame blacklevel gains calculated by the IPA
+	 */
+	RGB<float> blackLevel;		/**< Blacklevel gains for GPUISP */
 };
 
 } /* namespace libcamera */
diff --git a/src/ipa/simple/algorithms/blc.cpp b/src/ipa/simple/algorithms/blc.cpp
index 370385afc..4569ded48 100644
--- a/src/ipa/simple/algorithms/blc.cpp
+++ b/src/ipa/simple/algorithms/blc.cpp
@@ -47,6 +47,19 @@  int BlackLevel::configure(IPAContext &context,
 	return 0;
 }
 
+void BlackLevel::prepare(IPAContext &context,
+			 [[maybe_unused]] const uint32_t frame,
+			 [[maybe_unused]] IPAFrameContext &frameContext,
+			 DebayerParams *params)
+{
+	const std::array<float, 3> blackLevel { context.activeState.blc.level / 255.0f,
+						context.activeState.blc.level / 255.0f,
+						context.activeState.blc.level / 255.0f };
+
+	/* Latch the blacklevel gain so GPUISP can apply. */
+	params->blackLevel = RGB<float>(blackLevel);
+}
+
 void BlackLevel::process(IPAContext &context,
 			 [[maybe_unused]] const uint32_t frame,
 			 IPAFrameContext &frameContext,
diff --git a/src/ipa/simple/algorithms/blc.h b/src/ipa/simple/algorithms/blc.h
index db9e6d639..a5592d087 100644
--- a/src/ipa/simple/algorithms/blc.h
+++ b/src/ipa/simple/algorithms/blc.h
@@ -24,6 +24,10 @@  public:
 
 	int init(IPAContext &context, const YamlObject &tuningData) override;
 	int configure(IPAContext &context, const IPAConfigInfo &configInfo) override;
+	void prepare(IPAContext &context,
+		     const uint32_t frame,
+		     IPAFrameContext &frameContext,
+		     DebayerParams *params) override;
 	void process(IPAContext &context, const uint32_t frame,
 		     IPAFrameContext &frameContext,
 		     const SwIspStats *stats,