| Message ID | 20260219-kbingham-quantizers-v8-0-2b6ff68ead26@ideasonboard.com |
|---|---|
| Headers | show
Return-Path: <libcamera-devel-bounces@lists.libcamera.org> 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 F378BC0DA4 for <parsemail@patchwork.libcamera.org>; Thu, 19 Feb 2026 15:05:11 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 9C0986225E; Thu, 19 Feb 2026 16:05:10 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="ESXXFqK0"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id D866C62250 for <libcamera-devel@lists.libcamera.org>; Thu, 19 Feb 2026 16:05:08 +0100 (CET) Received: from ping.linuxembedded.co.uk (cpc89244-aztw30-2-0-cust6594.18-1.cable.virginm.net [86.31.185.195]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 1AA863A4; Thu, 19 Feb 2026 16:04:15 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1771513455; bh=SQaSAj3aO3TOBL9Zklmc4fAXfHSJYqlDiLkwX+xuEdI=; h=From:Subject:Date:To:Cc:From; b=ESXXFqK0oHWQH8bDLP/wqQPslFPiN9X8mruE3NcpT2olH/M1t/jN3RiVxrNEtbeu+ Cx/ebTucz7OVtkyeDrKVi0V3J6J7Bj02qwzWLlC1JO/xT+PZFrLNh9XAiVE8UsWysB G3XH89tFrxeBVXbCTWo/dtefleP5Ndi+OAzrr3Ak= From: Kieran Bingham <kieran.bingham@ideasonboard.com> Subject: [PATCH v8 00/15] libipa: Introduce a Quantized type Date: Thu, 19 Feb 2026 15:05:01 +0000 Message-Id: <20260219-kbingham-quantizers-v8-0-2b6ff68ead26@ideasonboard.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-B4-Tracking: v=1; b=H4sIAJ0ml2kC/22NQQ6CMBBFr0JmbU2poYgr72FYTOkUJoZWWyQq4 e5WEncu30v++wskikwJTsUCkWZOHHyG466AbkDfk2CbGZRUWqpSiqth3w84ivsD/cRvikk01lY SndOmcpCXt0iOn1v10mYeOE0hvraTuf7aX+/wtzfXQopSK20aRDSuPLMlTMGbgNHuuzBCu67rB 7L19Ty9AAAA X-Change-ID: 20260210-kbingham-quantizers-9dd50aff6b5f To: libcamera-devel@lists.libcamera.org Cc: Kieran Bingham <kieran.bingham@ideasonboard.com>, =?utf-8?q?Barnab?= =?utf-8?b?w6FzIFDFkWN6ZQ==?= <barnabas.pocze@ideasonboard.com>, Isaac Scott <isaac.scott@ideasonboard.com>, Paul Elder <paul.elder@ideasonboard.com>, Laurent Pinchart <laurent.pinchart@ideasonboard.com>, Stefan Klug <stefan.klug@ideasonboard.com>, "van Veen, Stephan" <stephan.vanveen@karlstorz.com> X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1771513507; l=6409; i=kieran.bingham@ideasonboard.com; s=20260207; h=from:subject:message-id; bh=SQaSAj3aO3TOBL9Zklmc4fAXfHSJYqlDiLkwX+xuEdI=; b=ZgVYqOK+CdbXvn3M9Js9UK7Dioz0N+xmEkpZqa92fwJvomQaR49e4gntkOo4PH4t7Mc8TNBhR XmY85k0Zd5EAvEh/5n+XNH1eeefRuDMenS0XbamQ7+HzvyyTSz3xEoL X-Developer-Key: i=kieran.bingham@ideasonboard.com; a=ed25519; pk=FVXKN7YuwHc6UtbRUeTMAmranfsQomA+vnilfglWdaY= X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: <libcamera-devel.lists.libcamera.org> List-Unsubscribe: <https://lists.libcamera.org/options/libcamera-devel>, <mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe> List-Archive: <https://lists.libcamera.org/pipermail/libcamera-devel/> List-Post: <mailto:libcamera-devel@lists.libcamera.org> List-Help: <mailto:libcamera-devel-request@lists.libcamera.org?subject=help> List-Subscribe: <https://lists.libcamera.org/listinfo/libcamera-devel>, <mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe> Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" <libcamera-devel-bounces@lists.libcamera.org> |
| Series |
|
| Related |
show
|
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. The underlying storage of a quantized fixed point is now always unsigned and we ensure that signed extensions can not occur when storing in larger registers. 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) 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] Testing sign extension of quantized values when cast to larger registers Checking [0x20:-2] == 0x20 Checking [0x80:-8] == 0x80 Checking [0x80:-8] == 0x0080 Checking [0x8000:-128] == 0x8000 Checking [0x8000:-128] == 0x00008000 Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> --- Changes in v8: - Remove noexcept in quantized.h - Only use uint8_t in quantized.cpp - Don't output on success in tests - Use [-180, 180] for Hue to allow metadata expectations to be met (without changing sign on an input control) - Use 1.0f and 0.2f to prevent double usage on float conversions - Keep the gain clamps on mali-agc --- Kieran Bingham (14): 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 van Veen, Stephan (1): libcamera: controls: Define a new core Hue control src/ipa/libipa/fixedpoint.cpp | 108 +++++++++++++--- src/ipa/libipa/fixedpoint.h | 120 +++++++++++------ 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 | 25 ++-- 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 | 252 ++++++++++++++++++++++++++++-------- test/ipa/libipa/meson.build | 1 + test/ipa/libipa/quantized.cpp | 145 +++++++++++++++++++++ 16 files changed, 859 insertions(+), 180 deletions(-) --- base-commit: da12b1854fbc0ec32d3162a0ab97654fcb679ae3 change-id: 20260210-kbingham-quantizers-9dd50aff6b5f Best regards,