| Index: media/video/gpu_memory_buffer_video_frame_pool.cc
|
| diff --git a/media/video/gpu_memory_buffer_video_frame_pool.cc b/media/video/gpu_memory_buffer_video_frame_pool.cc
|
| index 28cb1f6968049174f9e2952e261e16bd771aa7bd..777a1fc279892fa6afdf8db4071094bdc4469f80 100644
|
| --- a/media/video/gpu_memory_buffer_video_frame_pool.cc
|
| +++ b/media/video/gpu_memory_buffer_video_frame_pool.cc
|
| @@ -24,6 +24,7 @@
|
| #include "base/trace_event/trace_event.h"
|
| #include "gpu/GLES2/gl2extchromium.h"
|
| #include "gpu/command_buffer/client/gles2_interface.h"
|
| +#include "media/base/bind_to_current_loop.h"
|
| #include "media/renderers/gpu_video_accelerator_factories.h"
|
| #include "third_party/libyuv/include/libyuv.h"
|
| #include "ui/gfx/buffer_format_util.h"
|
| @@ -139,14 +140,10 @@ class GpuMemoryBufferVideoFramePool::PoolImpl
|
|
|
| // Callback called when a VideoFrame generated with GetFrameResources is no
|
| // longer referenced.
|
| - // This could be called by any thread.
|
| + // This must be called on the thread where |media_task_runner_| is current.
|
| void MailboxHoldersReleased(FrameResources* frame_resources,
|
| const gpu::SyncToken& sync_token);
|
|
|
| - // Return frame resources to the pool. This has to be called on the thread
|
| - // where |media_task_runner_| is current.
|
| - void ReturnFrameResources(FrameResources* frame_resources);
|
| -
|
| // Delete resources. This has to be called on the thread where |task_runner|
|
| // is current.
|
| static void DeleteFrameResources(GpuVideoAcceleratorFactories* gpu_factories,
|
| @@ -594,8 +591,8 @@ void GpuMemoryBufferVideoFramePool::PoolImpl::
|
|
|
| scoped_refptr<VideoFrame> frame;
|
|
|
| - auto release_mailbox_callback =
|
| - base::Bind(&PoolImpl::MailboxHoldersReleased, this, frame_resources);
|
| + auto release_mailbox_callback = BindToCurrentLoop(
|
| + base::Bind(&PoolImpl::MailboxHoldersReleased, this, frame_resources));
|
|
|
| // Create the VideoFrame backed by native textures.
|
| gfx::Size visible_size = video_frame->visible_rect().size();
|
| @@ -736,19 +733,12 @@ void GpuMemoryBufferVideoFramePool::PoolImpl::DeleteFrameResources(
|
| }
|
| }
|
|
|
| -// Called when a VideoFrame is no longer references.
|
| +// Called when a VideoFrame is no longer referenced.
|
| +// Put back the resources in the pool.
|
| void GpuMemoryBufferVideoFramePool::PoolImpl::MailboxHoldersReleased(
|
| FrameResources* frame_resources,
|
| - const gpu::SyncToken& sync_token) {
|
| - // Return the resource on the media thread.
|
| - media_task_runner_->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&PoolImpl::ReturnFrameResources, this, frame_resources));
|
| -}
|
| -
|
| -// Put back the resources in the pool.
|
| -void GpuMemoryBufferVideoFramePool::PoolImpl::ReturnFrameResources(
|
| - FrameResources* frame_resources) {
|
| + const gpu::SyncToken& release_sync_token) {
|
| + DCHECK(media_task_runner_->BelongsToCurrentThread());
|
| auto it = std::find(resources_pool_.begin(), resources_pool_.end(),
|
| frame_resources);
|
| DCHECK(it != resources_pool_.end());
|
|
|