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

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: addressed Andrew and John's comments. Created 8 years, 5 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 stop and delete the device thread on blocking pool.
119 void ShutdownDeviceThread(base::Thread* thread) {
120 thread->Stop();
121 delete thread;
122 }
123
119 // static 124 // static
120 MediaStreamManager* MediaStreamManager::GetForResourceContext( 125 MediaStreamManager* MediaStreamManager::GetForResourceContext(
121 content::ResourceContext* resource_context, 126 content::ResourceContext* resource_context) {
122 media::AudioManager* audio_manager) {
123 MediaStreamManager* rv = static_cast<MediaStreamManager*>( 127 MediaStreamManager* rv = static_cast<MediaStreamManager*>(
124 resource_context->GetUserData(kMediaStreamManagerKeyName)); 128 resource_context->GetUserData(kMediaStreamManagerKeyName));
125 if (!rv) { 129 if (!rv) {
126 rv = new MediaStreamManager(audio_manager); 130 rv = new MediaStreamManager();
127 resource_context->SetUserData(kMediaStreamManagerKeyName, rv); 131 resource_context->SetUserData(kMediaStreamManagerKeyName, rv);
128 } 132 }
129 return rv; 133 return rv;
130 } 134 }
131 135
132 MediaStreamManager::MediaStreamManager(media::AudioManager* audio_manager) 136 MediaStreamManager::MediaStreamManager()
133 : ALLOW_THIS_IN_INITIALIZER_LIST( 137 : ALLOW_THIS_IN_INITIALIZER_LIST(
134 device_settings_(new MediaStreamDeviceSettings(this))), 138 device_settings_(new MediaStreamDeviceSettings(this))),
135 enumeration_in_progress_(content::NUM_MEDIA_STREAM_DEVICE_TYPES, false), 139 enumeration_in_progress_(content::NUM_MEDIA_STREAM_DEVICE_TYPES, false) {
136 audio_manager_(audio_manager) {
137 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 140 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
138 } 141 }
139 142
140 MediaStreamManager::~MediaStreamManager() { 143 MediaStreamManager::~MediaStreamManager() {
141 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 144 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
142 if (video_capture_manager_.get()) 145 if (video_capture_manager_.get())
143 video_capture_manager_->Unregister(); 146 video_capture_manager_->Unregister();
144 if (audio_input_device_manager_.get()) 147 if (audio_input_device_manager_.get())
145 audio_input_device_manager_->Unregister(); 148 audio_input_device_manager_->Unregister();
149
150 if (device_thread_.get()) {
151 content::BrowserThread::PostBlockingPoolTask(
152 FROM_HERE, base::Bind(&ShutdownDeviceThread, device_thread_.release()));
153 }
146 } 154 }
147 155
148 VideoCaptureManager* MediaStreamManager::video_capture_manager() { 156 VideoCaptureManager* MediaStreamManager::video_capture_manager() {
149 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 157 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
158 EnsureDeviceThread();
150 if (!video_capture_manager_.get()) { 159 if (!video_capture_manager_.get()) {
151 video_capture_manager_ = new VideoCaptureManager(); 160 video_capture_manager_ = new VideoCaptureManager(GetMessageLoop());
152 video_capture_manager_->Register(this); 161 video_capture_manager_->Register(this);
153 } 162 }
154 return video_capture_manager_.get(); 163 return video_capture_manager_.get();
155 } 164 }
156 165
157 AudioInputDeviceManager* MediaStreamManager::audio_input_device_manager() { 166 AudioInputDeviceManager* MediaStreamManager::audio_input_device_manager() {
158 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 167 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
168 EnsureDeviceThread();
159 if (!audio_input_device_manager_.get()) { 169 if (!audio_input_device_manager_.get()) {
160 audio_input_device_manager_ = new AudioInputDeviceManager(audio_manager_); 170 audio_input_device_manager_ = new AudioInputDeviceManager(
171 GetMessageLoop());
161 audio_input_device_manager_->Register(this); 172 audio_input_device_manager_->Register(this);
162 } 173 }
163 return audio_input_device_manager_.get(); 174 return audio_input_device_manager_.get();
164 } 175 }
165 176
166 void MediaStreamManager::GenerateStream(MediaStreamRequester* requester, 177 void MediaStreamManager::GenerateStream(MediaStreamRequester* requester,
167 int render_process_id, 178 int render_process_id,
168 int render_view_id, 179 int render_view_id,
169 const StreamOptions& options, 180 const StreamOptions& options,
170 const GURL& security_origin, 181 const GURL& security_origin,
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
360 base::Bind(&MediaStreamDeviceSettings::RequestCaptureDeviceUsage, 371 base::Bind(&MediaStreamDeviceSettings::RequestCaptureDeviceUsage,
361 base::Unretained(device_settings_.get()), 372 base::Unretained(device_settings_.get()),
362 request_label, new_request->render_process_id, 373 request_label, new_request->render_process_id,
363 new_request->render_view_id, new_request->options, 374 new_request->render_view_id, new_request->options,
364 new_request->security_origin)); 375 new_request->security_origin));
365 } 376 }
366 377
367 (*label) = request_label; 378 (*label) = request_label;
368 } 379 }
369 380
381 void MediaStreamManager::EnsureDeviceThread() {
382 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
383 if (device_thread_.get())
384 return;
385
386 device_thread_.reset(new base::Thread("MediaStreamDeviceThread"));
387 CHECK(device_thread_->Start());
388 }
389
370 void MediaStreamManager::Opened(MediaStreamType stream_type, 390 void MediaStreamManager::Opened(MediaStreamType stream_type,
371 int capture_session_id) { 391 int capture_session_id) {
372 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 392 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
373 393
374 // Find the request containing this device and mark it as used. 394 // Find the request containing this device and mark it as used.
375 DeviceRequest* request = NULL; 395 DeviceRequest* request = NULL;
376 StreamDeviceInfoArray* devices = NULL; 396 StreamDeviceInfoArray* devices = NULL;
377 std::string label; 397 std::string label;
378 for (DeviceRequests::iterator request_it = requests_.begin(); 398 for (DeviceRequests::iterator request_it = requests_.begin();
379 request_it != requests_.end() && request == NULL; ++request_it) { 399 request_it != requests_.end() && request == NULL; ++request_it) {
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after
606 return; 626 return;
607 } 627 }
608 } 628 }
609 629
610 void MediaStreamManager::UseFakeDevice() { 630 void MediaStreamManager::UseFakeDevice() {
611 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 631 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
612 video_capture_manager()->UseFakeDevice(); 632 video_capture_manager()->UseFakeDevice();
613 device_settings_->UseFakeUI(); 633 device_settings_->UseFakeUI();
614 } 634 }
615 635
636 scoped_refptr<base::MessageLoopProxy> MediaStreamManager::GetMessageLoop() {
scherkus (not reviewing) 2012/06/28 01:24:20 it still seems unfortunate to expose this for the
637 return device_thread_.get() ? device_thread_->message_loop_proxy() : NULL;
638 }
639
616 void MediaStreamManager::NotifyObserverDevicesOpened(DeviceRequest* request) { 640 void MediaStreamManager::NotifyObserverDevicesOpened(DeviceRequest* request) {
617 content::MediaObserver* media_observer = 641 content::MediaObserver* media_observer =
618 content::GetContentClient()->browser()->GetMediaObserver(); 642 content::GetContentClient()->browser()->GetMediaObserver();
619 content::MediaStreamDevices opened_devices; 643 content::MediaStreamDevices opened_devices;
620 DevicesFromRequest(request, &opened_devices); 644 DevicesFromRequest(request, &opened_devices);
621 DCHECK(!opened_devices.empty()); 645 DCHECK(!opened_devices.empty());
622 media_observer->OnCaptureDevicesOpened(request->render_process_id, 646 media_observer->OnCaptureDevicesOpened(request->render_process_id,
623 request->render_view_id, 647 request->render_view_id,
624 opened_devices); 648 opened_devices);
625 } 649 }
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
688 if (stream_type == content::MEDIA_STREAM_DEVICE_TYPE_VIDEO_CAPTURE) { 712 if (stream_type == content::MEDIA_STREAM_DEVICE_TYPE_VIDEO_CAPTURE) {
689 return video_capture_manager(); 713 return video_capture_manager();
690 } else if (stream_type == content::MEDIA_STREAM_DEVICE_TYPE_AUDIO_CAPTURE) { 714 } else if (stream_type == content::MEDIA_STREAM_DEVICE_TYPE_AUDIO_CAPTURE) {
691 return audio_input_device_manager(); 715 return audio_input_device_manager();
692 } 716 }
693 NOTREACHED(); 717 NOTREACHED();
694 return NULL; 718 return NULL;
695 } 719 }
696 720
697 } // namespace media_stream 721 } // namespace media_stream
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698