Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(443)

Unified Diff: media/filters/video_renderer_base_unittest.cc

Issue 9295020: Fix ChunkDemuxer seek deadlock (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Addressing more CR comments Created 8 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698