ffmpeg -hwaccel vaapi → libva-v4l2-request-fourier →
/dev/video0 → daedalus_v4l2 kernel → REQ_DECODE on the
chardev → daemon FFmpeg decode → byte-exact NV12 (FNV-1a
0x1eb34bfe, same hash the standalone test_m2m_stream
produces for the same 128x96 VP9 keyframe).
The pixel-correct decode through the libva path is the
milestone. What's NOT yet working: libva times out on the
media_request fd because buf_request_complete never fires
(vb->req_obj.req is NULL when buf_done runs — the
S_EXT_CTRLS EINVAL leaves the buffer un-bound to the
request even though the buffer queues anyway). Phase 8.13
fixes the EINVAL so the request bind takes and the
completion signal propagates.
Kernel V4L2 request API integration:
- media_device_ops.req_validate / req_queue = vb2_request_
validate / v4l2_m2m_request_queue (Phase 8.11) —
MEDIA_IOC_REQUEST_ALLOC succeeds.
- vb2_queue.supports_requests = true on OUTPUT queue —
without this v4l2-core rejects S_EXT_CTRLS(REQUEST_VAL).
- vb2_ops.buf_request_complete = daedalus_buf_request_complete
→ v4l2_ctrl_request_complete(req, &ctx->hdl). Without
this v4l2-core WARNs at videobuf2-v4l2.c:440.
- vb2_ops.buf_out_validate: sets field=V4L2_FIELD_NONE on
OUTPUT buf. Required for the same WARN check.
- requires_requests intentionally NOT set: lets the
existing test_m2m_stream (direct QBUF, no request) keep
working alongside the libva path.
Stateless control re-registration:
- Switched from v4l2_ctrl_new_std_compound(NULL p_def) to
v4l2_ctrl_new_custom(&cfg, NULL) — pattern rkvdec /
cedrus / hantro use. v4l2-core auto-fills elem_size +
type from std table (verified: VP9_FRAME elem_size=168,
matches sizeof(struct v4l2_ctrl_vp9_frame)).
- No-op s_ctrl callback so SET requests don't crash —
daemon ignores values, FFmpeg re-parses the bitstream.
Verification on hertz (Pi 5, 6.12.75+rpt-rpi-2712):
ffmpeg -hwaccel vaapi -i vp9_small.ivf …
daemon: REQ_DECODE cookie=1 codec=1 bitstream=1566 bytes capture=128x96 1 planes
daemon: decoder: opened vp9 context
daemon: decoder: OK 128x96 fmt=0 (yuv420p) fnv1a=0x1eb34bfe …
Same FNV-1a hash as the standalone test_m2m_stream produces
for the same VP9 keyframe. End-to-end through libva.
Remaining (Phase 8.13):
- S_EXT_CTRLS EINVAL on V4L2_CID_STATELESS_VP9_FRAME despite
matching elem_size — needs deeper validate-path debugging.
- Once the request bind takes, buf_request_complete fires
on buf_done, request fd signals completion, libva DQBUFs
the decoded NV12.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>