Chromium Code Reviews| Index: media/filters/chunk_demuxer_unittest.cc |
| diff --git a/media/filters/chunk_demuxer_unittest.cc b/media/filters/chunk_demuxer_unittest.cc |
| index 4ac5616b72e6b5dda8dd7b7d2e3d3f7d64687565..a410fe00e9227879c89a6ca6285f1d538f2a19a3 100644 |
| --- a/media/filters/chunk_demuxer_unittest.cc |
| +++ b/media/filters/chunk_demuxer_unittest.cc |
| @@ -162,6 +162,9 @@ class ChunkDemuxerTest : public ::testing::Test { |
| ChunkDemuxerTest() |
| : append_window_end_for_next_append_(kInfiniteDuration()) { |
| + init_segment_received_cb_ = |
| + base::Bind(&ChunkDemuxerTest::InitSegmentReceived, |
| + base::Unretained(this)); |
| CreateNewDemuxer(); |
| } |
| @@ -573,7 +576,8 @@ class ChunkDemuxerTest : public ::testing::Test { |
| demuxer_->AppendData(source_id, data, length, |
| append_window_start_for_next_append_, |
| append_window_end_for_next_append_, |
| - ×tamp_offset_map_[source_id]); |
| + ×tamp_offset_map_[source_id], |
| + init_segment_received_cb_); |
| } |
| void AppendDataInPieces(const uint8* data, size_t length) { |
| @@ -591,24 +595,33 @@ class ChunkDemuxerTest : public ::testing::Test { |
| } |
| } |
| - void AppendInitSegment(int stream_flags) { |
| - AppendInitSegmentWithSourceId(kSourceId, stream_flags); |
| + void AppendInitSegment(int stream_flags, bool expect_init_segment_received) { |
| + AppendInitSegmentWithSourceId(kSourceId, stream_flags, |
| + expect_init_segment_received); |
| } |
| void AppendInitSegmentWithSourceId(const std::string& source_id, |
| - int stream_flags) { |
| - AppendInitSegmentWithEncryptedInfo(source_id, stream_flags, false, false); |
| + int stream_flags, |
| + bool expect_init_segment_received) { |
| + AppendInitSegmentWithEncryptedInfo(source_id, stream_flags, |
| + expect_init_segment_received, |
| + false, false); |
| } |
| void AppendInitSegmentWithEncryptedInfo(const std::string& source_id, |
| int stream_flags, |
| + bool expect_init_segment_received, |
| bool is_audio_encrypted, |
| bool is_video_encrypted) { |
| + DCHECK(!expect_init_segment_received || stream_flags > 0) |
| + << "Do not expect an init segment received when there are no tracks"; |
| scoped_ptr<uint8[]> info_tracks; |
| int info_tracks_size = 0; |
| CreateInitSegment(stream_flags, |
| is_audio_encrypted, is_video_encrypted, |
| &info_tracks, &info_tracks_size); |
| + if (expect_init_segment_received) |
| + EXPECT_CALL(*this, InitSegmentReceived()); |
| AppendData(source_id, info_tracks.get(), info_tracks_size); |
| } |
| @@ -664,6 +677,14 @@ class ChunkDemuxerTest : public ::testing::Test { |
| expected_duration = kDefaultDuration(); |
| EXPECT_CALL(*this, DemuxerOpened()); |
| + |
| + // Adding expectation prior to CreateInitDoneCB() here because InSequence |
| + // tests require init segment received before duration set. Also, only |
| + // expect an init segment received callback if there is actually a track in |
| + // it. |
| + if (stream_flags != 0) |
| + EXPECT_CALL(*this, InitSegmentReceived()); |
| + |
| demuxer_->Initialize( |
| &host_, CreateInitDoneCB(expected_duration, expected_status), true); |
| @@ -671,7 +692,7 @@ class ChunkDemuxerTest : public ::testing::Test { |
| return false; |
| AppendInitSegmentWithEncryptedInfo( |
| - kSourceId, stream_flags, |
| + kSourceId, stream_flags, false, |
| is_audio_encrypted, is_video_encrypted); |
| return true; |
| } |
| @@ -696,8 +717,8 @@ class ChunkDemuxerTest : public ::testing::Test { |
| video_flags |= HAS_TEXT; |
| } |
| - AppendInitSegmentWithSourceId(audio_id, audio_flags); |
| - AppendInitSegmentWithSourceId(video_id, video_flags); |
| + AppendInitSegmentWithSourceId(audio_id, audio_flags, true); |
| + AppendInitSegmentWithSourceId(video_id, video_flags, true); |
| return true; |
| } |
| @@ -729,6 +750,9 @@ class ChunkDemuxerTest : public ::testing::Test { |
| EXPECT_CALL(*this, DemuxerOpened()); |
| + // Adding expectation prior to CreateInitDoneCB() here because InSequence |
| + // tests require init segment received before duration set. |
| + EXPECT_CALL(*this, InitSegmentReceived()); |
| demuxer_->Initialize( |
| &host_, CreateInitDoneCB(base::TimeDelta::FromMilliseconds(2744), |
| PIPELINE_OK), true); |
| @@ -755,6 +779,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()); |
| AppendData(bear2->data(), 4340); |
| // Append a media segment that goes from [0.527000, 1.014000). |
| @@ -763,6 +788,7 @@ class ChunkDemuxerTest : public ::testing::Test { |
| // Append initialization segment for bear1 & fill gap with [779-1197) |
| // segment. |
| + EXPECT_CALL(*this, InitSegmentReceived()); |
| AppendData(bear1->data(), 4370); |
| AppendData(bear1->data() + 72737, 28183); |
| CheckExpectedRanges(kSourceId, "{ [0,2736) }"); |
| @@ -1087,6 +1113,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()); |
| AppendDataInPieces(buffer->data(), buffer->data_size(), 512); |
| // Verify that the timestamps on the first few packets match what we |
| @@ -1131,6 +1158,8 @@ class ChunkDemuxerTest : public ::testing::Test { |
| NeedKeyMock(type, init_data_ptr, init_data.size()); |
| } |
| + MOCK_METHOD0(InitSegmentReceived, void(void)); |
| + |
| void Seek(base::TimeDelta seek_time) { |
| demuxer_->StartWaitingForSeek(seek_time); |
| demuxer_->Seek(seek_time, NewExpectedStatusCB(PIPELINE_OK)); |
| @@ -1155,6 +1184,7 @@ class ChunkDemuxerTest : public ::testing::Test { |
| MockDemuxerHost host_; |
| scoped_ptr<ChunkDemuxer> demuxer_; |
| + ChunkDemuxer::InitSegmentReceivedCB init_segment_received_cb_; |
| base::TimeDelta append_window_start_for_next_append_; |
| base::TimeDelta append_window_end_for_next_append_; |
| @@ -1337,10 +1367,12 @@ TEST_F(ChunkDemuxerTest, SingleTextTrackIdChange) { |
| CreateInitSegmentWithAlternateTextTrackNum(HAS_TEXT | HAS_AUDIO | HAS_VIDEO, |
| false, false, |
| &info_tracks, &info_tracks_size); |
| + 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]); |
| + ×tamp_offset_map_[kSourceId], |
| + init_segment_received_cb_); |
| AppendMuxedCluster( |
| MuxedStreamInfo(kAudioTrackNum, "46K 69K"), |
| @@ -1378,7 +1410,7 @@ TEST_F(ChunkDemuxerTest, InitSegmentSetsNeedRandomAccessPointFlag) { |
| MuxedStreamInfo(kTextTrackNum, "25K 40K")); |
| CheckExpectedRanges(kSourceId, "{ [23,46) }"); |
| - AppendInitSegment(HAS_TEXT | HAS_AUDIO | HAS_VIDEO); |
| + AppendInitSegment(HAS_TEXT | HAS_AUDIO | HAS_VIDEO, true); |
| AppendMuxedCluster( |
| MuxedStreamInfo(kAudioTrackNum, "46K 69K"), |
| MuxedStreamInfo(kVideoTrackNum, "60 90K"), |
| @@ -1401,7 +1433,7 @@ TEST_F(ChunkDemuxerTest, Shutdown_BeforeAllInitSegmentsAppended) { |
| EXPECT_EQ(AddId("audio", HAS_AUDIO), ChunkDemuxer::kOk); |
| EXPECT_EQ(AddId("video", HAS_VIDEO), ChunkDemuxer::kOk); |
| - AppendInitSegmentWithSourceId("audio", HAS_AUDIO); |
| + AppendInitSegmentWithSourceId("audio", HAS_AUDIO, true); |
| ShutdownDemuxer(); |
| } |
| @@ -1418,7 +1450,7 @@ TEST_F(ChunkDemuxerTest, Shutdown_BeforeAllInitSegmentsAppendedText) { |
| EXPECT_CALL(host_, AddTextStream(_, _)) |
| .Times(Exactly(1)); |
| - AppendInitSegmentWithSourceId("video_and_text", HAS_VIDEO | HAS_TEXT); |
| + AppendInitSegmentWithSourceId("video_and_text", HAS_VIDEO | HAS_TEXT, true); |
| ShutdownDemuxer(); |
| } |
| @@ -1526,7 +1558,8 @@ 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]); |
| + ×tamp_offset_map_[kSourceId], |
| + init_segment_received_cb_); |
| } |
| // Make sure Read() callbacks are dispatched with the proper data. |
| @@ -1562,7 +1595,8 @@ 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]); |
| + ×tamp_offset_map_[kSourceId], |
| + init_segment_received_cb_); |
| } |
| TEST_F(ChunkDemuxerTest, NonMonotonicButAboveClusterTimecode) { |
| @@ -1587,7 +1621,8 @@ 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]); |
| + ×tamp_offset_map_[kSourceId], |
| + init_segment_received_cb_); |
| } |
| TEST_F(ChunkDemuxerTest, BackwardsAndBeforeClusterTimecode) { |
| @@ -1612,7 +1647,8 @@ 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]); |
| + ×tamp_offset_map_[kSourceId], |
| + init_segment_received_cb_); |
| } |
| @@ -1923,6 +1959,7 @@ TEST_F(ChunkDemuxerTest, AppendingInPieces) { |
| memcpy(dst, cluster_b->data(), cluster_b->size()); |
| dst += cluster_b->size(); |
| + EXPECT_CALL(*this, InitSegmentReceived()); |
| AppendDataInPieces(buffer.get(), buffer_size); |
| GenerateExpectedReads(0, 9); |
| @@ -2081,7 +2118,8 @@ TEST_F(ChunkDemuxerTest, ParseErrorDuringInit) { |
| demuxer_->AppendData(kSourceId, &tmp, 1, |
| append_window_start_for_next_append_, |
| append_window_end_for_next_append_, |
| - ×tamp_offset_map_[kSourceId]); |
| + ×tamp_offset_map_[kSourceId], |
| + init_segment_received_cb_); |
| } |
| TEST_F(ChunkDemuxerTest, AVHeadersWithAudioOnlyType) { |
| @@ -2095,7 +2133,7 @@ TEST_F(ChunkDemuxerTest, AVHeadersWithAudioOnlyType) { |
| ASSERT_EQ(demuxer_->AddId(kSourceId, "audio/webm", codecs), |
| ChunkDemuxer::kOk); |
| - AppendInitSegment(HAS_AUDIO | HAS_VIDEO); |
| + AppendInitSegment(HAS_AUDIO | HAS_VIDEO, false); |
| } |
| TEST_F(ChunkDemuxerTest, AVHeadersWithVideoOnlyType) { |
| @@ -2109,7 +2147,7 @@ TEST_F(ChunkDemuxerTest, AVHeadersWithVideoOnlyType) { |
| ASSERT_EQ(demuxer_->AddId(kSourceId, "video/webm", codecs), |
| ChunkDemuxer::kOk); |
| - AppendInitSegment(HAS_AUDIO | HAS_VIDEO); |
| + AppendInitSegment(HAS_AUDIO | HAS_VIDEO, false); |
| } |
| TEST_F(ChunkDemuxerTest, MultipleHeaders) { |
| @@ -2118,7 +2156,7 @@ TEST_F(ChunkDemuxerTest, MultipleHeaders) { |
| AppendCluster(kDefaultFirstCluster()); |
| // Append another identical initialization segment. |
| - AppendInitSegment(HAS_AUDIO | HAS_VIDEO); |
| + AppendInitSegment(HAS_AUDIO | HAS_VIDEO, true); |
|
acolwell GONE FROM CHROMIUM
2014/09/10 18:02:38
nit: I'm not sure this bool param is helping all t
wolenetz
2014/09/11 22:40:37
Done.
|
| AppendCluster(kDefaultSecondCluster()); |
| @@ -2172,7 +2210,7 @@ TEST_F(ChunkDemuxerTest, AddIdFailures) { |
| // Adding an id with audio/video should fail because we already added audio. |
| ASSERT_EQ(AddId(), ChunkDemuxer::kReachedIdLimit); |
| - AppendInitSegmentWithSourceId(audio_id, HAS_AUDIO); |
| + AppendInitSegmentWithSourceId(audio_id, HAS_AUDIO, true); |
| // Adding an id after append should fail. |
| ASSERT_EQ(AddId(video_id, HAS_VIDEO), ChunkDemuxer::kReachedIdLimit); |
| @@ -2404,7 +2442,7 @@ TEST_F(ChunkDemuxerTest, GetBufferedRanges_AudioIdOnly) { |
| &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK), true); |
| ASSERT_EQ(AddId(kSourceId, HAS_AUDIO), ChunkDemuxer::kOk); |
| - AppendInitSegment(HAS_AUDIO); |
| + AppendInitSegment(HAS_AUDIO, true); |
| // Test a simple cluster. |
| AppendCluster( |
| @@ -2426,7 +2464,7 @@ TEST_F(ChunkDemuxerTest, GetBufferedRanges_VideoIdOnly) { |
| &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK), true); |
| ASSERT_EQ(AddId(kSourceId, HAS_VIDEO), ChunkDemuxer::kOk); |
| - AppendInitSegment(HAS_VIDEO); |
| + AppendInitSegment(HAS_VIDEO, true); |
| // Test a simple cluster. |
| AppendCluster( |
| @@ -3004,6 +3042,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()); |
| AppendData(kSourceId, buffer->data(), buffer->data_size()); |
| // Confirm we're in the middle of parsing a media segment. |
| @@ -3047,6 +3086,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()); |
| AppendData(kSourceId, buffer->data(), buffer->data_size()); |
| // Confirm we're in the middle of parsing a media segment. |
| @@ -3406,6 +3446,7 @@ TEST_F(ChunkDemuxerTest, AppendWindow_WebMFile_AudioOnly) { |
| // partial append window trim must come from a previous Append() call. |
| scoped_refptr<DecoderBuffer> buffer = |
| ReadTestDataFile("bear-320x240-audio-only.webm"); |
| + EXPECT_CALL(*this, InitSegmentReceived()); |
| AppendDataInPieces(buffer->data(), buffer->data_size(), 128); |
| DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::AUDIO); |
| @@ -3432,6 +3473,7 @@ TEST_F(ChunkDemuxerTest, AppendWindow_AudioConfigUpdateRemovesPreroll) { |
| // Read a WebM file into memory and append the data. |
| scoped_refptr<DecoderBuffer> buffer = |
| ReadTestDataFile("bear-320x240-audio-only.webm"); |
| + EXPECT_CALL(*this, InitSegmentReceived()); |
| AppendDataInPieces(buffer->data(), buffer->data_size(), 512); |
| CheckExpectedRanges(kSourceId, "{ }"); |
| @@ -3441,6 +3483,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(host_, SetDuration(_)).Times(AnyNumber()); |
| ASSERT_TRUE(SetTimestampOffset(kSourceId, duration_1)); |
| AppendDataInPieces(buffer2->data(), buffer2->data_size(), 512); |