libcamera: software_isp: Add brightness control

Signed-off-by: Vasiliy Doylov <nekocwd@mainlining.org>
This commit is contained in:
Vasiliy Doylov 2025-02-23 23:03:48 +03:00
parent e0c8eb0913
commit 9613459d30
Signed by: NekoCWD
GPG key ID: B7BE22D44474A582
3 changed files with 38 additions and 0 deletions

View file

@ -41,6 +41,33 @@ Agc::Agc()
{ {
} }
int Agc::init(IPAContext &context,
[[maybe_unused]] const YamlObject &tuningData)
{
context.ctrlMap[&controls::Brightness] = ControlInfo(0.0f, 2.0f, 1.0f);
return 0;
}
int Agc::configure(IPAContext &context,
[[maybe_unused]] const IPAConfigInfo &configInfo)
{
context.activeState.knobs.brightness = std::optional<double>();
return 0;
}
void Agc::queueRequest(typename Module::Context &context,
[[maybe_unused]] const uint32_t frame,
[[maybe_unused]] typename Module::FrameContext &frameContext,
const ControlList &controls)
{
const auto &brightness = controls.get(controls::Brightness);
if (brightness.has_value()) {
context.activeState.knobs.brightness = brightness;
LOG(IPASoftExposure, Debug) << "Setting brightness to " << brightness.value();
}
}
void Agc::updateExposure(IPAContext &context, IPAFrameContext &frameContext, double exposureMSV) void Agc::updateExposure(IPAContext &context, IPAFrameContext &frameContext, double exposureMSV)
{ {
/* /*
@ -54,6 +81,8 @@ void Agc::updateExposure(IPAContext &context, IPAFrameContext &frameContext, dou
double next; double next;
int32_t &exposure = frameContext.sensor.exposure; int32_t &exposure = frameContext.sensor.exposure;
double &again = frameContext.sensor.gain; double &again = frameContext.sensor.gain;
const auto brightness = context.activeState.knobs.brightness.value_or(1.0);
exposureMSV /= brightness;
if (exposureMSV < kExposureOptimal - kExposureSatisfactory) { if (exposureMSV < kExposureOptimal - kExposureSatisfactory) {
next = exposure * kExpNumeratorUp / kExpDenominator; next = exposure * kExpNumeratorUp / kExpDenominator;

View file

@ -19,6 +19,13 @@ public:
Agc(); Agc();
~Agc() = default; ~Agc() = default;
int init(IPAContext &context, const YamlObject &tuningData) override;
int configure(IPAContext &context, const IPAConfigInfo &configInfo) override;
void queueRequest(typename Module::Context &context,
const uint32_t frame,
typename Module::FrameContext &frameContext,
const ControlList &controls)
override;
void process(IPAContext &context, const uint32_t frame, void process(IPAContext &context, const uint32_t frame,
IPAFrameContext &frameContext, IPAFrameContext &frameContext,
const SwIspStats *stats, const SwIspStats *stats,

View file

@ -64,6 +64,8 @@ struct IPAActiveState {
/* 0..2 range, 1.0 = normal */ /* 0..2 range, 1.0 = normal */
std::optional<double> contrast; std::optional<double> contrast;
std::optional<float> saturation; std::optional<float> saturation;
/* 0..2 range, 1.0 = normal */
std::optional<double> brightness;
} knobs; } knobs;
}; };