From patchwork Wed Jan 21 17:37:19 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kieran Bingham X-Patchwork-Id: 25907 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 982F7BDCBF for ; Wed, 21 Jan 2026 17:37:44 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 5924161FD1; Wed, 21 Jan 2026 18:37:43 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="ENiuQfTU"; 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 168BE61F9F for ; Wed, 21 Jan 2026 18:37:42 +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 EA266741; Wed, 21 Jan 2026 18:37:09 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1769017030; bh=bhC8+RpeG/YRuwvMqIWK8jqmkXn0kQe2hh8I9Ms8L6M=; h=From:To:Cc:Subject:Date:From; b=ENiuQfTUqA92TSaCsSda+Tf+cEQK0qMdQtrlVx024DzTYzK6St+DEkGa2S1MXX6DH tluA1tES+1xwuTZcIYDoGv1YmPUn9nw2ENKHvYhrxgamgy01JNs7Cg+gyfPcKSzR29 FUEhJekrslMyxv2HEsF0nukPWeTKfXbL4ZvfCnog= From: Kieran Bingham To: libcamera devel Cc: Kieran Bingham Subject: [PATCH v6 00/16] libipa: Introduce a Quantized type Date: Wed, 21 Jan 2026 17:37:19 +0000 Message-ID: <20260121173737.376113-1-kieran.bingham@ideasonboard.com> X-Mailer: git-send-email 2.52.0 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" This series superceeds [0] "rkisp1: cproc - Metadata and Hue developments" by introducing a new base type for libipa to be able to maintain values which are quantized for hardware. These data values often need to be converted, perhaps to a fixed-point format for configuration of hardware, but also then back to a floating point for returning as metadata. In particular this series builds to solve the review comment that blocked the original series at [1] The Quantized type provides a storage mechanism to make both of these storage representations visible to code that wishes to utilise the specific values. The series then re-introduces the proposed updates to cproc using the new Q types by supplying Fixed Point types and a scaled fixed point type for the Hue control. Finally, the remaining users of the fixedToFloatingPoint and floatingToFixedPoint are converted and the old helpers and tests are removed. This in cases such as the Mali-C55 AWB Gains means that we now report accurate gains as used by the hardware in the metadata. This then allows us to clean up a workaround which was managing the usage of unsigned integers to represent signed floats. Tests and documentation are provided throughout. [0] https://patchwork.libcamera.org/project/libcamera/list/?series=5245 [1] https://patchwork.libcamera.org/patch/23645/#34626 Running the tests directly shows the following output (all passing) test/ipa/libipa/quantized Quantised tests passed successfully. test/ipa/libipa/fixedpoint Q1.7(-1 .. 0.992188) Min: [0x80:-1] -- Max: [0x7f:0.992188] Step:0.0078125 Checking -2 == [0x80:-1] Checking -1 == [0x80:-1] Checking -0.992 == [0x81:-0.992188] Checking -0.006 == [0xff:-0.0078125] Checking 0 == [0x00:0] Checking 0.008 == [0x01:0.0078125] Checking 0.992 == [0x7f:0.992188] Checking 2 == [0x7f:0.992188] UQ1.7(0 .. 1.99219) Min: [0x00:0] -- Max: [0xff:1.99219] Step:0.0078125 Checking -1 == [0x00:0] Checking 0 == [0x00:0] Checking 1 == [0x80:1] Checking 1.992 == [0xff:1.99219] Checking 2 == [0xff:1.99219] Q4.7(-8 .. 7.99219) Min: [0x0400:-8] -- Max: [0x03ff:7.99219] Step:0.0078125 Checking -8 == [0x0400:-8] Checking -0.008 == [0x07ff:-0.0078125] Checking 0 == [0x0000:0] Checking 0.008 == [0x0001:0.0078125] Checking 7.992 == [0x03ff:7.99219] Checking 0.2 == [0x001a:0.203125] Checking -0.2 == [0x07e6:-0.203125] Checking -0.8 == [0x079a:-0.796875] Checking -0.4 == [0x07cd:-0.398438] Checking -1.4 == [0x074d:-1.39844] UQ4.8(0 .. 15.9961) Min: [0x0000:0] -- Max: [0x0fff:15.9961] Step:0.00390625 Checking 0 == [0x0000:0] Checking 16 == [0x0fff:15.9961] Q5.4(-16 .. 15.9375) Min: [0x0100:-16] -- Max: [0x00ff:15.9375] Step:0.0625 Checking -16 == [0x0100:-16] Checking 15.94 == [0x00ff:15.9375] UQ5.8(0 .. 31.9961) Min: [0x0000:0] -- Max: [0x1fff:31.9961] Step:0.00390625 Checking 0 == [0x0000:0] Checking 32 == [0x1fff:31.9961] Q12.4(-2048 .. 2047.94) Min: [0x8000:-2048] -- Max: [0x7fff:2047.94] Step:0.0625 Checking 0 == [0x0000:0] Checking 7.5 == [0x0078:7.5] UQ12.4(0 .. 4095.94) Min: [0x0000:0] -- Max: [0xffff:4095.94] Step:0.0625 Checking 0 == [0x0000:0] Checking 7.5 == [0x0078:7.5] Q4.20(-8 .. 8) Min: [0x00800000:-8] -- Max: [0x007fffff:8] Step:9.53674e-07 Checking -9 == [0x00800000:-8] Checking -8 == [0x00800000:-8] Checking 8 == [0x007fffff:8] Checking 9 == [0x007fffff:8] UQ4.20(0 .. 16) Min: [0x00000000:0] -- Max: [0x00ffffff:16] Step:9.53674e-07 Checking -1 == [0x00000000:0] Checking 0 == [0x00000000:0] Checking 16 == [0x00ffffff:16] Checking 20 == [0x00ffffff:16] Kieran Bingham (15): ipa: libipa: Provide a Quantized data type support test: libipa: Add tests for Quantized types ipa: libipa: fixedpoint: Fix unsigned usage ipa: libipa: Provide fixed point quantized traits test: libipa: Provide FixedPoint Quantized tests ipa: rkisp1: cproc: Convert to use Quantized types ipa: rkisp1: cproc: Report metadata ipa: rkisp1: cproc: Provide a Hue control ipa: rkisp1: ccm: Use Q<4, 7> format directly ipa: mali-c55: Reduce AWB calculations to float precision ipa: mali-c55: Convert AWB to UQ<4, 8> usage ipa: mali-c55: agc: Quantise the ISP Digital Gain test: libipa: Remove legacy fixed point conversion test ipa: libipa: fixedpoint: Move float conversion inline ipa: libipa: fixedpoint: Remove unsigned workaround van Veen, Stephan (1): libcamera: controls: Define a new core Hue control src/ipa/libipa/fixedpoint.cpp | 103 +++++++++++--- src/ipa/libipa/fixedpoint.h | 117 ++++++++++----- src/ipa/libipa/meson.build | 2 + src/ipa/libipa/quantized.cpp | 135 ++++++++++++++++++ src/ipa/libipa/quantized.h | 75 ++++++++++ src/ipa/mali-c55/algorithms/agc.cpp | 18 +-- src/ipa/mali-c55/algorithms/awb.cpp | 44 +++--- src/ipa/mali-c55/ipa_context.h | 16 ++- src/ipa/rkisp1/algorithms/ccm.cpp | 3 +- src/ipa/rkisp1/algorithms/cproc.cpp | 68 ++++++--- src/ipa/rkisp1/algorithms/cproc.h | 4 + src/ipa/rkisp1/ipa_context.h | 26 ++-- src/libcamera/control_ids_core.yaml | 15 ++ test/ipa/libipa/fixedpoint.cpp | 211 ++++++++++++++++++++-------- test/ipa/libipa/meson.build | 1 + test/ipa/libipa/quantized.cpp | 148 +++++++++++++++++++ 16 files changed, 807 insertions(+), 179 deletions(-) create mode 100644 src/ipa/libipa/quantized.cpp create mode 100644 src/ipa/libipa/quantized.h create mode 100644 test/ipa/libipa/quantized.cpp