From 3b025c639f6d2b7d5d49e4e38feec7abc6e80344 Mon Sep 17 00:00:00 2001 From: Jacopo Mondi Date: Wed, 16 Oct 2024 17:20:43 +0200 Subject: ipa: rkisp1: Initialize FrameContext.agc.meteringMode 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 --- 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 17d074d9..dd7e9468 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(constraintModes().begin()->first); context.activeState.agc.exposureMode = static_cast(exposureModeHelpers().begin()->first); + + /* Use the metering matrix mode by default. */ context.activeState.agc.meteringMode = static_cast(meteringModes_.begin()->first); diff --git a/src/ipa/rkisp1/ipa_context.cpp b/src/ipa/rkisp1/ipa_context.cpp index 2dad42b3..e8860913 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(&activeState); + + agc.meteringMode = rkisp1ActiveState->agc.meteringMode; } /** -- cgit v1.2.1