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 |