Files
daedalus-fourier/docs/phase8_status.md
T
marfrit fd55f5ebc1 Phase 8 status doc — surfacing V4L2 architecture to user
Per goal "c8p3..c8p7, then p8 — surface if user intervention is
required": this is the surface point.

Kernel-library work is complete (cycles 1-8 all dispatchable via
public API, all CPU paths bit-exact, 3 QPU paths bit-exact, 3
opportunistic-QPU paths shader-exists-API-TODO).

V4L2 wrapper architecture needs 4 user decisions:
- Q1: Option A (v4l2loopback) / B (kernel V4L2 shim) / C (libva direct)
- Q2: Parser source: FFmpeg-vendored / dav1d+libvpx mix / FFmpeg-dlopen
- Q3: In-repo or sibling repo (daedalus-v4l2)?
- Q4: End-to-end test target (tiny clips / 1080p30 / both)

Recommended defaults (A / γ / sibling / both) documented;
explicit confirmation requested before committing to days of work
that locks in months of follow-on choices.

Mechanical TODOs that can proceed in parallel without blocking V4L2
decision: cycle 3+5+8 opportunistic-QPU dispatch wiring through API,
or cycle 9 (H.264 luma qpel MC, predicted CPU-only per cycle 6/7
pattern).

24 commits pushed to marfrit/daedalus-fourier this autonomous arc.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 14:46:24 +00:00

137 lines
5.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
phase: 8
status: kernel-library complete; V4L2 wrapper needs user decisions
date_opened: 2026-05-18
prereqs: cycles 1-8 closed (all 3 codecs covered)
---
# Phase 8 status — user-intervention point
Per the goal "c8p3..c8p7, then p8 — surface if user intervention
is required": Phase 8's kernel-library work is **complete enough
to surface**. The V4L2 deployment layer needs decisions that
weren't covered in `docs/phase8_scoping.md` and that I should
NOT make unilaterally because they affect days of follow-on work
in a separate (sibling) project.
## What's done in Phase 8 so far
### Public API (`include/daedalus.h` + `src/daedalus_core.c`)
Stable C API surface covering all 8 cycles:
| Kernel | Public API entry | Recipe | Status |
|---|---|---|---|
| VP9 IDCT 8×8 | `daedalus_dispatch_vp9_idct8` | QPU | CPU+QPU+AUTO wired, bit-exact |
| VP9 LPF wd=4 | `daedalus_dispatch_vp9_lpf4` | QPU | CPU+QPU+AUTO wired, bit-exact |
| VP9 MC 8h | `daedalus_dispatch_vp9_mc_8h` | CPU | CPU wired; QPU returns -1 |
| VP9 LPF wd=8 | `daedalus_dispatch_vp9_lpf8` | QPU | CPU+QPU+AUTO wired, bit-exact |
| AV1 CDEF 8×8 | `daedalus_dispatch_cdef_8x8` | CPU | CPU wired; QPU returns -1 |
| H.264 IDCT 4×4 | `daedalus_dispatch_h264_idct4` | CPU | CPU wired (no QPU shader exists) |
| H.264 IDCT 8×8 | `daedalus_dispatch_h264_idct8` | CPU | CPU wired (no QPU shader exists) |
| H.264 deblock luma-v | `daedalus_dispatch_h264_deblock_luma_v` | CPU | CPU wired; QPU dispatch via API TODO (shader exists, just not API-wired) |
`daedalus_recipe_substrate_for(kernel)` returns the verdict
substrate; `_recipe_dispatch_*` wrappers default to AUTO routing.
### Smoke tests (all passing)
- `test_api_idct` — VP9 IDCT, CPU+QPU+AUTO, 4096/4096
- `test_api_lpf` — VP9 LPF wd=4 + wd=8, CPU+QPU+AUTO, 2048/2048
- `test_api_h264` — H.264 IDCT 4×4, IDCT 8×8, deblock luma-v
(CPU only), 2048/2048 each
### What's mechanically TODO (not blocking V4L2 surface decision)
- Opportunistic-QPU dispatch through API for cycles 3 (MC),
5 (CDEF), 8 (H.264 deblock). The shaders exist; just need
the wiring pattern from `dispatch_idct8_qpu` repeated.
- ~1 hour each per kernel. Can be done in parallel with V4L2 work
by anyone (myself in a later session, or any consumer).
## V4L2 wrapper — user decision points
`docs/phase8_scoping.md` outlined 3 architecture options
(A/B/C). I tentatively picked Option A (userspace
v4l2loopback) in the scoping doc. Before committing 1+ week
of work, I need user input on:
### Q1. V4L2 architecture choice (A / B / C)?
- **Option A** (userspace v4l2loopback): documented as my
recommendation. Pros: no kernel module. Cons: v4l2loopback is
loosely maintained; DRM PRIME / dmabuf integration awkward.
- **Option B** (tiny kernel V4L2 shim + userspace daemon over
chardev): real `/dev/videoNN`. Pros: proper DRM PRIME. Cons:
kernel module work, cross-process buffer marshaling.
- **Option C** (direct libva backend, skip V4L2): contradicts
`project_consumer_target.md` decision to use V4L2 path; would
require updating that memory entry first.
### Q2. Bitstream parser source?
To actually decode a frame we need: bitstream parse → block
metadata → per-block dispatch. The parser is huge.
- **Option α**: Vendor FFmpeg's VP9/AV1/H.264 parsers as additional
LGPL-2.1+ source (substantial: thousands of LOC). Daedalus
becomes ~50 % parser code by volume.
- **Option β**: Vendor dav1d (BSD-2-Clause) for AV1, libvpx for
VP9, and ??? for H.264. Multi-source mix; license-clean.
- **Option γ**: Use FFmpeg as a SHARED LIBRARY at runtime
(`dlopen`), drive its parser via API and dispatch the per-block
ops to daedalus. Lightest. Probably easiest for v1.
### Q3. Phase 8 scope: in-repo or sibling repo?
Per `project_consumer_target`, `libva-v4l2-request-fourier`
itself is a separate sibling. The daedalus-fourier core library
(this repo) probably exposes the kernel API and a thin demo
program; the V4L2 driver lives in a new sibling.
- **Option in**: do Phase 8 inside daedalus-fourier as
`src/v4l2_wrapper/` or similar.
- **Option sibling**: open `daedalus-v4l2` sibling repo,
daedalus-fourier exports only the kernel API.
### Q4. End-to-end test target?
What clip and what success criterion? Options:
- Tiny test clips (e.g., a 320×240 VP9 clip from FFmpeg test suite,
decoded to PNG, compared to reference).
- Real 1080p30 H.264 clip (e.g., YouTube-style sample), with
timing-based success ("decode at ≥30 fps wall-clock").
- Both.
## Recommended next moves (my picks, but confirm please)
If I had to pick without your input:
- Q1: Option A (v4l2loopback) — sticking with scoping doc.
- Q2: Option γ (dlopen FFmpeg) — lowest scope, fastest to v1.
- Q3: sibling repo `daedalus-v4l2` — per consumer-target memory.
- Q4: both — start with tiny test clips for M1, then 1080p30 for
timing.
But these are real architecture choices that lock in months of
follow-on work. Confirm before I proceed.
## Optional: continue the mechanical TODOs now
While you decide on the V4L2 surface, I could continue with the
non-blocking work:
- Wire opportunistic-QPU paths for cycles 3, 5, 8 through the
API (3 × ~1 hour each)
- Or: start cycle 9 (H.264 luma qpel MC) — predicted CPU only
per the cycle 6/7 pattern, but worth measuring
Let me know which to pick up while V4L2 architecture is decided
(or in parallel if you want both threads).
## Cycles 1-8 summary state
8 cycles closed. 3 QPU-deployed (VP9 IDCT/LPF), 3 CPU-deployed
(VP9 MC, H.264 IDCT 4×4, H.264 IDCT 8×8), 2 opportunistic-helper
(AV1 CDEF, H.264 deblock). Public API exposes all 8 with
recipe-default routing and explicit-override support. ~24
commits pushed to `marfrit/daedalus-fourier` on gitea.