// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CC_LAYERS_VIDEO_FRAME_PROVIDER_H_ #define CC_LAYERS_VIDEO_FRAME_PROVIDER_H_ #include "base/memory/ref_counted.h" namespace media { class VideoFrame; } namespace cc { // Threading notes: This class may be used in a multi threaded manner. // Specifically, the implementation may call GetCurrentFrame() or // PutCurrentFrame() from the compositor thread. If so, the caller is // responsible for making sure Client::DidReceiveFrame() and // Client::DidUpdateMatrix() are only called from this same thread. class VideoFrameProvider { public: virtual ~VideoFrameProvider() {} class Client { public: // Provider will call this method to tell the client to stop using it. // StopUsingProvider() may be called from any thread. The client should // block until it has PutCurrentFrame() any outstanding frames. virtual void StopUsingProvider() = 0; // Notifies the provider's client that a call to GetCurrentFrame() will // return new data. virtual void DidReceiveFrame() = 0; // Notifies the provider's client of a new UV transform matrix to be used. virtual void DidUpdateMatrix(const float* matrix) = 0; protected: virtual ~Client() {} }; // May be called from any thread, but there must be some external guarantee // that the provider is not destroyed before this call returns. virtual void SetVideoFrameProviderClient(Client* client) = 0; // This function places a lock on the current frame and returns a pointer to // it. Calls to this method should always be followed with a call to // PutCurrentFrame(). // Only the current provider client should call this function. virtual scoped_refptr<media::VideoFrame> GetCurrentFrame() = 0; // This function releases the lock on the video frame. It should always be // called after GetCurrentFrame(). Frames passed into this method // should no longer be referenced after the call is made. Only the current // provider client should call this function. virtual void PutCurrentFrame( const scoped_refptr<media::VideoFrame>& frame) = 0; }; } // namespace cc #endif // CC_LAYERS_VIDEO_FRAME_PROVIDER_H_