@@ -321,38 +321,60 @@ void Dpf::prepare(IPAContext &context, const uint32_t frame,
if (!frameContext.dpf.update && frame > 0)
return;
+ if (!frameContext.dpf.denoise) {
+ prepareDisabledMode(context, frame, frameContext, params);
+ return;
+ }
+
+ prepareEnabledMode(context, frame, frameContext, params);
+}
+
+void Dpf::prepareDisabledMode([[maybe_unused]] IPAContext &context,
+ [[maybe_unused]] const uint32_t frame,
+ [[maybe_unused]] IPAFrameContext &frameContext,
+ RkISP1Params *params)
+{
+ auto dpfConfig = params->block<BlockType::Dpf>();
+ dpfConfig.setEnabled(false);
+ auto dpfStrength = params->block<BlockType::DpfStrength>();
+ dpfStrength.setEnabled(false);
+}
+
+void Dpf::prepareEnabledMode(IPAContext &context, [[maybe_unused]] const uint32_t frame,
+ [[maybe_unused]] IPAFrameContext &frameContext,
+ RkISP1Params *params)
+{
auto config = params->block<BlockType::Dpf>();
- config.setEnabled(frameContext.dpf.denoise);
+ config.setEnabled(true);
+ *config = config_;
+
+ const auto &awb = context.configuration.awb;
+ const auto &lsc = context.configuration.lsc;
+
+ auto &mode = config->gain.mode;
+
+ /*
+ * The DPF needs to take into account the total amount of
+ * digital gain, which comes from the AWB and LSC modules. The
+ * DPF hardware can be programmed with a digital gain value
+ * manually, but can also use the gains supplied by the AWB and
+ * LSC modules automatically when they are enabled. Use that
+ * mode of operation as it simplifies control of the DPF.
+ */
+ if (awb.enabled && lsc.enabled)
+ mode = RKISP1_CIF_ISP_DPF_GAIN_USAGE_AWB_LSC_GAINS;
+ else if (awb.enabled)
+ mode = RKISP1_CIF_ISP_DPF_GAIN_USAGE_AWB_GAINS;
+ else if (lsc.enabled)
+ mode = RKISP1_CIF_ISP_DPF_GAIN_USAGE_LSC_GAINS;
+ else
+ mode = RKISP1_CIF_ISP_DPF_GAIN_USAGE_DISABLED;
+
+ config_.gain.mode = mode;
auto strengthConfig = params->block<BlockType::DpfStrength>();
- strengthConfig.setEnabled(frameContext.dpf.denoise);
-
- if (frameContext.dpf.denoise) {
- *config = config_;
- *strengthConfig = strengthConfig_;
-
- const auto &awb = context.configuration.awb;
- const auto &lsc = context.configuration.lsc;
-
- auto &mode = config->gain.mode;
-
- /*
- * The DPF needs to take into account the total amount of
- * digital gain, which comes from the AWB and LSC modules. The
- * DPF hardware can be programmed with a digital gain value
- * manually, but can also use the gains supplied by the AWB and
- * LSC modules automatically when they are enabled. Use that
- * mode of operation as it simplifies control of the DPF.
- */
- if (awb.enabled && lsc.enabled)
- mode = RKISP1_CIF_ISP_DPF_GAIN_USAGE_AWB_LSC_GAINS;
- else if (awb.enabled)
- mode = RKISP1_CIF_ISP_DPF_GAIN_USAGE_AWB_GAINS;
- else if (lsc.enabled)
- mode = RKISP1_CIF_ISP_DPF_GAIN_USAGE_LSC_GAINS;
- else
- mode = RKISP1_CIF_ISP_DPF_GAIN_USAGE_DISABLED;
- }
+ strengthConfig.setEnabled(true);
+ *strengthConfig = strengthConfig_;
}
REGISTER_IPA_ALGORITHM(Dpf, "Dpf")
@@ -44,6 +44,13 @@ private:
bool loadReductionConfig(int32_t mode);
+ void prepareDisabledMode(IPAContext &context, const uint32_t frame,
+ IPAFrameContext &frameContext,
+ RkISP1Params *params);
+ void prepareEnabledMode(IPAContext &context, const uint32_t frame,
+ IPAFrameContext &frameContext,
+ RkISP1Params *params);
+
struct rkisp1_cif_isp_dpf_config config_;
struct rkisp1_cif_isp_dpf_strength_config strengthConfig_;
std::vector<ModeConfig> noiseReductionModes_;