[libcamera-devel] [PATCH v4 23/32] ipa: rkisp1: filter: Store per-frame information in frame context
Jacopo Mondi
jacopo at jmondi.org
Wed Sep 21 22:45:59 CEST 2022
Same question as the previous one and same assumption this is
intentional
Reviewed-by: Jacopo Mondi <jacopo at jmondi.org>
On Thu, Sep 08, 2022 at 04:41:51AM +0300, Laurent Pinchart via libcamera-devel wrote:
> Rework the algorithm's usage of the active state, to store the value of
> controls for the last queued request in the queueRequest() function, and
> store a copy of the values in the corresponding frame context. The
> latter is used in the prepare() function to populate the ISP parameters
> with values corresponding to the right frame.
>
> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> ---
> src/ipa/rkisp1/algorithms/filter.cpp | 30 +++++++++++++++-------------
> src/ipa/rkisp1/ipa_context.cpp | 18 ++++++++++++++---
> src/ipa/rkisp1/ipa_context.h | 7 ++++++-
> 3 files changed, 37 insertions(+), 18 deletions(-)
>
> diff --git a/src/ipa/rkisp1/algorithms/filter.cpp b/src/ipa/rkisp1/algorithms/filter.cpp
> index e64bd6a6d68f..ac743729e247 100644
> --- a/src/ipa/rkisp1/algorithms/filter.cpp
> +++ b/src/ipa/rkisp1/algorithms/filter.cpp
> @@ -44,15 +44,16 @@ static constexpr uint32_t kFiltModeDefault = 0x000004f2;
> */
> void Filter::queueRequest(IPAContext &context,
> [[maybe_unused]] const uint32_t frame,
> - [[maybe_unused]] RkISP1FrameContext &frameContext,
> + RkISP1FrameContext &frameContext,
> const ControlList &controls)
> {
> auto &filter = context.activeState.filter;
> + bool update = false;
>
> const auto &sharpness = controls.get(controls::Sharpness);
> if (sharpness) {
> filter.sharpness = std::round(std::clamp(*sharpness, 0.0f, 10.0f));
> - filter.updateParams = true;
> + update = true;
>
> LOG(RkISP1Filter, Debug) << "Set sharpness to " << *sharpness;
> }
> @@ -64,41 +65,42 @@ void Filter::queueRequest(IPAContext &context,
> switch (*denoise) {
> case controls::draft::NoiseReductionModeOff:
> filter.denoise = 0;
> - filter.updateParams = true;
> + update = true;
> break;
> case controls::draft::NoiseReductionModeMinimal:
> filter.denoise = 1;
> - filter.updateParams = true;
> + update = true;
> break;
> case controls::draft::NoiseReductionModeHighQuality:
> case controls::draft::NoiseReductionModeFast:
> filter.denoise = 3;
> - filter.updateParams = true;
> + update = true;
> break;
> default:
> LOG(RkISP1Filter, Error)
> << "Unsupported denoise value "
> << *denoise;
> + break;
> }
> }
> +
> + frameContext.filter.denoise = filter.denoise;
> + frameContext.filter.sharpness = filter.sharpness;
> + frameContext.filter.update = update;
> }
>
> /**
> * \copydoc libcamera::ipa::Algorithm::prepare
> */
> -void Filter::prepare(IPAContext &context,
> +void Filter::prepare([[maybe_unused]] IPAContext &context,
> [[maybe_unused]] const uint32_t frame,
> - [[maybe_unused]] RkISP1FrameContext &frameContext,
> + RkISP1FrameContext &frameContext,
> rkisp1_params_cfg *params)
> {
> - auto &filter = context.activeState.filter;
> -
> /* Check if the algorithm configuration has been updated. */
> - if (!filter.updateParams)
> + if (!frameContext.filter.update)
> return;
>
> - filter.updateParams = false;
> -
> static constexpr uint16_t filt_fac_sh0[] = {
> 0x04, 0x07, 0x0a, 0x0c, 0x10, 0x14, 0x1a, 0x1e, 0x24, 0x2a, 0x30
> };
> @@ -147,8 +149,8 @@ void Filter::prepare(IPAContext &context,
> 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3
> };
>
> - uint8_t denoise = filter.denoise;
> - uint8_t sharpness = filter.sharpness;
> + uint8_t denoise = frameContext.filter.denoise;
> + uint8_t sharpness = frameContext.filter.sharpness;
> auto &flt_config = params->others.flt_config;
>
> flt_config.fac_sh0 = filt_fac_sh0[sharpness];
> diff --git a/src/ipa/rkisp1/ipa_context.cpp b/src/ipa/rkisp1/ipa_context.cpp
> index b0210a978559..b2628ef73d49 100644
> --- a/src/ipa/rkisp1/ipa_context.cpp
> +++ b/src/ipa/rkisp1/ipa_context.cpp
> @@ -179,9 +179,6 @@ namespace libcamera::ipa::rkisp1 {
> *
> * \var IPAActiveState::filter.sharpness
> * \brief Sharpness level
> - *
> - * \var IPAActiveState::filter.updateParams
> - * \brief Indicates if ISP parameters need to be updated
> */
>
> /**
> @@ -260,6 +257,21 @@ namespace libcamera::ipa::rkisp1 {
> * compared to the previous frame
> */
>
> +/**
> + * \var RkISP1FrameContext::filter
> + * \brief Filter parameters for this frame
> + *
> + * \struct RkISP1FrameContext::filter.denoise
> + * \brief Denoising level
> + *
> + * \var RkISP1FrameContext::filter.sharpness
> + * \brief Sharpness level
> + *
> + * \var RkISP1FrameContext::filter.updateParams
> + * \brief Indicates if the filter parameters have been updated compared to the
> + * previous frame
> + */
> +
> /**
> * \var RkISP1FrameContext::sensor
> * \brief Sensor configuration that used been used for this frame
> diff --git a/src/ipa/rkisp1/ipa_context.h b/src/ipa/rkisp1/ipa_context.h
> index c22e1f099c23..c15b908afcc8 100644
> --- a/src/ipa/rkisp1/ipa_context.h
> +++ b/src/ipa/rkisp1/ipa_context.h
> @@ -84,7 +84,6 @@ struct IPAActiveState {
> struct {
> uint8_t denoise;
> uint8_t sharpness;
> - bool updateParams;
> } filter;
> };
>
> @@ -117,6 +116,12 @@ struct RkISP1FrameContext : public FrameContext {
> bool update;
> } dpf;
>
> + struct {
> + uint8_t denoise;
> + uint8_t sharpness;
> + bool update;
> + } filter;
> +
> struct {
> uint32_t exposure;
> double gain;
> --
> Regards,
>
> Laurent Pinchart
>
More information about the libcamera-devel
mailing list