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

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

Issue 10662049: Move the device enumerate/open/close work to device thread from IO thread (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: moved MediaStream to BrowserMainloop and addressed all the comments from Tommi and Magnus. Created 8 years, 5 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 | Annotate | Revision Log
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_manager.h" 5 #include "content/browser/renderer_host/media/video_capture_manager.h"
6 6
7 #include <set> 7 #include <set>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/stl_util.h" 10 #include "base/stl_util.h"
(...skipping 21 matching lines...) Expand all
32 handlers.push_front(handler); 32 handlers.push_front(handler);
33 } 33 }
34 ~Controller() {} 34 ~Controller() {}
35 35
36 scoped_refptr<VideoCaptureController> controller; 36 scoped_refptr<VideoCaptureController> controller;
37 bool ready_to_delete; 37 bool ready_to_delete;
38 Handlers handlers; 38 Handlers handlers;
39 }; 39 };
40 40
41 VideoCaptureManager::VideoCaptureManager() 41 VideoCaptureManager::VideoCaptureManager()
42 : vc_device_thread_("VideoCaptureManagerThread"), 42 : listener_(NULL),
43 listener_(NULL), 43 new_capture_session_id_(kFirstSessionId),
44 new_capture_session_id_(kFirstSessionId), 44 use_fake_device_(false) {
45 use_fake_device_(false) {
46 vc_device_thread_.Start();
47 } 45 }
48 46
49 VideoCaptureManager::~VideoCaptureManager() { 47 VideoCaptureManager::~VideoCaptureManager() {
50 vc_device_thread_.Stop();
51 DCHECK(devices_.empty()); 48 DCHECK(devices_.empty());
52 DCHECK(controllers_.empty()); 49 DCHECK(controllers_.empty());
53 } 50 }
54 51
55 void VideoCaptureManager::Register(MediaStreamProviderListener* listener) { 52 void VideoCaptureManager::Register(MediaStreamProviderListener* listener,
53 base::MessageLoopProxy* message_loop) {
tommi (sloooow) - chröme 2012/07/04 13:46:48 device_thread_loop or device_loop
no longer working on chromium 2012/07/04 14:31:39 Done.
56 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 54 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
57 DCHECK(!listener_); 55 DCHECK(!listener_);
56 DCHECK(!device_loop_);
58 listener_ = listener; 57 listener_ = listener;
58 device_loop_ = message_loop;
59 } 59 }
60 60
61 void VideoCaptureManager::Unregister() { 61 void VideoCaptureManager::Unregister() {
62 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 62 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
63 DCHECK(listener_); 63 DCHECK(listener_);
64 listener_ = NULL; 64 listener_ = NULL;
65 } 65 }
66 66
67 void VideoCaptureManager::EnumerateDevices() { 67 void VideoCaptureManager::EnumerateDevices() {
68 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 68 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
69 DCHECK(listener_); 69 DCHECK(listener_);
70 70 device_loop_->PostTask(
71 vc_device_thread_.message_loop()->PostTask(
72 FROM_HERE, 71 FROM_HERE,
73 base::Bind(&VideoCaptureManager::OnEnumerateDevices, this)); 72 base::Bind(&VideoCaptureManager::OnEnumerateDevices, this));
74 } 73 }
75 74
76 int VideoCaptureManager::Open(const StreamDeviceInfo& device) { 75 int VideoCaptureManager::Open(const StreamDeviceInfo& device) {
77 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 76 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
78 DCHECK(listener_); 77 DCHECK(listener_);
79 78
80 // Generate a new id for this device. 79 // Generate a new id for this device.
81 int video_capture_session_id = new_capture_session_id_++; 80 int video_capture_session_id = new_capture_session_id_++;
82 81
83 vc_device_thread_.message_loop()->PostTask( 82 device_loop_->PostTask(
84 FROM_HERE, 83 FROM_HERE,
85 base::Bind(&VideoCaptureManager::OnOpen, this, video_capture_session_id, 84 base::Bind(&VideoCaptureManager::OnOpen, this, video_capture_session_id,
86 device)); 85 device));
87 86
88 return video_capture_session_id; 87 return video_capture_session_id;
89 } 88 }
90 89
91 void VideoCaptureManager::Close(int capture_session_id) { 90 void VideoCaptureManager::Close(int capture_session_id) {
92 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 91 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
93 DCHECK(listener_); 92 DCHECK(listener_);
94 93 device_loop_->PostTask(
95 vc_device_thread_.message_loop()->PostTask(
96 FROM_HERE, 94 FROM_HERE,
97 base::Bind(&VideoCaptureManager::OnClose, this, capture_session_id)); 95 base::Bind(&VideoCaptureManager::OnClose, this, capture_session_id));
98 } 96 }
99 97
100 void VideoCaptureManager::Start( 98 void VideoCaptureManager::Start(
101 const media::VideoCaptureParams& capture_params, 99 const media::VideoCaptureParams& capture_params,
102 media::VideoCaptureDevice::EventHandler* video_capture_receiver) { 100 media::VideoCaptureDevice::EventHandler* video_capture_receiver) {
103 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 101 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
104 102 device_loop_->PostTask(
105 vc_device_thread_.message_loop()->PostTask(
106 FROM_HERE, 103 FROM_HERE,
107 base::Bind(&VideoCaptureManager::OnStart, this, capture_params, 104 base::Bind(&VideoCaptureManager::OnStart, this, capture_params,
108 video_capture_receiver)); 105 video_capture_receiver));
109 } 106 }
110 107
111 void VideoCaptureManager::Stop( 108 void VideoCaptureManager::Stop(
112 const media::VideoCaptureSessionId& capture_session_id, 109 const media::VideoCaptureSessionId& capture_session_id,
113 base::Closure stopped_cb) { 110 base::Closure stopped_cb) {
114 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 111 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
115 112 device_loop_->PostTask(
116 vc_device_thread_.message_loop()->PostTask(
117 FROM_HERE, 113 FROM_HERE,
118 base::Bind(&VideoCaptureManager::OnStop, this, capture_session_id, 114 base::Bind(&VideoCaptureManager::OnStop, this, capture_session_id,
119 stopped_cb)); 115 stopped_cb));
120 } 116 }
121 117
122 void VideoCaptureManager::Error( 118 void VideoCaptureManager::Error(
123 const media::VideoCaptureSessionId& capture_session_id) { 119 const media::VideoCaptureSessionId& capture_session_id) {
124 PostOnError(capture_session_id, kDeviceNotAvailable); 120 PostOnError(capture_session_id, kDeviceNotAvailable);
125 } 121 }
126 122
127 void VideoCaptureManager::UseFakeDevice() { 123 void VideoCaptureManager::UseFakeDevice() {
128 use_fake_device_ = true; 124 use_fake_device_ = true;
129 } 125 }
130 126
131 MessageLoop* VideoCaptureManager::GetMessageLoop() {
132 return vc_device_thread_.message_loop();
133 }
134
135 void VideoCaptureManager::OnEnumerateDevices() { 127 void VideoCaptureManager::OnEnumerateDevices() {
136 DCHECK(IsOnCaptureDeviceThread()); 128 DCHECK(IsOnDeviceThread());
137 129
138 media::VideoCaptureDevice::Names device_names; 130 media::VideoCaptureDevice::Names device_names;
139 GetAvailableDevices(&device_names); 131 GetAvailableDevices(&device_names);
140 132
141 StreamDeviceInfoArray devices; 133 StreamDeviceInfoArray devices;
142 for (media::VideoCaptureDevice::Names::iterator it = 134 for (media::VideoCaptureDevice::Names::iterator it =
143 device_names.begin(); it != device_names.end(); ++it) { 135 device_names.begin(); it != device_names.end(); ++it) {
144 bool opened = DeviceOpened(*it); 136 bool opened = DeviceOpened(*it);
145 devices.push_back(StreamDeviceInfo( 137 devices.push_back(StreamDeviceInfo(
146 content::MEDIA_STREAM_DEVICE_TYPE_VIDEO_CAPTURE, it->device_name, 138 content::MEDIA_STREAM_DEVICE_TYPE_VIDEO_CAPTURE, it->device_name,
147 it->unique_id, opened)); 139 it->unique_id, opened));
148 } 140 }
149 141
150 PostOnDevicesEnumerated(devices); 142 PostOnDevicesEnumerated(devices);
151 } 143 }
152 144
153 void VideoCaptureManager::OnOpen(int capture_session_id, 145 void VideoCaptureManager::OnOpen(int capture_session_id,
154 const StreamDeviceInfo& device) { 146 const StreamDeviceInfo& device) {
155 DCHECK(IsOnCaptureDeviceThread()); 147 DCHECK(IsOnDeviceThread());
156 DCHECK(devices_.find(capture_session_id) == devices_.end()); 148 DCHECK(devices_.find(capture_session_id) == devices_.end());
157 DVLOG(1) << "VideoCaptureManager::OnOpen, id " << capture_session_id; 149 DVLOG(1) << "VideoCaptureManager::OnOpen, id " << capture_session_id;
158 150
159 // Check if another session has already opened this device. If so, just 151 // Check if another session has already opened this device. If so, just
160 // use that opened device. 152 // use that opened device.
161 media::VideoCaptureDevice* video_capture_device = GetOpenedDevice(device); 153 media::VideoCaptureDevice* video_capture_device = GetOpenedDevice(device);
162 if (video_capture_device) { 154 if (video_capture_device) {
163 devices_[capture_session_id] = video_capture_device; 155 devices_[capture_session_id] = video_capture_device;
164 PostOnOpened(capture_session_id); 156 PostOnOpened(capture_session_id);
165 return; 157 return;
(...skipping 13 matching lines...) Expand all
179 if (!video_capture_device) { 171 if (!video_capture_device) {
180 PostOnError(capture_session_id, kDeviceNotAvailable); 172 PostOnError(capture_session_id, kDeviceNotAvailable);
181 return; 173 return;
182 } 174 }
183 175
184 devices_[capture_session_id] = video_capture_device; 176 devices_[capture_session_id] = video_capture_device;
185 PostOnOpened(capture_session_id); 177 PostOnOpened(capture_session_id);
186 } 178 }
187 179
188 void VideoCaptureManager::OnClose(int capture_session_id) { 180 void VideoCaptureManager::OnClose(int capture_session_id) {
189 DCHECK(IsOnCaptureDeviceThread()); 181 DCHECK(IsOnDeviceThread());
190 DVLOG(1) << "VideoCaptureManager::OnClose, id " << capture_session_id; 182 DVLOG(1) << "VideoCaptureManager::OnClose, id " << capture_session_id;
191 183
192 media::VideoCaptureDevice* video_capture_device = NULL; 184 media::VideoCaptureDevice* video_capture_device = NULL;
193 VideoCaptureDevices::iterator device_it = devices_.find(capture_session_id); 185 VideoCaptureDevices::iterator device_it = devices_.find(capture_session_id);
194 if (device_it != devices_.end()) { 186 if (device_it != devices_.end()) {
195 video_capture_device = device_it->second; 187 video_capture_device = device_it->second;
196 devices_.erase(device_it); 188 devices_.erase(device_it);
197 189
198 Controllers::iterator cit = controllers_.find(video_capture_device); 190 Controllers::iterator cit = controllers_.find(video_capture_device);
199 if (cit != controllers_.end()) { 191 if (cit != controllers_.end()) {
(...skipping 15 matching lines...) Expand all
215 } 207 }
216 delete video_capture_device; 208 delete video_capture_device;
217 } 209 }
218 } 210 }
219 PostOnClosed(capture_session_id); 211 PostOnClosed(capture_session_id);
220 } 212 }
221 213
222 void VideoCaptureManager::OnStart( 214 void VideoCaptureManager::OnStart(
223 const media::VideoCaptureParams capture_params, 215 const media::VideoCaptureParams capture_params,
224 media::VideoCaptureDevice::EventHandler* video_capture_receiver) { 216 media::VideoCaptureDevice::EventHandler* video_capture_receiver) {
225 DCHECK(IsOnCaptureDeviceThread()); 217 DCHECK(IsOnDeviceThread());
226 DCHECK(video_capture_receiver != NULL); 218 DCHECK(video_capture_receiver != NULL);
227 DVLOG(1) << "VideoCaptureManager::OnStart, (" << capture_params.width 219 DVLOG(1) << "VideoCaptureManager::OnStart, (" << capture_params.width
228 << ", " << capture_params.height 220 << ", " << capture_params.height
229 << ", " << capture_params.frame_per_second 221 << ", " << capture_params.frame_per_second
230 << ", " << capture_params.session_id 222 << ", " << capture_params.session_id
231 << ")"; 223 << ")";
232 224
233 media::VideoCaptureDevice* video_capture_device = 225 media::VideoCaptureDevice* video_capture_device =
234 GetDeviceInternal(capture_params.session_id); 226 GetDeviceInternal(capture_params.session_id);
235 if (!video_capture_device) { 227 if (!video_capture_device) {
(...skipping 10 matching lines...) Expand all
246 // video_capture_device. video_capture_receiver to perform actions. 238 // video_capture_device. video_capture_receiver to perform actions.
247 video_capture_device->Allocate(capture_params.width, capture_params.height, 239 video_capture_device->Allocate(capture_params.width, capture_params.height,
248 capture_params.frame_per_second, 240 capture_params.frame_per_second,
249 video_capture_receiver); 241 video_capture_receiver);
250 video_capture_device->Start(); 242 video_capture_device->Start();
251 } 243 }
252 244
253 void VideoCaptureManager::OnStop( 245 void VideoCaptureManager::OnStop(
254 const media::VideoCaptureSessionId capture_session_id, 246 const media::VideoCaptureSessionId capture_session_id,
255 base::Closure stopped_cb) { 247 base::Closure stopped_cb) {
256 DCHECK(IsOnCaptureDeviceThread()); 248 DCHECK(IsOnDeviceThread());
257 DVLOG(1) << "VideoCaptureManager::OnStop, id " << capture_session_id; 249 DVLOG(1) << "VideoCaptureManager::OnStop, id " << capture_session_id;
258 250
259 VideoCaptureDevices::iterator it = devices_.find(capture_session_id); 251 VideoCaptureDevices::iterator it = devices_.find(capture_session_id);
260 if (it != devices_.end()) { 252 if (it != devices_.end()) {
261 media::VideoCaptureDevice* video_capture_device = it->second; 253 media::VideoCaptureDevice* video_capture_device = it->second;
262 // Possible errors are signaled to video_capture_receiver by 254 // Possible errors are signaled to video_capture_receiver by
263 // video_capture_device. video_capture_receiver to perform actions. 255 // video_capture_device. video_capture_receiver to perform actions.
264 video_capture_device->Stop(); 256 video_capture_device->Stop();
265 video_capture_device->DeAllocate(); 257 video_capture_device->DeAllocate();
266 Controllers::iterator cit = controllers_.find(video_capture_device); 258 Controllers::iterator cit = controllers_.find(video_capture_device);
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
318 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 310 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
319 if (!listener_) { 311 if (!listener_) {
320 // Listener has been removed. 312 // Listener has been removed.
321 return; 313 return;
322 } 314 }
323 listener_->Error(content::MEDIA_STREAM_DEVICE_TYPE_VIDEO_CAPTURE, 315 listener_->Error(content::MEDIA_STREAM_DEVICE_TYPE_VIDEO_CAPTURE,
324 capture_session_id, error); 316 capture_session_id, error);
325 } 317 }
326 318
327 void VideoCaptureManager::PostOnOpened(int capture_session_id) { 319 void VideoCaptureManager::PostOnOpened(int capture_session_id) {
328 DCHECK(IsOnCaptureDeviceThread()); 320 DCHECK(IsOnDeviceThread());
329 BrowserThread::PostTask(BrowserThread::IO, 321 BrowserThread::PostTask(BrowserThread::IO,
330 FROM_HERE, 322 FROM_HERE,
331 base::Bind(&VideoCaptureManager::OnOpened, this, 323 base::Bind(&VideoCaptureManager::OnOpened, this,
332 capture_session_id)); 324 capture_session_id));
333 } 325 }
334 326
335 void VideoCaptureManager::PostOnClosed(int capture_session_id) { 327 void VideoCaptureManager::PostOnClosed(int capture_session_id) {
336 DCHECK(IsOnCaptureDeviceThread()); 328 DCHECK(IsOnDeviceThread());
337 BrowserThread::PostTask(BrowserThread::IO, 329 BrowserThread::PostTask(BrowserThread::IO,
338 FROM_HERE, 330 FROM_HERE,
339 base::Bind(&VideoCaptureManager::OnClosed, this, 331 base::Bind(&VideoCaptureManager::OnClosed, this,
340 capture_session_id)); 332 capture_session_id));
341 } 333 }
342 334
343 void VideoCaptureManager::PostOnDevicesEnumerated( 335 void VideoCaptureManager::PostOnDevicesEnumerated(
344 const StreamDeviceInfoArray& devices) { 336 const StreamDeviceInfoArray& devices) {
345 DCHECK(IsOnCaptureDeviceThread()); 337 DCHECK(IsOnDeviceThread());
346 BrowserThread::PostTask(BrowserThread::IO, 338 BrowserThread::PostTask(BrowserThread::IO,
347 FROM_HERE, 339 FROM_HERE,
348 base::Bind(&VideoCaptureManager::OnDevicesEnumerated, 340 base::Bind(&VideoCaptureManager::OnDevicesEnumerated,
349 this, devices)); 341 this, devices));
350 } 342 }
351 343
352 void VideoCaptureManager::PostOnError(int capture_session_id, 344 void VideoCaptureManager::PostOnError(int capture_session_id,
353 MediaStreamProviderError error) { 345 MediaStreamProviderError error) {
354 // Don't check thread here, can be called from both IO thread and device 346 // Don't check thread here, can be called from both IO thread and device
355 // thread. 347 // thread.
356 BrowserThread::PostTask(BrowserThread::IO, 348 BrowserThread::PostTask(BrowserThread::IO,
357 FROM_HERE, 349 FROM_HERE,
358 base::Bind(&VideoCaptureManager::OnError, this, 350 base::Bind(&VideoCaptureManager::OnError, this,
359 capture_session_id, error)); 351 capture_session_id, error));
360 } 352 }
361 353
362 bool VideoCaptureManager::IsOnCaptureDeviceThread() const { 354 bool VideoCaptureManager::IsOnDeviceThread() const {
363 return MessageLoop::current() == vc_device_thread_.message_loop(); 355 return device_loop_->BelongsToCurrentThread();
364 } 356 }
365 357
366 void VideoCaptureManager::GetAvailableDevices( 358 void VideoCaptureManager::GetAvailableDevices(
367 media::VideoCaptureDevice::Names* device_names) { 359 media::VideoCaptureDevice::Names* device_names) {
368 DCHECK(IsOnCaptureDeviceThread()); 360 DCHECK(IsOnDeviceThread());
369 361
370 if (!use_fake_device_) { 362 if (!use_fake_device_) {
371 media::VideoCaptureDevice::GetDeviceNames(device_names); 363 media::VideoCaptureDevice::GetDeviceNames(device_names);
372 } else { 364 } else {
373 media::FakeVideoCaptureDevice::GetDeviceNames(device_names); 365 media::FakeVideoCaptureDevice::GetDeviceNames(device_names);
374 } 366 }
375 } 367 }
376 368
377 bool VideoCaptureManager::DeviceOpened( 369 bool VideoCaptureManager::DeviceOpened(
378 const media::VideoCaptureDevice::Name& device_name) { 370 const media::VideoCaptureDevice::Name& device_name) {
379 DCHECK(IsOnCaptureDeviceThread()); 371 DCHECK(IsOnDeviceThread());
380 372
381 for (VideoCaptureDevices::iterator it = devices_.begin(); 373 for (VideoCaptureDevices::iterator it = devices_.begin();
382 it != devices_.end(); ++it) { 374 it != devices_.end(); ++it) {
383 if (device_name.unique_id == it->second->device_name().unique_id) { 375 if (device_name.unique_id == it->second->device_name().unique_id) {
384 // We've found the device! 376 // We've found the device!
385 return true; 377 return true;
386 } 378 }
387 } 379 }
388 return false; 380 return false;
389 } 381 }
390 382
391 media::VideoCaptureDevice* VideoCaptureManager::GetOpenedDevice( 383 media::VideoCaptureDevice* VideoCaptureManager::GetOpenedDevice(
392 const StreamDeviceInfo& device_info) { 384 const StreamDeviceInfo& device_info) {
393 DCHECK(IsOnCaptureDeviceThread()); 385 DCHECK(IsOnDeviceThread());
394 386
395 for (VideoCaptureDevices::iterator it = devices_.begin(); 387 for (VideoCaptureDevices::iterator it = devices_.begin();
396 it != devices_.end(); it++) { 388 it != devices_.end(); it++) {
397 if (device_info.device_id == it->second->device_name().unique_id) { 389 if (device_info.device_id == it->second->device_name().unique_id) {
398 return it->second; 390 return it->second;
399 } 391 }
400 } 392 }
401 return NULL; 393 return NULL;
402 } 394 }
403 395
404 bool VideoCaptureManager::DeviceInUse( 396 bool VideoCaptureManager::DeviceInUse(
405 const media::VideoCaptureDevice* video_capture_device) { 397 const media::VideoCaptureDevice* video_capture_device) {
406 DCHECK(IsOnCaptureDeviceThread()); 398 DCHECK(IsOnDeviceThread());
407 399
408 for (VideoCaptureDevices::iterator it = devices_.begin(); 400 for (VideoCaptureDevices::iterator it = devices_.begin();
409 it != devices_.end(); ++it) { 401 it != devices_.end(); ++it) {
410 if (video_capture_device == it->second) { 402 if (video_capture_device == it->second) {
411 // We've found the device! 403 // We've found the device!
412 return true; 404 return true;
413 } 405 }
414 } 406 }
415 return false; 407 return false;
416 } 408 }
417 409
418 void VideoCaptureManager::AddController( 410 void VideoCaptureManager::AddController(
419 const media::VideoCaptureParams& capture_params, 411 const media::VideoCaptureParams& capture_params,
420 VideoCaptureControllerEventHandler* handler, 412 VideoCaptureControllerEventHandler* handler,
421 base::Callback<void(VideoCaptureController*)> added_cb) { 413 base::Callback<void(VideoCaptureController*)> added_cb) {
422 DCHECK(handler); 414 DCHECK(handler);
423 vc_device_thread_.message_loop()->PostTask( 415 device_loop_->PostTask(
424 FROM_HERE, 416 FROM_HERE,
425 base::Bind(&VideoCaptureManager::DoAddControllerOnDeviceThread, 417 base::Bind(&VideoCaptureManager::DoAddControllerOnDeviceThread,
426 this, capture_params, handler, added_cb)); 418 this, capture_params, handler, added_cb));
427 } 419 }
428 420
429 void VideoCaptureManager::DoAddControllerOnDeviceThread( 421 void VideoCaptureManager::DoAddControllerOnDeviceThread(
430 const media::VideoCaptureParams capture_params, 422 const media::VideoCaptureParams capture_params,
431 VideoCaptureControllerEventHandler* handler, 423 VideoCaptureControllerEventHandler* handler,
432 base::Callback<void(VideoCaptureController*)> added_cb) { 424 base::Callback<void(VideoCaptureController*)> added_cb) {
433 DCHECK(IsOnCaptureDeviceThread()); 425 DCHECK(IsOnDeviceThread());
434 426
435 media::VideoCaptureDevice* video_capture_device = 427 media::VideoCaptureDevice* video_capture_device =
436 GetDeviceInternal(capture_params.session_id); 428 GetDeviceInternal(capture_params.session_id);
437 scoped_refptr<VideoCaptureController> controller; 429 scoped_refptr<VideoCaptureController> controller;
438 if (video_capture_device) { 430 if (video_capture_device) {
439 Controllers::iterator cit = controllers_.find(video_capture_device); 431 Controllers::iterator cit = controllers_.find(video_capture_device);
440 if (cit == controllers_.end()) { 432 if (cit == controllers_.end()) {
441 controller = new VideoCaptureController(this); 433 controller = new VideoCaptureController(this);
442 controllers_[video_capture_device] = new Controller(controller, handler); 434 controllers_[video_capture_device] = new Controller(controller, handler);
443 } else { 435 } else {
444 controllers_[video_capture_device]->handlers.push_front(handler); 436 controllers_[video_capture_device]->handlers.push_front(handler);
445 controller = controllers_[video_capture_device]->controller; 437 controller = controllers_[video_capture_device]->controller;
446 } 438 }
447 } 439 }
448 added_cb.Run(controller); 440 added_cb.Run(controller);
449 } 441 }
450 442
451 void VideoCaptureManager::RemoveController( 443 void VideoCaptureManager::RemoveController(
452 VideoCaptureController* controller, 444 VideoCaptureController* controller,
453 VideoCaptureControllerEventHandler* handler) { 445 VideoCaptureControllerEventHandler* handler) {
454 DCHECK(handler); 446 DCHECK(handler);
455 vc_device_thread_.message_loop()->PostTask( 447 device_loop_->PostTask(
456 FROM_HERE, 448 FROM_HERE,
457 base::Bind(&VideoCaptureManager::DoRemoveControllerOnDeviceThread, this, 449 base::Bind(&VideoCaptureManager::DoRemoveControllerOnDeviceThread, this,
458 make_scoped_refptr(controller), handler)); 450 make_scoped_refptr(controller), handler));
459 } 451 }
460 452
461 void VideoCaptureManager::DoRemoveControllerOnDeviceThread( 453 void VideoCaptureManager::DoRemoveControllerOnDeviceThread(
462 VideoCaptureController* controller, 454 VideoCaptureController* controller,
463 VideoCaptureControllerEventHandler* handler) { 455 VideoCaptureControllerEventHandler* handler) {
464 DCHECK(IsOnCaptureDeviceThread()); 456 DCHECK(IsOnDeviceThread());
465 457
466 for (Controllers::iterator cit = controllers_.begin(); 458 for (Controllers::iterator cit = controllers_.begin();
467 cit != controllers_.end(); ++cit) { 459 cit != controllers_.end(); ++cit) {
468 if (controller == cit->second->controller) { 460 if (controller == cit->second->controller) {
469 Handlers& handlers = cit->second->handlers; 461 Handlers& handlers = cit->second->handlers;
470 for (Handlers::iterator hit = handlers.begin(); 462 for (Handlers::iterator hit = handlers.begin();
471 hit != handlers.end(); ++hit) { 463 hit != handlers.end(); ++hit) {
472 if ((*hit) == handler) { 464 if ((*hit) == handler) {
473 handlers.erase(hit); 465 handlers.erase(hit);
474 break; 466 break;
475 } 467 }
476 } 468 }
477 if (handlers.empty() && cit->second->ready_to_delete) { 469 if (handlers.empty() && cit->second->ready_to_delete) {
478 delete cit->second; 470 delete cit->second;
479 controllers_.erase(cit); 471 controllers_.erase(cit);
480 } 472 }
481 return; 473 return;
482 } 474 }
483 } 475 }
484 } 476 }
485 477
486 media::VideoCaptureDevice* VideoCaptureManager::GetDeviceInternal( 478 media::VideoCaptureDevice* VideoCaptureManager::GetDeviceInternal(
487 int capture_session_id) { 479 int capture_session_id) {
488 DCHECK(IsOnCaptureDeviceThread()); 480 DCHECK(IsOnDeviceThread());
489 VideoCaptureDevices::iterator dit = devices_.find(capture_session_id); 481 VideoCaptureDevices::iterator dit = devices_.find(capture_session_id);
490 if (dit != devices_.end()) { 482 if (dit != devices_.end()) {
491 return dit->second; 483 return dit->second;
492 } 484 }
493 485
494 // Solution for not using MediaStreamManager. 486 // Solution for not using MediaStreamManager.
495 // This session id won't be returned by Open(). 487 // This session id won't be returned by Open().
496 if (capture_session_id == kStartOpenSessionId) { 488 if (capture_session_id == kStartOpenSessionId) {
497 media::VideoCaptureDevice::Names device_names; 489 media::VideoCaptureDevice::Names device_names;
498 GetAvailableDevices(&device_names); 490 GetAvailableDevices(&device_names);
(...skipping 10 matching lines...) Expand all
509 501
510 VideoCaptureDevices::iterator dit = devices_.find(capture_session_id); 502 VideoCaptureDevices::iterator dit = devices_.find(capture_session_id);
511 if (dit != devices_.end()) { 503 if (dit != devices_.end()) {
512 return dit->second; 504 return dit->second;
513 } 505 }
514 } 506 }
515 return NULL; 507 return NULL;
516 } 508 }
517 509
518 } // namespace media_stream 510 } // namespace media_stream
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698