Skip to content

Commit

Permalink
isomp4: set mdhd.duration with adjusted timescale, revert PR #317
Browse files Browse the repository at this point in the history
  • Loading branch information
sscobici committed Dec 27, 2024
1 parent 6c5dc5b commit 5df709a
Show file tree
Hide file tree
Showing 4 changed files with 18 additions and 14 deletions.
15 changes: 12 additions & 3 deletions symphonia-format-isomp4/src/atoms/moov.rs
Original file line number Diff line number Diff line change
Expand Up @@ -69,9 +69,10 @@ impl Atom for MoovAtom {
}
}

if mvhd.is_none() {
let Some(mvhd) = mvhd
else {
return decode_error("isomp4: missing mvhd atom");
}
};

// If fragmented, the mvex atom should contain a trex atom for each trak atom in moov.
if let Some(mvex) = mvex.as_ref() {
Expand All @@ -85,6 +86,14 @@ impl Atom for MoovAtom {
}
}

Ok(MoovAtom { mvhd: mvhd.unwrap(), traks, mvex, udta })
// If trak.mdia.mdhd.duration is 0, set it to trak.tkhd.duration converted to trak.mdia.mdhd.timescale
for trak in traks.iter_mut() {
if trak.mdia.mdhd.duration == 0 {
trak.mdia.mdhd.duration =
trak.tkhd.duration * trak.mdia.mdhd.timescale as u64 / mvhd.timescale as u64;
}
}

Ok(MoovAtom { mvhd, traks, mvex, udta })
}
}
11 changes: 3 additions & 8 deletions symphonia-format-isomp4/src/atoms/trak.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,6 @@ pub struct TrakAtom {
pub edts: Option<EdtsAtom>,
/// Media atom.
pub mdia: MdiaAtom,
/// Duration, equal to mdia.mdhd.duration unless it is zero, in which case it is equal to tkhd.duration.
pub duration: u64,
}

impl Atom for TrakAtom {
Expand All @@ -47,19 +45,16 @@ impl Atom for TrakAtom {
}
}

let Some(tkhd_atom) = tkhd
let Some(tkhd) = tkhd
else {
return decode_error("isomp4: missing tkhd atom");
};

let Some(mdia_atom) = mdia
let Some(mdia) = mdia
else {
return decode_error("isomp4: missing mdia atom");
};

let duration =
if mdia_atom.mdhd.duration != 0 { mdia_atom.mdhd.duration } else { tkhd_atom.duration };

Ok(TrakAtom { tkhd: tkhd_atom, edts, mdia: mdia_atom, duration })
Ok(TrakAtom { tkhd, edts, mdia })
}
}
2 changes: 1 addition & 1 deletion symphonia-format-isomp4/src/demuxer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ impl TrackState {

track
.with_time_base(TimeBase::new(1, trak.mdia.mdhd.timescale))
.with_num_frames(trak.duration);
.with_num_frames(trak.mdia.mdhd.duration);

let state = Self {
track_num,
Expand Down
4 changes: 2 additions & 2 deletions symphonia-format-isomp4/src/stream.rs
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@ impl StreamSegment for MoofSegment {
}

// If a track does NOT end in this segment, then this cannot be the last segment.
if seq.first_ts + seq.total_sample_duration < trak.duration {
if seq.first_ts + seq.total_sample_duration < trak.mdia.mdhd.duration {
return false;
}
}
Expand Down Expand Up @@ -349,7 +349,7 @@ impl StreamSegment for MoovSegment {
fn all_tracks_ended(&self) -> bool {
// If a track does not end in this segment, then this cannot be the last segment.
for trak in &self.moov.traks {
if trak.mdia.minf.stbl.stts.total_duration < trak.duration {
if trak.mdia.minf.stbl.stts.total_duration < trak.mdia.mdhd.duration {
return false;
}
}
Expand Down

0 comments on commit 5df709a

Please sign in to comment.