# Iteration 5b — Phase 6 (implementation) Commits A + B + C landed on fork master 2026-05-12. All built clean on fresnel `linux-fresnel-fourier 7.0-1` (libva 1.23, ninja 1.13.2, gcc 15.2.1). No fix-forward needed. ## Commits | SHA | Files | LOC | Summary | |---|---|---|---| | `ce304ef` (A) | `src/codec.h` (new) · `src/codec.c` (new) · `src/meson.build` | +102 / -2 | NEW codec.h/codec.c — `pixelformat_for_profile()` helper mapping VAProfile → V4L2 OUTPUT FOURCC. Register in meson.build sources + headers. | | `f8256e6` (B) | `src/request.h` · `src/config.c` | +24 | request.h: `last_output_pixelformat` field on `struct request_data`. config.c: wire up dead `object_config->pixelformat` at CreateConfig via the helper. IMP-2 amendment. | | `4b2288f` (C) | `src/surface.c` | +78 / -11 | NEW `find_sole_active_pixelformat()` static helper (CRIT-1-corrected: `int iter` per request.c:411-418 pattern). Replace surface.c:173 hardcode with helper call. Extend gate to fire on pixelformat change. Comment updated to mention "codec change" alongside resolution (IMP-1). | **Total**: 3 commits, 188 LOC delta, 5 files modified + 2 NEW. Fork tip: `4b2288f`. Backend installed SHA256 `d7722da742bfcb86a9136b07e6d9a5de23668f37fcad328258966c5338265e82` (pre-iter5b was `6e90b7a9b2c33480…`). ## Phase 5 amendments incorporated | ID | Amendment | Where landed | |---|---|---| | CRIT-1 | iterator type `int` (not `struct object_heap_iterator`); cast-on-return pattern | `surface.c::find_sole_active_pixelformat`, mirrors request.c:411-418 | | IMP-1 | Gate comment mentions codec/profile change alongside resolution | `surface.c:178-200` updated comment block | | IMP-2 | Wire `object_config->pixelformat` at CreateConfig; helper returns FOURCC directly | `config.c::RequestCreateConfig` populates field; `find_sole_active_pixelformat` returns `config_object->pixelformat` directly (one fewer indirection) | | IMP-3 | Commit message precision (hantro substitution to MPEG2_DECODER) | Commit C message body uses precise framing | All 4 Phase 5 amendments incorporated in the actual commits, no follow-up edits needed. ## Phase 1 criteria status (post-Phase-6, pre-Phase-7) | # | Criterion | Build-time signal | Empirical signal | |---|---|---|---| | 1 | HEVC + VP9 + VP8 libva == kdirect == sw | Backend built clean; new SHA installed | Pending Phase 7 sweep | | 2 | MPEG-2 unchanged | hantro path's MPEG2_SLICE mapping unchanged (helper returns MPEG2_SLICE for both VAProfileMPEG2Simple + Main) | Pending Phase 7 sweep | | 3 | H.264 keyframe still decodes | H264_SLICE mapping preserved | Pending Phase 7 sweep | | 4 | Control-payload anchors hold | No code touching control-handling | Pending Phase 7 strace anchor diff | ## Build inputs verified - `pixelformat_for_profile()` symbol resolved: gcc compiled `surface.c::find_sole_active_pixelformat` without missing-symbol errors → codec.h #include chain correct. - `config.h` included in surface.c — `struct object_config` access works → no missing-type errors at compile. - `int iter` pattern: ninja build succeeded → no implicit-int-conversion warning, no struct-undefined error. - `last_output_pixelformat` field added to `struct request_data`: ninja compiled request.c et al. cleanly → no field-already-exists / type-mismatch errors. ## Build environment ``` Linux fresnel 7.0.0-fresnel-fourier #1 SMP PREEMPT Sat May 9 19:24:42 CEST 2026 aarch64 libva 1.23 / meson 1.x / ninja 1.13.2 / gcc 15.2.1 fork tip: 4b2288f backend SHA256: d7722da742bfcb86a9136b07e6d9a5de23668f37fcad328258966c5338265e82 ``` ## Phase 7 readiness The Phase 4 plan's C7 verification matrix is ready to run. Phase 3 sweep script preserved on fresnel at `/tmp/iter5_p3/sweep.sh` and in `iter5_phase3_baseline.tgz`. Expected post-fix hash matrix: | Codec | Pre-fix libva | Expected post-fix libva | kdirect (anchor) | |---|---|---|---| | H.264 1080p30 | `71ac099b…` (keyframe partial) | unchanged — Bug 4 deferred | `1e7a0bc9…` | | HEVC 720p | `06b2c5a0…` (all-zero) | **`9340b832…`** | `9340b832…` | | VP9 720p | `06b2c5a0…` (all-zero) | **`4f1565e8…`** | `4f1565e8…` | | MPEG-2 720p | `19eefbf4…` (worked) | `19eefbf4…` (unchanged) | `19eefbf4…` | | VP8 720p | `06b2c5a0…` (all-zero) | **`136ce5cb…`** | `136ce5cb…` | Phase 7 binary checks: `cmp -s libva_.yuv kdirect_.yuv` for each of {hevc, vp9, vp8}. 3 of 3 must pass. MPEG-2 + H.264 cmp-against-prior-Phase-3-anchor must hold (no regression). ## Substrate state at Phase 6 close - Fork tip `4b2288f` on noether + fresnel + gitea (push via `claude-noether@git.reauktion.de` SSH). - Backend installed at `/usr/lib/dri/v4l2_request_drv_video.so` SHA256 `d7722da742bfcb86a9136b07e6d9a5de23668f37fcad328258966c5338265e82`. - Kernel: `linux-fresnel-fourier 7.0-1` (unchanged; no kernel work in iter5b). - Test fixtures unchanged. - Phase 7 sweep ready to execute.