in mp4parse/src/lib.rs [4616:4655]
fn read_mdhd<T: Read>(src: &mut BMFFBox<T>) -> Result<MediaHeaderBox> {
let (version, _) = read_fullbox_extra(src)?;
let (timescale, duration) = match version {
1 => {
// Skip 64-bit creation and modification times.
skip(src, 16)?;
// 64 bit duration.
(be_u32(src)?, be_u64(src)?)
}
0 => {
// Skip 32-bit creation and modification times.
skip(src, 8)?;
// 32 bit duration.
let timescale = be_u32(src)?;
let duration = {
// Since we convert the 32-bit duration to 64-bit by
// upcasting, we need to preserve the special all-1s
// ("unknown") case by hand.
let d = be_u32(src)?;
if d == u32::MAX {
u64::MAX
} else {
u64::from(d)
}
};
(timescale, duration)
}
_ => return Status::MdhdBadVersion.into(),
};
// Skip uninteresting fields.
skip(src, 4)?;
Ok(MediaHeaderBox {
timescale,
duration,
})
}