From patchwork Wed Jan 14 17:39:00 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kieran Bingham X-Patchwork-Id: 25796 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 01952BDCBF for ; Wed, 14 Jan 2026 17:39:25 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 766B361FCA; Wed, 14 Jan 2026 18:39:24 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="a6J2S4eH"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id ADB8861F9F for ; Wed, 14 Jan 2026 18:39:22 +0100 (CET) Received: from Monstersaurus.infra.iob (cpc89244-aztw30-2-0-cust6594.18-1.cable.virginm.net [86.31.185.195]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 93C6755C; Wed, 14 Jan 2026 18:38:55 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1768412335; bh=TcF+OkPHPZR23t8p4+cMCttS4x50aRfrbKYDB0lpB84=; h=From:To:Cc:Subject:Date:From; b=a6J2S4eHnYLqzjwNARagsl+9S6LFq7NFeaUcjhZKCuBCI9MIng4fEmIfLxRRLLi8C IRcnVnNIw++LtyEGtgZW5v7KurAZZ0cDY1IsPYCsC6kbWCTckJbG6N8wHXVOTDq62S tYej5meYqwl71UfnWi0uUYQ9L/1aYWwq7gF1+K90= From: Kieran Bingham To: libcamera devel Cc: Kieran Bingham Subject: [PATCH v5 00/16] libipa: Introduce a Quantized type Date: Wed, 14 Jan 2026 17:39:00 +0000 Message-ID: <20260114173918.1744023-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 -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] UQ1.7(0 .. 1.99219) Min: [0x00:0] -- Max: [0xff:1.99219] Step:0.0078125 Checking 0 == [0x00:0] Checking 1 == [0x80:1] Checking 1.992 == [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] Range validation: Checking -100 == [0x80:-1] Checking 100 == [0x7f:0.992188] Checking -100 == [0x00:0] Checking 100 == [0xff:1.99219] 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 | 99 ++++++++++++--- src/ipa/libipa/fixedpoint.h | 118 +++++++++++------- src/ipa/libipa/meson.build | 2 + src/ipa/libipa/quantized.cpp | 142 ++++++++++++++++++++++ src/ipa/libipa/quantized.h | 83 +++++++++++++ src/ipa/mali-c55/algorithms/agc.cpp | 18 +-- src/ipa/mali-c55/algorithms/awb.cpp | 40 +++---- 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 | 179 ++++++++++++++++++---------- test/ipa/libipa/meson.build | 1 + test/ipa/libipa/quantized.cpp | 124 +++++++++++++++++++ 16 files changed, 756 insertions(+), 182 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