| Index: content/renderer/media/android/stream_texture_factory_android.cc
|
| diff --git a/content/renderer/media/android/stream_texture_factory_android.cc b/content/renderer/media/android/stream_texture_factory_android.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..de739786df5f42e08da379c713162e7b0f5e1515
|
| --- /dev/null
|
| +++ b/content/renderer/media/android/stream_texture_factory_android.cc
|
| @@ -0,0 +1,94 @@
|
| +// Copyright 2013 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "content/renderer/media/android/stream_texture_factory_android.h"
|
| +
|
| +#include "content/common/gpu/client/gpu_channel_host.h"
|
| +#include "content/common/gpu/gpu_messages.h"
|
| +#include "third_party/WebKit/public/platform/WebGraphicsContext3D.h"
|
| +#include "ui/gfx/size.h"
|
| +
|
| +namespace content {
|
| +
|
| +StreamTextureProxy::StreamTextureProxy(StreamTextureHost* host)
|
| + : host_(host), client_(NULL) {
|
| + host->SetListener(this);
|
| +}
|
| +
|
| +StreamTextureProxy::~StreamTextureProxy() {}
|
| +
|
| +void StreamTextureProxy::Release() {
|
| + SetClient(NULL);
|
| + if (loop_.get() && loop_.get() != base::MessageLoopProxy::current())
|
| + loop_->DeleteSoon(FROM_HERE, this);
|
| + else
|
| + delete this;
|
| +}
|
| +
|
| +void StreamTextureProxy::SetClient(cc::VideoFrameProvider::Client* client) {
|
| + base::AutoLock lock(client_lock_);
|
| + client_ = client;
|
| +}
|
| +
|
| +void StreamTextureProxy::BindToCurrentThread(int stream_id,
|
| + int width,
|
| + int height) {
|
| + loop_ = base::MessageLoopProxy::current();
|
| + host_->Initialize(stream_id, gfx::Size(width, height));
|
| +}
|
| +
|
| +void StreamTextureProxy::OnFrameAvailable() {
|
| + base::AutoLock lock(client_lock_);
|
| + if (client_)
|
| + client_->DidReceiveFrame();
|
| +}
|
| +
|
| +void StreamTextureProxy::OnMatrixChanged(const float matrix[16]) {
|
| + base::AutoLock lock(client_lock_);
|
| + if (client_)
|
| + client_->DidUpdateMatrix(matrix);
|
| +}
|
| +
|
| +StreamTextureFactory::StreamTextureFactory(
|
| + WebKit::WebGraphicsContext3D* context,
|
| + GpuChannelHost* channel,
|
| + int view_id)
|
| + : context_(context), channel_(channel), view_id_(view_id) {
|
| + DCHECK(context_);
|
| + DCHECK(channel);
|
| +}
|
| +
|
| +StreamTextureFactory::~StreamTextureFactory() {}
|
| +
|
| +StreamTextureProxy* StreamTextureFactory::CreateProxy() {
|
| + DCHECK(channel_.get());
|
| + StreamTextureHost* host = new StreamTextureHost(channel_.get());
|
| + return new StreamTextureProxy(host);
|
| +}
|
| +
|
| +void StreamTextureFactory::EstablishPeer(int stream_id, int player_id) {
|
| + DCHECK(channel_.get());
|
| + channel_->Send(
|
| + new GpuChannelMsg_EstablishStreamTexture(stream_id, view_id_, player_id));
|
| +}
|
| +
|
| +unsigned StreamTextureFactory::CreateStreamTexture(unsigned* texture_id) {
|
| + unsigned stream_id = 0;
|
| + if (context_->makeContextCurrent()) {
|
| + *texture_id = context_->createTexture();
|
| + stream_id = context_->createStreamTextureCHROMIUM(*texture_id);
|
| + context_->flush();
|
| + }
|
| + return stream_id;
|
| +}
|
| +
|
| +void StreamTextureFactory::DestroyStreamTexture(unsigned texture_id) {
|
| + if (context_->makeContextCurrent()) {
|
| + context_->destroyStreamTextureCHROMIUM(texture_id);
|
| + context_->deleteTexture(texture_id);
|
| + context_->flush();
|
| + }
|
| +}
|
| +
|
| +} // namespace content
|
|
|