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..930168948f9af9c61cc9745ed3a6e32feab3bb32 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. |
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)); |
// 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. |
+// 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()); |
Daniele Castagna
2016/03/21 17:18:15
GpuMemoryBufferVideoFramePool::PoolImpl::MailboxHo
|
auto it = std::find(resources_pool_.begin(), resources_pool_.end(), |
frame_resources); |
DCHECK(it != resources_pool_.end()); |
@@ -751,6 +741,9 @@ 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()); |
+ |
+ DCHECK(gpu_factories_->GetTaskRunner()->BelongsToCurrentThread()); |
+ gpu_factories_->WaitSyncToken(release_sync_token); |
Daniele Castagna
2016/03/21 17:18:15
This is not necessary. MailboxHoldersReleased gets
dshwang
2016/03/21 18:31:22
It's CC's implementation detail. I think it's not
Daniele Castagna
2016/03/21 18:45:19
I wouldn't say so, this code explicitly sets frame
dshwang
2016/03/21 19:04:38
I see. Let me drop this change. Now CL is for just
|
frame_resources->SetIsInUse(false); |
} |