daemon: AV1 Sequence Header OBU synthesiser + unit test #22
Reference in New Issue
Block a user
Delete Branch "noether/daemon-av1-obu-synth"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Lands the Sequence Header OBU half of the AV1 daemon-side bitstream reconstruction. V4L2 stateless AV1 ships only tile-group bytes in the OUTPUT buffer and passes the sequence header as a structured control (
V4L2_CID_STATELESS_AV1_SEQUENCE); libavcodec's AV1 decoder is full-bitstream, so the daemon needs to reconstruct the OBUs before handing the assembled stream to libavcodec.Frame Header / Frame OBU synthesisers + the integration that wires the assembled OBUs into the decode hot path are separate follow-on modules. This PR is the first piece — module shape, public API, and bit-accurate unit test.
Module shape
Mirrors the H.264 NAL synthesiser (PR #1):
av1_synth_sequence_header_obu(seq, out, out_cap)returning byte count or 0 on overflow/invalid input.bitstream_writer(bsw_put_uis AV1'sf(n);bsw_put_ueis bit-identical to AV1'suvlc;bsw_align_rbspmatches AV1'strailing_bits()).leb128_put,min_bits_for,resolve_subsamplingper §5.5.2) are file-local statics.Synthesis decisions
Fields V4L2 doesn't carry get documented defaults (verbatim in the file header):
reduced_still_picture_header = 0seq_level_idx = 13(level 5.1, supports up to 4K)color_description_present_flag = 0chroma_sample_position = 0(CSP_UNKNOWN)seq_choose_screen_detection_tools = 1,seq_choose_integer_mv = 1Rejection cases
Returns 0 (loud failure) instead of emitting nonsense:
seq_profile > 2bit_depth ∉ {8, 10, 12}seq_profile = 1+ monochrome (spec forces 4:4:4 colour)seq_profile = 1+bit_depth = 12(only profile 2 allows 12-bit)max_frame_{width,height}_minus_1requiring > 16 length bitsout_captoo smallUnit test
test_av1_obu_synth.c, opt-in via-DDAEDALUS_BUILD_TESTS=ON. Exercises four cases bit-by-bit against a hand-computed reference:All green on hertz (aarch64 Arch, gcc -Wall -Wextra -Wpedantic clean). The MSB-first bit reader in the test mirrors
bitstream_writer's emission semantics so any drift in either direction surfaces immediately.Daemon behaviour
Unchanged.
av1_obu_synth.cis compiled into the daemon binary so the symbols are reachable, but no call site is wired yet. Integration lands in the follow-on DAEMON-AV1 patches that also synthesise the Frame Header OBU and bracket the assembled OBUs with a Temporal Delimiter.Refs reauktion/daedalus-v4l2#11 daemon-half; closes daedalus task #144.