summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorscherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-08-16 22:44:38 +0000
committerscherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-08-16 22:44:38 +0000
commit8d54553bb326629ab4026eefd777b6e34476e469 (patch)
tree5fc41d1fee228f8b6e899284a866d9199b11f3ab
parentf223ee25283153065fc63fc15f270f4dfb911a74 (diff)
downloadchromium_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.h6
-rw-r--r--media/filters/ffmpeg_demuxer.cc5
-rw-r--r--media/filters/ffmpeg_demuxer_unittest.cc7
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) {