diff --git a/pc/webrtc_sdp.cc b/pc/webrtc_sdp.cc index 2fa004fa9c..e167d95d25 100644 --- a/pc/webrtc_sdp.cc +++ b/pc/webrtc_sdp.cc @@ -2567,7 +2567,8 @@ static void RemoveInvalidRidsFromSimulcast( // Add any rid that is not in the valid list to the remove set. for (const SimulcastLayer& send_layer : all_send_layers) { if (absl::c_none_of(valid_rids, [&send_layer](const RidDescription& rid) { - return send_layer.rid == rid.rid; + return send_layer.rid == rid.rid && + rid.direction == cricket::RidDirection::kSend; })) { to_remove.insert(send_layer.rid); } @@ -2575,10 +2576,11 @@ static void RemoveInvalidRidsFromSimulcast( // Add any rid that is not in the valid list to the remove set. for (const SimulcastLayer& receive_layer : all_receive_layers) { - if (absl::c_none_of(valid_rids, - [&receive_layer](const RidDescription& rid) { - return receive_layer.rid == rid.rid; - })) { + if (absl::c_none_of( + valid_rids, [&receive_layer](const RidDescription& rid) { + return receive_layer.rid == rid.rid && + rid.direction == cricket::RidDirection::kReceive; + })) { to_remove.insert(receive_layer.rid); } } diff --git a/pc/webrtc_sdp_unittest.cc b/pc/webrtc_sdp_unittest.cc index 71f5153ea5..ca99b84916 100644 --- a/pc/webrtc_sdp_unittest.cc +++ b/pc/webrtc_sdp_unittest.cc @@ -4496,6 +4496,61 @@ TEST_F(WebRtcSdpTest, TestDeserializeIgnoresDuplicateRidLines) { CompareRidDescriptionIds(rids, {"1", "3"}); } +TEST_F(WebRtcSdpTest, TestDeserializeRidSendDirection) { + std::string sdp = kUnifiedPlanSdpFullStringNoSsrc; + sdp += "a=rid:1 recv\r\n"; + sdp += "a=rid:2 recv\r\n"; + sdp += "a=simulcast:send 1;2\r\n"; + JsepSessionDescription output(kDummyType); + SdpParseError error; + EXPECT_TRUE(webrtc::SdpDeserialize(sdp, &output, &error)); + const cricket::ContentInfos& contents = output.description()->contents(); + const cricket::MediaContentDescription* media = + contents.back().media_description(); + EXPECT_FALSE(media->HasSimulcast()); +} + +TEST_F(WebRtcSdpTest, TestDeserializeRidRecvDirection) { + std::string sdp = kUnifiedPlanSdpFullStringNoSsrc; + sdp += "a=rid:1 send\r\n"; + sdp += "a=rid:2 send\r\n"; + sdp += "a=simulcast:recv 1;2\r\n"; + JsepSessionDescription output(kDummyType); + SdpParseError error; + EXPECT_TRUE(webrtc::SdpDeserialize(sdp, &output, &error)); + const cricket::ContentInfos& contents = output.description()->contents(); + const cricket::MediaContentDescription* media = + contents.back().media_description(); + EXPECT_FALSE(media->HasSimulcast()); +} + +TEST_F(WebRtcSdpTest, TestDeserializeIgnoresWrongRidDirectionLines) { + std::string sdp = kUnifiedPlanSdpFullStringNoSsrc; + sdp += "a=rid:1 send\r\n"; + sdp += "a=rid:2 send\r\n"; + sdp += "a=rid:3 send\r\n"; + sdp += "a=rid:4 recv\r\n"; + sdp += "a=rid:5 recv\r\n"; + sdp += "a=rid:6 recv\r\n"; + sdp += "a=simulcast:send 1;5;3 recv 4;2;6\r\n"; + JsepSessionDescription output(kDummyType); + SdpParseError error; + EXPECT_TRUE(webrtc::SdpDeserialize(sdp, &output, &error)); + const cricket::ContentInfos& contents = output.description()->contents(); + const cricket::MediaContentDescription* media = + contents.back().media_description(); + EXPECT_TRUE(media->HasSimulcast()); + const SimulcastDescription& simulcast = media->simulcast_description(); + EXPECT_EQ(2ul, simulcast.send_layers().size()); + EXPECT_EQ(2ul, simulcast.receive_layers().size()); + EXPECT_EQ(2ul, simulcast.send_layers().GetAllLayers().size()); + EXPECT_EQ(2ul, simulcast.receive_layers().GetAllLayers().size()); + + EXPECT_FALSE(media->streams().empty()); + const std::vector& rids = media->streams()[0].rids(); + CompareRidDescriptionIds(rids, {"1", "3"}); +} + // Simulcast serialization integration test. // This test will serialize and deserialize the description and compare. // More detailed tests for parsing simulcast can be found in