@@ -752,10 +752,19 @@ pub struct MetadataBox {
752
752
pub sort_album_artist : Option < TryString > ,
753
753
/// The name of the composer to sort by 'soco'
754
754
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 {
755
764
/// XML metadata
756
- pub xml : Option < TryString > ,
765
+ StringXmlBox ( TryString ) ,
757
766
/// Binary XML metadata
758
- pub bxml : Option < TryVec < u8 > > ,
767
+ BinaryXmlBox ( TryVec < u8 > ) ,
759
768
}
760
769
761
770
/// Internal data structures.
@@ -4062,15 +4071,18 @@ fn read_udta<T: Read>(src: &mut BMFFBox<T>) -> Result<UserdataBox> {
4062
4071
Ok ( udta)
4063
4072
}
4064
4073
4065
- /// Parse a metadata box inside a udta box
4074
+ /// Parse the meta box
4075
+ /// See ISOBMFF (ISO 14496-12:2015) § 8.111.
4066
4076
fn read_meta < T : Read > ( src : & mut BMFFBox < T > ) -> Result < MetadataBox > {
4067
4077
let ( _, _) = read_fullbox_extra ( src) ?;
4068
4078
let mut iter = src. box_iter ( ) ;
4069
4079
let mut meta = MetadataBox :: default ( ) ;
4070
4080
while let Some ( mut b) = iter. next_box ( ) ? {
4071
4081
match b. head . name {
4072
4082
BoxType :: MetadataItemListEntry => read_ilst ( & mut b, & mut meta) ?,
4083
+ #[ cfg( feature = "meta-xml" ) ]
4073
4084
BoxType :: MetadataXMLBox => read_xml_ ( & mut b, & mut meta) ?,
4085
+ #[ cfg( feature = "meta-xml" ) ]
4074
4086
BoxType :: MetadataBXMLBox => read_bxml ( & mut b, & mut meta) ?,
4075
4087
_ => skip_box_content ( & mut b) ?,
4076
4088
} ;
@@ -4080,18 +4092,24 @@ fn read_meta<T: Read>(src: &mut BMFFBox<T>) -> Result<MetadataBox> {
4080
4092
}
4081
4093
4082
4094
/// Parse a XML box inside a meta box
4095
+ /// See ISOBMFF (ISO 14496-12:2015) § 8.11.2
4096
+ #[ cfg( feature = "meta-xml" ) ]
4083
4097
fn 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 ( ) ?) ) ;
4087
4102
Ok ( ( ) )
4088
4103
}
4089
4104
4090
4105
/// Parse a Binary XML box inside a meta box
4106
+ /// See ISOBMFF (ISO 14496-12:2015) § 8.11.2
4107
+ #[ cfg( feature = "meta-xml" ) ]
4091
4108
fn 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 ( ) ?) ) ;
4095
4113
Ok ( ( ) )
4096
4114
}
4097
4115
0 commit comments