Check the rid direction matches the direction in simulcast description
Section 5.2 of draft-ietf-mmusic-sdp-simulcast-14: The direction for an rid-id MUST be aligned with the direction specified for the corresponding RTP stream identifier on the "a=rid" line. Bug: webrtc:10785 Change-Id: I1fc70706511ae17c821c5ec4d90a0b854171454f Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/144245 Commit-Queue: Florent Castelli <orphis@webrtc.org> Reviewed-by: Amit Hilbuch <amithi@webrtc.org> Cr-Commit-Position: refs/heads/master@{#28452}
This commit is contained in:
parent
238aab9948
commit
c4421979fe
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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<RidDescription>& 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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user