Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(176)

Unified Diff: webkit/media/webmediaplayer_impl.cc

Issue 13813016: Remove reference counting from media::Demuxer and friends. (Closed) Base URL: http://git.chromium.org/chromium/src.git@vd_scoped
Patch Set: demuxer only Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: webkit/media/webmediaplayer_impl.cc
diff --git a/webkit/media/webmediaplayer_impl.cc b/webkit/media/webmediaplayer_impl.cc
index ce2cbc7c78b80aec988fe38ac667cdf0204f7347..4763ce1cbbf59262a33d8c1573e64abcd5ea6438 100644
--- a/webkit/media/webmediaplayer_impl.cc
+++ b/webkit/media/webmediaplayer_impl.cc
@@ -270,14 +270,8 @@ void WebMediaPlayerImpl::load(const WebKit::WebURL& url,
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) {
@@ -1028,7 +1022,7 @@ void WebMediaPlayerImpl::OnDemuxerOpened(
scoped_ptr<WebKit::WebMediaSource> media_source) {
DCHECK(main_loop_->BelongsToCurrentThread());
media_source->open(new WebMediaSourceClientImpl(
- chunk_demuxer_, base::Bind(&LogMediaSourceError, media_log_)));
+ chunk_demuxer_.get(), base::Bind(&LogMediaSourceError, media_log_)));
}
void WebMediaPlayerImpl::OnKeyAdded(const std::string& key_system,
@@ -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,95 @@ 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();
+
+ scoped_ptr<media::FilterCollection> filter_collection(
+ new media::FilterCollection());
+
+ // Figure out which demuxer to use.
+ if (!media_source) {
+ DCHECK(!chunk_demuxer_);
+ DCHECK(data_source_);
+
+ ffmpeg_demuxer_.reset(new media::FFmpegDemuxer(
+ media_thread_.message_loop_proxy(), data_source_,
+ BIND_TO_RENDER_LOOP_2(&WebMediaPlayerImpl::OnNeedKey, "", "")));
+ filter_collection->SetDemuxer(ffmpeg_demuxer_.get());
+ } else {
+ DCHECK(!chunk_demuxer_);
+ DCHECK(!data_source_);
+
+ scoped_ptr<WebKit::WebMediaSource> ms(media_source);
+ chunk_demuxer_.reset(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_)));
+ filter_collection->SetDemuxer(chunk_demuxer_.get());
+
+ // 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_));
+ }
+
+ video_decoders.push_back(new media::FFmpegVideoDecoder(
+ media_thread_.message_loop_proxy()));
+
+ // 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)) {
+ video_decoders.push_back(new media::VpxVideoDecoder(
+ media_thread_.message_loop_proxy()));
+ }
+#endif // !defined(MEDIA_DISABLE_LIBVPX)
+
+ 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),
@@ -1200,7 +1279,8 @@ void WebMediaPlayerImpl::Destroy() {
// Release any final references now that everything has stopped.
data_source_ = NULL;
- chunk_demuxer_ = NULL;
+ ffmpeg_demuxer_.reset();
+ chunk_demuxer_.reset();
}
WebKit::WebMediaPlayerClient* WebMediaPlayerImpl::GetClient() {
@@ -1250,82 +1330,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_));
- }
-
- video_decoders.push_back(new media::FFmpegVideoDecoder(
- media_thread_.message_loop_proxy()));
-
- // 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)) {
- video_decoders.push_back(new media::VpxVideoDecoder(
- media_thread_.message_loop_proxy()));
- }
-#endif // !defined(MEDIA_DISABLE_LIBVPX)
-
- 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

Powered by Google App Engine
This is Rietveld 408576698