| 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
|
|
|