From 07d0872131e7fa9c0b4dfc50abead6f224d9d708 Mon Sep 17 00:00:00 2001 From: AdrianEddy Date: Thu, 28 Aug 2025 13:43:15 +0200 Subject: [PATCH 1/5] Don't fail when the wave atom contains different atoms than esds --- mp4parse/src/lib.rs | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/mp4parse/src/lib.rs b/mp4parse/src/lib.rs index 5648d923..b1b96044 100644 --- a/mp4parse/src/lib.rs +++ b/mp4parse/src/lib.rs @@ -5818,11 +5818,15 @@ fn read_audio_sample_entry( codec_type = CodecType::ALAC; codec_specific = Some(AudioCodecSpecific::ALACSpecificBox(alac)); } - BoxType::QTWaveAtom => { - let qt_esds = read_qt_wave_atom(&mut b, strictness)?; - codec_type = qt_esds.audio_codec; - codec_specific = Some(AudioCodecSpecific::ES_Descriptor(qt_esds)); - } + BoxType::QTWaveAtom => match read_qt_wave_atom(&mut b, strictness) { + Ok(qt_esds) => { + codec_type = qt_esds.audio_codec; + codec_specific = Some(AudioCodecSpecific::ES_Descriptor(qt_esds)); + } + Err(e) => { + warn!("Failed to parse wave atom: {e:?}"); + } + }, BoxType::ProtectionSchemeInfoBox => { if name != BoxType::ProtectedAudioSampleEntry { return Status::StsdBadAudioSampleEntry.into(); From ba94d8279ed6c48bbc8f7649fe63be957f73ae5c Mon Sep 17 00:00:00 2001 From: AdrianEddy Date: Thu, 28 Aug 2025 14:08:31 +0200 Subject: [PATCH 2/5] Allow unknown codecs when the ParseStrictness is not Strict --- mp4parse/src/lib.rs | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/mp4parse/src/lib.rs b/mp4parse/src/lib.rs index b1b96044..78557b7a 100644 --- a/mp4parse/src/lib.rs +++ b/mp4parse/src/lib.rs @@ -5515,7 +5515,7 @@ fn read_hdlr(src: &mut BMFFBox, strictness: ParseStrictness) -> Resu } /// Parse an video description inside an stsd box. -fn read_video_sample_entry(src: &mut BMFFBox) -> Result { +fn read_video_sample_entry(src: &mut BMFFBox, strictness: ParseStrictness) -> Result { let name = src.get_header().name; let codec_type = match name { BoxType::AVCSampleEntry | BoxType::AVC3SampleEntry => CodecType::H264, @@ -5670,7 +5670,12 @@ fn read_video_sample_entry(src: &mut BMFFBox) -> Result skip_box_content(&mut b)?; } } - check_parser_state!(b.content); + if strictness == ParseStrictness::Strict { + check_parser_state!(b.content); + } else { + // Padding may be present in some content. + skip_box_remain(&mut b)?; + } } Ok( @@ -5825,6 +5830,9 @@ fn read_audio_sample_entry( } Err(e) => { warn!("Failed to parse wave atom: {e:?}"); + if strictness == ParseStrictness::Strict { + return Err(e); + } } }, BoxType::ProtectionSchemeInfoBox => { @@ -5894,9 +5902,9 @@ fn read_stsd( while descriptions.len() < description_count { if let Some(mut b) = iter.next_box()? { let description = match track.track_type { - TrackType::Video => read_video_sample_entry(&mut b), - TrackType::Picture => read_video_sample_entry(&mut b), - TrackType::AuxiliaryVideo => read_video_sample_entry(&mut b), + TrackType::Video => read_video_sample_entry(&mut b, strictness), + TrackType::Picture => read_video_sample_entry(&mut b, strictness), + TrackType::AuxiliaryVideo => read_video_sample_entry(&mut b, strictness), TrackType::Audio => read_audio_sample_entry(&mut b, strictness), TrackType::Metadata => Err(Error::Unsupported("metadata track")), TrackType::Unknown => Err(Error::Unsupported("unknown track type")), From 35c5c630ce8c89f50ddd1ca66cbff91b94d09a2a Mon Sep 17 00:00:00 2001 From: AdrianEddy Date: Thu, 28 Aug 2025 14:09:14 +0200 Subject: [PATCH 3/5] Formatting --- mp4parse/src/lib.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mp4parse/src/lib.rs b/mp4parse/src/lib.rs index 78557b7a..b7886db4 100644 --- a/mp4parse/src/lib.rs +++ b/mp4parse/src/lib.rs @@ -5515,7 +5515,10 @@ fn read_hdlr(src: &mut BMFFBox, strictness: ParseStrictness) -> Resu } /// Parse an video description inside an stsd box. -fn read_video_sample_entry(src: &mut BMFFBox, strictness: ParseStrictness) -> Result { +fn read_video_sample_entry( + src: &mut BMFFBox, + strictness: ParseStrictness, +) -> Result { let name = src.get_header().name; let codec_type = match name { BoxType::AVCSampleEntry | BoxType::AVC3SampleEntry => CodecType::H264, From a8c06324ed60b9ce0c4ea91d6a35a13b5ff1f262 Mon Sep 17 00:00:00 2001 From: AdrianEddy Date: Thu, 28 Aug 2025 14:22:22 +0200 Subject: [PATCH 4/5] Add missing argument to read_video_sample_entry in tests --- mp4parse/src/tests.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mp4parse/src/tests.rs b/mp4parse/src/tests.rs index b375228c..618829d1 100644 --- a/mp4parse/src/tests.rs +++ b/mp4parse/src/tests.rs @@ -1147,7 +1147,8 @@ fn read_stsd_mp4v() { let mut iter = super::BoxIter::new(&mut stream); let mut stream = iter.next_box().unwrap().unwrap(); - let sample_entry = super::read_video_sample_entry(&mut stream).unwrap(); + let sample_entry = + super::read_video_sample_entry(&mut stream, ParseStrictness::Normal).unwrap(); match sample_entry { super::SampleEntry::Video(v) => { @@ -1247,7 +1248,7 @@ fn unknown_video_sample_entry() { }); let mut iter = super::BoxIter::new(&mut stream); let mut stream = iter.next_box().unwrap().unwrap(); - match super::read_video_sample_entry(&mut stream) { + match super::read_video_sample_entry(&mut stream, ParseStrictness::Normal) { Ok(super::SampleEntry::Unknown) => (), _ => panic!("expected a different error result"), } From abc1f9d6891020257c167e00b648d82676b84043 Mon Sep 17 00:00:00 2001 From: AdrianEddy Date: Thu, 28 Aug 2025 14:25:26 +0200 Subject: [PATCH 5/5] Fix clippy --- mp4parse/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mp4parse/src/lib.rs b/mp4parse/src/lib.rs index b7886db4..d55700e8 100644 --- a/mp4parse/src/lib.rs +++ b/mp4parse/src/lib.rs @@ -4485,7 +4485,7 @@ fn read_ftyp(src: &mut BMFFBox) -> Result { let major = be_u32(src)?; let minor = be_u32(src)?; let bytes_left = src.bytes_left(); - if bytes_left % 4 != 0 { + if !bytes_left.is_multiple_of(4) { return Status::FtypBadSize.into(); } // Is a brand_count of zero valid?