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*)&params);
67a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang}
68a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang
69a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang}  // namespace content
70a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang