1 // Copyright 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "cc/layers/video_frame_provider_client_impl.h" 6 7 #include "base/debug/trace_event.h" 8 #include "cc/base/math_util.h" 9 #include "cc/layers/video_layer_impl.h" 10 #include "media/base/video_frame.h" 11 12 namespace cc { 13 14 // static 15 scoped_refptr<VideoFrameProviderClientImpl> 16 VideoFrameProviderClientImpl::Create( 17 VideoFrameProvider* provider) { 18 return make_scoped_refptr( 19 new VideoFrameProviderClientImpl(provider)); 20 } 21 22 VideoFrameProviderClientImpl::~VideoFrameProviderClientImpl() {} 23 24 VideoFrameProviderClientImpl::VideoFrameProviderClientImpl( 25 VideoFrameProvider* provider) 26 : active_video_layer_(NULL), provider_(provider) { 27 // This only happens during a commit on the compositor thread while the main 28 // thread is blocked. That makes this a thread-safe call to set the video 29 // frame provider client that does not require a lock. The same is true of 30 // the call to Stop(). 31 provider_->SetVideoFrameProviderClient(this); 32 33 // This matrix is the default transformation for stream textures, and flips 34 // on the Y axis. 35 stream_texture_matrix_ = gfx::Transform( 36 1.0, 0.0, 0.0, 0.0, 37 0.0, -1.0, 0.0, 1.0, 38 0.0, 0.0, 1.0, 0.0, 39 0.0, 0.0, 0.0, 1.0); 40 } 41 42 void VideoFrameProviderClientImpl::Stop() { 43 if (!provider_) 44 return; 45 provider_->SetVideoFrameProviderClient(NULL); 46 provider_ = NULL; 47 } 48 49 scoped_refptr<media::VideoFrame> 50 VideoFrameProviderClientImpl::AcquireLockAndCurrentFrame() { 51 provider_lock_.Acquire(); // Balanced by call to ReleaseLock(). 52 if (!provider_) 53 return NULL; 54 55 return provider_->GetCurrentFrame(); 56 } 57 58 void VideoFrameProviderClientImpl::PutCurrentFrame( 59 const scoped_refptr<media::VideoFrame>& frame) { 60 provider_lock_.AssertAcquired(); 61 provider_->PutCurrentFrame(frame); 62 } 63 64 void VideoFrameProviderClientImpl::ReleaseLock() { 65 provider_lock_.AssertAcquired(); 66 provider_lock_.Release(); 67 } 68 69 void VideoFrameProviderClientImpl::StopUsingProvider() { 70 // Block the provider from shutting down until this client is done 71 // using the frame. 72 base::AutoLock locker(provider_lock_); 73 provider_ = NULL; 74 } 75 76 void VideoFrameProviderClientImpl::DidReceiveFrame() { 77 TRACE_EVENT1("cc", 78 "VideoFrameProviderClientImpl::DidReceiveFrame", 79 "active_video_layer", 80 !!active_video_layer_); 81 if (active_video_layer_) 82 active_video_layer_->SetNeedsRedraw(); 83 } 84 85 void VideoFrameProviderClientImpl::DidUpdateMatrix(const float* matrix) { 86 stream_texture_matrix_ = gfx::Transform( 87 matrix[0], matrix[4], matrix[8], matrix[12], 88 matrix[1], matrix[5], matrix[9], matrix[13], 89 matrix[2], matrix[6], matrix[10], matrix[14], 90 matrix[3], matrix[7], matrix[11], matrix[15]); 91 if (active_video_layer_) 92 active_video_layer_->SetNeedsRedraw(); 93 } 94 95 } // namespace cc 96