[PATCH 4/4] ipa: rkisp1: Initialize FrameContext.agc.meteringMode
Jacopo Mondi
jacopo.mondi at ideasonboard.com
Mon Oct 28 18:14:42 CET 2024
Hi Stefan
On Mon, Oct 28, 2024 at 05:47:28PM +0100, Stefan Klug wrote:
> Hi Jacopo,
>
> Thank you for the patch.
>
> On Wed, Oct 16, 2024 at 07:03:45PM +0200, Jacopo Mondi wrote:
> > The RkISP1 AGC algorithms assumes the metering mode to be
> > "MeteringMatrix" and pre-fill an array of weights associated
> > with it stored in meteringModes_[MeteringMatrix] when intializing
> > the algorithm in parseMeteringModes().
> >
> > It laters fetches the weights when computing parameters using the
> > FrameContext.agc.meteringMode as index of the meteringModes_ array.
> >
> > When a Request gets queued to the algorithm, the
> > FrameContext.agc.meteringMode index is populated from the algorithm's
> > active state, and optionally updated if the application has specified
> > a different metering mode.
> >
> > In case of Request underrun however, a non-initialized FrameContext
> > gets provided to the algorithm, causing an (unhandled) exception when
> > accessing the meteringModes_ array.
> >
> > Fix this by intializing the AGC metering mode to a supported value
> > coming from the ActiveState in IPAFrameContext::init().
> >
> > Signed-off-by: Jacopo Mondi <jacopo.mondi at ideasonboard.com>
> > ---
> > src/ipa/rkisp1/algorithms/agc.cpp | 2 ++
> > src/ipa/rkisp1/ipa_context.cpp | 5 +++++
> > 2 files changed, 7 insertions(+)
> >
> > diff --git a/src/ipa/rkisp1/algorithms/agc.cpp b/src/ipa/rkisp1/algorithms/agc.cpp
> > index 17d074d9c03e..dd7e9468741e 100644
> > --- a/src/ipa/rkisp1/algorithms/agc.cpp
> > +++ b/src/ipa/rkisp1/algorithms/agc.cpp
> > @@ -175,6 +175,8 @@ int Agc::configure(IPAContext &context, const IPACameraSensorInfo &configInfo)
> > static_cast<controls::AeConstraintModeEnum>(constraintModes().begin()->first);
> > context.activeState.agc.exposureMode =
> > static_cast<controls::AeExposureModeEnum>(exposureModeHelpers().begin()->first);
> > +
> > + /* Use the metering matrix mode by default. */
> > context.activeState.agc.meteringMode =
> > static_cast<controls::AeMeteringModeEnum>(meteringModes_.begin()->first);
> >
> > diff --git a/src/ipa/rkisp1/ipa_context.cpp b/src/ipa/rkisp1/ipa_context.cpp
> > index 2dad42b3154f..e88609137345 100644
> > --- a/src/ipa/rkisp1/ipa_context.cpp
> > +++ b/src/ipa/rkisp1/ipa_context.cpp
> > @@ -421,6 +421,11 @@ void IPAFrameContext::init(const uint32_t frameNum,
> > const ActiveState &activeState)
> > {
> > FrameContext::init(frameNum, activeState);
> > +
> > + const IPAActiveState *rkisp1ActiveState =
> > + reinterpret_cast<const IPAActiveState *>(&activeState);
> > +
> > + agc.meteringMode = rkisp1ActiveState->agc.meteringMode;
>
> I don't particularly like that the IPAFrameContext needs that knowledge
> which should be internal to the agc algorithm. We could add a
You know, my feeling was the opposite. Algorithms should make less
assumptions about their internals implementation details but rely on a
more globally shared state, kept in the FrameContext and the
ActiveState. This would make easy to "swap" algoroithms.
After all, this already shows the AGC algo depends on a precise
ordering of operations which if not respected results in a run-time
exception.
> initContext() function to the algorithm base class. But then we need to
> loop over all algorithms here, which doesn't feel efficient for a single
> case. But on the other hand if we assume that request underruns become
I considered that but it seemed rather non-efficient.
> more common, then the other algorithms need to be able to continue with
> current data without a prior queueRequest() call. While writing this,
Isn't the "current data" exactly the active state ?
> yes I think we should forward that to every algorithm. Otherwise we
> might end up with strange effects because the algorithms use the data
> from the frame context that was reused without proper initialization.
I might be missing how a FrameContext could be "reused" and "without
proper initialization". I understand a FrameContext might not
initialized, or not correctly re-initalized but if that happens is an
implementation issue, isn't it ?
>
> I hope it is somehow understandable.
Thank you!
j
>
> Cheers,
> Stefan
>
> > }
> >
> > /**
> > --
> > 2.47.0
> >
More information about the libcamera-devel
mailing list