[libcamera-devel] [PATCH v4 23/32] ipa: rkisp1: filter: Store per-frame information in frame context
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Thu Sep 8 03:41:51 CEST 2022
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