Skip to content

AetherEngine and CB1

At a glance

Both use BL reshaping and inverse NLQ. The inspected implementations differ before output, so the evidence does not support “the only difference is Apple TV dithering”.

Pinned revisions

Project Inspected commit Scope
AetherEngine f92b57c3ce4e5348fd137b8f88c61bbab9399b63 Swift/Metal composer and FEL documentation
CroqueMr / CB1 00615a5a5ea02a49acde5fa992b19ee64065ab25 CB1 0.5 Master Reference contract and C parameter adapter

This is static source inspection. Upstream tests were not executed here, and no GPU/HDMI measurements were produced. Links are commit-pinned rather than pointing to moving main branches.

Concrete implementation differences

Stage AetherEngine CB1 Master Reference Code / contract
Polynomial Floating-point evaluation with fma in the generic shader; specialised paths also exist Q20 truncation and checked accumulation described in contract shader L226, S06
MMR Float coefficient tables and cross-products Integer coefficients copied; Q20 described; adapter rejects luma MMR shader L265, adapter L64
Inverse NLQ 3 × 1024 entries computed from an integer function per frame Offset, slope, threshold and maximum copied with bound checks composer L1398, adapter L75
EL luma Centred bilinear default; Annex B luma is a debug option Annex B luma/chroma, vertical before horizontal shader L428, design L896, S06
EL chroma Annex B.3 default at half size; other geometry takes other paths Declared filters, phases, boundary handling and intermediate clipping design L884, S06
Rounding Includes rint at denormalisation; quantisation is separate Shift/round/clip specified by reconstruction contract shader L334, S06
Dither 8×8 Bayer, frame parity and chroma phase; standard 10-bit output Master source-domain path retains 12-bit reconstruction shader L154, S06
HDMI Extra P010 low bits are experimental and not display-validated Admitted 12-bit 4:2:2 samples packed into RGB8 carrier design L910, S06

S06: Master Reference contract. The C adapter is not the complete GPU renderer. A full audit must follow parameters into the matched rendering implementation and output driver. Contract statements and directly inspected code are not interchangeable evidence.

Integer versus floating-point arithmetic

Integer code is not automatically correct; its shifts, intermediate values and saturation must match the intended contract. Floating point is not automatically incorrect. FP32 represents many small integers exactly, and CB1 itself uses FP32 component planes for certain exact integer results.

AetherEngine's generic float reshaping and bilinear EL luma justify testing for differences before dither. Static differences alone do not quantify their visibility or rank movie playback.

Why matching NLQ alone would not be enough

Different EL filters can feed different sample values into an otherwise identical inverse NLQ function. BL prediction, clipping, chroma siting and frame pairing can also change output. Compare every intermediate stage using the same decoded inputs.

Shared origins

AetherEngine credits libdovi from dovi_tool. CB1 retains upstream notices and dovi-tool attribution files alongside FFmpeg/libplacebo integration. This supports a shared upstream ecosystem, not proof that one composer was copied from the other. AetherEngine comments also refer to DoViBaker as a behavioural/test reference.1

Direct code lineage requires concrete matching code, attribution and commit history. No such conclusion is established here.

What the projects could learn from each other

Research candidates include comparing EL-luma filters under the same device budget, testing boundary/rounding cases in both implementations and sharing a reproducible set of intermediate outputs. Any proposed change needs correctness and performance measurements on the target hardware. A theoretically closer filter is not yet a demonstrated deployable improvement.

Limits of the conclusion

CB1 explicitly limits exactness to its documented contract, not equality with a certified player's physical HDMI output. Annex B is informative; a reference filter should not be restated as a universally mandatory decoder choice.2

Picture fundamentals · Player matrix · Next tests


Reviewed 6 November 2026 · Source-reviewed · no local playback measurements

Evidence policy · Sources


  1. S12, libdovi; S25; S05, DoViBaker comments. ↩

  2. S06, Declared spatial conventions and Execution. ↩