[PATCH v2 1/1] libcamera: software_isp: Get black level from the camera helper

Milan Zamazal mzamazal at redhat.com
Wed Oct 9 21:19:33 CEST 2024


The black level in software ISP is unconditionally guessed from the
obtained frames.  CameraSensorHelper optionally provides the black level
from camera specifications now.  Let's use the value if available.

If the black level is not available from the given CameraSensorHelper
instance, it's still determined on the fly.

Signed-off-by: Milan Zamazal <mzamazal at redhat.com>
---
 src/ipa/simple/algorithms/blc.cpp | 6 +++++-
 src/ipa/simple/ipa_context.h      | 4 ++++
 src/ipa/simple/soft_simple.cpp    | 3 +++
 3 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/src/ipa/simple/algorithms/blc.cpp b/src/ipa/simple/algorithms/blc.cpp
index b9f2aaa6d..a7af2e12c 100644
--- a/src/ipa/simple/algorithms/blc.cpp
+++ b/src/ipa/simple/algorithms/blc.cpp
@@ -24,7 +24,8 @@ BlackLevel::BlackLevel()
 int BlackLevel::configure(IPAContext &context,
 			  [[maybe_unused]] const IPAConfigInfo &configInfo)
 {
-	context.activeState.blc.level = 255;
+	context.activeState.blc.level =
+		context.configuration.black.level.value_or(255);
 	return 0;
 }
 
@@ -34,6 +35,9 @@ void BlackLevel::process(IPAContext &context,
 			 const SwIspStats *stats,
 			 [[maybe_unused]] ControlList &metadata)
 {
+	if (context.configuration.black.level.has_value())
+		return;
+
 	if (frameContext.sensor.exposure == exposure_ &&
 	    frameContext.sensor.gain == gain_) {
 		return;
diff --git a/src/ipa/simple/ipa_context.h b/src/ipa/simple/ipa_context.h
index 3519f20f6..fd121eebe 100644
--- a/src/ipa/simple/ipa_context.h
+++ b/src/ipa/simple/ipa_context.h
@@ -8,6 +8,7 @@
 #pragma once
 
 #include <array>
+#include <optional>
 #include <stdint.h>
 
 #include <libipa/fc_queue.h>
@@ -22,6 +23,9 @@ struct IPASessionConfiguration {
 		int32_t exposureMin, exposureMax;
 		double againMin, againMax, againMinStep;
 	} agc;
+	struct {
+		std::optional<uint8_t> level;
+	} black;
 };
 
 struct IPAActiveState {
diff --git a/src/ipa/simple/soft_simple.cpp b/src/ipa/simple/soft_simple.cpp
index b28c7039f..ad6334ff6 100644
--- a/src/ipa/simple/soft_simple.cpp
+++ b/src/ipa/simple/soft_simple.cpp
@@ -201,6 +201,9 @@ int IPASoftSimple::configure(const IPAConfigInfo &configInfo)
 			(context_.configuration.agc.againMax -
 			 context_.configuration.agc.againMin) /
 			100.0;
+		if (camHelper_->blackLevel().has_value())
+			context_.configuration.black.level =
+				camHelper_->blackLevel().value() / 256;
 	} else {
 		/*
 		 * The camera sensor gain (g) is usually not equal to the value written
-- 
2.44.1



More information about the libcamera-devel mailing list