From 054062738629ad1b491055e0422cf0d2308e5e91 Mon Sep 17 00:00:00 2001 From: Florent Castelli Date: Tue, 29 Nov 2022 15:27:37 +0100 Subject: [PATCH] SVC: Add test for SVC fallback MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug: webrtc:11607 Change-Id: I6bd2a95852b1648528684fe492b79bb64e4a92af Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/285500 Auto-Submit: Florent Castelli Commit-Queue: Henrik Boström Reviewed-by: Henrik Boström Cr-Commit-Position: refs/heads/main@{#39183} --- pc/peer_connection_svc_integrationtest.cc | 65 +++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/pc/peer_connection_svc_integrationtest.cc b/pc/peer_connection_svc_integrationtest.cc index f53205ee32..6b579b10e6 100644 --- a/pc/peer_connection_svc_integrationtest.cc +++ b/pc/peer_connection_svc_integrationtest.cc @@ -13,8 +13,10 @@ #include +#include #include +#include "absl/strings/match.h" #include "api/rtc_error.h" #include "api/rtp_parameters.h" #include "api/rtp_transceiver_interface.h" @@ -238,6 +240,69 @@ TEST_F(PeerConnectionSVCIntegrationTest, EXPECT_EQ(result.type(), webrtc::RTCErrorType::UNSUPPORTED_OPERATION); } +TEST_F(PeerConnectionSVCIntegrationTest, FallbackToL1Tx) { + ASSERT_TRUE(CreatePeerConnectionWrappers()); + ConnectFakeSignaling(); + + webrtc::RtpTransceiverInit init; + webrtc::RtpEncodingParameters encoding_parameters; + init.send_encodings.push_back(encoding_parameters); + auto transceiver_or_error = + caller()->pc()->AddTransceiver(caller()->CreateLocalVideoTrack(), init); + ASSERT_TRUE(transceiver_or_error.ok()); + auto caller_transceiver = transceiver_or_error.MoveValue(); + + webrtc::RtpCapabilities capabilities = + caller()->pc_factory()->GetRtpSenderCapabilities( + cricket::MEDIA_TYPE_VIDEO); + std::vector send_codecs = capabilities.codecs; + // Only keep VP9 in the caller + send_codecs.erase(std::partition(send_codecs.begin(), send_codecs.end(), + [](const auto& codec) -> bool { + return codec.name == + cricket::kVp9CodecName; + }), + send_codecs.end()); + ASSERT_FALSE(send_codecs.empty()); + caller_transceiver->SetCodecPreferences(send_codecs); + + // L3T3 should be supported by VP9 + webrtc::RtpParameters parameters = + caller_transceiver->sender()->GetParameters(); + ASSERT_EQ(parameters.encodings.size(), 1u); + parameters.encodings[0].scalability_mode = "L3T3"; + auto result = caller_transceiver->sender()->SetParameters(parameters); + EXPECT_TRUE(result.ok()); + + caller()->CreateAndSetAndSignalOffer(); + ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout); + + parameters = caller_transceiver->sender()->GetParameters(); + ASSERT_TRUE(parameters.encodings[0].scalability_mode.has_value()); + EXPECT_TRUE( + absl::StartsWith(*parameters.encodings[0].scalability_mode, "L3T3")); + + // Keep only VP8 in the caller + send_codecs = capabilities.codecs; + send_codecs.erase(std::partition(send_codecs.begin(), send_codecs.end(), + [](const auto& codec) -> bool { + return codec.name == + cricket::kVp8CodecName; + }), + send_codecs.end()); + ASSERT_FALSE(send_codecs.empty()); + caller_transceiver->SetCodecPreferences(send_codecs); + + // Renegotiate to force the new codec list to be used + caller()->CreateAndSetAndSignalOffer(); + ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout); + + // Fallback should happen and L3T3 is not used anymore + parameters = caller_transceiver->sender()->GetParameters(); + ASSERT_TRUE(parameters.encodings[0].scalability_mode.has_value()); + EXPECT_TRUE( + absl::StartsWith(*parameters.encodings[0].scalability_mode, "L1T")); +} } // namespace } // namespace webrtc