| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2011 The WebRTC project authors. All Rights Reserved. | 2 * Copyright 2011 The WebRTC project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| (...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 188 "a=ssrc:3 label:video_track_id_1\r\n"; | 188 "a=ssrc:3 label:video_track_id_1\r\n"; |
| 189 | 189 |
| 190 // SDP reference string without the candidates. | 190 // SDP reference string without the candidates. |
| 191 static const char kSdpString[] = | 191 static const char kSdpString[] = |
| 192 "v=0\r\n" | 192 "v=0\r\n" |
| 193 "o=- 18446744069414584320 18446462598732840960 IN IP4 127.0.0.1\r\n" | 193 "o=- 18446744069414584320 18446462598732840960 IN IP4 127.0.0.1\r\n" |
| 194 "s=-\r\n" | 194 "s=-\r\n" |
| 195 "t=0 0\r\n" | 195 "t=0 0\r\n" |
| 196 "a=msid-semantic: WMS local_stream_1\r\n" | 196 "a=msid-semantic: WMS local_stream_1\r\n" |
| 197 "m=audio 9 RTP/SAVPF 111 103 104\r\n" | 197 "m=audio 9 RTP/SAVPF 111 103 104\r\n" |
| 198 "c=IN IP4 0.0.0.0\r\n" | 198 "c=IN IP4 74.125.127.126\r\n" |
| 199 "a=rtcp:9 IN IP4 0.0.0.0\r\n" | 199 "a=rtcp:9 IN IP4 0.0.0.0\r\n" |
| 200 "a=ice-ufrag:ufrag_voice\r\na=ice-pwd:pwd_voice\r\n" | 200 "a=ice-ufrag:ufrag_voice\r\na=ice-pwd:pwd_voice\r\n" |
| 201 "a=mid:audio_content_name\r\n" | 201 "a=mid:audio_content_name\r\n" |
| 202 "a=sendrecv\r\n" | 202 "a=sendrecv\r\n" |
| 203 "a=rtcp-mux\r\n" | 203 "a=rtcp-mux\r\n" |
| 204 "a=rtcp-rsize\r\n" | 204 "a=rtcp-rsize\r\n" |
| 205 "a=crypto:1 AES_CM_128_HMAC_SHA1_32 " | 205 "a=crypto:1 AES_CM_128_HMAC_SHA1_32 " |
| 206 "inline:NzB4d1BINUAvLEw6UzF3WSJ+PSdFcGdUJShpX1Zj|2^20|1:32 " | 206 "inline:NzB4d1BINUAvLEw6UzF3WSJ+PSdFcGdUJShpX1Zj|2^20|1:32 " |
| 207 "dummy_session_params\r\n" | 207 "dummy_session_params\r\n" |
| 208 "a=rtpmap:111 opus/48000/2\r\n" | 208 "a=rtpmap:111 opus/48000/2\r\n" |
| 209 "a=rtpmap:103 ISAC/16000\r\n" | 209 "a=rtpmap:103 ISAC/16000\r\n" |
| 210 "a=rtpmap:104 ISAC/32000\r\n" | 210 "a=rtpmap:104 ISAC/32000\r\n" |
| 211 "a=ssrc:1 cname:stream_1_cname\r\n" | 211 "a=ssrc:1 cname:stream_1_cname\r\n" |
| 212 "a=ssrc:1 msid:local_stream_1 audio_track_id_1\r\n" | 212 "a=ssrc:1 msid:local_stream_1 audio_track_id_1\r\n" |
| 213 "a=ssrc:1 mslabel:local_stream_1\r\n" | 213 "a=ssrc:1 mslabel:local_stream_1\r\n" |
| 214 "a=ssrc:1 label:audio_track_id_1\r\n" | 214 "a=ssrc:1 label:audio_track_id_1\r\n" |
| 215 "m=video 9 RTP/SAVPF 120\r\n" | 215 "m=video 9 RTP/SAVPF 120\r\n" |
| 216 "c=IN IP4 0.0.0.0\r\n" | 216 "c=IN IP4 74.125.224.39\r\n" |
| 217 "a=rtcp:9 IN IP4 0.0.0.0\r\n" | 217 "a=rtcp:9 IN IP4 0.0.0.0\r\n" |
| 218 "a=ice-ufrag:ufrag_video\r\na=ice-pwd:pwd_video\r\n" | 218 "a=ice-ufrag:ufrag_video\r\na=ice-pwd:pwd_video\r\n" |
| 219 "a=mid:video_content_name\r\n" | 219 "a=mid:video_content_name\r\n" |
| 220 "a=sendrecv\r\n" | 220 "a=sendrecv\r\n" |
| 221 "a=crypto:1 AES_CM_128_HMAC_SHA1_80 " | 221 "a=crypto:1 AES_CM_128_HMAC_SHA1_80 " |
| 222 "inline:d0RmdmcmVCspeEc3QGZiNWpVLFJhQX1cfHAwJSoj|2^20|1:32\r\n" | 222 "inline:d0RmdmcmVCspeEc3QGZiNWpVLFJhQX1cfHAwJSoj|2^20|1:32\r\n" |
| 223 "a=rtpmap:120 VP8/90000\r\n" | 223 "a=rtpmap:120 VP8/90000\r\n" |
| 224 "a=ssrc-group:FEC 2 3\r\n" | 224 "a=ssrc-group:FEC 2 3\r\n" |
| 225 "a=ssrc:2 cname:stream_1_cname\r\n" | 225 "a=ssrc:2 cname:stream_1_cname\r\n" |
| 226 "a=ssrc:2 msid:local_stream_1 video_track_id_1\r\n" | 226 "a=ssrc:2 msid:local_stream_1 video_track_id_1\r\n" |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 369 "inline:NzB4d1BINUAvLEw6UzF3WSJ+PSdFcGdUJShpX1Zj|2^20|1:32 " | 369 "inline:NzB4d1BINUAvLEw6UzF3WSJ+PSdFcGdUJShpX1Zj|2^20|1:32 " |
| 370 "dummy_session_params\r\n" | 370 "dummy_session_params\r\n" |
| 371 "a=rtpmap:111 opus/48000/2\r\n" | 371 "a=rtpmap:111 opus/48000/2\r\n" |
| 372 "a=rtpmap:103 ISAC/16000\r\n" | 372 "a=rtpmap:103 ISAC/16000\r\n" |
| 373 "a=rtpmap:104 ISAC/32000\r\n" | 373 "a=rtpmap:104 ISAC/32000\r\n" |
| 374 "a=ssrc:1 cname:stream_1_cname\r\n" | 374 "a=ssrc:1 cname:stream_1_cname\r\n" |
| 375 "a=ssrc:1 msid:local_stream_1 audio_track_id_1\r\n" | 375 "a=ssrc:1 msid:local_stream_1 audio_track_id_1\r\n" |
| 376 "a=ssrc:1 mslabel:local_stream_1\r\n" | 376 "a=ssrc:1 mslabel:local_stream_1\r\n" |
| 377 "a=ssrc:1 label:audio_track_id_1\r\n" | 377 "a=ssrc:1 label:audio_track_id_1\r\n" |
| 378 "m=video 0 RTP/SAVPF 120\r\n" | 378 "m=video 0 RTP/SAVPF 120\r\n" |
| 379 "c=IN IP4 0.0.0.0\r\n" | 379 "c=IN IP4 74.125.224.39\r\n" |
| 380 "a=rtcp:9 IN IP4 0.0.0.0\r\n" | 380 "a=rtcp:9 IN IP4 0.0.0.0\r\n" |
| 381 "a=bundle-only\r\n" | 381 "a=bundle-only\r\n" |
| 382 "a=mid:video_content_name\r\n" | 382 "a=mid:video_content_name\r\n" |
| 383 "a=sendrecv\r\n" | 383 "a=sendrecv\r\n" |
| 384 "a=crypto:1 AES_CM_128_HMAC_SHA1_80 " | 384 "a=crypto:1 AES_CM_128_HMAC_SHA1_80 " |
| 385 "inline:d0RmdmcmVCspeEc3QGZiNWpVLFJhQX1cfHAwJSoj|2^20|1:32\r\n" | 385 "inline:d0RmdmcmVCspeEc3QGZiNWpVLFJhQX1cfHAwJSoj|2^20|1:32\r\n" |
| 386 "a=rtpmap:120 VP8/90000\r\n" | 386 "a=rtpmap:120 VP8/90000\r\n" |
| 387 "a=ssrc-group:FEC 2 3\r\n" | 387 "a=ssrc-group:FEC 2 3\r\n" |
| 388 "a=ssrc:2 cname:stream_1_cname\r\n" | 388 "a=ssrc:2 cname:stream_1_cname\r\n" |
| 389 "a=ssrc:2 msid:local_stream_1 video_track_id_1\r\n" | 389 "a=ssrc:2 msid:local_stream_1 video_track_id_1\r\n" |
| (...skipping 478 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 868 webrtc::InitializeAndroidObjects(); | 868 webrtc::InitializeAndroidObjects(); |
| 869 #endif | 869 #endif |
| 870 // AudioContentDescription | 870 // AudioContentDescription |
| 871 audio_desc_ = CreateAudioContentDescription(); | 871 audio_desc_ = CreateAudioContentDescription(); |
| 872 StreamParams audio_stream; | 872 StreamParams audio_stream; |
| 873 audio_stream.id = kAudioTrackId1; | 873 audio_stream.id = kAudioTrackId1; |
| 874 audio_stream.cname = kStream1Cname; | 874 audio_stream.cname = kStream1Cname; |
| 875 audio_stream.sync_label = kStreamLabel1; | 875 audio_stream.sync_label = kStreamLabel1; |
| 876 audio_stream.ssrcs.push_back(kAudioTrack1Ssrc); | 876 audio_stream.ssrcs.push_back(kAudioTrack1Ssrc); |
| 877 audio_desc_->AddStream(audio_stream); | 877 audio_desc_->AddStream(audio_stream); |
| 878 rtc::SocketAddress audio_addr_; |
| 879 audio_addr_.SetIP("74.125.127.126"); |
| 880 audio_desc_->set_connection_addr(audio_addr_); |
| 878 desc_.AddContent(kAudioContentName, NS_JINGLE_RTP, audio_desc_); | 881 desc_.AddContent(kAudioContentName, NS_JINGLE_RTP, audio_desc_); |
| 879 | 882 |
| 880 // VideoContentDescription | 883 // VideoContentDescription |
| 881 video_desc_ = CreateVideoContentDescription(); | 884 video_desc_ = CreateVideoContentDescription(); |
| 882 StreamParams video_stream; | 885 StreamParams video_stream; |
| 883 video_stream.id = kVideoTrackId1; | 886 video_stream.id = kVideoTrackId1; |
| 884 video_stream.cname = kStream1Cname; | 887 video_stream.cname = kStream1Cname; |
| 885 video_stream.sync_label = kStreamLabel1; | 888 video_stream.sync_label = kStreamLabel1; |
| 886 video_stream.ssrcs.push_back(kVideoTrack1Ssrc1); | 889 video_stream.ssrcs.push_back(kVideoTrack1Ssrc1); |
| 887 video_stream.ssrcs.push_back(kVideoTrack1Ssrc2); | 890 video_stream.ssrcs.push_back(kVideoTrack1Ssrc2); |
| 888 cricket::SsrcGroup ssrc_group(kFecSsrcGroupSemantics, video_stream.ssrcs); | 891 cricket::SsrcGroup ssrc_group(kFecSsrcGroupSemantics, video_stream.ssrcs); |
| 889 video_stream.ssrc_groups.push_back(ssrc_group); | 892 video_stream.ssrc_groups.push_back(ssrc_group); |
| 890 video_desc_->AddStream(video_stream); | 893 video_desc_->AddStream(video_stream); |
| 894 rtc::SocketAddress video_addr_; |
| 895 video_addr_.SetIP("74.125.224.39"); |
| 896 video_desc_->set_connection_addr(video_addr_); |
| 891 desc_.AddContent(kVideoContentName, NS_JINGLE_RTP, video_desc_); | 897 desc_.AddContent(kVideoContentName, NS_JINGLE_RTP, video_desc_); |
| 892 | 898 |
| 893 // TransportInfo | 899 // TransportInfo |
| 894 EXPECT_TRUE(desc_.AddTransportInfo(TransportInfo( | 900 EXPECT_TRUE(desc_.AddTransportInfo(TransportInfo( |
| 895 kAudioContentName, TransportDescription(kUfragVoice, kPwdVoice)))); | 901 kAudioContentName, TransportDescription(kUfragVoice, kPwdVoice)))); |
| 896 EXPECT_TRUE(desc_.AddTransportInfo(TransportInfo( | 902 EXPECT_TRUE(desc_.AddTransportInfo(TransportInfo( |
| 897 kVideoContentName, TransportDescription(kUfragVideo, kPwdVideo)))); | 903 kVideoContentName, TransportDescription(kUfragVideo, kPwdVideo)))); |
| 898 | 904 |
| 899 // v4 host | 905 // v4 host |
| 900 int port = 1234; | 906 int port = 1234; |
| (...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1080 // with 2 audio tracks and 3 video tracks. | 1086 // with 2 audio tracks and 3 video tracks. |
| 1081 void MakeUnifiedPlanDescription() { | 1087 void MakeUnifiedPlanDescription() { |
| 1082 // Audio track 2. | 1088 // Audio track 2. |
| 1083 AudioContentDescription* audio_desc_2 = CreateAudioContentDescription(); | 1089 AudioContentDescription* audio_desc_2 = CreateAudioContentDescription(); |
| 1084 StreamParams audio_track_2; | 1090 StreamParams audio_track_2; |
| 1085 audio_track_2.id = kAudioTrackId2; | 1091 audio_track_2.id = kAudioTrackId2; |
| 1086 audio_track_2.cname = kStream2Cname; | 1092 audio_track_2.cname = kStream2Cname; |
| 1087 audio_track_2.sync_label = kStreamLabel2; | 1093 audio_track_2.sync_label = kStreamLabel2; |
| 1088 audio_track_2.ssrcs.push_back(kAudioTrack2Ssrc); | 1094 audio_track_2.ssrcs.push_back(kAudioTrack2Ssrc); |
| 1089 audio_desc_2->AddStream(audio_track_2); | 1095 audio_desc_2->AddStream(audio_track_2); |
| 1096 rtc::SocketAddress addr; |
| 1097 addr.SetIP("0.0.0.0"); |
| 1098 audio_desc_2->set_connection_addr(addr); |
| 1090 desc_.AddContent(kAudioContentName2, NS_JINGLE_RTP, audio_desc_2); | 1099 desc_.AddContent(kAudioContentName2, NS_JINGLE_RTP, audio_desc_2); |
| 1091 EXPECT_TRUE(desc_.AddTransportInfo(TransportInfo( | 1100 EXPECT_TRUE(desc_.AddTransportInfo(TransportInfo( |
| 1092 kAudioContentName2, TransportDescription(kUfragVoice2, kPwdVoice2)))); | 1101 kAudioContentName2, TransportDescription(kUfragVoice2, kPwdVoice2)))); |
| 1093 | 1102 |
| 1094 // Video track 2, in stream 2. | 1103 // Video track 2, in stream 2. |
| 1095 VideoContentDescription* video_desc_2 = CreateVideoContentDescription(); | 1104 VideoContentDescription* video_desc_2 = CreateVideoContentDescription(); |
| 1096 StreamParams video_track_2; | 1105 StreamParams video_track_2; |
| 1097 video_track_2.id = kVideoTrackId2; | 1106 video_track_2.id = kVideoTrackId2; |
| 1098 video_track_2.cname = kStream2Cname; | 1107 video_track_2.cname = kStream2Cname; |
| 1099 video_track_2.sync_label = kStreamLabel2; | 1108 video_track_2.sync_label = kStreamLabel2; |
| 1100 video_track_2.ssrcs.push_back(kVideoTrack2Ssrc); | 1109 video_track_2.ssrcs.push_back(kVideoTrack2Ssrc); |
| 1101 video_desc_2->AddStream(video_track_2); | 1110 video_desc_2->AddStream(video_track_2); |
| 1111 video_desc_2->set_connection_addr(addr); |
| 1102 desc_.AddContent(kVideoContentName2, NS_JINGLE_RTP, video_desc_2); | 1112 desc_.AddContent(kVideoContentName2, NS_JINGLE_RTP, video_desc_2); |
| 1103 EXPECT_TRUE(desc_.AddTransportInfo(TransportInfo( | 1113 EXPECT_TRUE(desc_.AddTransportInfo(TransportInfo( |
| 1104 kVideoContentName2, TransportDescription(kUfragVideo2, kPwdVideo2)))); | 1114 kVideoContentName2, TransportDescription(kUfragVideo2, kPwdVideo2)))); |
| 1105 | 1115 |
| 1106 // Video track 3, in stream 2. | 1116 // Video track 3, in stream 2. |
| 1107 VideoContentDescription* video_desc_3 = CreateVideoContentDescription(); | 1117 VideoContentDescription* video_desc_3 = CreateVideoContentDescription(); |
| 1108 StreamParams video_track_3; | 1118 StreamParams video_track_3; |
| 1109 video_track_3.id = kVideoTrackId3; | 1119 video_track_3.id = kVideoTrackId3; |
| 1110 video_track_3.cname = kStream2Cname; | 1120 video_track_3.cname = kStream2Cname; |
| 1111 video_track_3.sync_label = kStreamLabel2; | 1121 video_track_3.sync_label = kStreamLabel2; |
| 1112 video_track_3.ssrcs.push_back(kVideoTrack3Ssrc); | 1122 video_track_3.ssrcs.push_back(kVideoTrack3Ssrc); |
| 1113 video_desc_3->AddStream(video_track_3); | 1123 video_desc_3->AddStream(video_track_3); |
| 1124 video_desc_3->set_connection_addr(addr); |
| 1114 desc_.AddContent(kVideoContentName3, NS_JINGLE_RTP, video_desc_3); | 1125 desc_.AddContent(kVideoContentName3, NS_JINGLE_RTP, video_desc_3); |
| 1115 EXPECT_TRUE(desc_.AddTransportInfo(TransportInfo( | 1126 EXPECT_TRUE(desc_.AddTransportInfo(TransportInfo( |
| 1116 kVideoContentName3, TransportDescription(kUfragVideo3, kPwdVideo3)))); | 1127 kVideoContentName3, TransportDescription(kUfragVideo3, kPwdVideo3)))); |
| 1117 | 1128 |
| 1118 ASSERT_TRUE(jdesc_.Initialize(desc_.Copy(), jdesc_.session_id(), | 1129 ASSERT_TRUE(jdesc_.Initialize(desc_.Copy(), jdesc_.session_id(), |
| 1119 jdesc_.session_version())); | 1130 jdesc_.session_version())); |
| 1120 } | 1131 } |
| 1121 | 1132 |
| 1122 // Creates an audio content description with no streams, and some default | 1133 // Creates an audio content description with no streams, and some default |
| 1123 // configuration. | 1134 // configuration. |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1204 | 1215 |
| 1205 // extmap | 1216 // extmap |
| 1206 ASSERT_EQ(cd1->rtp_header_extensions().size(), | 1217 ASSERT_EQ(cd1->rtp_header_extensions().size(), |
| 1207 cd2->rtp_header_extensions().size()); | 1218 cd2->rtp_header_extensions().size()); |
| 1208 for (size_t i = 0; i< cd1->rtp_header_extensions().size(); ++i) { | 1219 for (size_t i = 0; i< cd1->rtp_header_extensions().size(); ++i) { |
| 1209 const RtpExtension ext1 = cd1->rtp_header_extensions().at(i); | 1220 const RtpExtension ext1 = cd1->rtp_header_extensions().at(i); |
| 1210 const RtpExtension ext2 = cd2->rtp_header_extensions().at(i); | 1221 const RtpExtension ext2 = cd2->rtp_header_extensions().at(i); |
| 1211 EXPECT_EQ(ext1.uri, ext2.uri); | 1222 EXPECT_EQ(ext1.uri, ext2.uri); |
| 1212 EXPECT_EQ(ext1.id, ext2.id); | 1223 EXPECT_EQ(ext1.id, ext2.id); |
| 1213 } | 1224 } |
| 1225 |
| 1226 // connection address |
| 1227 EXPECT_EQ(cd1->connection_addr(), cd2->connection_addr()); |
| 1214 } | 1228 } |
| 1215 | 1229 |
| 1216 void CompareDataContentDescription(const DataContentDescription* dcd1, | 1230 void CompareDataContentDescription(const DataContentDescription* dcd1, |
| 1217 const DataContentDescription* dcd2) { | 1231 const DataContentDescription* dcd2) { |
| 1218 EXPECT_EQ(dcd1->use_sctpmap(), dcd2->use_sctpmap()); | 1232 EXPECT_EQ(dcd1->use_sctpmap(), dcd2->use_sctpmap()); |
| 1219 CompareMediaContentDescription<DataContentDescription>(dcd1, dcd2); | 1233 CompareMediaContentDescription<DataContentDescription>(dcd1, dcd2); |
| 1220 } | 1234 } |
| 1221 | 1235 |
| 1222 void CompareSessionDescription(const SessionDescription& desc1, | 1236 void CompareSessionDescription(const SessionDescription& desc1, |
| 1223 const SessionDescription& desc2) { | 1237 const SessionDescription& desc2) { |
| (...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1496 | 1510 |
| 1497 void AddSctpDataChannel(bool use_sctpmap) { | 1511 void AddSctpDataChannel(bool use_sctpmap) { |
| 1498 std::unique_ptr<DataContentDescription> data(new DataContentDescription()); | 1512 std::unique_ptr<DataContentDescription> data(new DataContentDescription()); |
| 1499 data_desc_ = data.get(); | 1513 data_desc_ = data.get(); |
| 1500 data_desc_->set_use_sctpmap(use_sctpmap); | 1514 data_desc_->set_use_sctpmap(use_sctpmap); |
| 1501 data_desc_->set_protocol(cricket::kMediaProtocolDtlsSctp); | 1515 data_desc_->set_protocol(cricket::kMediaProtocolDtlsSctp); |
| 1502 DataCodec codec(cricket::kGoogleSctpDataCodecPlType, | 1516 DataCodec codec(cricket::kGoogleSctpDataCodecPlType, |
| 1503 cricket::kGoogleSctpDataCodecName); | 1517 cricket::kGoogleSctpDataCodecName); |
| 1504 codec.SetParam(cricket::kCodecParamPort, kDefaultSctpPort); | 1518 codec.SetParam(cricket::kCodecParamPort, kDefaultSctpPort); |
| 1505 data_desc_->AddCodec(codec); | 1519 data_desc_->AddCodec(codec); |
| 1520 rtc::SocketAddress addr_; |
| 1521 addr_.SetIP("0.0.0.0"); |
| 1522 data_desc_->set_connection_addr(addr_); |
| 1506 desc_.AddContent(kDataContentName, NS_JINGLE_DRAFT_SCTP, data.release()); | 1523 desc_.AddContent(kDataContentName, NS_JINGLE_DRAFT_SCTP, data.release()); |
| 1507 EXPECT_TRUE(desc_.AddTransportInfo(TransportInfo( | 1524 EXPECT_TRUE(desc_.AddTransportInfo(TransportInfo( |
| 1508 kDataContentName, TransportDescription(kUfragData, kPwdData)))); | 1525 kDataContentName, TransportDescription(kUfragData, kPwdData)))); |
| 1509 } | 1526 } |
| 1510 | 1527 |
| 1511 void AddRtpDataChannel() { | 1528 void AddRtpDataChannel() { |
| 1512 std::unique_ptr<DataContentDescription> data(new DataContentDescription()); | 1529 std::unique_ptr<DataContentDescription> data(new DataContentDescription()); |
| 1513 data_desc_ = data.get(); | 1530 data_desc_ = data.get(); |
| 1514 | 1531 |
| 1515 data_desc_->AddCodec(DataCodec(101, "google-data")); | 1532 data_desc_->AddCodec(DataCodec(101, "google-data")); |
| 1516 StreamParams data_stream; | 1533 StreamParams data_stream; |
| 1517 data_stream.id = kDataChannelMsid; | 1534 data_stream.id = kDataChannelMsid; |
| 1518 data_stream.cname = kDataChannelCname; | 1535 data_stream.cname = kDataChannelCname; |
| 1519 data_stream.sync_label = kDataChannelLabel; | 1536 data_stream.sync_label = kDataChannelLabel; |
| 1520 data_stream.ssrcs.push_back(kDataChannelSsrc); | 1537 data_stream.ssrcs.push_back(kDataChannelSsrc); |
| 1521 data_desc_->AddStream(data_stream); | 1538 data_desc_->AddStream(data_stream); |
| 1522 data_desc_->AddCrypto(CryptoParams( | 1539 data_desc_->AddCrypto(CryptoParams( |
| 1523 1, "AES_CM_128_HMAC_SHA1_80", | 1540 1, "AES_CM_128_HMAC_SHA1_80", |
| 1524 "inline:FvLcvU2P3ZWmQxgPAgcDu7Zl9vftYElFOjEzhWs5", "")); | 1541 "inline:FvLcvU2P3ZWmQxgPAgcDu7Zl9vftYElFOjEzhWs5", "")); |
| 1525 data_desc_->set_protocol(cricket::kMediaProtocolSavpf); | 1542 data_desc_->set_protocol(cricket::kMediaProtocolSavpf); |
| 1543 rtc::SocketAddress addr_; |
| 1544 addr_.SetIP("0.0.0.0"); |
| 1545 data_desc_->set_connection_addr(addr_); |
| 1526 desc_.AddContent(kDataContentName, NS_JINGLE_RTP, data.release()); | 1546 desc_.AddContent(kDataContentName, NS_JINGLE_RTP, data.release()); |
| 1527 EXPECT_TRUE(desc_.AddTransportInfo(TransportInfo( | 1547 EXPECT_TRUE(desc_.AddTransportInfo(TransportInfo( |
| 1528 kDataContentName, TransportDescription(kUfragData, kPwdData)))); | 1548 kDataContentName, TransportDescription(kUfragData, kPwdData)))); |
| 1529 } | 1549 } |
| 1530 | 1550 |
| 1531 bool TestDeserializeDirection(cricket::MediaContentDirection direction) { | 1551 bool TestDeserializeDirection(cricket::MediaContentDirection direction) { |
| 1532 std::string new_sdp = kSdpFullString; | 1552 std::string new_sdp = kSdpFullString; |
| 1533 ReplaceDirection(direction, &new_sdp); | 1553 ReplaceDirection(direction, &new_sdp); |
| 1534 JsepSessionDescription new_jdesc(kDummyString); | 1554 JsepSessionDescription new_jdesc(kDummyString); |
| 1535 | 1555 |
| (...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1794 // SessionDescription with desc and candidates. | 1814 // SessionDescription with desc and candidates. |
| 1795 std::string message = webrtc::SdpSerialize(jdesc_, false); | 1815 std::string message = webrtc::SdpSerialize(jdesc_, false); |
| 1796 TestMismatch(std::string(kSdpFullString), message); | 1816 TestMismatch(std::string(kSdpFullString), message); |
| 1797 } | 1817 } |
| 1798 | 1818 |
| 1799 TEST_F(WebRtcSdpTest, SerializeSessionDescriptionEmpty) { | 1819 TEST_F(WebRtcSdpTest, SerializeSessionDescriptionEmpty) { |
| 1800 JsepSessionDescription jdesc_empty(kDummyString); | 1820 JsepSessionDescription jdesc_empty(kDummyString); |
| 1801 EXPECT_EQ("", webrtc::SdpSerialize(jdesc_empty, false)); | 1821 EXPECT_EQ("", webrtc::SdpSerialize(jdesc_empty, false)); |
| 1802 } | 1822 } |
| 1803 | 1823 |
| 1804 // This tests serialization of SDP with only IPv6 candidates and verifies that | 1824 // This tests serialization of SDP with only IPv6 address. |
| 1805 // IPv6 is used as default address in c line according to preference. | |
| 1806 TEST_F(WebRtcSdpTest, SerializeSessionDescriptionWithIPv6Only) { | 1825 TEST_F(WebRtcSdpTest, SerializeSessionDescriptionWithIPv6Only) { |
| 1807 // Only test 1 m line. | 1826 // Only test 1 m line. |
| 1808 desc_.RemoveContentByName("video_content_name"); | 1827 desc_.RemoveContentByName("video_content_name"); |
| 1809 // Stun has a high preference than local host. | |
| 1810 cricket::Candidate candidate1( | |
| 1811 cricket::ICE_CANDIDATE_COMPONENT_RTP, "udp", | |
| 1812 rtc::SocketAddress("::1", 1234), kCandidatePriority, "", "", | |
| 1813 cricket::STUN_PORT_TYPE, kCandidateGeneration, kCandidateFoundation1); | |
| 1814 cricket::Candidate candidate2( | |
| 1815 cricket::ICE_CANDIDATE_COMPONENT_RTP, "udp", | |
| 1816 rtc::SocketAddress("::2", 1235), kCandidatePriority, "", "", | |
| 1817 cricket::LOCAL_PORT_TYPE, kCandidateGeneration, kCandidateFoundation1); | |
| 1818 JsepSessionDescription jdesc(kDummyString); | 1828 JsepSessionDescription jdesc(kDummyString); |
| 1829 auto content = static_cast<cricket::MediaContentDescription*>( |
| 1830 desc_.FirstContent()->description); |
| 1831 rtc::SocketAddress addr; |
| 1832 addr.SetIP("0000:0000:0000:0000:0000:0000:0000:0001"); |
| 1833 content->set_connection_addr(addr); |
| 1819 ASSERT_TRUE(jdesc.Initialize(desc_.Copy(), kSessionId, kSessionVersion)); | 1834 ASSERT_TRUE(jdesc.Initialize(desc_.Copy(), kSessionId, kSessionVersion)); |
| 1820 | 1835 |
| 1821 // Only add the candidates to audio m line. | |
| 1822 JsepIceCandidate jice1("audio_content_name", 0, candidate1); | |
| 1823 JsepIceCandidate jice2("audio_content_name", 0, candidate2); | |
| 1824 ASSERT_TRUE(jdesc.AddCandidate(&jice1)); | |
| 1825 ASSERT_TRUE(jdesc.AddCandidate(&jice2)); | |
| 1826 std::string message = webrtc::SdpSerialize(jdesc, false); | 1836 std::string message = webrtc::SdpSerialize(jdesc, false); |
| 1827 | 1837 |
| 1828 // Audio line should have a c line like this one. | 1838 // Audio line should have a c line like this one. |
| 1829 EXPECT_NE(message.find("c=IN IP6 ::1"), std::string::npos); | 1839 EXPECT_NE(message.find("c=IN IP6 ::1"), std::string::npos); |
| 1830 // Shouldn't have a IP4 c line. | 1840 // Shouldn't have a IP4 c line. |
| 1831 EXPECT_EQ(message.find("c=IN IP4"), std::string::npos); | 1841 EXPECT_EQ(message.find("c=IN IP4"), std::string::npos); |
| 1832 } | 1842 } |
| 1833 | 1843 |
| 1834 // This tests serialization of SDP with both IPv4 and IPv6 candidates and | |
| 1835 // verifies that IPv4 is used as default address in c line even if the | |
| 1836 // preference of IPv4 is lower. | |
| 1837 TEST_F(WebRtcSdpTest, SerializeSessionDescriptionWithBothIPFamilies) { | |
| 1838 // Only test 1 m line. | |
| 1839 desc_.RemoveContentByName("video_content_name"); | |
| 1840 cricket::Candidate candidate_v4( | |
| 1841 cricket::ICE_CANDIDATE_COMPONENT_RTP, "udp", | |
| 1842 rtc::SocketAddress("192.168.1.5", 1234), kCandidatePriority, "", "", | |
| 1843 cricket::STUN_PORT_TYPE, kCandidateGeneration, kCandidateFoundation1); | |
| 1844 cricket::Candidate candidate_v6( | |
| 1845 cricket::ICE_CANDIDATE_COMPONENT_RTP, "udp", | |
| 1846 rtc::SocketAddress("::1", 1234), kCandidatePriority, "", "", | |
| 1847 cricket::LOCAL_PORT_TYPE, kCandidateGeneration, kCandidateFoundation1); | |
| 1848 JsepSessionDescription jdesc(kDummyString); | |
| 1849 ASSERT_TRUE(jdesc.Initialize(desc_.Copy(), kSessionId, kSessionVersion)); | |
| 1850 | |
| 1851 // Only add the candidates to audio m line. | |
| 1852 JsepIceCandidate jice_v4("audio_content_name", 0, candidate_v4); | |
| 1853 JsepIceCandidate jice_v6("audio_content_name", 0, candidate_v6); | |
| 1854 ASSERT_TRUE(jdesc.AddCandidate(&jice_v4)); | |
| 1855 ASSERT_TRUE(jdesc.AddCandidate(&jice_v6)); | |
| 1856 std::string message = webrtc::SdpSerialize(jdesc, false); | |
| 1857 | |
| 1858 // Audio line should have a c line like this one. | |
| 1859 EXPECT_NE(message.find("c=IN IP4 192.168.1.5"), std::string::npos); | |
| 1860 // Shouldn't have a IP6 c line. | |
| 1861 EXPECT_EQ(message.find("c=IN IP6"), std::string::npos); | |
| 1862 } | |
| 1863 | |
| 1864 // This tests serialization of SDP with both UDP and TCP candidates and | |
| 1865 // verifies that UDP is used as default address in c line even if the | |
| 1866 // preference of UDP is lower. | |
| 1867 TEST_F(WebRtcSdpTest, SerializeSessionDescriptionWithBothProtocols) { | |
| 1868 // Only test 1 m line. | |
| 1869 desc_.RemoveContentByName("video_content_name"); | |
| 1870 // Stun has a high preference than local host. | |
| 1871 cricket::Candidate candidate1( | |
| 1872 cricket::ICE_CANDIDATE_COMPONENT_RTP, "tcp", | |
| 1873 rtc::SocketAddress("::1", 1234), kCandidatePriority, "", "", | |
| 1874 cricket::STUN_PORT_TYPE, kCandidateGeneration, kCandidateFoundation1); | |
| 1875 cricket::Candidate candidate2( | |
| 1876 cricket::ICE_CANDIDATE_COMPONENT_RTP, "udp", | |
| 1877 rtc::SocketAddress("fe80::1234:5678:abcd:ef12", 1235), kCandidatePriority, | |
| 1878 "", "", cricket::LOCAL_PORT_TYPE, kCandidateGeneration, | |
| 1879 kCandidateFoundation1); | |
| 1880 JsepSessionDescription jdesc(kDummyString); | |
| 1881 ASSERT_TRUE(jdesc.Initialize(desc_.Copy(), kSessionId, kSessionVersion)); | |
| 1882 | |
| 1883 // Only add the candidates to audio m line. | |
| 1884 JsepIceCandidate jice1("audio_content_name", 0, candidate1); | |
| 1885 JsepIceCandidate jice2("audio_content_name", 0, candidate2); | |
| 1886 ASSERT_TRUE(jdesc.AddCandidate(&jice1)); | |
| 1887 ASSERT_TRUE(jdesc.AddCandidate(&jice2)); | |
| 1888 std::string message = webrtc::SdpSerialize(jdesc, false); | |
| 1889 | |
| 1890 // Audio line should have a c line like this one. | |
| 1891 EXPECT_NE(message.find("c=IN IP6 fe80::1234:5678:abcd:ef12"), | |
| 1892 std::string::npos); | |
| 1893 // Shouldn't have a IP4 c line. | |
| 1894 EXPECT_EQ(message.find("c=IN IP4"), std::string::npos); | |
| 1895 } | |
| 1896 | |
| 1897 // This tests serialization of SDP with only TCP candidates and verifies that | |
| 1898 // null IPv4 is used as default address in c line. | |
| 1899 TEST_F(WebRtcSdpTest, SerializeSessionDescriptionWithTCPOnly) { | |
| 1900 // Only test 1 m line. | |
| 1901 desc_.RemoveContentByName("video_content_name"); | |
| 1902 // Stun has a high preference than local host. | |
| 1903 cricket::Candidate candidate1( | |
| 1904 cricket::ICE_CANDIDATE_COMPONENT_RTP, "tcp", | |
| 1905 rtc::SocketAddress("::1", 1234), kCandidatePriority, "", "", | |
| 1906 cricket::STUN_PORT_TYPE, kCandidateGeneration, kCandidateFoundation1); | |
| 1907 cricket::Candidate candidate2( | |
| 1908 cricket::ICE_CANDIDATE_COMPONENT_RTP, "tcp", | |
| 1909 rtc::SocketAddress("::2", 1235), kCandidatePriority, "", "", | |
| 1910 cricket::LOCAL_PORT_TYPE, kCandidateGeneration, kCandidateFoundation1); | |
| 1911 JsepSessionDescription jdesc(kDummyString); | |
| 1912 ASSERT_TRUE(jdesc.Initialize(desc_.Copy(), kSessionId, kSessionVersion)); | |
| 1913 | |
| 1914 // Only add the candidates to audio m line. | |
| 1915 JsepIceCandidate jice1("audio_content_name", 0, candidate1); | |
| 1916 JsepIceCandidate jice2("audio_content_name", 0, candidate2); | |
| 1917 ASSERT_TRUE(jdesc.AddCandidate(&jice1)); | |
| 1918 ASSERT_TRUE(jdesc.AddCandidate(&jice2)); | |
| 1919 std::string message = webrtc::SdpSerialize(jdesc, false); | |
| 1920 | |
| 1921 // Audio line should have a c line like this one when no any default exists. | |
| 1922 EXPECT_NE(message.find("c=IN IP4 0.0.0.0"), std::string::npos); | |
| 1923 } | |
| 1924 | |
| 1925 // This tests serialization of SDP with a=crypto and a=fingerprint, as would be | 1844 // This tests serialization of SDP with a=crypto and a=fingerprint, as would be |
| 1926 // the case in a DTLS offer. | 1845 // the case in a DTLS offer. |
| 1927 TEST_F(WebRtcSdpTest, SerializeSessionDescriptionWithFingerprint) { | 1846 TEST_F(WebRtcSdpTest, SerializeSessionDescriptionWithFingerprint) { |
| 1928 AddFingerprint(); | 1847 AddFingerprint(); |
| 1929 JsepSessionDescription jdesc_with_fingerprint(kDummyString); | 1848 JsepSessionDescription jdesc_with_fingerprint(kDummyString); |
| 1930 ASSERT_TRUE(jdesc_with_fingerprint.Initialize(desc_.Copy(), | 1849 ASSERT_TRUE(jdesc_with_fingerprint.Initialize(desc_.Copy(), |
| 1931 kSessionId, kSessionVersion)); | 1850 kSessionId, kSessionVersion)); |
| 1932 std::string message = webrtc::SdpSerialize(jdesc_with_fingerprint, false); | 1851 std::string message = webrtc::SdpSerialize(jdesc_with_fingerprint, false); |
| 1933 | 1852 |
| 1934 std::string sdp_with_fingerprint = kSdpString; | 1853 std::string sdp_with_fingerprint = kSdpString; |
| (...skipping 1562 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3497 "s=-\r\n" | 3416 "s=-\r\n" |
| 3498 "t=0 0\r\n" | 3417 "t=0 0\r\n" |
| 3499 "m=audio 9 RTP/SAVPF 111\r\n" | 3418 "m=audio 9 RTP/SAVPF 111\r\n" |
| 3500 "c=IN IP4 0.0.0.0\r\n" | 3419 "c=IN IP4 0.0.0.0\r\n" |
| 3501 "a=rtpmap:111 opus/48000/2\r\n" | 3420 "a=rtpmap:111 opus/48000/2\r\n" |
| 3502 "a=msid: track_id\r\n"; | 3421 "a=msid: track_id\r\n"; |
| 3503 | 3422 |
| 3504 JsepSessionDescription jdesc_output(kDummyString); | 3423 JsepSessionDescription jdesc_output(kDummyString); |
| 3505 EXPECT_FALSE(SdpDeserialize(kSdpWithMissingStreamId, &jdesc_output)); | 3424 EXPECT_FALSE(SdpDeserialize(kSdpWithMissingStreamId, &jdesc_output)); |
| 3506 } | 3425 } |
| 3426 |
| 3427 // Tests that the session level connection address will be used if the media |
| 3428 // level addresses are not specified. |
| 3429 TEST_F(WebRtcSdpTest, ParseConnectionData) { |
| 3430 JsepSessionDescription jsep_desc(kDummyString); |
| 3431 |
| 3432 // Sesssion level address. |
| 3433 std::string sdp = kSdpFullString; |
| 3434 InjectAfter("s=-\r\n", "c=IN IP4 192.168.0.3\r\n", &sdp); |
| 3435 Replace("c=IN IP4 74.125.127.126\r\n", "", &sdp); |
| 3436 Replace("c=IN IP4 74.125.224.39\r\n", "", &sdp); |
| 3437 EXPECT_TRUE(SdpDeserialize(sdp, &jsep_desc)); |
| 3438 |
| 3439 // Remove the media level addresses. |
| 3440 // The port is expected to be the default value 0. |
| 3441 const auto& content1 = jsep_desc.description()->contents()[0]; |
| 3442 EXPECT_EQ("192.168.0.3:0", |
| 3443 static_cast<cricket::MediaContentDescription*>(content1.description) |
| 3444 ->connection_addr() |
| 3445 .ToString()); |
| 3446 const auto& content2 = jsep_desc.description()->contents()[1]; |
| 3447 EXPECT_EQ("192.168.0.3:0", |
| 3448 static_cast<cricket::MediaContentDescription*>(content2.description) |
| 3449 ->connection_addr() |
| 3450 .ToString()); |
| 3451 } |
| 3452 |
| 3453 TEST_F(WebRtcSdpTest, ParseConnectionDataIPv6) { |
| 3454 JsepSessionDescription jsep_desc(kDummyString); |
| 3455 |
| 3456 std::string sdp = kSdpFullString; |
| 3457 EXPECT_TRUE(SdpDeserialize(sdp, &jsep_desc)); |
| 3458 Replace("c=IN IP4 74.125.127.126\r\n", |
| 3459 "c=IN IP6 2001:0db8:85a3:0000:0000:8a2e:0370:7335\r\n", &sdp); |
| 3460 Replace("c=IN IP4 74.125.224.39\r\n", |
| 3461 "c=IN IP6 2001:0db8:85a3:0000:0000:8a2e:0370:7336\r\n", &sdp); |
| 3462 EXPECT_TRUE(SdpDeserialize(sdp, &jsep_desc)); |
| 3463 const auto& content3 = jsep_desc.description()->contents()[0]; |
| 3464 EXPECT_EQ("[2001:db8:85a3::8a2e:370:7335]:0", |
| 3465 static_cast<cricket::MediaContentDescription*>(content3.description) |
| 3466 ->connection_addr() |
| 3467 .ToString()); |
| 3468 const auto& content4 = jsep_desc.description()->contents()[1]; |
| 3469 EXPECT_EQ("[2001:db8:85a3::8a2e:370:7336]:0", |
| 3470 static_cast<cricket::MediaContentDescription*>(content4.description) |
| 3471 ->connection_addr() |
| 3472 .ToString()); |
| 3473 } |
| 3474 |
| 3475 // Test that the invalid or unsupprted connection data cannot be parsed. |
| 3476 TEST_F(WebRtcSdpTest, ParseConnectionDataFailure) { |
| 3477 JsepSessionDescription jsep_desc(kDummyString); |
| 3478 std::string sdp = kSdpFullString; |
| 3479 EXPECT_TRUE(SdpDeserialize(sdp, &jsep_desc)); |
| 3480 |
| 3481 // unsupported IPv4 address. |
| 3482 sdp = kSdpFullString; |
| 3483 Replace("c=IN IP4 74.125.224.39\r\n", "c=IN IP4 74.125.224.39/127\r\n", &sdp); |
| 3484 EXPECT_FALSE(SdpDeserialize(sdp, &jsep_desc)); |
| 3485 |
| 3486 // unsupported IPv6 address. |
| 3487 sdp = kSdpFullString; |
| 3488 Replace("c=IN IP4 74.125.224.39\r\n", "c=IN IP6 a/3\r\n", &sdp); |
| 3489 EXPECT_FALSE(SdpDeserialize(sdp, &jsep_desc)); |
| 3490 |
| 3491 // mismatched address type. |
| 3492 sdp = kSdpFullString; |
| 3493 Replace("c=IN IP4 74.125.224.39\r\n", "c=IN IP6 74.125.224.39\r\n", &sdp); |
| 3494 EXPECT_FALSE(SdpDeserialize(sdp, &jsep_desc)); |
| 3495 |
| 3496 sdp = kSdpFullString; |
| 3497 Replace("c=IN IP4 74.125.224.39\r\n", |
| 3498 "c=IN IP4 2001:0db8:85a3:0000:0000:8a2e:0370:7334/3\r\n", &sdp); |
| 3499 EXPECT_FALSE(SdpDeserialize(sdp, &jsep_desc)); |
| 3500 } |
| OLD | NEW |