From patchwork Mon Dec 8 00:48:03 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rui Wang X-Patchwork-Id: 25380 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 7ABB1C3257 for ; Mon, 8 Dec 2025 00:48:42 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 33CD9613EB; Mon, 8 Dec 2025 01:48:42 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="s3YZmAl7"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 73B43611BA for ; Mon, 8 Dec 2025 01:48:40 +0100 (CET) Received: from localhost.localdomain (unknown [209.216.103.65]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id EAFD11E29; Mon, 8 Dec 2025 01:46:21 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1765154782; bh=XAh7xLbe/PVjNDq6z2lc7ofo54bT7w+cSFt8kaCSfy8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=s3YZmAl7+cfWTy1F4fQpxK1DbzNsmZKz3dKxKLEBH1iVzT5tTZ/7GufqOt73KBOXn cnSe7nSmuFn0dyNBDCsQsTCnBGr2v8IhmZ++MYBbhoxtihr1IS8nxhCK0Kw05Vsyda /LU/6DeAZhfXJRACIcNkyMIwp+OSUwi3QbEtJesI= From: Rui Wang To: libcamera-devel@lists.libcamera.org Cc: Rui Wang Subject: [PATCH v4 2/7] ipa: rkisp1: algorithms: dpf: Implement noise reduction mode switching Date: Sun, 7 Dec 2025 19:48:03 -0500 Message-ID: <20251208004808.1274417-3-rui.wang@ideasonboard.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251208004808.1274417-1-rui.wang@ideasonboard.com> References: <20251208004808.1274417-1-rui.wang@ideasonboard.com> MIME-Version: 1.0 X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" -Add support for switching between different noise reduction modes. -Introduce `noiseReductionModes_` to store mode-specific configs. -loadReductionConfig() select specific config from configs Introduce `noiseReductionModes_` to store current configs. Signed-off-by: Rui Wang --- changelog: - Add blank line - Move V3 first patch's loadReductionConfig and reduction mode helper into this patch src/ipa/rkisp1/algorithms/dpf.cpp | 81 ++++++++++++++++++++++++++++++- src/ipa/rkisp1/algorithms/dpf.h | 11 +++++ 2 files changed, 90 insertions(+), 2 deletions(-) diff --git a/src/ipa/rkisp1/algorithms/dpf.cpp b/src/ipa/rkisp1/algorithms/dpf.cpp index cd0a7d9d..18f2a158 100644 --- a/src/ipa/rkisp1/algorithms/dpf.cpp +++ b/src/ipa/rkisp1/algorithms/dpf.cpp @@ -37,7 +37,9 @@ namespace ipa::rkisp1::algorithms { LOG_DEFINE_CATEGORY(RkISP1Dpf) Dpf::Dpf() - : config_({}), strengthConfig_({}) + : config_({}), strengthConfig_({}), + noiseReductionModes_({}), + runningMode_(controls::draft::NoiseReductionModeOff) { } @@ -61,6 +63,53 @@ bool Dpf::parseConfig(const YamlObject &tuningData) if (!parseSingleConfig(tuningData, config_, strengthConfig_)) { return false; } + + /* Parse modes. */ + if (!parseModes(tuningData)) { + return false; + } + + return true; +} + +bool Dpf::parseModes(const YamlObject &tuningData) +{ + /* Parse noise reduction modes. */ + if (!tuningData.contains("modes")) { + return true; + } + + noiseReductionModes_.clear(); + for (const auto &entry : tuningData["modes"].asList()) { + std::optional typeOpt = + entry["type"].get(); + if (!typeOpt) { + LOG(RkISP1Dpf, Error) << "Modes entry missing type"; + return false; + } + + int32_t modeValue = controls::draft::NoiseReductionModeOff; + if (*typeOpt == "minimal") { + modeValue = controls::draft::NoiseReductionModeMinimal; + } else if (*typeOpt == "fast") { + modeValue = controls::draft::NoiseReductionModeFast; + } else if (*typeOpt == "highquality") { + modeValue = controls::draft::NoiseReductionModeHighQuality; + } else if (*typeOpt == "zsl") { + modeValue = controls::draft::NoiseReductionModeZSL; + } else { + LOG(RkISP1Dpf, Error) << "Unknown mode type: " << *typeOpt; + return false; + } + + ModeConfig mode{}; + mode.modeValue = modeValue; + if (!parseSingleConfig(entry, mode.dpf, mode.strength)) { + return false; + } + noiseReductionModes_.push_back(mode); + } + return true; } @@ -192,6 +241,29 @@ bool Dpf::parseSingleConfig(const YamlObject &tuningData, return true; } +bool Dpf::loadReductionConfig(int32_t mode) +{ + auto it = std::find_if(noiseReductionModes_.begin(), noiseReductionModes_.end(), + [mode](const ModeConfig &m) { + return m.modeValue == mode; + }); + if (it == noiseReductionModes_.end()) { + LOG(RkISP1Dpf, Warning) + << "No DPF config for reduction mode " + << static_cast(mode); + return false; + } + + config_ = it->dpf; + strengthConfig_ = it->strength; + + LOG(RkISP1Dpf, Info) + << "DPF mode=Reduction (config loaded)" + << " mode=" << static_cast(mode); + + return true; +} + /** * \copydoc libcamera::ipa::Algorithm::queueRequest */ @@ -207,6 +279,7 @@ void Dpf::queueRequest(IPAContext &context, if (denoise) { LOG(RkISP1Dpf, Debug) << "Set denoise to " << *denoise; + runningMode_ = *denoise; switch (*denoise) { case controls::draft::NoiseReductionModeOff: if (dpf.denoise) { @@ -217,8 +290,12 @@ void Dpf::queueRequest(IPAContext &context, case controls::draft::NoiseReductionModeMinimal: case controls::draft::NoiseReductionModeHighQuality: case controls::draft::NoiseReductionModeFast: - if (!dpf.denoise) { + case controls::draft::NoiseReductionModeZSL: + if (loadReductionConfig(runningMode_)) { + update = true; dpf.denoise = true; + } else { + dpf.denoise = false; update = true; } break; diff --git a/src/ipa/rkisp1/algorithms/dpf.h b/src/ipa/rkisp1/algorithms/dpf.h index bee6fc9b..30cbaa57 100644 --- a/src/ipa/rkisp1/algorithms/dpf.h +++ b/src/ipa/rkisp1/algorithms/dpf.h @@ -30,13 +30,24 @@ public: RkISP1Params *params) override; private: + struct ModeConfig { + int32_t modeValue; + rkisp1_cif_isp_dpf_config dpf; + rkisp1_cif_isp_dpf_strength_config strength; + }; + bool parseConfig(const YamlObject &tuningData); + bool parseModes(const YamlObject &tuningData); bool parseSingleConfig(const YamlObject &tuningData, rkisp1_cif_isp_dpf_config &config, rkisp1_cif_isp_dpf_strength_config &strengthConfig); + bool loadReductionConfig(int32_t mode); + struct rkisp1_cif_isp_dpf_config config_; struct rkisp1_cif_isp_dpf_strength_config strengthConfig_; + std::vector noiseReductionModes_; + int32_t runningMode_; }; } /* namespace ipa::rkisp1::algorithms */