diff --git a/AUTHORS b/AUTHORS index 6cf584a1f24..c8f5b034e8b 100644 --- a/AUTHORS +++ b/AUTHORS @@ -34,3 +34,4 @@ Richard Eklycke Sanil Raut Sergio Ammirata The Chromium Authors <*@chromium.org> +Prakash Duggaraju diff --git a/CONTRIBUTORS b/CONTRIBUTORS index b11338f6112..416115bcbf4 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -51,3 +51,4 @@ Thomas Inskip Tim Lansen Vincent Nguyen Weiguo Shao +Prakash Duggaraju diff --git a/packager/media/formats/mp4/mp4_media_parser_unittest.cc b/packager/media/formats/mp4/mp4_media_parser_unittest.cc index 953b6c3c7a7..715cf065d7e 100644 --- a/packager/media/formats/mp4/mp4_media_parser_unittest.cc +++ b/packager/media/formats/mp4/mp4_media_parser_unittest.cc @@ -298,6 +298,13 @@ TEST_F(MP4MediaParserTest, CencWithDecryptionSourceAndSenc) { EXPECT_EQ(82u, num_samples_); } +TEST_F(MP4MediaParserTest, NonInterleavedFMP4) { + // Test small, non-interleaved fragment MP4 with one track per fragment. + EXPECT_TRUE(ParseMP4File("BigBuckBunny_10s.ismv", 512)); + EXPECT_EQ(2u, num_streams_); + EXPECT_EQ(770u, num_samples_); +} + } // namespace mp4 } // namespace media } // namespace shaka diff --git a/packager/media/formats/mp4/track_run_iterator.cc b/packager/media/formats/mp4/track_run_iterator.cc index 2fd836168b9..94e27ab0dac 100644 --- a/packager/media/formats/mp4/track_run_iterator.cc +++ b/packager/media/formats/mp4/track_run_iterator.cc @@ -284,10 +284,11 @@ bool TrackRunIterator::Init() { bool TrackRunIterator::Init(const MovieFragment& moof) { runs_.clear(); - next_fragment_start_dts_.resize(moof.tracks.size(), 0); + const auto track_count = std::max(moof.tracks.size(), moov_->tracks.size()); + next_fragment_start_dts_.resize(track_count, 0); for (size_t i = 0; i < moof.tracks.size(); i++) { const TrackFragment& traf = moof.tracks[i]; - + const auto track_index = traf.header.track_id - 1; const Track* trak = NULL; for (size_t t = 0; t < moov_->tracks.size(); t++) { if (moov_->tracks[t].header.track_id == traf.header.track_id) @@ -351,7 +352,7 @@ bool TrackRunIterator::Init(const MovieFragment& moof) { } int64_t run_start_dts = traf.decode_time_absent - ? next_fragment_start_dts_[i] + ? next_fragment_start_dts_[track_index] : traf.decode_time.decode_time; // dts is directly adjusted, which then propagates to pts as pts is encoded @@ -426,7 +427,7 @@ bool TrackRunIterator::Init(const MovieFragment& moof) { runs_.push_back(tri); sample_count_sum += trun.sample_count; } - next_fragment_start_dts_[i] = run_start_dts; + next_fragment_start_dts_[track_index] = run_start_dts; } std::sort(runs_.begin(), runs_.end(), CompareMinTrackRunDataOffset()); diff --git a/packager/media/test/data/BigBuckBunny_10s.ismv b/packager/media/test/data/BigBuckBunny_10s.ismv new file mode 100644 index 00000000000..a5ffe5a699a Binary files /dev/null and b/packager/media/test/data/BigBuckBunny_10s.ismv differ