Implements the libva-side portion of issue #11 — replaces PR #10's
no-op AV1 dispatch with a real av1_set_controls that maps VAAPI's
VADecPictureParameterBufferAV1.seq_info_fields + scalar fields onto
struct v4l2_ctrl_av1_sequence (the kernel uAPI control declared at
linux/v4l2-controls.h:2891-2919).
Daemon-track context (issue #11 daemon side, operator-owned):
ffmpeg-vaapi splits the AV1 bitstream client-side and strips the
OBU_SEQUENCE_HEADER before delivery; the V4L2 OUTPUT buffer contains
only OBU_FRAME_HEADER + OBU_TILE_GROUP. libdav1d in the daedalus
daemon cannot parse this — it expects a complete OBU stream. The
daemon side has to synthesise OBU_SEQUENCE_HEADER from the SEQUENCE
ctrl and prepend it to the slice bitstream. This libva-side change
just makes the SEQUENCE ctrl populated and queued via S_EXT_CTRLS;
the daemon track is the consumer.
Three small touch points beyond the new src/av1.{c,h}:
- src/surface.h: add an av1 leaf to surface->params holding
VADecPictureParameterBufferAV1. Slice params intentionally
absent — the daedalus daemon consumes the slice OBU bytes
directly from the OUTPUT buffer; no per-tile-group struct →
OBU re-synthesis required from libva today.
- src/picture.c: copy the picture-param buffer into the new leaf
in RenderPicture, mirror of the per-codec memcpy pattern, plus
call av1_set_controls from codec_set_controls (replacing the
no-op).
- src/meson.build: register src/av1.c.
Sequence-field mapping covers everything VAAPI exposes at the
sequence level (12 of 18 V4L2_AV1_SEQUENCE_FLAG_* bits + the four
scalars). Bits VAAPI doesn't carry at the sequence level
(WARPED_MOTION, REF_FRAME_MVS, SUPERRES, RESTORATION,
SEPARATE_UV_DELTA_Q) stay clear; per-frame consumers (libdav1d via
the daemon, vpu981 via the hardware path) read those from the
OBU_FRAME_HEADER that is already in the slice buffer anyway. See
feedback memory `feedback_vaapi_blind_to_some_hevc_sps_fields` for
the precedent.
Build verified on higgs (Debian 13 trixie, gcc 14.2.0, libva 2.22.0,
linux uAPI v4l2-controls.h sizeof(struct v4l2_ctrl_av1_sequence)==12):
clean meson + ninja link of v4l2_request_drv_video.so, vainfo
enumerates VAProfileAV1Profile0 via daedalus_v4l2 slot, av1_set_controls
symbol present.
Out of scope on this PR (operator-track, issue #11 follow-up):
- daedalus-v4l2 kernel module wire-protocol extension (daedalus_
collect_av1_meta + AV1 ctrl request_setup).
- daedalus daemon OBU synthesiser (~400 LoC AV1 OBU encoder in
daemon/src/av1_obu_synth.{c,h}).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>