summaryrefslogtreecommitdiff
path: root/src/ipa/rkisp1/algorithms
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2022-09-04 01:02:38 +0300
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2022-09-28 05:41:14 +0300
commitcb08adffe20631424f65a8c10340d4da464021e1 (patch)
treecec992fe2b25780131c160000c4dcc45e95b5c3a /src/ipa/rkisp1/algorithms
parent128f22bce55ba2baea082010bceaffdba23f3f0d (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.cpp51
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;