From patchwork Fri Feb 20 22:16:35 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rui Wang X-Patchwork-Id: 26222 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 45D36C32EF for ; Fri, 20 Feb 2026 22:17:04 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id E5ACF62280; Fri, 20 Feb 2026 23:17:03 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="gyWY9vlb"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 133B262288 for ; Fri, 20 Feb 2026 23:16:58 +0100 (CET) Received: from rui-Precision-7560.tail5b760b.ts.net (unknown [209.216.103.65]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id A4DA4591; Fri, 20 Feb 2026 23:16:03 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1771625764; bh=FoxKhw+6ex2K6FH+ROijqZo5uUc7tOtAWVaIW4+Pn0I=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=gyWY9vlbTpxgHF+ec9khT/D2oVJUQvlSfrT1G5a3dy1xr80n+m5iaeafZ+X5rRELS 9W64JcPITWwK3Zr8q02cgkD4zOJudk062R8hGO5CKE2oSS9/pRV+pA092z8sTwUR5P tkJEfwKNBQwffwynoBw4rJrI1PZtBsMrh5iklnl0= From: Rui Wang To: libcamera-devel@lists.libcamera.org Cc: Rui Wang Subject: [PATCH v2 6/7] ipa: rkisp1: filter: add metadata reporting and config logging Date: Fri, 20 Feb 2026 17:16:35 -0500 Message-ID: <20260220221636.216353-7-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" -Implement filter metadata reporting in process() with fillMetadata(), -Add detailed logConfig() dump on updates, -Metadata now exports denoise/fac parameters from mode config with sharpness override when valid. Signed-off-by: Rui Wang --- src/ipa/rkisp1/algorithms/filter.cpp | 118 +++++++++++++++++++++++++++ src/ipa/rkisp1/algorithms/filter.h | 7 ++ 2 files changed, 125 insertions(+) diff --git a/src/ipa/rkisp1/algorithms/filter.cpp b/src/ipa/rkisp1/algorithms/filter.cpp index 48831791..0ac186f8 100644 --- a/src/ipa/rkisp1/algorithms/filter.cpp +++ b/src/ipa/rkisp1/algorithms/filter.cpp @@ -400,6 +400,9 @@ void Filter::prepare([[maybe_unused]] IPAContext &context, config->fac_bl0 = modeParams["fac_bl0"]; config->fac_bl1 = modeParams["fac_bl1"]; + if (frameContext.filter.update) + logConfig(frameContext); + if (sharpness == 0 or sharpness >= sharpness_.size()) { LOG(RkISP1Filter, Debug) << "Sharpness value out of range: " << static_cast(sharpness); @@ -418,6 +421,121 @@ void Filter::prepare([[maybe_unused]] IPAContext &context, config->fac_bl1 = sharp.at("fac_bl1"); } +void Filter::logConfig(const IPAFrameContext &frameContext) const +{ + uint8_t denoise = frameContext.filter.denoise; + uint8_t sharpness = frameContext.filter.sharpness; + + std::ostringstream ss; + ss << "Filter config: mode=" << static_cast(denoise) + << ", sharpness=" << static_cast(sharpness); + + /* Log denoise values from mode config. */ + auto it = modes_.find(denoise); + if (it != modes_.end()) { + const auto &modeParams = it->second; + for (const auto &key : kFilterKeyNames) { + auto keyIt = modeParams.find(key); + if (keyIt != modeParams.end()) + ss << ", " << key << "=" << keyIt->second; + else + ss << ", " << key << "="; + } + } + + /* No sharpness factors need to be logged. */ + if (sharpness == 0 or sharpness >= sharpness_.size()) { + LOG(RkISP1Filter, Debug) << ss.str(); + return; + } + + /* Log sharpness factors. */ + if (sharpness < sharpness_.size()) { + const auto &sharp = sharpness_[sharpness]; + for (const auto &key : kSharpnessKeyNames) { + auto keyIt = sharp.find(key); + if (keyIt != sharp.end()) + ss << ", " << key << "=" << keyIt->second; + else + ss << ", " << key << "="; + } + } + + LOG(RkISP1Filter, Debug) << ss.str(); +} + +void Filter::fillMetadata(IPAFrameContext &frameContext, + ControlList &metadata) +{ + uint8_t denoise = frameContext.filter.denoise; + uint8_t sharpness = frameContext.filter.sharpness; + + if (denoise == controls::draft::NoiseReductionModeOff) + return; + + /* Report denoise values from mode config. */ + auto it = modes_.find(denoise); + if (it == modes_.end()) + return; + + const auto &modeParams = it->second; + metadata.set(controls::rkisp1::FilterThreshSh0, + static_cast(modeParams.at("thresh_sh0"))); + metadata.set(controls::rkisp1::FilterThreshSh1, + static_cast(modeParams.at("thresh_sh1"))); + metadata.set(controls::rkisp1::FilterThreshBl0, + static_cast(modeParams.at("thresh_bl0"))); + metadata.set(controls::rkisp1::FilterThreshBl1, + static_cast(modeParams.at("thresh_bl1"))); + metadata.set(controls::rkisp1::FilterDenoiseMode, + static_cast(modeParams.at("mode"))); + metadata.set(controls::rkisp1::FilterDenoiseLumWeight, + static_cast(modeParams.at("lum_weight"))); + metadata.set(controls::rkisp1::FilterDenoiseGreenStage1, + static_cast(modeParams.at("grn_stage1"))); + metadata.set(controls::rkisp1::FilterDenoiseChrVMode, + static_cast(modeParams.at("chr_v_mode"))); + metadata.set(controls::rkisp1::FilterDenoiseChrHMode, + static_cast(modeParams.at("chr_h_mode"))); + metadata.set(controls::rkisp1::FilterFacSh0, + static_cast(modeParams.at("fac_sh0"))); + metadata.set(controls::rkisp1::FilterFacSh1, + static_cast(modeParams.at("fac_sh1"))); + metadata.set(controls::rkisp1::FilterFacMid, + static_cast(modeParams.at("fac_mid"))); + metadata.set(controls::rkisp1::FilterFacBl0, + static_cast(modeParams.at("fac_bl0"))); + metadata.set(controls::rkisp1::FilterFacBl1, + static_cast(modeParams.at("fac_bl1"))); + + if (sharpness == 0 or sharpness >= sharpness_.size()) + return; + + const auto &sharp = sharpness_[sharpness]; + + metadata.set(controls::rkisp1::FilterFacSh0, + static_cast(sharp.at("fac_sh0"))); + metadata.set(controls::rkisp1::FilterFacSh1, + static_cast(sharp.at("fac_sh1"))); + metadata.set(controls::rkisp1::FilterFacMid, + static_cast(sharp.at("fac_mid"))); + metadata.set(controls::rkisp1::FilterFacBl0, + static_cast(sharp.at("fac_bl0"))); + metadata.set(controls::rkisp1::FilterFacBl1, + static_cast(sharp.at("fac_bl1"))); +} + +/** + * \copydoc libcamera::ipa::Algorithm::process + */ +void Filter::process([[maybe_unused]] IPAContext &context, [[maybe_unused]] const uint32_t frame, + IPAFrameContext &frameContext, + [[maybe_unused]] const rkisp1_stat_buffer *stats, + ControlList &metadata) +{ + fillMetadata(frameContext, metadata); +} + REGISTER_IPA_ALGORITHM(Filter, "Filter") } /* namespace ipa::rkisp1::algorithms */ diff --git a/src/ipa/rkisp1/algorithms/filter.h b/src/ipa/rkisp1/algorithms/filter.h index e6f36df3..58df3d8d 100644 --- a/src/ipa/rkisp1/algorithms/filter.h +++ b/src/ipa/rkisp1/algorithms/filter.h @@ -28,6 +28,10 @@ public: void prepare(IPAContext &context, const uint32_t frame, IPAFrameContext &frameContext, RkISP1Params *params) override; + void process(IPAContext &context, const uint32_t frame, + IPAFrameContext &frameContext, + const rkisp1_stat_buffer *stats, + ControlList &metadata) override; private: int parseConfig(const YamlObject &tuningData); @@ -37,6 +41,9 @@ private: std::unordered_map &sharpParams); void registerControls(IPAContext &context); bool parseControls(const ControlList &controls); + void fillMetadata(IPAFrameContext &frameContext, + ControlList &metadata); + void logConfig(const IPAFrameContext &frameContext) const; std::unordered_map> modes_; std::vector> sharpness_;