| 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_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 Loading... |
| 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), |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |