diff options
author | scherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-02-05 02:07:40 +0000 |
---|---|---|
committer | scherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-02-05 02:07:40 +0000 |
commit | 1ba2feeaadaefe8a50ef69fc729d56ac55ee975e (patch) | |
tree | 70ba40f2e3545588c9177df5ee67f6788877c963 /media | |
parent | 065836fc0f72e86049938f21ee55557b20a236f9 (diff) | |
download | chromium_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.h | 12 | ||||
-rw-r--r-- | media/base/filter_collection.cc | 20 | ||||
-rw-r--r-- | media/base/filter_collection.h | 13 | ||||
-rw-r--r-- | media/base/filter_collection_unittest.cc | 64 | ||||
-rw-r--r-- | media/base/mock_filters.h | 4 | ||||
-rw-r--r-- | media/base/pipeline.cc | 40 | ||||
-rw-r--r-- | media/base/pipeline.h | 2 | ||||
-rw-r--r-- | media/base/pipeline_unittest.cc | 5 | ||||
-rw-r--r-- | media/filters/audio_renderer_impl.cc | 27 | ||||
-rw-r--r-- | media/filters/audio_renderer_impl.h | 7 | ||||
-rw-r--r-- | media/filters/audio_renderer_impl_unittest.cc | 2 | ||||
-rw-r--r-- | media/filters/pipeline_integration_test_base.cc | 16 | ||||
-rw-r--r-- | media/filters/video_renderer_base.cc | 3 | ||||
-rw-r--r-- | media/media.gyp | 1 | ||||
-rw-r--r-- | media/tools/player_x11/player_x11.cc | 3 |
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()); |