Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(115)

Unified Diff: webkit/media/webmediaplayer_impl.cc

Issue 14348007: Reland: Remove reference counting from media::VideoDecoder and friends. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fixes Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « webkit/media/webmediaplayer_impl.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webkit/media/webmediaplayer_impl.cc
diff --git a/webkit/media/webmediaplayer_impl.cc b/webkit/media/webmediaplayer_impl.cc
index 4c47acdfdedb6ac080429776af064dd09ef323c6..ce2cbc7c78b80aec988fe38ac667cdf0204f7347 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/debug/crash_logging.h"
#include "base/message_loop_proxy.h"
#include "base/metrics/histogram.h"
@@ -23,11 +24,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"
@@ -38,7 +45,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"
@@ -132,7 +138,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),
@@ -144,6 +149,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),
@@ -170,7 +176,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,
@@ -179,44 +184,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() {
@@ -288,12 +261,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,
@@ -309,9 +276,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();
}
@@ -1175,7 +1139,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),
@@ -1286,4 +1250,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
« no previous file with comments | « webkit/media/webmediaplayer_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698