[libcamera-devel,v5,24/33] ipa: rkisp1: filter: Store per-frame information in frame context
diff mbox series

Message ID 20220927023642.12341-25-laurent.pinchart@ideasonboard.com
State Accepted
Headers show
Series
  • ipa: Frame context queue, IPU3 & RkISP consolidation, and RkISP1 improvements
Related show

Commit Message

Laurent Pinchart Sept. 27, 2022, 2:36 a.m. UTC
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>
---
Changes since v4:

- Only update parameters when values have changed
---
 src/ipa/rkisp1/algorithms/filter.cpp | 49 +++++++++++++++++-----------
 src/ipa/rkisp1/ipa_context.cpp       | 18 ++++++++--
 src/ipa/rkisp1/ipa_context.h         |  7 +++-
 3 files changed, 51 insertions(+), 23 deletions(-)

Patch
diff mbox series

diff --git a/src/ipa/rkisp1/algorithms/filter.cpp b/src/ipa/rkisp1/algorithms/filter.cpp
index 837560eb20a6..4b89c05a52c4 100644
--- a/src/ipa/rkisp1/algorithms/filter.cpp
+++ b/src/ipa/rkisp1/algorithms/filter.cpp
@@ -44,15 +44,20 @@  static constexpr uint32_t kFiltModeDefault = 0x000004f2;
  */
 void Filter::queueRequest(IPAContext &context,
 			  [[maybe_unused]] const uint32_t frame,
-			  [[maybe_unused]] IPAFrameContext &frameContext,
+			  IPAFrameContext &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;
+		unsigned int value = std::round(std::clamp(*sharpness, 0.0f, 10.0f));
+
+		if (filter.sharpness != value) {
+			filter.sharpness = value;
+			update = true;
+		}
 
 		LOG(RkISP1Filter, Debug) << "Set sharpness to " << *sharpness;
 	}
@@ -63,42 +68,48 @@  void Filter::queueRequest(IPAContext &context,
 
 		switch (*denoise) {
 		case controls::draft::NoiseReductionModeOff:
-			filter.denoise = 0;
-			filter.updateParams = true;
+			if (filter.denoise != 0) {
+				filter.denoise = 0;
+				update = true;
+			}
 			break;
 		case controls::draft::NoiseReductionModeMinimal:
-			filter.denoise = 1;
-			filter.updateParams = true;
+			if (filter.denoise != 1) {
+				filter.denoise = 1;
+				update = true;
+			}
 			break;
 		case controls::draft::NoiseReductionModeHighQuality:
 		case controls::draft::NoiseReductionModeFast:
-			filter.denoise = 3;
-			filter.updateParams = true;
+			if (filter.denoise != 3) {
+				filter.denoise = 3;
+				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]] IPAFrameContext &frameContext,
-		     rkisp1_params_cfg *params)
+		     IPAFrameContext &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 +158,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 c7cd007b2428..4380634e272d 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 IPAFrameContext::filter
+ * \brief Filter parameters for this frame
+ *
+ * \struct IPAFrameContext::filter.denoise
+ * \brief Denoising level
+ *
+ * \var IPAFrameContext::filter.sharpness
+ * \brief Sharpness level
+ *
+ * \var IPAFrameContext::filter.updateParams
+ * \brief Indicates if the filter 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 81b632a15960..9a16dd6cf108 100644
--- a/src/ipa/rkisp1/ipa_context.h
+++ b/src/ipa/rkisp1/ipa_context.h
@@ -85,7 +85,6 @@  struct IPAActiveState {
 	struct {
 		uint8_t denoise;
 		uint8_t sharpness;
-		bool updateParams;
 	} filter;
 };
 
@@ -118,6 +117,12 @@  struct IPAFrameContext : public FrameContext {
 		bool update;
 	} dpf;
 
+	struct {
+		uint8_t denoise;
+		uint8_t sharpness;
+		bool update;
+	} filter;
+
 	struct {
 		uint32_t exposure;
 		double gain;