summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
authorxhwang@chromium.org <xhwang@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-06-25 00:31:58 +0000
committerxhwang@chromium.org <xhwang@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-06-25 00:31:58 +0000
commit24b49739e7470f7a37dd8c7e28b5ec9bf3637178 (patch)
tree1fd5dec5ef35906f060d7e78f1310a00fe6a03d7 /media
parent75359aa61c362e787b5508c2408560fb25f91dad (diff)
downloadchromium_src-24b49739e7470f7a37dd8c7e28b5ec9bf3637178.zip
chromium_src-24b49739e7470f7a37dd8c7e28b5ec9bf3637178.tar.gz
chromium_src-24b49739e7470f7a37dd8c7e28b5ec9bf3637178.tar.bz2
Handle Stop during Reinitialization in VideoFrameStream.
BUG=253616 TEST=Added unittests to cover this. R=scherkus@chromium.org Review URL: https://codereview.chromium.org/17639003 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@208320 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media')
-rw-r--r--media/filters/fake_video_decoder.cc4
-rw-r--r--media/filters/fake_video_decoder_unittest.cc17
-rw-r--r--media/filters/video_frame_stream.cc5
-rw-r--r--media/filters/video_frame_stream_unittest.cc33
4 files changed, 57 insertions, 2 deletions
diff --git a/media/filters/fake_video_decoder.cc b/media/filters/fake_video_decoder.cc
index d5b9b41..9a59d1c 100644
--- a/media/filters/fake_video_decoder.cc
+++ b/media/filters/fake_video_decoder.cc
@@ -77,8 +77,8 @@ void FakeVideoDecoder::Stop(const base::Closure& closure) {
DCHECK(message_loop_->BelongsToCurrentThread());
stop_cb_.SetCallback(BindToCurrentLoop(closure));
- // Defer the reset if a read and/or a reset is pending.
- if (!read_cb_.IsNull() || !reset_cb_.IsNull())
+ // Defer the stop if an init, a read or a reset is pending.
+ if (!init_cb_.IsNull() || !read_cb_.IsNull() || !reset_cb_.IsNull())
return;
DoStop();
diff --git a/media/filters/fake_video_decoder_unittest.cc b/media/filters/fake_video_decoder_unittest.cc
index 45b2891..fc1cb14 100644
--- a/media/filters/fake_video_decoder_unittest.cc
+++ b/media/filters/fake_video_decoder_unittest.cc
@@ -43,6 +43,16 @@ class FakeVideoDecoderTest : public testing::Test {
message_loop_.RunUntilIdle();
}
+ void EnterPendingInitState() {
+ decoder_->HoldNextInit();
+ Initialize();
+ }
+
+ void SatisfyInit() {
+ decoder_->SatisfyInit();
+ message_loop_.RunUntilIdle();
+ }
+
// Callback for VideoDecoder::Read().
void FrameReady(VideoDecoder::Status status,
const scoped_refptr<VideoFrame>& frame) {
@@ -351,6 +361,13 @@ TEST_F(FakeVideoDecoderTest, Stop) {
StopAndExpect(OK);
}
+TEST_F(FakeVideoDecoderTest, Stop_DuringPendingInitialization) {
+ EnterPendingInitState();
+ EnterPendingStopState();
+ SatisfyInit();
+ SatisfyStop();
+}
+
TEST_F(FakeVideoDecoderTest, Stop_DuringPendingDemuxerRead) {
Initialize();
EnterPendingDemuxerReadState();
diff --git a/media/filters/video_frame_stream.cc b/media/filters/video_frame_stream.cc
index 5c90727..3cf2f37 100644
--- a/media/filters/video_frame_stream.cc
+++ b/media/filters/video_frame_stream.cc
@@ -298,6 +298,11 @@ void VideoFrameStream::OnDecoderReinitialized(PipelineStatus status) {
DCHECK(!read_cb_.is_null());
+ if (!stop_cb_.is_null()) {
+ base::ResetAndReturn(&read_cb_).Run(VideoDecoder::kOk, NULL);
+ return;
+ }
+
if (state_ == STATE_ERROR) {
base::ResetAndReturn(&read_cb_).Run(VideoDecoder::kDecodeError, NULL);
return;
diff --git a/media/filters/video_frame_stream_unittest.cc b/media/filters/video_frame_stream_unittest.cc
index 92e7cfa..332785cd 100644
--- a/media/filters/video_frame_stream_unittest.cc
+++ b/media/filters/video_frame_stream_unittest.cc
@@ -108,6 +108,7 @@ class VideoFrameStreamTest : public testing::TestWithParam<bool> {
DEMUXER_READ_NORMAL,
DEMUXER_READ_CONFIG_CHANGE,
DECODER_INIT,
+ DECODER_REINIT,
DECODER_READ,
DECODER_RESET,
DECODER_STOP
@@ -137,6 +138,11 @@ class VideoFrameStreamTest : public testing::TestWithParam<bool> {
message_loop_.RunUntilIdle();
break;
+ case DECODER_REINIT:
+ decoder_->HoldNextInit();
+ ReadUntilPending();
+ break;
+
case DECODER_READ:
decoder_->HoldNextRead();
ReadUntilPending();
@@ -176,6 +182,10 @@ class VideoFrameStreamTest : public testing::TestWithParam<bool> {
decoder_->SatisfyInit();
break;
+ case DECODER_REINIT:
+ decoder_->SatisfyInit();
+ break;
+
case DECODER_READ:
decoder_->SatisfyRead();
break;
@@ -272,6 +282,17 @@ TEST_P(VideoFrameStreamTest, Read_AfterReset) {
TEST_P(VideoFrameStreamTest, Reset_AfterInitialization) {
Initialize();
Reset();
+ ReadFrame();
+}
+
+TEST_P(VideoFrameStreamTest, Reset_DuringReinitialization) {
+ Initialize();
+ EnterPendingState(DECODER_REINIT);
+ // VideoDecoder::Reset() is not called when we reset during reinitialization.
+ EXPECT_CALL(*this, OnReset());
+ video_frame_stream_->Reset(
+ base::Bind(&VideoFrameStreamTest::OnReset, base::Unretained(this)));
+ SatisfyPendingCallback(DECODER_REINIT);
}
TEST_P(VideoFrameStreamTest, Reset_DuringNormalDemuxerRead) {
@@ -280,6 +301,7 @@ TEST_P(VideoFrameStreamTest, Reset_DuringNormalDemuxerRead) {
EnterPendingState(DECODER_RESET);
SatisfyPendingCallback(DEMUXER_READ_NORMAL);
SatisfyPendingCallback(DECODER_RESET);
+ ReadFrame();
}
TEST_P(VideoFrameStreamTest, Reset_DuringConfigChangeDemuxerRead) {
@@ -288,6 +310,7 @@ TEST_P(VideoFrameStreamTest, Reset_DuringConfigChangeDemuxerRead) {
EnterPendingState(DECODER_RESET);
SatisfyPendingCallback(DEMUXER_READ_CONFIG_CHANGE);
SatisfyPendingCallback(DECODER_RESET);
+ ReadFrame();
}
TEST_P(VideoFrameStreamTest, Reset_DuringNormalDecoderRead) {
@@ -296,12 +319,14 @@ TEST_P(VideoFrameStreamTest, Reset_DuringNormalDecoderRead) {
EnterPendingState(DECODER_RESET);
SatisfyPendingCallback(DECODER_READ);
SatisfyPendingCallback(DECODER_RESET);
+ ReadFrame();
}
TEST_P(VideoFrameStreamTest, Reset_AfterNormalRead) {
Initialize();
ReadFrame();
Reset();
+ ReadFrame();
}
TEST_P(VideoFrameStreamTest, Reset_AfterConfigChangeRead) {
@@ -331,6 +356,14 @@ TEST_P(VideoFrameStreamTest, Stop_AfterInitialization) {
Stop();
}
+TEST_P(VideoFrameStreamTest, Stop_DuringReinitialization) {
+ Initialize();
+ EnterPendingState(DECODER_REINIT);
+ EnterPendingState(DECODER_STOP);
+ SatisfyPendingCallback(DECODER_REINIT);
+ SatisfyPendingCallback(DECODER_STOP);
+}
+
TEST_P(VideoFrameStreamTest, Stop_DuringNormalDemuxerRead) {
Initialize();
EnterPendingState(DEMUXER_READ_NORMAL);