[PATCH 9/9] ipa: rkisp1: agc: Implement ExposureValue control
Stefan Klug
stefan.klug at ideasonboard.com
Fri Apr 11 12:42:33 CEST 2025
Hi Kieran,
Thank you for the review.
On Mon, Mar 31, 2025 at 05:50:54PM +0100, Kieran Bingham wrote:
> Quoting Stefan Klug (2025-03-31 15:43:48)
> > Now that agc_mean_luminance supports exposure correction, implement the
> > corresponding ExposureValue control for rkisp1.
>
> Oh, that's an exciting development ...
>
> > 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));
> > +
>
> while the patch overall sounds and looks pretty good - I'm not sure I've
> seen setExposureCompensation() added to the helpers yet - so perhaps
> this patch is supposed to be on a different series?
setExposureCompensation() was added in the patch before. It works
because the algorithm is derived from AgcMeanLuminance.
Best regards,
Stefan
>
> --
> Kieran
>
>
> > 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