[v7,00/15] libipa: Introduce a Quantized type
mbox series

Message ID 20260213-kbingham-quantizers-v7-0-1626b9aaabf1@ideasonboard.com
Headers show
Series
  • libipa: Introduce a Quantized type
Related show

Message

Kieran Bingham Feb. 13, 2026, 4:57 p.m. UTC
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>
---
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 |  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      | 252 ++++++++++++++++++++++++++++--------
 test/ipa/libipa/meson.build         |   1 +
 test/ipa/libipa/quantized.cpp       | 148 +++++++++++++++++++++
 16 files changed, 859 insertions(+), 176 deletions(-)
---
base-commit: 1dcf9957a47fb54fce4fbae9daec0b587e52562e
change-id: 20260210-kbingham-quantizers-9dd50aff6b5f

Best regards,