Index: media/filters/video_renderer_base_unittest.cc |
diff --git a/media/filters/video_renderer_base_unittest.cc b/media/filters/video_renderer_base_unittest.cc |
index 88a1b1a8551b3dcc0d50504fc51337a5b551e07f..7d4161db3a2d8509bcfd8d5f913f15595cab23b1 100644 |
--- a/media/filters/video_renderer_base_unittest.cc |
+++ b/media/filters/video_renderer_base_unittest.cc |
@@ -178,6 +178,18 @@ class VideoRendererBaseTest : public ::testing::Test { |
} |
} |
+ void AbortRead() { |
+ // Lock+swap to avoid re-entrancy issues. |
+ VideoDecoder::ReadCB read_cb; |
+ { |
+ base::AutoLock l(lock_); |
+ CHECK(!read_cb_.is_null()) << "Can't deliver a frame without a callback"; |
+ std::swap(read_cb, read_cb_); |
+ } |
+ |
+ read_cb.Run(NULL); |
+ } |
+ |
void ExpectCurrentFrame(bool present) { |
scoped_refptr<VideoFrame> frame; |
renderer_->GetCurrentFrame(&frame); |
@@ -241,6 +253,11 @@ class VideoRendererBaseTest : public ::testing::Test { |
base::WaitableEvent* event() { return &event_; } |
const base::TimeDelta& timeout() { return timeout_; } |
+ void VerifyNotSeeking() { |
+ base::AutoLock l(lock_); |
+ ASSERT_FALSE(seeking_); |
+ } |
+ |
protected: |
StatisticsCallback NewStatisticsCallback() { |
return base::Bind(&MockStatisticsCallback::OnStatistics, |
@@ -475,4 +492,46 @@ TEST_F(VideoRendererBaseTest, Shutdown_DuringPaint) { |
Stop(); |
} |
+TEST_F(VideoRendererBaseTest, AbortPendingRead_Playing) { |
+ Initialize(); |
+ Play(); |
+ |
+ // Render a frame to trigger a Read(). |
+ EXPECT_CALL(*this, PaintCBWasCalled()); |
+ RenderFrame(kFrameDuration); |
+ |
+ AbortRead(); |
+ |
+ Pause(); |
+ Flush(); |
+ Seek(kFrameDuration * 6); |
+ ExpectCurrentTimestamp(kFrameDuration * 6); |
+ Shutdown(); |
+} |
+ |
+TEST_F(VideoRendererBaseTest, AbortPendingRead_Flush) { |
+ Initialize(); |
+ Play(); |
+ |
+ // Render a frame to trigger a Read(). |
+ EXPECT_CALL(*this, PaintCBWasCalled()); |
+ RenderFrame(kFrameDuration); |
+ |
+ Pause(); |
+ renderer_->Flush(NewWaitableClosure()); |
+ AbortRead(); |
+ WaitForClosure(); |
+ Shutdown(); |
+} |
+ |
+TEST_F(VideoRendererBaseTest, AbortPendingRead_Seek) { |
+ Initialize(); |
+ Pause(); |
+ Flush(); |
+ StartSeeking(kFrameDuration * 6); |
+ AbortRead(); |
+ VerifyNotSeeking(); |
+ Shutdown(); |
+} |
+ |
} // namespace media |