OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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_controller.h" | 5 #include "content/browser/renderer_host/media/video_capture_controller.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 | 9 |
10 #include <map> | 10 #include <map> |
11 #include <set> | 11 #include <set> |
12 | 12 |
13 #include "base/bind.h" | 13 #include "base/bind.h" |
14 #include "base/command_line.h" | 14 #include "base/command_line.h" |
15 #include "base/memory/ptr_util.h" | 15 #include "base/memory/ptr_util.h" |
16 #include "base/metrics/histogram_macros.h" | 16 #include "base/metrics/histogram_macros.h" |
17 #include "base/metrics/sparse_histogram.h" | 17 #include "base/metrics/sparse_histogram.h" |
18 #include "build/build_config.h" | 18 #include "build/build_config.h" |
19 #include "components/display_compositor/gl_helper.h" | 19 #include "components/display_compositor/gl_helper.h" |
20 #include "content/browser/renderer_host/media/media_stream_manager.h" | 20 #include "content/browser/renderer_host/media/media_stream_manager.h" |
| 21 #include "content/browser/renderer_host/media/video_capture_gpu_jpeg_decoder.h" |
21 #include "content/browser/renderer_host/media/video_capture_manager.h" | 22 #include "content/browser/renderer_host/media/video_capture_manager.h" |
22 #include "content/public/browser/browser_thread.h" | 23 #include "content/public/browser/browser_thread.h" |
23 #include "content/public/common/content_switches.h" | 24 #include "content/public/common/content_switches.h" |
24 #include "media/base/video_frame.h" | 25 #include "media/base/video_frame.h" |
25 #include "media/capture/video/video_capture_buffer_pool.h" | 26 #include "media/capture/video/video_capture_buffer_pool_impl.h" |
26 #include "media/capture/video/video_capture_buffer_tracker_factory_impl.h" | 27 #include "media/capture/video/video_capture_buffer_tracker_factory_impl.h" |
27 #include "media/capture/video/video_capture_device_client.h" | 28 #include "media/capture/video/video_capture_device_client.h" |
28 | 29 |
29 #if !defined(OS_ANDROID) | 30 #if !defined(OS_ANDROID) |
30 #include "content/browser/compositor/image_transport_factory.h" | 31 #include "content/browser/compositor/image_transport_factory.h" |
31 #endif | 32 #endif |
32 | 33 |
33 using media::VideoCaptureFormat; | 34 using media::VideoCaptureFormat; |
34 using media::VideoFrame; | 35 using media::VideoFrame; |
35 using media::VideoFrameMetadata; | 36 using media::VideoFrameMetadata; |
36 | 37 |
37 namespace content { | 38 namespace content { |
38 | 39 |
39 namespace { | 40 namespace { |
40 | 41 |
41 static const int kInfiniteRatio = 99999; | 42 static const int kInfiniteRatio = 99999; |
42 | 43 |
43 #define UMA_HISTOGRAM_ASPECT_RATIO(name, width, height) \ | 44 #define UMA_HISTOGRAM_ASPECT_RATIO(name, width, height) \ |
44 UMA_HISTOGRAM_SPARSE_SLOWLY( \ | 45 UMA_HISTOGRAM_SPARSE_SLOWLY( \ |
45 name, \ | 46 name, \ |
46 (height) ? ((width) * 100) / (height) : kInfiniteRatio); | 47 (height) ? ((width) * 100) / (height) : kInfiniteRatio); |
47 | 48 |
| 49 std::unique_ptr<media::VideoCaptureJpegDecoder> CreateGpuJpegDecoder( |
| 50 const media::VideoCaptureJpegDecoder::DecodeDoneCB& decode_done_cb) { |
| 51 return base::MakeUnique<VideoCaptureGpuJpegDecoder>(decode_done_cb); |
| 52 } |
| 53 |
| 54 // Decorator for media::VideoFrameReceiver that forwards all incoming calls |
| 55 // to the Browser IO thread. |
| 56 class VideoFrameReceiverOnIOThread : public media::VideoFrameReceiver { |
| 57 public: |
| 58 explicit VideoFrameReceiverOnIOThread( |
| 59 const base::WeakPtr<VideoFrameReceiver>& receiver) |
| 60 : receiver_(receiver) {} |
| 61 |
| 62 void OnIncomingCapturedVideoFrame( |
| 63 std::unique_ptr<media::VideoCaptureDevice::Client::Buffer> buffer, |
| 64 scoped_refptr<media::VideoFrame> frame) override { |
| 65 BrowserThread::PostTask( |
| 66 BrowserThread::IO, FROM_HERE, |
| 67 base::Bind(&VideoFrameReceiver::OnIncomingCapturedVideoFrame, receiver_, |
| 68 base::Passed(&buffer), std::move(frame))); |
| 69 } |
| 70 |
| 71 void OnError() override { |
| 72 BrowserThread::PostTask( |
| 73 BrowserThread::IO, FROM_HERE, |
| 74 base::Bind(&VideoFrameReceiver::OnError, receiver_)); |
| 75 } |
| 76 |
| 77 void OnLog(const std::string& message) override { |
| 78 BrowserThread::PostTask( |
| 79 BrowserThread::IO, FROM_HERE, |
| 80 base::Bind(&VideoFrameReceiver::OnLog, receiver_, message)); |
| 81 } |
| 82 |
| 83 void OnBufferDestroyed(int buffer_id_to_drop) override { |
| 84 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
| 85 base::Bind(&VideoFrameReceiver::OnBufferDestroyed, |
| 86 receiver_, buffer_id_to_drop)); |
| 87 } |
| 88 |
| 89 private: |
| 90 base::WeakPtr<VideoFrameReceiver> receiver_; |
| 91 }; |
| 92 |
48 } // anonymous namespace | 93 } // anonymous namespace |
49 | 94 |
50 struct VideoCaptureController::ControllerClient { | 95 struct VideoCaptureController::ControllerClient { |
51 ControllerClient(VideoCaptureControllerID id, | 96 ControllerClient(VideoCaptureControllerID id, |
52 VideoCaptureControllerEventHandler* handler, | 97 VideoCaptureControllerEventHandler* handler, |
53 media::VideoCaptureSessionId session_id, | 98 media::VideoCaptureSessionId session_id, |
54 const media::VideoCaptureParams& params) | 99 const media::VideoCaptureParams& params) |
55 : controller_id(id), | 100 : controller_id(id), |
56 event_handler(handler), | 101 event_handler(handler), |
57 session_id(session_id), | 102 session_id(session_id), |
(...skipping 30 matching lines...) Expand all Loading... |
88 | 133 |
89 // Indicates whether the client is paused, if true, VideoCaptureController | 134 // Indicates whether the client is paused, if true, VideoCaptureController |
90 // stops updating its buffer. | 135 // stops updating its buffer. |
91 bool paused; | 136 bool paused; |
92 }; | 137 }; |
93 | 138 |
94 VideoCaptureController::BufferState::BufferState( | 139 VideoCaptureController::BufferState::BufferState( |
95 int buffer_id, | 140 int buffer_id, |
96 int frame_feedback_id, | 141 int frame_feedback_id, |
97 media::VideoFrameConsumerFeedbackObserver* consumer_feedback_observer, | 142 media::VideoFrameConsumerFeedbackObserver* consumer_feedback_observer, |
98 media::FrameBufferPool* frame_buffer_pool, | 143 scoped_refptr<media::VideoCaptureBufferPool> buffer_pool, |
99 scoped_refptr<media::VideoFrame> frame) | 144 scoped_refptr<media::VideoFrame> frame) |
100 : buffer_id_(buffer_id), | 145 : buffer_id_(buffer_id), |
101 frame_feedback_id_(frame_feedback_id), | 146 frame_feedback_id_(frame_feedback_id), |
102 consumer_feedback_observer_(consumer_feedback_observer), | 147 consumer_feedback_observer_(consumer_feedback_observer), |
103 frame_buffer_pool_(frame_buffer_pool), | 148 buffer_pool_(std::move(buffer_pool)), |
104 frame_(std::move(frame)), | 149 frame_(std::move(frame)), |
105 max_consumer_utilization_( | 150 max_consumer_utilization_( |
106 media::VideoFrameConsumerFeedbackObserver::kNoUtilizationRecorded), | 151 media::VideoFrameConsumerFeedbackObserver::kNoUtilizationRecorded), |
107 consumer_hold_count_(0) {} | 152 consumer_hold_count_(0) {} |
108 | 153 |
109 VideoCaptureController::BufferState::~BufferState() = default; | 154 VideoCaptureController::BufferState::~BufferState() = default; |
110 | 155 |
111 VideoCaptureController::BufferState::BufferState( | 156 VideoCaptureController::BufferState::BufferState( |
112 const VideoCaptureController::BufferState& other) = default; | 157 const VideoCaptureController::BufferState& other) = default; |
113 | 158 |
114 void VideoCaptureController::BufferState::RecordConsumerUtilization( | 159 void VideoCaptureController::BufferState::RecordConsumerUtilization( |
115 double utilization) { | 160 double utilization) { |
116 if (std::isfinite(utilization) && utilization >= 0.0) { | 161 if (std::isfinite(utilization) && utilization >= 0.0) { |
117 max_consumer_utilization_ = | 162 max_consumer_utilization_ = |
118 std::max(max_consumer_utilization_, utilization); | 163 std::max(max_consumer_utilization_, utilization); |
119 } | 164 } |
120 } | 165 } |
121 | 166 |
122 void VideoCaptureController::BufferState::IncreaseConsumerCount() { | 167 void VideoCaptureController::BufferState::IncreaseConsumerCount() { |
123 if (consumer_hold_count_ == 0) | 168 if (consumer_hold_count_ == 0) |
124 if (frame_buffer_pool_ != nullptr) | 169 buffer_pool_->HoldForConsumers(buffer_id_, 1); |
125 frame_buffer_pool_->SetBufferHold(buffer_id_); | |
126 consumer_hold_count_++; | 170 consumer_hold_count_++; |
127 } | 171 } |
128 | 172 |
129 void VideoCaptureController::BufferState::DecreaseConsumerCount() { | 173 void VideoCaptureController::BufferState::DecreaseConsumerCount() { |
130 consumer_hold_count_--; | 174 consumer_hold_count_--; |
131 if (consumer_hold_count_ == 0) { | 175 if (consumer_hold_count_ == 0) { |
132 if (consumer_feedback_observer_ != nullptr && | 176 if (consumer_feedback_observer_ != nullptr && |
133 max_consumer_utilization_ != | 177 max_consumer_utilization_ != |
134 media::VideoFrameConsumerFeedbackObserver::kNoUtilizationRecorded) { | 178 media::VideoFrameConsumerFeedbackObserver::kNoUtilizationRecorded) { |
135 consumer_feedback_observer_->OnUtilizationReport( | 179 consumer_feedback_observer_->OnUtilizationReport( |
136 frame_feedback_id_, max_consumer_utilization_); | 180 frame_feedback_id_, max_consumer_utilization_); |
137 } | 181 } |
138 if (frame_buffer_pool_ != nullptr) | 182 buffer_pool_->RelinquishConsumerHold(buffer_id_, 1); |
139 frame_buffer_pool_->ReleaseBufferHold(buffer_id_); | |
140 max_consumer_utilization_ = | 183 max_consumer_utilization_ = |
141 media::VideoFrameConsumerFeedbackObserver::kNoUtilizationRecorded; | 184 media::VideoFrameConsumerFeedbackObserver::kNoUtilizationRecorded; |
142 } | 185 } |
143 } | 186 } |
144 | 187 |
145 bool VideoCaptureController::BufferState::HasZeroConsumerHoldCount() { | 188 bool VideoCaptureController::BufferState::HasZeroConsumerHoldCount() { |
146 return consumer_hold_count_ == 0; | 189 return consumer_hold_count_ == 0; |
147 } | 190 } |
148 | 191 |
149 void VideoCaptureController::BufferState::SetConsumerFeedbackObserver( | 192 void VideoCaptureController::BufferState::SetConsumerFeedbackObserver( |
150 media::VideoFrameConsumerFeedbackObserver* consumer_feedback_observer) { | 193 media::VideoFrameConsumerFeedbackObserver* consumer_feedback_observer) { |
151 consumer_feedback_observer_ = consumer_feedback_observer; | 194 consumer_feedback_observer_ = consumer_feedback_observer; |
152 } | 195 } |
153 | 196 |
154 void VideoCaptureController::BufferState::SetFrameBufferPool( | 197 VideoCaptureController::VideoCaptureController(int max_buffers) |
155 media::FrameBufferPool* frame_buffer_pool) { | 198 : buffer_pool_(new media::VideoCaptureBufferPoolImpl( |
156 frame_buffer_pool_ = frame_buffer_pool; | 199 base::MakeUnique<media::VideoCaptureBufferTrackerFactoryImpl>(), |
157 } | 200 max_buffers)), |
158 | |
159 VideoCaptureController::VideoCaptureController() | |
160 : frame_buffer_pool_(nullptr), | |
161 consumer_feedback_observer_(nullptr), | 201 consumer_feedback_observer_(nullptr), |
162 state_(VIDEO_CAPTURE_STATE_STARTED), | 202 state_(VIDEO_CAPTURE_STATE_STARTED), |
163 has_received_frames_(false), | 203 has_received_frames_(false), |
164 weak_ptr_factory_(this) { | 204 weak_ptr_factory_(this) { |
165 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 205 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
166 } | 206 } |
167 | 207 |
168 VideoCaptureController::~VideoCaptureController() = default; | |
169 | |
170 base::WeakPtr<VideoCaptureController> | 208 base::WeakPtr<VideoCaptureController> |
171 VideoCaptureController::GetWeakPtrForIOThread() { | 209 VideoCaptureController::GetWeakPtrForIOThread() { |
172 return weak_ptr_factory_.GetWeakPtr(); | 210 return weak_ptr_factory_.GetWeakPtr(); |
173 } | 211 } |
174 | 212 |
175 void VideoCaptureController::SetFrameBufferPool( | |
176 std::unique_ptr<media::FrameBufferPool> frame_buffer_pool) { | |
177 DCHECK_CURRENTLY_ON(BrowserThread::IO); | |
178 frame_buffer_pool_ = std::move(frame_buffer_pool); | |
179 // Update existing BufferState entries. | |
180 for (auto& entry : buffer_id_to_state_map_) | |
181 entry.second.SetFrameBufferPool(frame_buffer_pool_.get()); | |
182 } | |
183 | |
184 void VideoCaptureController::SetConsumerFeedbackObserver( | 213 void VideoCaptureController::SetConsumerFeedbackObserver( |
185 std::unique_ptr<media::VideoFrameConsumerFeedbackObserver> | 214 std::unique_ptr<media::VideoFrameConsumerFeedbackObserver> |
186 consumer_feedback_observer) { | 215 consumer_feedback_observer) { |
187 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 216 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
188 consumer_feedback_observer_ = std::move(consumer_feedback_observer); | 217 consumer_feedback_observer_ = std::move(consumer_feedback_observer); |
189 // Update existing BufferState entries. | 218 // Update existing BufferState entries. |
190 for (auto& entry : buffer_id_to_state_map_) | 219 for (auto& entry : buffer_id_to_state_map_) |
191 entry.second.SetConsumerFeedbackObserver(consumer_feedback_observer_.get()); | 220 entry.second.SetConsumerFeedbackObserver(consumer_feedback_observer_.get()); |
192 } | 221 } |
193 | 222 |
| 223 std::unique_ptr<media::VideoCaptureDevice::Client> |
| 224 VideoCaptureController::NewDeviceClient() { |
| 225 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 226 return base::MakeUnique<media::VideoCaptureDeviceClient>( |
| 227 base::MakeUnique<VideoFrameReceiverOnIOThread>( |
| 228 this->GetWeakPtrForIOThread()), |
| 229 buffer_pool_, |
| 230 base::Bind(&CreateGpuJpegDecoder, |
| 231 base::Bind(&VideoFrameReceiver::OnIncomingCapturedVideoFrame, |
| 232 this->GetWeakPtrForIOThread()))); |
| 233 } |
| 234 |
194 void VideoCaptureController::AddClient( | 235 void VideoCaptureController::AddClient( |
195 VideoCaptureControllerID id, | 236 VideoCaptureControllerID id, |
196 VideoCaptureControllerEventHandler* event_handler, | 237 VideoCaptureControllerEventHandler* event_handler, |
197 media::VideoCaptureSessionId session_id, | 238 media::VideoCaptureSessionId session_id, |
198 const media::VideoCaptureParams& params) { | 239 const media::VideoCaptureParams& params) { |
199 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 240 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
200 DVLOG(1) << "VideoCaptureController::AddClient() -- id=" << id | 241 DVLOG(1) << "VideoCaptureController::AddClient() -- id=" << id |
201 << ", session_id=" << session_id | 242 << ", session_id=" << session_id |
202 << ", params.requested_format=" | 243 << ", params.requested_format=" |
203 << media::VideoCaptureFormat::ToString(params.requested_format); | 244 << media::VideoCaptureFormat::ToString(params.requested_format); |
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
362 buffer_state.DecreaseConsumerCount(); | 403 buffer_state.DecreaseConsumerCount(); |
363 client->buffers_in_use.erase(buffers_in_use_entry_iter); | 404 client->buffers_in_use.erase(buffers_in_use_entry_iter); |
364 } | 405 } |
365 | 406 |
366 const media::VideoCaptureFormat& | 407 const media::VideoCaptureFormat& |
367 VideoCaptureController::GetVideoCaptureFormat() const { | 408 VideoCaptureController::GetVideoCaptureFormat() const { |
368 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 409 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
369 return video_capture_format_; | 410 return video_capture_format_; |
370 } | 411 } |
371 | 412 |
| 413 VideoCaptureController::~VideoCaptureController() { |
| 414 } |
| 415 |
372 void VideoCaptureController::OnIncomingCapturedVideoFrame( | 416 void VideoCaptureController::OnIncomingCapturedVideoFrame( |
373 std::unique_ptr<media::VideoCaptureDevice::Client::Buffer> buffer, | 417 std::unique_ptr<media::VideoCaptureDevice::Client::Buffer> buffer, |
374 scoped_refptr<VideoFrame> frame) { | 418 scoped_refptr<VideoFrame> frame) { |
375 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 419 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
376 DCHECK(frame_buffer_pool_); | |
377 const int buffer_id = buffer->id(); | 420 const int buffer_id = buffer->id(); |
378 DCHECK_NE(buffer_id, media::VideoCaptureBufferPool::kInvalidId); | 421 DCHECK_NE(buffer_id, media::VideoCaptureBufferPool::kInvalidId); |
379 | 422 |
380 // Insert if not exists. | 423 // Insert if not exists. |
381 const auto it = | 424 const auto it = |
382 buffer_id_to_state_map_ | 425 buffer_id_to_state_map_ |
383 .insert(std::make_pair( | 426 .insert(std::make_pair( |
384 buffer_id, BufferState(buffer_id, buffer->frame_feedback_id(), | 427 buffer_id, BufferState(buffer_id, buffer->frame_feedback_id(), |
385 consumer_feedback_observer_.get(), | 428 consumer_feedback_observer_.get(), |
386 frame_buffer_pool_.get(), frame))) | 429 buffer_pool_, frame))) |
387 .first; | 430 .first; |
388 BufferState& buffer_state = it->second; | 431 BufferState& buffer_state = it->second; |
389 DCHECK(buffer_state.HasZeroConsumerHoldCount()); | 432 DCHECK(buffer_state.HasZeroConsumerHoldCount()); |
390 | 433 |
391 if (state_ == VIDEO_CAPTURE_STATE_STARTED) { | 434 if (state_ == VIDEO_CAPTURE_STATE_STARTED) { |
392 if (!frame->metadata()->HasKey(VideoFrameMetadata::FRAME_RATE)) { | 435 if (!frame->metadata()->HasKey(VideoFrameMetadata::FRAME_RATE)) { |
393 frame->metadata()->SetDouble(VideoFrameMetadata::FRAME_RATE, | 436 frame->metadata()->SetDouble(VideoFrameMetadata::FRAME_RATE, |
394 video_capture_format_.frame_rate); | 437 video_capture_format_.frame_rate); |
395 } | 438 } |
396 std::unique_ptr<base::DictionaryValue> metadata( | 439 std::unique_ptr<base::DictionaryValue> metadata( |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
470 } | 513 } |
471 } | 514 } |
472 | 515 |
473 void VideoCaptureController::OnLog(const std::string& message) { | 516 void VideoCaptureController::OnLog(const std::string& message) { |
474 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 517 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
475 MediaStreamManager::SendMessageToNativeLog("Video capture: " + message); | 518 MediaStreamManager::SendMessageToNativeLog("Video capture: " + message); |
476 } | 519 } |
477 | 520 |
478 void VideoCaptureController::OnBufferDestroyed(int buffer_id_to_drop) { | 521 void VideoCaptureController::OnBufferDestroyed(int buffer_id_to_drop) { |
479 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 522 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
480 DCHECK(frame_buffer_pool_); | |
481 | 523 |
482 for (const auto& client : controller_clients_) { | 524 for (const auto& client : controller_clients_) { |
483 if (client->session_closed) | 525 if (client->session_closed) |
484 continue; | 526 continue; |
485 | 527 |
486 auto known_buffers_entry_iter = | 528 auto known_buffers_entry_iter = |
487 std::find(std::begin(client->known_buffers), | 529 std::find(std::begin(client->known_buffers), |
488 std::end(client->known_buffers), buffer_id_to_drop); | 530 std::end(client->known_buffers), buffer_id_to_drop); |
489 if (known_buffers_entry_iter != std::end(client->known_buffers)) { | 531 if (known_buffers_entry_iter != std::end(client->known_buffers)) { |
490 client->known_buffers.erase(known_buffers_entry_iter); | 532 client->known_buffers.erase(known_buffers_entry_iter); |
491 client->event_handler->OnBufferDestroyed(client->controller_id, | 533 client->event_handler->OnBufferDestroyed(client->controller_id, |
492 buffer_id_to_drop); | 534 buffer_id_to_drop); |
493 } | 535 } |
494 } | 536 } |
495 | 537 |
496 buffer_id_to_state_map_.erase(buffer_id_to_drop); | 538 buffer_id_to_state_map_.erase(buffer_id_to_drop); |
497 } | 539 } |
498 | 540 |
499 void VideoCaptureController::DoNewBufferOnIOThread( | 541 void VideoCaptureController::DoNewBufferOnIOThread( |
500 ControllerClient* client, | 542 ControllerClient* client, |
501 media::VideoCaptureDevice::Client::Buffer* buffer, | 543 media::VideoCaptureDevice::Client::Buffer* buffer, |
502 const scoped_refptr<media::VideoFrame>& frame) { | 544 const scoped_refptr<media::VideoFrame>& frame) { |
503 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 545 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
504 DCHECK_EQ(media::VideoFrame::STORAGE_SHMEM, frame->storage_type()); | 546 DCHECK_EQ(media::VideoFrame::STORAGE_SHMEM, frame->storage_type()); |
505 | 547 |
506 const int buffer_id = buffer->id(); | 548 const int buffer_id = buffer->id(); |
507 mojo::ScopedSharedBufferHandle handle = | 549 mojo::ScopedSharedBufferHandle handle = |
508 frame_buffer_pool_->GetHandleForTransit(buffer_id); | 550 buffer_pool_->GetHandleForTransit(buffer_id); |
509 client->event_handler->OnBufferCreated(client->controller_id, | 551 client->event_handler->OnBufferCreated(client->controller_id, |
510 std::move(handle), | 552 std::move(handle), |
511 buffer->mapped_size(), buffer_id); | 553 buffer->mapped_size(), buffer_id); |
512 } | 554 } |
513 | 555 |
514 VideoCaptureController::ControllerClient* VideoCaptureController::FindClient( | 556 VideoCaptureController::ControllerClient* VideoCaptureController::FindClient( |
515 VideoCaptureControllerID id, | 557 VideoCaptureControllerID id, |
516 VideoCaptureControllerEventHandler* handler, | 558 VideoCaptureControllerEventHandler* handler, |
517 const ControllerClients& clients) { | 559 const ControllerClients& clients) { |
518 for (const auto& client : clients) { | 560 for (const auto& client : clients) { |
519 if (client->controller_id == id && client->event_handler == handler) | 561 if (client->controller_id == id && client->event_handler == handler) |
520 return client.get(); | 562 return client.get(); |
521 } | 563 } |
522 return nullptr; | 564 return nullptr; |
523 } | 565 } |
524 | 566 |
525 VideoCaptureController::ControllerClient* VideoCaptureController::FindClient( | 567 VideoCaptureController::ControllerClient* VideoCaptureController::FindClient( |
526 int session_id, | 568 int session_id, |
527 const ControllerClients& clients) { | 569 const ControllerClients& clients) { |
528 for (const auto& client : clients) { | 570 for (const auto& client : clients) { |
529 if (client->session_id == session_id) | 571 if (client->session_id == session_id) |
530 return client.get(); | 572 return client.get(); |
531 } | 573 } |
532 return nullptr; | 574 return nullptr; |
533 } | 575 } |
534 | 576 |
535 } // namespace content | 577 } // namespace content |
OLD | NEW |