From c89dd5a06a13d79bf939939ce7f3b16434f58162 Mon Sep 17 00:00:00 2001 From: Martin Algesten Date: Thu, 11 May 2023 10:48:57 +0200 Subject: [PATCH] Avc1Box ignore non-AvcC boxes --- src/mp4box/avc1.rs | 37 +++++++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/src/mp4box/avc1.rs b/src/mp4box/avc1.rs index 7174122..6bd5493 100644 --- a/src/mp4box/avc1.rs +++ b/src/mp4box/avc1.rs @@ -101,18 +101,35 @@ impl ReadBox<&mut R> for Avc1Box { let depth = reader.read_u16::()?; reader.read_i16::()?; // pre-defined - let header = BoxHeader::read(reader)?; - let BoxHeader { name, size: s } = header; - if s > size { - return Err(Error::InvalidData( - "avc1 box contains a box with a larger size than it", - )); + let mut current = reader.stream_position()?; + let end = start + size; + + let mut avcc = None; + + while current < end { + // Get box header. + let header = BoxHeader::read(reader)?; + let BoxHeader { name, size: s } = header; + if s > size { + return Err(Error::InvalidData( + "avc1 box contains a box with a larger size than it", + )); + } + + match name { + BoxType::AvcCBox => { + avcc = Some(AvcCBox::read_box(reader, s)?); + } + _ => { + // XXX warn!() + skip_box(reader, s)?; + } + } + + current = reader.stream_position()?; } - if name == BoxType::AvcCBox { - let avcc = AvcCBox::read_box(reader, s)?; - - skip_bytes_to(reader, start + size)?; + if let Some(avcc) = avcc { Ok(Avc1Box { data_reference_index, width,