1
0
Fork 0
mirror of https://github.com/alfg/mp4-rust.git synced 2024-06-11 09:29:21 +00:00
This commit is contained in:
jensenn 2024-03-26 21:30:27 +00:00 committed by GitHub
commit 15a42f0467
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 17 additions and 14 deletions

View file

@ -98,9 +98,11 @@ impl<R: Read + Seek> Mp4Reader<R> {
// Update tracks if any fragmented (moof) boxes are found. // Update tracks if any fragmented (moof) boxes are found.
if !moofs.is_empty() { if !moofs.is_empty() {
let mut default_sample_duration = 0; let mut default_sample_duration = 0;
let mut default_sample_size = 0;
if let Some(ref moov) = moov { if let Some(ref moov) = moov {
if let Some(ref mvex) = &moov.mvex { 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<R: Read + Seek> Mp4Reader<R> {
let track_id = traf.tfhd.track_id; let track_id = traf.tfhd.track_id;
if let Some(track) = tracks.get_mut(&track_id) { if let Some(track) = tracks.get_mut(&track_id) {
track.default_sample_duration = default_sample_duration; track.default_sample_duration = default_sample_duration;
track.default_sample_size = default_sample_size;
track.moof_offsets.push(moof_offset); track.moof_offsets.push(moof_offset);
track.trafs.push(traf.clone()) track.trafs.push(traf.clone())
} else { } else {

View file

@ -97,6 +97,7 @@ pub struct Mp4Track {
// Fragmented Tracks Defaults. // Fragmented Tracks Defaults.
pub default_sample_duration: u32, pub default_sample_duration: u32,
pub default_sample_size: u32,
} }
impl Mp4Track { impl Mp4Track {
@ -107,6 +108,7 @@ impl Mp4Track {
trafs: Vec::new(), trafs: Vec::new(),
moof_offsets: Vec::new(), moof_offsets: Vec::new(),
default_sample_duration: 0, default_sample_duration: 0,
default_sample_size: 0,
} }
} }
@ -261,7 +263,7 @@ impl Mp4Track {
pub fn sequence_parameter_set(&self) -> Result<&[u8]> { pub fn sequence_parameter_set(&self) -> Result<&[u8]> {
if let Some(ref avc1) = self.trak.mdia.minf.stbl.stsd.avc1 { 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()), Some(nal) => Ok(nal.bytes.as_ref()),
None => Err(Error::EntryInStblNotFound( None => Err(Error::EntryInStblNotFound(
self.track_id(), self.track_id(),
@ -276,7 +278,7 @@ impl Mp4Track {
pub fn picture_parameter_set(&self) -> Result<&[u8]> { pub fn picture_parameter_set(&self) -> Result<&[u8]> {
if let Some(ref avc1) = self.trak.mdia.minf.stbl.stsd.avc1 { 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()), Some(nal) => Ok(nal.bytes.as_ref()),
None => Err(Error::EntryInStblNotFound( None => Err(Error::EntryInStblNotFound(
self.track_id(), self.track_id(),
@ -389,21 +391,19 @@ impl Mp4Track {
fn sample_size(&self, sample_id: u32) -> Result<u32> { fn sample_size(&self, sample_id: u32) -> Result<u32> {
if !self.trafs.is_empty() { if !self.trafs.is_empty() {
if let Some((traf_idx, sample_idx)) = self.find_traf_idx_and_sample_idx(sample_id) { 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 .trun
.as_ref() .as_ref()
.unwrap() .and_then(|trun| trun.sample_sizes.get(sample_idx))
.sample_sizes
.get(sample_idx)
{ {
Ok(*size) default_sample_size = *size;
} else {
Err(Error::EntryInTrunNotFound(
self.track_id(),
BoxType::TrunBox,
sample_id,
))
} }
Ok(default_sample_size)
} else { } else {
Err(Error::BoxInTrafNotFound(self.track_id(), BoxType::TrafBox)) Err(Error::BoxInTrafNotFound(self.track_id(), BoxType::TrafBox))
} }