diff --git a/crates/codecs/src/avi.rs b/crates/codecs/src/avi.rs index 8855c3a65..5fc7e1aff 100644 --- a/crates/codecs/src/avi.rs +++ b/crates/codecs/src/avi.rs @@ -194,10 +194,11 @@ fn split_frames( let Some(here) = win.get(pos - base..) else { break }; match filmcraft_mpegts::frame_bytes(ts, here) { Some(n) if pos + n <= total => { + let fi = filmcraft_mpegts::frame_info(ts, here); if info.is_none() { - info = filmcraft_mpegts::frame_info(ts, here); + info = fi; } - let k = filmcraft_mpegts::frame_info(ts, here).map_or(0, |f| f.samples); + let k = fi.map_or(0, |f| f.samples); first.push(pieces.len()); let mut p = pos; while p < pos + n { diff --git a/crates/mpegts/src/ts.rs b/crates/mpegts/src/ts.rs index b73666e90..f1a7b69a0 100644 --- a/crates/mpegts/src/ts.rs +++ b/crates/mpegts/src/ts.rs @@ -114,11 +114,10 @@ impl PesAsm { } let before = self.hdr.len(); self.hdr.extend_from_slice(payload); - if let Some(h) = pes::parse(&self.hdr) - && self.hdr.len() >= h.header_len - { + // `pes::parse` only succeeds once the whole header (`header_len` bytes) is buffered + if let Some(h) = pes::parse(&self.hdr) { self.waiting = false; - let skip = (h.header_len - before).min(payload.len()); + let skip = h.header_len.saturating_sub(before).min(payload.len()); return (Some(h), &payload[skip..]); } if self.hdr.len() > 1024 || (self.hdr.len() >= 6 && !(self.hdr[0] == 0 && self.hdr[1] == 0 && self.hdr[2] == 1)) {