[v1,11/11] ipa: rkisp1: algorithms: dpf: publish DPF metadata
diff mbox series

Message ID 20251125000848.4103786-12-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
Implement process() and fillMetadata() to publish DPF status and current
configuration values in frame metadata. This allows applications to read
back the active DPF settings.

Metadata published every frame:
- DpfExposeIndex: Current index value computed from AGC gains
- DpfMode: Current mode (auto/manual)
- DpfChannelStrengths: Active R/G/B strength values

Developer mode metadata (when enabled):
- DpfGreenSpatialCoefficients: Green spatial filter coefficients
- DpfRedBlueSpatialCoefficients: RB spatial filter coefficients
- DpfRbFilterSize: RB filter size (9x9 or 13x9)
- DpfNoiseLevelLookupCoefficients: NLL coefficients
- DpfNoiseLevelLookupScaleMode: NLL scale mode (linear/log)

Signed-off-by: Rui Wang <rui.wang@ideasonboard.com>
---
 src/ipa/rkisp1/algorithms/denoise.h | 16 +++++++++
 src/ipa/rkisp1/algorithms/dpf.cpp   | 56 +++++++++++++++++++++++++++++
 src/ipa/rkisp1/algorithms/dpf.h     |  7 ++++
 3 files changed, 79 insertions(+)

Patch
diff mbox series

diff --git a/src/ipa/rkisp1/algorithms/denoise.h b/src/ipa/rkisp1/algorithms/denoise.h
index c532b7eb..a54e3c43 100644
--- a/src/ipa/rkisp1/algorithms/denoise.h
+++ b/src/ipa/rkisp1/algorithms/denoise.h
@@ -71,6 +71,10 @@  protected:
 	{
 	}
 	virtual ControlInfoMap::Map getControlMap() const;
+	virtual void fillMetadata(IPAContext &context,
+				  IPAFrameContext &frameContext,
+				  ControlList &metadata);
+
 private:
 	/**< Developer mode state for advanced controls */
 	bool devMode_ = false;
@@ -108,6 +112,18 @@  inline ControlInfoMap::Map DenoiseBaseAlgorithm::getControlMap() const
 	map[&controls::rkisp1::ExposureGainIndex] = ControlInfo(0, 6400, 0);
 	return map;
 }
+
+inline void DenoiseBaseAlgorithm::fillMetadata(IPAContext &context,
+					       IPAFrameContext &frameContext,
+					       ControlList &metadata)
+{
+	uint32_t exposureIndex = computeExposureIndex(context, frameContext);
+	metadata.set(controls::rkisp1::ExposureGainIndex, static_cast<int32_t>(exposureIndex));
+
+	auto currentMode = getRunningMode();
+	metadata.set(controls::rkisp1::DenoiseMode, currentMode);
+}
+
 } /* namespace ipa::rkisp1::algorithms */
 
 } /* namespace libcamera */
diff --git a/src/ipa/rkisp1/algorithms/dpf.cpp b/src/ipa/rkisp1/algorithms/dpf.cpp
index a3a8e789..b3880d41 100644
--- a/src/ipa/rkisp1/algorithms/dpf.cpp
+++ b/src/ipa/rkisp1/algorithms/dpf.cpp
@@ -911,6 +911,62 @@  void Dpf::prepareDisabledMode([[maybe_unused]] IPAContext &context,
 	str.setEnabled(false);
 }
 
+/**
+ * \copydoc libcamera::ipa::Algorithm::process
+ */
+void Dpf::process(IPAContext &context, const uint32_t frame [[maybe_unused]],
+		  IPAFrameContext &frameContext,
+		  const rkisp1_stat_buffer *stats [[maybe_unused]],
+		  ControlList &metadata)
+{
+	fillMetadata(context, frameContext, metadata);
+}
+
+void Dpf::fillMetadata(IPAContext &context,
+		       IPAFrameContext &frameContext,
+		       ControlList &metadata)
+{
+	DenoiseBaseAlgorithm::fillMetadata(context, frameContext, metadata);
+	/* Strength (R,G,B) - always available */
+	int32_t strength[3] = { (int32_t)strengthConfig_.r,
+				(int32_t)strengthConfig_.g,
+				(int32_t)strengthConfig_.b };
+	metadata.set(controls::rkisp1::DpfChannelStrengths,
+		     Span<const int32_t, 3>(strength));
+
+	if (!isDevMode())
+		return;
+
+	/* Advanced controls only in devmode */
+	/* Spatial kernels */
+	int32_t gCoeffs[RKISP1_CIF_ISP_DPF_MAX_SPATIAL_COEFFS];
+	int32_t rbCoeffs[RKISP1_CIF_ISP_DPF_MAX_SPATIAL_COEFFS];
+	for (uint32_t i = 0; i < RKISP1_CIF_ISP_DPF_MAX_SPATIAL_COEFFS; ++i) {
+		gCoeffs[i] = config_.g_flt.spatial_coeff[i];
+		rbCoeffs[i] = config_.rb_flt.spatial_coeff[i];
+	}
+	metadata.set(controls::rkisp1::DpfGreenSpatialCoefficients,
+		     Span<const int32_t,
+			  RKISP1_CIF_ISP_DPF_MAX_SPATIAL_COEFFS>(gCoeffs));
+	metadata.set(controls::rkisp1::DpfRedBlueSpatialCoefficients,
+		     Span<const int32_t,
+			  RKISP1_CIF_ISP_DPF_MAX_SPATIAL_COEFFS>(rbCoeffs));
+
+	/* RB filter size (0=9x9,1=13x9) */
+	int32_t fltSize = (config_.rb_flt.fltsize == RKISP1_CIF_ISP_DPF_RB_FILTERSIZE_13x9) ? 1 : 0;
+	metadata.set(controls::rkisp1::DpfRbFilterSize, fltSize);
+
+	/* NLL coefficients and scale */
+	int32_t nll[RKISP1_CIF_ISP_DPF_MAX_NLF_COEFFS];
+	for (uint32_t i = 0; i < RKISP1_CIF_ISP_DPF_MAX_NLF_COEFFS; ++i)
+		nll[i] = config_.nll.coeff[i];
+	metadata.set(controls::rkisp1::DpfNoiseLevelLookupCoefficients,
+		     Span<const int32_t,
+			  RKISP1_CIF_ISP_DPF_MAX_NLF_COEFFS>(nll));
+	int32_t scaleMode = (config_.nll.scale_mode == RKISP1_CIF_ISP_NLL_SCALE_LOGARITHMIC) ? 1 : 0;
+	metadata.set(controls::rkisp1::DpfNoiseLevelLookupScaleMode, scaleMode);
+}
+
 REGISTER_IPA_ALGORITHM(Dpf, "Dpf")
 
 } /* namespace ipa::rkisp1::algorithms */
diff --git a/src/ipa/rkisp1/algorithms/dpf.h b/src/ipa/rkisp1/algorithms/dpf.h
index e62882f2..64b80556 100644
--- a/src/ipa/rkisp1/algorithms/dpf.h
+++ b/src/ipa/rkisp1/algorithms/dpf.h
@@ -29,6 +29,10 @@  public:
 	void prepare(IPAContext &context, const uint32_t frame,
 		     IPAFrameContext &frameContext,
 		     RkISP1Params *params) override;
+	void process(IPAContext &context, const uint32_t frame [[maybe_unused]],
+		     IPAFrameContext &frameContext,
+		     const rkisp1_stat_buffer *stats [[maybe_unused]],
+		     ControlList &metadata) override;
 
 private:
 	struct rkisp1_cif_isp_dpf_config config_;
@@ -103,6 +107,9 @@  private:
 	void prepareEnabledMode(IPAContext &context, const uint32_t frame,
 				IPAFrameContext &frameContext, RkISP1Params *params) override;
 	ControlInfoMap::Map getControlMap() const override;
+	void fillMetadata(IPAContext &context,
+			  IPAFrameContext &frameContext,
+			  ControlList &metadata) override;
 };
 
 } /* namespace ipa::rkisp1::algorithms */