Chromium Code Reviews| 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 bdc2b39a0040d57129d00acab5b1d79b2c245dcb..0a26be5c0bdda947392c87d744ff569e7b49fb31 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 could be called on the thread where |media_task_runner_| is current. |
|
Daniele Castagna
2016/03/21 18:45:19
nit: s/could/must.
dshwang
2016/03/21 19:04:38
Done.
|
| 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, |
| @@ -589,8 +586,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)); |
|
dshwang
2016/03/21 18:31:23
No, this patch doesn't have a race, because I use
Daniele Castagna
2016/03/21 18:45:19
Ooh, sorry, I missed the BindToCurrentLoop. This i
dshwang
2016/03/21 19:04:38
Done.
|
| // Create the VideoFrame backed by native textures. |
| gfx::Size visible_size = video_frame->visible_rect().size(); |
| @@ -732,18 +729,11 @@ void GpuMemoryBufferVideoFramePool::PoolImpl::DeleteFrameResources( |
| } |
| // Called when a VideoFrame is no longer references. |
|
Daniele Castagna
2016/03/21 18:45:19
nit: s/references/referenced.
dshwang
2016/03/21 19:04:38
Done.
|
| +// 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()); |
| @@ -751,6 +741,8 @@ void GpuMemoryBufferVideoFramePool::PoolImpl::ReturnFrameResources( |
| // This minimizes the chances of locking the buffer that might be |
| // still needed for drawing. |
| std::swap(*it, resources_pool_.back()); |
| + |
| + gpu_factories_->WaitSyncToken(release_sync_token); |
| frame_resources->SetIsInUse(false); |
| } |