| Index: webkit/media/webmediaplayer_impl.cc
|
| diff --git a/webkit/media/webmediaplayer_impl.cc b/webkit/media/webmediaplayer_impl.cc
|
| index a193cc4e394175d70eb61bfef2685a8b365451cb..4a554a8eb6cfaa5f96bd8dc006c05a1414b8e7cb 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/strings/string_number_conversions.h"
|
| @@ -22,11 +23,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"
|
| @@ -37,7 +44,6 @@
|
| #include "v8/include/v8.h"
|
| #include "webkit/compositor_bindings/web_layer_impl.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"
|
| @@ -131,7 +137,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),
|
| @@ -143,6 +148,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),
|
| @@ -169,7 +175,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,
|
| @@ -178,44 +183,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()));
|
| - gpu_factories_ = 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() {
|
| @@ -287,12 +260,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,
|
| @@ -308,9 +275,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();
|
| }
|
| @@ -1129,7 +1093,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),
|
| @@ -1240,4 +1204,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
|
|
|