* craft-audio: Opus decoder
FilmCraft's `filmcraft-opus` decoder as `craft_audio::opus` behind
`opus-decode`: SILK, hybrid and CELT, every frame size, PLC and FEC,
multistream (`Decoder`) and single stream (`StreamDecoder`), 8-48 kHz
output.
- `TrackDecoder` decodes Opus; mono and stereo without an `OpusHead`
(RTP, MPEG-TS) get a default one. Lost packets use Opus's own
concealment.
- The native read path takes Ogg Opus (pre-skip and end trimming per
RFC 7845), and Opus in Matroska/WebM and MP4, where packet starts
after a seek come from the packets' own lengths.
The RFC 8251 conformance test runs all 36 vectors.
`scripts/fetch-opus-vectors.sh` downloads them (SHA-256 checked) and
the CI test job caches them.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* craft-audio: review fixes, round 1 (#445)
- CELT concealment keeps its pitch in its own field. It reused postfilter_period_old, which the
next good frame's post-filter cross-fades from.
- Matroska Opus seeks: a failed packet read no longer caches a wrong start; a one-byte packet
is read as one byte.
- A malformed OpusHead in Ogg is reported as malformed instead of falling back.
- The libopus oracle tests skip through the testkit, so CRAFT_MEDIA_REQUIRE_ORACLES fails them.
- Decoder::reset documents that it re-arms pre-skip trimming.
- fetch-opus-vectors.sh retries its size probe.
- CI: the vectors are fetched after ffmpeg is installed, and apt's timeout runs as root so a
stalled apt-get is killed and frees the dpkg lock.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* craft-audio: review fixes, round 2 (#445)
- CELT: the noise-based concealment sets skip_plc, as libopus does, so
pitch-based concealment waits for two good frames in a row instead of
extending history that holds noise.
- SILK: decode_only_middle is per call, as in libopus. A lost or mono
frame no longer reuses the mid-only flag from an earlier frame.
- A damaged Opus packet is concealed at its own length (from its TOC and
framing) rather than the previous packet's.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Dylan M. Taylor <dylan@dylanmtaylor.com>