| 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/video_capture_manager.h" | 5 #include "content/browser/renderer_host/media/video_capture_manager.h" |
| 6 | 6 |
| 7 #include "base/memory/scoped_ptr.h" | 7 #include "base/memory/scoped_ptr.h" |
| 8 #include "content/browser/browser_thread.h" | 8 #include "content/browser/browser_thread.h" |
| 9 #include "media/video/capture/fake_video_capture_device.h" | 9 #include "media/video/capture/fake_video_capture_device.h" |
| 10 #include "media/video/capture/video_capture_device.h" | 10 #include "media/video/capture/video_capture_device.h" |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 55 vc_device_thread_.message_loop()->PostTask( | 55 vc_device_thread_.message_loop()->PostTask( |
| 56 FROM_HERE, | 56 FROM_HERE, |
| 57 NewRunnableMethod(this, | 57 NewRunnableMethod(this, |
| 58 &VideoCaptureManager::OnEnumerateDevices)); | 58 &VideoCaptureManager::OnEnumerateDevices)); |
| 59 } | 59 } |
| 60 | 60 |
| 61 int VideoCaptureManager::Open(const StreamDeviceInfo& device) { | 61 int VideoCaptureManager::Open(const StreamDeviceInfo& device) { |
| 62 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 62 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 63 DCHECK(listener_); | 63 DCHECK(listener_); |
| 64 | 64 |
| 65 // Generate a new id for this device | 65 // Generate a new id for this device. |
| 66 int video_capture_session_id = new_capture_session_id_++; | 66 int video_capture_session_id = new_capture_session_id_++; |
| 67 | 67 |
| 68 vc_device_thread_.message_loop()->PostTask( | 68 vc_device_thread_.message_loop()->PostTask( |
| 69 FROM_HERE, | 69 FROM_HERE, |
| 70 NewRunnableMethod(this, | 70 NewRunnableMethod(this, |
| 71 &VideoCaptureManager::OnOpen, | 71 &VideoCaptureManager::OnOpen, |
| 72 video_capture_session_id, | 72 video_capture_session_id, |
| 73 device)); | 73 device)); |
| 74 | 74 |
| 75 return video_capture_session_id; | 75 return video_capture_session_id; |
| (...skipping 17 matching lines...) Expand all Loading... |
| 93 | 93 |
| 94 vc_device_thread_.message_loop()->PostTask( | 94 vc_device_thread_.message_loop()->PostTask( |
| 95 FROM_HERE, | 95 FROM_HERE, |
| 96 NewRunnableMethod(this, | 96 NewRunnableMethod(this, |
| 97 &VideoCaptureManager::OnStart, | 97 &VideoCaptureManager::OnStart, |
| 98 capture_params, | 98 capture_params, |
| 99 video_capture_receiver)); | 99 video_capture_receiver)); |
| 100 } | 100 } |
| 101 | 101 |
| 102 void VideoCaptureManager::Stop( | 102 void VideoCaptureManager::Stop( |
| 103 const media::VideoCaptureSessionId capture_session_id, Task* stopped_task) { | 103 const media::VideoCaptureSessionId& capture_session_id, |
| 104 Task* stopped_task) { |
| 104 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 105 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 105 | 106 |
| 106 vc_device_thread_.message_loop()->PostTask( | 107 vc_device_thread_.message_loop()->PostTask( |
| 107 FROM_HERE, | 108 FROM_HERE, |
| 108 NewRunnableMethod(this, | 109 NewRunnableMethod(this, |
| 109 &VideoCaptureManager::OnStop, | 110 &VideoCaptureManager::OnStop, |
| 110 capture_session_id, | 111 capture_session_id, |
| 111 stopped_task)); | 112 stopped_task)); |
| 112 } | 113 } |
| 113 | 114 |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 146 DCHECK(IsOnCaptureDeviceThread()); | 147 DCHECK(IsOnCaptureDeviceThread()); |
| 147 DCHECK(devices_.find(capture_session_id) == devices_.end()); | 148 DCHECK(devices_.find(capture_session_id) == devices_.end()); |
| 148 | 149 |
| 149 // Check if another session has already opened this device, only one user per | 150 // Check if another session has already opened this device, only one user per |
| 150 // device is supported. | 151 // device is supported. |
| 151 if (DeviceOpened(device)) { | 152 if (DeviceOpened(device)) { |
| 152 PostOnError(capture_session_id, kDeviceAlreadyInUse); | 153 PostOnError(capture_session_id, kDeviceAlreadyInUse); |
| 153 return; | 154 return; |
| 154 } | 155 } |
| 155 | 156 |
| 156 // Open the device | 157 // Open the device. |
| 157 media::VideoCaptureDevice::Name vc_device_name; | 158 media::VideoCaptureDevice::Name vc_device_name; |
| 158 vc_device_name.device_name = device.name; | 159 vc_device_name.device_name = device.name; |
| 159 vc_device_name.unique_id = device.device_id; | 160 vc_device_name.unique_id = device.device_id; |
| 160 | 161 |
| 161 media::VideoCaptureDevice* video_capture_device = NULL; | 162 media::VideoCaptureDevice* video_capture_device = NULL; |
| 162 if (!use_fake_device_) { | 163 if (!use_fake_device_) { |
| 163 video_capture_device = media::VideoCaptureDevice::Create(vc_device_name); | 164 video_capture_device = media::VideoCaptureDevice::Create(vc_device_name); |
| 164 } else { | 165 } else { |
| 165 video_capture_device = | 166 video_capture_device = |
| 166 media::FakeVideoCaptureDevice::Create(vc_device_name); | 167 media::FakeVideoCaptureDevice::Create(vc_device_name); |
| 167 } | 168 } |
| 168 if (video_capture_device == NULL) { | 169 if (!video_capture_device) { |
| 169 PostOnError(capture_session_id, kDeviceNotAvailable); | 170 PostOnError(capture_session_id, kDeviceNotAvailable); |
| 170 return; | 171 return; |
| 171 } | 172 } |
| 172 | 173 |
| 173 devices_[capture_session_id] = video_capture_device; | 174 devices_[capture_session_id] = video_capture_device; |
| 174 PostOnOpened(capture_session_id); | 175 PostOnOpened(capture_session_id); |
| 175 } | 176 } |
| 176 | 177 |
| 177 void VideoCaptureManager::OnClose(int capture_session_id) { | 178 void VideoCaptureManager::OnClose(int capture_session_id) { |
| 178 DCHECK(IsOnCaptureDeviceThread()); | 179 DCHECK(IsOnCaptureDeviceThread()); |
| 179 | 180 |
| 180 VideoCaptureDevices::iterator it = devices_.find(capture_session_id); | 181 VideoCaptureDevices::iterator it = devices_.find(capture_session_id); |
| 181 if (it != devices_.end()) { | 182 if (it != devices_.end()) { |
| 182 // Deallocate (if not done already) and delete the device | 183 // Deallocate (if not done already) and delete the device. |
| 183 media::VideoCaptureDevice* video_capture_device = it->second; | 184 media::VideoCaptureDevice* video_capture_device = it->second; |
| 184 video_capture_device->DeAllocate(); | 185 video_capture_device->DeAllocate(); |
| 185 delete video_capture_device; | 186 delete video_capture_device; |
| 186 devices_.erase(it); | 187 devices_.erase(it); |
| 187 } | 188 } |
| 188 | 189 |
| 189 PostOnClosed(capture_session_id); | 190 PostOnClosed(capture_session_id); |
| 190 } | 191 } |
| 191 | 192 |
| 192 void VideoCaptureManager::OnStart( | 193 void VideoCaptureManager::OnStart( |
| 193 const media::VideoCaptureParams capture_params, | 194 const media::VideoCaptureParams capture_params, |
| 194 media::VideoCaptureDevice::EventHandler* video_capture_receiver) { | 195 media::VideoCaptureDevice::EventHandler* video_capture_receiver) { |
| 195 DCHECK(IsOnCaptureDeviceThread()); | 196 DCHECK(IsOnCaptureDeviceThread()); |
| 196 DCHECK(video_capture_receiver != NULL); | 197 DCHECK(video_capture_receiver != NULL); |
| 197 | 198 |
| 198 // Solution for not using MediaStreamManager | 199 // Solution for not using MediaStreamManager. |
| 199 // This session id won't be returned by Open() | 200 // This session id won't be returned by Open(). |
| 200 if (capture_params.session_id == kStartOpenSessionId) { | 201 if (capture_params.session_id == kStartOpenSessionId) { |
| 201 // Start() is called without using Open(), we need to open a device | 202 // Start() is called without using Open(), we need to open a device. |
| 202 media::VideoCaptureDevice::Names device_names; | 203 media::VideoCaptureDevice::Names device_names; |
| 203 GetAvailableDevices(&device_names); | 204 GetAvailableDevices(&device_names); |
| 204 if (device_names.empty()) { | 205 if (device_names.empty()) { |
| 205 // No devices available. | 206 // No devices available. |
| 206 video_capture_receiver->OnError(); | 207 video_capture_receiver->OnError(); |
| 207 return; | 208 return; |
| 208 } | 209 } |
| 209 StreamDeviceInfo device(kVideoCapture, | 210 StreamDeviceInfo device(kVideoCapture, |
| 210 device_names.front().device_name, | 211 device_names.front().device_name, |
| 211 device_names.front().unique_id, false); | 212 device_names.front().unique_id, false); |
| 212 | 213 |
| 213 // Call OnOpen to open using the first device in the list | 214 // Call OnOpen to open using the first device in the list. |
| 214 OnOpen(capture_params.session_id, device); | 215 OnOpen(capture_params.session_id, device); |
| 215 } | 216 } |
| 216 | 217 |
| 217 VideoCaptureDevices::iterator it = devices_.find(capture_params.session_id); | 218 VideoCaptureDevices::iterator it = devices_.find(capture_params.session_id); |
| 218 if (it == devices_.end()) { | 219 if (it == devices_.end()) { |
| 219 // Invalid session id | 220 // Invalid session id. |
| 220 video_capture_receiver->OnError(); | 221 video_capture_receiver->OnError(); |
| 221 return; | 222 return; |
| 222 } | 223 } |
| 223 media::VideoCaptureDevice* video_capture_device = it->second; | 224 media::VideoCaptureDevice* video_capture_device = it->second; |
| 224 | 225 |
| 225 // Possible errors are signaled to video_capture_receiver by | 226 // Possible errors are signaled to video_capture_receiver by |
| 226 // video_capture_device. video_capture_receiver to perform actions. | 227 // video_capture_device. video_capture_receiver to perform actions. |
| 227 video_capture_device->Allocate(capture_params.width, capture_params.height, | 228 video_capture_device->Allocate(capture_params.width, capture_params.height, |
| 228 capture_params.frame_per_second, | 229 capture_params.frame_per_second, |
| 229 video_capture_receiver); | 230 video_capture_receiver); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 250 } | 251 } |
| 251 | 252 |
| 252 if (capture_session_id == kStartOpenSessionId) { | 253 if (capture_session_id == kStartOpenSessionId) { |
| 253 // This device was opened from Start(), not Open(). Close it! | 254 // This device was opened from Start(), not Open(). Close it! |
| 254 OnClose(capture_session_id); | 255 OnClose(capture_session_id); |
| 255 } | 256 } |
| 256 } | 257 } |
| 257 | 258 |
| 258 void VideoCaptureManager::OnOpened(int capture_session_id) { | 259 void VideoCaptureManager::OnOpened(int capture_session_id) { |
| 259 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 260 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 260 if (listener_ == NULL) { | 261 if (!listener_) { |
| 261 // Listener has been removed | 262 // Listener has been removed. |
| 262 return; | 263 return; |
| 263 } | 264 } |
| 264 listener_->Opened(kVideoCapture, capture_session_id); | 265 listener_->Opened(kVideoCapture, capture_session_id); |
| 265 } | 266 } |
| 266 | 267 |
| 267 void VideoCaptureManager::OnClosed(int capture_session_id) { | 268 void VideoCaptureManager::OnClosed(int capture_session_id) { |
| 268 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 269 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 269 if (listener_ == NULL) { | 270 if (!listener_) { |
| 270 // Listener has been removed | 271 // Listener has been removed. |
| 271 return; | 272 return; |
| 272 } | 273 } |
| 273 listener_->Closed(kVideoCapture, capture_session_id); | 274 listener_->Closed(kVideoCapture, capture_session_id); |
| 274 } | 275 } |
| 275 | 276 |
| 276 void VideoCaptureManager::OnDevicesEnumerated( | 277 void VideoCaptureManager::OnDevicesEnumerated( |
| 277 const StreamDeviceInfoArray& devices) { | 278 const StreamDeviceInfoArray& devices) { |
| 278 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 279 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 279 if (!listener_) { | 280 if (!listener_) { |
| 280 // Listener has been removed | 281 // Listener has been removed. |
| 281 return; | 282 return; |
| 282 } | 283 } |
| 283 listener_->DevicesEnumerated(kVideoCapture, devices); | 284 listener_->DevicesEnumerated(kVideoCapture, devices); |
| 284 } | 285 } |
| 285 | 286 |
| 286 void VideoCaptureManager::OnError(int capture_session_id, | 287 void VideoCaptureManager::OnError(int capture_session_id, |
| 287 MediaStreamProviderError error) { | 288 MediaStreamProviderError error) { |
| 288 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 289 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 289 if (listener_ == NULL) { | 290 if (!listener_) { |
| 290 // Listener has been removed | 291 // Listener has been removed. |
| 291 return; | 292 return; |
| 292 } | 293 } |
| 293 listener_->Error(kVideoCapture, capture_session_id, error); | 294 listener_->Error(kVideoCapture, capture_session_id, error); |
| 294 } | 295 } |
| 295 | 296 |
| 296 void VideoCaptureManager::PostOnOpened(int capture_session_id) { | 297 void VideoCaptureManager::PostOnOpened(int capture_session_id) { |
| 297 DCHECK(IsOnCaptureDeviceThread()); | 298 DCHECK(IsOnCaptureDeviceThread()); |
| 298 BrowserThread::PostTask(BrowserThread::IO, | 299 BrowserThread::PostTask(BrowserThread::IO, |
| 299 FROM_HERE, | 300 FROM_HERE, |
| 300 NewRunnableMethod(this, | 301 NewRunnableMethod(this, |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 370 for (VideoCaptureDevices::iterator it = devices_.begin(); | 371 for (VideoCaptureDevices::iterator it = devices_.begin(); |
| 371 it != devices_.end(); | 372 it != devices_.end(); |
| 372 it++) { | 373 it++) { |
| 373 if (device_info.device_id == it->second->device_name().unique_id) { | 374 if (device_info.device_id == it->second->device_name().unique_id) { |
| 374 return true; | 375 return true; |
| 375 } | 376 } |
| 376 } | 377 } |
| 377 return false; | 378 return false; |
| 378 } | 379 } |
| 379 | 380 |
| 380 } // namespace media | 381 } // namespace media_stream |
| OLD | NEW |