in mp4parse/src/lib.rs [4730:4766]
fn read_ctts<T: Read>(src: &mut BMFFBox<T>) -> Result<CompositionOffsetBox> {
let (version, _) = read_fullbox_extra(src)?;
let counts = be_u32(src)?;
if counts
.checked_mul(8)
.is_none_or(|bytes| u64::from(bytes) > src.bytes_left())
{
return Status::CttsBadSize.into();
}
let mut offsets = TryVec::with_capacity(counts.to_usize())?;
for _ in 0..counts {
let (sample_count, time_offset) = match version {
// According to spec, Version0 shoule be used when version == 0;
// however, some buggy contents have negative value when version == 0.
// So we always use Version1 here.
0..=1 => {
let count = be_u32(src)?;
let offset = TimeOffsetVersion::Version1(be_i32(src)?);
(count, offset)
}
_ => {
return Status::CttsBadVersion.into();
}
};
offsets.push(TimeOffset {
sample_count,
time_offset,
})?;
}
check_parser_state!(src.content);
Ok(CompositionOffsetBox { samples: offsets })
}