Keep both halves of a clip file that two play items share
A playlist may point at the same .m2ts from several play items — a seamless split, a looped segment, multiple angles. The file has one set of bytes, so it has one span, and the byte a frame was read from therefore identifies the FILE, not which play item's range it falls in. Placement took the first of them and judged every frame against its marks, so everything past that range's end was treated as material the playlist excludes and dropped: half the clip missing from the rip, with the timeline still charged for its full duration. The offset narrows a frame to the run; only its timestamp can finish the job, and each play item carries its own marks. A frame is now matched against the marks of the entry it actually falls in, falling back to the first when it falls in none, which leaves genuinely-excluded material dropped as before. The test for this construction asserted only that such a playlist is trusted, and never placed a frame from the second range — so the loss it described in prose was invisible to it. It now places one from every range and requires them all to survive. The deferred-mux replay of buffered frames wrote them without their source offset, quietly sending the head of every such title down the timestamp heuristic the rest of this work exists to retire. It passes the offset through now, and the frame writer that omits it is compiled out of the library entirely: no production path can discard provenance any more. Also: the AC-3 buffer-reuse test could not see the regression it named. Feeding equal-sized packets, a fresh allocation per call yields the same capacity as a reused one. It now feeds a large packet then a small one, where only a reused buffer keeps the larger capacity.
This commit is contained in:
@@ -1368,6 +1368,14 @@ impl<W: Write + Seek> MkvMuxer<W> {
|
||||
/// Block and the dependent (right-eye) access unit rides as the
|
||||
/// BlockAdditional under the track's `mvcC` mapping. Such a frame is always a
|
||||
/// `BlockGroup` (never a SimpleBlock), with a `ReferenceBlock` when it is not
|
||||
/// TEST-ONLY. Every production path writes through [`MkvMuxer::write_frame_at`]
|
||||
/// and passes the byte offset the frame was read from; the deferred-mux
|
||||
/// replay of buffered frames was the last one that did not, and it now
|
||||
/// does. Keeping this compiled out of the library means there is no
|
||||
/// production API through which a frame can reach the file with its
|
||||
/// provenance discarded — the placement logic stopped relying on
|
||||
/// timestamps precisely so that could not happen silently.
|
||||
#[cfg(test)]
|
||||
/// a keyframe. `None` for every non-3D frame.
|
||||
pub fn write_frame(
|
||||
&mut self,
|
||||
|
||||
Reference in New Issue
Block a user