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

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: ready for review. Created 8 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | 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 20 matching lines...) Expand all
31 ready_to_delete(false) { 31 ready_to_delete(false) {
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 scoped_refptr<base::MessageLoopProxy> message_loop)
43 : message_loop_(message_loop),
scherkus (not reviewing) 2012/06/27 00:52:31 fix indent here
no longer working on chromium 2012/06/27 14:07:16 Done.
43 listener_(NULL), 44 listener_(NULL),
44 new_capture_session_id_(kFirstSessionId), 45 new_capture_session_id_(kFirstSessionId),
45 use_fake_device_(false) { 46 use_fake_device_(false) {
46 vc_device_thread_.Start();
47 } 47 }
48 48
49 VideoCaptureManager::~VideoCaptureManager() { 49 VideoCaptureManager::~VideoCaptureManager() {
50 vc_device_thread_.Stop();
51 DCHECK(devices_.empty()); 50 DCHECK(devices_.empty());
52 DCHECK(controllers_.empty()); 51 DCHECK(controllers_.empty());
53 } 52 }
54 53
55 void VideoCaptureManager::Register(MediaStreamProviderListener* listener) { 54 void VideoCaptureManager::Register(MediaStreamProviderListener* listener) {
56 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 55 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
57 DCHECK(!listener_); 56 DCHECK(!listener_);
58 listener_ = listener; 57 listener_ = listener;
59 } 58 }
60 59
61 void VideoCaptureManager::Unregister() { 60 void VideoCaptureManager::Unregister() {
62 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 61 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
63 DCHECK(listener_); 62 DCHECK(listener_);
64 listener_ = NULL; 63 listener_ = NULL;
65 } 64 }
66 65
67 void VideoCaptureManager::EnumerateDevices() { 66 void VideoCaptureManager::EnumerateDevices() {
68 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 67 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
69 DCHECK(listener_); 68 DCHECK(listener_);
70 69
71 vc_device_thread_.message_loop()->PostTask( 70 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 message_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
95 vc_device_thread_.message_loop()->PostTask( 94 message_loop_->PostTask(
96 FROM_HERE, 95 FROM_HERE,
97 base::Bind(&VideoCaptureManager::OnClose, this, capture_session_id)); 96 base::Bind(&VideoCaptureManager::OnClose, this, capture_session_id));
98 } 97 }
99 98
100 void VideoCaptureManager::Start( 99 void VideoCaptureManager::Start(
101 const media::VideoCaptureParams& capture_params, 100 const media::VideoCaptureParams& capture_params,
102 media::VideoCaptureDevice::EventHandler* video_capture_receiver) { 101 media::VideoCaptureDevice::EventHandler* video_capture_receiver) {
103 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 102 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
104 103
105 vc_device_thread_.message_loop()->PostTask( 104 message_loop_->PostTask(
106 FROM_HERE, 105 FROM_HERE,
107 base::Bind(&VideoCaptureManager::OnStart, this, capture_params, 106 base::Bind(&VideoCaptureManager::OnStart, this, capture_params,
108 video_capture_receiver)); 107 video_capture_receiver));
109 } 108 }
110 109
111 void VideoCaptureManager::Stop( 110 void VideoCaptureManager::Stop(
112 const media::VideoCaptureSessionId& capture_session_id, 111 const media::VideoCaptureSessionId& capture_session_id,
113 base::Closure stopped_cb) { 112 base::Closure stopped_cb) {
114 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 113 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
115 114
116 vc_device_thread_.message_loop()->PostTask( 115 message_loop_->PostTask(
117 FROM_HERE, 116 FROM_HERE,
118 base::Bind(&VideoCaptureManager::OnStop, this, capture_session_id, 117 base::Bind(&VideoCaptureManager::OnStop, this, capture_session_id,
119 stopped_cb)); 118 stopped_cb));
120 } 119 }
121 120
122 void VideoCaptureManager::Error( 121 void VideoCaptureManager::Error(
123 const media::VideoCaptureSessionId& capture_session_id) { 122 const media::VideoCaptureSessionId& capture_session_id) {
124 PostOnError(capture_session_id, kDeviceNotAvailable); 123 PostOnError(capture_session_id, kDeviceNotAvailable);
125 } 124 }
126 125
127 void VideoCaptureManager::UseFakeDevice() { 126 void VideoCaptureManager::UseFakeDevice() {
128 use_fake_device_ = true; 127 use_fake_device_ = true;
129 } 128 }
130 129
131 MessageLoop* VideoCaptureManager::GetMessageLoop() {
132 return vc_device_thread_.message_loop();
133 }
134
135 void VideoCaptureManager::OnEnumerateDevices() { 130 void VideoCaptureManager::OnEnumerateDevices() {
136 DCHECK(IsOnCaptureDeviceThread()); 131 DCHECK(IsOnCaptureDeviceThread());
137 132
138 media::VideoCaptureDevice::Names device_names; 133 media::VideoCaptureDevice::Names device_names;
139 GetAvailableDevices(&device_names); 134 GetAvailableDevices(&device_names);
140 135
141 StreamDeviceInfoArray devices; 136 StreamDeviceInfoArray devices;
142 for (media::VideoCaptureDevice::Names::iterator it = 137 for (media::VideoCaptureDevice::Names::iterator it =
143 device_names.begin(); it != device_names.end(); ++it) { 138 device_names.begin(); it != device_names.end(); ++it) {
144 bool opened = DeviceOpened(*it); 139 bool opened = DeviceOpened(*it);
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after
353 MediaStreamProviderError error) { 348 MediaStreamProviderError error) {
354 // Don't check thread here, can be called from both IO thread and device 349 // Don't check thread here, can be called from both IO thread and device
355 // thread. 350 // thread.
356 BrowserThread::PostTask(BrowserThread::IO, 351 BrowserThread::PostTask(BrowserThread::IO,
357 FROM_HERE, 352 FROM_HERE,
358 base::Bind(&VideoCaptureManager::OnError, this, 353 base::Bind(&VideoCaptureManager::OnError, this,
359 capture_session_id, error)); 354 capture_session_id, error));
360 } 355 }
361 356
362 bool VideoCaptureManager::IsOnCaptureDeviceThread() const { 357 bool VideoCaptureManager::IsOnCaptureDeviceThread() const {
363 return MessageLoop::current() == vc_device_thread_.message_loop(); 358 return message_loop_->BelongsToCurrentThread();
364 } 359 }
365 360
366 void VideoCaptureManager::GetAvailableDevices( 361 void VideoCaptureManager::GetAvailableDevices(
367 media::VideoCaptureDevice::Names* device_names) { 362 media::VideoCaptureDevice::Names* device_names) {
368 DCHECK(IsOnCaptureDeviceThread()); 363 DCHECK(IsOnCaptureDeviceThread());
369 364
370 if (!use_fake_device_) { 365 if (!use_fake_device_) {
371 media::VideoCaptureDevice::GetDeviceNames(device_names); 366 media::VideoCaptureDevice::GetDeviceNames(device_names);
372 } else { 367 } else {
373 media::FakeVideoCaptureDevice::GetDeviceNames(device_names); 368 media::FakeVideoCaptureDevice::GetDeviceNames(device_names);
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
413 } 408 }
414 } 409 }
415 return false; 410 return false;
416 } 411 }
417 412
418 void VideoCaptureManager::AddController( 413 void VideoCaptureManager::AddController(
419 const media::VideoCaptureParams& capture_params, 414 const media::VideoCaptureParams& capture_params,
420 VideoCaptureControllerEventHandler* handler, 415 VideoCaptureControllerEventHandler* handler,
421 base::Callback<void(VideoCaptureController*)> added_cb) { 416 base::Callback<void(VideoCaptureController*)> added_cb) {
422 DCHECK(handler); 417 DCHECK(handler);
423 vc_device_thread_.message_loop()->PostTask( 418 message_loop_->PostTask(
424 FROM_HERE, 419 FROM_HERE,
425 base::Bind(&VideoCaptureManager::DoAddControllerOnDeviceThread, 420 base::Bind(&VideoCaptureManager::DoAddControllerOnDeviceThread,
426 this, capture_params, handler, added_cb)); 421 this, capture_params, handler, added_cb));
427 } 422 }
428 423
429 void VideoCaptureManager::DoAddControllerOnDeviceThread( 424 void VideoCaptureManager::DoAddControllerOnDeviceThread(
430 const media::VideoCaptureParams capture_params, 425 const media::VideoCaptureParams capture_params,
431 VideoCaptureControllerEventHandler* handler, 426 VideoCaptureControllerEventHandler* handler,
432 base::Callback<void(VideoCaptureController*)> added_cb) { 427 base::Callback<void(VideoCaptureController*)> added_cb) {
433 DCHECK(IsOnCaptureDeviceThread()); 428 DCHECK(IsOnCaptureDeviceThread());
(...skipping 11 matching lines...) Expand all
445 controller = controllers_[video_capture_device]->controller; 440 controller = controllers_[video_capture_device]->controller;
446 } 441 }
447 } 442 }
448 added_cb.Run(controller); 443 added_cb.Run(controller);
449 } 444 }
450 445
451 void VideoCaptureManager::RemoveController( 446 void VideoCaptureManager::RemoveController(
452 VideoCaptureController* controller, 447 VideoCaptureController* controller,
453 VideoCaptureControllerEventHandler* handler) { 448 VideoCaptureControllerEventHandler* handler) {
454 DCHECK(handler); 449 DCHECK(handler);
455 vc_device_thread_.message_loop()->PostTask( 450 message_loop_->PostTask(
456 FROM_HERE, 451 FROM_HERE,
457 base::Bind(&VideoCaptureManager::DoRemoveControllerOnDeviceThread, this, 452 base::Bind(&VideoCaptureManager::DoRemoveControllerOnDeviceThread, this,
458 make_scoped_refptr(controller), handler)); 453 make_scoped_refptr(controller), handler));
459 } 454 }
460 455
461 void VideoCaptureManager::DoRemoveControllerOnDeviceThread( 456 void VideoCaptureManager::DoRemoveControllerOnDeviceThread(
462 VideoCaptureController* controller, 457 VideoCaptureController* controller,
463 VideoCaptureControllerEventHandler* handler) { 458 VideoCaptureControllerEventHandler* handler) {
464 DCHECK(IsOnCaptureDeviceThread()); 459 DCHECK(IsOnCaptureDeviceThread());
465 460
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
509 504
510 VideoCaptureDevices::iterator dit = devices_.find(capture_session_id); 505 VideoCaptureDevices::iterator dit = devices_.find(capture_session_id);
511 if (dit != devices_.end()) { 506 if (dit != devices_.end()) {
512 return dit->second; 507 return dit->second;
513 } 508 }
514 } 509 }
515 return NULL; 510 return NULL;
516 } 511 }
517 512
518 } // namespace media_stream 513 } // namespace media_stream
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698