simulcast: Limit audio transceivers to single stream

We don't support audio simulcast, so we should reject the layers
early during an addTransceiver() call.

Bug: webrtc:12719
Change-Id: Ieeb92c66de741e9b11943e0173a6f2e052926f13
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/216685
Commit-Queue: Florent Castelli <orphis@webrtc.org>
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#33886}
This commit is contained in:
Florent Castelli 2021-04-30 19:11:37 +02:00 committed by WebRTC LUCI CQ
parent c9716e0c71
commit e1b685a50a
2 changed files with 26 additions and 4 deletions

View File

@ -997,9 +997,11 @@ PeerConnection::AddTransceiver(
parameters.encodings = init.send_encodings;
// Encodings are dropped from the tail if too many are provided.
if (parameters.encodings.size() > kMaxSimulcastStreams) {
size_t max_simulcast_streams =
media_type == cricket::MEDIA_TYPE_VIDEO ? kMaxSimulcastStreams : 1u;
if (parameters.encodings.size() > max_simulcast_streams) {
parameters.encodings.erase(
parameters.encodings.begin() + kMaxSimulcastStreams,
parameters.encodings.begin() + max_simulcast_streams,
parameters.encodings.end());
}

View File

@ -157,9 +157,10 @@ class PeerConnectionSimulcastTests : public ::testing::Test {
rtc::scoped_refptr<RtpTransceiverInterface> AddTransceiver(
PeerConnectionWrapper* pc,
const std::vector<SimulcastLayer>& layers) {
const std::vector<SimulcastLayer>& layers,
cricket::MediaType media_type = cricket::MEDIA_TYPE_VIDEO) {
auto init = CreateTransceiverInit(layers);
return pc->AddTransceiver(cricket::MEDIA_TYPE_VIDEO, init);
return pc->AddTransceiver(media_type, init);
}
SimulcastDescription RemoveSimulcast(SessionDescriptionInterface* sd) {
@ -556,6 +557,25 @@ TEST_F(PeerConnectionSimulcastTests, NegotiationDoesNotHaveRidExtension) {
ValidateTransceiverParameters(transceiver, expected_layers);
}
TEST_F(PeerConnectionSimulcastTests, SimulcastAudioRejected) {
auto local = CreatePeerConnectionWrapper();
auto remote = CreatePeerConnectionWrapper();
auto layers = CreateLayers({"1", "2", "3", "4"}, true);
auto transceiver =
AddTransceiver(local.get(), layers, cricket::MEDIA_TYPE_AUDIO);
// Should only have the first layer.
auto parameters = transceiver->sender()->GetParameters();
EXPECT_EQ(1u, parameters.encodings.size());
EXPECT_THAT(parameters.encodings,
ElementsAre(Field("rid", &RtpEncodingParameters::rid, Eq(""))));
ExchangeOfferAnswer(local.get(), remote.get(), {});
// Still have a single layer after negotiation
parameters = transceiver->sender()->GetParameters();
EXPECT_EQ(1u, parameters.encodings.size());
EXPECT_THAT(parameters.encodings,
ElementsAre(Field("rid", &RtpEncodingParameters::rid, Eq(""))));
}
#if RTC_METRICS_ENABLED
//
// Checks the logged metrics when simulcast is not used.