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

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

Issue 2551193002: [Mojo Video Capture] Decouple VCController from VCBufferPool and VCDeviceClient (Closed)
Patch Set: Created 4 years 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) 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"
22 #include "content/browser/renderer_host/media/video_capture_manager.h" 21 #include "content/browser/renderer_host/media/video_capture_manager.h"
23 #include "content/public/browser/browser_thread.h" 22 #include "content/public/browser/browser_thread.h"
24 #include "content/public/common/content_switches.h" 23 #include "content/public/common/content_switches.h"
25 #include "media/base/video_frame.h" 24 #include "media/base/video_frame.h"
26 #include "media/capture/video/video_capture_buffer_pool_impl.h" 25 #include "media/capture/video/video_capture_buffer_pool_impl.h"
mcasas 2016/12/06 20:02:24 Not needed anymore?
chfremer 2016/12/06 21:07:41 Good catch! Hmm, seems we still need at least vide
27 #include "media/capture/video/video_capture_buffer_tracker_factory_impl.h" 26 #include "media/capture/video/video_capture_buffer_tracker_factory_impl.h"
28 #include "media/capture/video/video_capture_device_client.h" 27 #include "media/capture/video/video_capture_device_client.h"
29 28
30 #if !defined(OS_ANDROID) 29 #if !defined(OS_ANDROID)
31 #include "content/browser/compositor/image_transport_factory.h" 30 #include "content/browser/compositor/image_transport_factory.h"
32 #endif 31 #endif
33 32
34 using media::VideoCaptureFormat; 33 using media::VideoCaptureFormat;
35 using media::VideoFrame; 34 using media::VideoFrame;
36 using media::VideoFrameMetadata; 35 using media::VideoFrameMetadata;
37 36
38 namespace content { 37 namespace content {
39 38
40 namespace { 39 namespace {
41 40
42 static const int kInfiniteRatio = 99999; 41 static const int kInfiniteRatio = 99999;
43 42
44 #define UMA_HISTOGRAM_ASPECT_RATIO(name, width, height) \ 43 #define UMA_HISTOGRAM_ASPECT_RATIO(name, width, height) \
45 UMA_HISTOGRAM_SPARSE_SLOWLY( \ 44 UMA_HISTOGRAM_SPARSE_SLOWLY( \
46 name, \ 45 name, \
47 (height) ? ((width) * 100) / (height) : kInfiniteRatio); 46 (height) ? ((width) * 100) / (height) : kInfiniteRatio);
48 47
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
93 } // anonymous namespace 48 } // anonymous namespace
94 49
95 struct VideoCaptureController::ControllerClient { 50 struct VideoCaptureController::ControllerClient {
96 ControllerClient(VideoCaptureControllerID id, 51 ControllerClient(VideoCaptureControllerID id,
97 VideoCaptureControllerEventHandler* handler, 52 VideoCaptureControllerEventHandler* handler,
98 media::VideoCaptureSessionId session_id, 53 media::VideoCaptureSessionId session_id,
99 const media::VideoCaptureParams& params) 54 const media::VideoCaptureParams& params)
100 : controller_id(id), 55 : controller_id(id),
101 event_handler(handler), 56 event_handler(handler),
102 session_id(session_id), 57 session_id(session_id),
(...skipping 30 matching lines...) Expand all
133 88
134 // Indicates whether the client is paused, if true, VideoCaptureController 89 // Indicates whether the client is paused, if true, VideoCaptureController
135 // stops updating its buffer. 90 // stops updating its buffer.
136 bool paused; 91 bool paused;
137 }; 92 };
138 93
139 VideoCaptureController::BufferState::BufferState( 94 VideoCaptureController::BufferState::BufferState(
140 int buffer_id, 95 int buffer_id,
141 int frame_feedback_id, 96 int frame_feedback_id,
142 media::VideoFrameConsumerFeedbackObserver* consumer_feedback_observer, 97 media::VideoFrameConsumerFeedbackObserver* consumer_feedback_observer,
143 scoped_refptr<media::VideoCaptureBufferPool> buffer_pool, 98 media::FrameBufferHost* frame_buffer_host,
144 scoped_refptr<media::VideoFrame> frame) 99 scoped_refptr<media::VideoFrame> frame)
145 : buffer_id_(buffer_id), 100 : buffer_id_(buffer_id),
146 frame_feedback_id_(frame_feedback_id), 101 frame_feedback_id_(frame_feedback_id),
147 consumer_feedback_observer_(consumer_feedback_observer), 102 consumer_feedback_observer_(consumer_feedback_observer),
148 buffer_pool_(std::move(buffer_pool)), 103 frame_buffer_host_(frame_buffer_host),
149 frame_(std::move(frame)), 104 frame_(std::move(frame)),
150 max_consumer_utilization_( 105 max_consumer_utilization_(
151 media::VideoFrameConsumerFeedbackObserver::kNoUtilizationRecorded), 106 media::VideoFrameConsumerFeedbackObserver::kNoUtilizationRecorded),
152 consumer_hold_count_(0) {} 107 consumer_hold_count_(0) {}
153 108
154 VideoCaptureController::BufferState::~BufferState() = default; 109 VideoCaptureController::BufferState::~BufferState() = default;
155 110
156 VideoCaptureController::BufferState::BufferState( 111 VideoCaptureController::BufferState::BufferState(
157 const VideoCaptureController::BufferState& other) = default; 112 const VideoCaptureController::BufferState& other) = default;
158 113
159 void VideoCaptureController::BufferState::RecordConsumerUtilization( 114 void VideoCaptureController::BufferState::RecordConsumerUtilization(
160 double utilization) { 115 double utilization) {
161 if (std::isfinite(utilization) && utilization >= 0.0) { 116 if (std::isfinite(utilization) && utilization >= 0.0) {
162 max_consumer_utilization_ = 117 max_consumer_utilization_ =
163 std::max(max_consumer_utilization_, utilization); 118 std::max(max_consumer_utilization_, utilization);
164 } 119 }
165 } 120 }
166 121
167 void VideoCaptureController::BufferState::IncreaseConsumerCount() { 122 void VideoCaptureController::BufferState::IncreaseConsumerCount() {
168 if (consumer_hold_count_ == 0) 123 if (consumer_hold_count_ == 0)
169 buffer_pool_->HoldForConsumers(buffer_id_, 1); 124 if (frame_buffer_host_ != nullptr)
125 frame_buffer_host_->SetBufferHold(buffer_id_);
170 consumer_hold_count_++; 126 consumer_hold_count_++;
171 } 127 }
172 128
173 void VideoCaptureController::BufferState::DecreaseConsumerCount() { 129 void VideoCaptureController::BufferState::DecreaseConsumerCount() {
174 consumer_hold_count_--; 130 consumer_hold_count_--;
175 if (consumer_hold_count_ == 0) { 131 if (consumer_hold_count_ == 0) {
176 if (consumer_feedback_observer_ != nullptr && 132 if (consumer_feedback_observer_ != nullptr &&
177 max_consumer_utilization_ != 133 max_consumer_utilization_ !=
178 media::VideoFrameConsumerFeedbackObserver::kNoUtilizationRecorded) { 134 media::VideoFrameConsumerFeedbackObserver::kNoUtilizationRecorded) {
179 consumer_feedback_observer_->OnUtilizationReport( 135 consumer_feedback_observer_->OnUtilizationReport(
180 frame_feedback_id_, max_consumer_utilization_); 136 frame_feedback_id_, max_consumer_utilization_);
181 } 137 }
182 buffer_pool_->RelinquishConsumerHold(buffer_id_, 1); 138 if (frame_buffer_host_ != nullptr)
139 frame_buffer_host_->ReleaseBufferHold(buffer_id_);
183 max_consumer_utilization_ = 140 max_consumer_utilization_ =
184 media::VideoFrameConsumerFeedbackObserver::kNoUtilizationRecorded; 141 media::VideoFrameConsumerFeedbackObserver::kNoUtilizationRecorded;
185 } 142 }
186 } 143 }
187 144
188 bool VideoCaptureController::BufferState::HasZeroConsumerHoldCount() { 145 bool VideoCaptureController::BufferState::HasZeroConsumerHoldCount() {
189 return consumer_hold_count_ == 0; 146 return consumer_hold_count_ == 0;
190 } 147 }
191 148
192 void VideoCaptureController::BufferState::SetConsumerFeedbackObserver( 149 void VideoCaptureController::BufferState::SetConsumerFeedbackObserver(
193 media::VideoFrameConsumerFeedbackObserver* consumer_feedback_observer) { 150 media::VideoFrameConsumerFeedbackObserver* consumer_feedback_observer) {
194 consumer_feedback_observer_ = consumer_feedback_observer; 151 consumer_feedback_observer_ = consumer_feedback_observer;
195 } 152 }
196 153
197 VideoCaptureController::VideoCaptureController(int max_buffers) 154 void VideoCaptureController::BufferState::SetFrameBufferHost(
198 : buffer_pool_(new media::VideoCaptureBufferPoolImpl( 155 media::FrameBufferHost* frame_buffer_host) {
199 base::MakeUnique<media::VideoCaptureBufferTrackerFactoryImpl>(), 156 frame_buffer_host_ = frame_buffer_host;
200 max_buffers)), 157 }
158
159 VideoCaptureController::VideoCaptureController()
160 : frame_buffer_host_(nullptr),
201 consumer_feedback_observer_(nullptr), 161 consumer_feedback_observer_(nullptr),
202 state_(VIDEO_CAPTURE_STATE_STARTED), 162 state_(VIDEO_CAPTURE_STATE_STARTED),
203 has_received_frames_(false), 163 has_received_frames_(false),
204 weak_ptr_factory_(this) { 164 weak_ptr_factory_(this) {
205 DCHECK_CURRENTLY_ON(BrowserThread::IO); 165 DCHECK_CURRENTLY_ON(BrowserThread::IO);
206 } 166 }
207 167
168 VideoCaptureController::~VideoCaptureController() = default;
169
208 base::WeakPtr<VideoCaptureController> 170 base::WeakPtr<VideoCaptureController>
209 VideoCaptureController::GetWeakPtrForIOThread() { 171 VideoCaptureController::GetWeakPtrForIOThread() {
210 return weak_ptr_factory_.GetWeakPtr(); 172 return weak_ptr_factory_.GetWeakPtr();
211 } 173 }
212 174
175 void VideoCaptureController::SetFrameBufferHost(
176 std::unique_ptr<media::FrameBufferHost> frame_buffer_host) {
177 DCHECK_CURRENTLY_ON(BrowserThread::IO);
178 frame_buffer_host_ = std::move(frame_buffer_host);
179 // Update existing BufferState entries.
180 for (auto& entry : buffer_id_to_state_map_)
181 entry.second.SetFrameBufferHost(frame_buffer_host_.get());
182 }
183
213 void VideoCaptureController::SetConsumerFeedbackObserver( 184 void VideoCaptureController::SetConsumerFeedbackObserver(
214 std::unique_ptr<media::VideoFrameConsumerFeedbackObserver> 185 std::unique_ptr<media::VideoFrameConsumerFeedbackObserver>
215 consumer_feedback_observer) { 186 consumer_feedback_observer) {
216 DCHECK_CURRENTLY_ON(BrowserThread::IO); 187 DCHECK_CURRENTLY_ON(BrowserThread::IO);
217 consumer_feedback_observer_ = std::move(consumer_feedback_observer); 188 consumer_feedback_observer_ = std::move(consumer_feedback_observer);
218 // Update existing BufferState entries. 189 // Update existing BufferState entries.
219 for (auto& entry : buffer_id_to_state_map_) 190 for (auto& entry : buffer_id_to_state_map_)
220 entry.second.SetConsumerFeedbackObserver(consumer_feedback_observer_.get()); 191 entry.second.SetConsumerFeedbackObserver(consumer_feedback_observer_.get());
221 } 192 }
222 193
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
235 void VideoCaptureController::AddClient( 194 void VideoCaptureController::AddClient(
236 VideoCaptureControllerID id, 195 VideoCaptureControllerID id,
237 VideoCaptureControllerEventHandler* event_handler, 196 VideoCaptureControllerEventHandler* event_handler,
238 media::VideoCaptureSessionId session_id, 197 media::VideoCaptureSessionId session_id,
239 const media::VideoCaptureParams& params) { 198 const media::VideoCaptureParams& params) {
240 DCHECK_CURRENTLY_ON(BrowserThread::IO); 199 DCHECK_CURRENTLY_ON(BrowserThread::IO);
241 DVLOG(1) << "VideoCaptureController::AddClient() -- id=" << id 200 DVLOG(1) << "VideoCaptureController::AddClient() -- id=" << id
242 << ", session_id=" << session_id 201 << ", session_id=" << session_id
243 << ", params.requested_format=" 202 << ", params.requested_format="
244 << media::VideoCaptureFormat::ToString(params.requested_format); 203 << media::VideoCaptureFormat::ToString(params.requested_format);
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
403 buffer_state.DecreaseConsumerCount(); 362 buffer_state.DecreaseConsumerCount();
404 client->buffers_in_use.erase(buffers_in_use_entry_iter); 363 client->buffers_in_use.erase(buffers_in_use_entry_iter);
405 } 364 }
406 365
407 const media::VideoCaptureFormat& 366 const media::VideoCaptureFormat&
408 VideoCaptureController::GetVideoCaptureFormat() const { 367 VideoCaptureController::GetVideoCaptureFormat() const {
409 DCHECK_CURRENTLY_ON(BrowserThread::IO); 368 DCHECK_CURRENTLY_ON(BrowserThread::IO);
410 return video_capture_format_; 369 return video_capture_format_;
411 } 370 }
412 371
413 VideoCaptureController::~VideoCaptureController() {
414 }
415
416 void VideoCaptureController::OnIncomingCapturedVideoFrame( 372 void VideoCaptureController::OnIncomingCapturedVideoFrame(
417 std::unique_ptr<media::VideoCaptureDevice::Client::Buffer> buffer, 373 std::unique_ptr<media::VideoCaptureDevice::Client::Buffer> buffer,
418 scoped_refptr<VideoFrame> frame) { 374 scoped_refptr<VideoFrame> frame) {
419 DCHECK_CURRENTLY_ON(BrowserThread::IO); 375 DCHECK_CURRENTLY_ON(BrowserThread::IO);
376 DCHECK(frame_buffer_host_);
420 const int buffer_id = buffer->id(); 377 const int buffer_id = buffer->id();
421 DCHECK_NE(buffer_id, media::VideoCaptureBufferPool::kInvalidId); 378 DCHECK_NE(buffer_id, media::VideoCaptureBufferPool::kInvalidId);
422 379
423 // Insert if not exists. 380 // Insert if not exists.
424 const auto it = 381 const auto it =
425 buffer_id_to_state_map_ 382 buffer_id_to_state_map_
426 .insert(std::make_pair( 383 .insert(std::make_pair(
427 buffer_id, BufferState(buffer_id, buffer->frame_feedback_id(), 384 buffer_id, BufferState(buffer_id, buffer->frame_feedback_id(),
428 consumer_feedback_observer_.get(), 385 consumer_feedback_observer_.get(),
429 buffer_pool_, frame))) 386 frame_buffer_host_.get(), frame)))
430 .first; 387 .first;
431 BufferState& buffer_state = it->second; 388 BufferState& buffer_state = it->second;
432 DCHECK(buffer_state.HasZeroConsumerHoldCount()); 389 DCHECK(buffer_state.HasZeroConsumerHoldCount());
433 390
434 if (state_ == VIDEO_CAPTURE_STATE_STARTED) { 391 if (state_ == VIDEO_CAPTURE_STATE_STARTED) {
435 if (!frame->metadata()->HasKey(VideoFrameMetadata::FRAME_RATE)) { 392 if (!frame->metadata()->HasKey(VideoFrameMetadata::FRAME_RATE)) {
436 frame->metadata()->SetDouble(VideoFrameMetadata::FRAME_RATE, 393 frame->metadata()->SetDouble(VideoFrameMetadata::FRAME_RATE,
437 video_capture_format_.frame_rate); 394 video_capture_format_.frame_rate);
438 } 395 }
439 std::unique_ptr<base::DictionaryValue> metadata( 396 std::unique_ptr<base::DictionaryValue> metadata(
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
513 } 470 }
514 } 471 }
515 472
516 void VideoCaptureController::OnLog(const std::string& message) { 473 void VideoCaptureController::OnLog(const std::string& message) {
517 DCHECK_CURRENTLY_ON(BrowserThread::IO); 474 DCHECK_CURRENTLY_ON(BrowserThread::IO);
518 MediaStreamManager::SendMessageToNativeLog("Video capture: " + message); 475 MediaStreamManager::SendMessageToNativeLog("Video capture: " + message);
519 } 476 }
520 477
521 void VideoCaptureController::OnBufferDestroyed(int buffer_id_to_drop) { 478 void VideoCaptureController::OnBufferDestroyed(int buffer_id_to_drop) {
522 DCHECK_CURRENTLY_ON(BrowserThread::IO); 479 DCHECK_CURRENTLY_ON(BrowserThread::IO);
480 DCHECK(frame_buffer_host_);
523 481
524 for (const auto& client : controller_clients_) { 482 for (const auto& client : controller_clients_) {
525 if (client->session_closed) 483 if (client->session_closed)
526 continue; 484 continue;
527 485
528 auto known_buffers_entry_iter = 486 auto known_buffers_entry_iter =
529 std::find(std::begin(client->known_buffers), 487 std::find(std::begin(client->known_buffers),
530 std::end(client->known_buffers), buffer_id_to_drop); 488 std::end(client->known_buffers), buffer_id_to_drop);
531 if (known_buffers_entry_iter != std::end(client->known_buffers)) { 489 if (known_buffers_entry_iter != std::end(client->known_buffers)) {
532 client->known_buffers.erase(known_buffers_entry_iter); 490 client->known_buffers.erase(known_buffers_entry_iter);
533 client->event_handler->OnBufferDestroyed(client->controller_id, 491 client->event_handler->OnBufferDestroyed(client->controller_id,
534 buffer_id_to_drop); 492 buffer_id_to_drop);
535 } 493 }
536 } 494 }
537 495
538 buffer_id_to_state_map_.erase(buffer_id_to_drop); 496 buffer_id_to_state_map_.erase(buffer_id_to_drop);
539 } 497 }
540 498
541 void VideoCaptureController::DoNewBufferOnIOThread( 499 void VideoCaptureController::DoNewBufferOnIOThread(
542 ControllerClient* client, 500 ControllerClient* client,
543 media::VideoCaptureDevice::Client::Buffer* buffer, 501 media::VideoCaptureDevice::Client::Buffer* buffer,
544 const scoped_refptr<media::VideoFrame>& frame) { 502 const scoped_refptr<media::VideoFrame>& frame) {
545 DCHECK_CURRENTLY_ON(BrowserThread::IO); 503 DCHECK_CURRENTLY_ON(BrowserThread::IO);
546 DCHECK_EQ(media::VideoFrame::STORAGE_SHMEM, frame->storage_type()); 504 DCHECK_EQ(media::VideoFrame::STORAGE_SHMEM, frame->storage_type());
505 CHECK(frame_buffer_host_);
547 506
548 const int buffer_id = buffer->id(); 507 const int buffer_id = buffer->id();
549 mojo::ScopedSharedBufferHandle handle = 508 mojo::ScopedSharedBufferHandle handle =
550 buffer_pool_->GetHandleForTransit(buffer_id); 509 frame_buffer_host_->GetHandleForTransit(buffer_id);
551 client->event_handler->OnBufferCreated(client->controller_id, 510 client->event_handler->OnBufferCreated(client->controller_id,
552 std::move(handle), 511 std::move(handle),
553 buffer->mapped_size(), buffer_id); 512 buffer->mapped_size(), buffer_id);
554 } 513 }
555 514
556 VideoCaptureController::ControllerClient* VideoCaptureController::FindClient( 515 VideoCaptureController::ControllerClient* VideoCaptureController::FindClient(
557 VideoCaptureControllerID id, 516 VideoCaptureControllerID id,
558 VideoCaptureControllerEventHandler* handler, 517 VideoCaptureControllerEventHandler* handler,
559 const ControllerClients& clients) { 518 const ControllerClients& clients) {
560 for (const auto& client : clients) { 519 for (const auto& client : clients) {
561 if (client->controller_id == id && client->event_handler == handler) 520 if (client->controller_id == id && client->event_handler == handler)
562 return client.get(); 521 return client.get();
563 } 522 }
564 return nullptr; 523 return nullptr;
565 } 524 }
566 525
567 VideoCaptureController::ControllerClient* VideoCaptureController::FindClient( 526 VideoCaptureController::ControllerClient* VideoCaptureController::FindClient(
568 int session_id, 527 int session_id,
569 const ControllerClients& clients) { 528 const ControllerClients& clients) {
570 for (const auto& client : clients) { 529 for (const auto& client : clients) {
571 if (client->session_id == session_id) 530 if (client->session_id == session_id)
572 return client.get(); 531 return client.get();
573 } 532 }
574 return nullptr; 533 return nullptr;
575 } 534 }
576 535
577 } // namespace content 536 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698