| Index: media/filters/chunk_demuxer_unittest.cc
|
| diff --git a/media/filters/chunk_demuxer_unittest.cc b/media/filters/chunk_demuxer_unittest.cc
|
| index c095f5a292cb8d57a8d5f7d8d2dac85033b6c4bf..e71751eb380a6e6b879cc9967c59ae278ecea363 100644
|
| --- a/media/filters/chunk_demuxer_unittest.cc
|
| +++ b/media/filters/chunk_demuxer_unittest.cc
|
| @@ -18,6 +18,7 @@
|
| #include "media/base/audio_decoder_config.h"
|
| #include "media/base/decoder_buffer.h"
|
| #include "media/base/decrypt_config.h"
|
| +#include "media/base/media_tracks.h"
|
| #include "media/base/mock_demuxer_host.h"
|
| #include "media/base/mock_media_log.h"
|
| #include "media/base/test_data_util.h"
|
| @@ -262,9 +263,8 @@ class ChunkDemuxerTest : public ::testing::Test {
|
| ChunkDemuxerTest()
|
| : media_log_(new StrictMock<MockMediaLog>()),
|
| append_window_end_for_next_append_(kInfiniteDuration()) {
|
| - init_segment_received_cb_ =
|
| - base::Bind(&ChunkDemuxerTest::InitSegmentReceived,
|
| - base::Unretained(this));
|
| + init_segment_received_cb_ = base::Bind(
|
| + &ChunkDemuxerTest::InitSegmentReceivedWrapper, base::Unretained(this));
|
| CreateNewDemuxer();
|
| }
|
|
|
| @@ -450,7 +450,12 @@ class ChunkDemuxerTest : public ::testing::Test {
|
| return AddId(kSourceId, HAS_AUDIO | HAS_VIDEO);
|
| }
|
|
|
| - return demuxer_->AddId(source_id, type, codecs);
|
| + ChunkDemuxer::Status status = demuxer_->AddId(source_id, type, codecs);
|
| + if (status == ChunkDemuxer::kOk)
|
| + demuxer_->SetTracksWatcher(
|
| + source_id, base::Bind(&ChunkDemuxerTest::InitSegmentReceivedWrapper,
|
| + base::Unretained(this)));
|
| + return status;
|
| }
|
|
|
| #if BUILDFLAG(ENABLE_MSE_MPEG2TS_STREAM_PARSER)
|
| @@ -459,7 +464,12 @@ class ChunkDemuxerTest : public ::testing::Test {
|
| std::string type = "video/mp2t";
|
| codecs.push_back("mp4a.40.2");
|
| codecs.push_back("avc1.640028");
|
| - return demuxer_->AddId(source_id, type, codecs);
|
| + ChunkDemuxer::Status status = demuxer_->AddId(source_id, type, codecs);
|
| + if (status == ChunkDemuxer::kOk)
|
| + demuxer_->SetTracksWatcher(
|
| + source_id, base::Bind(&ChunkDemuxerTest::InitSegmentReceivedWrapper,
|
| + base::Unretained(this)));
|
| + return status;
|
| }
|
| #endif
|
|
|
| @@ -714,11 +724,9 @@ class ChunkDemuxerTest : public ::testing::Test {
|
| size_t length) {
|
| EXPECT_CALL(host_, OnBufferedTimeRangesChanged(_)).Times(AnyNumber());
|
|
|
| - demuxer_->AppendData(source_id, data, length,
|
| - append_window_start_for_next_append_,
|
| - append_window_end_for_next_append_,
|
| - ×tamp_offset_map_[source_id],
|
| - init_segment_received_cb_);
|
| + demuxer_->AppendData(
|
| + source_id, data, length, append_window_start_for_next_append_,
|
| + append_window_end_for_next_append_, ×tamp_offset_map_[source_id]);
|
| }
|
|
|
| void AppendDataInPieces(const uint8_t* data, size_t length) {
|
| @@ -841,7 +849,7 @@ class ChunkDemuxerTest : public ::testing::Test {
|
| // it.
|
| if (stream_flags != 0) {
|
| ExpectInitMediaLogs(stream_flags);
|
| - EXPECT_CALL(*this, InitSegmentReceived());
|
| + EXPECT_CALL(*this, InitSegmentReceived(_));
|
| } else {
|
| // OnNewConfigs() requires at least one audio, video, or text track.
|
| EXPECT_MEDIA_LOG(StreamParsingFailed());
|
| @@ -883,11 +891,11 @@ class ChunkDemuxerTest : public ::testing::Test {
|
| // incompatible with InSequence tests. Refactoring of the duration
|
| // set expectation to not be added during CreateInitDoneCB() could fix this.
|
| ExpectInitMediaLogs(audio_flags);
|
| - EXPECT_CALL(*this, InitSegmentReceived());
|
| + EXPECT_CALL(*this, InitSegmentReceived(_));
|
| AppendInitSegmentWithSourceId(audio_id, audio_flags);
|
|
|
| ExpectInitMediaLogs(video_flags);
|
| - EXPECT_CALL(*this, InitSegmentReceived());
|
| + EXPECT_CALL(*this, InitSegmentReceived(_));
|
| AppendInitSegmentWithSourceId(video_id, video_flags);
|
| return true;
|
| }
|
| @@ -923,7 +931,7 @@ class ChunkDemuxerTest : public ::testing::Test {
|
| // Adding expectation prior to CreateInitDoneCB() here because InSequence
|
| // tests require init segment received before duration set.
|
| ExpectInitMediaLogs(HAS_AUDIO | HAS_VIDEO);
|
| - EXPECT_CALL(*this, InitSegmentReceived());
|
| + EXPECT_CALL(*this, InitSegmentReceived(_));
|
| demuxer_->Initialize(
|
| &host_, CreateInitDoneCB(base::TimeDelta::FromMilliseconds(2744),
|
| PIPELINE_OK), true);
|
| @@ -949,7 +957,7 @@ class ChunkDemuxerTest : public ::testing::Test {
|
| // media/test/data/bear-320x240-manifest.js which were
|
| // generated from media/test/data/bear-640x360.webm and
|
| // media/test/data/bear-320x240.webm respectively.
|
| - EXPECT_CALL(*this, InitSegmentReceived());
|
| + EXPECT_CALL(*this, InitSegmentReceived(_));
|
| AppendData(bear2->data(), 4340);
|
|
|
| // Append a media segment that goes from [0.527000, 1.014000).
|
| @@ -960,7 +968,7 @@ class ChunkDemuxerTest : public ::testing::Test {
|
|
|
| // Append initialization segment for bear1 & fill gap with [779-1197)
|
| // segment.
|
| - EXPECT_CALL(*this, InitSegmentReceived());
|
| + EXPECT_CALL(*this, InitSegmentReceived(_));
|
| AppendData(bear1->data(), 4370);
|
| EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(23));
|
| EXPECT_MEDIA_LOG(GeneratedSplice(26000, 779000));
|
| @@ -1308,7 +1316,7 @@ class ChunkDemuxerTest : public ::testing::Test {
|
|
|
| // Read a WebM file into memory and send the data to the demuxer.
|
| scoped_refptr<DecoderBuffer> buffer = ReadTestDataFile(filename);
|
| - EXPECT_CALL(*this, InitSegmentReceived());
|
| + EXPECT_CALL(*this, InitSegmentReceived(_));
|
| AppendDataInPieces(buffer->data(), buffer->data_size(), 512);
|
|
|
| // Verify that the timestamps on the first few packets match what we
|
| @@ -1345,7 +1353,7 @@ class ChunkDemuxerTest : public ::testing::Test {
|
| void(EmeInitDataType init_data_type,
|
| const std::vector<uint8_t>& init_data));
|
|
|
| - MOCK_METHOD0(InitSegmentReceived, void(void));
|
| + MOCK_METHOD1(InitSegmentReceived, void(scoped_ptr<MediaTracks>&));
|
|
|
| void Seek(base::TimeDelta seek_time) {
|
| demuxer_->StartWaitingForSeek(seek_time);
|
| @@ -1373,7 +1381,7 @@ class ChunkDemuxerTest : public ::testing::Test {
|
| scoped_refptr<StrictMock<MockMediaLog>> media_log_;
|
|
|
| scoped_ptr<ChunkDemuxer> demuxer_;
|
| - MediaSourceState::InitSegmentReceivedCB init_segment_received_cb_;
|
| + Demuxer::MediaTracksUpdatedCB init_segment_received_cb_;
|
|
|
| base::TimeDelta append_window_start_for_next_append_;
|
| base::TimeDelta append_window_end_for_next_append_;
|
| @@ -1382,6 +1390,12 @@ class ChunkDemuxerTest : public ::testing::Test {
|
| // operation for that source id.
|
| std::map<std::string, base::TimeDelta> timestamp_offset_map_;
|
|
|
| + public:
|
| + // A workaround for gtest mocks not allowing moving scoped_ptrs.
|
| + void InitSegmentReceivedWrapper(scoped_ptr<MediaTracks> tracks) {
|
| + InitSegmentReceived(tracks);
|
| + }
|
| +
|
| private:
|
| DISALLOW_COPY_AND_ASSIGN(ChunkDemuxerTest);
|
| };
|
| @@ -1547,12 +1561,11 @@ TEST_F(ChunkDemuxerTest, SingleTextTrackIdChange) {
|
| CreateInitSegmentWithAlternateTextTrackNum(HAS_TEXT | HAS_AUDIO | HAS_VIDEO,
|
| false, false,
|
| &info_tracks, &info_tracks_size);
|
| - EXPECT_CALL(*this, InitSegmentReceived());
|
| + EXPECT_CALL(*this, InitSegmentReceived(_));
|
| demuxer_->AppendData(kSourceId, info_tracks.get(), info_tracks_size,
|
| append_window_start_for_next_append_,
|
| append_window_end_for_next_append_,
|
| - ×tamp_offset_map_[kSourceId],
|
| - init_segment_received_cb_);
|
| + ×tamp_offset_map_[kSourceId]);
|
|
|
| AppendMuxedCluster(
|
| MuxedStreamInfo(kAudioTrackNum, "46K 69K", 23),
|
| @@ -1592,7 +1605,7 @@ TEST_F(ChunkDemuxerTest, InitSegmentSetsNeedRandomAccessPointFlag) {
|
| MuxedStreamInfo(kTextTrackNum, "25K 40K"));
|
| CheckExpectedRanges("{ [23,46) }");
|
|
|
| - EXPECT_CALL(*this, InitSegmentReceived());
|
| + EXPECT_CALL(*this, InitSegmentReceived(_));
|
| AppendInitSegment(HAS_TEXT | HAS_AUDIO | HAS_VIDEO);
|
| AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "46K 69K", 23),
|
| MuxedStreamInfo(kVideoTrackNum, "60 90K", 30),
|
| @@ -1616,7 +1629,7 @@ TEST_F(ChunkDemuxerTest, Shutdown_BeforeAllInitSegmentsAppended) {
|
| EXPECT_EQ(AddId("video", HAS_VIDEO), ChunkDemuxer::kOk);
|
|
|
| ExpectInitMediaLogs(HAS_AUDIO);
|
| - EXPECT_CALL(*this, InitSegmentReceived());
|
| + EXPECT_CALL(*this, InitSegmentReceived(_));
|
| AppendInitSegmentWithSourceId("audio", HAS_AUDIO);
|
|
|
| ShutdownDemuxer();
|
| @@ -1635,7 +1648,7 @@ TEST_F(ChunkDemuxerTest, Shutdown_BeforeAllInitSegmentsAppendedText) {
|
| .Times(Exactly(1));
|
|
|
| ExpectInitMediaLogs(HAS_VIDEO);
|
| - EXPECT_CALL(*this, InitSegmentReceived());
|
| + EXPECT_CALL(*this, InitSegmentReceived(_));
|
| AppendInitSegmentWithSourceId("video_and_text", HAS_VIDEO | HAS_TEXT);
|
|
|
| ShutdownDemuxer();
|
| @@ -1745,8 +1758,7 @@ TEST_F(ChunkDemuxerTest, AppendDataBeforeInit) {
|
| demuxer_->AppendData(kSourceId, info_tracks.get(), info_tracks_size,
|
| append_window_start_for_next_append_,
|
| append_window_end_for_next_append_,
|
| - ×tamp_offset_map_[kSourceId],
|
| - init_segment_received_cb_);
|
| + ×tamp_offset_map_[kSourceId]);
|
| }
|
|
|
| // Make sure Read() callbacks are dispatched with the proper data.
|
| @@ -1785,8 +1797,7 @@ TEST_F(ChunkDemuxerTest, OutOfOrderClusters) {
|
| demuxer_->AppendData(kSourceId, cluster_c->data(), cluster_c->size(),
|
| append_window_start_for_next_append_,
|
| append_window_end_for_next_append_,
|
| - ×tamp_offset_map_[kSourceId],
|
| - init_segment_received_cb_);
|
| + ×tamp_offset_map_[kSourceId]);
|
| }
|
|
|
| TEST_F(ChunkDemuxerTest, NonMonotonicButAboveClusterTimecode) {
|
| @@ -1813,8 +1824,7 @@ TEST_F(ChunkDemuxerTest, NonMonotonicButAboveClusterTimecode) {
|
| demuxer_->AppendData(kSourceId, cluster_b->data(), cluster_b->size(),
|
| append_window_start_for_next_append_,
|
| append_window_end_for_next_append_,
|
| - ×tamp_offset_map_[kSourceId],
|
| - init_segment_received_cb_);
|
| + ×tamp_offset_map_[kSourceId]);
|
| }
|
|
|
| TEST_F(ChunkDemuxerTest, BackwardsAndBeforeClusterTimecode) {
|
| @@ -1841,8 +1851,7 @@ TEST_F(ChunkDemuxerTest, BackwardsAndBeforeClusterTimecode) {
|
| demuxer_->AppendData(kSourceId, cluster_b->data(), cluster_b->size(),
|
| append_window_start_for_next_append_,
|
| append_window_end_for_next_append_,
|
| - ×tamp_offset_map_[kSourceId],
|
| - init_segment_received_cb_);
|
| + ×tamp_offset_map_[kSourceId]);
|
| }
|
|
|
|
|
| @@ -2157,7 +2166,7 @@ TEST_F(ChunkDemuxerTest, AppendingInPieces) {
|
| dst += cluster_b->size();
|
|
|
| ExpectInitMediaLogs(HAS_AUDIO | HAS_VIDEO);
|
| - EXPECT_CALL(*this, InitSegmentReceived());
|
| + EXPECT_CALL(*this, InitSegmentReceived(_));
|
| AppendDataInPieces(buffer.get(), buffer_size);
|
|
|
| GenerateExpectedReads(0, 9);
|
| @@ -2331,11 +2340,9 @@ TEST_F(ChunkDemuxerTest, ParseErrorDuringInit) {
|
|
|
| EXPECT_MEDIA_LOG(StreamParsingFailed());
|
| uint8_t tmp = 0;
|
| - demuxer_->AppendData(kSourceId, &tmp, 1,
|
| - append_window_start_for_next_append_,
|
| + demuxer_->AppendData(kSourceId, &tmp, 1, append_window_start_for_next_append_,
|
| append_window_end_for_next_append_,
|
| - ×tamp_offset_map_[kSourceId],
|
| - init_segment_received_cb_);
|
| + ×tamp_offset_map_[kSourceId]);
|
| }
|
|
|
| TEST_F(ChunkDemuxerTest, AVHeadersWithAudioOnlyType) {
|
| @@ -2348,6 +2355,9 @@ TEST_F(ChunkDemuxerTest, AVHeadersWithAudioOnlyType) {
|
| codecs[0] = "vorbis";
|
| ASSERT_EQ(demuxer_->AddId(kSourceId, "audio/webm", codecs),
|
| ChunkDemuxer::kOk);
|
| + demuxer_->SetTracksWatcher(
|
| + kSourceId, base::Bind(&ChunkDemuxerTest::InitSegmentReceivedWrapper,
|
| + base::Unretained(this)));
|
|
|
| // Video track is unexpected per mimetype.
|
| EXPECT_MEDIA_LOG(InitSegmentMismatchesMimeType("a video", true));
|
| @@ -2365,6 +2375,9 @@ TEST_F(ChunkDemuxerTest, AVHeadersWithVideoOnlyType) {
|
| codecs[0] = "vp8";
|
| ASSERT_EQ(demuxer_->AddId(kSourceId, "video/webm", codecs),
|
| ChunkDemuxer::kOk);
|
| + demuxer_->SetTracksWatcher(
|
| + kSourceId, base::Bind(&ChunkDemuxerTest::InitSegmentReceivedWrapper,
|
| + base::Unretained(this)));
|
|
|
| // Audio track is unexpected per mimetype.
|
| EXPECT_MEDIA_LOG(InitSegmentMismatchesMimeType("an audio", true));
|
| @@ -2382,6 +2395,9 @@ TEST_F(ChunkDemuxerTest, AudioOnlyHeaderWithAVType) {
|
| codecs[1] = "vp8";
|
| ASSERT_EQ(demuxer_->AddId(kSourceId, "video/webm", codecs),
|
| ChunkDemuxer::kOk);
|
| + demuxer_->SetTracksWatcher(
|
| + kSourceId, base::Bind(&ChunkDemuxerTest::InitSegmentReceivedWrapper,
|
| + base::Unretained(this)));
|
|
|
| // Video track is also expected per mimetype.
|
| EXPECT_MEDIA_LOG(InitSegmentMismatchesMimeType("a video", false));
|
| @@ -2399,6 +2415,9 @@ TEST_F(ChunkDemuxerTest, VideoOnlyHeaderWithAVType) {
|
| codecs[1] = "vp8";
|
| ASSERT_EQ(demuxer_->AddId(kSourceId, "video/webm", codecs),
|
| ChunkDemuxer::kOk);
|
| + demuxer_->SetTracksWatcher(
|
| + kSourceId, base::Bind(&ChunkDemuxerTest::InitSegmentReceivedWrapper,
|
| + base::Unretained(this)));
|
|
|
| // Audio track is also expected per mimetype.
|
| EXPECT_MEDIA_LOG(InitSegmentMismatchesMimeType("an audio", false));
|
| @@ -2412,7 +2431,7 @@ TEST_F(ChunkDemuxerTest, MultipleHeaders) {
|
| AppendCluster(kDefaultFirstCluster());
|
|
|
| // Append another identical initialization segment.
|
| - EXPECT_CALL(*this, InitSegmentReceived());
|
| + EXPECT_CALL(*this, InitSegmentReceived(_));
|
| AppendInitSegment(HAS_AUDIO | HAS_VIDEO);
|
|
|
| AppendCluster(kDefaultSecondCluster());
|
| @@ -2468,7 +2487,7 @@ TEST_F(ChunkDemuxerTest, AddIdFailures) {
|
| ASSERT_EQ(AddId(), ChunkDemuxer::kReachedIdLimit);
|
|
|
| ExpectInitMediaLogs(HAS_AUDIO);
|
| - EXPECT_CALL(*this, InitSegmentReceived());
|
| + EXPECT_CALL(*this, InitSegmentReceived(_));
|
| AppendInitSegmentWithSourceId(audio_id, HAS_AUDIO);
|
|
|
| // Adding an id after append should fail.
|
| @@ -2712,7 +2731,7 @@ TEST_F(ChunkDemuxerTest, GetBufferedRanges_AudioIdOnly) {
|
|
|
| ASSERT_EQ(AddId(kSourceId, HAS_AUDIO), ChunkDemuxer::kOk);
|
| ExpectInitMediaLogs(HAS_AUDIO);
|
| - EXPECT_CALL(*this, InitSegmentReceived());
|
| + EXPECT_CALL(*this, InitSegmentReceived(_));
|
| AppendInitSegment(HAS_AUDIO);
|
|
|
| // Test a simple cluster.
|
| @@ -2736,7 +2755,7 @@ TEST_F(ChunkDemuxerTest, GetBufferedRanges_VideoIdOnly) {
|
|
|
| ASSERT_EQ(AddId(kSourceId, HAS_VIDEO), ChunkDemuxer::kOk);
|
| ExpectInitMediaLogs(HAS_VIDEO);
|
| - EXPECT_CALL(*this, InitSegmentReceived());
|
| + EXPECT_CALL(*this, InitSegmentReceived(_));
|
| AppendInitSegment(HAS_VIDEO);
|
|
|
| // Test a simple cluster.
|
| @@ -3406,7 +3425,7 @@ TEST_F(ChunkDemuxerTest, EmitBuffersDuringAbort) {
|
| // PTS: 353788 (0x000565fc) [= 90 kHz-Timestamp: 0:00:03.9309]
|
|
|
| scoped_refptr<DecoderBuffer> buffer = ReadTestDataFile("bear-1280x720.ts");
|
| - EXPECT_CALL(*this, InitSegmentReceived());
|
| + EXPECT_CALL(*this, InitSegmentReceived(_));
|
| AppendData(kSourceId, buffer->data(), buffer->data_size());
|
|
|
| // Confirm we're in the middle of parsing a media segment.
|
| @@ -3454,7 +3473,7 @@ TEST_F(ChunkDemuxerTest, SeekCompleteDuringAbort) {
|
| // PTS: 353788 (0x000565fc) [= 90 kHz-Timestamp: 0:00:03.9309]
|
|
|
| scoped_refptr<DecoderBuffer> buffer = ReadTestDataFile("bear-1280x720.ts");
|
| - EXPECT_CALL(*this, InitSegmentReceived());
|
| + EXPECT_CALL(*this, InitSegmentReceived(_));
|
| AppendData(kSourceId, buffer->data(), buffer->data_size());
|
|
|
| // Confirm we're in the middle of parsing a media segment.
|
| @@ -4065,7 +4084,7 @@ TEST_F(ChunkDemuxerTest, AppendWindow_WebMFile_AudioOnly) {
|
| scoped_refptr<DecoderBuffer> buffer =
|
| ReadTestDataFile("bear-320x240-audio-only.webm");
|
| ExpectInitMediaLogs(HAS_AUDIO);
|
| - EXPECT_CALL(*this, InitSegmentReceived());
|
| + EXPECT_CALL(*this, InitSegmentReceived(_));
|
| EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(2));
|
| AppendDataInPieces(buffer->data(), buffer->data_size(), 128);
|
|
|
| @@ -4092,7 +4111,7 @@ TEST_F(ChunkDemuxerTest, AppendWindow_AudioConfigUpdateRemovesPreroll) {
|
| scoped_refptr<DecoderBuffer> buffer =
|
| ReadTestDataFile("bear-320x240-audio-only.webm");
|
| ExpectInitMediaLogs(HAS_AUDIO);
|
| - EXPECT_CALL(*this, InitSegmentReceived());
|
| + EXPECT_CALL(*this, InitSegmentReceived(_));
|
| EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(2));
|
| AppendDataInPieces(buffer->data(), buffer->data_size(), 512);
|
| CheckExpectedRanges("{ }");
|
| @@ -4103,7 +4122,7 @@ TEST_F(ChunkDemuxerTest, AppendWindow_AudioConfigUpdateRemovesPreroll) {
|
| // Read a second WebM with a different config in and append the data.
|
| scoped_refptr<DecoderBuffer> buffer2 =
|
| ReadTestDataFile("bear-320x240-audio-only-48khz.webm");
|
| - EXPECT_CALL(*this, InitSegmentReceived());
|
| + EXPECT_CALL(*this, InitSegmentReceived(_));
|
| EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(21));
|
| EXPECT_CALL(host_, SetDuration(_)).Times(AnyNumber());
|
| ASSERT_TRUE(SetTimestampOffset(kSourceId, duration_1));
|
|
|