Index: content/renderer/media/webmediaplayer_impl.cc |
diff --git a/content/renderer/media/webmediaplayer_impl.cc b/content/renderer/media/webmediaplayer_impl.cc |
index ea68fc7348126590c586d2cc31718fbf749f7223..0f111646735a315208f6839f43baa15fb7f3bbc6 100644 |
--- a/content/renderer/media/webmediaplayer_impl.cc |
+++ b/content/renderer/media/webmediaplayer_impl.cc |
@@ -171,12 +171,14 @@ WebMediaPlayerImpl::WebMediaPlayerImpl( |
supports_save_(true), |
starting_(false), |
chunk_demuxer_(NULL), |
- compositor_( // Threaded compositing isn't enabled universally yet. |
- (RenderThreadImpl::current()->compositor_message_loop_proxy() |
- ? RenderThreadImpl::current()->compositor_message_loop_proxy() |
- : base::MessageLoopProxy::current()), |
+ // Threaded compositing isn't enabled universally yet. |
+ compositor_task_runner_( |
+ RenderThreadImpl::current()->compositor_message_loop_proxy() |
+ ? RenderThreadImpl::current()->compositor_message_loop_proxy() |
+ : base::MessageLoopProxy::current()), |
+ compositor_(new VideoFrameCompositor( |
BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnNaturalSizeChanged), |
- BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnOpacityChanged)), |
+ BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnOpacityChanged))), |
text_track_index_(0), |
web_cdm_(NULL) { |
media_log_->AddEvent( |
@@ -232,6 +234,8 @@ WebMediaPlayerImpl::~WebMediaPlayerImpl() { |
base::Bind(&base::WaitableEvent::Signal, base::Unretained(&waiter))); |
waiter.Wait(); |
+ compositor_task_runner_->DeleteSoon(FROM_HERE, compositor_); |
+ |
// Let V8 know we are not using extra resources anymore. |
if (incremented_externally_allocated_memory_) { |
v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory( |
@@ -560,7 +564,7 @@ void WebMediaPlayerImpl::paint(WebCanvas* canvas, |
// - We haven't reached HAVE_CURRENT_DATA and need to paint black |
// - We're painting to a canvas |
// See http://crbug.com/341225 http://crbug.com/342621 for details. |
- scoped_refptr<media::VideoFrame> video_frame = compositor_.GetCurrentFrame(); |
+ scoped_refptr<media::VideoFrame> video_frame = compositor_->GetCurrentFrame(); |
TRACE_EVENT0("media", "WebMediaPlayerImpl:paint"); |
gfx::Rect gfx_rect(rect); |
@@ -594,14 +598,7 @@ unsigned WebMediaPlayerImpl::droppedFrameCount() const { |
DCHECK(main_loop_->BelongsToCurrentThread()); |
media::PipelineStatistics stats = pipeline_.GetStatistics(); |
- |
- unsigned frames_dropped = stats.video_frames_dropped; |
- |
- frames_dropped += const_cast<VideoFrameCompositor&>(compositor_) |
- .GetFramesDroppedBeforeCompositorWasNotified(); |
- |
- DCHECK_LE(frames_dropped, stats.video_frames_decoded); |
- return frames_dropped; |
+ return stats.video_frames_dropped; |
} |
unsigned WebMediaPlayerImpl::audioDecodedByteCount() const { |
@@ -626,7 +623,7 @@ bool WebMediaPlayerImpl::copyVideoTextureToPlatformTexture( |
unsigned int type, |
bool premultiply_alpha, |
bool flip_y) { |
- scoped_refptr<media::VideoFrame> video_frame = compositor_.GetCurrentFrame(); |
+ scoped_refptr<media::VideoFrame> video_frame = compositor_->GetCurrentFrame(); |
TRACE_EVENT0("media", "WebMediaPlayerImpl:copyVideoTextureToPlatformTexture"); |
@@ -991,8 +988,8 @@ void WebMediaPlayerImpl::OnPipelineMetadata( |
if (hasVideo()) { |
DCHECK(!video_weblayer_); |
- video_weblayer_.reset(new webkit::WebLayerImpl( |
- cc::VideoLayer::Create(compositor_.GetVideoFrameProvider()))); |
+ video_weblayer_.reset( |
+ new webkit::WebLayerImpl(cc::VideoLayer::Create(compositor_))); |
video_weblayer_->setOpaque(opaque_); |
client_->setWebLayer(video_weblayer_.get()); |
} |
@@ -1309,7 +1306,11 @@ void WebMediaPlayerImpl::OnOpacityChanged(bool opaque) { |
void WebMediaPlayerImpl::FrameReady( |
const scoped_refptr<media::VideoFrame>& frame) { |
- compositor_.UpdateCurrentFrame(frame); |
+ compositor_task_runner_->PostTask( |
+ FROM_HERE, |
+ base::Bind(&VideoFrameCompositor::UpdateCurrentFrame, |
+ base::Unretained(compositor_), |
+ frame)); |
} |
void WebMediaPlayerImpl::SetDecryptorReadyCB( |