blob: 89319e908852a79dd8c051242d8eaf83cb900113 [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
Rasmus Brandt57d4ac92019-02-04 12:00:24 +010082TEST(RateControlSettingsTest, LibvpxTrustedRateController) {
83 const RateControlSettings settings_before =
84 RateControlSettings::ParseFromFieldTrials();
85 EXPECT_FALSE(settings_before.LibvpxVp8TrustedRateController());
86 EXPECT_FALSE(settings_before.LibvpxVp9TrustedRateController());
87
88 test::ScopedFieldTrials field_trials(
89 "WebRTC-VideoRateControl/trust_vp8:1,trust_vp9:1/");
90 const RateControlSettings settings_after =
91 RateControlSettings::ParseFromFieldTrials();
92 EXPECT_TRUE(settings_after.LibvpxVp8TrustedRateController());
93 EXPECT_TRUE(settings_after.LibvpxVp9TrustedRateController());
Rasmus Brandtc402dbe2019-02-04 11:09:46 +010094}
95
96TEST(RateControlSettingsTest, GetSimulcastHysteresisFactor) {
Rasmus Brandt57d4ac92019-02-04 12:00:24 +010097 const RateControlSettings settings_before =
98 RateControlSettings::ParseFromFieldTrials();
99 EXPECT_DOUBLE_EQ(settings_before.GetSimulcastHysteresisFactor(
100 VideoCodecMode::kRealtimeVideo),
101 1.0);
102 EXPECT_DOUBLE_EQ(settings_before.GetSimulcastHysteresisFactor(
103 VideoEncoderConfig::ContentType::kRealtimeVideo),
104 1.0);
105 EXPECT_DOUBLE_EQ(settings_before.GetSimulcastHysteresisFactor(
106 VideoCodecMode::kScreensharing),
107 1.35);
108 EXPECT_DOUBLE_EQ(settings_before.GetSimulcastHysteresisFactor(
109 VideoEncoderConfig::ContentType::kScreen),
110 1.35);
111
Rasmus Brandtc402dbe2019-02-04 11:09:46 +0100112 test::ScopedFieldTrials field_trials(
113 "WebRTC-VideoRateControl/"
114 "video_hysteresis:1.2,screenshare_hysteresis:1.4/");
Rasmus Brandt57d4ac92019-02-04 12:00:24 +0100115 const RateControlSettings settings_after =
Rasmus Brandtc402dbe2019-02-04 11:09:46 +0100116 RateControlSettings::ParseFromFieldTrials();
117
Rasmus Brandt57d4ac92019-02-04 12:00:24 +0100118 EXPECT_DOUBLE_EQ(settings_after.GetSimulcastHysteresisFactor(
119 VideoCodecMode::kRealtimeVideo),
120 1.2);
121 EXPECT_DOUBLE_EQ(settings_after.GetSimulcastHysteresisFactor(
122 VideoEncoderConfig::ContentType::kRealtimeVideo),
123 1.2);
124 EXPECT_DOUBLE_EQ(settings_after.GetSimulcastHysteresisFactor(
125 VideoCodecMode::kScreensharing),
126 1.4);
127 EXPECT_DOUBLE_EQ(settings_after.GetSimulcastHysteresisFactor(
128 VideoEncoderConfig::ContentType::kScreen),
129 1.4);
130}
131
132TEST(RateControlSettingsTest, TriggerProbeOnMaxAllocatedBitrateChange) {
133 EXPECT_TRUE(RateControlSettings::ParseFromFieldTrials()
134 .TriggerProbeOnMaxAllocatedBitrateChange());
135
136 test::ScopedFieldTrials field_trials(
137 "WebRTC-VideoRateControl/probe_max_allocation:0/");
138 EXPECT_FALSE(RateControlSettings::ParseFromFieldTrials()
139 .TriggerProbeOnMaxAllocatedBitrateChange());
Rasmus Brandtc402dbe2019-02-04 11:09:46 +0100140}
141
Erik Språng7ca375c2019-02-06 16:20:17 +0100142TEST(RateControlSettingsTest, UseEncoderBitrateAdjuster) {
143 // Should be off by default.
144 EXPECT_FALSE(
145 RateControlSettings::ParseFromFieldTrials().UseEncoderBitrateAdjuster());
146
147 {
148 // Can be turned on via field trial.
149 test::ScopedFieldTrials field_trials(
150 "WebRTC-VideoRateControl/bitrate_adjuster:true/");
151 EXPECT_TRUE(RateControlSettings::ParseFromFieldTrials()
152 .UseEncoderBitrateAdjuster());
153 }
154}
155
Rasmus Brandtc402dbe2019-02-04 11:09:46 +0100156} // namespace
157
158} // namespace webrtc