fn read_stsd()

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 })
}