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

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

Issue 10662049: Move the device enumerate/open/close work to device thread from IO thread (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: ready for review. Created 8 years, 6 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) 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/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/bind.h" 9 #include "base/bind.h"
10 #include "base/compiler_specific.h" 10 #include "base/compiler_specific.h"
11 #include "base/logging.h" 11 #include "base/logging.h"
12 #include "base/rand_util.h" 12 #include "base/rand_util.h"
13 #include "content/browser/renderer_host/media/audio_input_device_manager.h" 13 #include "content/browser/renderer_host/media/audio_input_device_manager.h"
14 #include "content/browser/renderer_host/media/media_stream_device_settings.h" 14 #include "content/browser/renderer_host/media/media_stream_device_settings.h"
15 #include "content/browser/renderer_host/media/media_stream_requester.h" 15 #include "content/browser/renderer_host/media/media_stream_requester.h"
16 #include "content/browser/renderer_host/media/video_capture_manager.h" 16 #include "content/browser/renderer_host/media/video_capture_manager.h"
17 #include "content/browser/resource_context_impl.h" 17 #include "content/browser/resource_context_impl.h"
18 #include "content/common/media/media_stream_options.h" 18 #include "content/common/media/media_stream_options.h"
19 #include "content/public/browser/browser_thread.h" 19 #include "content/public/browser/browser_thread.h"
20 #include "content/public/browser/content_browser_client.h" 20 #include "content/public/browser/content_browser_client.h"
21 #include "content/public/browser/media_observer.h" 21 #include "content/public/browser/media_observer.h"
22 #include "googleurl/src/gurl.h" 22 #include "googleurl/src/gurl.h"
23 #include "media/audio/audio_manager.h"
24 23
25 using content::BrowserThread; 24 using content::BrowserThread;
26 25
27 static const char* kMediaStreamManagerKeyName = "content_media_stream_manager"; 26 static const char* kMediaStreamManagerKeyName = "content_media_stream_manager";
28 27
29 namespace media_stream { 28 namespace media_stream {
30 29
31 // Creates a random label used to identify requests. 30 // Creates a random label used to identify requests.
32 static std::string RandomLabel() { 31 static std::string RandomLabel() {
33 // An earlier PeerConnection spec, 32 // An earlier PeerConnection spec,
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
109 std::vector<RequestState> state; 108 std::vector<RequestState> state;
110 RequestType type; 109 RequestType type;
111 int render_process_id; 110 int render_process_id;
112 int render_view_id; 111 int render_view_id;
113 GURL security_origin; 112 GURL security_origin;
114 std::string requested_device_id; 113 std::string requested_device_id;
115 StreamDeviceInfoArray audio_devices; 114 StreamDeviceInfoArray audio_devices;
116 StreamDeviceInfoArray video_devices; 115 StreamDeviceInfoArray video_devices;
117 }; 116 };
118 117
118 // Static function to delete the device thread on FILE thread.
119 void ShutdownOnFileThread(base::Thread* thread) {
120 DCHECK(thread);
jam 2012/06/26 22:32:01 nit: unnecessary, if it's NULL the next line will
no longer working on chromium 2012/06/27 14:07:16 Done.
121 thread->Stop();
122 delete thread;
123 }
124
119 // static 125 // static
120 MediaStreamManager* MediaStreamManager::GetForResourceContext( 126 MediaStreamManager* MediaStreamManager::GetForResourceContext(
121 content::ResourceContext* resource_context, 127 content::ResourceContext* resource_context) {
122 media::AudioManager* audio_manager) {
123 MediaStreamManager* rv = static_cast<MediaStreamManager*>( 128 MediaStreamManager* rv = static_cast<MediaStreamManager*>(
124 resource_context->GetUserData(kMediaStreamManagerKeyName)); 129 resource_context->GetUserData(kMediaStreamManagerKeyName));
125 if (!rv) { 130 if (!rv) {
126 rv = new MediaStreamManager(audio_manager); 131 rv = new MediaStreamManager();
127 resource_context->SetUserData(kMediaStreamManagerKeyName, rv); 132 resource_context->SetUserData(kMediaStreamManagerKeyName, rv);
128 } 133 }
129 return rv; 134 return rv;
130 } 135 }
131 136
132 MediaStreamManager::MediaStreamManager(media::AudioManager* audio_manager) 137 MediaStreamManager::MediaStreamManager()
133 : ALLOW_THIS_IN_INITIALIZER_LIST( 138 : ALLOW_THIS_IN_INITIALIZER_LIST(
134 device_settings_(new MediaStreamDeviceSettings(this))), 139 device_settings_(new MediaStreamDeviceSettings(this))),
135 enumeration_in_progress_(content::NUM_MEDIA_STREAM_DEVICE_TYPES, false), 140 enumeration_in_progress_(content::NUM_MEDIA_STREAM_DEVICE_TYPES, false) {
136 audio_manager_(audio_manager) {
137 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 141 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
138 } 142 }
139 143
140 MediaStreamManager::~MediaStreamManager() { 144 MediaStreamManager::~MediaStreamManager() {
141 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 145 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
142 if (video_capture_manager_.get()) 146 if (video_capture_manager_.get())
143 video_capture_manager_->Unregister(); 147 video_capture_manager_->Unregister();
144 if (audio_input_device_manager_.get()) 148 if (audio_input_device_manager_.get())
145 audio_input_device_manager_->Unregister(); 149 audio_input_device_manager_->Unregister();
150
151 if (device_thread_.get()) {
152 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE,
jam 2012/06/26 22:32:01 nit: instead of the FILE thread, I would use the b
no longer working on chromium 2012/06/27 14:07:16 Great idea. Thanks for pointing out. Do you know i
jam 2012/06/27 16:13:14 it uses multiple threads. you can pass in a token
153 base::Bind(&ShutdownOnFileThread,
154 device_thread_.release()));
155 }
146 } 156 }
147 157
148 VideoCaptureManager* MediaStreamManager::video_capture_manager() { 158 VideoCaptureManager* MediaStreamManager::video_capture_manager() {
149 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 159 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
160 EnsureDeviceThread();
150 if (!video_capture_manager_.get()) { 161 if (!video_capture_manager_.get()) {
151 video_capture_manager_ = new VideoCaptureManager(); 162 video_capture_manager_ = new VideoCaptureManager(GetMessageLoop());
152 video_capture_manager_->Register(this); 163 video_capture_manager_->Register(this);
153 } 164 }
154 return video_capture_manager_.get(); 165 return video_capture_manager_.get();
155 } 166 }
156 167
157 AudioInputDeviceManager* MediaStreamManager::audio_input_device_manager() { 168 AudioInputDeviceManager* MediaStreamManager::audio_input_device_manager() {
158 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 169 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
170 EnsureDeviceThread();
159 if (!audio_input_device_manager_.get()) { 171 if (!audio_input_device_manager_.get()) {
160 audio_input_device_manager_ = new AudioInputDeviceManager(audio_manager_); 172 audio_input_device_manager_ = new AudioInputDeviceManager(
173 GetMessageLoop());
161 audio_input_device_manager_->Register(this); 174 audio_input_device_manager_->Register(this);
162 } 175 }
163 return audio_input_device_manager_.get(); 176 return audio_input_device_manager_.get();
164 } 177 }
165 178
166 void MediaStreamManager::GenerateStream(MediaStreamRequester* requester, 179 void MediaStreamManager::GenerateStream(MediaStreamRequester* requester,
167 int render_process_id, 180 int render_process_id,
168 int render_view_id, 181 int render_view_id,
169 const StreamOptions& options, 182 const StreamOptions& options,
170 const GURL& security_origin, 183 const GURL& security_origin,
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
360 base::Bind(&MediaStreamDeviceSettings::RequestCaptureDeviceUsage, 373 base::Bind(&MediaStreamDeviceSettings::RequestCaptureDeviceUsage,
361 base::Unretained(device_settings_.get()), 374 base::Unretained(device_settings_.get()),
362 request_label, new_request->render_process_id, 375 request_label, new_request->render_process_id,
363 new_request->render_view_id, new_request->options, 376 new_request->render_view_id, new_request->options,
364 new_request->security_origin)); 377 new_request->security_origin));
365 } 378 }
366 379
367 (*label) = request_label; 380 (*label) = request_label;
368 } 381 }
369 382
383 void MediaStreamManager::EnsureDeviceThread() {
384 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
385 if (device_thread_.get())
386 return;
387
388 device_thread_.reset(new base::Thread("MediaStreamDeviceThread"));
389 CHECK(device_thread_->Start());
390 }
391
370 void MediaStreamManager::Opened(MediaStreamType stream_type, 392 void MediaStreamManager::Opened(MediaStreamType stream_type,
371 int capture_session_id) { 393 int capture_session_id) {
372 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 394 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
373 395
374 // Find the request containing this device and mark it as used. 396 // Find the request containing this device and mark it as used.
375 DeviceRequest* request = NULL; 397 DeviceRequest* request = NULL;
376 StreamDeviceInfoArray* devices = NULL; 398 StreamDeviceInfoArray* devices = NULL;
377 std::string label; 399 std::string label;
378 for (DeviceRequests::iterator request_it = requests_.begin(); 400 for (DeviceRequests::iterator request_it = requests_.begin();
379 request_it != requests_.end() && request == NULL; ++request_it) { 401 request_it != requests_.end() && request == NULL; ++request_it) {
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after
606 return; 628 return;
607 } 629 }
608 } 630 }
609 631
610 void MediaStreamManager::UseFakeDevice() { 632 void MediaStreamManager::UseFakeDevice() {
611 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 633 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
612 video_capture_manager()->UseFakeDevice(); 634 video_capture_manager()->UseFakeDevice();
613 device_settings_->UseFakeUI(); 635 device_settings_->UseFakeUI();
614 } 636 }
615 637
638 scoped_refptr<base::MessageLoopProxy> MediaStreamManager::GetMessageLoop() {
639 return device_thread_.get() ? device_thread_->message_loop_proxy() : NULL;
scherkus (not reviewing) 2012/06/27 00:52:31 I don't think you need this method as in both call
no longer working on chromium 2012/06/27 14:07:16 It is mainly for media_stream_dispatch_host_unitte
640 }
641
616 void MediaStreamManager::NotifyObserverDevicesOpened(DeviceRequest* request) { 642 void MediaStreamManager::NotifyObserverDevicesOpened(DeviceRequest* request) {
617 content::MediaObserver* media_observer = 643 content::MediaObserver* media_observer =
618 content::GetContentClient()->browser()->GetMediaObserver(); 644 content::GetContentClient()->browser()->GetMediaObserver();
619 content::MediaStreamDevices opened_devices; 645 content::MediaStreamDevices opened_devices;
620 DevicesFromRequest(request, &opened_devices); 646 DevicesFromRequest(request, &opened_devices);
621 DCHECK(!opened_devices.empty()); 647 DCHECK(!opened_devices.empty());
622 media_observer->OnCaptureDevicesOpened(request->render_process_id, 648 media_observer->OnCaptureDevicesOpened(request->render_process_id,
623 request->render_view_id, 649 request->render_view_id,
624 opened_devices); 650 opened_devices);
625 } 651 }
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
688 if (stream_type == content::MEDIA_STREAM_DEVICE_TYPE_VIDEO_CAPTURE) { 714 if (stream_type == content::MEDIA_STREAM_DEVICE_TYPE_VIDEO_CAPTURE) {
689 return video_capture_manager(); 715 return video_capture_manager();
690 } else if (stream_type == content::MEDIA_STREAM_DEVICE_TYPE_AUDIO_CAPTURE) { 716 } else if (stream_type == content::MEDIA_STREAM_DEVICE_TYPE_AUDIO_CAPTURE) {
691 return audio_input_device_manager(); 717 return audio_input_device_manager();
692 } 718 }
693 NOTREACHED(); 719 NOTREACHED();
694 return NULL; 720 return NULL;
695 } 721 }
696 722
697 } // namespace media_stream 723 } // namespace media_stream
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698