Message ID | 20220908014200.28728-24-laurent.pinchart@ideasonboard.com |
---|---|
State | Superseded |
Headers | show |
Series |
|
Related | show |
Quoting Laurent Pinchart via libcamera-devel (2022-09-08 02:41:51) > 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. > Looks good again. I like that the default case with the unsupported denoise value clearly leaves us such that we assign the most recent / activeState to the frame context, and mark that no update will occur. Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> > Signed-off-by: Laurent Pinchart <laurent.pinchart@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 >
Same question as the previous one and same assumption this is intentional Reviewed-by: Jacopo Mondi <jacopo@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@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 >
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;
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@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(-)