diff --git a/pc/peer_connection.cc b/pc/peer_connection.cc index 0323636f02..e2b3b61058 100644 --- a/pc/peer_connection.cc +++ b/pc/peer_connection.cc @@ -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()); } diff --git a/pc/peer_connection_simulcast_unittest.cc b/pc/peer_connection_simulcast_unittest.cc index 8822a980f7..31385754b7 100644 --- a/pc/peer_connection_simulcast_unittest.cc +++ b/pc/peer_connection_simulcast_unittest.cc @@ -157,9 +157,10 @@ class PeerConnectionSimulcastTests : public ::testing::Test { rtc::scoped_refptr AddTransceiver( PeerConnectionWrapper* pc, - const std::vector& layers) { + const std::vector& 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.