diff options
Diffstat (limited to 'third_party/libwebrtc/pc/webrtc_sdp_unittest.cc')
-rw-r--r-- | third_party/libwebrtc/pc/webrtc_sdp_unittest.cc | 131 |
1 files changed, 91 insertions, 40 deletions
diff --git a/third_party/libwebrtc/pc/webrtc_sdp_unittest.cc b/third_party/libwebrtc/pc/webrtc_sdp_unittest.cc index ae26ba0ce2..eb9bc729c6 100644 --- a/third_party/libwebrtc/pc/webrtc_sdp_unittest.cc +++ b/third_party/libwebrtc/pc/webrtc_sdp_unittest.cc @@ -173,6 +173,7 @@ static const char kSdpFullString[] = "a=ice-ufrag:ufrag_voice\r\na=ice-pwd:pwd_voice\r\n" "a=mid:audio_content_name\r\n" "a=sendrecv\r\n" + "a=msid:local_stream_1 audio_track_id_1\r\n" "a=rtcp-mux\r\n" "a=rtcp-rsize\r\n" "a=crypto:1 AES_CM_128_HMAC_SHA1_32 " @@ -182,7 +183,6 @@ static const char kSdpFullString[] = "a=rtpmap:103 ISAC/16000\r\n" "a=rtpmap:104 ISAC/32000\r\n" "a=ssrc:1 cname:stream_1_cname\r\n" - "a=ssrc:1 msid:local_stream_1 audio_track_id_1\r\n" "m=video 3457 RTP/SAVPF 120\r\n" "c=IN IP4 74.125.224.39\r\n" "a=rtcp:3456 IN IP4 74.125.224.39\r\n" @@ -201,14 +201,13 @@ static const char kSdpFullString[] = "a=ice-ufrag:ufrag_video\r\na=ice-pwd:pwd_video\r\n" "a=mid:video_content_name\r\n" "a=sendrecv\r\n" + "a=msid:local_stream_1 video_track_id_1\r\n" "a=crypto:1 AES_CM_128_HMAC_SHA1_80 " "inline:d0RmdmcmVCspeEc3QGZiNWpVLFJhQX1cfHAwJSoj|2^20|1:32\r\n" "a=rtpmap:120 VP8/90000\r\n" "a=ssrc-group:FEC 2 3\r\n" "a=ssrc:2 cname:stream_1_cname\r\n" - "a=ssrc:2 msid:local_stream_1 video_track_id_1\r\n" - "a=ssrc:3 cname:stream_1_cname\r\n" - "a=ssrc:3 msid:local_stream_1 video_track_id_1\r\n"; + "a=ssrc:3 cname:stream_1_cname\r\n"; // SDP reference string without the candidates. static const char kSdpString[] = @@ -224,6 +223,7 @@ static const char kSdpString[] = "a=ice-ufrag:ufrag_voice\r\na=ice-pwd:pwd_voice\r\n" "a=mid:audio_content_name\r\n" "a=sendrecv\r\n" + "a=msid:local_stream_1 audio_track_id_1\r\n" "a=rtcp-mux\r\n" "a=rtcp-rsize\r\n" "a=crypto:1 AES_CM_128_HMAC_SHA1_32 " @@ -233,21 +233,19 @@ static const char kSdpString[] = "a=rtpmap:103 ISAC/16000\r\n" "a=rtpmap:104 ISAC/32000\r\n" "a=ssrc:1 cname:stream_1_cname\r\n" - "a=ssrc:1 msid:local_stream_1 audio_track_id_1\r\n" "m=video 9 RTP/SAVPF 120\r\n" "c=IN IP4 0.0.0.0\r\n" "a=rtcp:9 IN IP4 0.0.0.0\r\n" "a=ice-ufrag:ufrag_video\r\na=ice-pwd:pwd_video\r\n" "a=mid:video_content_name\r\n" "a=sendrecv\r\n" + "a=msid:local_stream_1 video_track_id_1\r\n" "a=crypto:1 AES_CM_128_HMAC_SHA1_80 " "inline:d0RmdmcmVCspeEc3QGZiNWpVLFJhQX1cfHAwJSoj|2^20|1:32\r\n" "a=rtpmap:120 VP8/90000\r\n" "a=ssrc-group:FEC 2 3\r\n" "a=ssrc:2 cname:stream_1_cname\r\n" - "a=ssrc:2 msid:local_stream_1 video_track_id_1\r\n" - "a=ssrc:3 cname:stream_1_cname\r\n" - "a=ssrc:3 msid:local_stream_1 video_track_id_1\r\n"; + "a=ssrc:3 cname:stream_1_cname\r\n"; // draft-ietf-mmusic-sctp-sdp-03 static const char kSdpSctpDataChannelString[] = @@ -363,6 +361,7 @@ static const char kBundleOnlySdpFullString[] = "generation 2\r\n" "a=ice-ufrag:ufrag_voice\r\na=ice-pwd:pwd_voice\r\n" "a=mid:audio_content_name\r\n" + "a=msid:local_stream_1 audio_track_id_1\r\n" "a=sendrecv\r\n" "a=rtcp-mux\r\n" "a=rtcp-rsize\r\n" @@ -373,21 +372,19 @@ static const char kBundleOnlySdpFullString[] = "a=rtpmap:103 ISAC/16000\r\n" "a=rtpmap:104 ISAC/32000\r\n" "a=ssrc:1 cname:stream_1_cname\r\n" - "a=ssrc:1 msid:local_stream_1 audio_track_id_1\r\n" "m=video 0 RTP/SAVPF 120\r\n" "c=IN IP4 0.0.0.0\r\n" "a=rtcp:9 IN IP4 0.0.0.0\r\n" "a=bundle-only\r\n" "a=mid:video_content_name\r\n" + "a=msid:local_stream_1 video_track_id_1\r\n" "a=sendrecv\r\n" "a=crypto:1 AES_CM_128_HMAC_SHA1_80 " "inline:d0RmdmcmVCspeEc3QGZiNWpVLFJhQX1cfHAwJSoj|2^20|1:32\r\n" "a=rtpmap:120 VP8/90000\r\n" "a=ssrc-group:FEC 2 3\r\n" "a=ssrc:2 cname:stream_1_cname\r\n" - "a=ssrc:2 msid:local_stream_1 video_track_id_1\r\n" - "a=ssrc:3 cname:stream_1_cname\r\n" - "a=ssrc:3 msid:local_stream_1 video_track_id_1\r\n"; + "a=ssrc:3 cname:stream_1_cname\r\n"; // Plan B SDP reference string, with 2 streams, 2 audio tracks and 3 video // tracks. @@ -1168,7 +1165,8 @@ class WebRtcSdpTest : public ::testing::Test { absl::WrapUnique(audio_desc_)); desc_.AddContent(kVideoContentName, MediaProtocolType::kRtp, absl::WrapUnique(video_desc_)); - + desc_.set_msid_signaling(cricket::kMsidSignalingSsrcAttribute | + cricket::kMsidSignalingSemantic); ASSERT_TRUE(jdesc_.Initialize(desc_.Clone(), jdesc_.session_id(), jdesc_.session_version())); } @@ -1219,7 +1217,8 @@ class WebRtcSdpTest : public ::testing::Test { absl::WrapUnique(video_desc_3)); desc_.AddTransportInfo(TransportInfo( kVideoContentName3, TransportDescription(kUfragVideo3, kPwdVideo3))); - desc_.set_msid_signaling(cricket::kMsidSignalingMediaSection); + desc_.set_msid_signaling(cricket::kMsidSignalingMediaSection | + cricket::kMsidSignalingSemantic); ASSERT_TRUE(jdesc_.Initialize(desc_.Clone(), jdesc_.session_id(), jdesc_.session_version())); @@ -1299,7 +1298,8 @@ class WebRtcSdpTest : public ::testing::Test { absl::WrapUnique(audio_desc)); // Enable signaling a=msid lines. - desc_.set_msid_signaling(cricket::kMsidSignalingMediaSection); + desc_.set_msid_signaling(cricket::kMsidSignalingMediaSection | + cricket::kMsidSignalingSemantic); ASSERT_TRUE(jdesc_.Initialize(desc_.Clone(), jdesc_.session_id(), jdesc_.session_version())); } @@ -1508,7 +1508,7 @@ class WebRtcSdpTest : public ::testing::Test { } // global attributes - EXPECT_EQ(desc1.msid_supported(), desc2.msid_supported()); + EXPECT_EQ(desc1.msid_signaling(), desc2.msid_signaling()); EXPECT_EQ(desc1.extmap_allow_mixed(), desc2.extmap_allow_mixed()); } @@ -1815,10 +1815,10 @@ class WebRtcSdpTest : public ::testing::Test { } } - void VerifyCodecParameter(const cricket::CodecParameterMap& params, + void VerifyCodecParameter(const webrtc::CodecParameterMap& params, const std::string& name, int expected_value) { - cricket::CodecParameterMap::const_iterator found = params.find(name); + webrtc::CodecParameterMap::const_iterator found = params.find(name); ASSERT_TRUE(found != params.end()); EXPECT_EQ(found->second, rtc::ToString(expected_value)); } @@ -2449,7 +2449,7 @@ TEST_F(WebRtcSdpTest, DeserializeSessionDescriptionWithoutRtpmapButWithFmtp) { EXPECT_EQ("G729", g729.name); EXPECT_EQ(8000, g729.clockrate); EXPECT_EQ(18, g729.id); - cricket::CodecParameterMap::iterator found = g729.params.find("annexb"); + webrtc::CodecParameterMap::iterator found = g729.params.find("annexb"); ASSERT_TRUE(found != g729.params.end()); EXPECT_EQ(found->second, "yes"); @@ -3035,7 +3035,7 @@ TEST_F(WebRtcSdpTest, DeserializeSessionDescriptionWithoutEndLineBreak) { // Deserialize SdpParseError error; EXPECT_FALSE(webrtc::SdpDeserialize(sdp, &jdesc, &error)); - const std::string lastline = "a=ssrc:3 msid:local_stream_1 video_track_id_1"; + const std::string lastline = "a=ssrc:3 cname:stream_1_cname"; EXPECT_EQ(lastline, error.line); EXPECT_EQ("Invalid SDP line.", error.description); } @@ -3292,7 +3292,7 @@ TEST_F(WebRtcSdpTest, DeserializeVideoFmtp) { cricket::VideoCodec vp8 = vcd->codecs()[0]; EXPECT_EQ("VP8", vp8.name); EXPECT_EQ(120, vp8.id); - cricket::CodecParameterMap::iterator found = + webrtc::CodecParameterMap::iterator found = vp8.params.find("x-google-min-bitrate"); ASSERT_TRUE(found != vp8.params.end()); EXPECT_EQ(found->second, "10"); @@ -3326,7 +3326,7 @@ TEST_F(WebRtcSdpTest, DeserializeVideoFmtpWithSprops) { cricket::VideoCodec h264 = vcd->codecs()[0]; EXPECT_EQ("H264", h264.name); EXPECT_EQ(98, h264.id); - cricket::CodecParameterMap::const_iterator found = + webrtc::CodecParameterMap::const_iterator found = h264.params.find("profile-level-id"); ASSERT_TRUE(found != h264.params.end()); EXPECT_EQ(found->second, "42A01E"); @@ -3359,7 +3359,7 @@ TEST_F(WebRtcSdpTest, DeserializeVideoFmtpWithSpace) { cricket::VideoCodec vp8 = vcd->codecs()[0]; EXPECT_EQ("VP8", vp8.name); EXPECT_EQ(120, vp8.id); - cricket::CodecParameterMap::iterator found = + webrtc::CodecParameterMap::iterator found = vp8.params.find("x-google-min-bitrate"); ASSERT_TRUE(found != vp8.params.end()); EXPECT_EQ(found->second, "10"); @@ -3751,7 +3751,7 @@ TEST_F(WebRtcSdpTest, DeserializeSessionDescriptionSpecialMsid) { // Create both msid lines for Plan B and Unified Plan support. MakeUnifiedPlanDescriptionMultipleStreamIds( cricket::kMsidSignalingMediaSection | - cricket::kMsidSignalingSsrcAttribute); + cricket::kMsidSignalingSsrcAttribute | cricket::kMsidSignalingSemantic); JsepSessionDescription deserialized_description(kDummyType); EXPECT_TRUE(SdpDeserialize(kUnifiedPlanSdpFullStringWithSpecialMsid, @@ -3759,7 +3759,8 @@ TEST_F(WebRtcSdpTest, DeserializeSessionDescriptionSpecialMsid) { EXPECT_TRUE(CompareSessionDescription(jdesc_, deserialized_description)); EXPECT_EQ(cricket::kMsidSignalingMediaSection | - cricket::kMsidSignalingSsrcAttribute, + cricket::kMsidSignalingSsrcAttribute | + cricket::kMsidSignalingSemantic, deserialized_description.description()->msid_signaling()); } @@ -3771,7 +3772,7 @@ TEST_F(WebRtcSdpTest, SerializeSessionDescriptionSpecialMsid) { // Create both msid lines for Plan B and Unified Plan support. MakeUnifiedPlanDescriptionMultipleStreamIds( cricket::kMsidSignalingMediaSection | - cricket::kMsidSignalingSsrcAttribute); + cricket::kMsidSignalingSsrcAttribute | cricket::kMsidSignalingSemantic); std::string serialized_sdp = webrtc::SdpSerialize(jdesc_); // We explicitly test that the serialized SDP string is equal to the hard // coded SDP string. This is necessary, because in the parser "a=msid" lines @@ -3787,7 +3788,7 @@ TEST_F(WebRtcSdpTest, SerializeSessionDescriptionSpecialMsid) { TEST_F(WebRtcSdpTest, UnifiedPlanDeserializeSessionDescriptionSpecialMsid) { // Only create a=msid lines for strictly Unified Plan stream ID support. MakeUnifiedPlanDescriptionMultipleStreamIds( - cricket::kMsidSignalingMediaSection); + cricket::kMsidSignalingMediaSection | cricket::kMsidSignalingSemantic); JsepSessionDescription deserialized_description(kDummyType); std::string unified_plan_sdp_string = @@ -3805,7 +3806,7 @@ TEST_F(WebRtcSdpTest, UnifiedPlanDeserializeSessionDescriptionSpecialMsid) { TEST_F(WebRtcSdpTest, UnifiedPlanSerializeSessionDescriptionSpecialMsid) { // Only create a=msid lines for strictly Unified Plan stream ID support. MakeUnifiedPlanDescriptionMultipleStreamIds( - cricket::kMsidSignalingMediaSection); + cricket::kMsidSignalingMediaSection | cricket::kMsidSignalingSemantic); TestSerialize(jdesc_); } @@ -3837,7 +3838,8 @@ TEST_F(WebRtcSdpTest, SerializeUnifiedPlanSessionDescriptionNoSsrcSignaling) { TEST_F(WebRtcSdpTest, EmptyDescriptionHasNoMsidSignaling) { JsepSessionDescription jsep_desc(kDummyType); ASSERT_TRUE(SdpDeserialize(kSdpSessionString, &jsep_desc)); - EXPECT_EQ(0, jsep_desc.description()->msid_signaling()); + EXPECT_EQ(cricket::kMsidSignalingSemantic, + jsep_desc.description()->msid_signaling()); } TEST_F(WebRtcSdpTest, DataChannelOnlyHasNoMsidSignaling) { @@ -3845,21 +3847,24 @@ TEST_F(WebRtcSdpTest, DataChannelOnlyHasNoMsidSignaling) { std::string sdp = kSdpSessionString; sdp += kSdpSctpDataChannelString; ASSERT_TRUE(SdpDeserialize(sdp, &jsep_desc)); - EXPECT_EQ(0, jsep_desc.description()->msid_signaling()); + EXPECT_EQ(cricket::kMsidSignalingSemantic, + jsep_desc.description()->msid_signaling()); } TEST_F(WebRtcSdpTest, PlanBHasSsrcAttributeMsidSignaling) { JsepSessionDescription jsep_desc(kDummyType); ASSERT_TRUE(SdpDeserialize(kPlanBSdpFullString, &jsep_desc)); - EXPECT_EQ(cricket::kMsidSignalingSsrcAttribute, - jsep_desc.description()->msid_signaling()); + EXPECT_EQ( + cricket::kMsidSignalingSsrcAttribute | cricket::kMsidSignalingSemantic, + jsep_desc.description()->msid_signaling()); } TEST_F(WebRtcSdpTest, UnifiedPlanHasMediaSectionMsidSignaling) { JsepSessionDescription jsep_desc(kDummyType); ASSERT_TRUE(SdpDeserialize(kUnifiedPlanSdpFullString, &jsep_desc)); - EXPECT_EQ(cricket::kMsidSignalingMediaSection, - jsep_desc.description()->msid_signaling()); + EXPECT_EQ( + cricket::kMsidSignalingMediaSection | cricket::kMsidSignalingSemantic, + jsep_desc.description()->msid_signaling()); } const char kMediaSectionMsidLine[] = "a=msid:local_stream_1 audio_track_id_1"; @@ -3893,6 +3898,13 @@ TEST_F(WebRtcSdpTest, SerializeBothMediaSectionAndSsrcAttributeMsid) { EXPECT_NE(std::string::npos, sdp.find(kSsrcAttributeMsidLine)); } +TEST_F(WebRtcSdpTest, SerializeWithoutMsidSemantics) { + jdesc_.description()->set_msid_signaling(cricket::kMsidSignalingNotUsed); + std::string sdp = webrtc::SdpSerialize(jdesc_); + + EXPECT_EQ(std::string::npos, sdp.find("a=msid-semantic:")); +} + // Regression test for integer overflow bug: // https://bugs.chromium.org/p/chromium/issues/detail?id=648071 TEST_F(WebRtcSdpTest, DeserializeLargeBandwidthLimit) { @@ -4459,16 +4471,15 @@ TEST_F(WebRtcSdpTest, DeserializeEmptySessionName) { // Simulcast malformed input test for invalid format. TEST_F(WebRtcSdpTest, DeserializeSimulcastNegative_EmptyAttribute) { - ExpectParseFailureWithNewLines( - "a=ssrc:3 msid:local_stream_1 video_track_id_1\r\n", "a=simulcast:\r\n", - "a=simulcast:"); + ExpectParseFailureWithNewLines("a=ssrc:3 cname:stream_1_cname\r\n", + "a=simulcast:\r\n", "a=simulcast:"); } // Tests that duplicate simulcast entries in the SDP triggers a parse failure. TEST_F(WebRtcSdpTest, DeserializeSimulcastNegative_DuplicateAttribute) { - ExpectParseFailureWithNewLines( - "a=ssrc:3 msid:local_stream_1 video_track_id_1\r\n", - "a=simulcast:send 1\r\na=simulcast:recv 2\r\n", "a=simulcast:"); + ExpectParseFailureWithNewLines("a=ssrc:3 cname:stream_1_cname\r\n", + "a=simulcast:send 1\r\na=simulcast:recv 2\r\n", + "a=simulcast:"); } // Validates that deserialization uses the a=simulcast: attribute @@ -4802,6 +4813,7 @@ TEST_F(WebRtcSdpTest, DeserializeSessionDescriptionWithoutCname) { EXPECT_TRUE(SdpDeserialize(sdp_without_cname, &new_jdesc)); audio_desc_->mutable_streams()[0].cname = ""; + audio_desc_->mutable_streams()[0].ssrcs = {}; ASSERT_TRUE(jdesc_.Initialize(desc_.Clone(), jdesc_.session_id(), jdesc_.session_version())); EXPECT_TRUE(CompareSessionDescription(jdesc_, new_jdesc)); @@ -5096,3 +5108,42 @@ TEST_F(WebRtcSdpTest, IgnoresUnknownAttributeLines) { JsepSessionDescription jdesc(kDummyType); EXPECT_TRUE(SdpDeserialize(sdp, &jdesc)); } + +TEST_F(WebRtcSdpTest, BackfillsDefaultFmtpValues) { + std::string sdp = + "v=0\r\n" + "o=- 0 3 IN IP4 127.0.0.1\r\n" + "s=-\r\n" + "t=0 0\r\n" + "a=group:BUNDLE 0\r\n" + "a=fingerprint:sha-1 " + "4A:AD:B9:B1:3F:82:18:3B:54:02:12:DF:3E:5D:49:6B:19:E5:7C:AB\r\n" + "a=setup:actpass\r\n" + "a=ice-ufrag:ETEn\r\n" + "a=ice-pwd:OtSK0WpNtpUjkY4+86js7Z/l\r\n" + "m=video 9 UDP/TLS/RTP/SAVPF 96 97\r\n" + "c=IN IP4 0.0.0.0\r\n" + "a=rtcp-mux\r\n" + "a=sendonly\r\n" + "a=mid:0\r\n" + "a=rtpmap:96 H264/90000\r\n" + "a=rtpmap:97 VP9/90000\r\n" + "a=ssrc:1234 cname:test\r\n"; + JsepSessionDescription jdesc(kDummyType); + EXPECT_TRUE(SdpDeserialize(sdp, &jdesc)); + ASSERT_EQ(1u, jdesc.description()->contents().size()); + const auto content = jdesc.description()->contents()[0]; + const auto* description = content.media_description(); + ASSERT_NE(description, nullptr); + const std::vector<cricket::Codec> codecs = description->codecs(); + ASSERT_EQ(codecs.size(), 2u); + std::string value; + + EXPECT_EQ(codecs[0].name, "H264"); + EXPECT_TRUE(codecs[0].GetParam("packetization-mode", &value)); + EXPECT_EQ(value, "0"); + + EXPECT_EQ(codecs[1].name, "VP9"); + EXPECT_TRUE(codecs[1].GetParam("profile-id", &value)); + EXPECT_EQ(value, "0"); +} |