mux/mkv: video-only timeline epochs + finer 0.1ms TimestampScale
Fixes corrupt MKV seek index on single-clip titles with many interleaved tracks (Top Gun UHD: 2 video, 11 audio, 32 PGS). TimelineContinuity previously shared one high_ns frontier + offset_ns across ALL tracks. A sparse, lagging non-video frame (subtitle/audio) ratcheted the frontier up; the next normal video frame then sat >3s below it and was misread as a clip-boundary discontinuity, permanently bumping offset_ns. On a one-clip title this fired thousands of times and inflated Cue/cluster timestamps into the billions of ms, destroying the seek index (ffmpeg then seeked to wrong positions and emitted spurious 'Could not find ref with POC N' errors). Now only the VIDEO track drives epoch decisions: video alone advances the frontier and opens a new epoch on a real backward PTS jump. Non-video tracks are remapped under the current offset and never touch the frontier or offset. A lagging non-video tail straggler at a genuine multi-clip boundary (old-epoch raw PTS under the new offset) is recognised via the previous offset and remapped to the seam, so it neither flies forward nor forces a back/forward-dated split cluster. Genuine multi-clip seamless rebasing is preserved. Also drop TimestampScale from 1ms to 0.1ms (100_000 ns/tick) so 23.976fps frames and 0.833ms TrueHD AUs stop colliding on a single tick (the source of the non-monotonic-DTS warnings and the audio cadence flattening). The finer scale shrinks the i16 block-relative span to ~3.27s, so: cluster duration is set to 2s nominal (keeps keyframe-driven clusters within the i16 range for typical GOPs), and the i16-overflow cluster-split path now emits a Cue for the split cluster so the seek index has no gaps. Regression tests: single-clip late-subtitle must not inflate offset_ns; non-video must not advance the frontier; non-video straggler remapped to seam at a real boundary; every cluster (incl. i16-split) carries a Cue. Existing tick/duration assertions updated for the new scale.
This commit is contained in:
+478
-261
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user