Index: media/blink/webmediaplayer_impl.cc |
diff --git a/media/blink/webmediaplayer_impl.cc b/media/blink/webmediaplayer_impl.cc |
index 360b94f8ac6911587cfa875138c142d469ce3af5..8a47b9fec8dfb2a9dc6787b357fab8a6fd3f4573 100644 |
--- a/media/blink/webmediaplayer_impl.cc |
+++ b/media/blink/webmediaplayer_impl.cc |
@@ -134,8 +134,13 @@ WebMediaPlayerImpl::WebMediaPlayerImpl( |
context_3d_cb_(params.context_3d_cb()), |
supports_save_(true), |
chunk_demuxer_(NULL), |
- compositor_task_runner_(params.compositor_task_runner()), |
+ // Threaded compositing isn't enabled universally yet. |
+ compositor_task_runner_( |
+ params.compositor_task_runner() |
+ ? params.compositor_task_runner() |
+ : base::MessageLoop::current()->task_runner()), |
compositor_(new VideoFrameCompositor( |
+ compositor_task_runner_, |
BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnNaturalSizeChanged), |
BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnOpacityChanged))), |
encrypted_media_support_( |
@@ -144,10 +149,6 @@ WebMediaPlayerImpl::WebMediaPlayerImpl( |
params.media_permission(), |
base::Bind(&WebMediaPlayerImpl::SetCdm, AsWeakPtr())), |
renderer_factory_(renderer_factory.Pass()) { |
- // Threaded compositing isn't enabled universally yet. |
- if (!compositor_task_runner_.get()) |
- compositor_task_runner_ = base::MessageLoopProxy::current(); |
- |
media_log_->AddEvent( |
media_log_->CreateEvent(MediaLogEvent::WEBMEDIAPLAYER_CREATED)); |
@@ -176,6 +177,7 @@ WebMediaPlayerImpl::~WebMediaPlayerImpl() { |
if (delegate_) |
delegate_->PlayerGone(this); |
+ compositor_->StopRendering(); |
// Abort any pending IO so stopping the pipeline doesn't get blocked. |
if (data_source_) |
@@ -258,8 +260,11 @@ void WebMediaPlayerImpl::play() { |
media_log_->AddEvent(media_log_->CreateEvent(MediaLogEvent::PLAY)); |
- if (delegate_ && playback_rate_ > 0) |
- delegate_->DidPlay(this); |
+ if (playback_rate_ > 0) { |
+ compositor_->StartRendering(); |
+ if (delegate_) |
+ delegate_->DidPlay(this); |
+ } |
} |
void WebMediaPlayerImpl::pause() { |
@@ -275,8 +280,11 @@ void WebMediaPlayerImpl::pause() { |
media_log_->AddEvent(media_log_->CreateEvent(MediaLogEvent::PAUSE)); |
- if (!was_already_paused && delegate_) |
- delegate_->DidPause(this); |
+ if (!was_already_paused) { |
+ compositor_->StopRendering(); |
+ if (delegate_) |
+ delegate_->DidPause(this); |
+ } |
} |
bool WebMediaPlayerImpl::supportsSave() const { |
@@ -348,10 +356,15 @@ void WebMediaPlayerImpl::setRate(double rate) { |
rate = kMinRate; |
else if (rate > kMaxRate) |
rate = kMaxRate; |
- if (playback_rate_ == 0 && !paused_ && delegate_) |
- delegate_->DidPlay(this); |
- } else if (playback_rate_ != 0 && !paused_ && delegate_) { |
- delegate_->DidPause(this); |
+ if (playback_rate_ == 0 && !paused_) { |
+ compositor_->StartRendering(); |
+ if (delegate_) |
+ delegate_->DidPlay(this); |
+ } |
+ } else if (playback_rate_ != 0 && !paused_) { |
+ compositor_->StopRendering(); |
+ if (delegate_) |
+ delegate_->DidPause(this); |
} |
playback_rate_ = rate; |
@@ -904,14 +917,13 @@ void WebMediaPlayerImpl::StartPipeline() { |
pipeline_.Start( |
demuxer_.get(), |
- renderer_factory_->CreateRenderer(media_task_runner_, |
- audio_source_provider_.get()), |
+ renderer_factory_->CreateRenderer( |
+ media_task_runner_, audio_source_provider_.get(), compositor_), |
BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineEnded), |
BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineError), |
BIND_TO_RENDER_LOOP1(&WebMediaPlayerImpl::OnPipelineSeeked, false), |
BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineMetadata), |
BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineBufferingStateChanged), |
- base::Bind(&WebMediaPlayerImpl::FrameReady, base::Unretained(this)), |
BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnDurationChanged), |
BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnAddTextTrack), |
BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnWaitingForDecryptionKey)); |
@@ -982,41 +994,12 @@ void WebMediaPlayerImpl::OnOpacityChanged(bool opaque) { |
video_weblayer_->setOpaque(opaque_); |
} |
-void WebMediaPlayerImpl::FrameReady( |
- const scoped_refptr<VideoFrame>& frame) { |
- compositor_task_runner_->PostTask( |
- FROM_HERE, |
- base::Bind(&VideoFrameCompositor::UpdateCurrentFrame, |
- base::Unretained(compositor_), |
- frame)); |
-} |
- |
-static void GetCurrentFrameAndSignal( |
- VideoFrameCompositor* compositor, |
- scoped_refptr<VideoFrame>* video_frame_out, |
- base::WaitableEvent* event) { |
- TRACE_EVENT0("media", "GetCurrentFrameAndSignal"); |
- *video_frame_out = compositor->GetCurrentFrame(); |
- event->Signal(); |
-} |
- |
scoped_refptr<VideoFrame> |
WebMediaPlayerImpl::GetCurrentFrameFromCompositor() { |
TRACE_EVENT0("media", "WebMediaPlayerImpl::GetCurrentFrameFromCompositor"); |
- if (compositor_task_runner_->BelongsToCurrentThread()) |
- return compositor_->GetCurrentFrame(); |
- |
- // Use a posted task and waitable event instead of a lock otherwise |
- // WebGL/Canvas can see different content than what the compositor is seeing. |
- scoped_refptr<VideoFrame> video_frame; |
- base::WaitableEvent event(false, false); |
- compositor_task_runner_->PostTask(FROM_HERE, |
- base::Bind(&GetCurrentFrameAndSignal, |
- base::Unretained(compositor_), |
- &video_frame, |
- &event)); |
- event.Wait(); |
- return video_frame; |
+ // Since the compositor is driving frame collection, this should be at most |
+ // one frame off; which is as good as we can get without a push based model. |
+ return compositor_->GetCurrentFrame(); |
} |
void WebMediaPlayerImpl::UpdatePausedTime() { |