in mp4parse/src/lib.rs [2926:2956]
fn read_iref<T: Read>(src: &mut BMFFBox<T>) -> Result<TryVec<SingleItemTypeReferenceBox>> {
let mut item_references = TryVec::new();
let version = read_fullbox_version_no_flags(src)?;
if version > 1 {
return Err(Error::Unsupported("iref version"));
}
let mut iter = src.box_iter();
while let Some(mut b) = iter.next_box()? {
trace!("read_iref parsing {:?} referenceType", b.head.name);
let from_item_id = ItemId::read(&mut b, version)?;
let reference_count = be_u16(&mut b)?;
item_references.reserve(reference_count.to_usize())?;
for _ in 0..reference_count {
let to_item_id = ItemId::read(&mut b, version)?;
if from_item_id == to_item_id {
return Status::IrefRecursion.into();
}
item_references.push(SingleItemTypeReferenceBox {
item_type: b.head.name.into(),
from_item_id,
to_item_id,
})?;
}
check_parser_state!(b.content);
}
trace!("read_iref -> {:#?}", item_references);
Ok(item_references)
}