Set default simulcast temporal layer to 1 if not configured.
For H.265 when scalability mode is not configured for simulcast layers,
the default mode of L1T1 should be assumed instead of L1T3, as that is
the most commonly supported temporal scalability on all devices for
H.265.
Bug: chromium:41480904
Change-Id: Ia9bc91729eb393850dfe5e8fb04280b4f784560d
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/369080
Commit-Queue: Jianlin Qiu <jianlin.qiu@intel.com>
Reviewed-by: Henrik Boström <hbos@webrtc.org>
Reviewed-by: Sergey Silkin <ssilkin@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#43452}
diff --git a/video/config/simulcast.cc b/video/config/simulcast.cc
index 06a3bedb..4391d97 100644
--- a/video/config/simulcast.cc
+++ b/video/config/simulcast.cc
@@ -183,6 +183,22 @@
trials.Lookup("WebRTC-LowresSimulcastBitrateInterpolation"), "Enabled");
}
+int GetDefaultSimulcastTemporalLayers(webrtc::VideoCodecType codec) {
+ switch (codec) {
+ case webrtc::kVideoCodecVP8:
+ case webrtc::kVideoCodecVP9:
+ case webrtc::kVideoCodecAV1:
+ case webrtc::kVideoCodecH264:
+ case webrtc::kVideoCodecGeneric:
+ return kDefaultNumTemporalLayers;
+ // For codec type that has no software fallback, defaults to L1T1 for
+ // initial simulcast setup, as this is the only scalability mode secure to
+ // be supported.
+ case webrtc::kVideoCodecH265:
+ return 1;
+ }
+}
+
std::vector<SimulcastFormat> GetSimulcastFormats(
bool enable_lowres_bitrate_interpolation,
webrtc::VideoCodecType codec) {
@@ -275,7 +291,7 @@
const bool enable_lowres_bitrate_interpolation =
EnableLowresBitrateInterpolation(trials);
const int num_temporal_layers =
- temporal_layers_supported ? kDefaultNumTemporalLayers : 1;
+ temporal_layers_supported ? GetDefaultSimulcastTemporalLayers(codec) : 1;
// Add simulcast streams, from highest resolution (`s` = num_simulcast_layers
// -1) to lowest resolution at `s` = 0.
std::vector<webrtc::VideoStream> layers(resolutions.size());
diff --git a/video/config/simulcast_unittest.cc b/video/config/simulcast_unittest.cc
index 6e000a4..f538cd7 100644
--- a/video/config/simulcast_unittest.cc
+++ b/video/config/simulcast_unittest.cc
@@ -440,6 +440,22 @@
EXPECT_NEAR(streams[2].target_bitrate_bps, 1524000, 20000);
EXPECT_NEAR(streams[2].min_bitrate_bps, 481000, 20000);
}
+
+// Test that for H.265, the simulcast layers are created with the correct
+// default temporal layers, before that is overrided by application settings.
+TEST(SimulcastTest, GetConfigForH265) {
+ const ExplicitKeyValueConfig trials("");
+
+ const size_t kMaxLayers = 3;
+ std::vector<VideoStream> streams = cricket::GetSimulcastConfig(
+ CreateResolutions(1280, 720, kMaxLayers), !kScreenshare, true, trials,
+ webrtc::kVideoCodecH265);
+
+ ASSERT_THAT(streams, SizeIs(kMaxLayers));
+ for (size_t i = 0; i < streams.size(); ++i) {
+ EXPECT_EQ(1ul, streams[i].num_temporal_layers);
+ }
+}
#endif
} // namespace webrtc