@@ -752,10 +752,19 @@ pub struct MetadataBox {
752752 pub sort_album_artist : Option < TryString > ,
753753 /// The name of the composer to sort by 'soco'
754754 pub sort_composer : Option < TryString > ,
755+ /// Metadata
756+ #[ cfg( feature = "meta-xml" ) ]
757+ pub xml : Option < XmlBox > ,
758+ }
759+
760+ /// See ISOBMFF (ISO 14496-12:2015) § 8.11.2.1
761+ #[ cfg( feature = "meta-xml" ) ]
762+ #[ derive( Debug ) ]
763+ pub enum XmlBox {
755764 /// XML metadata
756- pub xml : Option < TryString > ,
765+ StringXmlBox ( TryString ) ,
757766 /// Binary XML metadata
758- pub bxml : Option < TryVec < u8 > > ,
767+ BinaryXmlBox ( TryVec < u8 > ) ,
759768}
760769
761770/// Internal data structures.
@@ -4062,15 +4071,18 @@ fn read_udta<T: Read>(src: &mut BMFFBox<T>) -> Result<UserdataBox> {
40624071 Ok ( udta)
40634072}
40644073
4065- /// Parse a metadata box inside a udta box
4074+ /// Parse the meta box
4075+ /// See ISOBMFF (ISO 14496-12:2015) § 8.111.
40664076fn read_meta < T : Read > ( src : & mut BMFFBox < T > ) -> Result < MetadataBox > {
40674077 let ( _, _) = read_fullbox_extra ( src) ?;
40684078 let mut iter = src. box_iter ( ) ;
40694079 let mut meta = MetadataBox :: default ( ) ;
40704080 while let Some ( mut b) = iter. next_box ( ) ? {
40714081 match b. head . name {
40724082 BoxType :: MetadataItemListEntry => read_ilst ( & mut b, & mut meta) ?,
4083+ #[ cfg( feature = "meta-xml" ) ]
40734084 BoxType :: MetadataXMLBox => read_xml_ ( & mut b, & mut meta) ?,
4085+ #[ cfg( feature = "meta-xml" ) ]
40744086 BoxType :: MetadataBXMLBox => read_bxml ( & mut b, & mut meta) ?,
40754087 _ => skip_box_content ( & mut b) ?,
40764088 } ;
@@ -4080,18 +4092,24 @@ fn read_meta<T: Read>(src: &mut BMFFBox<T>) -> Result<MetadataBox> {
40804092}
40814093
40824094/// Parse a XML box inside a meta box
4095+ /// See ISOBMFF (ISO 14496-12:2015) § 8.11.2
4096+ #[ cfg( feature = "meta-xml" ) ]
40834097fn read_xml_ < T : Read > ( src : & mut BMFFBox < T > , meta : & mut MetadataBox ) -> Result < ( ) > {
4084- let ( _, _) = read_fullbox_extra ( src) ?;
4085- let size = src. content . limit ( ) ;
4086- meta. xml = Some ( read_buf ( & mut src. content , size) ?) ;
4098+ if read_fullbox_version_no_flags ( src) ? != 0 {
4099+ return Err ( Error :: Unsupported ( "unsupported XmlBox version" ) ) ;
4100+ }
4101+ meta. xml = Some ( XmlBox :: StringXmlBox ( src. read_into_try_vec ( ) ?) ) ;
40874102 Ok ( ( ) )
40884103}
40894104
40904105/// Parse a Binary XML box inside a meta box
4106+ /// See ISOBMFF (ISO 14496-12:2015) § 8.11.2
4107+ #[ cfg( feature = "meta-xml" ) ]
40914108fn read_bxml < T : Read > ( src : & mut BMFFBox < T > , meta : & mut MetadataBox ) -> Result < ( ) > {
4092- let ( _, _) = read_fullbox_extra ( src) ?;
4093- let size = src. content . limit ( ) ;
4094- meta. bxml = Some ( read_buf ( & mut src. content , size) ?) ;
4109+ if read_fullbox_version_no_flags ( src) ? != 0 {
4110+ return Err ( Error :: Unsupported ( "unsupported XmlBox version" ) ) ;
4111+ }
4112+ meta. xml = Some ( XmlBox :: BinaryXmlBox ( src. read_into_try_vec ( ) ?) ) ;
40954113 Ok ( ( ) )
40964114}
40974115
0 commit comments