OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "media/video/gpu_memory_buffer_video_frame_pool.h" | 5 #include "media/video/gpu_memory_buffer_video_frame_pool.h" |
6 | 6 |
7 #include <GLES2/gl2.h> | 7 #include <GLES2/gl2.h> |
8 #include <GLES2/gl2ext.h> | 8 #include <GLES2/gl2ext.h> |
9 #include <stddef.h> | 9 #include <stddef.h> |
10 #include <stdint.h> | 10 #include <stdint.h> |
11 | 11 |
12 #include <algorithm> | 12 #include <algorithm> |
13 #include <list> | 13 #include <list> |
| 14 #include <memory> |
14 #include <utility> | 15 #include <utility> |
15 | 16 |
16 #include "base/barrier_closure.h" | 17 #include "base/barrier_closure.h" |
17 #include "base/bind.h" | 18 #include "base/bind.h" |
18 #include "base/containers/stack_container.h" | 19 #include "base/containers/stack_container.h" |
19 #include "base/location.h" | 20 #include "base/location.h" |
20 #include "base/macros.h" | 21 #include "base/macros.h" |
21 #include "base/memory/linked_ptr.h" | 22 #include "base/memory/linked_ptr.h" |
22 #include "base/strings/stringprintf.h" | 23 #include "base/strings/stringprintf.h" |
23 #include "base/trace_event/memory_dump_provider.h" | 24 #include "base/trace_event/memory_dump_provider.h" |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
68 base::trace_event::ProcessMemoryDump* pmd) override; | 69 base::trace_event::ProcessMemoryDump* pmd) override; |
69 | 70 |
70 private: | 71 private: |
71 friend class base::RefCountedThreadSafe< | 72 friend class base::RefCountedThreadSafe< |
72 GpuMemoryBufferVideoFramePool::PoolImpl>; | 73 GpuMemoryBufferVideoFramePool::PoolImpl>; |
73 ~PoolImpl() override; | 74 ~PoolImpl() override; |
74 | 75 |
75 // Resource to represent a plane. | 76 // Resource to represent a plane. |
76 struct PlaneResource { | 77 struct PlaneResource { |
77 gfx::Size size; | 78 gfx::Size size; |
78 scoped_ptr<gfx::GpuMemoryBuffer> gpu_memory_buffer; | 79 std::unique_ptr<gfx::GpuMemoryBuffer> gpu_memory_buffer; |
79 unsigned texture_id = 0u; | 80 unsigned texture_id = 0u; |
80 unsigned image_id = 0u; | 81 unsigned image_id = 0u; |
81 gpu::Mailbox mailbox; | 82 gpu::Mailbox mailbox; |
82 }; | 83 }; |
83 | 84 |
84 // All the resources needed to compose a frame. | 85 // All the resources needed to compose a frame. |
85 struct FrameResources { | 86 struct FrameResources { |
86 explicit FrameResources(const gfx::Size& size) : size(size) {} | 87 explicit FrameResources(const gfx::Size& size) : size(size) {} |
87 void SetIsInUse(bool in_use) { in_use_ = in_use; } | 88 void SetIsInUse(bool in_use) { in_use_ = in_use; } |
88 bool IsInUse() const { | 89 bool IsInUse() const { |
(...skipping 444 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
533 } | 534 } |
534 } | 535 } |
535 } | 536 } |
536 } | 537 } |
537 | 538 |
538 void GpuMemoryBufferVideoFramePool::PoolImpl:: | 539 void GpuMemoryBufferVideoFramePool::PoolImpl:: |
539 BindAndCreateMailboxesHardwareFrameResources( | 540 BindAndCreateMailboxesHardwareFrameResources( |
540 const scoped_refptr<VideoFrame>& video_frame, | 541 const scoped_refptr<VideoFrame>& video_frame, |
541 FrameResources* frame_resources, | 542 FrameResources* frame_resources, |
542 const FrameReadyCB& frame_ready_cb) { | 543 const FrameReadyCB& frame_ready_cb) { |
543 scoped_ptr<GpuVideoAcceleratorFactories::ScopedGLContextLock> lock( | 544 std::unique_ptr<GpuVideoAcceleratorFactories::ScopedGLContextLock> lock( |
544 gpu_factories_->GetGLContextLock()); | 545 gpu_factories_->GetGLContextLock()); |
545 if (!lock) { | 546 if (!lock) { |
546 frame_ready_cb.Run(video_frame); | 547 frame_ready_cb.Run(video_frame); |
547 return; | 548 return; |
548 } | 549 } |
549 gpu::gles2::GLES2Interface* gles2 = lock->ContextGL(); | 550 gpu::gles2::GLES2Interface* gles2 = lock->ContextGL(); |
550 | 551 |
551 const size_t num_planes = VideoFrame::NumPlanes(output_format_); | 552 const size_t num_planes = VideoFrame::NumPlanes(output_format_); |
552 const size_t planes_per_copy = PlanesPerCopy(output_format_); | 553 const size_t planes_per_copy = PlanesPerCopy(output_format_); |
553 const gfx::Size coded_size = CodedSize(video_frame, output_format_); | 554 const gfx::Size coded_size = CodedSize(video_frame, output_format_); |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
670 resources_pool_.erase(it++); | 671 resources_pool_.erase(it++); |
671 DeleteFrameResources(gpu_factories_, frame_resources); | 672 DeleteFrameResources(gpu_factories_, frame_resources); |
672 delete frame_resources; | 673 delete frame_resources; |
673 } | 674 } |
674 } else { | 675 } else { |
675 it++; | 676 it++; |
676 } | 677 } |
677 } | 678 } |
678 | 679 |
679 // Create the resources. | 680 // Create the resources. |
680 scoped_ptr<GpuVideoAcceleratorFactories::ScopedGLContextLock> lock( | 681 std::unique_ptr<GpuVideoAcceleratorFactories::ScopedGLContextLock> lock( |
681 gpu_factories_->GetGLContextLock()); | 682 gpu_factories_->GetGLContextLock()); |
682 if (!lock) | 683 if (!lock) |
683 return nullptr; | 684 return nullptr; |
684 | 685 |
685 gpu::gles2::GLES2Interface* gles2 = lock->ContextGL(); | 686 gpu::gles2::GLES2Interface* gles2 = lock->ContextGL(); |
686 gles2->ActiveTexture(GL_TEXTURE0); | 687 gles2->ActiveTexture(GL_TEXTURE0); |
687 size_t num_planes = VideoFrame::NumPlanes(format); | 688 size_t num_planes = VideoFrame::NumPlanes(format); |
688 FrameResources* frame_resources = new FrameResources(size); | 689 FrameResources* frame_resources = new FrameResources(size); |
689 resources_pool_.push_back(frame_resources); | 690 resources_pool_.push_back(frame_resources); |
690 for (size_t i = 0; i < num_planes; i += PlanesPerCopy(format)) { | 691 for (size_t i = 0; i < num_planes; i += PlanesPerCopy(format)) { |
(...skipping 21 matching lines...) Expand all Loading... |
712 } | 713 } |
713 | 714 |
714 // static | 715 // static |
715 void GpuMemoryBufferVideoFramePool::PoolImpl::DeleteFrameResources( | 716 void GpuMemoryBufferVideoFramePool::PoolImpl::DeleteFrameResources( |
716 GpuVideoAcceleratorFactories* gpu_factories, | 717 GpuVideoAcceleratorFactories* gpu_factories, |
717 FrameResources* frame_resources) { | 718 FrameResources* frame_resources) { |
718 // TODO(dcastagna): As soon as the context lost is dealt with in media, | 719 // TODO(dcastagna): As soon as the context lost is dealt with in media, |
719 // make sure that we won't execute this callback (use a weak pointer to | 720 // make sure that we won't execute this callback (use a weak pointer to |
720 // the old context). | 721 // the old context). |
721 | 722 |
722 scoped_ptr<GpuVideoAcceleratorFactories::ScopedGLContextLock> lock( | 723 std::unique_ptr<GpuVideoAcceleratorFactories::ScopedGLContextLock> lock( |
723 gpu_factories->GetGLContextLock()); | 724 gpu_factories->GetGLContextLock()); |
724 if (!lock) | 725 if (!lock) |
725 return; | 726 return; |
726 gpu::gles2::GLES2Interface* gles2 = lock->ContextGL(); | 727 gpu::gles2::GLES2Interface* gles2 = lock->ContextGL(); |
727 | 728 |
728 for (PlaneResource& plane_resource : frame_resources->plane_resources) { | 729 for (PlaneResource& plane_resource : frame_resources->plane_resources) { |
729 if (plane_resource.image_id) | 730 if (plane_resource.image_id) |
730 gles2->DestroyImageCHROMIUM(plane_resource.image_id); | 731 gles2->DestroyImageCHROMIUM(plane_resource.image_id); |
731 if (plane_resource.texture_id) | 732 if (plane_resource.texture_id) |
732 gles2->DeleteTextures(1, &plane_resource.texture_id); | 733 gles2->DeleteTextures(1, &plane_resource.texture_id); |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
767 } | 768 } |
768 | 769 |
769 void GpuMemoryBufferVideoFramePool::MaybeCreateHardwareFrame( | 770 void GpuMemoryBufferVideoFramePool::MaybeCreateHardwareFrame( |
770 const scoped_refptr<VideoFrame>& video_frame, | 771 const scoped_refptr<VideoFrame>& video_frame, |
771 const FrameReadyCB& frame_ready_cb) { | 772 const FrameReadyCB& frame_ready_cb) { |
772 DCHECK(video_frame); | 773 DCHECK(video_frame); |
773 pool_impl_->CreateHardwareFrame(video_frame, frame_ready_cb); | 774 pool_impl_->CreateHardwareFrame(video_frame, frame_ready_cb); |
774 } | 775 } |
775 | 776 |
776 } // namespace media | 777 } // namespace media |
OLD | NEW |