@@ -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;
@@ -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 {
@@ -201,6 +201,16 @@ int IPASoftSimple::configure(const IPAConfigInfo &configInfo)
(context_.configuration.agc.againMax -
context_.configuration.agc.againMin) /
100.0;
+ if (camHelper_->blackLevel().has_value()) {
+ /*
+ * The black level from camHelper_ is a 16 bit value, software ISP
+ * works with 8 bit pixel values, both regardless of the actual
+ * sensor pixel width. Hence we obtain the pixel-based black value
+ * by dividing the value from the helper by 256.
+ */
+ context_.configuration.black.level =
+ camHelper_->blackLevel().value() / 256;
+ }
} else {
/*
* The camera sensor gain (g) is usually not equal to the value written