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