1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// found in the LICENSE file.
4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#ifndef CONTENT_RENDERER_MEDIA_ANDROID_STREAM_TEXTURE_FACTORY_ANDROID_H_
6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#define CONTENT_RENDERER_MEDIA_ANDROID_STREAM_TEXTURE_FACTORY_ANDROID_H_
7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/memory/scoped_ptr.h"
9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "cc/layers/video_frame_provider.h"
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "gpu/command_buffer/common/mailbox.h"
114311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#include "ui/gfx/size.h"
12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace content {
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// The proxy class for the gpu thread to notify the compositor thread
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// when a new video frame is available.
174311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdochclass StreamTextureProxy {
18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public:
194311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  virtual ~StreamTextureProxy() {}
20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Initialize and bind to the current thread, which becomes the thread that
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // a connected client will receive callbacks on.
234311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  virtual void BindToCurrentThread(int32 stream_id) = 0;
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
254311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  virtual bool IsBoundToThread() = 0;
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Setting the target for callback when a frame is available. This function
28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // could be called on both the main thread and the compositor thread.
294311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  virtual void SetClient(cc::VideoFrameProvider::Client* client) = 0;
30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
314311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Causes this instance to be deleted on the thread it is bound to.
324311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  virtual void Release() = 0;
33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  struct Deleter {
35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    inline void operator()(StreamTextureProxy* ptr) const { ptr->Release(); }
36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  };
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch};
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochtypedef scoped_ptr<StreamTextureProxy, StreamTextureProxy::Deleter>
40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ScopedStreamTextureProxy;
41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Factory class for managing stream textures.
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass StreamTextureFactory {
44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public:
454311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  virtual ~StreamTextureFactory() {}
46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Create the StreamTextureProxy object.
484311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  virtual StreamTextureProxy* CreateProxy() = 0;
49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Send an IPC message to the browser process to request a java surface
51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // object for the given stream_id. After the the surface is created,
52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // it will be passed back to the WebMediaPlayerAndroid object identified by
53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // the player_id.
544311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  virtual void EstablishPeer(int32 stream_id, int player_id) = 0;
55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Create the streamTexture and return the stream Id and create a client-side
57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // texture id to refer to the streamTexture. The texture id is produced into
58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // a mailbox so it can be used to ship in a VideoFrame, with a sync point for
59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // when the mailbox can be accessed.
604311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  virtual unsigned CreateStreamTexture(
61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      unsigned texture_target,
62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      unsigned* texture_id,
63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      gpu::Mailbox* texture_mailbox,
644311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      unsigned* texture_mailbox_sync_point) = 0;
65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Destroy the streamTexture for the given texture id, as well as the
67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // client side texture.
684311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  virtual void DestroyStreamTexture(unsigned texture_id) = 0;
69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Set the streamTexture size for the given stream Id.
714311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  virtual void SetStreamTextureSize(int32 texture_id,
724311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch                                    const gfx::Size& size) = 0;
73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch};
74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}  // namespace content
76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif  // CONTENT_RENDERER_MEDIA_ANDROID_STREAM_TEXTURE_FACTORY_ANDROID_H_
78