From patchwork Fri Feb 20 22:16:33 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rui Wang X-Patchwork-Id: 26220 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 01B1AC32EA for ; Fri, 20 Feb 2026 22:17:01 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id A2B7862294; Fri, 20 Feb 2026 23:17:00 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="ATlEuL/0"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 87AB06226E for ; Fri, 20 Feb 2026 23:16:56 +0100 (CET) Received: from rui-Precision-7560.tail5b760b.ts.net (unknown [209.216.103.65]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id C224A591; Fri, 20 Feb 2026 23:16:01 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1771625762; bh=Kiv3luX1+gEPMuFr1RDU3895jHt07sXhsdVl1FvvTSM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ATlEuL/0FcLujRgCPzh7W+VGFx0MTXqMvENu4D/rV38zaKDTVLJOxt/FAAAuEm6IZ FaO5UTQu1nkjeWIzBvFtTHgpfhRGNAn4Dhx54sUXtVHimoO+V7IxY6CQ7zHQ0z1yDH XGItJHElqoMaVX1xf1cIMOcXBCy1U/mfF13CGwl8= From: Rui Wang To: libcamera-devel@lists.libcamera.org Cc: Rui Wang Subject: [PATCH v2 4/7] ipa: rkisp1: filter: Add manual denoise mode and manual filter controls Date: Fri, 20 Feb 2026 17:16:33 -0500 Message-ID: <20260220221636.216353-5-rui.wang@ideasonboard.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260220221636.216353-1-rui.wang@ideasonboard.com> References: <20260220221636.216353-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 NoiseReductionModeManual to draft controls. -Implement rkisp1 filter control registration from tuning data -Add manual-mode control parsing for filter parameters. Signed-off-by: Rui Wang --- src/ipa/rkisp1/algorithms/filter.cpp | 134 +++++++++++++++++++++++++++ src/ipa/rkisp1/algorithms/filter.h | 2 + src/libcamera/control_ids_draft.yaml | 4 + 3 files changed, 140 insertions(+) diff --git a/src/ipa/rkisp1/algorithms/filter.cpp b/src/ipa/rkisp1/algorithms/filter.cpp index 739a0c4d..62d470f4 100644 --- a/src/ipa/rkisp1/algorithms/filter.cpp +++ b/src/ipa/rkisp1/algorithms/filter.cpp @@ -178,6 +178,140 @@ int Filter::parseSharpnessConfig(const YamlObject &data, return 0; } +void Filter::registerControls([[maybe_unused]] IPAContext &context) +{ + auto &cmap = context.ctrlMap; + + if (modes_.empty() or sharpness_.empty()) { + LOG(RkISP1Filter, Warning) + << "No NoiseReductionModes or Sharpness levels parsed, filter controls not registered"; + return; + } + + /* Register sharpness control value from tuning data size*/ + const size_t sharpnessLevels = sharpness_.size(); + cmap[&controls::Sharpness] = ControlInfo(0.0f, static_cast(sharpnessLevels - 1), 1.0f); + + const auto manualMode = static_cast(controls::draft::NoiseReductionModeManual); + auto selectedMode = modes_.find(manualMode); + if (selectedMode == modes_.end()) + selectedMode = modes_.begin(); + + const auto &modeParams = selectedMode->second; + + LOG(RkISP1Filter, Debug) + << "Initial NoiseReductionMode set to " << selectedMode->first; + + /* Register rkisp1-specific filter control values. */ + cmap[&controls::rkisp1::FilterDenoiseMode] = + ControlInfo(0, 255, static_cast(modeParams.at("mode"))); + cmap[&controls::rkisp1::FilterDenoiseLumWeight] = + ControlInfo(0, 255, static_cast(modeParams.at("lum_weight"))); + cmap[&controls::rkisp1::FilterDenoiseGreenStage1] = + ControlInfo(0, 7, static_cast(modeParams.at("grn_stage1"))); + cmap[&controls::rkisp1::FilterDenoiseChrVMode] = + ControlInfo(0, 3, static_cast(modeParams.at("chr_v_mode"))); + cmap[&controls::rkisp1::FilterDenoiseChrHMode] = + ControlInfo(0, 3, static_cast(modeParams.at("chr_h_mode"))); + cmap[&controls::rkisp1::FilterFacSh0] = + ControlInfo(0, 63, static_cast(modeParams.at("fac_sh0"))); + cmap[&controls::rkisp1::FilterFacSh1] = + ControlInfo(0, 63, static_cast(modeParams.at("fac_sh1"))); + cmap[&controls::rkisp1::FilterFacMid] = + ControlInfo(0, 63, static_cast(modeParams.at("fac_mid"))); + cmap[&controls::rkisp1::FilterFacBl0] = + ControlInfo(0, 63, static_cast(modeParams.at("fac_bl0"))); + cmap[&controls::rkisp1::FilterFacBl1] = + ControlInfo(0, 63, static_cast(modeParams.at("fac_bl1"))); + cmap[&controls::rkisp1::FilterThreshSh0] = + ControlInfo(0, 255, static_cast(modeParams.at("thresh_sh0"))); + cmap[&controls::rkisp1::FilterThreshSh1] = + ControlInfo(0, 255, static_cast(modeParams.at("thresh_sh1"))); + cmap[&controls::rkisp1::FilterThreshBl0] = + ControlInfo(0, 255, static_cast(modeParams.at("thresh_bl0"))); + cmap[&controls::rkisp1::FilterThreshBl1] = + ControlInfo(0, 255, static_cast(modeParams.at("thresh_bl1"))); +} + +bool Filter::parseControls(const ControlList &controls) +{ + bool updated = false; + constexpr auto manual = controls::draft::NoiseReductionModeManual; + auto ¶ms = modes_[manual]; + + if (const auto &c = controls.get(controls::rkisp1::FilterFacSh0); c) { + params["fac_sh0"] = *c; + updated = true; + } + + if (const auto &c = controls.get(controls::rkisp1::FilterFacSh1); c) { + params["fac_sh1"] = *c; + updated = true; + } + + if (const auto &c = controls.get(controls::rkisp1::FilterFacMid); c) { + params["fac_mid"] = *c; + updated = true; + } + + if (const auto &c = controls.get(controls::rkisp1::FilterFacBl0); c) { + params["fac_bl0"] = *c; + updated = true; + } + + if (const auto &c = controls.get(controls::rkisp1::FilterFacBl1); c) { + params["fac_bl1"] = *c; + updated = true; + } + + if (const auto &c = controls.get(controls::rkisp1::FilterThreshSh0); c) { + params["thresh_sh0"] = *c; + updated = true; + } + + if (const auto &c = controls.get(controls::rkisp1::FilterThreshSh1); c) { + params["thresh_sh1"] = *c; + updated = true; + } + + if (const auto &c = controls.get(controls::rkisp1::FilterThreshBl0); c) { + params["thresh_bl0"] = *c; + updated = true; + } + + if (const auto &c = controls.get(controls::rkisp1::FilterThreshBl1); c) { + params["thresh_bl1"] = *c; + updated = true; + } + + if (const auto &c = controls.get(controls::rkisp1::FilterDenoiseMode); c) { + params["mode"] = *c; + updated = true; + } + + if (const auto &c = controls.get(controls::rkisp1::FilterDenoiseLumWeight); c) { + params["lum_weight"] = *c; + updated = true; + } + + if (const auto &c = controls.get(controls::rkisp1::FilterDenoiseGreenStage1); c) { + params["grn_stage1"] = *c; + updated = true; + } + + if (const auto &c = controls.get(controls::rkisp1::FilterDenoiseChrVMode); c) { + params["chr_v_mode"] = *c; + updated = true; + } + + if (const auto &c = controls.get(controls::rkisp1::FilterDenoiseChrHMode); c) { + params["chr_h_mode"] = *c; + updated = true; + } + + return updated; +} + /** * \copydoc libcamera::ipa::Algorithm::queueRequest */ diff --git a/src/ipa/rkisp1/algorithms/filter.h b/src/ipa/rkisp1/algorithms/filter.h index 83b90ef3..e6f36df3 100644 --- a/src/ipa/rkisp1/algorithms/filter.h +++ b/src/ipa/rkisp1/algorithms/filter.h @@ -35,6 +35,8 @@ private: std::unordered_map &modeParams); int parseSharpnessConfig(const YamlObject &data, std::unordered_map &sharpParams); + void registerControls(IPAContext &context); + bool parseControls(const ControlList &controls); std::unordered_map> modes_; std::vector> sharpness_; diff --git a/src/libcamera/control_ids_draft.yaml b/src/libcamera/control_ids_draft.yaml index 03309eea..97ccda1c 100644 --- a/src/libcamera/control_ids_draft.yaml +++ b/src/libcamera/control_ids_draft.yaml @@ -58,6 +58,10 @@ controls: value: 4 description: | Noise reduction is applied at different levels to different streams. + - name: NoiseReductionModeManual + value: 5 + description: | + Manual control all noise reduction parameters. - ColorCorrectionAberrationMode: type: int32_t