@@ -84,15 +84,29 @@ impl<R: Read + Seek> ReadBox<&mut R> for MetaBox {
84
84
fn read_box ( reader : & mut R , size : u64 ) -> Result < Self > {
85
85
let start = box_start ( reader) ?;
86
86
87
- let ( version, _) = read_box_header_ext ( reader) ?;
88
- if version != 0 {
89
- return Err ( Error :: UnsupportedBoxVersion ( BoxType :: UdtaBox , version) ) ;
90
- }
87
+ // Some mp4 files directly start the hdlr box here (like Quicktime)
88
+ // and skip the extended header in meta boxes.
89
+ let start_stream_pos = reader. stream_position ( ) ?;
90
+ let try_read_header = BoxHeader :: read ( reader) ?;
91
+
92
+ let hdlr_header = if try_read_header. name == BoxType :: HdlrBox {
93
+ // This file skipped the extended header.
94
+ try_read_header
95
+ } else {
96
+ // File probably has the extended header, go back and parse it.
97
+ reader. seek ( SeekFrom :: Start ( start_stream_pos) ) ?;
98
+ let ( version, _) = read_box_header_ext ( reader) ?;
99
+ if version != 0 {
100
+ return Err ( Error :: UnsupportedBoxVersion ( BoxType :: UdtaBox , version) ) ;
101
+ }
102
+
103
+ let hdlr_header = BoxHeader :: read ( reader) ?;
104
+ if hdlr_header. name != BoxType :: HdlrBox {
105
+ return Err ( Error :: BoxNotFound ( BoxType :: HdlrBox ) ) ;
106
+ }
107
+ hdlr_header
108
+ } ;
91
109
92
- let hdlr_header = BoxHeader :: read ( reader) ?;
93
- if hdlr_header. name != BoxType :: HdlrBox {
94
- return Err ( Error :: BoxNotFound ( BoxType :: HdlrBox ) ) ;
95
- }
96
110
let hdlr = HdlrBox :: read_box ( reader, hdlr_header. size ) ?;
97
111
98
112
let mut ilst = None ;
0 commit comments