1a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang// Use of this source code is governed by a BSD-style license that can be 3a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang// found in the LICENSE file. 4a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 5a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#include "content/renderer/gpu/stream_texture_host_android.h" 6a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 7a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#include "content/common/gpu/client/gpu_channel_host.h" 8a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#include "content/common/gpu/gpu_messages.h" 9a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#include "content/renderer/render_thread_impl.h" 10a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#include "ipc/ipc_message_macros.h" 11a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 12a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wangnamespace content { 13a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 14a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu WangStreamTextureHost::StreamTextureHost(GpuChannelHost* channel) 15a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang : stream_id_(0), 16a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang listener_(NULL), 17a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang channel_(channel), 18a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang weak_ptr_factory_(this) { 19a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang DCHECK(channel); 20a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang} 21a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 22a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu WangStreamTextureHost::~StreamTextureHost() { 23a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang if (channel_.get() && stream_id_) 24a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang channel_->RemoveRoute(stream_id_); 25a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang} 26a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 27a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wangbool StreamTextureHost::BindToCurrentThread(int32 stream_id, 28a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang Listener* listener) { 29a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang listener_ = listener; 30a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang if (channel_.get() && stream_id && !stream_id_) { 31a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang stream_id_ = stream_id; 32a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang channel_->AddRoute(stream_id, weak_ptr_factory_.GetWeakPtr()); 33a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang channel_->Send(new GpuStreamTextureMsg_StartListening(stream_id)); 34a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return true; 35a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang } 36a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 37a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return false; 38a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang} 39a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 40a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wangbool StreamTextureHost::OnMessageReceived(const IPC::Message& message) { 41a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang bool handled = true; 42a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang IPC_BEGIN_MESSAGE_MAP(StreamTextureHost, message) 43a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang IPC_MESSAGE_HANDLER(GpuStreamTextureMsg_FrameAvailable, 44a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang OnFrameAvailable); 45a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang IPC_MESSAGE_HANDLER(GpuStreamTextureMsg_MatrixChanged, 46a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang OnMatrixChanged); 47a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang IPC_MESSAGE_UNHANDLED(handled = false) 48a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang IPC_END_MESSAGE_MAP() 49a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang DCHECK(handled); 50a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return handled; 51a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang} 52a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 53a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wangvoid StreamTextureHost::OnChannelError() { 54a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang} 55a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 56a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wangvoid StreamTextureHost::OnFrameAvailable() { 57a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang if (listener_) 58a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang listener_->OnFrameAvailable(); 59a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang} 60a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 61a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wangvoid StreamTextureHost::OnMatrixChanged( 62a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang const GpuStreamTextureMsg_MatrixChanged_Params& params) { 63a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang COMPILE_ASSERT(sizeof(params) == sizeof(float) * 16, 64a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang bad_GpuStreamTextureMsg_MatrixChanged_Params_format); 65a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang if (listener_) 66a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang listener_->OnMatrixChanged((const float*)¶ms); 67a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang} 68a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 69a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang} // namespace content 70a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang