Skip to content

Commit c67a7f7

Browse files
w-floalfg
andauthored
Try to skip extended header in MetaBox. (alfg#111)
Fixes alfg#102 Co-authored-by: Alfred Gutierrez <[email protected]>
1 parent 8fb499e commit c67a7f7

File tree

1 file changed

+13
-3
lines changed

1 file changed

+13
-3
lines changed

src/mp4box/meta.rs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,9 +90,19 @@ impl<R: Read + Seek> ReadBox<&mut R> for MetaBox {
9090
fn read_box(reader: &mut R, size: u64) -> Result<Self> {
9191
let start = box_start(reader)?;
9292

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+
}
96106
}
97107

98108
let mut current = reader.stream_position()?;

0 commit comments

Comments
 (0)