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

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: Changing unit tests based on review by scherkus. Created 9 years, 3 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"
willchan no longer on Chromium 2011/08/26 17:10:13 Delete
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 : device_settings_(new MediaStreamDeviceSettings(this)),
willchan no longer on Chromium 2011/08/26 17:10:13 Don't you need ALLOW_THIS_IN_INITIALIZER_LIST and
50 enumeration_in_progress_(kNumMediaStreamTypes, false) {
51 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
54 } 52 }
55 53
56 MediaStreamManager::~MediaStreamManager() { 54 MediaStreamManager::~MediaStreamManager() {
57 delete device_settings_; 55 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
58 delete video_capture_manager_;
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));
63 return video_capture_manager_; 60 if (!video_capture_manager_.get()) {
61 video_capture_manager_.reset(new VideoCaptureManager());
62 video_capture_manager_->Register(this);
63 }
64 return video_capture_manager_.get();
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));
73 74
(...skipping 39 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
362 bool MediaStreamManager::RequestDone(const DeviceRequest& request) const { 363 bool MediaStreamManager::RequestDone(const DeviceRequest& request) const {
363 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 364 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
364 // Check if all devices are opened. 365 // Check if all devices are opened.
365 if (Requested(request.options, kAudioCapture)) { 366 if (Requested(request.options, kAudioCapture)) {
366 for (StreamDeviceInfoArray::const_iterator it = 367 for (StreamDeviceInfoArray::const_iterator it =
367 request.audio_devices.begin(); it != request.audio_devices.end(); 368 request.audio_devices.begin(); it != request.audio_devices.end();
(...skipping 10 matching lines...) Expand all
378 if (it->in_use == false) { 379 if (it->in_use == false) {
379 return false; 380 return false;
380 } 381 }
381 } 382 }
382 } 383 }
383 return true; 384 return true;
384 } 385 }
385 386
386 // Called to get media capture device manager of specified type. 387 // Called to get media capture device manager of specified type.
387 MediaStreamProvider* MediaStreamManager::GetDeviceManager( 388 MediaStreamProvider* MediaStreamManager::GetDeviceManager(
388 MediaStreamType stream_type) const { 389 MediaStreamType stream_type) {
389 if (stream_type == kVideoCapture) { 390 if (stream_type == kVideoCapture) {
390 return video_capture_manager_; 391 return video_capture_manager();
391 } else if (stream_type == kAudioCapture) { 392 } else if (stream_type == kAudioCapture) {
392 // TODO(mflodman) Add support when audio input manager is available. 393 // TODO(mflodman) Add support when audio input manager is available.
393 NOTREACHED(); 394 NOTREACHED();
394 return NULL; 395 return NULL;
395 } 396 }
396 NOTREACHED(); 397 NOTREACHED();
397 return NULL; 398 return NULL;
398 } 399 }
399 400
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() 401 MediaStreamManager::DeviceRequest::DeviceRequest()
411 : requester(NULL), 402 : requester(NULL),
412 state(kNumMediaStreamTypes, kNotRequested) { 403 state(kNumMediaStreamTypes, kNotRequested) {
413 options.audio = false; 404 options.audio = false;
414 options.video_option = StreamOptions::kNoCamera; 405 options.video_option = StreamOptions::kNoCamera;
415 } 406 }
416 407
417 MediaStreamManager::DeviceRequest::DeviceRequest( 408 MediaStreamManager::DeviceRequest::DeviceRequest(
418 MediaStreamRequester* requester, const StreamOptions& request_options) 409 MediaStreamRequester* requester, const StreamOptions& request_options)
419 : requester(requester), 410 : requester(requester),
420 options(request_options), 411 options(request_options),
421 state(kNumMediaStreamTypes, kNotRequested) { 412 state(kNumMediaStreamTypes, kNotRequested) {
422 DCHECK(requester); 413 DCHECK(requester);
423 } 414 }
424 415
425 MediaStreamManager::DeviceRequest::~DeviceRequest() {} 416 MediaStreamManager::DeviceRequest::~DeviceRequest() {}
426 417
427 } // namespace media_stream 418 } // namespace media_stream
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698