• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2014 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 CONTENT_RENDERER_MEDIA_ANDROID_STREAM_TEXTURE_FACTORY_H_
6 #define CONTENT_RENDERER_MEDIA_ANDROID_STREAM_TEXTURE_FACTORY_H_
7 
8 #include "base/memory/ref_counted.h"
9 #include "base/memory/scoped_ptr.h"
10 #include "base/message_loop/message_loop_proxy.h"
11 #include "cc/layers/video_frame_provider.h"
12 #include "gpu/command_buffer/common/mailbox.h"
13 #include "ui/gfx/size.h"
14 
15 namespace gpu {
16 namespace gles2 {
17 class GLES2Interface;
18 }  // namespace gles2
19 }  // namespace gpu
20 
21 namespace content {
22 
23 // The proxy class for the gpu thread to notify the compositor thread
24 // when a new video frame is available.
25 class StreamTextureProxy {
26  public:
~StreamTextureProxy()27   virtual ~StreamTextureProxy() {}
28 
29   // Initialize and bind to the loop, which becomes the thread that
30   // a connected client will receive callbacks on. This can be called
31   // on any thread, but must be called with the same loop every time.
32   virtual void BindToLoop(int32 stream_id,
33                           cc::VideoFrameProvider::Client* client,
34                           scoped_refptr<base::MessageLoopProxy> loop) = 0;
35 
36   // Causes this instance to be deleted on the thread it is bound to.
37   virtual void Release() = 0;
38 
39   struct Deleter {
operatorDeleter40     inline void operator()(StreamTextureProxy* ptr) const { ptr->Release(); }
41   };
42 };
43 
44 typedef scoped_ptr<StreamTextureProxy, StreamTextureProxy::Deleter>
45     ScopedStreamTextureProxy;
46 
47 class StreamTextureFactoryContextObserver {
48  public:
~StreamTextureFactoryContextObserver()49   virtual ~StreamTextureFactoryContextObserver() {}
50   virtual void ResetStreamTextureProxy() = 0;
51 };
52 
53 // Factory class for managing stream textures.
54 class StreamTextureFactory : public base::RefCounted<StreamTextureFactory> {
55  public:
56   // Create the StreamTextureProxy object.
57   virtual StreamTextureProxy* CreateProxy() = 0;
58 
59   // Send an IPC message to the browser process to request a java surface
60   // object for the given stream_id. After the the surface is created,
61   // it will be passed back to the WebMediaPlayerAndroid object identified by
62   // the player_id.
63   virtual void EstablishPeer(int32 stream_id, int player_id) = 0;
64 
65   // Creates a StreamTexture and returns its id.  Sets |*texture_id| to the
66   // client-side id of the StreamTexture. The texture is produced into
67   // a mailbox so it can be shipped in a VideoFrame.
68   virtual unsigned CreateStreamTexture(unsigned texture_target,
69                                        unsigned* texture_id,
70                                        gpu::Mailbox* texture_mailbox) = 0;
71 
72   // Set the streamTexture size for the given stream Id.
73   virtual void SetStreamTextureSize(int32 texture_id,
74                                     const gfx::Size& size) = 0;
75 
76   virtual gpu::gles2::GLES2Interface* ContextGL() = 0;
77 
78   virtual void AddObserver(StreamTextureFactoryContextObserver* obs) = 0;
79   virtual void RemoveObserver(StreamTextureFactoryContextObserver* obs) = 0;
80 
81  protected:
82   friend class base::RefCounted<StreamTextureFactory>;
~StreamTextureFactory()83   virtual ~StreamTextureFactory() {}
84 };
85 
86 }  // namespace content
87 
88 #endif  // CONTENT_RENDERER_MEDIA_ANDROID_STREAM_TEXTURE_FACTORY_H_
89