diff options
author | xhwang@chromium.org <xhwang@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-06-25 00:31:58 +0000 |
---|---|---|
committer | xhwang@chromium.org <xhwang@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-06-25 00:31:58 +0000 |
commit | 24b49739e7470f7a37dd8c7e28b5ec9bf3637178 (patch) | |
tree | 1fd5dec5ef35906f060d7e78f1310a00fe6a03d7 /media | |
parent | 75359aa61c362e787b5508c2408560fb25f91dad (diff) | |
download | chromium_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.cc | 4 | ||||
-rw-r--r-- | media/filters/fake_video_decoder_unittest.cc | 17 | ||||
-rw-r--r-- | media/filters/video_frame_stream.cc | 5 | ||||
-rw-r--r-- | media/filters/video_frame_stream_unittest.cc | 33 |
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); |