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 e6b3abab8469df58b0249198a02cbd485b52f74b..4e69e20bc0c9ca65f4afdb7998edd3097f733f03 100644 |
| --- a/media/filters/chunk_demuxer_unittest.cc |
| +++ b/media/filters/chunk_demuxer_unittest.cc |
| @@ -464,4 +464,147 @@ TEST_F(ChunkDemuxerTest, TestNetworkErrorEndOfStream) { |
| demuxer_->EndOfStream(PIPELINE_ERROR_NETWORK); |
| } |
| +static void OnEndOfStreamReadDone(bool* called, |
| + Buffer* buffer) { |
| + EXPECT_TRUE(buffer->IsEndOfStream()); |
| + *called = true; |
| +} |
| + |
| +// Make sure that all pending reads that we don't have media data for get an |
| +// "end of stream" buffer when EndOfStream() is called. |
| +TEST_F(ChunkDemuxerTest, TestEndOfStreamWithPendingReads) { |
| + InitDemuxer(true, true); |
| + |
| + scoped_refptr<DemuxerStream> audio = |
| + demuxer_->GetStream(DemuxerStream::AUDIO); |
| + scoped_refptr<DemuxerStream> video = |
| + demuxer_->GetStream(DemuxerStream::VIDEO); |
| + |
| + bool audio_read_done_1 = false; |
| + bool video_read_done_1 = false; |
| + bool audio_read_done_2 = false; |
| + bool video_read_done_2 = false; |
| + bool audio_read_done_3 = false; |
| + bool video_read_done_3 = false; |
| + |
| + audio->Read(base::Bind(&OnReadDone, |
| + base::TimeDelta::FromMilliseconds(32), |
| + &audio_read_done_1)); |
| + |
| + video->Read(base::Bind(&OnReadDone, |
| + base::TimeDelta::FromMilliseconds(123), |
| + &video_read_done_1)); |
| + |
| + audio->Read(base::Bind(&OnEndOfStreamReadDone, |
| + &audio_read_done_2)); |
| + |
| + video->Read(base::Bind(&OnEndOfStreamReadDone, |
| + &video_read_done_2)); |
| + |
| + audio->Read(base::Bind(&OnEndOfStreamReadDone, |
| + &audio_read_done_3)); |
| + |
| + video->Read(base::Bind(&OnEndOfStreamReadDone, |
| + &video_read_done_3)); |
| + |
| + ClusterBuilder cb; |
| + cb.SetClusterTimecode(0); |
| + AddSimpleBlock(&cb, kAudioTrackNum, 32); |
| + AddSimpleBlock(&cb, kVideoTrackNum, 123); |
| + scoped_ptr<Cluster> cluster(cb.Finish()); |
| + |
| + AppendData(cluster->data(), cluster->size()); |
| + |
| + EXPECT_TRUE(audio_read_done_1); |
| + EXPECT_TRUE(video_read_done_1); |
| + EXPECT_FALSE(audio_read_done_2); |
| + EXPECT_FALSE(video_read_done_2); |
| + EXPECT_FALSE(audio_read_done_3); |
| + EXPECT_FALSE(video_read_done_3); |
| + |
| + demuxer_->EndOfStream(PIPELINE_OK); |
| + |
| + EXPECT_TRUE(audio_read_done_2); |
| + EXPECT_TRUE(video_read_done_2); |
| + EXPECT_TRUE(audio_read_done_3); |
| + EXPECT_TRUE(video_read_done_3); |
| +} |
| + |
| +// Make sure that all Read() calls after we get an EndOfStream() |
| +// call return an "end of stream" buffer. |
| +TEST_F(ChunkDemuxerTest, TestReadsAfterEndOfStream) { |
| + InitDemuxer(true, true); |
| + |
| + scoped_refptr<DemuxerStream> audio = |
| + demuxer_->GetStream(DemuxerStream::AUDIO); |
| + scoped_refptr<DemuxerStream> video = |
| + demuxer_->GetStream(DemuxerStream::VIDEO); |
| + |
| + bool audio_read_done_1 = false; |
|
scherkus (not reviewing)
2011/08/30 00:59:52
I wonder if there's a more terse way to write thes
acolwell GONE FROM CHROMIUM
2011/08/30 17:01:45
Done.
|
| + bool video_read_done_1 = false; |
| + bool audio_read_done_2 = false; |
| + bool video_read_done_2 = false; |
| + bool audio_read_done_3 = false; |
| + bool video_read_done_3 = false; |
| + bool audio_read_done_4 = false; |
| + bool video_read_done_4 = false; |
| + |
| + audio->Read(base::Bind(&OnReadDone, |
| + base::TimeDelta::FromMilliseconds(32), |
| + &audio_read_done_1)); |
| + |
| + video->Read(base::Bind(&OnReadDone, |
| + base::TimeDelta::FromMilliseconds(123), |
| + &video_read_done_1)); |
| + |
| + audio->Read(base::Bind(&OnEndOfStreamReadDone, |
| + &audio_read_done_2)); |
| + |
| + video->Read(base::Bind(&OnEndOfStreamReadDone, |
| + &video_read_done_2)); |
| + |
| + audio->Read(base::Bind(&OnEndOfStreamReadDone, |
| + &audio_read_done_3)); |
| + |
| + video->Read(base::Bind(&OnEndOfStreamReadDone, |
| + &video_read_done_3)); |
| + |
| + ClusterBuilder cb; |
| + cb.SetClusterTimecode(0); |
| + AddSimpleBlock(&cb, kAudioTrackNum, 32); |
| + AddSimpleBlock(&cb, kVideoTrackNum, 123); |
| + scoped_ptr<Cluster> cluster(cb.Finish()); |
| + |
| + AppendData(cluster->data(), cluster->size()); |
| + |
| + EXPECT_TRUE(audio_read_done_1); |
| + EXPECT_TRUE(video_read_done_1); |
| + EXPECT_FALSE(audio_read_done_2); |
| + EXPECT_FALSE(video_read_done_2); |
| + |
| + demuxer_->EndOfStream(PIPELINE_OK); |
| + |
| + EXPECT_TRUE(audio_read_done_2); |
| + EXPECT_TRUE(video_read_done_2); |
| + |
| + audio->Read(base::Bind(&OnEndOfStreamReadDone, |
| + &audio_read_done_3)); |
| + |
| + video->Read(base::Bind(&OnEndOfStreamReadDone, |
| + &video_read_done_3)); |
| + |
| + EXPECT_TRUE(audio_read_done_3); |
| + EXPECT_TRUE(video_read_done_3); |
| + |
| + audio->Read(base::Bind(&OnEndOfStreamReadDone, |
| + &audio_read_done_4)); |
| + |
| + video->Read(base::Bind(&OnEndOfStreamReadDone, |
| + &video_read_done_4)); |
| + |
| + EXPECT_TRUE(audio_read_done_4); |
| + EXPECT_TRUE(video_read_done_4); |
| + |
|
scherkus (not reviewing)
2011/08/30 00:59:52
nit: blank line
acolwell GONE FROM CHROMIUM
2011/08/30 17:01:45
Done.
|
| +} |
| + |
| } // namespace media |