diff --git a/src/ipa/simple/algorithms/agc.cpp b/src/ipa/simple/algorithms/agc.cpp index de20863d8..35f4798cf 100644 --- a/src/ipa/simple/algorithms/agc.cpp +++ b/src/ipa/simple/algorithms/agc.cpp @@ -46,6 +46,8 @@ int Agc::init(IPAContext &context, { context.ctrlMap[&controls::AeEnable] = ControlInfo(false, true, true); context.ctrlMap[&controls::Brightness] = ControlInfo(0.0f, 2.0f, 1.0f); + context.ctrlMap[&controls::ExposureValue] = ControlInfo(0.0f, 0.5f, 1.0f); + return 0; } @@ -65,6 +67,7 @@ void Agc::queueRequest(typename Module::Context &context, { const auto &brightness = controls.get(controls::Brightness); const auto &ae_enabled = controls.get(controls::AeEnable); + const auto &exposure_value = controls.get(controls::ExposureValue); if (brightness.has_value()) { context.activeState.knobs.brightness = brightness; LOG(IPASoftExposure, Debug) << "Setting brightness to " << brightness.value(); @@ -73,6 +76,10 @@ void Agc::queueRequest(typename Module::Context &context, context.activeState.knobs.ae_enabled = ae_enabled; LOG(IPASoftExposure, Debug) << "Setting ae_enable to " << ae_enabled.value(); } + if (exposure_value.has_value()) { + context.activeState.knobs.exposure_value = exposure_value.value(); + LOG(IPASoftExposure, Debug) << "Setting exposure value to " << exposure_value.value(); + } } void Agc::updateExposure(IPAContext &context, IPAFrameContext &frameContext, double exposureMSV) @@ -140,13 +147,16 @@ void Agc::process(IPAContext &context, ControlList &metadata) { const auto ae_enable = context.activeState.knobs.ae_enabled.value_or(true); - if (!ae_enable) - return; + if (!ae_enable) + frameContext.sensor.exposure = (int32_t)( context.activeState.knobs.exposure_value.value_or(0.5) * (context.configuration.agc.exposureMax - context.configuration.agc.exposureMin)); utils::Duration exposureTime = context.configuration.agc.lineDuration * frameContext.sensor.exposure; metadata.set(controls::ExposureTime, exposureTime.get()); metadata.set(controls::AnalogueGain, frameContext.sensor.gain); + LOG(IPASoftExposure, Debug) << "Setting exposure value to " << frameContext.sensor.exposure; + if (!ae_enable) + return; /* * Calculate Mean Sample Value (MSV) according to formula from: diff --git a/src/ipa/simple/ipa_context.h b/src/ipa/simple/ipa_context.h index 71b9bb637..c5b5527b5 100644 --- a/src/ipa/simple/ipa_context.h +++ b/src/ipa/simple/ipa_context.h @@ -71,6 +71,8 @@ struct IPAActiveState { std::optional brightness; /* 0..1 range, 1 = normal */ std::optional ae_enabled; + /* 0..1 range, 0.5 = normal */ + std::optional exposure_value; /* 0..100 range, 50.0 = normal */ std::optional focus_pos; } knobs;