1 // Copyright (c) 2012 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 #ifndef CC_LAYERS_VIDEO_FRAME_PROVIDER_H_ 6 #define CC_LAYERS_VIDEO_FRAME_PROVIDER_H_ 7 8 #include "base/memory/ref_counted.h" 9 10 namespace media { 11 class VideoFrame; 12 } 13 14 namespace cc { 15 16 // Threading notes: This class may be used in a multi threaded manner. 17 // Specifically, the implementation may call GetCurrentFrame() or 18 // PutCurrentFrame() from the compositor thread. If so, the caller is 19 // responsible for making sure Client::DidReceiveFrame() and 20 // Client::DidUpdateMatrix() are only called from this same thread. 21 class VideoFrameProvider { 22 public: 23 virtual ~VideoFrameProvider() {} 24 25 class Client { 26 public: 27 // Provider will call this method to tell the client to stop using it. 28 // StopUsingProvider() may be called from any thread. The client should 29 // block until it has PutCurrentFrame() any outstanding frames. 30 virtual void StopUsingProvider() = 0; 31 32 // Notifies the provider's client that a call to GetCurrentFrame() will 33 // return new data. 34 virtual void DidReceiveFrame() = 0; 35 36 // Notifies the provider's client of a new UV transform matrix to be used. 37 virtual void DidUpdateMatrix(const float* matrix) = 0; 38 39 protected: 40 virtual ~Client() {} 41 }; 42 43 // May be called from any thread, but there must be some external guarantee 44 // that the provider is not destroyed before this call returns. 45 virtual void SetVideoFrameProviderClient(Client* client) = 0; 46 47 // This function places a lock on the current frame and returns a pointer to 48 // it. Calls to this method should always be followed with a call to 49 // PutCurrentFrame(). 50 // Only the current provider client should call this function. 51 virtual scoped_refptr<media::VideoFrame> GetCurrentFrame() = 0; 52 53 // This function releases the lock on the video frame. It should always be 54 // called after GetCurrentFrame(). Frames passed into this method 55 // should no longer be referenced after the call is made. Only the current 56 // provider client should call this function. 57 virtual void PutCurrentFrame( 58 const scoped_refptr<media::VideoFrame>& frame) = 0; 59 }; 60 61 } // namespace cc 62 63 #endif // CC_LAYERS_VIDEO_FRAME_PROVIDER_H_ 64