From 16266def40cda947aaa1a50009e89f639c26e7cf Mon Sep 17 00:00:00 2001 From: Jean-Michel Hautbois Date: Thu, 19 Aug 2021 14:51:56 +0200 Subject: ipa: ipu3: convert AGC to the new algorithm interface In preparation for using the AGC through the new algorithm interfaces, convert the existing code to use the new function types. Now that the process call is rewritten, re-enable the compiler flag to warn when a function declaration hides virtual functions from a base class (-Woverloaded-virtual). We never use converged_ so remove its declaration. The controls may not need to be updated at each call, but it should be decided on the context side and not by a specific call by using a lock status in the Agc structure for instance. As the params_ local variable is not useful anymore, remove it here too. Signed-off-by: Jean-Michel Hautbois Reviewed-by: Kieran Bingham Reviewed-by: Laurent Pinchart --- src/ipa/ipu3/ipu3.cpp | 41 +++++++++++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 14 deletions(-) (limited to 'src/ipa/ipu3/ipu3.cpp') diff --git a/src/ipa/ipu3/ipu3.cpp b/src/ipa/ipu3/ipu3.cpp index 823df34b..2468e94a 100644 --- a/src/ipa/ipu3/ipu3.cpp +++ b/src/ipa/ipu3/ipu3.cpp @@ -92,6 +92,22 @@ * \brief BDS output size configured by the pipeline handler */ +/** + * \struct IPAFrameContext::agc + * \brief Context for the Automatic Gain Control algorithm + * + * The exposure and gain determined are expected to be applied to the sensor + * at the earliest opportunity. + * + * \var IPAFrameContext::agc::exposure + * \brief Exposure time expressed as a number of lines + * + * \var IPAFrameContext::agc::gain + * \brief Analogue gain multiplier + * + * The gain should be adapted to the sensor specific gain code before applying. + */ + /** * \struct IPAFrameContext::awb * \brief Context for the Automatic White Balance algorithm @@ -183,7 +199,6 @@ private: /* Local parameter storage */ struct IPAContext context_; - struct ipu3_uapi_params params_; }; /** @@ -361,8 +376,7 @@ int IPAIPU3::configure(const IPAConfigInfo &configInfo) defVBlank_ = itVBlank->second.def().get(); - /* Clean context and IPU3 parameters at configuration */ - params_ = {}; + /* Clean context at configuration */ context_ = {}; calculateBdsGrid(configInfo.bdsOutputSize); @@ -375,7 +389,7 @@ int IPAIPU3::configure(const IPAConfigInfo &configInfo) awbAlgo_ = std::make_unique(); agcAlgo_ = std::make_unique(); - agcAlgo_->initialise(context_.configuration.grid.bdsGrid, sensorInfo_); + agcAlgo_->configure(context_, configInfo); return 0; } @@ -450,12 +464,9 @@ void IPAIPU3::processControls([[maybe_unused]] unsigned int frame, void IPAIPU3::fillParams(unsigned int frame, ipu3_uapi_params *params) { for (auto const &algo : algorithms_) - algo->prepare(context_, ¶ms_); - - if (agcAlgo_->updateControls()) - awbAlgo_->prepare(context_, ¶ms_); + algo->prepare(context_, params); - *params = params_; + awbAlgo_->prepare(context_, params); IPU3Action op; op.op = ActionParamFilled; @@ -472,14 +483,16 @@ void IPAIPU3::parseStatistics(unsigned int frame, for (auto const &algo : algorithms_) algo->process(context_, stats); - double gain = camHelper_->gain(gain_); - agcAlgo_->process(stats, exposure_, gain); - gain_ = camHelper_->gainCode(gain); + /* \todo These fields should not be written by the IPAIPU3 layer */ + context_.frameContext.agc.gain = camHelper_->gain(gain_); + context_.frameContext.agc.exposure = exposure_; + agcAlgo_->process(context_, stats); + exposure_ = context_.frameContext.agc.exposure; + gain_ = camHelper_->gainCode(context_.frameContext.agc.gain); awbAlgo_->process(context_, stats); - if (agcAlgo_->updateControls()) - setControls(frame); + setControls(frame); /* \todo Use VBlank value calculated from each frame exposure. */ int64_t frameDuration = sensorInfo_.lineLength * (defVBlank_ + sensorInfo_.outputSize.height) / -- cgit v1.2.1