| Index: media/blink/webmediaplayer_impl.cc
 | 
| diff --git a/media/blink/webmediaplayer_impl.cc b/media/blink/webmediaplayer_impl.cc
 | 
| index 8fa7a7f57f25761458bd9a4298c0816e0652703a..ab62772c2b205e9920bca514ee9a677d865f4d58 100644
 | 
| --- a/media/blink/webmediaplayer_impl.cc
 | 
| +++ b/media/blink/webmediaplayer_impl.cc
 | 
| @@ -133,13 +133,8 @@ WebMediaPlayerImpl::WebMediaPlayerImpl(
 | 
|        context_3d_cb_(params.context_3d_cb()),
 | 
|        supports_save_(true),
 | 
|        chunk_demuxer_(NULL),
 | 
| -      // Threaded compositing isn't enabled universally yet.
 | 
| -      compositor_task_runner_(
 | 
| -          params.compositor_task_runner()
 | 
| -              ? params.compositor_task_runner()
 | 
| -              : base::MessageLoop::current()->task_runner()),
 | 
| +      compositor_task_runner_(params.compositor_task_runner()),
 | 
|        compositor_(new VideoFrameCompositor(
 | 
| -          compositor_task_runner_,
 | 
|            BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnNaturalSizeChanged),
 | 
|            BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnOpacityChanged))),
 | 
|        encrypted_media_support_(cdm_factory,
 | 
| @@ -149,6 +144,10 @@ WebMediaPlayerImpl::WebMediaPlayerImpl(
 | 
|                                            AsWeakPtr(),
 | 
|                                            base::Bind(&IgnoreCdmAttached))),
 | 
|        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));
 | 
|  
 | 
| @@ -903,13 +902,14 @@ void WebMediaPlayerImpl::StartPipeline() {
 | 
|  
 | 
|    pipeline_.Start(
 | 
|        demuxer_.get(),
 | 
| -      renderer_factory_->CreateRenderer(
 | 
| -          media_task_runner_, audio_source_provider_.get(), compositor_),
 | 
| +      renderer_factory_->CreateRenderer(media_task_runner_,
 | 
| +                                        audio_source_provider_.get()),
 | 
|        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));
 | 
| @@ -980,12 +980,21 @@ 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->GetCurrentFrameAndUpdateIfStale();
 | 
| +  *video_frame_out = compositor->GetCurrentFrame();
 | 
|    event->Signal();
 | 
|  }
 | 
|  
 | 
| 
 |