summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
authorscherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-02-05 02:07:40 +0000
committerscherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-02-05 02:07:40 +0000
commit1ba2feeaadaefe8a50ef69fc729d56ac55ee975e (patch)
tree70ba40f2e3545588c9177df5ee67f6788877c963 /media
parent065836fc0f72e86049938f21ee55557b20a236f9 (diff)
downloadchromium_src-1ba2feeaadaefe8a50ef69fc729d56ac55ee975e.zip
chromium_src-1ba2feeaadaefe8a50ef69fc729d56ac55ee975e.tar.gz
chromium_src-1ba2feeaadaefe8a50ef69fc729d56ac55ee975e.tar.bz2
Remove reference counting from media::AudioRenderer and friends.
BUG=173313 Review URL: https://codereview.chromium.org/12140002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@180604 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media')
-rw-r--r--media/base/audio_renderer.h12
-rw-r--r--media/base/filter_collection.cc20
-rw-r--r--media/base/filter_collection.h13
-rw-r--r--media/base/filter_collection_unittest.cc64
-rw-r--r--media/base/mock_filters.h4
-rw-r--r--media/base/pipeline.cc40
-rw-r--r--media/base/pipeline.h2
-rw-r--r--media/base/pipeline_unittest.cc5
-rw-r--r--media/filters/audio_renderer_impl.cc27
-rw-r--r--media/filters/audio_renderer_impl.h7
-rw-r--r--media/filters/audio_renderer_impl_unittest.cc2
-rw-r--r--media/filters/pipeline_integration_test_base.cc16
-rw-r--r--media/filters/video_renderer_base.cc3
-rw-r--r--media/media.gyp1
-rw-r--r--media/tools/player_x11/player_x11.cc3
15 files changed, 83 insertions, 136 deletions
diff --git a/media/base/audio_renderer.h b/media/base/audio_renderer.h
index 19459ac..4ddeee0 100644
--- a/media/base/audio_renderer.h
+++ b/media/base/audio_renderer.h
@@ -18,8 +18,7 @@ namespace media {
class AudioDecoder;
class DemuxerStream;
-class MEDIA_EXPORT AudioRenderer
- : public base::RefCountedThreadSafe<AudioRenderer> {
+class MEDIA_EXPORT AudioRenderer {
public:
typedef std::list<scoped_refptr<AudioDecoder> > AudioDecoderList;
@@ -27,6 +26,9 @@ class MEDIA_EXPORT AudioRenderer
// Second parameter is the maximum time value that the clock cannot exceed.
typedef base::Callback<void(base::TimeDelta, base::TimeDelta)> TimeCB;
+ AudioRenderer();
+ virtual ~AudioRenderer();
+
// Initialize a AudioRenderer with the given AudioDecoder, executing the
// |init_cb| upon completion.
//
@@ -90,12 +92,6 @@ class MEDIA_EXPORT AudioRenderer
// decoded audio buffer.
virtual void ResumeAfterUnderflow(bool buffer_more_audio) = 0;
- protected:
- friend class base::RefCountedThreadSafe<AudioRenderer>;
-
- AudioRenderer();
- virtual ~AudioRenderer();
-
private:
DISALLOW_COPY_AND_ASSIGN(AudioRenderer);
};
diff --git a/media/base/filter_collection.cc b/media/base/filter_collection.cc
index 7824b1e..94ad633 100644
--- a/media/base/filter_collection.cc
+++ b/media/base/filter_collection.cc
@@ -25,8 +25,13 @@ const scoped_refptr<Demuxer>& FilterCollection::GetDemuxer() {
return demuxer_;
}
-void FilterCollection::AddAudioRenderer(AudioRenderer* audio_renderer) {
- audio_renderers_.push_back(audio_renderer);
+void FilterCollection::SetAudioRenderer(
+ scoped_ptr<AudioRenderer> audio_renderer) {
+ audio_renderer_ = audio_renderer.Pass();
+}
+
+scoped_ptr<AudioRenderer> FilterCollection::GetAudioRenderer() {
+ return audio_renderer_.Pass();
}
void FilterCollection::SetVideoRenderer(
@@ -41,19 +46,10 @@ scoped_ptr<VideoRenderer> FilterCollection::GetVideoRenderer() {
void FilterCollection::Clear() {
audio_decoders_.clear();
video_decoders_.clear();
- audio_renderers_.clear();
+ audio_renderer_.reset();
video_renderer_.reset();
}
-void FilterCollection::SelectAudioRenderer(scoped_refptr<AudioRenderer>* out) {
- if (audio_renderers_.empty()) {
- *out = NULL;
- return;
- }
- *out = audio_renderers_.front();
- audio_renderers_.pop_front();
-}
-
FilterCollection::AudioDecoderList* FilterCollection::GetAudioDecoders() {
return &audio_decoders_;
}
diff --git a/media/base/filter_collection.h b/media/base/filter_collection.h
index 100cd64..dff67d0 100644
--- a/media/base/filter_collection.h
+++ b/media/base/filter_collection.h
@@ -32,12 +32,11 @@ class MEDIA_EXPORT FilterCollection {
FilterCollection();
~FilterCollection();
- // Demuxer accessor methods.
void SetDemuxer(const scoped_refptr<Demuxer>& demuxer);
const scoped_refptr<Demuxer>& GetDemuxer();
- // Adds a filter to the collection.
- void AddAudioRenderer(AudioRenderer* audio_renderer);
+ void SetAudioRenderer(scoped_ptr<AudioRenderer> audio_renderer);
+ scoped_ptr<AudioRenderer> GetAudioRenderer();
void SetVideoRenderer(scoped_ptr<VideoRenderer> video_renderer);
scoped_ptr<VideoRenderer> GetVideoRenderer();
@@ -45,12 +44,6 @@ class MEDIA_EXPORT FilterCollection {
// Remove remaining filters.
void Clear();
- // Selects a filter of the specified type from the collection.
- // If the required filter cannot be found, NULL is returned.
- // If a filter is returned it is removed from the collection.
- // Filters are selected in FIFO order.
- void SelectAudioRenderer(scoped_refptr<AudioRenderer>* out);
-
AudioDecoderList* GetAudioDecoders();
VideoDecoderList* GetVideoDecoders();
@@ -58,7 +51,7 @@ class MEDIA_EXPORT FilterCollection {
scoped_refptr<Demuxer> demuxer_;
AudioDecoderList audio_decoders_;
VideoDecoderList video_decoders_;
- std::list<scoped_refptr<AudioRenderer> > audio_renderers_;
+ scoped_ptr<AudioRenderer> audio_renderer_;
scoped_ptr<VideoRenderer> video_renderer_;
DISALLOW_COPY_AND_ASSIGN(FilterCollection);
diff --git a/media/base/filter_collection_unittest.cc b/media/base/filter_collection_unittest.cc
deleted file mode 100644
index b2dd6a1..0000000
--- a/media/base/filter_collection_unittest.cc
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "media/base/filter_collection.h"
-#include "media/base/mock_filters.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace media {
-
-class FilterCollectionTest : public ::testing::Test {
- public:
- FilterCollectionTest() {}
- virtual ~FilterCollectionTest() {}
-
- protected:
- FilterCollection collection_;
-
- DISALLOW_COPY_AND_ASSIGN(FilterCollectionTest);
-};
-
-TEST_F(FilterCollectionTest, SelectXXXMethods) {
- scoped_refptr<AudioRenderer> audio_renderer;
-
- collection_.SelectAudioRenderer(&audio_renderer);
- EXPECT_FALSE(audio_renderer);
-
- // Add an audio decoder.
- collection_.AddAudioRenderer(new MockAudioRenderer());
-
- // Verify that we can select the audio decoder.
- collection_.SelectAudioRenderer(&audio_renderer);
- EXPECT_TRUE(audio_renderer);
-
- // Verify that we can't select it again since only one has been added.
- collection_.SelectAudioRenderer(&audio_renderer);
- EXPECT_FALSE(audio_renderer);
-}
-
-TEST_F(FilterCollectionTest, MultipleFiltersOfSameType) {
- scoped_refptr<AudioRenderer> audio_renderer_a(new MockAudioRenderer());
- scoped_refptr<AudioRenderer> audio_renderer_b(new MockAudioRenderer());
-
- scoped_refptr<AudioRenderer> audio_renderer;
-
- collection_.AddAudioRenderer(audio_renderer_a.get());
- collection_.AddAudioRenderer(audio_renderer_b.get());
-
- // Verify that first SelectAudioRenderer() returns audio_renderer_a.
- collection_.SelectAudioRenderer(&audio_renderer);
- EXPECT_TRUE(audio_renderer);
- EXPECT_EQ(audio_renderer, audio_renderer_a);
-
- // Verify that second SelectAudioRenderer() returns audio_renderer_b.
- collection_.SelectAudioRenderer(&audio_renderer);
- EXPECT_TRUE(audio_renderer);
- EXPECT_EQ(audio_renderer, audio_renderer_b);
-
- // Verify that third SelectAudioRenderer() returns nothing.
- collection_.SelectAudioRenderer(&audio_renderer);
- EXPECT_FALSE(audio_renderer);
-}
-
-} // namespace media
diff --git a/media/base/mock_filters.h b/media/base/mock_filters.h
index 2050e87..4e3009c 100644
--- a/media/base/mock_filters.h
+++ b/media/base/mock_filters.h
@@ -161,6 +161,7 @@ class MockVideoRenderer : public VideoRenderer {
class MockAudioRenderer : public AudioRenderer {
public:
MockAudioRenderer();
+ virtual ~MockAudioRenderer();
// AudioRenderer implementation.
MOCK_METHOD9(Initialize, void(const scoped_refptr<DemuxerStream>& stream,
@@ -181,9 +182,6 @@ class MockAudioRenderer : public AudioRenderer {
MOCK_METHOD1(SetVolume, void(float volume));
MOCK_METHOD1(ResumeAfterUnderflow, void(bool buffer_more_audio));
- protected:
- virtual ~MockAudioRenderer();
-
private:
DISALLOW_COPY_AND_ASSIGN(MockAudioRenderer);
};
diff --git a/media/base/pipeline.cc b/media/base/pipeline.cc
index cdc0aa6..8cda84b 100644
--- a/media/base/pipeline.cc
+++ b/media/base/pipeline.cc
@@ -523,6 +523,12 @@ void Pipeline::StateTransitionTask(PipelineStatus status) {
}
}
+// Note that the usage of base::Unretained() with the audio/video renderers
+// in the following DoXXX() functions is considered safe as they are owned by
+// |pending_callbacks_| and share the same lifetime.
+//
+// That being said, deleting the renderers while keeping |pending_callbacks_|
+// running on the media thread would result in crashes.
void Pipeline::DoInitialPreroll(const PipelineStatusCB& done_cb) {
DCHECK(message_loop_->BelongsToCurrentThread());
DCHECK(!pending_callbacks_.get());
@@ -533,7 +539,8 @@ void Pipeline::DoInitialPreroll(const PipelineStatusCB& done_cb) {
// Preroll renderers.
if (audio_renderer_) {
bound_fns.Push(base::Bind(
- &AudioRenderer::Preroll, audio_renderer_, seek_timestamp));
+ &AudioRenderer::Preroll, base::Unretained(audio_renderer_.get()),
+ seek_timestamp));
}
if (video_renderer_) {
@@ -553,16 +560,20 @@ void Pipeline::DoSeek(
SerialRunner::Queue bound_fns;
// Pause.
- if (audio_renderer_)
- bound_fns.Push(base::Bind(&AudioRenderer::Pause, audio_renderer_));
+ if (audio_renderer_) {
+ bound_fns.Push(base::Bind(
+ &AudioRenderer::Pause, base::Unretained(audio_renderer_.get())));
+ }
if (video_renderer_) {
bound_fns.Push(base::Bind(
&VideoRenderer::Pause, base::Unretained(video_renderer_.get())));
}
// Flush.
- if (audio_renderer_)
- bound_fns.Push(base::Bind(&AudioRenderer::Flush, audio_renderer_));
+ if (audio_renderer_) {
+ bound_fns.Push(base::Bind(
+ &AudioRenderer::Flush, base::Unretained(audio_renderer_.get())));
+ }
if (video_renderer_) {
bound_fns.Push(base::Bind(
&VideoRenderer::Flush, base::Unretained(video_renderer_.get())));
@@ -575,7 +586,8 @@ void Pipeline::DoSeek(
// Preroll renderers.
if (audio_renderer_) {
bound_fns.Push(base::Bind(
- &AudioRenderer::Preroll, audio_renderer_, seek_timestamp));
+ &AudioRenderer::Preroll, base::Unretained(audio_renderer_.get()),
+ seek_timestamp));
}
if (video_renderer_) {
@@ -595,8 +607,10 @@ void Pipeline::DoPlay(const PipelineStatusCB& done_cb) {
PlaybackRateChangedTask(GetPlaybackRate());
VolumeChangedTask(GetVolume());
- if (audio_renderer_)
- bound_fns.Push(base::Bind(&AudioRenderer::Play, audio_renderer_));
+ if (audio_renderer_) {
+ bound_fns.Push(base::Bind(
+ &AudioRenderer::Play, base::Unretained(audio_renderer_.get())));
+ }
if (video_renderer_) {
bound_fns.Push(base::Bind(
@@ -614,8 +628,10 @@ void Pipeline::DoStop(const PipelineStatusCB& done_cb) {
if (demuxer_)
bound_fns.Push(base::Bind(&Demuxer::Stop, demuxer_));
- if (audio_renderer_)
- bound_fns.Push(base::Bind(&AudioRenderer::Stop, audio_renderer_));
+ if (audio_renderer_) {
+ bound_fns.Push(base::Bind(
+ &AudioRenderer::Stop, base::Unretained(audio_renderer_.get())));
+ }
if (video_renderer_) {
bound_fns.Push(base::Bind(
@@ -636,7 +652,7 @@ void Pipeline::OnStopCompleted(PipelineStatus status) {
SetState(kStopped);
pending_callbacks_.reset();
filter_collection_.reset();
- audio_renderer_ = NULL;
+ audio_renderer_.reset();
video_renderer_.reset();
demuxer_ = NULL;
@@ -894,7 +910,7 @@ void Pipeline::InitializeAudioRenderer(const PipelineStatusCB& done_cb) {
demuxer_->GetStream(DemuxerStream::AUDIO);
DCHECK(stream);
- filter_collection_->SelectAudioRenderer(&audio_renderer_);
+ audio_renderer_ = filter_collection_->GetAudioRenderer();
audio_renderer_->Initialize(
stream,
*filter_collection_->GetAudioDecoders(),
diff --git a/media/base/pipeline.h b/media/base/pipeline.h
index 54d7239..bb72e36 100644
--- a/media/base/pipeline.h
+++ b/media/base/pipeline.h
@@ -451,7 +451,7 @@ class MEDIA_EXPORT Pipeline
// Renderer references used for setting the volume, playback rate, and
// determining when playback has finished.
- scoped_refptr<AudioRenderer> audio_renderer_;
+ scoped_ptr<AudioRenderer> audio_renderer_;
scoped_ptr<VideoRenderer> video_renderer_;
// Demuxer reference used for setting the preload value.
diff --git a/media/base/pipeline_unittest.cc b/media/base/pipeline_unittest.cc
index cfe41b5..b6fc445 100644
--- a/media/base/pipeline_unittest.cc
+++ b/media/base/pipeline_unittest.cc
@@ -95,7 +95,8 @@ class PipelineTest : public ::testing::Test {
filter_collection_->SetVideoRenderer(video_renderer.Pass());
audio_renderer_ = new MockAudioRenderer();
- filter_collection_->AddAudioRenderer(audio_renderer_);
+ scoped_ptr<AudioRenderer> audio_renderer(audio_renderer_);
+ filter_collection_->SetAudioRenderer(audio_renderer.Pass());
// InitializeDemuxer() adds overriding expectations for expected non-NULL
// streams.
@@ -301,7 +302,7 @@ class PipelineTest : public ::testing::Test {
scoped_refptr<MockVideoDecoder> video_decoder_;
scoped_refptr<MockAudioDecoder> audio_decoder_;
MockVideoRenderer* video_renderer_;
- scoped_refptr<MockAudioRenderer> audio_renderer_;
+ MockAudioRenderer* audio_renderer_;
scoped_refptr<StrictMock<MockDemuxerStream> > audio_stream_;
scoped_refptr<StrictMock<MockDemuxerStream> > video_stream_;
AudioRenderer::TimeCB audio_time_cb_;
diff --git a/media/filters/audio_renderer_impl.cc b/media/filters/audio_renderer_impl.cc
index 73082ae..72061c2 100644
--- a/media/filters/audio_renderer_impl.cc
+++ b/media/filters/audio_renderer_impl.cc
@@ -30,6 +30,7 @@ AudioRendererImpl::AudioRendererImpl(
media::AudioRendererSink* sink,
const SetDecryptorReadyCB& set_decryptor_ready_cb)
: message_loop_(message_loop),
+ weak_factory_(this),
sink_(sink),
set_decryptor_ready_cb_(set_decryptor_ready_cb),
now_cb_(base::Bind(&base::Time::Now)),
@@ -44,6 +45,12 @@ AudioRendererImpl::AudioRendererImpl(
actual_frames_per_buffer_(0) {
}
+AudioRendererImpl::~AudioRendererImpl() {
+ // Stop() should have been called and |algorithm_| should have been destroyed.
+ DCHECK(state_ == kUninitialized || state_ == kStopped);
+ DCHECK(!algorithm_.get());
+}
+
void AudioRendererImpl::Play(const base::Closure& callback) {
DCHECK(message_loop_->BelongsToCurrentThread());
@@ -102,7 +109,7 @@ void AudioRendererImpl::Flush(const base::Closure& callback) {
if (decrypting_demuxer_stream_) {
decrypting_demuxer_stream_->Reset(base::Bind(
- &AudioRendererImpl::ResetDecoder, this, callback));
+ &AudioRendererImpl::ResetDecoder, weak_this_, callback));
return;
}
@@ -118,6 +125,9 @@ void AudioRendererImpl::Stop(const base::Closure& callback) {
DCHECK(message_loop_->BelongsToCurrentThread());
DCHECK(!callback.is_null());
+ // TODO(scherkus): Consider invalidating |weak_factory_| and replacing
+ // task-running guards that check |state_| with DCHECK().
+
if (sink_) {
sink_->Stop();
sink_ = NULL;
@@ -191,6 +201,7 @@ void AudioRendererImpl::Initialize(const scoped_refptr<DemuxerStream>& stream,
DCHECK_EQ(kUninitialized, state_);
DCHECK(sink_);
+ weak_this_ = weak_factory_.GetWeakPtr();
init_cb_ = init_cb;
statistics_cb_ = statistics_cb;
underflow_cb_ = underflow_cb;
@@ -211,7 +222,7 @@ void AudioRendererImpl::Initialize(const scoped_refptr<DemuxerStream>& stream,
decoder_selector_ptr->SelectAudioDecoder(
stream,
statistics_cb,
- base::Bind(&AudioRendererImpl::OnDecoderSelected, this,
+ base::Bind(&AudioRendererImpl::OnDecoderSelected, weak_this_,
base::Passed(&decoder_selector)));
}
@@ -281,11 +292,11 @@ void AudioRendererImpl::OnDecoderSelected(
// on the decoder format.
algorithm_.reset(new AudioRendererAlgorithm());
algorithm_->Initialize(0, audio_parameters_, BindToCurrentLoop(
- base::Bind(&AudioRendererImpl::AttemptRead, this)));
+ base::Bind(&AudioRendererImpl::AttemptRead, weak_this_)));
state_ = kPaused;
- sink_->Initialize(audio_parameters_, this);
+ sink_->Initialize(audio_parameters_, weak_this_);
sink_->Start();
base::ResetAndReturn(&init_cb_).Run(PIPELINE_OK);
@@ -314,12 +325,6 @@ void AudioRendererImpl::SetVolume(float volume) {
sink_->SetVolume(volume);
}
-AudioRendererImpl::~AudioRendererImpl() {
- // Stop() should have been called and |algorithm_| should have been destroyed.
- DCHECK(state_ == kUninitialized || state_ == kStopped);
- DCHECK(!algorithm_.get());
-}
-
void AudioRendererImpl::DecodedAudioReady(
AudioDecoder::Status status,
const scoped_refptr<DataBuffer>& buffer) {
@@ -423,7 +428,7 @@ void AudioRendererImpl::AttemptRead_Locked() {
return;
pending_read_ = true;
- decoder_->Read(base::Bind(&AudioRendererImpl::DecodedAudioReady, this));
+ decoder_->Read(base::Bind(&AudioRendererImpl::DecodedAudioReady, weak_this_));
}
void AudioRendererImpl::SetPlaybackRate(float playback_rate) {
diff --git a/media/filters/audio_renderer_impl.h b/media/filters/audio_renderer_impl.h
index 9bb2928..14dae64 100644
--- a/media/filters/audio_renderer_impl.h
+++ b/media/filters/audio_renderer_impl.h
@@ -22,6 +22,7 @@
#include <deque>
#include "base/gtest_prod_util.h"
+#include "base/memory/weak_ptr.h"
#include "base/synchronization/lock.h"
#include "media/base/audio_decoder.h"
#include "media/base/audio_renderer.h"
@@ -47,6 +48,7 @@ class MEDIA_EXPORT AudioRendererImpl
AudioRendererImpl(const scoped_refptr<base::MessageLoopProxy>& message_loop,
AudioRendererSink* sink,
const SetDecryptorReadyCB& set_decryptor_ready_cb);
+ virtual ~AudioRendererImpl();
// AudioRenderer implementation.
virtual void Initialize(const scoped_refptr<DemuxerStream>& stream,
@@ -80,9 +82,6 @@ class MEDIA_EXPORT AudioRendererImpl
now_cb_ = now_cb;
}
- protected:
- virtual ~AudioRendererImpl();
-
private:
friend class AudioRendererImplTest;
@@ -159,6 +158,8 @@ class MEDIA_EXPORT AudioRendererImpl
void ResetDecoder(const base::Closure& callback);
scoped_refptr<base::MessageLoopProxy> message_loop_;
+ base::WeakPtrFactory<AudioRendererImpl> weak_factory_;
+ base::WeakPtr<AudioRendererImpl> weak_this_;
scoped_ptr<AudioSplicer> splicer_;
diff --git a/media/filters/audio_renderer_impl_unittest.cc b/media/filters/audio_renderer_impl_unittest.cc
index 9304611..9a7065c 100644
--- a/media/filters/audio_renderer_impl_unittest.cc
+++ b/media/filters/audio_renderer_impl_unittest.cc
@@ -332,7 +332,7 @@ class AudioRendererImplTest : public ::testing::Test {
// Fixture members.
MessageLoop message_loop_;
- scoped_refptr<AudioRendererImpl> renderer_;
+ scoped_ptr<AudioRendererImpl> renderer_;
private:
Time GetTime() {
diff --git a/media/filters/pipeline_integration_test_base.cc b/media/filters/pipeline_integration_test_base.cc
index 54c4fdf..b51d022 100644
--- a/media/filters/pipeline_integration_test_base.cc
+++ b/media/filters/pipeline_integration_test_base.cc
@@ -223,17 +223,19 @@ PipelineIntegrationTestBase::CreateFilterCollection(
collection->SetVideoRenderer(renderer.Pass());
audio_sink_ = new NullAudioSink();
- if (hashing_enabled_)
- audio_sink_->StartAudioHashForTesting();
- scoped_refptr<AudioRendererImpl> audio_renderer(new AudioRendererImpl(
+ AudioRendererImpl* audio_renderer_impl = new AudioRendererImpl(
message_loop_.message_loop_proxy(),
audio_sink_,
base::Bind(&PipelineIntegrationTestBase::SetDecryptor,
- base::Unretained(this), decryptor)));
+ base::Unretained(this), decryptor));
// Disable underflow if hashing is enabled.
- if (hashing_enabled_)
- audio_renderer->DisableUnderflowForTesting();
- collection->AddAudioRenderer(audio_renderer);
+ if (hashing_enabled_) {
+ audio_sink_->StartAudioHashForTesting();
+ audio_renderer_impl->DisableUnderflowForTesting();
+ }
+ scoped_ptr<AudioRenderer> audio_renderer(audio_renderer_impl);
+ collection->SetAudioRenderer(audio_renderer.Pass());
+
return collection.Pass();
}
diff --git a/media/filters/video_renderer_base.cc b/media/filters/video_renderer_base.cc
index 0ae775a..37a24ed 100644
--- a/media/filters/video_renderer_base.cc
+++ b/media/filters/video_renderer_base.cc
@@ -97,6 +97,9 @@ void VideoRendererBase::Stop(const base::Closure& callback) {
return;
}
+ // TODO(scherkus): Consider invalidating |weak_factory_| and replacing
+ // task-running guards that check |state_| with DCHECK().
+
state_ = kStopped;
statistics_cb_.Reset();
diff --git a/media/media.gyp b/media/media.gyp
index a57c7d4..b5f96c5 100644
--- a/media/media.gyp
+++ b/media/media.gyp
@@ -783,7 +783,6 @@
'base/decoder_buffer_queue_unittest.cc',
'base/decoder_buffer_unittest.cc',
'base/djb2_unittest.cc',
- 'base/filter_collection_unittest.cc',
'base/gmock_callback_support_unittest.cc',
'base/multi_channel_resampler_unittest.cc',
'base/pipeline_unittest.cc',
diff --git a/media/tools/player_x11/player_x11.cc b/media/tools/player_x11/player_x11.cc
index 7128479..a91e11d 100644
--- a/media/tools/player_x11/player_x11.cc
+++ b/media/tools/player_x11/player_x11.cc
@@ -119,10 +119,11 @@ bool InitPipeline(const scoped_refptr<base::MessageLoopProxy>& message_loop,
true));
collection->SetVideoRenderer(video_renderer.Pass());
- collection->AddAudioRenderer(new media::AudioRendererImpl(
+ scoped_ptr<media::AudioRenderer> audio_renderer(new media::AudioRendererImpl(
message_loop,
new media::NullAudioSink(),
media::SetDecryptorReadyCB()));
+ collection->SetAudioRenderer(audio_renderer.Pass());
// Create the pipeline and start it.
*pipeline = new media::Pipeline(message_loop, new media::MediaLog());