File tree Expand file tree Collapse file tree 1 file changed +13
-3
lines changed Expand file tree Collapse file tree 1 file changed +13
-3
lines changed Original file line number Diff line number Diff line change @@ -90,9 +90,19 @@ impl<R: Read + Seek> ReadBox<&mut R> for MetaBox {
90
90
fn read_box ( reader : & mut R , size : u64 ) -> Result < Self > {
91
91
let start = box_start ( reader) ?;
92
92
93
- let ( version, _) = read_box_header_ext ( reader) ?;
94
- if version != 0 {
95
- return Err ( Error :: UnsupportedBoxVersion ( BoxType :: UdtaBox , version) ) ;
93
+ let extended_header = reader. read_u32 :: < BigEndian > ( ) ?;
94
+ if extended_header != 0 {
95
+ // ISO mp4 requires this header (version & flags) to be 0. Some
96
+ // files skip the extended header and directly start the hdlr box.
97
+ let possible_hdlr = BoxType :: from ( reader. read_u32 :: < BigEndian > ( ) ?) ;
98
+ if possible_hdlr == BoxType :: HdlrBox {
99
+ // This file skipped the extended header! Go back to start.
100
+ reader. seek ( SeekFrom :: Current ( -8 ) ) ?;
101
+ } else {
102
+ // Looks like we actually have a bad version number or flags.
103
+ let v = ( extended_header >> 24 ) as u8 ;
104
+ return Err ( Error :: UnsupportedBoxVersion ( BoxType :: MetaBox , v) ) ;
105
+ }
96
106
}
97
107
98
108
let mut current = reader. stream_position ( ) ?;
You can’t perform that action at this time.
0 commit comments