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

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

Issue 2595853003: Revert of [Mojo Video Capture] Decouple VCController from VCBufferPool and VCDeviceClient (Closed)
Patch Set: Created 3 years, 12 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) 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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698