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 |