| OLD | NEW |
| 1 /* | 1 /* |
| 2 * libjingle | 2 * libjingle |
| 3 * Copyright 2012 Google Inc. | 3 * Copyright 2012 Google Inc. |
| 4 * | 4 * |
| 5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
| 6 * modification, are permitted provided that the following conditions are met: | 6 * modification, are permitted provided that the following conditions are met: |
| 7 * | 7 * |
| 8 * 1. Redistributions of source code must retain the above copyright notice, | 8 * 1. Redistributions of source code must retain the above copyright notice, |
| 9 * this list of conditions and the following disclaimer. | 9 * this list of conditions and the following disclaimer. |
| 10 * 2. Redistributions in binary form must reproduce the above copyright notice, | 10 * 2. Redistributions in binary form must reproduce the above copyright notice, |
| (...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 258 if (cricket::IsMediaContent(&*iter)) { | 258 if (cricket::IsMediaContent(&*iter)) { |
| 259 MediaContentDescription* mdesc = | 259 MediaContentDescription* mdesc = |
| 260 static_cast<MediaContentDescription*> (iter->description); | 260 static_cast<MediaContentDescription*> (iter->description); |
| 261 if (mdesc) { | 261 if (mdesc) { |
| 262 mdesc->set_crypto_required(type); | 262 mdesc->set_crypto_required(type); |
| 263 } | 263 } |
| 264 } | 264 } |
| 265 } | 265 } |
| 266 } | 266 } |
| 267 | 267 |
| 268 static bool GetAudioSsrcByTrackId( | 268 static bool GetAudioSsrcByTrackId(const SessionDescription* session_description, |
| 269 const SessionDescription* session_description, | 269 const std::string& track_id, |
| 270 const std::string& track_id, uint32 *ssrc) { | 270 uint32_t* ssrc) { |
| 271 const cricket::ContentInfo* audio_info = | 271 const cricket::ContentInfo* audio_info = |
| 272 cricket::GetFirstAudioContent(session_description); | 272 cricket::GetFirstAudioContent(session_description); |
| 273 if (!audio_info) { | 273 if (!audio_info) { |
| 274 LOG(LS_ERROR) << "Audio not used in this call"; | 274 LOG(LS_ERROR) << "Audio not used in this call"; |
| 275 return false; | 275 return false; |
| 276 } | 276 } |
| 277 | 277 |
| 278 const cricket::MediaContentDescription* audio_content = | 278 const cricket::MediaContentDescription* audio_content = |
| 279 static_cast<const cricket::MediaContentDescription*>( | 279 static_cast<const cricket::MediaContentDescription*>( |
| 280 audio_info->description); | 280 audio_info->description); |
| 281 const cricket::StreamParams* stream = | 281 const cricket::StreamParams* stream = |
| 282 cricket::GetStreamByIds(audio_content->streams(), "", track_id); | 282 cricket::GetStreamByIds(audio_content->streams(), "", track_id); |
| 283 if (!stream) { | 283 if (!stream) { |
| 284 return false; | 284 return false; |
| 285 } | 285 } |
| 286 | 286 |
| 287 *ssrc = stream->first_ssrc(); | 287 *ssrc = stream->first_ssrc(); |
| 288 return true; | 288 return true; |
| 289 } | 289 } |
| 290 | 290 |
| 291 static bool GetTrackIdBySsrc(const SessionDescription* session_description, | 291 static bool GetTrackIdBySsrc(const SessionDescription* session_description, |
| 292 uint32 ssrc, std::string* track_id) { | 292 uint32_t ssrc, |
| 293 std::string* track_id) { |
| 293 ASSERT(track_id != NULL); | 294 ASSERT(track_id != NULL); |
| 294 | 295 |
| 295 const cricket::ContentInfo* audio_info = | 296 const cricket::ContentInfo* audio_info = |
| 296 cricket::GetFirstAudioContent(session_description); | 297 cricket::GetFirstAudioContent(session_description); |
| 297 if (audio_info) { | 298 if (audio_info) { |
| 298 const cricket::MediaContentDescription* audio_content = | 299 const cricket::MediaContentDescription* audio_content = |
| 299 static_cast<const cricket::MediaContentDescription*>( | 300 static_cast<const cricket::MediaContentDescription*>( |
| 300 audio_info->description); | 301 audio_info->description); |
| 301 | 302 |
| 302 const auto* found = | 303 const auto* found = |
| (...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 454 } | 455 } |
| 455 std::string string_value; | 456 std::string string_value; |
| 456 T value; | 457 T value; |
| 457 if (constraints->GetOptional().FindFirst(key, &string_value)) { | 458 if (constraints->GetOptional().FindFirst(key, &string_value)) { |
| 458 if (rtc::FromString(string_value, &value)) { | 459 if (rtc::FromString(string_value, &value)) { |
| 459 option->Set(value); | 460 option->Set(value); |
| 460 } | 461 } |
| 461 } | 462 } |
| 462 } | 463 } |
| 463 | 464 |
| 464 uint32 ConvertIceTransportTypeToCandidateFilter( | 465 uint32_t ConvertIceTransportTypeToCandidateFilter( |
| 465 PeerConnectionInterface::IceTransportsType type) { | 466 PeerConnectionInterface::IceTransportsType type) { |
| 466 switch (type) { | 467 switch (type) { |
| 467 case PeerConnectionInterface::kNone: | 468 case PeerConnectionInterface::kNone: |
| 468 return cricket::CF_NONE; | 469 return cricket::CF_NONE; |
| 469 case PeerConnectionInterface::kRelay: | 470 case PeerConnectionInterface::kRelay: |
| 470 return cricket::CF_RELAY; | 471 return cricket::CF_RELAY; |
| 471 case PeerConnectionInterface::kNoHost: | 472 case PeerConnectionInterface::kNoHost: |
| 472 return (cricket::CF_ALL & ~cricket::CF_HOST); | 473 return (cricket::CF_ALL & ~cricket::CF_HOST); |
| 473 case PeerConnectionInterface::kAll: | 474 case PeerConnectionInterface::kAll: |
| 474 return cricket::CF_ALL; | 475 return cricket::CF_ALL; |
| (...skipping 730 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1205 | 1206 |
| 1206 return UseCandidate(candidate); | 1207 return UseCandidate(candidate); |
| 1207 } | 1208 } |
| 1208 | 1209 |
| 1209 bool WebRtcSession::SetIceTransports( | 1210 bool WebRtcSession::SetIceTransports( |
| 1210 PeerConnectionInterface::IceTransportsType type) { | 1211 PeerConnectionInterface::IceTransportsType type) { |
| 1211 return port_allocator()->set_candidate_filter( | 1212 return port_allocator()->set_candidate_filter( |
| 1212 ConvertIceTransportTypeToCandidateFilter(type)); | 1213 ConvertIceTransportTypeToCandidateFilter(type)); |
| 1213 } | 1214 } |
| 1214 | 1215 |
| 1215 bool WebRtcSession::GetLocalTrackIdBySsrc(uint32 ssrc, std::string* track_id) { | 1216 bool WebRtcSession::GetLocalTrackIdBySsrc(uint32_t ssrc, |
| 1217 std::string* track_id) { |
| 1216 if (!base_local_description()) | 1218 if (!base_local_description()) |
| 1217 return false; | 1219 return false; |
| 1218 return webrtc::GetTrackIdBySsrc(base_local_description(), ssrc, track_id); | 1220 return webrtc::GetTrackIdBySsrc(base_local_description(), ssrc, track_id); |
| 1219 } | 1221 } |
| 1220 | 1222 |
| 1221 bool WebRtcSession::GetRemoteTrackIdBySsrc(uint32 ssrc, std::string* track_id) { | 1223 bool WebRtcSession::GetRemoteTrackIdBySsrc(uint32_t ssrc, |
| 1224 std::string* track_id) { |
| 1222 if (!base_remote_description()) | 1225 if (!base_remote_description()) |
| 1223 return false; | 1226 return false; |
| 1224 return webrtc::GetTrackIdBySsrc(base_remote_description(), ssrc, track_id); | 1227 return webrtc::GetTrackIdBySsrc(base_remote_description(), ssrc, track_id); |
| 1225 } | 1228 } |
| 1226 | 1229 |
| 1227 std::string WebRtcSession::BadStateErrMsg(State state) { | 1230 std::string WebRtcSession::BadStateErrMsg(State state) { |
| 1228 std::ostringstream desc; | 1231 std::ostringstream desc; |
| 1229 desc << "Called in wrong state: " << GetStateString(state); | 1232 desc << "Called in wrong state: " << GetStateString(state); |
| 1230 return desc.str(); | 1233 return desc.str(); |
| 1231 } | 1234 } |
| 1232 | 1235 |
| 1233 void WebRtcSession::SetAudioPlayout(uint32 ssrc, bool enable, | 1236 void WebRtcSession::SetAudioPlayout(uint32_t ssrc, |
| 1237 bool enable, |
| 1234 cricket::AudioRenderer* renderer) { | 1238 cricket::AudioRenderer* renderer) { |
| 1235 ASSERT(signaling_thread()->IsCurrent()); | 1239 ASSERT(signaling_thread()->IsCurrent()); |
| 1236 if (!voice_channel_) { | 1240 if (!voice_channel_) { |
| 1237 LOG(LS_ERROR) << "SetAudioPlayout: No audio channel exists."; | 1241 LOG(LS_ERROR) << "SetAudioPlayout: No audio channel exists."; |
| 1238 return; | 1242 return; |
| 1239 } | 1243 } |
| 1240 if (!voice_channel_->SetRemoteRenderer(ssrc, renderer)) { | 1244 if (!voice_channel_->SetRemoteRenderer(ssrc, renderer)) { |
| 1241 // SetRenderer() can fail if the ssrc does not match any playout channel. | 1245 // SetRenderer() can fail if the ssrc does not match any playout channel. |
| 1242 LOG(LS_ERROR) << "SetAudioPlayout: ssrc is incorrect: " << ssrc; | 1246 LOG(LS_ERROR) << "SetAudioPlayout: ssrc is incorrect: " << ssrc; |
| 1243 return; | 1247 return; |
| 1244 } | 1248 } |
| 1245 if (!voice_channel_->SetOutputScaling(ssrc, enable ? 1 : 0, enable ? 1 : 0)) { | 1249 if (!voice_channel_->SetOutputScaling(ssrc, enable ? 1 : 0, enable ? 1 : 0)) { |
| 1246 // Allow that SetOutputScaling fail if |enable| is false but assert | 1250 // Allow that SetOutputScaling fail if |enable| is false but assert |
| 1247 // otherwise. This in the normal case when the underlying media channel has | 1251 // otherwise. This in the normal case when the underlying media channel has |
| 1248 // already been deleted. | 1252 // already been deleted. |
| 1249 ASSERT(enable == false); | 1253 ASSERT(enable == false); |
| 1250 } | 1254 } |
| 1251 } | 1255 } |
| 1252 | 1256 |
| 1253 void WebRtcSession::SetAudioSend(uint32 ssrc, bool enable, | 1257 void WebRtcSession::SetAudioSend(uint32_t ssrc, |
| 1258 bool enable, |
| 1254 const cricket::AudioOptions& options, | 1259 const cricket::AudioOptions& options, |
| 1255 cricket::AudioRenderer* renderer) { | 1260 cricket::AudioRenderer* renderer) { |
| 1256 ASSERT(signaling_thread()->IsCurrent()); | 1261 ASSERT(signaling_thread()->IsCurrent()); |
| 1257 if (!voice_channel_) { | 1262 if (!voice_channel_) { |
| 1258 LOG(LS_ERROR) << "SetAudioSend: No audio channel exists."; | 1263 LOG(LS_ERROR) << "SetAudioSend: No audio channel exists."; |
| 1259 return; | 1264 return; |
| 1260 } | 1265 } |
| 1261 if (!voice_channel_->SetAudioSend(ssrc, enable, &options, renderer)) { | 1266 if (!voice_channel_->SetAudioSend(ssrc, enable, &options, renderer)) { |
| 1262 LOG(LS_ERROR) << "SetAudioSend: ssrc is incorrect: " << ssrc; | 1267 LOG(LS_ERROR) << "SetAudioSend: ssrc is incorrect: " << ssrc; |
| 1263 } | 1268 } |
| 1264 } | 1269 } |
| 1265 | 1270 |
| 1266 void WebRtcSession::SetAudioPlayoutVolume(uint32 ssrc, double volume) { | 1271 void WebRtcSession::SetAudioPlayoutVolume(uint32_t ssrc, double volume) { |
| 1267 ASSERT(signaling_thread()->IsCurrent()); | 1272 ASSERT(signaling_thread()->IsCurrent()); |
| 1268 ASSERT(volume >= 0 && volume <= 10); | 1273 ASSERT(volume >= 0 && volume <= 10); |
| 1269 if (!voice_channel_) { | 1274 if (!voice_channel_) { |
| 1270 LOG(LS_ERROR) << "SetAudioPlayoutVolume: No audio channel exists."; | 1275 LOG(LS_ERROR) << "SetAudioPlayoutVolume: No audio channel exists."; |
| 1271 return; | 1276 return; |
| 1272 } | 1277 } |
| 1273 | 1278 |
| 1274 if (!voice_channel_->SetOutputScaling(ssrc, volume, volume)) { | 1279 if (!voice_channel_->SetOutputScaling(ssrc, volume, volume)) { |
| 1275 ASSERT(false); | 1280 ASSERT(false); |
| 1276 } | 1281 } |
| 1277 } | 1282 } |
| 1278 | 1283 |
| 1279 bool WebRtcSession::SetCaptureDevice(uint32 ssrc, | 1284 bool WebRtcSession::SetCaptureDevice(uint32_t ssrc, |
| 1280 cricket::VideoCapturer* camera) { | 1285 cricket::VideoCapturer* camera) { |
| 1281 ASSERT(signaling_thread()->IsCurrent()); | 1286 ASSERT(signaling_thread()->IsCurrent()); |
| 1282 | 1287 |
| 1283 if (!video_channel_) { | 1288 if (!video_channel_) { |
| 1284 // |video_channel_| doesnt't exist. Probably because the remote end doesnt't | 1289 // |video_channel_| doesnt't exist. Probably because the remote end doesnt't |
| 1285 // support video. | 1290 // support video. |
| 1286 LOG(LS_WARNING) << "Video not used in this call."; | 1291 LOG(LS_WARNING) << "Video not used in this call."; |
| 1287 return false; | 1292 return false; |
| 1288 } | 1293 } |
| 1289 if (!video_channel_->SetCapturer(ssrc, camera)) { | 1294 if (!video_channel_->SetCapturer(ssrc, camera)) { |
| 1290 // Allow that SetCapturer fail if |camera| is NULL but assert otherwise. | 1295 // Allow that SetCapturer fail if |camera| is NULL but assert otherwise. |
| 1291 // This in the normal case when the underlying media channel has already | 1296 // This in the normal case when the underlying media channel has already |
| 1292 // been deleted. | 1297 // been deleted. |
| 1293 ASSERT(camera == NULL); | 1298 ASSERT(camera == NULL); |
| 1294 return false; | 1299 return false; |
| 1295 } | 1300 } |
| 1296 return true; | 1301 return true; |
| 1297 } | 1302 } |
| 1298 | 1303 |
| 1299 void WebRtcSession::SetVideoPlayout(uint32 ssrc, | 1304 void WebRtcSession::SetVideoPlayout(uint32_t ssrc, |
| 1300 bool enable, | 1305 bool enable, |
| 1301 cricket::VideoRenderer* renderer) { | 1306 cricket::VideoRenderer* renderer) { |
| 1302 ASSERT(signaling_thread()->IsCurrent()); | 1307 ASSERT(signaling_thread()->IsCurrent()); |
| 1303 if (!video_channel_) { | 1308 if (!video_channel_) { |
| 1304 LOG(LS_WARNING) << "SetVideoPlayout: No video channel exists."; | 1309 LOG(LS_WARNING) << "SetVideoPlayout: No video channel exists."; |
| 1305 return; | 1310 return; |
| 1306 } | 1311 } |
| 1307 if (!video_channel_->SetRenderer(ssrc, enable ? renderer : NULL)) { | 1312 if (!video_channel_->SetRenderer(ssrc, enable ? renderer : NULL)) { |
| 1308 // Allow that SetRenderer fail if |renderer| is NULL but assert otherwise. | 1313 // Allow that SetRenderer fail if |renderer| is NULL but assert otherwise. |
| 1309 // This in the normal case when the underlying media channel has already | 1314 // This in the normal case when the underlying media channel has already |
| 1310 // been deleted. | 1315 // been deleted. |
| 1311 ASSERT(renderer == NULL); | 1316 ASSERT(renderer == NULL); |
| 1312 } | 1317 } |
| 1313 } | 1318 } |
| 1314 | 1319 |
| 1315 void WebRtcSession::SetVideoSend(uint32 ssrc, bool enable, | 1320 void WebRtcSession::SetVideoSend(uint32_t ssrc, |
| 1321 bool enable, |
| 1316 const cricket::VideoOptions* options) { | 1322 const cricket::VideoOptions* options) { |
| 1317 ASSERT(signaling_thread()->IsCurrent()); | 1323 ASSERT(signaling_thread()->IsCurrent()); |
| 1318 if (!video_channel_) { | 1324 if (!video_channel_) { |
| 1319 LOG(LS_WARNING) << "SetVideoSend: No video channel exists."; | 1325 LOG(LS_WARNING) << "SetVideoSend: No video channel exists."; |
| 1320 return; | 1326 return; |
| 1321 } | 1327 } |
| 1322 if (!video_channel_->SetVideoSend(ssrc, enable, options)) { | 1328 if (!video_channel_->SetVideoSend(ssrc, enable, options)) { |
| 1323 // Allow that MuteStream fail if |enable| is false but assert otherwise. | 1329 // Allow that MuteStream fail if |enable| is false but assert otherwise. |
| 1324 // This in the normal case when the underlying media channel has already | 1330 // This in the normal case when the underlying media channel has already |
| 1325 // been deleted. | 1331 // been deleted. |
| 1326 ASSERT(enable == false); | 1332 ASSERT(enable == false); |
| 1327 } | 1333 } |
| 1328 } | 1334 } |
| 1329 | 1335 |
| 1330 bool WebRtcSession::CanInsertDtmf(const std::string& track_id) { | 1336 bool WebRtcSession::CanInsertDtmf(const std::string& track_id) { |
| 1331 ASSERT(signaling_thread()->IsCurrent()); | 1337 ASSERT(signaling_thread()->IsCurrent()); |
| 1332 if (!voice_channel_) { | 1338 if (!voice_channel_) { |
| 1333 LOG(LS_ERROR) << "CanInsertDtmf: No audio channel exists."; | 1339 LOG(LS_ERROR) << "CanInsertDtmf: No audio channel exists."; |
| 1334 return false; | 1340 return false; |
| 1335 } | 1341 } |
| 1336 uint32 send_ssrc = 0; | 1342 uint32_t send_ssrc = 0; |
| 1337 // The Dtmf is negotiated per channel not ssrc, so we only check if the ssrc | 1343 // The Dtmf is negotiated per channel not ssrc, so we only check if the ssrc |
| 1338 // exists. | 1344 // exists. |
| 1339 if (!GetAudioSsrcByTrackId(base_local_description(), track_id, | 1345 if (!GetAudioSsrcByTrackId(base_local_description(), track_id, |
| 1340 &send_ssrc)) { | 1346 &send_ssrc)) { |
| 1341 LOG(LS_ERROR) << "CanInsertDtmf: Track does not exist: " << track_id; | 1347 LOG(LS_ERROR) << "CanInsertDtmf: Track does not exist: " << track_id; |
| 1342 return false; | 1348 return false; |
| 1343 } | 1349 } |
| 1344 return voice_channel_->CanInsertDtmf(); | 1350 return voice_channel_->CanInsertDtmf(); |
| 1345 } | 1351 } |
| 1346 | 1352 |
| 1347 bool WebRtcSession::InsertDtmf(const std::string& track_id, | 1353 bool WebRtcSession::InsertDtmf(const std::string& track_id, |
| 1348 int code, int duration) { | 1354 int code, int duration) { |
| 1349 ASSERT(signaling_thread()->IsCurrent()); | 1355 ASSERT(signaling_thread()->IsCurrent()); |
| 1350 if (!voice_channel_) { | 1356 if (!voice_channel_) { |
| 1351 LOG(LS_ERROR) << "InsertDtmf: No audio channel exists."; | 1357 LOG(LS_ERROR) << "InsertDtmf: No audio channel exists."; |
| 1352 return false; | 1358 return false; |
| 1353 } | 1359 } |
| 1354 uint32 send_ssrc = 0; | 1360 uint32_t send_ssrc = 0; |
| 1355 if (!VERIFY(GetAudioSsrcByTrackId(base_local_description(), | 1361 if (!VERIFY(GetAudioSsrcByTrackId(base_local_description(), |
| 1356 track_id, &send_ssrc))) { | 1362 track_id, &send_ssrc))) { |
| 1357 LOG(LS_ERROR) << "InsertDtmf: Track does not exist: " << track_id; | 1363 LOG(LS_ERROR) << "InsertDtmf: Track does not exist: " << track_id; |
| 1358 return false; | 1364 return false; |
| 1359 } | 1365 } |
| 1360 if (!voice_channel_->InsertDtmf(send_ssrc, code, duration, | 1366 if (!voice_channel_->InsertDtmf(send_ssrc, code, duration, |
| 1361 cricket::DF_SEND)) { | 1367 cricket::DF_SEND)) { |
| 1362 LOG(LS_ERROR) << "Failed to insert DTMF to channel."; | 1368 LOG(LS_ERROR) << "Failed to insert DTMF to channel."; |
| 1363 return false; | 1369 return false; |
| 1364 } | 1370 } |
| (...skipping 808 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2173 if (!srtp_cipher.empty()) { | 2179 if (!srtp_cipher.empty()) { |
| 2174 metrics_observer_->IncrementSparseEnumCounter( | 2180 metrics_observer_->IncrementSparseEnumCounter( |
| 2175 srtp_counter_type, rtc::GetSrtpCryptoSuiteFromName(srtp_cipher)); | 2181 srtp_counter_type, rtc::GetSrtpCryptoSuiteFromName(srtp_cipher)); |
| 2176 } | 2182 } |
| 2177 if (ssl_cipher) { | 2183 if (ssl_cipher) { |
| 2178 metrics_observer_->IncrementSparseEnumCounter(ssl_counter_type, ssl_cipher); | 2184 metrics_observer_->IncrementSparseEnumCounter(ssl_counter_type, ssl_cipher); |
| 2179 } | 2185 } |
| 2180 } | 2186 } |
| 2181 | 2187 |
| 2182 } // namespace webrtc | 2188 } // namespace webrtc |
| OLD | NEW |