in mp4parse/src/lib.rs [5802:5849]
fn read_stsd<T: Read>(src: &mut BMFFBox<T>, track: &Track) -> Result<SampleDescriptionBox> {
let (_, flags) = read_fullbox_extra(src)?;
if flags != 0 {
warn!(
"Unexpected `flags` value for SampleDescriptionBox (stsd): {}",
flags
);
}
let description_count = be_u32(src)?.to_usize();
let mut descriptions = TryVec::with_capacity(description_count)?;
let mut iter = src.box_iter();
while descriptions.len() < description_count {
if let Some(mut b) = iter.next_box()? {
let description = match track.track_type {
TrackType::Video => read_video_sample_entry(&mut b),
TrackType::Picture => read_video_sample_entry(&mut b),
TrackType::AuxiliaryVideo => read_video_sample_entry(&mut b),
TrackType::Audio => read_audio_sample_entry(&mut b),
TrackType::Metadata => Err(Error::Unsupported("metadata track")),
TrackType::Unknown => Err(Error::Unsupported("unknown track type")),
};
let description = match description {
Ok(desc) => desc,
Err(Error::Unsupported(_)) => {
// read_{audio,video}_desc may have returned Unsupported
// after partially reading the box content, so we can't
// simply use skip_box_content here.
let to_skip = b.bytes_left();
skip(&mut b, to_skip)?;
SampleEntry::Unknown
}
Err(e) => return Err(e),
};
descriptions.push(description)?;
check_parser_state!(b.content);
} else {
break;
}
}
// Padding could be added in some contents.
skip_box_remain(src)?;
Ok(SampleDescriptionBox { descriptions })
}