| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/media_stream_manager.h" | 5 #include "content/browser/renderer_host/media/media_stream_manager.h" |
| 6 | 6 |
| 7 #include <list> | 7 #include <list> |
| 8 | 8 |
| 9 #include "base/lazy_instance.h" | 9 #include "base/compiler_specific.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| 11 #include "base/rand_util.h" | 11 #include "base/rand_util.h" |
| 12 #include "content/browser/browser_thread.h" | 12 #include "content/browser/browser_thread.h" |
| 13 #include "content/browser/renderer_host/media/media_stream_device_settings.h" | 13 #include "content/browser/renderer_host/media/media_stream_device_settings.h" |
| 14 #include "content/browser/renderer_host/media/media_stream_requester.h" | 14 #include "content/browser/renderer_host/media/media_stream_requester.h" |
| 15 #include "content/browser/renderer_host/media/video_capture_manager.h" | 15 #include "content/browser/renderer_host/media/video_capture_manager.h" |
| 16 #include "content/common/media/media_stream_options.h" | 16 #include "content/common/media/media_stream_options.h" |
| 17 | 17 |
| 18 namespace media_stream { | 18 namespace media_stream { |
| 19 | 19 |
| 20 // TODO(mflodman) Find out who should own MediaStreamManager. | |
| 21 base::LazyInstance<MediaStreamManager> g_media_stream_manager( | |
| 22 base::LINKER_INITIALIZED); | |
| 23 | |
| 24 // Creates a random label used to identify requests. | 20 // Creates a random label used to identify requests. |
| 25 static std::string RandomLabel() { | 21 static std::string RandomLabel() { |
| 26 // Alphbet according to WhatWG standard, i.e. containing 36 characters from | 22 // Alphabet according to WhatWG standard, i.e. containing 36 characters from |
| 27 // range: U+0021, U+0023 to U+0027, U+002A to U+002B, U+002D to U+002E, | 23 // range: U+0021, U+0023 to U+0027, U+002A to U+002B, U+002D to U+002E, |
| 28 // U+0030 to U+0039, U+0041 to U+005A, U+005E to U+007E. | 24 // U+0030 to U+0039, U+0041 to U+005A, U+005E to U+007E. |
| 29 static const char alphabet[] = "!#$%&\'*+-.0123456789" | 25 static const char alphabet[] = "!#$%&\'*+-.0123456789" |
| 30 "abcdefghijklmnopqrstuvwxyz^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~"; | 26 "abcdefghijklmnopqrstuvwxyz^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~"; |
| 31 | 27 |
| 32 std::string label(36, ' '); | 28 std::string label(36, ' '); |
| 33 for (size_t i = 0; i < label.size(); ++i) { | 29 for (size_t i = 0; i < label.size(); ++i) { |
| 34 int random_char = base::RandGenerator(sizeof(alphabet) - 1); | 30 int random_char = base::RandGenerator(sizeof(alphabet) - 1); |
| 35 label[i] = alphabet[random_char]; | 31 label[i] = alphabet[random_char]; |
| 36 } | 32 } |
| 37 return label; | 33 return label; |
| 38 } | 34 } |
| 39 | 35 |
| 40 // Helper to verify if a media stream type is part of options or not. | 36 // Helper to verify if a media stream type is part of options or not. |
| 41 static bool Requested(const StreamOptions& options, | 37 static bool Requested(const StreamOptions& options, |
| 42 MediaStreamType stream_type) { | 38 MediaStreamType stream_type) { |
| 43 if (stream_type == kVideoCapture && | 39 if (stream_type == kVideoCapture && |
| 44 (options.video_option != StreamOptions::kNoCamera)) { | 40 (options.video_option != StreamOptions::kNoCamera)) { |
| 45 return true; | 41 return true; |
| 46 } else if (stream_type == kAudioCapture && options.audio == true) { | 42 } else if (stream_type == kAudioCapture && options.audio == true) { |
| 47 return true; | 43 return true; |
| 48 } | 44 } |
| 49 return false; | 45 return false; |
| 50 } | 46 } |
| 51 | 47 |
| 52 MediaStreamManager* MediaStreamManager::Get() { | 48 MediaStreamManager::MediaStreamManager() |
| 53 return g_media_stream_manager.Pointer(); | 49 : ALLOW_THIS_IN_INITIALIZER_LIST( |
| 50 device_settings_(new MediaStreamDeviceSettings(this))), |
| 51 enumeration_in_progress_(kNumMediaStreamTypes, false) { |
| 52 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 54 } | 53 } |
| 55 | 54 |
| 56 MediaStreamManager::~MediaStreamManager() { | 55 MediaStreamManager::~MediaStreamManager() { |
| 57 delete device_settings_; | 56 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 58 delete video_capture_manager_; | |
| 59 } | 57 } |
| 60 | 58 |
| 61 VideoCaptureManager* MediaStreamManager::video_capture_manager() { | 59 VideoCaptureManager* MediaStreamManager::video_capture_manager() { |
| 62 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 60 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 63 return video_capture_manager_; | 61 if (!video_capture_manager_.get()) { |
| 62 video_capture_manager_.reset(new VideoCaptureManager()); |
| 63 video_capture_manager_->Register(this); |
| 64 } |
| 65 return video_capture_manager_.get(); |
| 64 } | 66 } |
| 65 | 67 |
| 66 void MediaStreamManager::GenerateStream(MediaStreamRequester* requester, | 68 void MediaStreamManager::GenerateStream(MediaStreamRequester* requester, |
| 67 int render_process_id, | 69 int render_process_id, |
| 68 int render_view_id, | 70 int render_view_id, |
| 69 const StreamOptions& options, | 71 const StreamOptions& options, |
| 70 const std::string& security_origin, | 72 const std::string& security_origin, |
| 71 std::string* label) { | 73 std::string* label) { |
| 72 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 74 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 73 | 75 |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 113 if (it->in_use == true) { | 115 if (it->in_use == true) { |
| 114 // TODO(mflodman) Add when audio input device manager is available. | 116 // TODO(mflodman) Add when audio input device manager is available. |
| 115 } | 117 } |
| 116 } | 118 } |
| 117 } | 119 } |
| 118 if (request->state[kVideoCapture] == DeviceRequest::kOpening) { | 120 if (request->state[kVideoCapture] == DeviceRequest::kOpening) { |
| 119 for (StreamDeviceInfoArray::iterator it = | 121 for (StreamDeviceInfoArray::iterator it = |
| 120 request->video_devices.begin(); it != request->video_devices.end(); | 122 request->video_devices.begin(); it != request->video_devices.end(); |
| 121 ++it) { | 123 ++it) { |
| 122 if (it->in_use == true) { | 124 if (it->in_use == true) { |
| 123 video_capture_manager_->Close(it->session_id); | 125 video_capture_manager()->Close(it->session_id); |
| 124 } | 126 } |
| 125 } | 127 } |
| 126 } | 128 } |
| 127 requests_.erase(it++); | 129 requests_.erase(it++); |
| 128 } else { | 130 } else { |
| 129 ++it; | 131 ++it; |
| 130 } | 132 } |
| 131 } | 133 } |
| 132 } | 134 } |
| 133 | 135 |
| 134 void MediaStreamManager::StopGeneratedStream(const std::string& label) { | 136 void MediaStreamManager::StopGeneratedStream(const std::string& label) { |
| 135 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 137 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 136 // Find the request and close all open devices for the request. | 138 // Find the request and close all open devices for the request. |
| 137 DeviceRequests::iterator it = requests_.find(label); | 139 DeviceRequests::iterator it = requests_.find(label); |
| 138 if (it != requests_.end()) { | 140 if (it != requests_.end()) { |
| 139 for (StreamDeviceInfoArray::iterator audio_it = | 141 for (StreamDeviceInfoArray::iterator audio_it = |
| 140 it->second.audio_devices.begin(); | 142 it->second.audio_devices.begin(); |
| 141 audio_it != it->second.audio_devices.end(); ++audio_it) { | 143 audio_it != it->second.audio_devices.end(); ++audio_it) { |
| 142 // TODO(mflodman) Add code when audio input manager exists. | 144 // TODO(mflodman) Add code when audio input manager exists. |
| 143 NOTREACHED(); | 145 NOTREACHED(); |
| 144 } | 146 } |
| 145 for (StreamDeviceInfoArray::iterator video_it = | 147 for (StreamDeviceInfoArray::iterator video_it = |
| 146 it->second.video_devices.begin(); | 148 it->second.video_devices.begin(); |
| 147 video_it != it->second.video_devices.end(); ++video_it) { | 149 video_it != it->second.video_devices.end(); ++video_it) { |
| 148 video_capture_manager_->Close(video_it->session_id); | 150 video_capture_manager()->Close(video_it->session_id); |
| 149 } | 151 } |
| 150 requests_.erase(it); | 152 requests_.erase(it); |
| 151 return; | 153 return; |
| 152 } | 154 } |
| 153 } | 155 } |
| 154 | 156 |
| 155 void MediaStreamManager::Opened(MediaStreamType stream_type, | 157 void MediaStreamManager::Opened(MediaStreamType stream_type, |
| 156 int capture_session_id) { | 158 int capture_session_id) { |
| 157 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 159 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 158 | 160 |
| (...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 347 DeviceRequests::iterator it = requests_.find(label); | 349 DeviceRequests::iterator it = requests_.find(label); |
| 348 if (it != requests_.end()) { | 350 if (it != requests_.end()) { |
| 349 it->second.requester->StreamGenerationFailed(label); | 351 it->second.requester->StreamGenerationFailed(label); |
| 350 requests_.erase(it); | 352 requests_.erase(it); |
| 351 return; | 353 return; |
| 352 } | 354 } |
| 353 } | 355 } |
| 354 | 356 |
| 355 void MediaStreamManager::UseFakeDevice() { | 357 void MediaStreamManager::UseFakeDevice() { |
| 356 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 358 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 357 video_capture_manager_->UseFakeDevice(); | 359 video_capture_manager()->UseFakeDevice(); |
| 358 device_settings_->UseFakeUI(); | 360 device_settings_->UseFakeUI(); |
| 359 // TODO(mflodman) Add audio manager when available. | 361 // TODO(mflodman) Add audio manager when available. |
| 360 } | 362 } |
| 361 | 363 |
| 362 bool MediaStreamManager::RequestDone(const DeviceRequest& request) const { | 364 bool MediaStreamManager::RequestDone(const DeviceRequest& request) const { |
| 363 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 365 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 364 // Check if all devices are opened. | 366 // Check if all devices are opened. |
| 365 if (Requested(request.options, kAudioCapture)) { | 367 if (Requested(request.options, kAudioCapture)) { |
| 366 for (StreamDeviceInfoArray::const_iterator it = | 368 for (StreamDeviceInfoArray::const_iterator it = |
| 367 request.audio_devices.begin(); it != request.audio_devices.end(); | 369 request.audio_devices.begin(); it != request.audio_devices.end(); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 378 if (it->in_use == false) { | 380 if (it->in_use == false) { |
| 379 return false; | 381 return false; |
| 380 } | 382 } |
| 381 } | 383 } |
| 382 } | 384 } |
| 383 return true; | 385 return true; |
| 384 } | 386 } |
| 385 | 387 |
| 386 // Called to get media capture device manager of specified type. | 388 // Called to get media capture device manager of specified type. |
| 387 MediaStreamProvider* MediaStreamManager::GetDeviceManager( | 389 MediaStreamProvider* MediaStreamManager::GetDeviceManager( |
| 388 MediaStreamType stream_type) const { | 390 MediaStreamType stream_type) { |
| 389 if (stream_type == kVideoCapture) { | 391 if (stream_type == kVideoCapture) { |
| 390 return video_capture_manager_; | 392 return video_capture_manager(); |
| 391 } else if (stream_type == kAudioCapture) { | 393 } else if (stream_type == kAudioCapture) { |
| 392 // TODO(mflodman) Add support when audio input manager is available. | 394 // TODO(mflodman) Add support when audio input manager is available. |
| 393 NOTREACHED(); | 395 NOTREACHED(); |
| 394 return NULL; | 396 return NULL; |
| 395 } | 397 } |
| 396 NOTREACHED(); | 398 NOTREACHED(); |
| 397 return NULL; | 399 return NULL; |
| 398 } | 400 } |
| 399 | 401 |
| 400 MediaStreamManager::MediaStreamManager() | |
| 401 : video_capture_manager_(new VideoCaptureManager()), | |
| 402 enumeration_in_progress_(kNumMediaStreamTypes, false), | |
| 403 requests_(), | |
| 404 device_settings_(NULL) { | |
| 405 device_settings_ = new MediaStreamDeviceSettings(this); | |
| 406 video_capture_manager_->Register(this); | |
| 407 // TODO(mflodman) Add when audio input manager is available. | |
| 408 } | |
| 409 | |
| 410 MediaStreamManager::DeviceRequest::DeviceRequest() | 402 MediaStreamManager::DeviceRequest::DeviceRequest() |
| 411 : requester(NULL), | 403 : requester(NULL), |
| 412 state(kNumMediaStreamTypes, kNotRequested) { | 404 state(kNumMediaStreamTypes, kNotRequested) { |
| 413 options.audio = false; | 405 options.audio = false; |
| 414 options.video_option = StreamOptions::kNoCamera; | 406 options.video_option = StreamOptions::kNoCamera; |
| 415 } | 407 } |
| 416 | 408 |
| 417 MediaStreamManager::DeviceRequest::DeviceRequest( | 409 MediaStreamManager::DeviceRequest::DeviceRequest( |
| 418 MediaStreamRequester* requester, const StreamOptions& request_options) | 410 MediaStreamRequester* requester, const StreamOptions& request_options) |
| 419 : requester(requester), | 411 : requester(requester), |
| 420 options(request_options), | 412 options(request_options), |
| 421 state(kNumMediaStreamTypes, kNotRequested) { | 413 state(kNumMediaStreamTypes, kNotRequested) { |
| 422 DCHECK(requester); | 414 DCHECK(requester); |
| 423 } | 415 } |
| 424 | 416 |
| 425 MediaStreamManager::DeviceRequest::~DeviceRequest() {} | 417 MediaStreamManager::DeviceRequest::~DeviceRequest() {} |
| 426 | 418 |
| 427 } // namespace media_stream | 419 } // namespace media_stream |
| OLD | NEW |