From patchwork Wed Oct 29 17:24:32 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kieran Bingham X-Patchwork-Id: 24896 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 5CED9C32DB for ; Wed, 29 Oct 2025 17:25:05 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id C71C760896; Wed, 29 Oct 2025 18:25:04 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="C+1xsz0v"; 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 16F956085D for ; Wed, 29 Oct 2025 18:24:48 +0100 (CET) Received: from Monstersaurus.hippo-penny.ts.net (cpc89244-aztw30-2-0-cust6594.18-1.cable.virginm.net [86.31.185.195]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id B38034E56; Wed, 29 Oct 2025 18:22:58 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1761758578; bh=qtciVlkHQP17kVgBOI2psXZNZNVKNA4SMUPtzt+80GI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=C+1xsz0vGUxziHmKgxb0jCDgtg/iWA6Dlyi8G6ec8scNGYdTGkZ2fAQcCKSlOk4N6 1Z5gS3svaVw8OccYPrs/Gi6InqaM7s8w4I7IqURlNrLPHzjNqSf4elLd3YdWqdcfi+ 69zaYGQE5FJIMEfMpQCK1EFRj6r5MaOKXr2qyaDA= From: Kieran Bingham To: libcamera devel Cc: Kieran Bingham Subject: [PATCH v2 07/13] ipa: libipa: fixedpoint: Provide a ScaledFixedPoint type Date: Wed, 29 Oct 2025 17:24:32 +0000 Message-ID: <20251029172439.1513907-8-kieran.bingham@ideasonboard.com> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20251029172439.1513907-1-kieran.bingham@ideasonboard.com> References: <20251029172439.1513907-1-kieran.bingham@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" Extend the new Quantized FixedPoint capabilities with a ScaledFixedPointQTraits which takes an existing Quantized type and scales the conversion by the given Scale template parameter. This can be useful to represent fixed point values which represent a linear range with a different scale to the underlying float or integral type. Signed-off-by: Kieran Bingham --- src/ipa/libipa/fixedpoint.cpp | 59 +++++++++++++++++++++++++++++++++++ src/ipa/libipa/fixedpoint.h | 24 ++++++++++++++ 2 files changed, 83 insertions(+) diff --git a/src/ipa/libipa/fixedpoint.cpp b/src/ipa/libipa/fixedpoint.cpp index 2568c7921348..e6e1408ccff6 100644 --- a/src/ipa/libipa/fixedpoint.cpp +++ b/src/ipa/libipa/fixedpoint.cpp @@ -151,6 +151,65 @@ namespace ipa { * Represents values in the range [0.0, 4095.9375] with a resolution of 1/16. */ +/** + * \struct ScaledFixedPointQTraits + * \brief Wrap a FixedPointQTraits with a linear scaling factor + * + * This trait extends an existing fixed-point quantisation policy + * by applying an additional multiplicative scale between the + * floating-point and quantised domains. + * + * \tparam Q The base fixed-point traits type + * \tparam Scale The scale factor applied to the floating-point domain + */ + +/** + * \typedef ScaledFixedPointQTraits::quantized_type + * \copydoc FixedPointQTraits::quantized_type + */ + +/** + * \var ScaledFixedPointQTraits::scale + * \brief The constant scaling factor applied to the floating-point domain. + * + * Floating-point inputs are divided by this factor before quantisation, + * and multiplied by it after dequantisation. + */ + +/** + * \var ScaledFixedPointQTraits::qmin + * \copydoc FixedPointQTraits::qmin + */ + +/** + * \var ScaledFixedPointQTraits::qmax + * \copydoc FixedPointQTraits::qmax + */ + +/** + * \var ScaledFixedPointQTraits::min + * \copydoc FixedPointQTraits::min + */ + +/** + * \var ScaledFixedPointQTraits::max + * \copydoc FixedPointQTraits::max + */ + +/** + * \fn ScaledFixedPointQTraits::fromFloat(float v) + * \copydoc FixedPointQTraits::fromFloat(float v) + * + * The input value \a v is divided by the scaling factor before conversion. + */ + +/** + * \fn ScaledFixedPointQTraits::toFloat(quantized_type q) + * \copydoc FixedPointQTraits::toFloat(quantized_type q) + * + * The output value is multiplied by the scaling factor after conversion. + */ + } /* namespace ipa */ } /* namespace libcamera */ diff --git a/src/ipa/libipa/fixedpoint.h b/src/ipa/libipa/fixedpoint.h index 557f7f5b3382..7a9103ed3a77 100644 --- a/src/ipa/libipa/fixedpoint.h +++ b/src/ipa/libipa/fixedpoint.h @@ -106,6 +106,30 @@ using UQ1_7 = Quantized>; using Q12_4 = Quantized>; using UQ12_4 = Quantized>; +template +struct ScaledFixedPointQTraits { + using quantized_type = typename Q::quantized_type; + + static constexpr float scale = static_cast(Scale); + + /* Re-expose base limits, adjusted by the scaling factor */ + static constexpr quantized_type qmin = Q::qmin; + static constexpr quantized_type qmax = Q::qmax; + static constexpr float min = Q::min * scale; + static constexpr float max = Q::max * scale; + + static quantized_type fromFloat(float v) + { + v = std::clamp(v, min, max); + return Q::fromFloat(v / scale); + } + + static float toFloat(quantized_type q) + { + return Q::toFloat(q) * scale; + } +}; + } /* namespace ipa */ } /* namespace libcamera */