iter1 is a characterize-and-baseline iteration. Backend code is unchanged; what Phase 6 executes is criterion refinement + follow-up-issue filing + iteration close artifact. 5 work items for Phase 6: 1. Refine C4 to per-codec SSIM Y floors (VP8 >=1.000 byte-identical, MPEG-2 >=0.9997 IEEE-1180, H.264 documented at ~0.667 no PASS threshold — accepted decoder drift per fresnel iter1 precedent). 2. File kernel-agent [ka:experiment] for HEVC kernel OOPS fix. 3. File kernel-agent [ka:experiment] for VP9 enablement on RK3588 rkvdec (VDPU381/383 path, not RK3399 legacy). 4. File marfrit/libva-v4l2-request-fourier issue for iter39 (3rd-fd probe for AV1). 5. Update + close kernel-agent #6, write iter1_close.md. Phase 7 verification: re-run p3_*.sh at N=1; predict within ±2σ of Phase 3 anchors. Loopback if deviation. Risk register: gitea API filing low risk (claude-noether proven today), other risks small. Documented in plan. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
7.0 KiB
Phase 4 — Plan (iter1)
Drafted 2026-05-16, post-Phase-3-measurements. iter1 is a characterize-and-baseline iteration, not a change-the-system iteration: Phase 3 showed the libva-v4l2-request-fourier backend (hand-built 0c9a7efaab…, source 7ac934e) functions correctly on ampere's clean v7.0-rc3 kernel for the 3 in-scope codecs. Phase 4 plans the closure: criterion refinements, follow-up issue filings, and the iteration close artifact.
No source code changes touch the backend, ffmpeg, mpv, or firefox-fourier in iter1. Each blocker codec (HEVC, VP9, AV1) is a future iteration with its own Phase 0 entry.
What changes (Phase 6 will execute)
1. Refine C4 to per-codec SSIM Y floors
Phase 3 surfaced that the iter1 default C4 (SSIM Y ≥ 0.99 for every codec at frame 720) is the wrong shape. Replace with per-codec floors anchored to Phase 3 observations + memory entries:
| Codec | Original C4 | Refined C4 floor | Basis |
|---|---|---|---|
| H.264 | SSIM Y ≥ 0.99 | document at 0.6676, no PASS threshold (treat as known cumulative drift between libavcodec SW and rkvdec HW; mirrors fresnel iter1 0.6431) | memory feedback_pixel_compare_in_yuv_not_png + fresnel measurements_iter1.md; documented as decoder-tolerance phenomenon, not a regression |
| VP8 | SSIM Y ≥ 0.99 | SSIM Y ≥ 1.000 (byte-identical, all frames) | Phase 3 observed 1.000000 with diff_bytes=0; raises bar instead of lowering it |
| MPEG-2 | SSIM Y ≥ 0.99 | SSIM Y ≥ 0.9997 | memory feedback_mpeg2_hw_sw_idct_precision — hantro IDCT is conformant per IEEE 1180 but ≤3 LSB off SW; Phase 3 observed 0.999720 |
The H.264 entry does not get a PASS threshold for iter1; it's an accepted observation. Future iterations may want to investigate whether a specific x264 encode setting (e.g. -tune psnr, -no-cabac) reduces drift, but that's not iter1 scope.
2. File 3 follow-up issues for blocker codecs
Per the user's policy that ampere stays on a clean kernel and codec-enablement happens via kernel-agent experiments OR backend iterations:
- HEVC kernel OOPS → file an issue against
marfrit/kernel-agentwith prefix[ka:experiment]requesting a candidate fix forrkvdec_hevc_prepare_hw_st_rps(RK3588 mainline rkvdec, NULL/unmapped pointer in__pi_memcmpduring HEVC RPS preparation). Include full Phase 0 dmesg trace + reproducer (ffmpeg -hwaccel vaapi -i bbb_60s_720p.hevc.mp4 -vf hwdownload -f null -). Suggest upstream search: linux-media list mainline -rc1..-rc3 forrkvdecHEVC commits, possibly later -rc has a fix. - VP9 not exposed on RK3588 rkvdec → file an issue against
marfrit/kernel-agentwith prefix[ka:experiment]requesting VP9 enablement on the RK3588 rkvdec variant_ops (per memoryfeedback_rkvdec_patch_reachability: confirm patches target VDPU381/383 path, not the RK3399 legacyrkvdecpath that fresnel uses). Includev4l2-ctl -d /dev/video1 --list-formats-outshowing S264 + S265 only as the current state. - AV1 unprobed by libva backend (third decoder fd) → file an issue against
marfrit/libva-v4l2-request-fourierrequesting iter39: extend the 2-fdrequest_datato a 3-fd or table-driven model, addrequest_device_kind_for_profile()'a' → av1-vpu-dec routing, find AV1 test clip. Pure backend work, no kernel involvement.
Each issue is a discrete deliverable — Phase 6 produces them as final atoms of iter1.
3. Update issue #6 on marfrit/kernel-agent
Add a comment on the original issue with the per-iter1 outcome (bootstrap closed by neighbour, baseline validated for 3/6 codecs, the other 3 spawned as separate issues per the experiment policy). Close #6 once the 3 follow-up issues are created and cross-linked. Don't leave an open umbrella issue that's effectively superseded.
4. Phase 7 verification sweep — re-run Phase 3 measurements
After Phase 6 lands the issues, re-execute p3_engage.sh + p3_bitexact.sh + p3_bench.sh once more (N=1 verification, not N=3 — this is a "still works after issue-filing housekeeping" gate, not a load-bearing measurement). Predicted outcome: bit-for-bit reproduction of the Phase 3 numbers (no state change in iter1 should affect decode behavior). If the verification deviates, Phase 7's loopback edge fires.
5. iter1 close artifact
Write iter1_close.md summarizing: baseline-validated codec set, per-codec C1-C6 results, follow-up issue links, what carries to iter2+.
What does NOT change
/usr/lib/dri/v4l2_request_drv_video.so: still the hand-built0c9a7efaab…. Don't touch — marfrit-packages#17 is the CI-build fix issue, not iter1's problem.linux-ampere-fourier 7.0rc3.kafr1-1: baseline kernel, untouched. Per operator policy, no codec patches on the ampere baseline.- firefox-fourier 150.0.1-5: installed but C7 deferred. No prefs added or removed.
- Source clips in
~/measurements/encoded/: immutable for iter1; carry forward to iter2+ for the blocker-codec iterations. - mpv-fourier, ffmpeg-v4l2-request-fourier: pinned versions, no changes.
Expected outcome (Phase 7 will verify, in Phase 1/3 measurable terms)
| Criterion | Predicted result | Anchor |
|---|---|---|
| C1 (decode completes) | PASS all 3 codecs unchanged | Phase 3 N=1 was clean |
| C2 (HW engagement) | PASS — ioctl counts within ±5 % of Phase 3 (allow for run-to-run noise on probe phase) | strace counts on a closed system are nearly deterministic |
| C3 (frame 0 byte-identical) | PASS all 3 — same sha 3214803d8be74416 |
deterministic decoder for I-frame |
| C4 (frame 720 per refined floors) | PASS — VP8 1.000, MPEG-2 ≥ 0.9997, H.264 documented at ~0.667 ± 0.01 | accumulated drift is RNG-free, should be deterministic |
| C5 (FPS N=1) | within ±1 % of Phase 3 mean — H.264 ~ 461, VP8 ~ 217, MPEG-2 ~ 200 | hardware run-to-run variance is small (Phase 3 σ < 0.4 % CV) |
| C6 (dmesg clean) | PASS — empty diff | as long as Phase 6 doesn't touch HEVC, no oops triggered |
| C7 (firefox-fourier vendor-defaults) | still deferred; rig blocker (Wayland) unchanged | no action in iter1 |
If any Phase 7 measurement deviates >2 σ from the Phase 3 anchor, loop back to Phase 4 — something changed in iter1 that we didn't account for.
Risk register
| Risk | Probability | Mitigation |
|---|---|---|
| Issue-filing API call against gitea fails | low | use claude-noether identity (proven, sibling issues filed today) |
| Phase 7 re-sweep reveals a regression that Phase 3 didn't catch | low — N=1 vs N=3 with same scripts | accept the deviation as the iter1 finding; don't synthesize plausible numbers |
| Some other workload on ampere (kids-media decode, etc.) interferes | very low — ampere is dev gear | no mitigation needed; if it happens, Phase 7 loopback applies |
| User wants iter1 to also include C7 before close | possible | call out the C7 deferral explicitly in iter1_close.md so it's a visible follow-up, not a hidden gap |
Phase 4 close
Plan locked. Phase 5 review next: hand off Phase 0-4 artifacts to a second-model architect for an outside-look.