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