From 6301a7b0fe66a9097716b845e4742e5175b097fd Mon Sep 17 00:00:00 2001 From: Jensenn Date: Wed, 6 Mar 2024 15:31:17 -0700 Subject: [PATCH 1/2] Add better handling of sample sizes for fragmented media --- src/reader.rs | 5 ++++- src/track.rs | 22 +++++++++++----------- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/reader.rs b/src/reader.rs index e5ac296..efac8dc 100644 --- a/src/reader.rs +++ b/src/reader.rs @@ -98,9 +98,11 @@ impl Mp4Reader { // Update tracks if any fragmented (moof) boxes are found. if !moofs.is_empty() { let mut default_sample_duration = 0; + let mut default_sample_size = 0; if let Some(ref moov) = moov { if let Some(ref mvex) = &moov.mvex { - default_sample_duration = mvex.trex.default_sample_duration + default_sample_duration = mvex.trex.default_sample_duration; + default_sample_size = mvex.trex.default_sample_size; } } @@ -109,6 +111,7 @@ impl Mp4Reader { let track_id = traf.tfhd.track_id; if let Some(track) = tracks.get_mut(&track_id) { track.default_sample_duration = default_sample_duration; + track.default_sample_size = default_sample_size; track.moof_offsets.push(moof_offset); track.trafs.push(traf.clone()) } else { diff --git a/src/track.rs b/src/track.rs index 7eada83..1224580 100644 --- a/src/track.rs +++ b/src/track.rs @@ -97,6 +97,7 @@ pub struct Mp4Track { // Fragmented Tracks Defaults. pub default_sample_duration: u32, + pub default_sample_size: u32, } impl Mp4Track { @@ -107,6 +108,7 @@ impl Mp4Track { trafs: Vec::new(), moof_offsets: Vec::new(), default_sample_duration: 0, + default_sample_size: 0, } } @@ -389,21 +391,19 @@ impl Mp4Track { fn sample_size(&self, sample_id: u32) -> Result { if !self.trafs.is_empty() { if let Some((traf_idx, sample_idx)) = self.find_traf_idx_and_sample_idx(sample_id) { - if let Some(size) = self.trafs[traf_idx] + let mut default_sample_size = self.default_sample_size; + let traf = &self.trafs[traf_idx]; + if let Some(size) = traf.tfhd.default_sample_size { + default_sample_size = size; + } + if let Some(size) = traf .trun .as_ref() - .unwrap() - .sample_sizes - .get(sample_idx) + .and_then(|trun| trun.sample_sizes.get(sample_idx)) { - Ok(*size) - } else { - Err(Error::EntryInTrunNotFound( - self.track_id(), - BoxType::TrunBox, - sample_id, - )) + default_sample_size = *size; } + Ok(default_sample_size) } else { Err(Error::BoxInTrafNotFound(self.track_id(), BoxType::TrafBox)) } From 4c9a6aa350807c1020c82cb208ebf7411173cbcf Mon Sep 17 00:00:00 2001 From: Jensenn Date: Tue, 26 Mar 2024 15:30:21 -0600 Subject: [PATCH 2/2] Clippy fixes --- src/track.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/track.rs b/src/track.rs index 1224580..e0d0b83 100644 --- a/src/track.rs +++ b/src/track.rs @@ -263,7 +263,7 @@ impl Mp4Track { pub fn sequence_parameter_set(&self) -> Result<&[u8]> { if let Some(ref avc1) = self.trak.mdia.minf.stbl.stsd.avc1 { - match avc1.avcc.sequence_parameter_sets.get(0) { + match avc1.avcc.sequence_parameter_sets.first() { Some(nal) => Ok(nal.bytes.as_ref()), None => Err(Error::EntryInStblNotFound( self.track_id(), @@ -278,7 +278,7 @@ impl Mp4Track { pub fn picture_parameter_set(&self) -> Result<&[u8]> { if let Some(ref avc1) = self.trak.mdia.minf.stbl.stsd.avc1 { - match avc1.avcc.picture_parameter_sets.get(0) { + match avc1.avcc.picture_parameter_sets.first() { Some(nal) => Ok(nal.bytes.as_ref()), None => Err(Error::EntryInStblNotFound( self.track_id(),