From 55ee392b73801d5aff41dbde36455917e0ac2d19 Mon Sep 17 00:00:00 2001 From: Florian Will Date: Thu, 29 Jun 2023 16:49:35 +0200 Subject: [PATCH] Try to skip extended header in MetaBox. Fixes #102 --- src/mp4box/meta.rs | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/mp4box/meta.rs b/src/mp4box/meta.rs index df57c775..f95efa05 100644 --- a/src/mp4box/meta.rs +++ b/src/mp4box/meta.rs @@ -84,9 +84,19 @@ impl ReadBox<&mut R> for MetaBox { fn read_box(reader: &mut R, size: u64) -> Result { let start = box_start(reader)?; - let (version, _) = read_box_header_ext(reader)?; - if version != 0 { - return Err(Error::UnsupportedBoxVersion(BoxType::UdtaBox, version)); + let extended_header = reader.read_u32::()?; + if extended_header != 0 { + // ISO mp4 requires this header (version & flags) to be 0. Some + // files skip the extended header and directly start the hdlr box. + let possible_hdlr = BoxType::from(reader.read_u32::()?); + if possible_hdlr == BoxType::HdlrBox { + // This file skipped the extended header! Go back to start. + reader.seek(SeekFrom::Current(-8))?; + } else { + // Looks like we actually have a bad version number or flags. + let v = (extended_header >> 24) as u8; + return Err(Error::UnsupportedBoxVersion(BoxType::MetaBox, v)); + } } let hdlr_header = BoxHeader::read(reader)?;