diff options
author | scherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-04-22 04:03:38 +0000 |
---|---|---|
committer | scherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-04-22 04:03:38 +0000 |
commit | f5443ef7d206262bdac14b1f7d26d7dc2e753f35 (patch) | |
tree | 23b8fe828dbd77859b33d2049e33125027871e4b /webkit/media | |
parent | 1f1057f9b20647adae5807c8bde06cef40cd9e42 (diff) | |
download | chromium_src-f5443ef7d206262bdac14b1f7d26d7dc2e753f35.zip chromium_src-f5443ef7d206262bdac14b1f7d26d7dc2e753f35.tar.gz chromium_src-f5443ef7d206262bdac14b1f7d26d7dc2e753f35.tar.bz2 |
Remove reference counting from media::Demuxer and friends.
In addition:
* Pipeline no longer owns the demuxer; clients are required to own it and keep it alive until Pipeline::Stop() completes.
BUG=173313
Review URL: https://codereview.chromium.org/13813016
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@195437 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit/media')
-rw-r--r-- | webkit/media/webmediaplayer_impl.cc | 188 | ||||
-rw-r--r-- | webkit/media/webmediaplayer_impl.h | 15 | ||||
-rw-r--r-- | webkit/media/webmediasourceclient_impl.cc | 3 | ||||
-rw-r--r-- | webkit/media/webmediasourceclient_impl.h | 7 | ||||
-rw-r--r-- | webkit/media/websourcebuffer_impl.cc | 2 | ||||
-rw-r--r-- | webkit/media/websourcebuffer_impl.h | 8 |
6 files changed, 113 insertions, 110 deletions
diff --git a/webkit/media/webmediaplayer_impl.cc b/webkit/media/webmediaplayer_impl.cc index 20d3678..7917b66 100644 --- a/webkit/media/webmediaplayer_impl.cc +++ b/webkit/media/webmediaplayer_impl.cc @@ -153,6 +153,7 @@ WebMediaPlayerImpl::WebMediaPlayerImpl( is_local_source_(false), supports_save_(true), starting_(false), + chunk_demuxer_(NULL), pending_repaint_(false), video_frame_provider_client_(NULL) { media_log_->AddEvent( @@ -266,18 +267,11 @@ void WebMediaPlayerImpl::load(const WebKit::WebURL& url, CORSMode cors_mode) { void WebMediaPlayerImpl::load(const WebKit::WebURL& url, WebKit::WebMediaSource* media_source, CORSMode cors_mode) { - scoped_ptr<WebKit::WebMediaSource> ms(media_source); LoadSetup(url); // Media source pipelines can start immediately. - chunk_demuxer_ = new media::ChunkDemuxer( - BIND_TO_RENDER_LOOP_1(&WebMediaPlayerImpl::OnDemuxerOpened, - base::Passed(&ms)), - BIND_TO_RENDER_LOOP_2(&WebMediaPlayerImpl::OnNeedKey, "", ""), - base::Bind(&LogMediaSourceError, media_log_)); - supports_save_ = false; - StartPipeline(); + StartPipeline(media_source); } void WebMediaPlayerImpl::LoadSetup(const WebKit::WebURL& url) { @@ -1122,7 +1116,7 @@ void WebMediaPlayerImpl::DataSourceInitialized(const GURL& gurl, bool success) { return; } - StartPipeline(); + StartPipeline(NULL); } void WebMediaPlayerImpl::NotifyDownloading(bool is_downloading) { @@ -1136,10 +1130,97 @@ void WebMediaPlayerImpl::NotifyDownloading(bool is_downloading) { "is_downloading_data", is_downloading)); } -void WebMediaPlayerImpl::StartPipeline() { +void WebMediaPlayerImpl::StartPipeline(WebKit::WebMediaSource* media_source) { + const CommandLine* cmd_line = CommandLine::ForCurrentProcess(); + + + // Figure out which demuxer to use. + if (!media_source) { + DCHECK(!chunk_demuxer_); + DCHECK(data_source_); + + demuxer_.reset(new media::FFmpegDemuxer( + media_thread_.message_loop_proxy(), data_source_, + BIND_TO_RENDER_LOOP_2(&WebMediaPlayerImpl::OnNeedKey, "", ""))); + } else { + DCHECK(!chunk_demuxer_); + DCHECK(!data_source_); + + scoped_ptr<WebKit::WebMediaSource> ms(media_source); + chunk_demuxer_ = new media::ChunkDemuxer( + BIND_TO_RENDER_LOOP_1(&WebMediaPlayerImpl::OnDemuxerOpened, + base::Passed(&ms)), + BIND_TO_RENDER_LOOP_2(&WebMediaPlayerImpl::OnNeedKey, "", ""), + base::Bind(&LogMediaSourceError, media_log_)); + demuxer_.reset(chunk_demuxer_); + + // Disable GpuVideoDecoder creation until it supports codec config changes. + // TODO(acolwell): Remove this once http://crbug.com/151045 is fixed. + gpu_factories_ = NULL; + } + + scoped_ptr<media::FilterCollection> filter_collection( + new media::FilterCollection()); + filter_collection->SetDemuxer(demuxer_.get()); + + // Figure out if EME is enabled. + media::SetDecryptorReadyCB set_decryptor_ready_cb; + if (decryptor_) { + set_decryptor_ready_cb = base::Bind(&ProxyDecryptor::SetDecryptorReadyCB, + base::Unretained(decryptor_.get())); + } + + // Create our audio decoders and renderer. + ScopedVector<media::AudioDecoder> audio_decoders; + audio_decoders.push_back(new media::FFmpegAudioDecoder( + media_thread_.message_loop_proxy())); + if (cmd_line->HasSwitch(switches::kEnableOpusPlayback)) { + audio_decoders.push_back(new media::OpusAudioDecoder( + media_thread_.message_loop_proxy())); + } + + scoped_ptr<media::AudioRenderer> audio_renderer( + new media::AudioRendererImpl(media_thread_.message_loop_proxy(), + audio_source_provider_, + audio_decoders.Pass(), + set_decryptor_ready_cb)); + filter_collection->SetAudioRenderer(audio_renderer.Pass()); + + // Create our video decoders and renderer. + ScopedVector<media::VideoDecoder> video_decoders; + + if (gpu_factories_) { + video_decoders.push_back(new media::GpuVideoDecoder( + media_thread_.message_loop_proxy(), gpu_factories_)); + } + + // TODO(phajdan.jr): Remove ifdefs when libvpx with vp9 support is released + // (http://crbug.com/174287) . +#if !defined(MEDIA_DISABLE_LIBVPX) + if (cmd_line->HasSwitch(switches::kEnableVp9Playback) || + cmd_line->HasSwitch(switches::kEnableVp8AlphaPlayback)) { + video_decoders.push_back(new media::VpxVideoDecoder( + media_thread_.message_loop_proxy())); + } +#endif // !defined(MEDIA_DISABLE_LIBVPX) + + video_decoders.push_back(new media::FFmpegVideoDecoder( + media_thread_.message_loop_proxy())); + + scoped_ptr<media::VideoRenderer> video_renderer( + new media::VideoRendererBase( + media_thread_.message_loop_proxy(), + video_decoders.Pass(), + set_decryptor_ready_cb, + base::Bind(&WebMediaPlayerImpl::FrameReady, base::Unretained(this)), + BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::SetOpaque), + true)); + filter_collection->SetVideoRenderer(video_renderer.Pass()); + + // ... and we're ready to go! starting_ = true; pipeline_->Start( - BuildFilterCollection(), + filter_collection.Pass(), BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineEnded), BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineError), BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineSeek), @@ -1175,8 +1256,10 @@ void WebMediaPlayerImpl::Destroy() { // Abort any pending IO so stopping the pipeline doesn't get blocked. if (data_source_) data_source_->Abort(); - if (chunk_demuxer_) + if (chunk_demuxer_) { chunk_demuxer_->Shutdown(); + chunk_demuxer_ = NULL; + } if (gpu_factories_) { gpu_factories_->Abort(); @@ -1200,7 +1283,7 @@ void WebMediaPlayerImpl::Destroy() { // Release any final references now that everything has stopped. data_source_ = NULL; - chunk_demuxer_ = NULL; + demuxer_.reset(); } WebKit::WebMediaPlayerClient* WebMediaPlayerImpl::GetClient() { @@ -1250,83 +1333,4 @@ void WebMediaPlayerImpl::FrameReady( &WebMediaPlayerImpl::Repaint, AsWeakPtr())); } -scoped_ptr<media::FilterCollection> -WebMediaPlayerImpl::BuildFilterCollection() { - const CommandLine* cmd_line = CommandLine::ForCurrentProcess(); - - scoped_ptr<media::FilterCollection> filter_collection( - new media::FilterCollection()); - - // Figure out which demuxer to use. - if (data_source_) { - DCHECK(!chunk_demuxer_); - filter_collection->SetDemuxer(new media::FFmpegDemuxer( - media_thread_.message_loop_proxy(), data_source_, - BIND_TO_RENDER_LOOP_2(&WebMediaPlayerImpl::OnNeedKey, "", ""))); - } else { - DCHECK(chunk_demuxer_); - filter_collection->SetDemuxer(chunk_demuxer_); - - // Disable GpuVideoDecoder creation until it supports codec config changes. - // TODO(acolwell): Remove this once http://crbug.com/151045 is fixed. - gpu_factories_ = NULL; - } - - // Figure out if EME is enabled. - media::SetDecryptorReadyCB set_decryptor_ready_cb; - if (decryptor_) { - set_decryptor_ready_cb = base::Bind(&ProxyDecryptor::SetDecryptorReadyCB, - base::Unretained(decryptor_.get())); - } - - // Create our audio decoders and renderer. - ScopedVector<media::AudioDecoder> audio_decoders; - audio_decoders.push_back(new media::FFmpegAudioDecoder( - media_thread_.message_loop_proxy())); - if (cmd_line->HasSwitch(switches::kEnableOpusPlayback)) { - audio_decoders.push_back(new media::OpusAudioDecoder( - media_thread_.message_loop_proxy())); - } - - scoped_ptr<media::AudioRenderer> audio_renderer( - new media::AudioRendererImpl(media_thread_.message_loop_proxy(), - audio_source_provider_, - audio_decoders.Pass(), - set_decryptor_ready_cb)); - filter_collection->SetAudioRenderer(audio_renderer.Pass()); - - // Create our video decoders and renderer. - ScopedVector<media::VideoDecoder> video_decoders; - - if (gpu_factories_) { - video_decoders.push_back(new media::GpuVideoDecoder( - media_thread_.message_loop_proxy(), gpu_factories_)); - } - - // TODO(phajdan.jr): Remove ifdefs when libvpx with vp9 support is released - // (http://crbug.com/174287) . -#if !defined(MEDIA_DISABLE_LIBVPX) - if (cmd_line->HasSwitch(switches::kEnableVp9Playback) || - cmd_line->HasSwitch(switches::kEnableVp8AlphaPlayback)) { - video_decoders.push_back(new media::VpxVideoDecoder( - media_thread_.message_loop_proxy())); - } -#endif // !defined(MEDIA_DISABLE_LIBVPX) - - video_decoders.push_back(new media::FFmpegVideoDecoder( - media_thread_.message_loop_proxy())); - - scoped_ptr<media::VideoRenderer> video_renderer( - new media::VideoRendererBase( - media_thread_.message_loop_proxy(), - video_decoders.Pass(), - set_decryptor_ready_cb, - base::Bind(&WebMediaPlayerImpl::FrameReady, base::Unretained(this)), - BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::SetOpaque), - true)); - filter_collection->SetVideoRenderer(video_renderer.Pass()); - - return filter_collection.Pass(); -} - } // namespace webkit_media diff --git a/webkit/media/webmediaplayer_impl.h b/webkit/media/webmediaplayer_impl.h index 46f9985..6b7cd33 100644 --- a/webkit/media/webmediaplayer_impl.h +++ b/webkit/media/webmediaplayer_impl.h @@ -53,6 +53,7 @@ class MessageLoopProxy; namespace media { class ChunkDemuxer; +class FFmpegDemuxer; class MediaLog; } @@ -230,7 +231,9 @@ class WebMediaPlayerImpl void NotifyDownloading(bool is_downloading); // Finishes starting the pipeline due to a call to load(). - void StartPipeline(); + // + // A non-null |media_source| will construct a Media Source pipeline. + void StartPipeline(WebKit::WebMediaSource* media_source); // Helpers that set the network/ready state and notifies the client if // they've changed. @@ -272,10 +275,6 @@ class WebMediaPlayerImpl // painted. void FrameReady(const scoped_refptr<media::VideoFrame>& frame); - // Builds a FilterCollection based on the current configuration of - // WebMediaPlayerImpl. - scoped_ptr<media::FilterCollection> BuildFilterCollection(); - WebKit::WebFrame* frame_; // TODO(hclam): get rid of these members and read from the pipeline directly. @@ -349,8 +348,12 @@ class WebMediaPlayerImpl // These two are mutually exclusive: // |data_source_| is used for regular resource loads. // |chunk_demuxer_| is used for Media Source resource loads. + // + // |demuxer_| will contain the appropriate demuxer based on which resource + // load strategy we're using. scoped_refptr<BufferedDataSource> data_source_; - scoped_refptr<media::ChunkDemuxer> chunk_demuxer_; + scoped_ptr<media::Demuxer> demuxer_; + media::ChunkDemuxer* chunk_demuxer_; // Temporary for EME v0.1. In the future the init data type should be passed // through GenerateKeyRequest() directly from WebKit. diff --git a/webkit/media/webmediasourceclient_impl.cc b/webkit/media/webmediasourceclient_impl.cc index 204f0d0..3eb36f4 100644 --- a/webkit/media/webmediasourceclient_impl.cc +++ b/webkit/media/webmediasourceclient_impl.cc @@ -25,8 +25,7 @@ COMPILE_ASSERT_MATCHING_STATUS_ENUM(AddStatusReachedIdLimit, kReachedIdLimit); #undef COMPILE_ASSERT_MATCHING_STATUS_ENUM WebMediaSourceClientImpl::WebMediaSourceClientImpl( - const scoped_refptr<media::ChunkDemuxer>& demuxer, - media::LogCB log_cb) + media::ChunkDemuxer* demuxer, media::LogCB log_cb) : demuxer_(demuxer), log_cb_(log_cb) { DCHECK(demuxer_); diff --git a/webkit/media/webmediasourceclient_impl.h b/webkit/media/webmediasourceclient_impl.h index 1aa0f6e..3dad1dc 100644 --- a/webkit/media/webmediasourceclient_impl.h +++ b/webkit/media/webmediasourceclient_impl.h @@ -8,7 +8,6 @@ #include <string> #include <vector> -#include "base/memory/ref_counted.h" #include "media/base/media_log.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebMediaSourceClient.h" @@ -20,9 +19,7 @@ namespace webkit_media { class WebMediaSourceClientImpl : public WebKit::WebMediaSourceClient { public: - explicit WebMediaSourceClientImpl( - const scoped_refptr<media::ChunkDemuxer>& demuxer, - media::LogCB log_cb); + WebMediaSourceClientImpl(media::ChunkDemuxer* demuxer, media::LogCB log_cb); virtual ~WebMediaSourceClientImpl(); // WebKit::WebMediaSourceClient implementation. @@ -35,7 +32,7 @@ class WebMediaSourceClientImpl : public WebKit::WebMediaSourceClient { virtual void endOfStream(EndOfStreamStatus status) OVERRIDE; private: - scoped_refptr<media::ChunkDemuxer> demuxer_; + media::ChunkDemuxer* demuxer_; // Owned by WebMediaPlayerImpl. media::LogCB log_cb_; DISALLOW_COPY_AND_ASSIGN(WebMediaSourceClientImpl); diff --git a/webkit/media/websourcebuffer_impl.cc b/webkit/media/websourcebuffer_impl.cc index de03e5a..5e1bf0b 100644 --- a/webkit/media/websourcebuffer_impl.cc +++ b/webkit/media/websourcebuffer_impl.cc @@ -9,7 +9,7 @@ namespace webkit_media { WebSourceBufferImpl::WebSourceBufferImpl( - const std::string& id, scoped_refptr<media::ChunkDemuxer> demuxer) + const std::string& id, media::ChunkDemuxer* demuxer) : id_(id), demuxer_(demuxer) { DCHECK(demuxer_); diff --git a/webkit/media/websourcebuffer_impl.h b/webkit/media/websourcebuffer_impl.h index e4718f3..6d8bd85 100644 --- a/webkit/media/websourcebuffer_impl.h +++ b/webkit/media/websourcebuffer_impl.h @@ -7,7 +7,8 @@ #include <string> -#include "base/memory/ref_counted.h" +#include "base/basictypes.h" +#include "base/compiler_specific.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebSourceBuffer.h" namespace media { @@ -18,8 +19,7 @@ namespace webkit_media { class WebSourceBufferImpl : public WebKit::WebSourceBuffer { public: - WebSourceBufferImpl(const std::string& id, - scoped_refptr<media::ChunkDemuxer> demuxer); + WebSourceBufferImpl(const std::string& id, media::ChunkDemuxer* demuxer); virtual ~WebSourceBufferImpl(); // WebKit::WebSourceBuffer implementation. @@ -31,7 +31,7 @@ class WebSourceBufferImpl : public WebKit::WebSourceBuffer { private: std::string id_; - scoped_refptr<media::ChunkDemuxer> demuxer_; + media::ChunkDemuxer* demuxer_; // Owned by WebMediaPlayerImpl. DISALLOW_COPY_AND_ASSIGN(WebSourceBufferImpl); }; |