Chromium Code Reviews| Index: cc/resources/video_resource_updater.cc |
| diff --git a/cc/resources/video_resource_updater.cc b/cc/resources/video_resource_updater.cc |
| index 6f8bb4bc6e5ba1e400f01f2b8a89c02f90e67d5c..21e7de139a1dd18f3d4b98da3bbef5edccf16d5b 100644 |
| --- a/cc/resources/video_resource_updater.cc |
| +++ b/cc/resources/video_resource_updater.cc |
| @@ -11,6 +11,8 @@ |
| #include "base/bind.h" |
| #include "base/bit_cast.h" |
| +#include "base/single_thread_task_runner.h" |
| +#include "base/thread_task_runner_handle.h" |
| #include "base/trace_event/trace_event.h" |
| #include "cc/base/math_util.h" |
| #include "cc/output/gl_renderer.h" |
| @@ -112,6 +114,12 @@ class SyncTokenClientImpl : public media::VideoFrame::SyncTokenClient { |
| gpu::SyncToken sync_token_; |
| }; |
| +void OnVideoFrameDestruct( |
| + const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, |
| + const base::Closure& task) { |
| + task_runner->PostTask(FROM_HERE, task); |
|
miu
2016/02/19 02:47:46
This will introduce an unknown time delay before t
xjz
2016/02/20 00:40:47
Done. Since each VideoFrame can have three resourc
|
| +} |
| + |
| } // namespace |
| VideoResourceUpdater::PlaneResource::PlaneResource( |
| @@ -353,6 +361,12 @@ VideoFrameExternalResources VideoResourceUpdater::CreateForSoftwarePlanes( |
| resource_it = |
| AllocateResource(output_plane_resource_size, output_resource_format, |
| !software_compositor, is_immutable); |
| + if (resource_it != all_resources_.end()) { |
| + video_frame->AddDestructionObserver(base::Bind( |
| + &OnVideoFrameDestruct, base::ThreadTaskRunnerHandle::Get(), |
| + base::Bind(&VideoResourceUpdater::InvalidateResource, AsWeakPtr(), |
| + resource_it->resource_id))); |
| + } |
| } |
| if (resource_it == all_resources_.end()) |
| break; |
| @@ -685,4 +699,24 @@ void VideoResourceUpdater::RecycleResource( |
| DCHECK_GE(resource_it->ref_count, 0); |
| } |
| +// static |
| +void VideoResourceUpdater::InvalidateResource( |
| + base::WeakPtr<VideoResourceUpdater> updater, |
| + ResourceId resource_id) { |
| + if (!updater.get()) { |
| + return; |
| + } |
| + |
| + const ResourceList::iterator resource_it = std::find_if( |
| + updater->all_resources_.begin(), updater->all_resources_.end(), |
| + [resource_id](const PlaneResource& plane_resource) { |
| + return plane_resource.resource_id == resource_id; |
| + }); |
| + if (resource_it == updater->all_resources_.end()) |
| + return; |
| + |
| + resource_it->ref_count = 0; |
| + updater->DeleteResource(resource_it); |
| +} |
| + |
| } // namespace cc |