From d9b5755713fe2f208793991c1c47f0e6498bac78 Mon Sep 17 00:00:00 2001 From: Florian Will Date: Fri, 30 Jun 2023 09:25:14 +0200 Subject: [PATCH] mp4a: Support QT sound sample description version 1. If the QT version in a sound sample description is set to 1, there are 4 additional 32-bit integers in the description record according to QT docs. At least some recently sold iPhones produce sound sample description records like this, so this change fixes a parsing failure for these files. --- src/mp4box/mp4a.rs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/mp4box/mp4a.rs b/src/mp4box/mp4a.rs index e4d6a45..0dcfca7 100644 --- a/src/mp4box/mp4a.rs +++ b/src/mp4box/mp4a.rs @@ -83,12 +83,22 @@ impl ReadBox<&mut R> for Mp4aBox { reader.read_u16::()?; // reserved let data_reference_index = reader.read_u16::()?; - reader.read_u64::()?; // reserved + // Next 8 bytes should be all 0 in ISO MP4 + let qt_version = reader.read_u16::()?; // QT: 0, 1 or 2 + reader.read_u16::()?; // QT: revision level, should be 0 + reader.read_u32::()?; // QT: vendor, should be 0 + let channelcount = reader.read_u16::()?; let samplesize = reader.read_u16::()?; reader.read_u32::()?; // pre-defined, reserved let samplerate = FixedPointU16::new_raw(reader.read_u32::()?); + if qt_version == 1 { + // Samples per packet, bytes per packet, + // bytes per frame, bytes per sample + skip_bytes(reader, 4 * 4)?; + } + let mut esds = None; let current = reader.stream_position()?; if current < start + size {