diff options
author | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2022-09-04 01:02:38 +0300 |
---|---|---|
committer | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2022-09-28 05:41:14 +0300 |
commit | cb08adffe20631424f65a8c10340d4da464021e1 (patch) | |
tree | cec992fe2b25780131c160000c4dcc45e95b5c3a /src/ipa/rkisp1/algorithms | |
parent | 128f22bce55ba2baea082010bceaffdba23f3f0d (diff) |
ipa: rkisp1: cproc: Store per-frame information in frame context
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>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
Diffstat (limited to 'src/ipa/rkisp1/algorithms')
-rw-r--r-- | src/ipa/rkisp1/algorithms/cproc.cpp | 51 |
1 files changed, 31 insertions, 20 deletions
diff --git a/src/ipa/rkisp1/algorithms/cproc.cpp b/src/ipa/rkisp1/algorithms/cproc.cpp index ea819b2a..eaa56c37 100644 --- a/src/ipa/rkisp1/algorithms/cproc.cpp +++ b/src/ipa/rkisp1/algorithms/cproc.cpp @@ -38,55 +38,66 @@ LOG_DEFINE_CATEGORY(RkISP1CProc) */ void ColorProcessing::queueRequest(IPAContext &context, [[maybe_unused]] const uint32_t frame, - [[maybe_unused]] IPAFrameContext &frameContext, + IPAFrameContext &frameContext, const ControlList &controls) { auto &cproc = context.activeState.cproc; + bool update = false; const auto &brightness = controls.get(controls::Brightness); if (brightness) { - cproc.brightness = std::clamp<int>(std::lround(*brightness * 128), -128, 127); - cproc.updateParams = true; + int value = std::clamp<int>(std::lround(*brightness * 128), -128, 127); + if (cproc.brightness != value) { + cproc.brightness = value; + update = true; + } - LOG(RkISP1CProc, Debug) << "Set brightness to " << *brightness; + LOG(RkISP1CProc, Debug) << "Set brightness to " << value; } const auto &contrast = controls.get(controls::Contrast); if (contrast) { - cproc.contrast = std::clamp<int>(std::lround(*contrast * 128), 0, 255); - cproc.updateParams = true; + int value = std::clamp<int>(std::lround(*contrast * 128), 0, 255); + if (cproc.contrast != value) { + cproc.contrast = value; + update = true; + } - LOG(RkISP1CProc, Debug) << "Set contrast to " << *contrast; + LOG(RkISP1CProc, Debug) << "Set contrast to " << value; } const auto saturation = controls.get(controls::Saturation); if (saturation) { - cproc.saturation = std::clamp<int>(std::lround(*saturation * 128), 0, 255); - cproc.updateParams = true; + int value = std::clamp<int>(std::lround(*saturation * 128), 0, 255); + if (cproc.saturation != value) { + cproc.saturation = value; + update = true; + } - LOG(RkISP1CProc, Debug) << "Set saturation to " << *saturation; + LOG(RkISP1CProc, Debug) << "Set saturation to " << value; } + + frameContext.cproc.brightness = cproc.brightness; + frameContext.cproc.contrast = cproc.contrast; + frameContext.cproc.saturation = cproc.saturation; + frameContext.cproc.update = update; } /** * \copydoc libcamera::ipa::Algorithm::prepare */ -void ColorProcessing::prepare(IPAContext &context, +void ColorProcessing::prepare([[maybe_unused]] IPAContext &context, [[maybe_unused]] const uint32_t frame, - [[maybe_unused]] IPAFrameContext &frameContext, + IPAFrameContext &frameContext, rkisp1_params_cfg *params) { - auto &cproc = context.activeState.cproc; - /* Check if the algorithm configuration has been updated. */ - if (!cproc.updateParams) + if (!frameContext.cproc.update) return; - cproc.updateParams = false; - - params->others.cproc_config.brightness = cproc.brightness; - params->others.cproc_config.contrast = cproc.contrast; - params->others.cproc_config.sat = cproc.saturation; + params->others.cproc_config.brightness = frameContext.cproc.brightness; + params->others.cproc_config.contrast = frameContext.cproc.contrast; + params->others.cproc_config.sat = frameContext.cproc.saturation; params->module_en_update |= RKISP1_CIF_ISP_MODULE_CPROC; params->module_ens |= RKISP1_CIF_ISP_MODULE_CPROC; |