Index: webkit/media/webmediaplayer_impl.cc |
diff --git a/webkit/media/webmediaplayer_impl.cc b/webkit/media/webmediaplayer_impl.cc |
index 7ccb52249fd62324815963e7ca5a3354e2f84f39..bd91f21c02d3f4990f1d31a5d8b88f47e742a1d7 100644 |
--- a/webkit/media/webmediaplayer_impl.cc |
+++ b/webkit/media/webmediaplayer_impl.cc |
@@ -11,6 +11,7 @@ |
#include "base/bind.h" |
#include "base/callback.h" |
+#include "base/command_line.h" |
#include "base/message_loop_proxy.h" |
#include "base/metrics/histogram.h" |
#include "base/string_number_conversions.h" |
@@ -21,11 +22,17 @@ |
#include "media/base/filter_collection.h" |
#include "media/base/limits.h" |
#include "media/base/media_log.h" |
+#include "media/base/media_switches.h" |
#include "media/base/pipeline.h" |
#include "media/base/video_frame.h" |
#include "media/filters/audio_renderer_impl.h" |
#include "media/filters/chunk_demuxer.h" |
+#include "media/filters/ffmpeg_audio_decoder.h" |
+#include "media/filters/ffmpeg_demuxer.h" |
+#include "media/filters/ffmpeg_video_decoder.h" |
+#include "media/filters/opus_audio_decoder.h" |
#include "media/filters/video_renderer_base.h" |
+#include "media/filters/vpx_video_decoder.h" |
#include "third_party/WebKit/Source/Platform/chromium/public/WebRect.h" |
#include "third_party/WebKit/Source/Platform/chromium/public/WebSize.h" |
#include "third_party/WebKit/Source/Platform/chromium/public/WebString.h" |
@@ -35,7 +42,6 @@ |
#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" |
#include "v8/include/v8.h" |
#include "webkit/media/buffered_data_source.h" |
-#include "webkit/media/filter_helpers.h" |
#include "webkit/media/webaudiosourceprovider_impl.h" |
#include "webkit/media/webmediaplayer_delegate.h" |
#include "webkit/media/webmediaplayer_params.h" |
@@ -130,7 +136,6 @@ WebMediaPlayerImpl::WebMediaPlayerImpl( |
network_state_(WebMediaPlayer::NetworkStateEmpty), |
ready_state_(WebMediaPlayer::ReadyStateHaveNothing), |
main_loop_(base::MessageLoopProxy::current()), |
- filter_collection_(new media::FilterCollection()), |
media_thread_("MediaPipeline"), |
paused_(true), |
seeking_(false), |
@@ -142,6 +147,7 @@ WebMediaPlayerImpl::WebMediaPlayerImpl( |
media_log_(params.media_log()), |
accelerated_compositing_reported_(false), |
incremented_externally_allocated_memory_(false), |
+ gpu_factories_(params.gpu_factories()), |
is_local_source_(false), |
supports_save_(true), |
starting_(false), |
@@ -167,7 +173,6 @@ WebMediaPlayerImpl::WebMediaPlayerImpl( |
// Also we want to be notified of |main_loop_| destruction. |
MessageLoop::current()->AddDestructionObserver(this); |
- media::SetDecryptorReadyCB set_decryptor_ready_cb; |
if (WebKit::WebRuntimeFeatures::isEncryptedMediaEnabled()) { |
decryptor_.reset(new ProxyDecryptor( |
client, |
@@ -176,43 +181,12 @@ WebMediaPlayerImpl::WebMediaPlayerImpl( |
BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnKeyError), |
BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnKeyMessage), |
BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnNeedKey))); |
- set_decryptor_ready_cb = base::Bind(&ProxyDecryptor::SetDecryptorReadyCB, |
- base::Unretained(decryptor_.get())); |
} |
- // Create the GPU video decoder if factories were provided. |
- if (params.gpu_factories()) { |
- filter_collection_->GetVideoDecoders()->push_back( |
- new media::GpuVideoDecoder( |
- media_thread_.message_loop_proxy(), |
- params.gpu_factories())); |
- } |
- |
- // Create default video renderer. |
- scoped_ptr<media::VideoRenderer> video_renderer( |
- new media::VideoRendererBase( |
- media_thread_.message_loop_proxy(), |
- set_decryptor_ready_cb, |
- base::Bind(&WebMediaPlayerImpl::FrameReady, base::Unretained(this)), |
- BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::SetOpaque), |
- true)); |
- filter_collection_->SetVideoRenderer(video_renderer.Pass()); |
- |
- // Create default audio renderer using the null sink if no sink was provided. |
+ // Use the null sink if no sink was provided. |
audio_source_provider_ = new WebAudioSourceProviderImpl( |
params.audio_renderer_sink() ? params.audio_renderer_sink() : |
new media::NullAudioSink(media_thread_.message_loop_proxy())); |
- |
- ScopedVector<media::AudioDecoder> audio_decoders; |
- AddDefaultAudioDecoders(media_thread_.message_loop_proxy(), &audio_decoders); |
- |
- 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()); |
} |
WebMediaPlayerImpl::~WebMediaPlayerImpl() { |
@@ -281,12 +255,6 @@ void WebMediaPlayerImpl::load(const WebKit::WebURL& url, CORSMode cors_mode) { |
AsWeakPtr(), gurl)); |
is_local_source_ = !gurl.SchemeIs("http") && !gurl.SchemeIs("https"); |
- |
- BuildDefaultCollection( |
- data_source_, |
- media_thread_.message_loop_proxy(), |
- filter_collection_.get(), |
- BIND_TO_RENDER_LOOP_2(&WebMediaPlayerImpl::OnNeedKey, "", "")); |
} |
void WebMediaPlayerImpl::load(const WebKit::WebURL& url, |
@@ -302,9 +270,6 @@ void WebMediaPlayerImpl::load(const WebKit::WebURL& url, |
BIND_TO_RENDER_LOOP_2(&WebMediaPlayerImpl::OnNeedKey, "", ""), |
base::Bind(&LogMediaSourceError, media_log_)); |
- BuildMediaSourceCollection(chunk_demuxer_, |
- media_thread_.message_loop_proxy(), |
- filter_collection_.get()); |
supports_save_ = false; |
StartPipeline(); |
} |
@@ -1099,7 +1064,7 @@ void WebMediaPlayerImpl::NotifyDownloading(bool is_downloading) { |
void WebMediaPlayerImpl::StartPipeline() { |
starting_ = true; |
pipeline_->Start( |
- filter_collection_.Pass(), |
+ BuildFilterCollection(), |
BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineEnded), |
BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineError), |
BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineSeek), |
@@ -1211,4 +1176,82 @@ 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 |