[PATCH 9/9] ipa: rkisp1: agc: Implement ExposureValue control
Stefan Klug
stefan.klug at ideasonboard.com
Mon Mar 31 16:43:48 CEST 2025
Now that agc_mean_luminance supports exposure correction, implement the
corresponding ExposureValue control for rkisp1.
Signed-off-by: Stefan Klug <stefan.klug at ideasonboard.com>
---
src/ipa/rkisp1/algorithms/agc.cpp | 10 ++++++++++
src/ipa/rkisp1/ipa_context.h | 2 ++
2 files changed, 12 insertions(+)
diff --git a/src/ipa/rkisp1/algorithms/agc.cpp b/src/ipa/rkisp1/algorithms/agc.cpp
index b3ac9400b74f..8e77455e7afd 100644
--- a/src/ipa/rkisp1/algorithms/agc.cpp
+++ b/src/ipa/rkisp1/algorithms/agc.cpp
@@ -158,6 +158,7 @@ int Agc::init(IPAContext &context, const YamlObject &tuningData)
ControlValue(controls::AnalogueGainModeAuto));
/* \todo Move this to the Camera class */
context.ctrlMap[&controls::AeEnable] = ControlInfo(false, true, true);
+ context.ctrlMap[&controls::ExposureValue] = ControlInfo(-8.0f, 8.0f, 0.0f);
context.ctrlMap.merge(controls());
return 0;
@@ -180,6 +181,7 @@ int Agc::configure(IPAContext &context, const IPACameraSensorInfo &configInfo)
context.activeState.agc.manual.exposure = context.activeState.agc.automatic.exposure;
context.activeState.agc.autoExposureEnabled = !context.configuration.raw;
context.activeState.agc.autoGainEnabled = !context.configuration.raw;
+ context.activeState.agc.exposureValue = 0.0;
context.activeState.agc.constraintMode =
static_cast<controls::AeConstraintModeEnum>(constraintModes().begin()->first);
@@ -302,6 +304,11 @@ void Agc::queueRequest(IPAContext &context,
static_cast<controls::AeConstraintModeEnum>(*constraintMode);
frameContext.agc.constraintMode = agc.constraintMode;
+ const auto &exposureValue = controls.get(controls::ExposureValue);
+ if (exposureValue)
+ agc.exposureValue = *exposureValue;
+ frameContext.agc.exposureValue = agc.exposureValue;
+
const auto &frameDurationLimits = controls.get(controls::FrameDurationLimits);
if (frameDurationLimits) {
/* Limit the control value to the limits in ControlInfo */
@@ -408,6 +415,7 @@ void Agc::fillMetadata(IPAContext &context, IPAFrameContext &frameContext,
metadata.set(controls::AeMeteringMode, frameContext.agc.meteringMode);
metadata.set(controls::AeExposureMode, frameContext.agc.exposureMode);
metadata.set(controls::AeConstraintMode, frameContext.agc.constraintMode);
+ metadata.set(controls::ExposureValue, frameContext.agc.exposureValue);
}
/**
@@ -557,6 +565,8 @@ void Agc::process(IPAContext &context, [[maybe_unused]] const uint32_t frame,
double analogueGain = frameContext.sensor.gain;
utils::Duration effectiveExposureValue = exposureTime * analogueGain;
+ setExposureCompensation(pow(2.0, frameContext.agc.exposureValue));
+
utils::Duration newExposureTime;
double aGain, dGain;
std::tie(newExposureTime, aGain, dGain) =
diff --git a/src/ipa/rkisp1/ipa_context.h b/src/ipa/rkisp1/ipa_context.h
index f0d504215d34..7ccc7b501aff 100644
--- a/src/ipa/rkisp1/ipa_context.h
+++ b/src/ipa/rkisp1/ipa_context.h
@@ -81,6 +81,7 @@ struct IPAActiveState {
bool autoExposureEnabled;
bool autoGainEnabled;
+ double exposureValue;
controls::AeConstraintModeEnum constraintMode;
controls::AeExposureModeEnum exposureMode;
controls::AeMeteringModeEnum meteringMode;
@@ -129,6 +130,7 @@ struct IPAFrameContext : public FrameContext {
struct {
uint32_t exposure;
double gain;
+ double exposureValue;
uint32_t vblank;
bool autoExposureEnabled;
bool autoGainEnabled;
--
2.43.0
More information about the libcamera-devel
mailing list