| Index: webkit/media/webmediaplayer_impl.cc
|
| diff --git a/webkit/media/webmediaplayer_impl.cc b/webkit/media/webmediaplayer_impl.cc
|
| index 98cc5def31f0af439a2f730f9081dabb6565e178..6292e7c31a3d640c3e58144dd5d3d0e6e9a504bf 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(
|
| @@ -270,14 +271,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) {
|
| @@ -1112,7 +1107,7 @@ void WebMediaPlayerImpl::DataSourceInitialized(const GURL& gurl, bool success) {
|
| return;
|
| }
|
|
|
| - StartPipeline();
|
| + StartPipeline(NULL);
|
| }
|
|
|
| void WebMediaPlayerImpl::NotifyDownloading(bool is_downloading) {
|
| @@ -1126,10 +1121,96 @@ 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.
|
| + scoped_ptr<media::Demuxer> demuxer;
|
| + 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;
|
| + }
|
| + filter_collection->SetDemuxer(demuxer.Pass());
|
| +
|
| + // 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),
|
| @@ -1165,8 +1246,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();
|
| @@ -1190,7 +1273,6 @@ void WebMediaPlayerImpl::Destroy() {
|
|
|
| // Release any final references now that everything has stopped.
|
| data_source_ = NULL;
|
| - chunk_demuxer_ = NULL;
|
| }
|
|
|
| WebKit::WebMediaPlayerClient* WebMediaPlayerImpl::GetClient() {
|
| @@ -1240,82 +1322,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
|
|
|