/* SPDX-License-Identifier: BSD-2-Clause */ /* * H.264 chroma DC 2x2 Hadamard pre-pass (public, in-tree CPU). * * The 4 DC coefficients of an MB's chroma 4x4 AC blocks go through * this 2x2 Hadamard before quant-scaling and re-injection into the * AC blocks' [0,0] coefficient. Algorithm per H.264 §8.5.11.1. * * Pure CPU primitive — there's no substrate-dispatch wrapper because * the work is 4 adds + 4 subs. Callers compose with QP-dependent * scaling themselves (the scale shape varies by slice/PPS chroma_qp * offset context and shouldn't be baked into the kernel). * * Bit-exact validated against tests/h264_chroma_dc_hadamard_ref.c * (7-case spec-derived test suite including the H·H = 4·I algebraic * invariant; see PR #23). Same algorithm; this is the public * src-tree copy. */ #include "daedalus.h" #include void daedalus_h264_chroma_dc_hadamard_2x2(int16_t c[4]) { int t0 = c[0] + c[1]; int t1 = c[0] - c[1]; int t2 = c[2] + c[3]; int t3 = c[2] - c[3]; c[0] = (int16_t)(t0 + t2); /* f[0,0] = sum of all 4 */ c[1] = (int16_t)(t1 + t3); /* f[0,1] = col-difference */ c[2] = (int16_t)(t0 - t2); /* f[1,0] = row-difference */ c[3] = (int16_t)(t1 - t3); /* f[1,1] = anti-diagonal */ }