Chromium Code Reviews| Index: webkit/media/webmediaplayer_impl.cc |
| diff --git a/webkit/media/webmediaplayer_impl.cc b/webkit/media/webmediaplayer_impl.cc |
| index ce2cbc7c78b80aec988fe38ac667cdf0204f7347..8c339ca88d7882f20d0d524b127ee7f18001b464 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); |
|
scherkus (not reviewing)
2013/04/19 23:18:45
this was the source of the crash -- ms would go ou
|
| 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,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(); |
| + |
| + |
| + // 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_)); |
| + } |
| + |
| + 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), |
| @@ -1175,8 +1255,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 +1282,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,82 +1332,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 |