* Fix WebVTT-in-MP4 output by starting the aux writer
The ISOBMFF muxer advertises WebVTT as a supported subtitle codec and maps
it to the wvtt sample entry, but IsobmffMuxer.start() never calls
auxWriter.start(). The aux writer builds subtitle sample boxes in memory, so
the first box write for any subtitle track hits its started === false assert
and muxing fails.
Start the aux writer alongside the main writer so WebVTT subtitle tracks can
be written to MP4/MOV.
* Move code around, add simple WebVTT muxing test
---------
Co-authored-by: hikari <[email protected]>
Co-authored-by: Vanilagy <[email protected]>
* Account for multi-frame Opus packets when computing packet duration
parseOpusTocByte only read the config field of the TOC byte and always
assumed a single frame per packet. Per RFC 6716 section 3.2, a packet may
carry 1, 2 or an arbitrary number of frames, encoded in the two low bits of
the TOC byte (plus the frame count byte for code 3), and its duration is the
frame duration times the frame count.
As a result, the Ogg muxer wrote granule positions that advanced slower than
the actual audio. Chromium's MediaRecorder packs three 20 ms frames per Opus
packet, so remuxing WebM/Opus to Ogg/Opus produced files declaring a third of
their real duration: a 5.7 s recording ended with a final granule position of
99840 (2.08 s). Decoders that trust the container then truncate the audio.
* Clean up
---------
Co-authored-by: Vanilagy <[email protected]>
* Support QuickTime nclc color information
* Tighten QuickTime nclc color test fixture
* Make QuickTime muxer write nclc color box
---------
Co-authored-by: Vanilagy <[email protected]>
* fix: ensure at least one track per type is enabled for Apple ecosystem compatibility
* Add ensureOneEnabledTrack() to ISOBMFF muxer
* Add test case
---------
Co-authored-by: Vanilagy <[email protected]>
Sibling case to #308: when a fragmented MP4 segment begins with a sidx
box (no ftyp/styp/moof at the file root), Mp4InputFormat._canReadInput
returned false, causing Input.getTracks() to throw
UnsupportedInputFormatError.
This shape is standard in CMAF when the DASH on-demand profile is used
or when HLS playlists are derived from one (Vimeo's vod-adaptive-ak CDN,
for example). The segment is still a valid ISOBMFF fragment — the sidx
just sits before the moof.
Adds 'sidx' alongside the existing 'moof' check so the format probe
accepts these segments, and a focused regression test that fails on
the previous behaviour.