// 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_VIDEO_FRAME_PROVIDER_H_ #define CC_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*) = 0; }; // 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*) = 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 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&) = 0; }; } // namespace cc #endif // CC_VIDEO_FRAME_PROVIDER_H_