Index: media/renderers/video_renderer_impl_unittest.cc |
diff --git a/media/renderers/video_renderer_impl_unittest.cc b/media/renderers/video_renderer_impl_unittest.cc |
index 737729c02fdb85dc5e096435b82da5c7157164ac..866d920453ca63a269f85ba322507761ae5d200c 100644 |
--- a/media/renderers/video_renderer_impl_unittest.cc |
+++ b/media/renderers/video_renderer_impl_unittest.cc |
@@ -413,7 +413,7 @@ class VideoRendererImplTest : public testing::Test { |
if (type == UnderflowTestType::NORMAL) |
QueueFrames("80 100 120 140 160"); |
else |
- QueueFrames("40 60 80"); |
+ QueueFrames("40 60 80 90"); |
SatisfyPendingRead(); |
event.RunAndWait(); |
} |
@@ -758,7 +758,7 @@ TEST_F(VideoRendererImplTest, RenderingStopsAfterOneFrameWithEOS) { |
InitializeWithLowDelay(true); |
QueueFrames("0"); |
- EXPECT_CALL(mock_cb_, FrameReceived(HasTimestamp(0))).Times(2); |
+ EXPECT_CALL(mock_cb_, FrameReceived(HasTimestamp(0))).Times(1); |
EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH)); |
EXPECT_CALL(mock_cb_, OnStatisticsUpdate(_)).Times(AnyNumber()); |
EXPECT_CALL(mock_cb_, OnVideoNaturalSizeChange(_)).Times(1); |
@@ -795,9 +795,9 @@ TEST_F(VideoRendererImplTest, RenderingStartedThenStopped) { |
last_pipeline_statistics.video_frames_dropped = 1; |
{ |
WaitableMessageLoopEvent event; |
- EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH)); |
- EXPECT_CALL(mock_cb_, FrameReceived(HasTimestamp(0))) |
+ EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH)) |
.WillOnce(RunClosure(event.GetClosure())); |
+ EXPECT_CALL(mock_cb_, FrameReceived(HasTimestamp(0))); |
EXPECT_CALL(mock_cb_, OnVideoNaturalSizeChange(_)).Times(1); |
EXPECT_CALL(mock_cb_, OnVideoOpacityChange(_)).Times(1); |
StartPlayingFrom(0); |
@@ -839,6 +839,48 @@ TEST_F(VideoRendererImplTest, RenderingStartedThenStopped) { |
Destroy(); |
} |
+// Tests the case where underflow evicts all frames before EOS. |
+TEST_F(VideoRendererImplTest, UnderflowEvictionBeforeEOS) { |
+ Initialize(); |
+ QueueFrames("0 30 60 90 100"); |
+ |
+ { |
+ SCOPED_TRACE("Waiting for BUFFERING_HAVE_ENOUGH"); |
+ WaitableMessageLoopEvent event; |
+ EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH)) |
+ .WillOnce(RunClosure(event.GetClosure())); |
+ EXPECT_CALL(mock_cb_, FrameReceived(_)).Times(AnyNumber()); |
+ EXPECT_CALL(mock_cb_, OnVideoNaturalSizeChange(_)).Times(1); |
+ EXPECT_CALL(mock_cb_, OnVideoOpacityChange(_)).Times(1); |
+ EXPECT_CALL(mock_cb_, OnStatisticsUpdate(_)).Times(AnyNumber()); |
+ StartPlayingFrom(0); |
+ event.RunAndWait(); |
+ } |
+ |
+ { |
+ SCOPED_TRACE("Waiting for BUFFERING_HAVE_NOTHING"); |
+ WaitableMessageLoopEvent event; |
+ EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING)) |
+ .WillOnce(RunClosure(event.GetClosure())); |
+ renderer_->OnTimeStateChanged(true); |
+ time_source_.StartTicking(); |
+ event.RunAndWait(); |
+ } |
+ |
+ WaitForPendingRead(); |
+ |
+ // Jump time far enough forward that no frames are valid. |
+ renderer_->OnTimeStateChanged(false); |
+ AdvanceTimeInMs(1000); |
+ time_source_.StopTicking(); |
+ |
+ // Providing the end of stream packet should remove all frames and exit. |
+ SatisfyPendingReadWithEndOfStream(); |
+ EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH)); |
+ WaitForEnded(); |
+ Destroy(); |
+} |
+ |
TEST_F(VideoRendererImplTest, StartPlayingFromThenFlushThenEOS) { |
Initialize(); |
QueueFrames("0 30 60 90"); |