Iteration 1 of the campaign 8(+1)-phase loop opens following the
campaign Phase 0 close (b74551b). Per the suggested order in
phase0_evidence/2026-05-07/cross_validator_traces.md, iter1 attacks
MPEG-2 — the cheapest fix in the codec status sweep (mpeg2.c is
already compiled, src/config.c has the case statements, but
vaCreateConfig returns 12 / UNSUPPORTED_PROFILE).
Locked research question:
Make MPEG-2 the second codec to pass boolean-correctness on
fresnel via the libva-v4l2-request-fourier path —
mpv --hwdec=vaapi-copy bbb_720p10s_mpeg2.ts engages the backend
cleanly and DMA-BUF GL import yields HW pixels byte-identical
to a software-decoded reference for the same frames.
Phase 1 success criterion (5 boolean checks, all must be green):
1. vainfo: VAProfileMPEG2Simple + VAProfileMPEG2Main still
enumerated on the hantro env binding (regression check).
2. vaCreateConfig(VAProfileMPEG2Main, VLD): VA_STATUS_SUCCESS.
3. mpv --hwdec=vaapi-copy --frames=2 --vo=null on
bbb_720p10s_mpeg2.ts: engages backend, exit 0, no
"Failed to create decode configuration" lines.
4. mpv --hwdec=vaapi --vo=image (DMA-BUF GL import) at +02s
seek: 2 distinct frames hash-equal to SW reference frames
and hash-differ from each other.
5. T4 H.264 regression: re-run T4 incantation, hashes match
f623d5f7... and 7d7bc6f2... reference values.
Mechanism the question targets:
The kernel + driver path is solid (cross_validator_traces.md —
ffmpeg-v4l2request decodes the same fixture exit 0). vaCreateConfig
rejection must be downstream of src/config.c:64-65's case match
(both VAProfileMPEG2Simple and VAProfileMPEG2Main are present in
the validation switch) but upstream of return-success. Plausible
suspects for Phase 2 source-read:
- V4L2 capability probe (e.g., VIDIOC_TRY_FMT against MG2S) that
fails because the libva backend was bound to /dev/video5 but
is checking format against the wrong codec list.
- Device-discovery routing reaches a default-reject because
bound device didn't match an expected codec-to-device map.
- media_request allocation step fails on /dev/media2 for some
MPEG-2-specific reason.
- iter6/iter7 regression in the dispatch-by-profile path that
broke MPEG-2 silently because nobody on libva-multiplanar
tested it (iter5 close: "MPEG-2 was iter1 backlog, dropped
at iter6 close because A55 CPU handles it fine" — fresnel
runs A53 so the disposition doesn't transfer).
Phase 4 plan must cite the contract before patching, per
feedback_dev_process.md Phase 6 contract-before-code: read kernel
drivers/media/platform/verisilicon/hantro_mpeg2.c, read FFmpeg
downstream libavcodec/v4l2_request_mpeg2.c, state the MPEG-2
control-submission contract explicitly before any code lands.
Predecessor carry-over (state vs data) explicit per
feedback_dev_process.md Phase 0 + feedback_replicate_baseline_first.md:
Carries forward (re-verified in campaign Phase 0):
- iter8 master fork (65969da) installed on fresnel,
vainfo enumeration confirmed
- bbb_720p10s_mpeg2.ts fixture (5.3 MB, MPEG-2 Main, 720p,
10s, MPEG-TS) on fresnel ~/fourier-test/, provenance
documented in test_fixtures.md
- hantro-vpu-dec /dev/video5 + /dev/media2 binding
- Cross-validator anchor: ffmpeg-v4l2request mpeg2 trace
captured (5 S_EXT_CTRLS, 4 REQUEST_ALLOC, 4 DMA_BUF_SYNC)
- T4 reference hashes for H.264 regression check
Does NOT carry forward (re-acquire if needed):
- ohm/RK3568 hantro MPEG-2 behaviour — different kernel
driver variant inside drivers/media/platform/verisilicon/
- Pre-iter6 libva-multiplanar MPEG-2 trace data (untested
at iter6 close)
Open questions inherited:
- Cache-stale vaDeriveImage bug class on RK3399 (T4) —
iter1 uses DMA-BUF GL import for verify; Phase 4 cross-
cutting fix is not iter1-scoped
- Architectural divergence ffmpeg vs our backend (EXPBUF +
DMA_BUF_SYNC vs cap_pool + vaDeriveImage) — Phase 4
design decision, not iter1-blocking
Out-of-scope (LOCKED): HEVC/VP9/VP8 (later iterations); vaDerive
Image cache-stale fix (Phase 4 cross-cutting); chromium-fourier
149 install (Phase 0 follow-up to iter1 substrate, non-gating);
performance metrics (Phase 1+ separate iteration); long-duration
stress (>10s); other MPEG-2 containers beyond MPEG-TS;
upstream engagement.
Iter1 Phase 2 source-read targets:
- src/config.c::RequestCreateConfig (rejection site)
- src/picture.c MPEG-2 dispatch path
- src/mpeg2.c set-controls path
- kernel drivers/media/platform/verisilicon/hantro_mpeg2.c
- FFmpeg downstream libavcodec/v4l2_request_mpeg2.c
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>