[PATCH v2 9/9] ipa: rkisp1: agc: Implement ExposureValue control
Kieran Bingham
kieran.bingham at ideasonboard.com
Sun Apr 13 19:48:29 CEST 2025
Quoting Stefan Klug (2025-04-11 13:36:37)
> Now that agc_mean_luminance supports exposure correction, implement the
> corresponding ExposureValue control for rkisp1.
Definitely looking forward to the control initialisation and handling of
context/state somehow being managed by the agc_mean_luminence algorithm
directly sometime so that all of the users of agc_mean_luminence also
can support this control.
Should we already add this to IPU3 and Mali-C55 explicitly?
>
> Signed-off-by: Stefan Klug <stefan.klug at ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham 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