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
10namespace media {
11class VideoFrame;
12}
13
14namespace 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.
21class 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