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