blob: 84e58252243ba8bf76a25e81597e25d414afee4d [file] [log] [blame]
Rasmus Brandtc402dbe2019-02-04 11:09:46 +01001/*
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 "api/video_codecs/video_encoder_config.h"
15#include "test/field_trial.h"
16#include "test/gtest.h"
17
18namespace webrtc {
19
20namespace {
21
Rasmus Brandt57d4ac92019-02-04 12:00:24 +010022TEST(RateControlSettingsTest, CongestionWindow) {
Ying Wang45930472021-02-05 11:07:00 +010023 EXPECT_TRUE(
Rasmus Brandt57d4ac92019-02-04 12:00:24 +010024 RateControlSettings::ParseFromFieldTrials().UseCongestionWindow());
Rasmus Brandtc402dbe2019-02-04 11:09:46 +010025
Evan Shrubsoleae68ea02019-04-09 09:59:00 +020026 test::ScopedFieldTrials field_trials(
27 "WebRTC-CongestionWindow/QueueSize:100/");
Rasmus Brandt57d4ac92019-02-04 12:00:24 +010028 const RateControlSettings settings_after =
29 RateControlSettings::ParseFromFieldTrials();
30 EXPECT_TRUE(settings_after.UseCongestionWindow());
31 EXPECT_EQ(settings_after.GetCongestionWindowAdditionalTimeMs(), 100);
32}
33
34TEST(RateControlSettingsTest, CongestionWindowPushback) {
Ying Wang45930472021-02-05 11:07:00 +010035 EXPECT_TRUE(RateControlSettings::ParseFromFieldTrials()
36 .UseCongestionWindowPushback());
Rasmus Brandt57d4ac92019-02-04 12:00:24 +010037
38 test::ScopedFieldTrials field_trials(
Evan Shrubsoleae68ea02019-04-09 09:59:00 +020039 "WebRTC-CongestionWindow/QueueSize:100,MinBitrate:100000/");
Rasmus Brandt57d4ac92019-02-04 12:00:24 +010040 const RateControlSettings settings_after =
41 RateControlSettings::ParseFromFieldTrials();
42 EXPECT_TRUE(settings_after.UseCongestionWindowPushback());
43 EXPECT_EQ(settings_after.CongestionWindowMinPushbackTargetBitrateBps(),
44 100000u);
45}
46
Ying Wang45930472021-02-05 11:07:00 +010047TEST(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
62TEST(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
Rasmus Brandt57d4ac92019-02-04 12:00:24 +010070TEST(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
83TEST(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
Åsa Perssond7dd49f2019-05-08 14:44:12 +020091TEST(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
99TEST(RateControlSettingsTest, DoesNotGetTooLargeLibvpxVp8QpMaxValue) {
100 test::ScopedFieldTrials field_trials(
101 "WebRTC-VideoRateControl/vp8_qp_max:70/");
102 EXPECT_FALSE(RateControlSettings::ParseFromFieldTrials().LibvpxVp8QpMax());
103}
104
Åsa Perssona0948492019-06-27 13:44:30 +0200105TEST(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
115TEST(RateControlSettingsTest, DoesNotGetTooSmallLibvpxVp8MinPixelValue) {
116 test::ScopedFieldTrials field_trials(
117 "WebRTC-VideoRateControl/vp8_min_pixels:0/");
118 EXPECT_FALSE(
119 RateControlSettings::ParseFromFieldTrials().LibvpxVp8MinPixels());
120}
121
Rasmus Brandt57d4ac92019-02-04 12:00:24 +0100122TEST(RateControlSettingsTest, LibvpxTrustedRateController) {
123 const RateControlSettings settings_before =
124 RateControlSettings::ParseFromFieldTrials();
Erik Språng9d69cbe2020-10-22 17:44:42 +0200125 EXPECT_TRUE(settings_before.LibvpxVp8TrustedRateController());
126 EXPECT_TRUE(settings_before.LibvpxVp9TrustedRateController());
Rasmus Brandt57d4ac92019-02-04 12:00:24 +0100127
128 test::ScopedFieldTrials field_trials(
Erik Språng9d69cbe2020-10-22 17:44:42 +0200129 "WebRTC-VideoRateControl/trust_vp8:0,trust_vp9:0/");
Rasmus Brandt57d4ac92019-02-04 12:00:24 +0100130 const RateControlSettings settings_after =
131 RateControlSettings::ParseFromFieldTrials();
Erik Språng9d69cbe2020-10-22 17:44:42 +0200132 EXPECT_FALSE(settings_after.LibvpxVp8TrustedRateController());
133 EXPECT_FALSE(settings_after.LibvpxVp9TrustedRateController());
Rasmus Brandtc402dbe2019-02-04 11:09:46 +0100134}
135
Rasmus Brandt2b9317a2019-10-30 13:01:46 +0100136TEST(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
148TEST(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
161TEST(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
Rasmus Brandtc402dbe2019-02-04 11:09:46 +0100175TEST(RateControlSettingsTest, GetSimulcastHysteresisFactor) {
Rasmus Brandt57d4ac92019-02-04 12:00:24 +0100176 const RateControlSettings settings_before =
177 RateControlSettings::ParseFromFieldTrials();
178 EXPECT_DOUBLE_EQ(settings_before.GetSimulcastHysteresisFactor(
179 VideoCodecMode::kRealtimeVideo),
Erik Språng9d69cbe2020-10-22 17:44:42 +0200180 1.2);
Rasmus Brandt57d4ac92019-02-04 12:00:24 +0100181 EXPECT_DOUBLE_EQ(settings_before.GetSimulcastHysteresisFactor(
182 VideoEncoderConfig::ContentType::kRealtimeVideo),
Erik Språng9d69cbe2020-10-22 17:44:42 +0200183 1.2);
Rasmus Brandt57d4ac92019-02-04 12:00:24 +0100184 EXPECT_DOUBLE_EQ(settings_before.GetSimulcastHysteresisFactor(
185 VideoCodecMode::kScreensharing),
186 1.35);
187 EXPECT_DOUBLE_EQ(settings_before.GetSimulcastHysteresisFactor(
188 VideoEncoderConfig::ContentType::kScreen),
189 1.35);
190
Rasmus Brandtc402dbe2019-02-04 11:09:46 +0100191 test::ScopedFieldTrials field_trials(
192 "WebRTC-VideoRateControl/"
Erik Språng9d69cbe2020-10-22 17:44:42 +0200193 "video_hysteresis:1.0,screenshare_hysteresis:1.4/");
Rasmus Brandt57d4ac92019-02-04 12:00:24 +0100194 const RateControlSettings settings_after =
Rasmus Brandtc402dbe2019-02-04 11:09:46 +0100195 RateControlSettings::ParseFromFieldTrials();
196
Rasmus Brandt57d4ac92019-02-04 12:00:24 +0100197 EXPECT_DOUBLE_EQ(settings_after.GetSimulcastHysteresisFactor(
198 VideoCodecMode::kRealtimeVideo),
Erik Språng9d69cbe2020-10-22 17:44:42 +0200199 1.0);
Rasmus Brandt57d4ac92019-02-04 12:00:24 +0100200 EXPECT_DOUBLE_EQ(settings_after.GetSimulcastHysteresisFactor(
201 VideoEncoderConfig::ContentType::kRealtimeVideo),
Erik Språng9d69cbe2020-10-22 17:44:42 +0200202 1.0);
Rasmus Brandt57d4ac92019-02-04 12:00:24 +0100203 EXPECT_DOUBLE_EQ(settings_after.GetSimulcastHysteresisFactor(
204 VideoCodecMode::kScreensharing),
205 1.4);
206 EXPECT_DOUBLE_EQ(settings_after.GetSimulcastHysteresisFactor(
207 VideoEncoderConfig::ContentType::kScreen),
208 1.4);
209}
210
211TEST(RateControlSettingsTest, TriggerProbeOnMaxAllocatedBitrateChange) {
212 EXPECT_TRUE(RateControlSettings::ParseFromFieldTrials()
213 .TriggerProbeOnMaxAllocatedBitrateChange());
214
215 test::ScopedFieldTrials field_trials(
216 "WebRTC-VideoRateControl/probe_max_allocation:0/");
217 EXPECT_FALSE(RateControlSettings::ParseFromFieldTrials()
218 .TriggerProbeOnMaxAllocatedBitrateChange());
Rasmus Brandtc402dbe2019-02-04 11:09:46 +0100219}
220
Erik Språng7ca375c2019-02-06 16:20:17 +0100221TEST(RateControlSettingsTest, UseEncoderBitrateAdjuster) {
Erik Språng9d69cbe2020-10-22 17:44:42 +0200222 // Should be on by default.
223 EXPECT_TRUE(
Erik Språng7ca375c2019-02-06 16:20:17 +0100224 RateControlSettings::ParseFromFieldTrials().UseEncoderBitrateAdjuster());
225
226 {
Erik Språng9d69cbe2020-10-22 17:44:42 +0200227 // Can be turned off via field trial.
Erik Språng7ca375c2019-02-06 16:20:17 +0100228 test::ScopedFieldTrials field_trials(
Erik Språng9d69cbe2020-10-22 17:44:42 +0200229 "WebRTC-VideoRateControl/bitrate_adjuster:false/");
230 EXPECT_FALSE(RateControlSettings::ParseFromFieldTrials()
231 .UseEncoderBitrateAdjuster());
Erik Språng7ca375c2019-02-06 16:20:17 +0100232 }
233}
234
Rasmus Brandtc402dbe2019-02-04 11:09:46 +0100235} // namespace
236
237} // namespace webrtc