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