From d171832b6cd2fef6daf7442f1ccf029bdda3453e Mon Sep 17 00:00:00 2001 From: Qiu Jianlin Date: Sat, 23 Nov 2024 21:27:37 +0800 Subject: [PATCH] Set default simulcast temporal layer to 1 if not configured. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Reviewed-by: Henrik Boström Reviewed-by: Sergey Silkin Cr-Commit-Position: refs/heads/main@{#43452} --- video/config/simulcast.cc | 18 +++++++++++++++++- video/config/simulcast_unittest.cc | 16 ++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/video/config/simulcast.cc b/video/config/simulcast.cc index 06a3bedb7d..4391d973f6 100644 --- a/video/config/simulcast.cc +++ b/video/config/simulcast.cc @@ -183,6 +183,22 @@ bool EnableLowresBitrateInterpolation(const webrtc::FieldTrialsView& trials) { 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 GetSimulcastFormats( bool enable_lowres_bitrate_interpolation, webrtc::VideoCodecType codec) { @@ -275,7 +291,7 @@ std::vector GetNormalSimulcastLayers( 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 layers(resolutions.size()); diff --git a/video/config/simulcast_unittest.cc b/video/config/simulcast_unittest.cc index 6e000a4641..f538cd7de7 100644 --- a/video/config/simulcast_unittest.cc +++ b/video/config/simulcast_unittest.cc @@ -440,6 +440,22 @@ TEST(SimulcastTest, BitratesForH265) { 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 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