xref: /aosp_15_r20/external/webrtc/rtc_base/experiments/rate_control_settings_unittest.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1 /*
2  *  Copyright 2019 The WebRTC project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #include "rtc_base/experiments/rate_control_settings.h"
12 
13 #include "api/video_codecs/video_codec.h"
14 #include "test/field_trial.h"
15 #include "test/gtest.h"
16 #include "video/config/video_encoder_config.h"
17 
18 namespace webrtc {
19 
20 namespace {
21 
TEST(RateControlSettingsTest,CongestionWindow)22 TEST(RateControlSettingsTest, CongestionWindow) {
23   EXPECT_TRUE(
24       RateControlSettings::ParseFromFieldTrials().UseCongestionWindow());
25 
26   test::ScopedFieldTrials field_trials(
27       "WebRTC-CongestionWindow/QueueSize:100/");
28   const RateControlSettings settings_after =
29       RateControlSettings::ParseFromFieldTrials();
30   EXPECT_TRUE(settings_after.UseCongestionWindow());
31   EXPECT_EQ(settings_after.GetCongestionWindowAdditionalTimeMs(), 100);
32 }
33 
TEST(RateControlSettingsTest,CongestionWindowPushback)34 TEST(RateControlSettingsTest, CongestionWindowPushback) {
35   EXPECT_TRUE(RateControlSettings::ParseFromFieldTrials()
36                   .UseCongestionWindowPushback());
37 
38   test::ScopedFieldTrials field_trials(
39       "WebRTC-CongestionWindow/QueueSize:100,MinBitrate:100000/");
40   const RateControlSettings settings_after =
41       RateControlSettings::ParseFromFieldTrials();
42   EXPECT_TRUE(settings_after.UseCongestionWindowPushback());
43   EXPECT_EQ(settings_after.CongestionWindowMinPushbackTargetBitrateBps(),
44             100000u);
45 }
46 
TEST(RateControlSettingsTest,CongestionWindowPushbackDropframe)47 TEST(RateControlSettingsTest, CongestionWindowPushbackDropframe) {
48   EXPECT_TRUE(RateControlSettings::ParseFromFieldTrials()
49                   .UseCongestionWindowPushback());
50 
51   test::ScopedFieldTrials field_trials(
52       "WebRTC-CongestionWindow/"
53       "QueueSize:100,MinBitrate:100000,DropFrame:true/");
54   const RateControlSettings settings_after =
55       RateControlSettings::ParseFromFieldTrials();
56   EXPECT_TRUE(settings_after.UseCongestionWindowPushback());
57   EXPECT_EQ(settings_after.CongestionWindowMinPushbackTargetBitrateBps(),
58             100000u);
59   EXPECT_TRUE(settings_after.UseCongestionWindowDropFrameOnly());
60 }
61 
TEST(RateControlSettingsTest,CongestionWindowPushbackDefaultConfig)62 TEST(RateControlSettingsTest, CongestionWindowPushbackDefaultConfig) {
63   const RateControlSettings settings =
64       RateControlSettings::ParseFromFieldTrials();
65   EXPECT_TRUE(settings.UseCongestionWindowPushback());
66   EXPECT_EQ(settings.CongestionWindowMinPushbackTargetBitrateBps(), 30000u);
67   EXPECT_TRUE(settings.UseCongestionWindowDropFrameOnly());
68 }
69 
TEST(RateControlSettingsTest,PacingFactor)70 TEST(RateControlSettingsTest, PacingFactor) {
71   EXPECT_FALSE(RateControlSettings::ParseFromFieldTrials().GetPacingFactor());
72 
73   test::ScopedFieldTrials field_trials(
74       "WebRTC-VideoRateControl/pacing_factor:1.2/");
75   const RateControlSettings settings_after =
76       RateControlSettings::ParseFromFieldTrials();
77   // Need to explicitly dereference the absl::optional
78   // for the EXPECT_DOUBLE_EQ to compile.
79   ASSERT_TRUE(settings_after.GetPacingFactor());
80   EXPECT_DOUBLE_EQ(*settings_after.GetPacingFactor(), 1.2);
81 }
82 
TEST(RateControlSettingsTest,AlrProbing)83 TEST(RateControlSettingsTest, AlrProbing) {
84   EXPECT_FALSE(RateControlSettings::ParseFromFieldTrials().UseAlrProbing());
85 
86   test::ScopedFieldTrials field_trials(
87       "WebRTC-VideoRateControl/alr_probing:1/");
88   EXPECT_TRUE(RateControlSettings::ParseFromFieldTrials().UseAlrProbing());
89 }
90 
TEST(RateControlSettingsTest,LibvpxVp8QpMax)91 TEST(RateControlSettingsTest, LibvpxVp8QpMax) {
92   EXPECT_FALSE(RateControlSettings::ParseFromFieldTrials().LibvpxVp8QpMax());
93 
94   test::ScopedFieldTrials field_trials(
95       "WebRTC-VideoRateControl/vp8_qp_max:50/");
96   EXPECT_EQ(RateControlSettings::ParseFromFieldTrials().LibvpxVp8QpMax(), 50);
97 }
98 
TEST(RateControlSettingsTest,DoesNotGetTooLargeLibvpxVp8QpMaxValue)99 TEST(RateControlSettingsTest, DoesNotGetTooLargeLibvpxVp8QpMaxValue) {
100   test::ScopedFieldTrials field_trials(
101       "WebRTC-VideoRateControl/vp8_qp_max:70/");
102   EXPECT_FALSE(RateControlSettings::ParseFromFieldTrials().LibvpxVp8QpMax());
103 }
104 
TEST(RateControlSettingsTest,LibvpxVp8MinPixels)105 TEST(RateControlSettingsTest, LibvpxVp8MinPixels) {
106   EXPECT_FALSE(
107       RateControlSettings::ParseFromFieldTrials().LibvpxVp8MinPixels());
108 
109   test::ScopedFieldTrials field_trials(
110       "WebRTC-VideoRateControl/vp8_min_pixels:50000/");
111   EXPECT_EQ(RateControlSettings::ParseFromFieldTrials().LibvpxVp8MinPixels(),
112             50000);
113 }
114 
TEST(RateControlSettingsTest,DoesNotGetTooSmallLibvpxVp8MinPixelValue)115 TEST(RateControlSettingsTest, DoesNotGetTooSmallLibvpxVp8MinPixelValue) {
116   test::ScopedFieldTrials field_trials(
117       "WebRTC-VideoRateControl/vp8_min_pixels:0/");
118   EXPECT_FALSE(
119       RateControlSettings::ParseFromFieldTrials().LibvpxVp8MinPixels());
120 }
121 
TEST(RateControlSettingsTest,LibvpxTrustedRateController)122 TEST(RateControlSettingsTest, LibvpxTrustedRateController) {
123   const RateControlSettings settings_before =
124       RateControlSettings::ParseFromFieldTrials();
125   EXPECT_TRUE(settings_before.LibvpxVp8TrustedRateController());
126   EXPECT_TRUE(settings_before.LibvpxVp9TrustedRateController());
127 
128   test::ScopedFieldTrials field_trials(
129       "WebRTC-VideoRateControl/trust_vp8:0,trust_vp9:0/");
130   const RateControlSettings settings_after =
131       RateControlSettings::ParseFromFieldTrials();
132   EXPECT_FALSE(settings_after.LibvpxVp8TrustedRateController());
133   EXPECT_FALSE(settings_after.LibvpxVp9TrustedRateController());
134 }
135 
TEST(RateControlSettingsTest,Vp8BaseHeavyTl3RateAllocationLegacyKey)136 TEST(RateControlSettingsTest, Vp8BaseHeavyTl3RateAllocationLegacyKey) {
137   const RateControlSettings settings_before =
138       RateControlSettings::ParseFromFieldTrials();
139   EXPECT_FALSE(settings_before.Vp8BaseHeavyTl3RateAllocation());
140 
141   test::ScopedFieldTrials field_trials(
142       "WebRTC-UseBaseHeavyVP8TL3RateAllocation/Enabled/");
143   const RateControlSettings settings_after =
144       RateControlSettings::ParseFromFieldTrials();
145   EXPECT_TRUE(settings_after.Vp8BaseHeavyTl3RateAllocation());
146 }
147 
TEST(RateControlSettingsTest,Vp8BaseHeavyTl3RateAllocationVideoRateControlKey)148 TEST(RateControlSettingsTest,
149      Vp8BaseHeavyTl3RateAllocationVideoRateControlKey) {
150   const RateControlSettings settings_before =
151       RateControlSettings::ParseFromFieldTrials();
152   EXPECT_FALSE(settings_before.Vp8BaseHeavyTl3RateAllocation());
153 
154   test::ScopedFieldTrials field_trials(
155       "WebRTC-VideoRateControl/vp8_base_heavy_tl3_alloc:1/");
156   const RateControlSettings settings_after =
157       RateControlSettings::ParseFromFieldTrials();
158   EXPECT_TRUE(settings_after.Vp8BaseHeavyTl3RateAllocation());
159 }
160 
TEST(RateControlSettingsTest,Vp8BaseHeavyTl3RateAllocationVideoRateControlKeyOverridesLegacyKey)161 TEST(RateControlSettingsTest,
162      Vp8BaseHeavyTl3RateAllocationVideoRateControlKeyOverridesLegacyKey) {
163   const RateControlSettings settings_before =
164       RateControlSettings::ParseFromFieldTrials();
165   EXPECT_FALSE(settings_before.Vp8BaseHeavyTl3RateAllocation());
166 
167   test::ScopedFieldTrials field_trials(
168       "WebRTC-UseBaseHeavyVP8TL3RateAllocation/Enabled/WebRTC-VideoRateControl/"
169       "vp8_base_heavy_tl3_alloc:0/");
170   const RateControlSettings settings_after =
171       RateControlSettings::ParseFromFieldTrials();
172   EXPECT_FALSE(settings_after.Vp8BaseHeavyTl3RateAllocation());
173 }
174 
TEST(RateControlSettingsTest,UseEncoderBitrateAdjuster)175 TEST(RateControlSettingsTest, UseEncoderBitrateAdjuster) {
176   // Should be on by default.
177   EXPECT_TRUE(
178       RateControlSettings::ParseFromFieldTrials().UseEncoderBitrateAdjuster());
179 
180   {
181     // Can be turned off via field trial.
182     test::ScopedFieldTrials field_trials(
183         "WebRTC-VideoRateControl/bitrate_adjuster:false/");
184     EXPECT_FALSE(RateControlSettings::ParseFromFieldTrials()
185                      .UseEncoderBitrateAdjuster());
186   }
187 }
188 
189 }  // namespace
190 
191 }  // namespace webrtc
192