Skip to content

Commit eb27e46

Browse files
committed
Try to skip extended header in MetaBox.
Fixes #102
1 parent 55875d7 commit eb27e46

File tree

1 file changed

+22
-8
lines changed

1 file changed

+22
-8
lines changed

src/mp4box/meta.rs

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -84,15 +84,29 @@ impl<R: Read + Seek> ReadBox<&mut R> for MetaBox {
8484
fn read_box(reader: &mut R, size: u64) -> Result<Self> {
8585
let start = box_start(reader)?;
8686

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+
};
91109

92-
let hdlr_header = BoxHeader::read(reader)?;
93-
if hdlr_header.name != BoxType::HdlrBox {
94-
return Err(Error::BoxNotFound(BoxType::HdlrBox));
95-
}
96110
let hdlr = HdlrBox::read_box(reader, hdlr_header.size)?;
97111

98112
let mut ilst = None;

0 commit comments

Comments
 (0)