summaryrefslogtreecommitdiff
path: root/src/ipa
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
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')
-rw-r--r--src/ipa/rkisp1/algorithms/cproc.cpp51
-rw-r--r--src/ipa/rkisp1/ipa_context.cpp21
-rw-r--r--src/ipa/rkisp1/ipa_context.h8
3 files changed, 56 insertions, 24 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;
diff --git a/src/ipa/rkisp1/ipa_context.cpp b/src/ipa/rkisp1/ipa_context.cpp
index ba80a070..fdc8e7df 100644
--- a/src/ipa/rkisp1/ipa_context.cpp
+++ b/src/ipa/rkisp1/ipa_context.cpp
@@ -160,9 +160,6 @@ namespace libcamera::ipa::rkisp1 {
*
* \var IPAActiveState::cproc.saturation
* \brief Saturation level
- *
- * \var IPAActiveState::cproc.updateParams
- * \brief Indicates if ISP parameters need to be updated
*/
/**
@@ -237,6 +234,24 @@ namespace libcamera::ipa::rkisp1 {
*/
/**
+ * \var IPAFrameContext::cproc
+ * \brief Color Processing parameters for this frame
+ *
+ * \struct IPAFrameContext::cproc.brightness
+ * \brief Brightness level
+ *
+ * \var IPAFrameContext::cproc.contrast
+ * \brief Contrast level
+ *
+ * \var IPAFrameContext::cproc.saturation
+ * \brief Saturation level
+ *
+ * \var IPAFrameContext::cproc.update
+ * \brief Indicates if the color processing parameters have been updated
+ * compared to the previous frame
+ */
+
+/**
* \var IPAFrameContext::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 5494a68f..d0929bfe 100644
--- a/src/ipa/rkisp1/ipa_context.h
+++ b/src/ipa/rkisp1/ipa_context.h
@@ -75,7 +75,6 @@ struct IPAActiveState {
int8_t brightness;
uint8_t contrast;
uint8_t saturation;
- bool updateParams;
} cproc;
struct {
@@ -108,6 +107,13 @@ struct IPAFrameContext : public FrameContext {
} awb;
struct {
+ int8_t brightness;
+ uint8_t contrast;
+ uint8_t saturation;
+ bool update;
+ } cproc;
+
+ struct {
uint32_t exposure;
double gain;
} sensor;