diff options
author | scherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-08-16 22:44:38 +0000 |
---|---|---|
committer | scherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-08-16 22:44:38 +0000 |
commit | 8d54553bb326629ab4026eefd777b6e34476e469 (patch) | |
tree | 5fc41d1fee228f8b6e899284a866d9199b11f3ab | |
parent | f223ee25283153065fc63fc15f270f4dfb911a74 (diff) | |
download | chromium_src-8d54553bb326629ab4026eefd777b6e34476e469.zip chromium_src-8d54553bb326629ab4026eefd777b6e34476e469.tar.gz chromium_src-8d54553bb326629ab4026eefd777b6e34476e469.tar.bz2 |
Make calling FFmpegDemuxer::Stop() multiple times illegal.
This was originally noticed in https://codereview.chromium.org/14503002/ but we decided to defer the investigation. Turns out the only offender was test code.
BUG=235933
Review URL: https://chromiumcodereview.appspot.com/22887018
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@218110 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | media/base/demuxer.h | 6 | ||||
-rw-r--r-- | media/filters/ffmpeg_demuxer.cc | 5 | ||||
-rw-r--r-- | media/filters/ffmpeg_demuxer_unittest.cc | 7 |
3 files changed, 10 insertions, 8 deletions
diff --git a/media/base/demuxer.h b/media/base/demuxer.h index 6a91aab..81ac33b 100644 --- a/media/base/demuxer.h +++ b/media/base/demuxer.h @@ -47,8 +47,10 @@ class MEDIA_EXPORT Demuxer { // callback upon completion. virtual void Seek(base::TimeDelta time, const PipelineStatusCB& status_cb); - // The pipeline is being stopped either as a result of an error or because - // the client called Stop(). + // Starts stopping this demuxer, executing the callback upon completion. + // + // After the callback completes the demuxer may be destroyed. It is illegal to + // call any method (including Stop()) after a demuxer has stopped. virtual void Stop(const base::Closure& callback); // This method is called from the pipeline when the audio renderer diff --git a/media/filters/ffmpeg_demuxer.cc b/media/filters/ffmpeg_demuxer.cc index 14b1fff..65181e6 100644 --- a/media/filters/ffmpeg_demuxer.cc +++ b/media/filters/ffmpeg_demuxer.cc @@ -316,12 +316,7 @@ void FFmpegDemuxer::Stop(const base::Closure& callback) { data_source_->Stop(BindToCurrentLoop(base::Bind( &FFmpegDemuxer::OnDataSourceStopped, weak_this_, BindToCurrentLoop(callback)))); - - // TODO(scherkus): Reenable after figuring why Stop() gets called multiple - // times, see http://crbug.com/235933 -#if 0 data_source_ = NULL; -#endif } void FFmpegDemuxer::Seek(base::TimeDelta time, const PipelineStatusCB& cb) { diff --git a/media/filters/ffmpeg_demuxer_unittest.cc b/media/filters/ffmpeg_demuxer_unittest.cc index c1da0cc..4fa2ab2 100644 --- a/media/filters/ffmpeg_demuxer_unittest.cc +++ b/media/filters/ffmpeg_demuxer_unittest.cc @@ -433,7 +433,9 @@ TEST_F(FFmpegDemuxerTest, Stop) { DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO); ASSERT_TRUE(audio); - demuxer_->Stop(NewExpectedClosure()); + WaitableMessageLoopEvent event; + demuxer_->Stop(event.GetClosure()); + event.RunAndWait(); // Reads after being stopped are all EOS buffers. StrictMock<MockReadCB> callback; @@ -442,6 +444,9 @@ TEST_F(FFmpegDemuxerTest, Stop) { // Attempt the read... audio->Read(base::Bind(&MockReadCB::Run, base::Unretained(&callback))); message_loop_.RunUntilIdle(); + + // Don't let the test call Stop() again. + demuxer_.reset(); } TEST_F(FFmpegDemuxerTest, DisableAudioStream) { |