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/lazy_instance.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 : video_capture_manager_(NULL), |
54 } | 50 enumeration_in_progress_(kNumMediaStreamTypes, false), |
55 | 51 requests_(), |
56 MediaStreamManager::~MediaStreamManager() { | 52 device_settings_(NULL) { |
57 delete device_settings_; | 53 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
58 delete video_capture_manager_; | 54 device_settings_ = new MediaStreamDeviceSettings(this); |
55 // TODO(mflodman) Add when audio input manager is available. | |
59 } | 56 } |
60 | 57 |
61 VideoCaptureManager* MediaStreamManager::video_capture_manager() { | 58 VideoCaptureManager* MediaStreamManager::video_capture_manager() { |
62 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 59 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
60 if (!video_capture_manager_) { | |
61 video_capture_manager_ = new VideoCaptureManager(); | |
62 video_capture_manager_->Register(this); | |
63 } | |
63 return video_capture_manager_; | 64 return video_capture_manager_; |
64 } | 65 } |
65 | 66 |
66 void MediaStreamManager::GenerateStream(MediaStreamRequester* requester, | 67 void MediaStreamManager::GenerateStream(MediaStreamRequester* requester, |
67 int render_process_id, | 68 int render_process_id, |
68 int render_view_id, | 69 int render_view_id, |
69 const StreamOptions& options, | 70 const StreamOptions& options, |
70 const std::string& security_origin, | 71 const std::string& security_origin, |
71 std::string* label) { | 72 std::string* label) { |
72 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 73 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
113 if (it->in_use == true) { | 114 if (it->in_use == true) { |
114 // TODO(mflodman) Add when audio input device manager is available. | 115 // TODO(mflodman) Add when audio input device manager is available. |
115 } | 116 } |
116 } | 117 } |
117 } | 118 } |
118 if (request->state[kVideoCapture] == DeviceRequest::kOpening) { | 119 if (request->state[kVideoCapture] == DeviceRequest::kOpening) { |
119 for (StreamDeviceInfoArray::iterator it = | 120 for (StreamDeviceInfoArray::iterator it = |
120 request->video_devices.begin(); it != request->video_devices.end(); | 121 request->video_devices.begin(); it != request->video_devices.end(); |
121 ++it) { | 122 ++it) { |
122 if (it->in_use == true) { | 123 if (it->in_use == true) { |
123 video_capture_manager_->Close(it->session_id); | 124 video_capture_manager()->Close(it->session_id); |
124 } | 125 } |
125 } | 126 } |
126 } | 127 } |
127 requests_.erase(it++); | 128 requests_.erase(it++); |
128 } else { | 129 } else { |
129 ++it; | 130 ++it; |
130 } | 131 } |
131 } | 132 } |
132 } | 133 } |
133 | 134 |
134 void MediaStreamManager::StopGeneratedStream(const std::string& label) { | 135 void MediaStreamManager::StopGeneratedStream(const std::string& label) { |
135 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 136 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
136 // Find the request and close all open devices for the request. | 137 // Find the request and close all open devices for the request. |
137 DeviceRequests::iterator it = requests_.find(label); | 138 DeviceRequests::iterator it = requests_.find(label); |
138 if (it != requests_.end()) { | 139 if (it != requests_.end()) { |
139 for (StreamDeviceInfoArray::iterator audio_it = | 140 for (StreamDeviceInfoArray::iterator audio_it = |
140 it->second.audio_devices.begin(); | 141 it->second.audio_devices.begin(); |
141 audio_it != it->second.audio_devices.end(); ++audio_it) { | 142 audio_it != it->second.audio_devices.end(); ++audio_it) { |
142 // TODO(mflodman) Add code when audio input manager exists. | 143 // TODO(mflodman) Add code when audio input manager exists. |
143 NOTREACHED(); | 144 NOTREACHED(); |
144 } | 145 } |
145 for (StreamDeviceInfoArray::iterator video_it = | 146 for (StreamDeviceInfoArray::iterator video_it = |
146 it->second.video_devices.begin(); | 147 it->second.video_devices.begin(); |
147 video_it != it->second.video_devices.end(); ++video_it) { | 148 video_it != it->second.video_devices.end(); ++video_it) { |
148 video_capture_manager_->Close(video_it->session_id); | 149 video_capture_manager()->Close(video_it->session_id); |
149 } | 150 } |
150 requests_.erase(it); | 151 requests_.erase(it); |
151 return; | 152 return; |
152 } | 153 } |
153 } | 154 } |
154 | 155 |
155 void MediaStreamManager::Opened(MediaStreamType stream_type, | 156 void MediaStreamManager::Opened(MediaStreamType stream_type, |
156 int capture_session_id) { | 157 int capture_session_id) { |
157 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 158 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
158 | 159 |
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
347 DeviceRequests::iterator it = requests_.find(label); | 348 DeviceRequests::iterator it = requests_.find(label); |
348 if (it != requests_.end()) { | 349 if (it != requests_.end()) { |
349 it->second.requester->StreamGenerationFailed(label); | 350 it->second.requester->StreamGenerationFailed(label); |
350 requests_.erase(it); | 351 requests_.erase(it); |
351 return; | 352 return; |
352 } | 353 } |
353 } | 354 } |
354 | 355 |
355 void MediaStreamManager::UseFakeDevice() { | 356 void MediaStreamManager::UseFakeDevice() { |
356 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 357 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
357 video_capture_manager_->UseFakeDevice(); | 358 video_capture_manager()->UseFakeDevice(); |
358 device_settings_->UseFakeUI(); | 359 device_settings_->UseFakeUI(); |
359 // TODO(mflodman) Add audio manager when available. | 360 // TODO(mflodman) Add audio manager when available. |
360 } | 361 } |
361 | 362 |
363 MediaStreamManager::~MediaStreamManager() { | |
364 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | |
365 delete device_settings_; | |
willchan no longer on Chromium
2011/08/17 19:55:19
What do you think about using scoped_ptr instead?
mflodman_chromium_OOO
2011/08/19 11:07:09
Done.
I've received that comment from scherkus as
| |
366 delete video_capture_manager_; | |
367 } | |
368 | |
362 bool MediaStreamManager::RequestDone(const DeviceRequest& request) const { | 369 bool MediaStreamManager::RequestDone(const DeviceRequest& request) const { |
363 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 370 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
364 // Check if all devices are opened. | 371 // Check if all devices are opened. |
365 if (Requested(request.options, kAudioCapture)) { | 372 if (Requested(request.options, kAudioCapture)) { |
366 for (StreamDeviceInfoArray::const_iterator it = | 373 for (StreamDeviceInfoArray::const_iterator it = |
367 request.audio_devices.begin(); it != request.audio_devices.end(); | 374 request.audio_devices.begin(); it != request.audio_devices.end(); |
368 ++it) { | 375 ++it) { |
369 if (it->in_use == false) { | 376 if (it->in_use == false) { |
370 return false; | 377 return false; |
371 } | 378 } |
372 } | 379 } |
373 } | 380 } |
374 if (Requested(request.options, kVideoCapture)) { | 381 if (Requested(request.options, kVideoCapture)) { |
375 for (StreamDeviceInfoArray::const_iterator it = | 382 for (StreamDeviceInfoArray::const_iterator it = |
376 request.video_devices.begin(); it != request.video_devices.end(); | 383 request.video_devices.begin(); it != request.video_devices.end(); |
377 ++it) { | 384 ++it) { |
378 if (it->in_use == false) { | 385 if (it->in_use == false) { |
379 return false; | 386 return false; |
380 } | 387 } |
381 } | 388 } |
382 } | 389 } |
383 return true; | 390 return true; |
384 } | 391 } |
385 | 392 |
386 // Called to get media capture device manager of specified type. | 393 // Called to get media capture device manager of specified type. |
387 MediaStreamProvider* MediaStreamManager::GetDeviceManager( | 394 MediaStreamProvider* MediaStreamManager::GetDeviceManager( |
388 MediaStreamType stream_type) const { | 395 MediaStreamType stream_type) { |
389 if (stream_type == kVideoCapture) { | 396 if (stream_type == kVideoCapture) { |
390 return video_capture_manager_; | 397 return video_capture_manager(); |
391 } else if (stream_type == kAudioCapture) { | 398 } else if (stream_type == kAudioCapture) { |
392 // TODO(mflodman) Add support when audio input manager is available. | 399 // TODO(mflodman) Add support when audio input manager is available. |
393 NOTREACHED(); | 400 NOTREACHED(); |
394 return NULL; | 401 return NULL; |
395 } | 402 } |
396 NOTREACHED(); | 403 NOTREACHED(); |
397 return NULL; | 404 return NULL; |
398 } | 405 } |
399 | 406 |
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() | 407 MediaStreamManager::DeviceRequest::DeviceRequest() |
411 : requester(NULL), | 408 : requester(NULL), |
412 state(kNumMediaStreamTypes, kNotRequested) { | 409 state(kNumMediaStreamTypes, kNotRequested) { |
413 options.audio = false; | 410 options.audio = false; |
414 options.video_option = StreamOptions::kNoCamera; | 411 options.video_option = StreamOptions::kNoCamera; |
415 } | 412 } |
416 | 413 |
417 MediaStreamManager::DeviceRequest::DeviceRequest( | 414 MediaStreamManager::DeviceRequest::DeviceRequest( |
418 MediaStreamRequester* requester, const StreamOptions& request_options) | 415 MediaStreamRequester* requester, const StreamOptions& request_options) |
419 : requester(requester), | 416 : requester(requester), |
420 options(request_options), | 417 options(request_options), |
421 state(kNumMediaStreamTypes, kNotRequested) { | 418 state(kNumMediaStreamTypes, kNotRequested) { |
422 DCHECK(requester); | 419 DCHECK(requester); |
423 } | 420 } |
424 | 421 |
425 MediaStreamManager::DeviceRequest::~DeviceRequest() {} | 422 MediaStreamManager::DeviceRequest::~DeviceRequest() {} |
426 | 423 |
427 } // namespace media_stream | 424 } // namespace media_stream |
OLD | NEW |