OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 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 "content/browser/renderer_host/media/video_capture_buffer_pool.h" | 5 #include "content/browser/renderer_host/media/video_capture_buffer_pool.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
9 #include "base/memory/scoped_vector.h" | 9 #include "base/memory/scoped_vector.h" |
10 #include "base/stl_util.h" | 10 #include "base/stl_util.h" |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
61 #if defined(OS_POSIX) | 61 #if defined(OS_POSIX) |
62 const base::SharedMemoryHandle handle_; | 62 const base::SharedMemoryHandle handle_; |
63 #endif | 63 #endif |
64 }; | 64 }; |
65 | 65 |
66 // A holder of a GpuMemoryBuffer-backed buffer. Holds weak references to | 66 // A holder of a GpuMemoryBuffer-backed buffer. Holds weak references to |
67 // GpuMemoryBuffer-backed buffers and provides accessors to their data. | 67 // GpuMemoryBuffer-backed buffers and provides accessors to their data. |
68 class GpuMemoryBufferBufferHandle final | 68 class GpuMemoryBufferBufferHandle final |
69 : public VideoCaptureBufferPool::BufferHandle { | 69 : public VideoCaptureBufferPool::BufferHandle { |
70 public: | 70 public: |
71 GpuMemoryBufferBufferHandle(std::vector<void*>* data, | 71 GpuMemoryBufferBufferHandle(const std::vector<void*>& data, |
72 const gfx::Size& dimensions, | 72 const gfx::Size& dimensions, |
73 ScopedVector<gfx::GpuMemoryBuffer>* gmbs) | 73 ScopedVector<gfx::GpuMemoryBuffer>* gmbs) |
74 : data_(data), dimensions_(dimensions), gmbs_(gmbs) { | 74 : data_(data), dimensions_(dimensions), gmbs_(gmbs) { |
75 #ifndef NDEBUG | 75 #ifndef NDEBUG |
76 DCHECK_EQ(data->size(), gmbs->size()); | 76 DCHECK_EQ(data.size(), gmbs->size()); |
77 for (const auto& gmb : *gmbs) | 77 for (const auto& gmb : *gmbs) |
78 DCHECK(gmb); | 78 DCHECK(gmb); |
79 for (const auto& data_ptr : *data) | 79 for (const auto& data_ptr : data) |
80 DCHECK(data_ptr); | 80 DCHECK(data_ptr); |
81 #endif | 81 #endif |
82 } | 82 } |
83 ~GpuMemoryBufferBufferHandle() override {} | 83 ~GpuMemoryBufferBufferHandle() override {} |
84 | 84 |
85 gfx::Size dimensions() const override { return dimensions_; } | 85 gfx::Size dimensions() const override { return dimensions_; } |
86 size_t mapped_size() const override { return dimensions_.GetArea(); } | 86 size_t mapped_size() const override { return dimensions_.GetArea(); } |
87 void* data(int plane) override { | 87 void* data(int plane) override { |
88 DCHECK_GE(plane, media::VideoFrame::kYPlane); | 88 DCHECK_GE(plane, media::VideoFrame::kYPlane); |
89 DCHECK_LT(plane, static_cast<int>(data_->size())); | 89 DCHECK_LT(plane, static_cast<int>(data_.size())); |
90 return data_->at(plane); | 90 return data_.at(plane); |
91 } | 91 } |
92 ClientBuffer AsClientBuffer(int plane) override { | 92 ClientBuffer AsClientBuffer(int plane) override { |
93 DCHECK_GE(plane, media::VideoFrame::kYPlane); | 93 DCHECK_GE(plane, media::VideoFrame::kYPlane); |
94 DCHECK_LT(plane, static_cast<int>(gmbs_->size())); | 94 DCHECK_LT(plane, static_cast<int>(gmbs_->size())); |
95 return (*gmbs_)[plane]->AsClientBuffer(); | 95 return (*gmbs_)[plane]->AsClientBuffer(); |
96 } | 96 } |
97 #if defined(OS_POSIX) | 97 #if defined(OS_POSIX) |
98 base::FileDescriptor AsPlatformFile() override { | 98 base::FileDescriptor AsPlatformFile() override { |
99 NOTREACHED(); | 99 NOTREACHED(); |
100 return base::FileDescriptor(); | 100 return base::FileDescriptor(); |
101 } | 101 } |
102 #endif | 102 #endif |
103 | 103 |
104 private: | 104 private: |
105 std::vector<void*>* data_; | 105 const std::vector<void*> data_; |
106 const gfx::Size dimensions_; | 106 const gfx::Size dimensions_; |
107 ScopedVector<gfx::GpuMemoryBuffer>* const gmbs_; | 107 ScopedVector<gfx::GpuMemoryBuffer>* const gmbs_; |
108 }; | 108 }; |
109 | 109 |
110 // Tracker specifics for SharedMemory. | 110 // Tracker specifics for SharedMemory. |
111 class VideoCaptureBufferPool::SharedMemTracker final : public Tracker { | 111 class VideoCaptureBufferPool::SharedMemTracker final : public Tracker { |
112 public: | 112 public: |
113 SharedMemTracker(); | 113 SharedMemTracker(); |
114 bool Init(media::VideoPixelFormat format, | 114 bool Init(media::VideoPixelFormat format, |
115 media::VideoPixelStorage storage_type, | 115 media::VideoPixelStorage storage_type, |
(...skipping 24 matching lines...) Expand all Loading... |
140 // associated pixel dimensions. | 140 // associated pixel dimensions. |
141 class VideoCaptureBufferPool::GpuMemoryBufferTracker final : public Tracker { | 141 class VideoCaptureBufferPool::GpuMemoryBufferTracker final : public Tracker { |
142 public: | 142 public: |
143 GpuMemoryBufferTracker(); | 143 GpuMemoryBufferTracker(); |
144 bool Init(media::VideoPixelFormat format, | 144 bool Init(media::VideoPixelFormat format, |
145 media::VideoPixelStorage storage_type, | 145 media::VideoPixelStorage storage_type, |
146 const gfx::Size& dimensions) override; | 146 const gfx::Size& dimensions) override; |
147 ~GpuMemoryBufferTracker() override; | 147 ~GpuMemoryBufferTracker() override; |
148 | 148 |
149 scoped_ptr<BufferHandle> GetBufferHandle() override { | 149 scoped_ptr<BufferHandle> GetBufferHandle() override { |
| 150 std::vector<void*> data; |
| 151 DCHECK_EQ(gpu_memory_buffers_.size(), |
| 152 media::VideoFrame::NumPlanes(pixel_format())); |
| 153 for (const auto& gmb : gpu_memory_buffers_) |
| 154 data.push_back(gmb->memory(0)); |
150 return make_scoped_ptr(new GpuMemoryBufferBufferHandle( | 155 return make_scoped_ptr(new GpuMemoryBufferBufferHandle( |
151 &data_, dimensions_, &gpu_memory_buffers_)); | 156 data, dimensions_, &gpu_memory_buffers_)); |
152 } | 157 } |
153 bool ShareToProcess(base::ProcessHandle process_handle, | 158 bool ShareToProcess(base::ProcessHandle process_handle, |
154 base::SharedMemoryHandle* new_handle) override { | 159 base::SharedMemoryHandle* new_handle) override { |
155 NOTREACHED(); | 160 NOTREACHED(); |
156 return false; | 161 return false; |
157 } | 162 } |
158 bool ShareToProcess2(int plane, | 163 bool ShareToProcess2(int plane, |
159 base::ProcessHandle process_handle, | 164 base::ProcessHandle process_handle, |
160 gfx::GpuMemoryBufferHandle* new_handle) override; | 165 gfx::GpuMemoryBufferHandle* new_handle) override; |
161 | 166 |
162 private: | 167 private: |
163 std::vector<void*> data_; | |
164 gfx::Size dimensions_; | 168 gfx::Size dimensions_; |
165 // Owned references to GpuMemoryBuffers. | 169 // Owned references to GpuMemoryBuffers. |
166 ScopedVector<gfx::GpuMemoryBuffer> gpu_memory_buffers_; | 170 ScopedVector<gfx::GpuMemoryBuffer> gpu_memory_buffers_; |
167 }; | 171 }; |
168 | 172 |
169 VideoCaptureBufferPool::SharedMemTracker::SharedMemTracker() : Tracker() {} | 173 VideoCaptureBufferPool::SharedMemTracker::SharedMemTracker() : Tracker() {} |
170 | 174 |
171 bool VideoCaptureBufferPool::SharedMemTracker::Init( | 175 bool VideoCaptureBufferPool::SharedMemTracker::Init( |
172 media::VideoPixelFormat format, | 176 media::VideoPixelFormat format, |
173 media::VideoPixelStorage storage_type, | 177 media::VideoPixelStorage storage_type, |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
206 // point. | 210 // point. |
207 DCHECK_EQ(format, media::PIXEL_FORMAT_I420); | 211 DCHECK_EQ(format, media::PIXEL_FORMAT_I420); |
208 set_pixel_format(format); | 212 set_pixel_format(format); |
209 set_storage_type(storage_type); | 213 set_storage_type(storage_type); |
210 set_pixel_count(dimensions.GetArea()); | 214 set_pixel_count(dimensions.GetArea()); |
211 // |dimensions| can be 0x0 for trackers that do not require memory backing. | 215 // |dimensions| can be 0x0 for trackers that do not require memory backing. |
212 if (dimensions.GetArea() == 0u) | 216 if (dimensions.GetArea() == 0u) |
213 return true; | 217 return true; |
214 dimensions_ = dimensions; | 218 dimensions_ = dimensions; |
215 | 219 |
216 const media::VideoPixelFormat video_format = media::PIXEL_FORMAT_I420; | 220 const size_t num_planes = media::VideoFrame::NumPlanes(pixel_format()); |
217 const size_t num_planes = media::VideoFrame::NumPlanes(video_format); | |
218 for (size_t i = 0; i < num_planes; ++i) { | 221 for (size_t i = 0; i < num_planes; ++i) { |
219 const gfx::Size& size = | 222 const gfx::Size& size = |
220 media::VideoFrame::PlaneSize(video_format, i, dimensions); | 223 media::VideoFrame::PlaneSize(pixel_format(), i, dimensions); |
221 gpu_memory_buffers_.push_back( | 224 gpu_memory_buffers_.push_back( |
222 BrowserGpuMemoryBufferManager::current()->AllocateGpuMemoryBuffer( | 225 BrowserGpuMemoryBufferManager::current()->AllocateGpuMemoryBuffer( |
223 size, | 226 size, |
224 gfx::BufferFormat::R_8, | 227 gfx::BufferFormat::R_8, |
225 gfx::BufferUsage::MAP)); | 228 gfx::BufferUsage::MAP)); |
226 | 229 |
227 DLOG_IF(ERROR, !gpu_memory_buffers_[i]) << "Allocating GpuMemoryBuffer"; | 230 DLOG_IF(ERROR, !gpu_memory_buffers_[i]) << "Allocating GpuMemoryBuffer"; |
228 if (!gpu_memory_buffers_[i]) | 231 if (!gpu_memory_buffers_[i] || !gpu_memory_buffers_[i]->Map()) |
229 return false; | 232 return false; |
230 | |
231 void* temp_data = nullptr; | |
232 gpu_memory_buffers_[i]->Map(&temp_data); | |
233 DCHECK(temp_data); | |
234 data_.push_back(temp_data); | |
235 } | 233 } |
236 return true; | 234 return true; |
237 } | 235 } |
238 | 236 |
239 bool VideoCaptureBufferPool::GpuMemoryBufferTracker::ShareToProcess2( | 237 bool VideoCaptureBufferPool::GpuMemoryBufferTracker::ShareToProcess2( |
240 int plane, | 238 int plane, |
241 base::ProcessHandle process_handle, | 239 base::ProcessHandle process_handle, |
242 gfx::GpuMemoryBufferHandle* new_handle) { | 240 gfx::GpuMemoryBufferHandle* new_handle) { |
243 DCHECK_LE(plane, static_cast<int>(gpu_memory_buffers_.size())); | 241 DCHECK_LE(plane, static_cast<int>(gpu_memory_buffers_.size())); |
244 | 242 |
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
460 return buffer_id; | 458 return buffer_id; |
461 } | 459 } |
462 | 460 |
463 VideoCaptureBufferPool::Tracker* VideoCaptureBufferPool::GetTracker( | 461 VideoCaptureBufferPool::Tracker* VideoCaptureBufferPool::GetTracker( |
464 int buffer_id) { | 462 int buffer_id) { |
465 TrackerMap::const_iterator it = trackers_.find(buffer_id); | 463 TrackerMap::const_iterator it = trackers_.find(buffer_id); |
466 return (it == trackers_.end()) ? NULL : it->second; | 464 return (it == trackers_.end()) ? NULL : it->second; |
467 } | 465 } |
468 | 466 |
469 } // namespace content | 467 } // namespace content |
OLD | NEW |