in mp4parse/src/lib.rs [4136:4190]
fn read_moov<T: Read>(f: &mut BMFFBox<T>, context: Option<MediaContext>) -> Result<MediaContext> {
let MediaContext {
mut timescale,
mut tracks,
mut mvex,
mut psshs,
mut userdata,
#[cfg(feature = "meta-xml")]
metadata,
} = context.unwrap_or_default();
let mut iter = f.box_iter();
while let Some(mut b) = iter.next_box()? {
match b.head.name {
BoxType::MovieHeaderBox => {
timescale = parse_mvhd(&mut b)?;
}
BoxType::TrackBox => {
let mut track = Track::new(tracks.len());
read_trak(&mut b, &mut track)?;
tracks.push(track)?;
}
BoxType::MovieExtendsBox => {
mvex = Some(read_mvex(&mut b)?);
debug!("{:?}", mvex);
}
BoxType::ProtectionSystemSpecificHeaderBox => {
let pssh = read_pssh(&mut b)?;
debug!("{:?}", pssh);
psshs.push(pssh)?;
}
BoxType::UserdataBox => {
userdata = Some(read_udta(&mut b));
debug!("{:?}", userdata);
if let Some(Err(_)) = userdata {
// There was an error parsing userdata. Such failures are not fatal to overall
// parsing, just skip the rest of the box.
skip_box_remain(&mut b)?;
}
}
_ => skip_box_content(&mut b)?,
};
check_parser_state!(b.content);
}
Ok(MediaContext {
timescale,
tracks,
mvex,
psshs,
userdata,
#[cfg(feature = "meta-xml")]
metadata,
})
}