Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(445)

Side by Side Diff: content/browser/renderer_host/media/video_capture_buffer_pool.cc

Issue 1412223009: Reland: GpuMemoryBuffer interface change: Map(**) to Map() and memory(plane); stride(plane) (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Win X64 compile fix Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698