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

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

Issue 7649016: Removing singleton property of MediaStreamManager and creating thread first when needed. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years, 4 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) 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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698