Home | History | Annotate | Download | only in layers
      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