@@ -21,7 +21,7 @@ pub enum MetaBox {
2121 hdlr : HdlrBox ,
2222
2323 #[ serde( skip) ]
24- data : Vec < u8 > ,
24+ data : Vec < ( BoxType , Vec < u8 > ) > ,
2525 } ,
2626}
2727
@@ -41,7 +41,13 @@ impl MetaBox {
4141 size += ilst. box_size ( ) ;
4242 }
4343 }
44- Self :: Unknown { hdlr, data } => size += hdlr. box_size ( ) + data. len ( ) as u64 ,
44+ Self :: Unknown { hdlr, data } => {
45+ size += hdlr. box_size ( )
46+ + data
47+ . iter ( )
48+ . map ( |( _, data) | data. len ( ) as u64 + HEADER_SIZE )
49+ . sum :: < u64 > ( )
50+ }
4551 }
4652 size
4753 }
@@ -147,8 +153,27 @@ impl<R: Read + Seek> ReadBox<&mut R> for MetaBox {
147153 Ok ( MetaBox :: Mdir { ilst } )
148154 }
149155 _ => {
150- let mut data = vec ! [ 0u8 ; ( end - current) as usize ] ;
151- reader. read_exact ( & mut data) ?;
156+ let mut data = Vec :: new ( ) ;
157+
158+ while current < end {
159+ // Get box header.
160+ let header = BoxHeader :: read ( reader) ?;
161+ let BoxHeader { name, size : s } = header;
162+
163+ match name {
164+ BoxType :: HdlrBox => {
165+ skip_box ( reader, s) ?;
166+ }
167+ _ => {
168+ let mut box_data = vec ! [ 0 ; ( s - HEADER_SIZE ) as usize ] ;
169+ reader. read_exact ( & mut box_data) ?;
170+
171+ data. push ( ( name, box_data) ) ;
172+ }
173+ }
174+
175+ current = reader. stream_position ( ) ?;
176+ }
152177
153178 Ok ( MetaBox :: Unknown { hdlr, data } )
154179 }
@@ -178,7 +203,12 @@ impl<W: Write> WriteBox<&mut W> for MetaBox {
178203 ilst. write_box ( writer) ?;
179204 }
180205 }
181- Self :: Unknown { data, .. } => writer. write_all ( data) ?,
206+ Self :: Unknown { data, .. } => {
207+ for ( box_type, data) in data {
208+ BoxHeader :: new ( * box_type, data. len ( ) as u64 + HEADER_SIZE ) . write ( writer) ?;
209+ writer. write_all ( data) ?;
210+ }
211+ }
182212 }
183213 Ok ( size)
184214 }
@@ -235,10 +265,14 @@ mod tests {
235265
236266 let meta_box = MetaBox :: read_box ( & mut reader, header. size ) . unwrap ( ) ;
237267
238-
239268 // this contains \xa9too box in the ilst
240269 // it designates the tool that created the file, but is not yet supported by this crate
241- assert_eq ! ( meta_box, MetaBox :: Mdir { ilst: Some ( IlstBox :: default ( ) ) } ) ;
270+ assert_eq ! (
271+ meta_box,
272+ MetaBox :: Mdir {
273+ ilst: Some ( IlstBox :: default ( ) )
274+ }
275+ ) ;
242276 }
243277
244278 #[ test]
@@ -247,10 +281,10 @@ mod tests {
247281 handler_type : FourCC :: from ( * b"test" ) ,
248282 ..Default :: default ( )
249283 } ;
250- let src_data = b"123" ;
284+ let src_data = ( BoxType :: UnknownBox ( 0x42494241 ) , b"123" . to_vec ( ) ) ;
251285 let src_box = MetaBox :: Unknown {
252286 hdlr : src_hdlr,
253- data : src_data. to_vec ( ) ,
287+ data : vec ! [ src_data] ,
254288 } ;
255289
256290 let mut buf = Vec :: new ( ) ;
0 commit comments