15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/gpu/stream_texture_host_android.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/gpu/client/gpu_channel_host.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/gpu/gpu_messages.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/render_thread_impl.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_message_macros.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)StreamTextureHost::StreamTextureHost(GpuChannelHost* channel)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : route_id_(MSG_ROUTING_NONE),
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      stream_id_(0),
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      listener_(NULL),
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      channel_(channel),
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      weak_ptr_factory_(this) {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(channel);
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)StreamTextureHost::~StreamTextureHost() {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (channel_.get() && route_id_ != MSG_ROUTING_NONE)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    channel_->RemoveRoute(route_id_);
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool StreamTextureHost::Initialize(int32 stream_id) {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (channel_.get() && stream_id) {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (channel_->Send(new GpuChannelMsg_RegisterStreamTextureProxy(
31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      stream_id, &route_id_))) {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      stream_id_ = stream_id;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      channel_->AddRoute(route_id_, weak_ptr_factory_.GetWeakPtr());
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool StreamTextureHost::OnMessageReceived(const IPC::Message& message) {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool handled = true;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC_BEGIN_MESSAGE_MAP(StreamTextureHost, message)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(GpuStreamTextureMsg_FrameAvailable,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnFrameAvailable);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(GpuStreamTextureMsg_MatrixChanged,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnMatrixChanged);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_UNHANDLED(handled = false)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC_END_MESSAGE_MAP()
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(handled);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return handled;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void StreamTextureHost::EstablishPeer(int32 primary_id, int32 secondary_id) {
557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (channel_.get()) {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    channel_->Send(new GpuChannelMsg_EstablishStreamTexture(
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        stream_id_, primary_id, secondary_id));
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void StreamTextureHost::OnChannelError() {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void StreamTextureHost::OnFrameAvailable() {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (listener_)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    listener_->OnFrameAvailable();
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void StreamTextureHost::OnMatrixChanged(
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GpuStreamTextureMsg_MatrixChanged_Params& params) {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COMPILE_ASSERT(sizeof(params) == sizeof(float) * 16,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 bad_GpuStreamTextureMsg_MatrixChanged_Params_format);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (listener_)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    listener_->OnMatrixChanged((const float*)&params);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
77