From patchwork Tue Oct 28 17:08:44 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rui Wang X-Patchwork-Id: 24867 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 E0C96BE080 for ; Tue, 28 Oct 2025 17:09:29 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 7973B60869; Tue, 28 Oct 2025 18:09:29 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="eDDB3MAB"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 2972D6082B for ; Tue, 28 Oct 2025 18:09:23 +0100 (CET) Received: from rui-Precision-7560.local (unknown [209.216.122.90]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 39EF01AED; Tue, 28 Oct 2025 18:07:34 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1761671254; bh=d0nvt/XBK0ElIAIDPInJJPHFSpfeojs94gqBvNzvrqs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=eDDB3MABaKAm63IL3X5lYOJO9ZqXBaBO//WTWvB3uLf7S/rWRMdSRkqLiNl3bJplq srdhxhCFupOTzCqX+L5tuBzVhPX9YZjgE6VouRNXyRHFY/X61zy775t2EGtlMaLG1S AorMDUA10dhaTbVU9LXRVS3KuoFIfMRyAxYwq47Y= From: Rui Wang To: libcamera-devel@lists.libcamera.org Cc: Rui Wang Subject: [PATCH v1 15/16] ipa: rkisp1: algorithms: dpf: expose DPF control map Date: Tue, 28 Oct 2025 13:08:44 -0400 Message-ID: <20251028170847.2673396-15-rui.wang@ideasonboard.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251028170847.2673396-1-rui.wang@ideasonboard.com> References: <20251028170847.2673396-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 getControlMap() to provide the RkISP1 DPF controls with tuning- derived defaults. The map includes: - DpfEnable (master enable toggle) - DpfMode (auto/manual mode selection) - DpfChannelStrengths (R/G/B strength values) - Developer mode controls when enabled: - Spatial coefficients (green and RB) - RB filter size (9x9 or 13x9) - NLL coefficients and scale mode - DpfIso (read-only ISO indicator) This control map is registered during init() to expose DPF controls to applications. Signed-off-by: Rui Wang --- src/ipa/rkisp1/algorithms/denoise.h | 2 ++ src/ipa/rkisp1/algorithms/dpf.cpp | 29 +++++++++++++++++++++++++++ src/ipa/rkisp1/algorithms/dpf.h | 2 ++ src/libcamera/control_ids_rkisp1.yaml | 8 ++++++++ 4 files changed, 41 insertions(+) diff --git a/src/ipa/rkisp1/algorithms/denoise.h b/src/ipa/rkisp1/algorithms/denoise.h index e2bedc41..53a0b642 100644 --- a/src/ipa/rkisp1/algorithms/denoise.h +++ b/src/ipa/rkisp1/algorithms/denoise.h @@ -60,6 +60,8 @@ protected: virtual void prepareManualMode(IPAContext &context, const uint32_t frame, IPAFrameContext &frameContext, RkISP1Params *params) = 0; + virtual ControlInfoMap::Map getControlMap() const = 0; + private: bool manualMode_ = false; /**< Current manual/auto mode state */ bool devMode_ = false; /**< Developer mode state for advanced controls */ diff --git a/src/ipa/rkisp1/algorithms/dpf.cpp b/src/ipa/rkisp1/algorithms/dpf.cpp index dfef2f91..0bbcc9be 100644 --- a/src/ipa/rkisp1/algorithms/dpf.cpp +++ b/src/ipa/rkisp1/algorithms/dpf.cpp @@ -507,6 +507,35 @@ void Dpf::logConfigIfChanged(unsigned iso, int isoIndex, bool anyOverride, const haveLast = true; } +ControlInfoMap::Map Dpf::getControlMap() const +{ + ControlInfoMap::Map map; + map[&controls::rkisp1::DpfEnable] = ControlInfo(false, true, enableDpf_); + map[&controls::rkisp1::DpfMode] = ControlInfo(controls::rkisp1::DpfModeValues, ControlValue(controls::rkisp1::DpfModeAuto)); + std::array strengthDefault = { static_cast(baseStrengthConfig_.r), static_cast(baseStrengthConfig_.g), static_cast(baseStrengthConfig_.b) }; + map[&controls::rkisp1::DpfChannelStrengths] = ControlInfo(0, 255, Span(strengthDefault)); + if (isDevMode()) { + std::array greenCoeffs; + for (unsigned i = 0; i < RKISP1_CIF_ISP_DPF_MAX_SPATIAL_COEFFS; ++i) + greenCoeffs[i] = baseConfig_.g_flt.spatial_coeff[i]; + map[&controls::rkisp1::DpfGreenSpatialCoefficients] = ControlInfo(0, 63, Span(greenCoeffs)); + std::array rbCoeffs; + for (unsigned i = 0; i < RKISP1_CIF_ISP_DPF_MAX_SPATIAL_COEFFS; ++i) + rbCoeffs[i] = baseConfig_.rb_flt.spatial_coeff[i]; + map[&controls::rkisp1::DpfRedBlueSpatialCoefficients] = ControlInfo(0, 63, Span(rbCoeffs)); + int32_t rbSizeDefault = (baseConfig_.rb_flt.fltsize == RKISP1_CIF_ISP_DPF_RB_FILTERSIZE_13x9) ? 1 : 0; + map[&controls::rkisp1::DpfRbFilterSize] = ControlInfo(controls::rkisp1::DpfRbFilterSizeValues, ControlValue(rbSizeDefault)); + std::array nllCoeffs; + for (unsigned i = 0; i < RKISP1_CIF_ISP_DPF_MAX_NLF_COEFFS; ++i) + nllCoeffs[i] = baseConfig_.nll.coeff[i]; + map[&controls::rkisp1::DpfNoiseLevelLookupCoefficients] = ControlInfo(0, 1023, Span(nllCoeffs)); + int32_t scaleModeDefault = (baseConfig_.nll.scale_mode == RKISP1_CIF_ISP_NLL_SCALE_LOGARITHMIC) ? 1 : 0; + map[&controls::rkisp1::DpfNoiseLevelLookupScaleMode] = ControlInfo(controls::rkisp1::DpfNoiseLevelLookupScaleModeValues, ControlValue(scaleModeDefault)); + } + map[&controls::rkisp1::DpfIso] = ControlInfo(0, 3200, 0); + return map; +} + /** * \copydoc libcamera::ipa::Algorithm::queueRequest */ diff --git a/src/ipa/rkisp1/algorithms/dpf.h b/src/ipa/rkisp1/algorithms/dpf.h index d84ba45f..5db50143 100644 --- a/src/ipa/rkisp1/algorithms/dpf.h +++ b/src/ipa/rkisp1/algorithms/dpf.h @@ -111,6 +111,8 @@ private: void prepareManualMode(IPAContext &context, const uint32_t frame, IPAFrameContext &frameContext, RkISP1Params *params) override; + + ControlInfoMap::Map getControlMap() const override; }; } /* namespace ipa::rkisp1::algorithms */ diff --git a/src/libcamera/control_ids_rkisp1.yaml b/src/libcamera/control_ids_rkisp1.yaml index 78b95447..af95a753 100644 --- a/src/libcamera/control_ids_rkisp1.yaml +++ b/src/libcamera/control_ids_rkisp1.yaml @@ -121,5 +121,13 @@ controls: - name: DpfModeManual value: 1 description: Manual mode - parameters are frozen and can be overridden. + + - DpfIso: + type: int32_t + direction: out + description: | + Estimated scene ISO value used for DPF tuning selection. Derived + from analogue gain (approx ISO = gain * 100). Provided each frame + for client awareness and debugging. Range 0..409600. ...