| 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/media_stream_manager.h" | 5 #include "content/browser/renderer_host/media/media_stream_manager.h" |
| 6 | 6 |
| 7 #include <list> | 7 #include <list> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 81 &mandatory)) { | 81 &mandatory)) { |
| 82 DCHECK(mandatory); | 82 DCHECK(mandatory); |
| 83 // This is tab or screen capture. | 83 // This is tab or screen capture. |
| 84 if (audio_stream_source == kMediaStreamSourceTab) { | 84 if (audio_stream_source == kMediaStreamSourceTab) { |
| 85 *audio_type = content::MEDIA_TAB_AUDIO_CAPTURE; | 85 *audio_type = content::MEDIA_TAB_AUDIO_CAPTURE; |
| 86 } else if (audio_stream_source == kMediaStreamSourceSystem) { | 86 } else if (audio_stream_source == kMediaStreamSourceSystem) { |
| 87 *audio_type = content::MEDIA_LOOPBACK_AUDIO_CAPTURE; | 87 *audio_type = content::MEDIA_LOOPBACK_AUDIO_CAPTURE; |
| 88 } | 88 } |
| 89 } else { | 89 } else { |
| 90 // This is normal audio device capture. | 90 // This is normal audio device capture. |
| 91 *audio_type = content::MEDIA_DEVICE_AUDIO_CAPTURE; | 91 *audio_type = MEDIA_DEVICE_AUDIO_CAPTURE; |
| 92 } | 92 } |
| 93 } | 93 } |
| 94 if (options.video_requested) { | 94 if (options.video_requested) { |
| 95 std::string video_stream_source; | 95 std::string video_stream_source; |
| 96 bool mandatory = false; | 96 bool mandatory = false; |
| 97 if (options.GetFirstVideoConstraintByName(kMediaStreamSource, | 97 if (options.GetFirstVideoConstraintByName(kMediaStreamSource, |
| 98 &video_stream_source, | 98 &video_stream_source, |
| 99 &mandatory)) { | 99 &mandatory)) { |
| 100 DCHECK(mandatory); | 100 DCHECK(mandatory); |
| 101 // This is tab or screen capture. | 101 // This is tab or screen capture. |
| 102 if (video_stream_source == kMediaStreamSourceTab) { | 102 if (video_stream_source == kMediaStreamSourceTab) { |
| 103 *video_type = content::MEDIA_TAB_VIDEO_CAPTURE; | 103 *video_type = content::MEDIA_TAB_VIDEO_CAPTURE; |
| 104 } else if (video_stream_source == kMediaStreamSourceScreen) { | 104 } else if (video_stream_source == kMediaStreamSourceScreen) { |
| 105 *video_type = content::MEDIA_DESKTOP_VIDEO_CAPTURE; | 105 *video_type = content::MEDIA_DESKTOP_VIDEO_CAPTURE; |
| 106 } else if (video_stream_source == kMediaStreamSourceDesktop) { | 106 } else if (video_stream_source == kMediaStreamSourceDesktop) { |
| 107 *video_type = content::MEDIA_DESKTOP_VIDEO_CAPTURE; | 107 *video_type = content::MEDIA_DESKTOP_VIDEO_CAPTURE; |
| 108 } | 108 } |
| 109 } else { | 109 } else { |
| 110 // This is normal video device capture. | 110 // This is normal video device capture. |
| 111 *video_type = content::MEDIA_DEVICE_VIDEO_CAPTURE; | 111 *video_type = MEDIA_DEVICE_VIDEO_CAPTURE; |
| 112 } | 112 } |
| 113 } | 113 } |
| 114 } | 114 } |
| 115 | 115 |
| 116 // Private helper method for SendMessageToNativeLog() that obtains the global | 116 // Private helper method for SendMessageToNativeLog() that obtains the global |
| 117 // MediaStreamManager instance on the UI thread before sending |message| to the | 117 // MediaStreamManager instance on the UI thread before sending |message| to the |
| 118 // webrtcLoggingPrivate API. | 118 // webrtcLoggingPrivate API. |
| 119 void DoAddLogMessage(const std::string& message) { | 119 void DoAddLogMessage(const std::string& message) { |
| 120 // Must be on the UI thread to access BrowserMainLoop. | 120 // Must be on the UI thread to access BrowserMainLoop. |
| 121 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 121 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| (...skipping 923 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1045 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 1045 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 1046 DeviceRequest* request = FindRequest(label); | 1046 DeviceRequest* request = FindRequest(label); |
| 1047 if (!request) { | 1047 if (!request) { |
| 1048 DVLOG(1) << "SetupRequest label " << label << " doesn't exist!!"; | 1048 DVLOG(1) << "SetupRequest label " << label << " doesn't exist!!"; |
| 1049 return; // This can happen if the request has been canceled. | 1049 return; // This can happen if the request has been canceled. |
| 1050 } | 1050 } |
| 1051 | 1051 |
| 1052 if (!request->security_origin.is_valid()) { | 1052 if (!request->security_origin.is_valid()) { |
| 1053 LOG(ERROR) << "Invalid security origin. " | 1053 LOG(ERROR) << "Invalid security origin. " |
| 1054 << request->security_origin; | 1054 << request->security_origin; |
| 1055 FinalizeRequestFailed(label, request); | 1055 FinalizeRequestFailed(label, |
| 1056 request, |
| 1057 MEDIA_DEVICE_INVALID_SECURITY_ORIGIN); |
| 1056 return; | 1058 return; |
| 1057 } | 1059 } |
| 1058 | 1060 |
| 1059 MediaStreamType audio_type = MEDIA_NO_SERVICE; | 1061 MediaStreamType audio_type = MEDIA_NO_SERVICE; |
| 1060 MediaStreamType video_type = MEDIA_NO_SERVICE; | 1062 MediaStreamType video_type = MEDIA_NO_SERVICE; |
| 1061 ParseStreamType(request->options, &audio_type, &video_type); | 1063 ParseStreamType(request->options, &audio_type, &video_type); |
| 1062 request->SetAudioType(audio_type); | 1064 request->SetAudioType(audio_type); |
| 1063 request->SetVideoType(video_type); | 1065 request->SetVideoType(video_type); |
| 1064 | 1066 |
| 1065 bool is_web_contents_capture = | 1067 bool is_web_contents_capture = |
| 1066 audio_type == MEDIA_TAB_AUDIO_CAPTURE || | 1068 audio_type == MEDIA_TAB_AUDIO_CAPTURE || |
| 1067 video_type == MEDIA_TAB_VIDEO_CAPTURE; | 1069 video_type == MEDIA_TAB_VIDEO_CAPTURE; |
| 1068 if (is_web_contents_capture && !SetupTabCaptureRequest(request)) { | 1070 if (is_web_contents_capture && !SetupTabCaptureRequest(request)) { |
| 1069 FinalizeRequestFailed(label, request); | 1071 FinalizeRequestFailed(label, |
| 1072 request, |
| 1073 MEDIA_DEVICE_TAB_CAPTURE_FAILURE); |
| 1070 return; | 1074 return; |
| 1071 } | 1075 } |
| 1072 | 1076 |
| 1073 bool is_screen_capture = | 1077 bool is_screen_capture = |
| 1074 video_type == MEDIA_DESKTOP_VIDEO_CAPTURE; | 1078 video_type == MEDIA_DESKTOP_VIDEO_CAPTURE; |
| 1075 if (is_screen_capture && !SetupScreenCaptureRequest(request)) { | 1079 if (is_screen_capture && !SetupScreenCaptureRequest(request)) { |
| 1076 FinalizeRequestFailed(label, request); | 1080 FinalizeRequestFailed(label, |
| 1081 request, |
| 1082 MEDIA_DEVICE_SCREEN_CAPTURE_FAILURE); |
| 1077 return; | 1083 return; |
| 1078 } | 1084 } |
| 1079 | 1085 |
| 1080 if (!is_web_contents_capture && !is_screen_capture) { | 1086 if (!is_web_contents_capture && !is_screen_capture) { |
| 1081 if (EnumerationRequired(&audio_enumeration_cache_, audio_type) || | 1087 if (EnumerationRequired(&audio_enumeration_cache_, audio_type) || |
| 1082 EnumerationRequired(&video_enumeration_cache_, video_type)) { | 1088 EnumerationRequired(&video_enumeration_cache_, video_type)) { |
| 1083 // Enumerate the devices if there is no valid device lists to be used. | 1089 // Enumerate the devices if there is no valid device lists to be used. |
| 1084 StartEnumeration(request); | 1090 StartEnumeration(request); |
| 1085 return; | 1091 return; |
| 1086 } else { | 1092 } else { |
| 1087 // Cache is valid, so log the cached devices for MediaStream requests. | 1093 // Cache is valid, so log the cached devices for MediaStream requests. |
| 1088 if (request->request_type == MEDIA_GENERATE_STREAM) { | 1094 if (request->request_type == MEDIA_GENERATE_STREAM) { |
| 1089 std::string log_message("Using cached devices for request.\n"); | 1095 std::string log_message("Using cached devices for request.\n"); |
| 1090 if (audio_type != MEDIA_NO_SERVICE) { | 1096 if (audio_type != MEDIA_NO_SERVICE) { |
| 1091 log_message += | 1097 log_message += |
| 1092 GetLogMessageString(audio_type, audio_enumeration_cache_.devices); | 1098 GetLogMessageString(audio_type, audio_enumeration_cache_.devices); |
| 1093 } | 1099 } |
| 1094 if (video_type != MEDIA_NO_SERVICE) { | 1100 if (video_type != MEDIA_NO_SERVICE) { |
| 1095 log_message += | 1101 log_message += |
| 1096 GetLogMessageString(video_type, video_enumeration_cache_.devices); | 1102 GetLogMessageString(video_type, video_enumeration_cache_.devices); |
| 1097 } | 1103 } |
| 1098 SendMessageToNativeLog(log_message); | 1104 SendMessageToNativeLog(log_message); |
| 1099 } | 1105 } |
| 1100 } | 1106 } |
| 1101 | 1107 |
| 1102 if (!SetupDeviceCaptureRequest(request)) { | 1108 if (!SetupDeviceCaptureRequest(request)) { |
| 1103 FinalizeRequestFailed(label, request); | 1109 FinalizeRequestFailed(label, request, MEDIA_DEVICE_CAPTURE_FAILURE); |
| 1104 return; | 1110 return; |
| 1105 } | 1111 } |
| 1106 } | 1112 } |
| 1107 PostRequestToUI(label, request); | 1113 PostRequestToUI(label, request); |
| 1108 } | 1114 } |
| 1109 | 1115 |
| 1110 bool MediaStreamManager::SetupDeviceCaptureRequest(DeviceRequest* request) { | 1116 bool MediaStreamManager::SetupDeviceCaptureRequest(DeviceRequest* request) { |
| 1111 DCHECK((request->audio_type() == MEDIA_DEVICE_AUDIO_CAPTURE || | 1117 DCHECK((request->audio_type() == MEDIA_DEVICE_AUDIO_CAPTURE || |
| 1112 request->audio_type() == MEDIA_NO_SERVICE) && | 1118 request->audio_type() == MEDIA_NO_SERVICE) && |
| 1113 (request->video_type() == MEDIA_DEVICE_VIDEO_CAPTURE || | 1119 (request->video_type() == MEDIA_DEVICE_VIDEO_CAPTURE || |
| (...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1288 } | 1294 } |
| 1289 | 1295 |
| 1290 request->requester->StreamGenerated( | 1296 request->requester->StreamGenerated( |
| 1291 request->requesting_view_id, | 1297 request->requesting_view_id, |
| 1292 request->page_request_id, | 1298 request->page_request_id, |
| 1293 label, audio_devices, video_devices); | 1299 label, audio_devices, video_devices); |
| 1294 } | 1300 } |
| 1295 | 1301 |
| 1296 void MediaStreamManager::FinalizeRequestFailed( | 1302 void MediaStreamManager::FinalizeRequestFailed( |
| 1297 const std::string& label, | 1303 const std::string& label, |
| 1298 DeviceRequest* request) { | 1304 DeviceRequest* request, |
| 1305 content::MediaStreamRequestResult result) { |
| 1299 if (request->requester) | 1306 if (request->requester) |
| 1300 request->requester->StreamGenerationFailed( | 1307 request->requester->StreamGenerationFailed( |
| 1301 request->requesting_view_id, | 1308 request->requesting_view_id, |
| 1302 request->page_request_id); | 1309 request->page_request_id, |
| 1310 result); |
| 1303 | 1311 |
| 1304 if (request->request_type == MEDIA_DEVICE_ACCESS && | 1312 if (request->request_type == MEDIA_DEVICE_ACCESS && |
| 1305 !request->callback.is_null()) { | 1313 !request->callback.is_null()) { |
| 1306 request->callback.Run(MediaStreamDevices(), request->ui_proxy.Pass()); | 1314 request->callback.Run(MediaStreamDevices(), request->ui_proxy.Pass()); |
| 1307 } | 1315 } |
| 1308 | 1316 |
| 1309 DeleteRequest(label); | 1317 DeleteRequest(label); |
| 1310 } | 1318 } |
| 1311 | 1319 |
| 1312 void MediaStreamManager::FinalizeOpenDevice(const std::string& label, | 1320 void MediaStreamManager::FinalizeOpenDevice(const std::string& label, |
| (...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1538 default: | 1546 default: |
| 1539 if (request->state(request->audio_type()) == | 1547 if (request->state(request->audio_type()) == |
| 1540 MEDIA_REQUEST_STATE_REQUESTED || | 1548 MEDIA_REQUEST_STATE_REQUESTED || |
| 1541 request->state(request->video_type()) == | 1549 request->state(request->video_type()) == |
| 1542 MEDIA_REQUEST_STATE_REQUESTED) { | 1550 MEDIA_REQUEST_STATE_REQUESTED) { |
| 1543 // We are doing enumeration for other type of media, wait until it is | 1551 // We are doing enumeration for other type of media, wait until it is |
| 1544 // all done before posting the request to UI because UI needs | 1552 // all done before posting the request to UI because UI needs |
| 1545 // the device lists to handle the request. | 1553 // the device lists to handle the request. |
| 1546 break; | 1554 break; |
| 1547 } | 1555 } |
| 1548 if (!SetupDeviceCaptureRequest(request)) | 1556 if (!SetupDeviceCaptureRequest(request)) { |
| 1549 FinalizeRequestFailed(*it, request); | 1557 FinalizeRequestFailed(*it, |
| 1550 else | 1558 request, |
| 1559 MEDIA_DEVICE_CAPTURE_FAILURE); |
| 1560 } else { |
| 1551 PostRequestToUI(*it, request); | 1561 PostRequestToUI(*it, request); |
| 1562 } |
| 1552 break; | 1563 break; |
| 1553 } | 1564 } |
| 1554 } | 1565 } |
| 1555 label_list.clear(); | 1566 label_list.clear(); |
| 1556 --active_enumeration_ref_count_[stream_type]; | 1567 --active_enumeration_ref_count_[stream_type]; |
| 1557 DCHECK_GE(active_enumeration_ref_count_[stream_type], 0); | 1568 DCHECK_GE(active_enumeration_ref_count_[stream_type], 0); |
| 1558 } | 1569 } |
| 1559 | 1570 |
| 1560 // static | 1571 // static |
| 1561 void MediaStreamManager::SendMessageToNativeLog(const std::string& message) { | 1572 void MediaStreamManager::SendMessageToNativeLog(const std::string& message) { |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1605 static_cast<content::RenderProcessHostImpl*>( | 1616 static_cast<content::RenderProcessHostImpl*>( |
| 1606 content::RenderProcessHost::FromID(*it)); | 1617 content::RenderProcessHost::FromID(*it)); |
| 1607 if (render_process_host_impl) | 1618 if (render_process_host_impl) |
| 1608 render_process_host_impl->WebRtcLogMessage(message); | 1619 render_process_host_impl->WebRtcLogMessage(message); |
| 1609 } | 1620 } |
| 1610 #endif | 1621 #endif |
| 1611 } | 1622 } |
| 1612 | 1623 |
| 1613 void MediaStreamManager::HandleAccessRequestResponse( | 1624 void MediaStreamManager::HandleAccessRequestResponse( |
| 1614 const std::string& label, | 1625 const std::string& label, |
| 1615 const MediaStreamDevices& devices) { | 1626 const MediaStreamDevices& devices, |
| 1627 content::MediaStreamRequestResult result) { |
| 1616 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 1628 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 1617 DVLOG(1) << "HandleAccessRequestResponse(" | 1629 DVLOG(1) << "HandleAccessRequestResponse(" |
| 1618 << ", {label = " << label << "})"; | 1630 << ", {label = " << label << "})"; |
| 1619 | 1631 |
| 1620 DeviceRequest* request = FindRequest(label); | 1632 DeviceRequest* request = FindRequest(label); |
| 1621 if (!request) { | 1633 if (!request) { |
| 1622 // The request has been canceled before the UI returned. | 1634 // The request has been canceled before the UI returned. |
| 1623 return; | 1635 return; |
| 1624 } | 1636 } |
| 1625 | 1637 |
| 1626 if (request->request_type == MEDIA_DEVICE_ACCESS) { | 1638 if (request->request_type == MEDIA_DEVICE_ACCESS) { |
| 1627 FinalizeMediaAccessRequest(label, request, devices); | 1639 FinalizeMediaAccessRequest(label, request, devices); |
| 1628 return; | 1640 return; |
| 1629 } | 1641 } |
| 1630 | 1642 |
| 1631 // Handle the case when the request was denied. | 1643 // Handle the case when the request was denied. |
| 1632 if (devices.empty()) { | 1644 if (result != MEDIA_DEVICE_OK) { |
| 1633 FinalizeRequestFailed(label, request); | 1645 FinalizeRequestFailed(label, request, result); |
| 1634 return; | 1646 return; |
| 1635 } | 1647 } |
| 1636 | 1648 |
| 1637 // Process all newly-accepted devices for this request. | 1649 // Process all newly-accepted devices for this request. |
| 1638 bool found_audio = false; | 1650 bool found_audio = false; |
| 1639 bool found_video = false; | 1651 bool found_video = false; |
| 1640 for (MediaStreamDevices::const_iterator device_it = devices.begin(); | 1652 for (MediaStreamDevices::const_iterator device_it = devices.begin(); |
| 1641 device_it != devices.end(); ++device_it) { | 1653 device_it != devices.end(); ++device_it) { |
| 1642 StreamDeviceInfo device_info; | 1654 StreamDeviceInfo device_info; |
| 1643 device_info.device = *device_it; | 1655 device_info.device = *device_it; |
| (...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1838 } | 1850 } |
| 1839 | 1851 |
| 1840 // Always do enumeration even though some enumeration is in progress, | 1852 // Always do enumeration even though some enumeration is in progress, |
| 1841 // because those enumeration commands could be sent before these devices | 1853 // because those enumeration commands could be sent before these devices |
| 1842 // change. | 1854 // change. |
| 1843 ++active_enumeration_ref_count_[stream_type]; | 1855 ++active_enumeration_ref_count_[stream_type]; |
| 1844 GetDeviceManager(stream_type)->EnumerateDevices(stream_type); | 1856 GetDeviceManager(stream_type)->EnumerateDevices(stream_type); |
| 1845 } | 1857 } |
| 1846 | 1858 |
| 1847 } // namespace content | 1859 } // namespace content |
| OLD | NEW |