| OLD | NEW |
| 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/video_capture_manager.h" | 5 #include "content/browser/renderer_host/media/video_capture_manager.h" |
| 6 | 6 |
| 7 #include <set> | 7 #include <set> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 151 base::Bind(&VideoCaptureManager::OnOpened, this, | 151 base::Bind(&VideoCaptureManager::OnOpened, this, |
| 152 device_info.device.type, capture_session_id)); | 152 device_info.device.type, capture_session_id)); |
| 153 return capture_session_id; | 153 return capture_session_id; |
| 154 } | 154 } |
| 155 | 155 |
| 156 void VideoCaptureManager::Close(int capture_session_id) { | 156 void VideoCaptureManager::Close(int capture_session_id) { |
| 157 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 157 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 158 DCHECK(listener_); | 158 DCHECK(listener_); |
| 159 DVLOG(1) << "VideoCaptureManager::Close, id " << capture_session_id; | 159 DVLOG(1) << "VideoCaptureManager::Close, id " << capture_session_id; |
| 160 | 160 |
| 161 std::map<media::VideoCaptureSessionId, MediaStreamDevice>::iterator | 161 SessionMap::iterator session_it = sessions_.find(capture_session_id); |
| 162 session_it = sessions_.find(capture_session_id); | |
| 163 if (session_it == sessions_.end()) { | 162 if (session_it == sessions_.end()) { |
| 164 NOTREACHED(); | 163 NOTREACHED(); |
| 165 return; | 164 return; |
| 166 } | 165 } |
| 167 | 166 |
| 168 DeviceEntry* const existing_device = GetDeviceEntryForMediaStreamDevice( | 167 DeviceEntry* const existing_device = GetDeviceEntryForMediaStreamDevice( |
| 169 session_it->second); | 168 session_it->second); |
| 170 if (existing_device) { | 169 if (existing_device) { |
| 171 // Remove any client that is still using the session. This is safe to call | 170 // Remove any client that is still using the session. This is safe to call |
| 172 // even if there are no clients using the session. | 171 // even if there are no clients using the session. |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 282 } | 281 } |
| 283 // Run the callback first, as AddClient() may trigger OnFrameInfo(). | 282 // Run the callback first, as AddClient() may trigger OnFrameInfo(). |
| 284 done_cb.Run(entry->video_capture_controller->GetWeakPtr()); | 283 done_cb.Run(entry->video_capture_controller->GetWeakPtr()); |
| 285 entry->video_capture_controller->AddClient( | 284 entry->video_capture_controller->AddClient( |
| 286 client_id, client_handler, client_render_process, session_id, params); | 285 client_id, client_handler, client_render_process, session_id, params); |
| 287 } | 286 } |
| 288 | 287 |
| 289 void VideoCaptureManager::StopCaptureForClient( | 288 void VideoCaptureManager::StopCaptureForClient( |
| 290 VideoCaptureController* controller, | 289 VideoCaptureController* controller, |
| 291 VideoCaptureControllerID client_id, | 290 VideoCaptureControllerID client_id, |
| 292 VideoCaptureControllerEventHandler* client_handler) { | 291 VideoCaptureControllerEventHandler* client_handler, |
| 292 bool aborted_due_to_error) { |
| 293 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 293 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 294 DCHECK(controller); | 294 DCHECK(controller); |
| 295 DCHECK(client_handler); | 295 DCHECK(client_handler); |
| 296 | 296 |
| 297 DeviceEntry* entry = GetDeviceEntryForController(controller); | 297 DeviceEntry* entry = GetDeviceEntryForController(controller); |
| 298 if (!entry) { | 298 if (!entry) { |
| 299 NOTREACHED(); | 299 NOTREACHED(); |
| 300 return; | 300 return; |
| 301 } | 301 } |
| 302 if (aborted_due_to_error) { |
| 303 SessionMap::iterator it; |
| 304 for (it = sessions_.begin(); it != sessions_.end(); ++it) { |
| 305 if (it->second.type == entry->stream_type && |
| 306 it->second.id == entry->id) { |
| 307 listener_->Aborted(it->second.type, it->first); |
| 308 break; |
| 309 } |
| 310 } |
| 311 } |
| 302 | 312 |
| 303 // Detach client from controller. | 313 // Detach client from controller. |
| 304 media::VideoCaptureSessionId session_id = | 314 media::VideoCaptureSessionId session_id = |
| 305 controller->RemoveClient(client_id, client_handler); | 315 controller->RemoveClient(client_id, client_handler); |
| 306 DVLOG(1) << "VideoCaptureManager::StopCaptureForClient, session_id = " | 316 DVLOG(1) << "VideoCaptureManager::StopCaptureForClient, session_id = " |
| 307 << session_id; | 317 << session_id; |
| 308 | 318 |
| 309 // If controller has no more clients, delete controller and device. | 319 // If controller has no more clients, delete controller and device. |
| 310 DestroyDeviceEntryIfNoClients(entry); | 320 DestroyDeviceEntryIfNoClients(entry); |
| 311 } | 321 } |
| 312 | 322 |
| 313 bool VideoCaptureManager::GetDeviceSupportedFormats( | 323 bool VideoCaptureManager::GetDeviceSupportedFormats( |
| 314 media::VideoCaptureSessionId capture_session_id, | 324 media::VideoCaptureSessionId capture_session_id, |
| 315 media::VideoCaptureFormats* supported_formats) { | 325 media::VideoCaptureFormats* supported_formats) { |
| 316 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 326 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 317 DCHECK(supported_formats->empty()); | 327 DCHECK(supported_formats->empty()); |
| 318 | 328 |
| 319 std::map<media::VideoCaptureSessionId, MediaStreamDevice>::iterator it = | 329 SessionMap::iterator it = sessions_.find(capture_session_id); |
| 320 sessions_.find(capture_session_id); | |
| 321 if (it == sessions_.end()) | 330 if (it == sessions_.end()) |
| 322 return false; | 331 return false; |
| 323 DVLOG(1) << "GetDeviceSupportedFormats for device: " << it->second.name; | 332 DVLOG(1) << "GetDeviceSupportedFormats for device: " << it->second.name; |
| 324 | 333 |
| 325 // Return all available formats of the device, regardless its started state. | 334 // Return all available formats of the device, regardless its started state. |
| 326 DeviceInfo* existing_device = | 335 DeviceInfo* existing_device = |
| 327 FindDeviceInfoById(it->second.id, devices_info_cache_); | 336 FindDeviceInfoById(it->second.id, devices_info_cache_); |
| 328 if (existing_device) | 337 if (existing_device) |
| 329 *supported_formats = existing_device->supported_formats; | 338 *supported_formats = existing_device->supported_formats; |
| 330 return true; | 339 return true; |
| 331 } | 340 } |
| 332 | 341 |
| 333 bool VideoCaptureManager::GetDeviceFormatsInUse( | 342 bool VideoCaptureManager::GetDeviceFormatsInUse( |
| 334 media::VideoCaptureSessionId capture_session_id, | 343 media::VideoCaptureSessionId capture_session_id, |
| 335 media::VideoCaptureFormats* formats_in_use) { | 344 media::VideoCaptureFormats* formats_in_use) { |
| 336 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 345 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 337 DCHECK(formats_in_use->empty()); | 346 DCHECK(formats_in_use->empty()); |
| 338 | 347 |
| 339 std::map<media::VideoCaptureSessionId, MediaStreamDevice>::iterator it = | 348 SessionMap::iterator it = sessions_.find(capture_session_id); |
| 340 sessions_.find(capture_session_id); | |
| 341 if (it == sessions_.end()) | 349 if (it == sessions_.end()) |
| 342 return false; | 350 return false; |
| 343 DVLOG(1) << "GetDeviceFormatsInUse for device: " << it->second.name; | 351 DVLOG(1) << "GetDeviceFormatsInUse for device: " << it->second.name; |
| 344 | 352 |
| 345 // Return the currently in-use format(s) of the device, if it's started. | 353 // Return the currently in-use format(s) of the device, if it's started. |
| 346 DeviceEntry* device_in_use = | 354 DeviceEntry* device_in_use = |
| 347 GetDeviceEntryForMediaStreamDevice(it->second); | 355 GetDeviceEntryForMediaStreamDevice(it->second); |
| 348 if (device_in_use) { | 356 if (device_in_use) { |
| 349 // Currently only one format-in-use is supported at the VCC level. | 357 // Currently only one format-in-use is supported at the VCC level. |
| 350 formats_in_use->push_back( | 358 formats_in_use->push_back( |
| 351 device_in_use->video_capture_controller->GetVideoCaptureFormat()); | 359 device_in_use->video_capture_controller->GetVideoCaptureFormat()); |
| 352 } | 360 } |
| 353 return true; | 361 return true; |
| 354 } | 362 } |
| 355 | 363 |
| 356 void VideoCaptureManager::SetDesktopCaptureWindowId( | 364 void VideoCaptureManager::SetDesktopCaptureWindowId( |
| 357 media::VideoCaptureSessionId session_id, | 365 media::VideoCaptureSessionId session_id, |
| 358 gfx::NativeViewId window_id) { | 366 gfx::NativeViewId window_id) { |
| 359 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 367 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 360 std::map<media::VideoCaptureSessionId, MediaStreamDevice>::iterator | 368 SessionMap::iterator session_it = sessions_.find(session_id); |
| 361 session_it = sessions_.find(session_id); | |
| 362 if (session_it == sessions_.end()) { | 369 if (session_it == sessions_.end()) { |
| 363 device_task_runner_->PostTask( | 370 device_task_runner_->PostTask( |
| 364 FROM_HERE, | 371 FROM_HERE, |
| 365 base::Bind( | 372 base::Bind( |
| 366 &VideoCaptureManager::SaveDesktopCaptureWindowIdOnDeviceThread, | 373 &VideoCaptureManager::SaveDesktopCaptureWindowIdOnDeviceThread, |
| 367 this, | 374 this, |
| 368 session_id, | 375 session_id, |
| 369 window_id)); | 376 window_id)); |
| 370 return; | 377 return; |
| 371 } | 378 } |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 513 if (device_info.type == device->stream_type && | 520 if (device_info.type == device->stream_type && |
| 514 device_info.id == device->id) { | 521 device_info.id == device->id) { |
| 515 return device; | 522 return device; |
| 516 } | 523 } |
| 517 } | 524 } |
| 518 return NULL; | 525 return NULL; |
| 519 } | 526 } |
| 520 | 527 |
| 521 VideoCaptureManager::DeviceEntry* | 528 VideoCaptureManager::DeviceEntry* |
| 522 VideoCaptureManager::GetDeviceEntryForController( | 529 VideoCaptureManager::GetDeviceEntryForController( |
| 523 const VideoCaptureController* controller) { | 530 const VideoCaptureController* controller) const { |
| 524 // Look up |controller| in |devices_|. | 531 // Look up |controller| in |devices_|. |
| 525 for (DeviceEntries::iterator it = devices_.begin(); | 532 for (DeviceEntries::const_iterator it = devices_.begin(); |
| 526 it != devices_.end(); ++it) { | 533 it != devices_.end(); ++it) { |
| 527 if ((*it)->video_capture_controller.get() == controller) { | 534 if ((*it)->video_capture_controller.get() == controller) { |
| 528 return *it; | 535 return *it; |
| 529 } | 536 } |
| 530 } | 537 } |
| 531 return NULL; | 538 return NULL; |
| 532 } | 539 } |
| 533 | 540 |
| 534 void VideoCaptureManager::DestroyDeviceEntryIfNoClients(DeviceEntry* entry) { | 541 void VideoCaptureManager::DestroyDeviceEntryIfNoClients(DeviceEntry* entry) { |
| 535 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 542 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 548 FROM_HERE, | 555 FROM_HERE, |
| 549 base::Bind(&VideoCaptureManager::DoStopDeviceOnDeviceThread, this, | 556 base::Bind(&VideoCaptureManager::DoStopDeviceOnDeviceThread, this, |
| 550 base::Owned(entry))); | 557 base::Owned(entry))); |
| 551 } | 558 } |
| 552 } | 559 } |
| 553 | 560 |
| 554 VideoCaptureManager::DeviceEntry* VideoCaptureManager::GetOrCreateDeviceEntry( | 561 VideoCaptureManager::DeviceEntry* VideoCaptureManager::GetOrCreateDeviceEntry( |
| 555 media::VideoCaptureSessionId capture_session_id) { | 562 media::VideoCaptureSessionId capture_session_id) { |
| 556 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 563 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 557 | 564 |
| 558 std::map<media::VideoCaptureSessionId, MediaStreamDevice>::iterator | 565 SessionMap::iterator session_it = sessions_.find(capture_session_id); |
| 559 session_it = sessions_.find(capture_session_id); | |
| 560 if (session_it == sessions_.end()) { | 566 if (session_it == sessions_.end()) { |
| 561 return NULL; | 567 return NULL; |
| 562 } | 568 } |
| 563 const MediaStreamDevice& device_info = session_it->second; | 569 const MediaStreamDevice& device_info = session_it->second; |
| 564 | 570 |
| 565 // Check if another session has already opened this device. If so, just | 571 // Check if another session has already opened this device. If so, just |
| 566 // use that opened device. | 572 // use that opened device. |
| 567 DeviceEntry* const existing_device = | 573 DeviceEntry* const existing_device = |
| 568 GetDeviceEntryForMediaStreamDevice(device_info); | 574 GetDeviceEntryForMediaStreamDevice(device_info); |
| 569 if (existing_device) { | 575 if (existing_device) { |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 606 void VideoCaptureManager::SaveDesktopCaptureWindowIdOnDeviceThread( | 612 void VideoCaptureManager::SaveDesktopCaptureWindowIdOnDeviceThread( |
| 607 media::VideoCaptureSessionId session_id, | 613 media::VideoCaptureSessionId session_id, |
| 608 gfx::NativeViewId window_id) { | 614 gfx::NativeViewId window_id) { |
| 609 DCHECK(IsOnDeviceThread()); | 615 DCHECK(IsOnDeviceThread()); |
| 610 DCHECK(notification_window_ids_.find(session_id) == | 616 DCHECK(notification_window_ids_.find(session_id) == |
| 611 notification_window_ids_.end()); | 617 notification_window_ids_.end()); |
| 612 notification_window_ids_[session_id] = window_id; | 618 notification_window_ids_[session_id] = window_id; |
| 613 } | 619 } |
| 614 | 620 |
| 615 } // namespace content | 621 } // namespace content |
| OLD | NEW |