blob: dfdd7deb891cfcd0cad5baf26a21c23a1eb44da9 [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) {
23 EXPECT_FALSE(
24 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) {
35 EXPECT_FALSE(RateControlSettings::ParseFromFieldTrials()
36 .UseCongestionWindowPushback());
37
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
47TEST(RateControlSettingsTest, PacingFactor) {
48 EXPECT_FALSE(RateControlSettings::ParseFromFieldTrials().GetPacingFactor());
49
50 test::ScopedFieldTrials field_trials(
51 "WebRTC-VideoRateControl/pacing_factor:1.2/");
52 const RateControlSettings settings_after =
53 RateControlSettings::ParseFromFieldTrials();
54 // Need to explicitly dereference the absl::optional
55 // for the EXPECT_DOUBLE_EQ to compile.
56 ASSERT_TRUE(settings_after.GetPacingFactor());
57 EXPECT_DOUBLE_EQ(*settings_after.GetPacingFactor(), 1.2);
58}
59
60TEST(RateControlSettingsTest, AlrProbing) {
61 EXPECT_FALSE(RateControlSettings::ParseFromFieldTrials().UseAlrProbing());
62
63 test::ScopedFieldTrials field_trials(
64 "WebRTC-VideoRateControl/alr_probing:1/");
65 EXPECT_TRUE(RateControlSettings::ParseFromFieldTrials().UseAlrProbing());
66}
67
Åsa Perssond7dd49f2019-05-08 14:44:12 +020068TEST(RateControlSettingsTest, LibvpxVp8QpMax) {
69 EXPECT_FALSE(RateControlSettings::ParseFromFieldTrials().LibvpxVp8QpMax());
70
71 test::ScopedFieldTrials field_trials(
72 "WebRTC-VideoRateControl/vp8_qp_max:50/");
73 EXPECT_EQ(RateControlSettings::ParseFromFieldTrials().LibvpxVp8QpMax(), 50);
74}
75
76TEST(RateControlSettingsTest, DoesNotGetTooLargeLibvpxVp8QpMaxValue) {
77 test::ScopedFieldTrials field_trials(
78 "WebRTC-VideoRateControl/vp8_qp_max:70/");
79 EXPECT_FALSE(RateControlSettings::ParseFromFieldTrials().LibvpxVp8QpMax());
80}
81
Åsa Perssona0948492019-06-27 13:44:30 +020082TEST(RateControlSettingsTest, LibvpxVp8MinPixels) {
83 EXPECT_FALSE(
84 RateControlSettings::ParseFromFieldTrials().LibvpxVp8MinPixels());
85
86 test::ScopedFieldTrials field_trials(
87 "WebRTC-VideoRateControl/vp8_min_pixels:50000/");
88 EXPECT_EQ(RateControlSettings::ParseFromFieldTrials().LibvpxVp8MinPixels(),
89 50000);
90}
91
92TEST(RateControlSettingsTest, DoesNotGetTooSmallLibvpxVp8MinPixelValue) {
93 test::ScopedFieldTrials field_trials(
94 "WebRTC-VideoRateControl/vp8_min_pixels:0/");
95 EXPECT_FALSE(
96 RateControlSettings::ParseFromFieldTrials().LibvpxVp8MinPixels());
97}
98
Rasmus Brandt57d4ac92019-02-04 12:00:24 +010099TEST(RateControlSettingsTest, LibvpxTrustedRateController) {
100 const RateControlSettings settings_before =
101 RateControlSettings::ParseFromFieldTrials();
102 EXPECT_FALSE(settings_before.LibvpxVp8TrustedRateController());
103 EXPECT_FALSE(settings_before.LibvpxVp9TrustedRateController());
104
105 test::ScopedFieldTrials field_trials(
106 "WebRTC-VideoRateControl/trust_vp8:1,trust_vp9:1/");
107 const RateControlSettings settings_after =
108 RateControlSettings::ParseFromFieldTrials();
109 EXPECT_TRUE(settings_after.LibvpxVp8TrustedRateController());
110 EXPECT_TRUE(settings_after.LibvpxVp9TrustedRateController());
Rasmus Brandtc402dbe2019-02-04 11:09:46 +0100111}
112
113TEST(RateControlSettingsTest, GetSimulcastHysteresisFactor) {
Rasmus Brandt57d4ac92019-02-04 12:00:24 +0100114 const RateControlSettings settings_before =
115 RateControlSettings::ParseFromFieldTrials();
116 EXPECT_DOUBLE_EQ(settings_before.GetSimulcastHysteresisFactor(
117 VideoCodecMode::kRealtimeVideo),
118 1.0);
119 EXPECT_DOUBLE_EQ(settings_before.GetSimulcastHysteresisFactor(
120 VideoEncoderConfig::ContentType::kRealtimeVideo),
121 1.0);
122 EXPECT_DOUBLE_EQ(settings_before.GetSimulcastHysteresisFactor(
123 VideoCodecMode::kScreensharing),
124 1.35);
125 EXPECT_DOUBLE_EQ(settings_before.GetSimulcastHysteresisFactor(
126 VideoEncoderConfig::ContentType::kScreen),
127 1.35);
128
Rasmus Brandtc402dbe2019-02-04 11:09:46 +0100129 test::ScopedFieldTrials field_trials(
130 "WebRTC-VideoRateControl/"
131 "video_hysteresis:1.2,screenshare_hysteresis:1.4/");
Rasmus Brandt57d4ac92019-02-04 12:00:24 +0100132 const RateControlSettings settings_after =
Rasmus Brandtc402dbe2019-02-04 11:09:46 +0100133 RateControlSettings::ParseFromFieldTrials();
134
Rasmus Brandt57d4ac92019-02-04 12:00:24 +0100135 EXPECT_DOUBLE_EQ(settings_after.GetSimulcastHysteresisFactor(
136 VideoCodecMode::kRealtimeVideo),
137 1.2);
138 EXPECT_DOUBLE_EQ(settings_after.GetSimulcastHysteresisFactor(
139 VideoEncoderConfig::ContentType::kRealtimeVideo),
140 1.2);
141 EXPECT_DOUBLE_EQ(settings_after.GetSimulcastHysteresisFactor(
142 VideoCodecMode::kScreensharing),
143 1.4);
144 EXPECT_DOUBLE_EQ(settings_after.GetSimulcastHysteresisFactor(
145 VideoEncoderConfig::ContentType::kScreen),
146 1.4);
147}
148
149TEST(RateControlSettingsTest, TriggerProbeOnMaxAllocatedBitrateChange) {
150 EXPECT_TRUE(RateControlSettings::ParseFromFieldTrials()
151 .TriggerProbeOnMaxAllocatedBitrateChange());
152
153 test::ScopedFieldTrials field_trials(
154 "WebRTC-VideoRateControl/probe_max_allocation:0/");
155 EXPECT_FALSE(RateControlSettings::ParseFromFieldTrials()
156 .TriggerProbeOnMaxAllocatedBitrateChange());
Rasmus Brandtc402dbe2019-02-04 11:09:46 +0100157}
158
Erik Språng7ca375c2019-02-06 16:20:17 +0100159TEST(RateControlSettingsTest, UseEncoderBitrateAdjuster) {
160 // Should be off by default.
161 EXPECT_FALSE(
162 RateControlSettings::ParseFromFieldTrials().UseEncoderBitrateAdjuster());
163
164 {
165 // Can be turned on via field trial.
166 test::ScopedFieldTrials field_trials(
167 "WebRTC-VideoRateControl/bitrate_adjuster:true/");
168 EXPECT_TRUE(RateControlSettings::ParseFromFieldTrials()
169 .UseEncoderBitrateAdjuster());
170 }
171}
172
Rasmus Brandtc402dbe2019-02-04 11:09:46 +0100173} // namespace
174
175} // namespace webrtc