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)) }