Simulcast should be disabled if RID header extension is not supported.
Simulcast is disabled if the RIDs are not negotiated. This change addresses the scenario in which RIDs are negotiated but support for the RID extension is not negotiated. In such cases, the RID extension cannot be used, so support for simulcast should be turned off, as if RIDs were not negotiated. A similar case can be made for MIDs, however MIDs are not explicitly specified in simulcast. RIDs are only guaranteed to be unique within a media section so it would seem that MIDs should be required. However, applications supply RID values and can guarantee their uniqueness, so unlike RIDs, the use of MIDs is not enforced as mandatory. Bug: webrtc:10075 Change-Id: Ic1b27878ea152eaee43a38bbfda11144307766fe Reviewed-on: https://webrtc-review.googlesource.com/c/125176 Commit-Queue: Amit Hilbuch <amithi@webrtc.org> Reviewed-by: Seth Hampson <shampson@webrtc.org> Reviewed-by: Steve Anton <steveanton@webrtc.org> Cr-Commit-Position: refs/heads/master@{#26934}
This commit is contained in:
@ -113,7 +113,7 @@ class PeerConnectionSimulcastTests : public testing::Test {
|
||||
const std::vector<SimulcastLayer>& answer_layers) {
|
||||
auto offer = local->CreateOfferAndSetAsLocal();
|
||||
// Remove simulcast as the second peer connection won't support it.
|
||||
auto removed_simulcast = RemoveSimulcast(offer.get());
|
||||
RemoveSimulcast(offer.get());
|
||||
std::string err;
|
||||
EXPECT_TRUE(remote->SetRemoteDescription(std::move(offer), &err)) << err;
|
||||
auto answer = remote->CreateAnswerAndSetAsLocal();
|
||||
@ -461,4 +461,38 @@ TEST_F(PeerConnectionSimulcastTests,
|
||||
EXPECT_TRUE(ValidateTransceiverParameters(transceiver, expected_layers));
|
||||
}
|
||||
|
||||
TEST_F(PeerConnectionSimulcastTests, NegotiationDoesNotHaveRidExtension) {
|
||||
auto local = CreatePeerConnectionWrapper();
|
||||
auto remote = CreatePeerConnectionWrapper();
|
||||
auto layers = CreateLayers({"1", "2", "3"}, true);
|
||||
auto expected_layers = CreateLayers({"1"}, true);
|
||||
auto transceiver = AddTransceiver(local.get(), layers);
|
||||
auto offer = local->CreateOfferAndSetAsLocal();
|
||||
// Remove simulcast as the second peer connection won't support it.
|
||||
RemoveSimulcast(offer.get());
|
||||
std::string err;
|
||||
EXPECT_TRUE(remote->SetRemoteDescription(std::move(offer), &err)) << err;
|
||||
auto answer = remote->CreateAnswerAndSetAsLocal();
|
||||
// Setup the answer to look like a server response.
|
||||
// Drop the RID header extension.
|
||||
auto mcd_answer = answer->description()->contents()[0].media_description();
|
||||
auto& receive_layers = mcd_answer->simulcast_description().receive_layers();
|
||||
for (const SimulcastLayer& layer : layers) {
|
||||
receive_layers.AddLayer(layer);
|
||||
}
|
||||
cricket::RtpHeaderExtensions extensions;
|
||||
for (auto extension : mcd_answer->rtp_header_extensions()) {
|
||||
if (extension.uri != RtpExtension::kRidUri) {
|
||||
extensions.push_back(extension);
|
||||
}
|
||||
}
|
||||
mcd_answer->set_rtp_header_extensions(extensions);
|
||||
EXPECT_EQ(layers.size(), mcd_answer->simulcast_description()
|
||||
.receive_layers()
|
||||
.GetAllLayers()
|
||||
.size());
|
||||
EXPECT_TRUE(local->SetRemoteDescription(std::move(answer), &err)) << err;
|
||||
EXPECT_TRUE(ValidateTransceiverParameters(transceiver, expected_layers));
|
||||
}
|
||||
|
||||
} // namespace webrtc
|
||||
|
||||
Reference in New Issue
Block a user