[v1,04/11] ipa: rkisp1: algorithms: Add reduction mode support to DPF
diff mbox series

Message ID 20251125000848.4103786-5-rui.wang@ideasonboard.com
State New
Headers show
Series
  • ipa: rkisp1: DPF refactor and tuning improvements
Related show

Commit Message

Rui Wang Nov. 25, 2025, 12:08 a.m. UTC
- Introduce DenoiseMode enum in DenoiseBaseAlgorithm with values: Auto, Manual, Reduction, Disabled
- Add virtual getRunningMode() and setRunningMode() methods to the base class
- Implement handleReductionModeControl() in Dpf class to process draft::NoiseReductionMode controls
- Map control values to ReductionMode enum (Off, Minimal, HighQuality, Fast, ZSL)
- Add currentReductionMode_ member to track the active reduction mode
- Set running mode to controls::rkisp1::DenoiseModeReduction when reduction mode is engaged

Signed-off-by: Rui Wang <rui.wang@ideasonboard.com>
---
 src/ipa/rkisp1/algorithms/denoise.h | 10 ++++
 src/ipa/rkisp1/algorithms/dpf.cpp   | 85 +++++++++++++++++++----------
 src/ipa/rkisp1/algorithms/dpf.h     |  6 ++
 3 files changed, 71 insertions(+), 30 deletions(-)

Patch
diff mbox series

diff --git a/src/ipa/rkisp1/algorithms/denoise.h b/src/ipa/rkisp1/algorithms/denoise.h
index abd08cba..660f648b 100644
--- a/src/ipa/rkisp1/algorithms/denoise.h
+++ b/src/ipa/rkisp1/algorithms/denoise.h
@@ -31,10 +31,20 @@  protected:
 	{
 		return true;
 	}
+	virtual void handleReductionModeControl([[maybe_unused]] const ControlList &controls,
+						[[maybe_unused]] IPAFrameContext &frameContext,
+						[[maybe_unused]] IPAContext &context,
+						[[maybe_unused]] uint32_t frame)
+	{
+	}
+	virtual int32_t getRunningMode() const { return currentRunMode_; }
+	virtual void setRunningMode(int32_t mode) { currentRunMode_ = mode; }
 
 private:
 	/**< Developer mode state for advanced controls */
 	bool devMode_ = false;
+	/**< Current denoise running mode */
+	int32_t currentRunMode_ = controls::rkisp1::DenoiseModeDisabled;
 };
 
 inline unsigned DenoiseBaseAlgorithm::computeExposureIndex(const IPAContext &context,
diff --git a/src/ipa/rkisp1/algorithms/dpf.cpp b/src/ipa/rkisp1/algorithms/dpf.cpp
index dc0a361c..c006fb5c 100644
--- a/src/ipa/rkisp1/algorithms/dpf.cpp
+++ b/src/ipa/rkisp1/algorithms/dpf.cpp
@@ -309,6 +309,55 @@  bool Dpf::parseSingleConfig(const YamlObject &tuningData,
 	return true;
 }
 
+void Dpf::handleReductionModeControl(const ControlList &controls,
+				     IPAFrameContext &frameContext,
+				     IPAContext &context,
+				     [[maybe_unused]] uint32_t frame)
+{
+	auto &dpf = context.activeState.dpf;
+	const auto &denoise = controls.get(controls::draft::NoiseReductionMode);
+	if (!denoise) {
+		frameContext.dpf.denoise = dpf.denoise;
+		return;
+	}
+	LOG(RkISP1Dpf, Debug) << "Set denoise mode to " << *denoise;
+
+	const auto requestedMode = static_cast<int32_t>(*denoise);
+	if (requestedMode == currentReductionMode_) {
+		frameContext.dpf.denoise = dpf.denoise;
+		return;
+	}
+
+	currentReductionMode_ = requestedMode;
+	if (requestedMode == controls::draft::NoiseReductionModeOff) {
+		dpf.denoise = false;
+		frameContext.dpf.denoise = false;
+		return;
+	}
+
+	dpf.denoise = true;
+	frameContext.dpf.denoise = true;
+	frameContext.dpf.update = true;
+}
+void Dpf::loadReductionModeConfig(IPAFrameContext &frameContext)
+{
+	/* Find mode config */
+	auto it = std::find_if(modes_.begin(), modes_.end(),
+			       [this](const ModeConfig &mode) {
+				       return mode.modeValue == currentReductionMode_;
+			       });
+	if (it == modes_.end()) {
+		LOG(RkISP1Dpf, Warning)
+			<< "No DPF config for reduction mode "
+			<< static_cast<int>(currentReductionMode_);
+		return;
+	}
+
+	/* Apply mode config */
+	config_ = it->dpf;
+	strengthConfig_ = it->strength;
+	frameContext.dpf.update = true;
+}
 /**
  * \copydoc libcamera::ipa::Algorithm::queueRequest
  */
@@ -317,38 +366,14 @@  void Dpf::queueRequest(IPAContext &context,
 		       IPAFrameContext &frameContext,
 		       const ControlList &controls)
 {
-	auto &dpf = context.activeState.dpf;
-	bool update = false;
+	frameContext.dpf.update = false;
+	auto currentRunnungMode = getRunningMode();
+	handleReductionModeControl(controls, frameContext, context, frame);
 
-	const auto &denoise = controls.get(controls::draft::NoiseReductionMode);
-	if (denoise) {
-		LOG(RkISP1Dpf, Debug) << "Set denoise to " << *denoise;
-
-		switch (*denoise) {
-		case controls::draft::NoiseReductionModeOff:
-			if (dpf.denoise) {
-				dpf.denoise = false;
-				update = true;
-			}
-			break;
-		case controls::draft::NoiseReductionModeMinimal:
-		case controls::draft::NoiseReductionModeHighQuality:
-		case controls::draft::NoiseReductionModeFast:
-			if (!dpf.denoise) {
-				dpf.denoise = true;
-				update = true;
-			}
-			break;
-		default:
-			LOG(RkISP1Dpf, Error)
-				<< "Unsupported denoise value "
-				<< *denoise;
-			break;
-		}
+	if (currentRunnungMode == controls::rkisp1::DenoiseModeReduction && currentReductionMode_ != controls::draft::NoiseReductionModeOff) {
+		loadReductionModeConfig(frameContext);
+		return;
 	}
-
-	frameContext.dpf.denoise = dpf.denoise;
-	frameContext.dpf.update = update;
 }
 
 /**
diff --git a/src/ipa/rkisp1/algorithms/dpf.h b/src/ipa/rkisp1/algorithms/dpf.h
index 8691932d..928e79d9 100644
--- a/src/ipa/rkisp1/algorithms/dpf.h
+++ b/src/ipa/rkisp1/algorithms/dpf.h
@@ -49,7 +49,13 @@  private:
 	std::vector<ExposureIndexLevelConfig> exposureIndexLevels_;
 	std::vector<ModeConfig> modes_;
 	bool useExposureIndexLevels_ = false;
+	int32_t currentReductionMode_ = controls::draft::NoiseReductionModeOff;
 
+	void handleReductionModeControl(const ControlList &controls,
+					IPAFrameContext &frameContext,
+					IPAContext &context,
+					uint32_t frame) override;
+	void loadReductionModeConfig(IPAFrameContext &frameContext);
 	bool parseConfig(const YamlObject &tuningData) override;
 	bool parseSingleConfig(const YamlObject &tuningData,
 			       rkisp1_cif_isp_dpf_config &config,