@@ -752,6 +752,10 @@ 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+ /// XML metadata
756+ pub xml : Option < TryString > ,
757+ /// Binary XML metadata
758+ pub bxml : Option < TryVec < u8 > > ,
755759}
756760
757761/// Internal data structures.
@@ -763,6 +767,7 @@ pub struct MediaContext {
763767 pub mvex : Option < MovieExtendsBox > ,
764768 pub psshs : TryVec < ProtectionSystemSpecificHeaderBox > ,
765769 pub userdata : Option < Result < UserdataBox > > ,
770+ pub metadata : Option < Result < MetadataBox > > ,
766771}
767772
768773/// An ISOBMFF item as described by an iloc box. For the sake of avoiding copies,
@@ -2307,6 +2312,11 @@ pub fn read_mp4<T: Read>(f: &mut T) -> Result<MediaContext> {
23072312 BoxType :: MovieBox => {
23082313 context = Some ( read_moov ( & mut b, context) ?) ;
23092314 }
2315+ BoxType :: MetadataBox => {
2316+ if let Some ( ctx) = & mut context {
2317+ ctx. metadata = Some ( read_meta ( & mut b) ) ;
2318+ }
2319+ }
23102320 _ => skip_box_content ( & mut b) ?,
23112321 } ;
23122322 check_parser_state ! ( b. content) ;
@@ -2352,6 +2362,7 @@ fn read_moov<T: Read>(f: &mut BMFFBox<T>, context: Option<MediaContext>) -> Resu
23522362 mut mvex,
23532363 mut psshs,
23542364 mut userdata,
2365+ mut metadata,
23552366 } = context. unwrap_or_default ( ) ;
23562367
23572368 let mut iter = f. box_iter ( ) ;
@@ -2394,6 +2405,7 @@ fn read_moov<T: Read>(f: &mut BMFFBox<T>, context: Option<MediaContext>) -> Resu
23942405 mvex,
23952406 psshs,
23962407 userdata,
2408+ metadata,
23972409 } )
23982410}
23992411
@@ -4058,13 +4070,31 @@ fn read_meta<T: Read>(src: &mut BMFFBox<T>) -> Result<MetadataBox> {
40584070 while let Some ( mut b) = iter. next_box ( ) ? {
40594071 match b. head . name {
40604072 BoxType :: MetadataItemListEntry => read_ilst ( & mut b, & mut meta) ?,
4073+ BoxType :: MetadataXMLBox => read_xml_ ( & mut b, & mut meta) ?,
4074+ BoxType :: MetadataBXMLBox => read_bxml ( & mut b, & mut meta) ?,
40614075 _ => skip_box_content ( & mut b) ?,
40624076 } ;
40634077 check_parser_state ! ( b. content) ;
40644078 }
40654079 Ok ( meta)
40664080}
40674081
4082+ /// Parse a XML box inside a meta box
4083+ 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) ?) ;
4087+ Ok ( ( ) )
4088+ }
4089+
4090+ /// Parse a Binary XML box inside a meta box
4091+ 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) ?) ;
4095+ Ok ( ( ) )
4096+ }
4097+
40684098/// Parse a metadata box inside a udta box
40694099fn read_ilst < T : Read > ( src : & mut BMFFBox < T > , meta : & mut MetadataBox ) -> Result < ( ) > {
40704100 let mut iter = src. box_iter ( ) ;
0 commit comments