Audit round 1 fixes: sparse-track joins, silent drops, and two encoder wraps
A sparse passive track — a subtitle with no event near a clip's mark — was held to the dense-video crossing window, so it stayed on the previous clip's offset until its PTS passed that clip's OUT and every event in between was mistimed by the overlap. Video keeps the tight window, because its backward steps are also B-frame reorder; passive tracks have no reorder, so any backward step into the next clip's range is a join. Frames the marks exclude were dropped without a trace. Dropping is right at a join, but this codebase has shipped complete-looking wrong output before, so the count is kept per track and reported when the mux finishes, alongside the pre-cluster counter that exists for the same reason. A File Identifier Descriptor records its name length in one byte, and the length was narrowed with a cast: a 255-byte name — POSIX NAME_MAX, entirely ordinary — encodes to 256 and wrote zero, which would read every later entry in that directory from the wrong offset. A directory's link count is 16 bits and was computed as 1 + subdirectory count, which the global entry cap alone permits overflowing. Both are refused while planning, where the tree can still be rejected cleanly. The module and struct docs described inference as the whole algorithm; they now say which path decides what.
This commit is contained in:
@@ -1704,6 +1704,20 @@ impl<W: Write + Seek> MkvMuxer<W> {
|
||||
"frames were discarded before the first cluster opened (no track-0 video keyframe had arrived yet); they are absent from the output"
|
||||
);
|
||||
}
|
||||
// Frames the playlist's clip marks excluded are dropped on purpose — a
|
||||
// join legitimately discards the material a disc stores twice — but the
|
||||
// count must not be write-only. Same reasoning as the pre-cluster
|
||||
// counter above: an unexpected VOLUME here is how a title ends up
|
||||
// quietly short while the run reports success.
|
||||
let seam_dropped = self.continuity.dropped_total();
|
||||
if seam_dropped > 0 {
|
||||
tracing::info!(
|
||||
target: "mux",
|
||||
dropped = seam_dropped,
|
||||
frames_written = self.frame_count,
|
||||
"frames outside the playlist's clip marks were dropped at clip joins"
|
||||
);
|
||||
}
|
||||
// The source declared no duration up-front (DURATION was reserved as a
|
||||
// placeholder). Derive the real runtime from the muxed timeline so the
|
||||
// Segment declares it — and so the BPS tags below can be computed.
|
||||
|
||||
Reference in New Issue
Block a user