SVC: Add test for SVC fallback
Bug: webrtc:11607
Change-Id: I6bd2a95852b1648528684fe492b79bb64e4a92af
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/285500
Auto-Submit: Florent Castelli <orphis@webrtc.org>
Commit-Queue: Henrik Boström <hbos@webrtc.org>
Reviewed-by: Henrik Boström <hbos@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#39183}
diff --git a/pc/peer_connection_svc_integrationtest.cc b/pc/peer_connection_svc_integrationtest.cc
index f53205e..6b579b1 100644
--- a/pc/peer_connection_svc_integrationtest.cc
+++ b/pc/peer_connection_svc_integrationtest.cc
@@ -13,8 +13,10 @@
#include <stdint.h>
+#include <functional>
#include <vector>
+#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 @@
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<RtpCodecCapability> 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