Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "cc/resources/video_resource_updater.h" | 5 #include "cc/resources/video_resource_updater.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <algorithm> | 10 #include <algorithm> |
| 11 | 11 |
| 12 #include "base/bind.h" | 12 #include "base/bind.h" |
| 13 #include "base/bit_cast.h" | 13 #include "base/bit_cast.h" |
| 14 #include "base/single_thread_task_runner.h" | |
| 15 #include "base/thread_task_runner_handle.h" | |
| 14 #include "base/trace_event/trace_event.h" | 16 #include "base/trace_event/trace_event.h" |
| 15 #include "cc/base/math_util.h" | 17 #include "cc/base/math_util.h" |
| 16 #include "cc/output/gl_renderer.h" | 18 #include "cc/output/gl_renderer.h" |
| 17 #include "cc/resources/resource_provider.h" | 19 #include "cc/resources/resource_provider.h" |
| 18 #include "gpu/GLES2/gl2extchromium.h" | 20 #include "gpu/GLES2/gl2extchromium.h" |
| 19 #include "gpu/command_buffer/client/gles2_interface.h" | 21 #include "gpu/command_buffer/client/gles2_interface.h" |
| 20 #include "media/base/video_frame.h" | 22 #include "media/base/video_frame.h" |
| 21 #include "media/renderers/skcanvas_video_renderer.h" | 23 #include "media/renderers/skcanvas_video_renderer.h" |
| 22 #include "third_party/khronos/GLES2/gl2.h" | 24 #include "third_party/khronos/GLES2/gl2.h" |
| 23 #include "third_party/khronos/GLES2/gl2ext.h" | 25 #include "third_party/khronos/GLES2/gl2ext.h" |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 105 sync_token_.Clear(); | 107 sync_token_.Clear(); |
| 106 } | 108 } |
| 107 } | 109 } |
| 108 } | 110 } |
| 109 | 111 |
| 110 private: | 112 private: |
| 111 gpu::gles2::GLES2Interface* gl_; | 113 gpu::gles2::GLES2Interface* gl_; |
| 112 gpu::SyncToken sync_token_; | 114 gpu::SyncToken sync_token_; |
| 113 }; | 115 }; |
| 114 | 116 |
| 117 void OnVideoFrameDestruct( | |
| 118 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, | |
| 119 const base::Closure& task) { | |
| 120 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
| |
| 121 } | |
| 122 | |
| 115 } // namespace | 123 } // namespace |
| 116 | 124 |
| 117 VideoResourceUpdater::PlaneResource::PlaneResource( | 125 VideoResourceUpdater::PlaneResource::PlaneResource( |
| 118 unsigned int resource_id, | 126 unsigned int resource_id, |
| 119 const gfx::Size& resource_size, | 127 const gfx::Size& resource_size, |
| 120 ResourceFormat resource_format, | 128 ResourceFormat resource_format, |
| 121 gpu::Mailbox mailbox) | 129 gpu::Mailbox mailbox) |
| 122 : resource_id(resource_id), | 130 : resource_id(resource_id), |
| 123 resource_size(resource_size), | 131 resource_size(resource_size), |
| 124 resource_format(resource_format), | 132 resource_format(resource_format), |
| (...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 346 } | 354 } |
| 347 } | 355 } |
| 348 } | 356 } |
| 349 | 357 |
| 350 // Check if we need to allocate a new resource. | 358 // Check if we need to allocate a new resource. |
| 351 if (resource_it == all_resources_.end()) { | 359 if (resource_it == all_resources_.end()) { |
| 352 const bool is_immutable = true; | 360 const bool is_immutable = true; |
| 353 resource_it = | 361 resource_it = |
| 354 AllocateResource(output_plane_resource_size, output_resource_format, | 362 AllocateResource(output_plane_resource_size, output_resource_format, |
| 355 !software_compositor, is_immutable); | 363 !software_compositor, is_immutable); |
| 364 if (resource_it != all_resources_.end()) { | |
| 365 video_frame->AddDestructionObserver(base::Bind( | |
| 366 &OnVideoFrameDestruct, base::ThreadTaskRunnerHandle::Get(), | |
| 367 base::Bind(&VideoResourceUpdater::InvalidateResource, AsWeakPtr(), | |
| 368 resource_it->resource_id))); | |
| 369 } | |
| 356 } | 370 } |
| 357 if (resource_it == all_resources_.end()) | 371 if (resource_it == all_resources_.end()) |
| 358 break; | 372 break; |
| 359 | 373 |
| 360 ++resource_it->ref_count; | 374 ++resource_it->ref_count; |
| 361 plane_resources.push_back(resource_it); | 375 plane_resources.push_back(resource_it); |
| 362 } | 376 } |
| 363 | 377 |
| 364 if (plane_resources.size() != output_plane_count) { | 378 if (plane_resources.size() != output_plane_count) { |
| 365 // Allocation failed, nothing will be returned so restore reference counts. | 379 // Allocation failed, nothing will be returned so restore reference counts. |
| (...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 678 if (lost_resource) { | 692 if (lost_resource) { |
| 679 resource_it->ref_count = 0; | 693 resource_it->ref_count = 0; |
| 680 updater->DeleteResource(resource_it); | 694 updater->DeleteResource(resource_it); |
| 681 return; | 695 return; |
| 682 } | 696 } |
| 683 | 697 |
| 684 --resource_it->ref_count; | 698 --resource_it->ref_count; |
| 685 DCHECK_GE(resource_it->ref_count, 0); | 699 DCHECK_GE(resource_it->ref_count, 0); |
| 686 } | 700 } |
| 687 | 701 |
| 702 // static | |
| 703 void VideoResourceUpdater::InvalidateResource( | |
| 704 base::WeakPtr<VideoResourceUpdater> updater, | |
| 705 ResourceId resource_id) { | |
| 706 if (!updater.get()) { | |
| 707 return; | |
| 708 } | |
| 709 | |
| 710 const ResourceList::iterator resource_it = std::find_if( | |
| 711 updater->all_resources_.begin(), updater->all_resources_.end(), | |
| 712 [resource_id](const PlaneResource& plane_resource) { | |
| 713 return plane_resource.resource_id == resource_id; | |
| 714 }); | |
| 715 if (resource_it == updater->all_resources_.end()) | |
| 716 return; | |
| 717 | |
| 718 resource_it->ref_count = 0; | |
| 719 updater->DeleteResource(resource_it); | |
| 720 } | |
| 721 | |
| 688 } // namespace cc | 722 } // namespace cc |
| OLD | NEW |