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

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

Issue 1204843004: Revert of Video Capture: extract storage info from pixel format in VideoCaptureFormat. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 6 months 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/stl_util.h" 9 #include "base/stl_util.h"
10 #include "content/browser/gpu/browser_gpu_memory_buffer_manager.h" 10 #include "content/browser/gpu/browser_gpu_memory_buffer_manager.h"
11 #include "content/common/gpu/client/gpu_memory_buffer_impl.h" 11 #include "content/common/gpu/client/gpu_memory_buffer_impl.h"
12 #include "content/public/browser/browser_thread.h" 12 #include "content/public/browser/browser_thread.h"
13 #include "media/base/video_frame.h"
14
15 using media::VideoFrame;
13 16
14 namespace content { 17 namespace content {
15 18
16 const int VideoCaptureBufferPool::kInvalidId = -1; 19 const int VideoCaptureBufferPool::kInvalidId = -1;
17 20
21 VideoFrame::Format VideoPixelFormatToVideoFrameFormat(
22 media::VideoPixelFormat pixel_format) {
23 static struct {
24 media::VideoPixelFormat pixel_format;
25 VideoFrame::Format frame_format;
26 } const kVideoPixelFormatToVideoFrameFormat[] = {
27 {media::PIXEL_FORMAT_I420, VideoFrame::I420},
28 {media::PIXEL_FORMAT_TEXTURE, VideoFrame::ARGB},
29 {media::PIXEL_FORMAT_GPUMEMORYBUFFER, VideoFrame::ARGB},
30 };
31
32 for (const auto& format_pair : kVideoPixelFormatToVideoFrameFormat) {
33 if (format_pair.pixel_format == pixel_format)
34 return format_pair.frame_format;
35 }
36 LOG(ERROR) << "Unsupported VideoPixelFormat "
37 << media::VideoCaptureFormat::PixelFormatToString(pixel_format);
38 return VideoFrame::UNKNOWN;
39 }
40
41 VideoFrame::StorageType VideoPixelFormatToVideoFrameStorageType(
42 media::VideoPixelFormat pixel_format) {
43 static struct {
44 media::VideoPixelFormat pixel_format;
45 VideoFrame::StorageType storage_type;
46 } const kVideoPixelFormatToVideoFrameStorageType[] = {
47 {media::PIXEL_FORMAT_I420, VideoFrame::STORAGE_SHMEM},
48 {media::PIXEL_FORMAT_TEXTURE, VideoFrame::STORAGE_OPAQUE},
49 {media::PIXEL_FORMAT_GPUMEMORYBUFFER, VideoFrame::STORAGE_OPAQUE},
50 };
51
52 for (const auto& format_pair : kVideoPixelFormatToVideoFrameStorageType) {
53 if (format_pair.pixel_format == pixel_format)
54 return format_pair.storage_type;
55 }
56 LOG(ERROR) << "Unsupported VideoPixelFormat "
57 << media::VideoCaptureFormat::PixelFormatToString(pixel_format);
58 return VideoFrame::STORAGE_UNKNOWN;
59 }
60
18 // A simple holder of a memory-backed buffer and accesors to it. 61 // A simple holder of a memory-backed buffer and accesors to it.
19 class SimpleBufferHandle final : public VideoCaptureBufferPool::BufferHandle { 62 class SimpleBufferHandle final : public VideoCaptureBufferPool::BufferHandle {
20 public: 63 public:
21 SimpleBufferHandle(void* data, size_t size, base::SharedMemoryHandle handle) 64 SimpleBufferHandle(void* data, size_t size, base::SharedMemoryHandle handle)
22 : data_(data), size_(size), handle_(handle) {} 65 : data_(data), size_(size), handle_(handle) {}
23 ~SimpleBufferHandle() override {} 66 ~SimpleBufferHandle() override {}
24 67
25 size_t size() const override { return size_; } 68 size_t size() const override { return size_; }
26 void* data() override { return data_; } 69 void* data() override { return data_; }
27 ClientBuffer AsClientBuffer() override { return nullptr; } 70 ClientBuffer AsClientBuffer() override { return nullptr; }
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
74 private: 117 private:
75 gfx::GpuMemoryBuffer* const gmb_; 118 gfx::GpuMemoryBuffer* const gmb_;
76 scoped_ptr<void*[]> data_; 119 scoped_ptr<void*[]> data_;
77 const size_t size_; 120 const size_t size_;
78 }; 121 };
79 122
80 // Tracker specifics for SharedMemory. 123 // Tracker specifics for SharedMemory.
81 class VideoCaptureBufferPool::SharedMemTracker final : public Tracker { 124 class VideoCaptureBufferPool::SharedMemTracker final : public Tracker {
82 public: 125 public:
83 SharedMemTracker(); 126 SharedMemTracker();
84 bool Init(media::VideoPixelFormat format, 127 bool Init(VideoFrame::Format format,
85 media::VideoPixelStorage storage_type, 128 media::VideoFrame::StorageType storage_type,
86 const gfx::Size& dimensions) override; 129 const gfx::Size& dimensions) override;
87 130
88 size_t mapped_size() const override { return shared_memory_.mapped_size(); } 131 size_t mapped_size() const override { return shared_memory_.mapped_size(); }
89 132
90 scoped_ptr<BufferHandle> GetBufferHandle() override { 133 scoped_ptr<BufferHandle> GetBufferHandle() override {
91 return make_scoped_ptr(new SimpleBufferHandle( 134 return make_scoped_ptr(new SimpleBufferHandle(
92 shared_memory_.memory(), mapped_size(), shared_memory_.handle())); 135 shared_memory_.memory(), mapped_size(), shared_memory_.handle()));
93 } 136 }
94 137
95 bool ShareToProcess(base::ProcessHandle process_handle, 138 bool ShareToProcess(base::ProcessHandle process_handle,
96 base::SharedMemoryHandle* new_handle) override { 139 base::SharedMemoryHandle* new_handle) override {
97 return shared_memory_.ShareToProcess(process_handle, new_handle); 140 return shared_memory_.ShareToProcess(process_handle, new_handle);
98 } 141 }
99 142
100 private: 143 private:
101 // The memory created to be shared with renderer processes. 144 // The memory created to be shared with renderer processes.
102 base::SharedMemory shared_memory_; 145 base::SharedMemory shared_memory_;
103 }; 146 };
104 147
105 // Tracker specifics for GpuMemoryBuffer. Owns one GpuMemoryBuffer and its 148 // Tracker specifics for GpuMemoryBuffer. Owns one GpuMemoryBuffer and its
106 // associated pixel dimensions. 149 // associated pixel dimensions.
107 class VideoCaptureBufferPool::GpuMemoryBufferTracker final : public Tracker { 150 class VideoCaptureBufferPool::GpuMemoryBufferTracker final : public Tracker {
108 public: 151 public:
109 GpuMemoryBufferTracker(); 152 GpuMemoryBufferTracker();
110 bool Init(media::VideoPixelFormat format, 153 bool Init(VideoFrame::Format format,
111 media::VideoPixelStorage storage_type, 154 media::VideoFrame::StorageType storage_type,
112 const gfx::Size& dimensions) override; 155 const gfx::Size& dimensions) override;
113 ~GpuMemoryBufferTracker() override; 156 ~GpuMemoryBufferTracker() override;
114 157
115 size_t mapped_size() const override { return packed_size_; } 158 size_t mapped_size() const override { return packed_size_; }
116 scoped_ptr<BufferHandle> GetBufferHandle() override { 159 scoped_ptr<BufferHandle> GetBufferHandle() override {
117 return make_scoped_ptr(new GpuMemoryBufferBufferHandle( 160 return make_scoped_ptr(new GpuMemoryBufferBufferHandle(
118 gpu_memory_buffer_.get(), packed_size_)); 161 gpu_memory_buffer_.get(), packed_size_));
119 } 162 }
120 163
121 bool ShareToProcess(base::ProcessHandle process_handle, 164 bool ShareToProcess(base::ProcessHandle process_handle,
122 base::SharedMemoryHandle* new_handle) override { 165 base::SharedMemoryHandle* new_handle) override {
123 return true; 166 return true;
124 } 167 }
125 168
126 private: 169 private:
127 size_t packed_size_; 170 size_t packed_size_;
128 scoped_ptr<gfx::GpuMemoryBuffer> gpu_memory_buffer_; 171 scoped_ptr<gfx::GpuMemoryBuffer> gpu_memory_buffer_;
129 }; 172 };
130 173
131 VideoCaptureBufferPool::SharedMemTracker::SharedMemTracker() : Tracker() { 174 VideoCaptureBufferPool::SharedMemTracker::SharedMemTracker() : Tracker() {
132 } 175 }
133 176
134 bool VideoCaptureBufferPool::SharedMemTracker::Init( 177 bool VideoCaptureBufferPool::SharedMemTracker::Init(
135 media::VideoPixelFormat format, 178 VideoFrame::Format format,
136 media::VideoPixelStorage storage_type, 179 media::VideoFrame::StorageType storage_type,
137 const gfx::Size& dimensions) { 180 const gfx::Size& dimensions) {
138 DVLOG(2) << "allocating ShMem of " << dimensions.ToString(); 181 DVLOG(2) << "allocating ShMem of " << dimensions.ToString();
139 set_pixel_format(format); 182 set_pixel_format(format);
140 set_storage_type(storage_type); 183 set_storage_type(storage_type);
141 // |dimensions| can be 0x0 for trackers that do not require memory backing. 184 // Input |dimensions| can be 0x0 for trackers that do not require memory
185 // backing. The allocated size is calculated using VideoFrame methods since
186 // this will be the abstraction used to wrap the underlying data.
142 set_pixel_count(dimensions.GetArea()); 187 set_pixel_count(dimensions.GetArea());
143 const size_t byte_count = 188 const size_t byte_count = VideoFrame::AllocationSize(format, dimensions);
144 media::VideoCaptureFormat(dimensions, 0.0f, format, storage_type)
145 .ImageAllocationSize();
146 if (!byte_count) 189 if (!byte_count)
147 return true; 190 return true;
148 return shared_memory_.CreateAndMapAnonymous(byte_count); 191 return shared_memory_.CreateAndMapAnonymous(byte_count);
149 } 192 }
150 193
151 VideoCaptureBufferPool::GpuMemoryBufferTracker::GpuMemoryBufferTracker() 194 VideoCaptureBufferPool::GpuMemoryBufferTracker::GpuMemoryBufferTracker()
152 : Tracker(), packed_size_(0u), gpu_memory_buffer_(nullptr) {} 195 : Tracker(), gpu_memory_buffer_(nullptr) {}
153 196
154 VideoCaptureBufferPool::GpuMemoryBufferTracker::~GpuMemoryBufferTracker() { 197 VideoCaptureBufferPool::GpuMemoryBufferTracker::~GpuMemoryBufferTracker() {
155 if (gpu_memory_buffer_->IsMapped()) 198 if (gpu_memory_buffer_->IsMapped())
156 gpu_memory_buffer_->Unmap(); 199 gpu_memory_buffer_->Unmap();
157 } 200 }
158 201
159 bool VideoCaptureBufferPool::GpuMemoryBufferTracker::Init( 202 bool VideoCaptureBufferPool::GpuMemoryBufferTracker::Init(
160 media::VideoPixelFormat format, 203 VideoFrame::Format format,
161 media::VideoPixelStorage storage_type, 204 media::VideoFrame::StorageType storage_type,
162 const gfx::Size& dimensions) { 205 const gfx::Size& dimensions) {
163 DVLOG(2) << "allocating GMB for " << dimensions.ToString(); 206 DVLOG(2) << "allocating GMB for " << dimensions.ToString();
164 // BrowserGpuMemoryBufferManager::current() may not be accessed on IO Thread. 207 // BrowserGpuMemoryBufferManager::current() may not be accessed on IO Thread.
165 DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::IO)); 208 DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::IO));
166 DCHECK(BrowserGpuMemoryBufferManager::current()); 209 DCHECK(BrowserGpuMemoryBufferManager::current());
167 set_pixel_format(format); 210 set_pixel_format(format);
168 set_storage_type(storage_type); 211 set_storage_type(storage_type);
169 set_pixel_count(dimensions.GetArea()); 212 set_pixel_count(dimensions.GetArea());
170 // |dimensions| can be 0x0 for trackers that do not require memory backing.
171 if (dimensions.GetArea() == 0u)
172 return true;
173 gpu_memory_buffer_ = 213 gpu_memory_buffer_ =
174 BrowserGpuMemoryBufferManager::current()->AllocateGpuMemoryBuffer( 214 BrowserGpuMemoryBufferManager::current()->AllocateGpuMemoryBuffer(
175 dimensions, 215 dimensions,
176 gfx::GpuMemoryBuffer::BGRA_8888, 216 gfx::GpuMemoryBuffer::BGRA_8888,
177 gfx::GpuMemoryBuffer::MAP); 217 gfx::GpuMemoryBuffer::MAP);
178 DLOG_IF(ERROR, !gpu_memory_buffer_.get()) << "Allocating GpuMemoryBuffer"; 218 DLOG_IF(ERROR, !gpu_memory_buffer_.get()) << "Allocating GpuMemoryBuffer";
179 if (!gpu_memory_buffer_.get()) 219 if (!gpu_memory_buffer_.get())
180 return false; 220 return false;
181 int plane_sizes; 221 int plane_sizes;
182 gpu_memory_buffer_->GetStride(&plane_sizes); 222 gpu_memory_buffer_->GetStride(&plane_sizes);
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
233 if (!tracker) { 273 if (!tracker) {
234 NOTREACHED() << "Invalid buffer_id."; 274 NOTREACHED() << "Invalid buffer_id.";
235 return scoped_ptr<BufferHandle>(); 275 return scoped_ptr<BufferHandle>();
236 } 276 }
237 277
238 DCHECK(tracker->held_by_producer()); 278 DCHECK(tracker->held_by_producer());
239 return tracker->GetBufferHandle(); 279 return tracker->GetBufferHandle();
240 } 280 }
241 281
242 int VideoCaptureBufferPool::ReserveForProducer(media::VideoPixelFormat format, 282 int VideoCaptureBufferPool::ReserveForProducer(media::VideoPixelFormat format,
243 media::VideoPixelStorage storage,
244 const gfx::Size& dimensions, 283 const gfx::Size& dimensions,
245 int* buffer_id_to_drop) { 284 int* buffer_id_to_drop) {
246 base::AutoLock lock(lock_); 285 base::AutoLock lock(lock_);
247 return ReserveForProducerInternal(format, storage, dimensions, 286 return ReserveForProducerInternal(format, dimensions, buffer_id_to_drop);
248 buffer_id_to_drop);
249 } 287 }
250 288
251 void VideoCaptureBufferPool::RelinquishProducerReservation(int buffer_id) { 289 void VideoCaptureBufferPool::RelinquishProducerReservation(int buffer_id) {
252 base::AutoLock lock(lock_); 290 base::AutoLock lock(lock_);
253 Tracker* tracker = GetTracker(buffer_id); 291 Tracker* tracker = GetTracker(buffer_id);
254 if (!tracker) { 292 if (!tracker) {
255 NOTREACHED() << "Invalid buffer_id."; 293 NOTREACHED() << "Invalid buffer_id.";
256 return; 294 return;
257 } 295 }
258 DCHECK(tracker->held_by_producer()); 296 DCHECK(tracker->held_by_producer());
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
296 int num_buffers_held = 0; 334 int num_buffers_held = 0;
297 for (const auto& entry : trackers_) { 335 for (const auto& entry : trackers_) {
298 Tracker* const tracker = entry.second; 336 Tracker* const tracker = entry.second;
299 if (tracker->held_by_producer() || tracker->consumer_hold_count() > 0) 337 if (tracker->held_by_producer() || tracker->consumer_hold_count() > 0)
300 ++num_buffers_held; 338 ++num_buffers_held;
301 } 339 }
302 return static_cast<double>(num_buffers_held) / count_; 340 return static_cast<double>(num_buffers_held) / count_;
303 } 341 }
304 342
305 int VideoCaptureBufferPool::ReserveForProducerInternal( 343 int VideoCaptureBufferPool::ReserveForProducerInternal(
306 media::VideoPixelFormat pixel_format, 344 media::VideoPixelFormat format,
307 media::VideoPixelStorage storage_type,
308 const gfx::Size& dimensions, 345 const gfx::Size& dimensions,
309 int* buffer_id_to_drop) { 346 int* buffer_id_to_drop) {
347 DCHECK(format == media::PIXEL_FORMAT_I420 ||
348 format == media::PIXEL_FORMAT_TEXTURE ||
349 format == media::PIXEL_FORMAT_GPUMEMORYBUFFER );
310 lock_.AssertAcquired(); 350 lock_.AssertAcquired();
311 *buffer_id_to_drop = kInvalidId; 351 *buffer_id_to_drop = kInvalidId;
312 352
313 const size_t size_in_pixels = dimensions.GetArea(); 353 const size_t size_in_pixels = dimensions.GetArea();
354 const media::VideoFrame::Format pixel_format =
355 VideoPixelFormatToVideoFrameFormat(format);
356 const media::VideoFrame::StorageType storage_type =
357 VideoPixelFormatToVideoFrameStorageType(format);
314 // Look for a tracker that's allocated, big enough, and not in use. Track the 358 // Look for a tracker that's allocated, big enough, and not in use. Track the
315 // largest one that's not big enough, in case we have to reallocate a tracker. 359 // largest one that's not big enough, in case we have to reallocate a tracker.
316 *buffer_id_to_drop = kInvalidId; 360 *buffer_id_to_drop = kInvalidId;
317 size_t largest_size_in_pixels = 0; 361 size_t largest_size_in_pixels = 0;
318 TrackerMap::iterator tracker_to_drop = trackers_.end(); 362 TrackerMap::iterator tracker_to_drop = trackers_.end();
319 for (TrackerMap::iterator it = trackers_.begin(); it != trackers_.end(); 363 for (TrackerMap::iterator it = trackers_.begin(); it != trackers_.end();
320 ++it) { 364 ++it) {
321 Tracker* const tracker = it->second; 365 Tracker* const tracker = it->second;
322 if (!tracker->consumer_hold_count() && !tracker->held_by_producer()) { 366 if (!tracker->consumer_hold_count() && !tracker->held_by_producer()) {
323 if (tracker->pixel_count() >= size_in_pixels && 367 if (tracker->pixel_count() >= size_in_pixels &&
(...skipping 18 matching lines...) Expand all
342 return kInvalidId; 386 return kInvalidId;
343 } 387 }
344 *buffer_id_to_drop = tracker_to_drop->first; 388 *buffer_id_to_drop = tracker_to_drop->first;
345 delete tracker_to_drop->second; 389 delete tracker_to_drop->second;
346 trackers_.erase(tracker_to_drop); 390 trackers_.erase(tracker_to_drop);
347 } 391 }
348 392
349 // Create the new tracker. 393 // Create the new tracker.
350 const int buffer_id = next_buffer_id_++; 394 const int buffer_id = next_buffer_id_++;
351 395
352 scoped_ptr<Tracker> tracker = Tracker::CreateTracker( 396 scoped_ptr<Tracker> tracker =
353 storage_type == media::PIXEL_STORAGE_GPUMEMORYBUFFER); 397 Tracker::CreateTracker(format == media::PIXEL_FORMAT_GPUMEMORYBUFFER);
354 if (!tracker->Init(pixel_format, storage_type, dimensions)) { 398 if (!tracker->Init(pixel_format, storage_type, dimensions)) {
355 DLOG(ERROR) << "Error initializing Tracker"; 399 DLOG(ERROR) << "Error initializing Tracker";
356 return kInvalidId; 400 return kInvalidId;
357 } 401 }
358 tracker->set_held_by_producer(true); 402 tracker->set_held_by_producer(true);
359 trackers_[buffer_id] = tracker.release(); 403 trackers_[buffer_id] = tracker.release();
360 404
361 return buffer_id; 405 return buffer_id;
362 } 406 }
363 407
364 VideoCaptureBufferPool::Tracker* VideoCaptureBufferPool::GetTracker( 408 VideoCaptureBufferPool::Tracker* VideoCaptureBufferPool::GetTracker(
365 int buffer_id) { 409 int buffer_id) {
366 TrackerMap::const_iterator it = trackers_.find(buffer_id); 410 TrackerMap::const_iterator it = trackers_.find(buffer_id);
367 return (it == trackers_.end()) ? NULL : it->second; 411 return (it == trackers_.end()) ? NULL : it->second;
368 } 412 }
369 413
370 } // namespace content 414 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698