Index: content/renderer/media/renderer_gpu_video_accelerator_factories.cc |
diff --git a/content/renderer/media/renderer_gpu_video_accelerator_factories.cc b/content/renderer/media/renderer_gpu_video_accelerator_factories.cc |
index 7b4777c03451e87d2fe4d9611508b8f16a8239c1..8c279ae6f8a66e683bb65aff02ada26dd4059bcc 100644 |
--- a/content/renderer/media/renderer_gpu_video_accelerator_factories.cc |
+++ b/content/renderer/media/renderer_gpu_video_accelerator_factories.cc |
@@ -14,6 +14,7 @@ |
#include "content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h" |
#include "content/renderer/render_thread_impl.h" |
#include "gpu/command_buffer/client/gles2_implementation.h" |
+#include "third_party/skia/include/core/SkBitmap.h" |
#include "third_party/skia/include/core/SkPixelRef.h" |
namespace content { |
@@ -21,41 +22,16 @@ namespace content { |
RendererGpuVideoAcceleratorFactories::~RendererGpuVideoAcceleratorFactories() {} |
RendererGpuVideoAcceleratorFactories::RendererGpuVideoAcceleratorFactories( |
GpuChannelHost* gpu_channel_host, |
+ const scoped_refptr<base::MessageLoopProxy>& message_loop_proxy, |
const scoped_refptr<ContextProviderCommandBuffer>& context_provider) |
- : message_loop_( |
- RenderThreadImpl::current()->GetMediaThreadMessageLoopProxy()), |
+ : message_loop_proxy_(message_loop_proxy), |
gpu_channel_host_(gpu_channel_host), |
context_provider_(context_provider), |
- thread_safe_sender_(ChildThread::current()->thread_safe_sender()), |
- aborted_waiter_(true, false), |
- message_loop_async_waiter_(false, false) { |
- // |context_provider_| is only required to support HW-accelerated decode. |
- if (!context_provider_) |
- return; |
- |
- if (message_loop_->BelongsToCurrentThread()) { |
- AsyncBindContext(); |
- message_loop_async_waiter_.Reset(); |
- return; |
- } |
- // Wait for the context to be acquired. |
- message_loop_->PostTask( |
- FROM_HERE, |
- base::Bind(&RendererGpuVideoAcceleratorFactories::AsyncBindContext, |
- // Unretained to avoid ref/deref'ing |*this|, which is not yet |
- // stored in a scoped_refptr. Safe because the Wait() below |
- // keeps us alive until this task completes. |
- base::Unretained(this))); |
- message_loop_async_waiter_.Wait(); |
-} |
- |
-RendererGpuVideoAcceleratorFactories::RendererGpuVideoAcceleratorFactories() |
- : aborted_waiter_(true, false), |
- message_loop_async_waiter_(false, false) {} |
+ thread_safe_sender_(ChildThread::current()->thread_safe_sender()) {} |
WebGraphicsContext3DCommandBufferImpl* |
RendererGpuVideoAcceleratorFactories::GetContext3d() { |
- DCHECK(message_loop_->BelongsToCurrentThread()); |
+ DCHECK(message_loop_proxy_->BelongsToCurrentThread()); |
if (!context_provider_) |
return NULL; |
WebGraphicsContext3DCommandBufferImpl* context = |
@@ -68,74 +44,36 @@ RendererGpuVideoAcceleratorFactories::GetContext3d() { |
return context; |
} |
-void RendererGpuVideoAcceleratorFactories::AsyncBindContext() { |
- DCHECK(message_loop_->BelongsToCurrentThread()); |
- if (!context_provider_->BindToCurrentThread()) |
- context_provider_ = NULL; |
- message_loop_async_waiter_.Signal(); |
-} |
- |
scoped_ptr<media::VideoDecodeAccelerator> |
RendererGpuVideoAcceleratorFactories::CreateVideoDecodeAccelerator( |
media::VideoCodecProfile profile, |
media::VideoDecodeAccelerator::Client* client) { |
- if (message_loop_->BelongsToCurrentThread()) { |
- AsyncCreateVideoDecodeAccelerator(profile, client); |
- message_loop_async_waiter_.Reset(); |
- return vda_.Pass(); |
- } |
- // The VDA is returned in the vda_ member variable by the |
- // AsyncCreateVideoDecodeAccelerator() function. |
- message_loop_->PostTask(FROM_HERE, |
- base::Bind(&RendererGpuVideoAcceleratorFactories:: |
- AsyncCreateVideoDecodeAccelerator, |
- this, |
- profile, |
- client)); |
+ DCHECK(message_loop_proxy_->BelongsToCurrentThread()); |
- base::WaitableEvent* objects[] = {&aborted_waiter_, |
- &message_loop_async_waiter_}; |
- if (base::WaitableEvent::WaitMany(objects, arraysize(objects)) == 0) { |
- // If we are aborting and the VDA is created by the |
- // AsyncCreateVideoDecodeAccelerator() function later we need to ensure |
- // that it is destroyed on the same thread. |
- message_loop_->PostTask(FROM_HERE, |
- base::Bind(&RendererGpuVideoAcceleratorFactories:: |
- AsyncDestroyVideoDecodeAccelerator, |
- this)); |
- return scoped_ptr<media::VideoDecodeAccelerator>(); |
+ WebGraphicsContext3DCommandBufferImpl* context = GetContext3d(); |
+ if (context && context->GetCommandBufferProxy()) { |
+ return gpu_channel_host_->CreateVideoDecoder( |
+ context->GetCommandBufferProxy()->GetRouteID(), profile, client); |
} |
- return vda_.Pass(); |
+ |
+ return scoped_ptr<media::VideoDecodeAccelerator>(); |
} |
scoped_ptr<media::VideoEncodeAccelerator> |
RendererGpuVideoAcceleratorFactories::CreateVideoEncodeAccelerator( |
media::VideoEncodeAccelerator::Client* client) { |
- DCHECK(message_loop_->BelongsToCurrentThread()); |
+ DCHECK(message_loop_proxy_->BelongsToCurrentThread()); |
return gpu_channel_host_->CreateVideoEncoder(client); |
} |
-void RendererGpuVideoAcceleratorFactories::AsyncCreateVideoDecodeAccelerator( |
- media::VideoCodecProfile profile, |
- media::VideoDecodeAccelerator::Client* client) { |
- DCHECK(message_loop_->BelongsToCurrentThread()); |
- |
- WebGraphicsContext3DCommandBufferImpl* context = GetContext3d(); |
- if (context && context->GetCommandBufferProxy()) { |
- vda_ = gpu_channel_host_->CreateVideoDecoder( |
- context->GetCommandBufferProxy()->GetRouteID(), profile, client); |
- } |
- message_loop_async_waiter_.Signal(); |
-} |
- |
uint32 RendererGpuVideoAcceleratorFactories::CreateTextures( |
int32 count, |
const gfx::Size& size, |
std::vector<uint32>* texture_ids, |
std::vector<gpu::Mailbox>* texture_mailboxes, |
uint32 texture_target) { |
- DCHECK(message_loop_->BelongsToCurrentThread()); |
+ DCHECK(message_loop_proxy_->BelongsToCurrentThread()); |
DCHECK(texture_target); |
WebGraphicsContext3DCommandBufferImpl* context = GetContext3d(); |
@@ -180,7 +118,7 @@ uint32 RendererGpuVideoAcceleratorFactories::CreateTextures( |
} |
void RendererGpuVideoAcceleratorFactories::DeleteTexture(uint32 texture_id) { |
- DCHECK(message_loop_->BelongsToCurrentThread()); |
+ DCHECK(message_loop_proxy_->BelongsToCurrentThread()); |
WebGraphicsContext3DCommandBufferImpl* context = GetContext3d(); |
if (!context) |
@@ -192,7 +130,7 @@ void RendererGpuVideoAcceleratorFactories::DeleteTexture(uint32 texture_id) { |
} |
void RendererGpuVideoAcceleratorFactories::WaitSyncPoint(uint32 sync_point) { |
- DCHECK(message_loop_->BelongsToCurrentThread()); |
+ DCHECK(message_loop_proxy_->BelongsToCurrentThread()); |
WebGraphicsContext3DCommandBufferImpl* context = GetContext3d(); |
if (!context) |
@@ -205,39 +143,11 @@ void RendererGpuVideoAcceleratorFactories::WaitSyncPoint(uint32 sync_point) { |
void RendererGpuVideoAcceleratorFactories::ReadPixels(uint32 texture_id, |
const gfx::Size& size, |
const SkBitmap& pixels) { |
- // SkBitmaps use the SkPixelRef object to refcount the underlying pixels. |
- // Multiple SkBitmaps can share a SkPixelRef instance. We use this to |
- // ensure that the underlying pixels in the SkBitmap passed in remain valid |
- // until the AsyncReadPixels() call completes. |
- read_pixels_bitmap_.setPixelRef(pixels.pixelRef()); |
- |
- if (!message_loop_->BelongsToCurrentThread()) { |
- message_loop_->PostTask( |
- FROM_HERE, |
- base::Bind(&RendererGpuVideoAcceleratorFactories::AsyncReadPixels, |
- this, |
- texture_id, |
- size)); |
- base::WaitableEvent* objects[] = {&aborted_waiter_, |
- &message_loop_async_waiter_}; |
- if (base::WaitableEvent::WaitMany(objects, arraysize(objects)) == 0) |
- return; |
- } else { |
- AsyncReadPixels(texture_id, size); |
- message_loop_async_waiter_.Reset(); |
- } |
- read_pixels_bitmap_.setPixelRef(NULL); |
-} |
+ DCHECK(message_loop_proxy_->BelongsToCurrentThread()); |
-void RendererGpuVideoAcceleratorFactories::AsyncReadPixels( |
- uint32 texture_id, |
- const gfx::Size& size) { |
- DCHECK(message_loop_->BelongsToCurrentThread()); |
WebGraphicsContext3DCommandBufferImpl* context = GetContext3d(); |
- if (!context) { |
- message_loop_async_waiter_.Signal(); |
+ if (!context) |
return; |
- } |
gpu::gles2::GLES2Implementation* gles2 = context->GetImplementation(); |
@@ -272,46 +182,21 @@ void RendererGpuVideoAcceleratorFactories::AsyncReadPixels( |
size.height(), |
skia_format, |
GL_UNSIGNED_BYTE, |
- read_pixels_bitmap_.pixelRef()->pixels()); |
+ pixels.pixelRef()->pixels()); |
gles2->DeleteFramebuffers(1, &fb); |
gles2->DeleteTextures(1, &tmp_texture); |
DCHECK_EQ(gles2->GetError(), static_cast<GLenum>(GL_NO_ERROR)); |
- message_loop_async_waiter_.Signal(); |
} |
base::SharedMemory* RendererGpuVideoAcceleratorFactories::CreateSharedMemory( |
size_t size) { |
- DCHECK(message_loop_->BelongsToCurrentThread()); |
+ DCHECK(message_loop_proxy_->BelongsToCurrentThread()); |
return ChildThread::AllocateSharedMemory(size, thread_safe_sender_.get()); |
} |
scoped_refptr<base::MessageLoopProxy> |
RendererGpuVideoAcceleratorFactories::GetMessageLoop() { |
- return message_loop_; |
-} |
- |
-void RendererGpuVideoAcceleratorFactories::Abort() { aborted_waiter_.Signal(); } |
- |
-bool RendererGpuVideoAcceleratorFactories::IsAborted() { |
- return aborted_waiter_.IsSignaled(); |
-} |
- |
-scoped_refptr<RendererGpuVideoAcceleratorFactories> |
-RendererGpuVideoAcceleratorFactories::Clone() { |
- scoped_refptr<RendererGpuVideoAcceleratorFactories> factories = |
- new RendererGpuVideoAcceleratorFactories(); |
- factories->message_loop_ = message_loop_; |
- factories->gpu_channel_host_ = gpu_channel_host_; |
- factories->context_provider_ = context_provider_; |
- factories->thread_safe_sender_ = thread_safe_sender_; |
- return factories; |
-} |
- |
-void |
-RendererGpuVideoAcceleratorFactories::AsyncDestroyVideoDecodeAccelerator() { |
- // OK to release because Destroy() will delete the VDA instance. |
- if (vda_) |
- vda_.release()->Destroy(); |
+ return message_loop_proxy_; |
} |
} // namespace content |