in mp4parse/src/lib.rs [3597:3649]
fn read_ipco<T: Read>(
src: &mut BMFFBox<T>,
strictness: ParseStrictness,
) -> Result<TryHashMap<PropertyIndex, ItemProperty>> {
let mut properties = TryHashMap::with_capacity(ItemPropertiesBox::MIN_PROPERTIES)?;
let mut index = PropertyIndex(1); // ipma uses 1-based indexing
let mut iter = src.box_iter();
while let Some(mut b) = iter.next_box()? {
let property = match b.head.name {
BoxType::AuxiliaryTypeProperty => ItemProperty::AuxiliaryType(read_auxc(&mut b)?),
BoxType::AV1CodecConfigurationBox => ItemProperty::AV1Config(read_av1c(&mut b)?),
BoxType::ColourInformationBox => ItemProperty::Colour(read_colr(&mut b, strictness)?),
BoxType::ImageMirror => ItemProperty::Mirroring(read_imir(&mut b)?),
BoxType::ImageRotation => ItemProperty::Rotation(read_irot(&mut b)?),
BoxType::ImageSpatialExtentsProperty => {
ItemProperty::ImageSpatialExtents(read_ispe(&mut b)?)
}
BoxType::PixelAspectRatioBox => ItemProperty::PixelAspectRatio(read_pasp(&mut b)?),
BoxType::PixelInformationBox => ItemProperty::Channels(read_pixi(&mut b)?),
other_box_type => {
// Even if we didn't do anything with other property types, we still store
// a record at the index to identify invalid indices in ipma boxes
skip_box_remain(&mut b)?;
let item_property = match other_box_type {
BoxType::AV1LayeredImageIndexingProperty => ItemProperty::LayeredImageIndexing,
BoxType::CleanApertureBox => ItemProperty::CleanAperture,
BoxType::LayerSelectorProperty => ItemProperty::LayerSelection,
BoxType::OperatingPointSelectorProperty => ItemProperty::OperatingPointSelector,
_ => {
warn!("No ItemProperty variant for {:?}", other_box_type);
ItemProperty::Unsupported(other_box_type)
}
};
debug!("Storing empty record {:?}", item_property);
item_property
}
};
properties.insert(index, property)?;
index = PropertyIndex(
index
.0
.checked_add(1) // must include ignored properties to have correct indexes
.ok_or_else(|| Error::from(Status::IpcoIndexOverflow))?,
);
check_parser_state!(b.content);
}
Ok(properties)
}