image_transport_factory_android.cc revision 7d4cd473f85ac64c3747c96c277f9e506a0d2246
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/browser/renderer_host/image_transport_factory_android.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/singleton.h"
87d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/stringprintf.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/gpu/browser_gpu_channel_host_factory.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/renderer_host/compositor_impl_android.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/gpu/client/gl_helper.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h"
1390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/common/gpu/gpu_process_launch_causes.h"
14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebGraphicsContext3D.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/khronos/GLES2/gl2.h"
167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "webkit/common/gpu/webgraphicscontext3d_in_process_command_buffer_impl.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)using webkit::gpu::WebGraphicsContext3DInProcessCommandBufferImpl;
237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static ImageTransportFactoryAndroid* g_factory = NULL;
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DirectGLImageTransportFactory : public ImageTransportFactoryAndroid {
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DirectGLImageTransportFactory();
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~DirectGLImageTransportFactory();
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual uint32_t InsertSyncPoint() OVERRIDE { return 0; }
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void WaitSyncPoint(uint32_t sync_point) OVERRIDE {}
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual uint32_t CreateTexture() OVERRIDE {
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return context_->createTexture();
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DeleteTexture(uint32_t id) OVERRIDE {
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    context_->deleteTexture(id);
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void AcquireTexture(
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      uint32 texture_id, const signed char* mailbox_name) OVERRIDE {}
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ReleaseTexture(
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      uint32 texture_id, const signed char* mailbox_name) OVERRIDE {}
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual WebKit::WebGraphicsContext3D* GetContext3D() OVERRIDE {
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return context_.get();
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual GLHelper* GetGLHelper() OVERRIDE { return NULL; }
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<WebGraphicsContext3DInProcessCommandBufferImpl> context_;
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DirectGLImageTransportFactory);
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DirectGLImageTransportFactory::DirectGLImageTransportFactory() {
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebKit::WebGraphicsContext3D::Attributes attrs;
567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  attrs.shareResources = true;
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  attrs.noAutomaticFlushes = true;
587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  context_.reset(webkit::gpu::WebGraphicsContext3DInProcessCommandBufferImpl::
597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                     CreateViewContext(attrs, NULL));
607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (context_->makeContextCurrent())
617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    context_->pushGroupMarkerEXT(
627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        base::StringPrintf("DirectGLImageTransportFactory-%p", this).c_str());
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DirectGLImageTransportFactory::~DirectGLImageTransportFactory() {
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class CmdBufferImageTransportFactory : public ImageTransportFactoryAndroid {
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CmdBufferImageTransportFactory();
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~CmdBufferImageTransportFactory();
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual uint32_t InsertSyncPoint() OVERRIDE;
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void WaitSyncPoint(uint32_t sync_point) OVERRIDE;
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual uint32_t CreateTexture() OVERRIDE;
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DeleteTexture(uint32_t id) OVERRIDE;
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void AcquireTexture(
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      uint32 texture_id, const signed char* mailbox_name) OVERRIDE;
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ReleaseTexture(
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      uint32 texture_id, const signed char* mailbox_name) OVERRIDE;
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual WebKit::WebGraphicsContext3D* GetContext3D() OVERRIDE {
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return context_.get();
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual GLHelper* GetGLHelper() OVERRIDE;
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<WebGraphicsContext3DCommandBufferImpl> context_;
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<GLHelper> gl_helper_;
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(CmdBufferImageTransportFactory);
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CmdBufferImageTransportFactory::CmdBufferImageTransportFactory() {
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::WebGraphicsContext3D::Attributes attrs;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  attrs.shareResources = true;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GpuChannelHostFactory* factory = BrowserGpuChannelHostFactory::instance();
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url("chrome://gpu/ImageTransportFactoryAndroid");
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WeakPtr<WebGraphicsContext3DSwapBuffersClient> swap_client;
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  context_.reset(new WebGraphicsContext3DCommandBufferImpl(0, // offscreen
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                           url,
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                           factory,
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                           swap_client));
103868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  context_->InitializeWithDefaultBufferSizes(
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      attrs,
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      false,
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CAUSE_FOR_GPU_LAUNCH_WEBGRAPHICSCONTEXT3DCOMMANDBUFFERIMPL_INITIALIZE);
1077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (context_->makeContextCurrent())
1097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    context_->pushGroupMarkerEXT(
1107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        base::StringPrintf("CmdBufferImageTransportFactory-%p", this).c_str());
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CmdBufferImageTransportFactory::~CmdBufferImageTransportFactory() {
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)uint32_t CmdBufferImageTransportFactory::InsertSyncPoint() {
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!context_->makeContextCurrent()) {
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOG(ERROR) << "Failed to make helper context current.";
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return 0;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return context_->insertSyncPoint();
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void CmdBufferImageTransportFactory::WaitSyncPoint(uint32_t sync_point) {
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!context_->makeContextCurrent()) {
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOG(ERROR) << "Failed to make helper context current.";
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  context_->waitSyncPoint(sync_point);
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)uint32_t CmdBufferImageTransportFactory::CreateTexture() {
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!context_->makeContextCurrent()) {
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOG(ERROR) << "Failed to make helper context current.";
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return context_->createTexture();
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void CmdBufferImageTransportFactory::DeleteTexture(uint32_t id) {
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!context_->makeContextCurrent()) {
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOG(ERROR) << "Failed to make helper context current.";
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  context_->deleteTexture(id);
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void CmdBufferImageTransportFactory::AcquireTexture(
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    uint32 texture_id, const signed char* mailbox_name) {
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!context_->makeContextCurrent()) {
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOG(ERROR) << "Failed to make helper context current.";
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  context_->bindTexture(GL_TEXTURE_2D, texture_id);
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  context_->consumeTextureCHROMIUM(GL_TEXTURE_2D, mailbox_name);
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  context_->flush();
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void CmdBufferImageTransportFactory::ReleaseTexture(
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    uint32 texture_id, const signed char* mailbox_name) {
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!context_->makeContextCurrent()) {
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOG(ERROR) << "Failed to make helper context current.";
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  context_->bindTexture(GL_TEXTURE_2D, texture_id);
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  context_->produceTextureCHROMIUM(GL_TEXTURE_2D, mailbox_name);
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GLHelper* CmdBufferImageTransportFactory::GetGLHelper() {
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!gl_helper_)
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gl_helper_.reset(new GLHelper(context_.get()));
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return gl_helper_.get();
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // anonymous namespace
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ImageTransportFactoryAndroid* ImageTransportFactoryAndroid::GetInstance() {
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!g_factory) {
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (CompositorImpl::UsesDirectGL())
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      g_factory = new DirectGLImageTransportFactory();
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    else
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      g_factory = new CmdBufferImageTransportFactory();
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return g_factory;
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ImageTransportFactoryAndroid::ImageTransportFactoryAndroid() {
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ImageTransportFactoryAndroid::~ImageTransportFactoryAndroid() {
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace content
197