blob: 0f23df0726fdd546c47b6e86ca5b2fe5b3d20927 [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 Shrubsoledd33d8e2019-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 Shrubsoledd33d8e2019-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
68TEST(RateControlSettingsTest, LibvpxTrustedRateController) {
69 const RateControlSettings settings_before =
70 RateControlSettings::ParseFromFieldTrials();
71 EXPECT_FALSE(settings_before.LibvpxVp8TrustedRateController());
72 EXPECT_FALSE(settings_before.LibvpxVp9TrustedRateController());
73
74 test::ScopedFieldTrials field_trials(
75 "WebRTC-VideoRateControl/trust_vp8:1,trust_vp9:1/");
76 const RateControlSettings settings_after =
77 RateControlSettings::ParseFromFieldTrials();
78 EXPECT_TRUE(settings_after.LibvpxVp8TrustedRateController());
79 EXPECT_TRUE(settings_after.LibvpxVp9TrustedRateController());
Rasmus Brandtc402dbe2019-02-04 11:09:46 +010080}
81
82TEST(RateControlSettingsTest, GetSimulcastHysteresisFactor) {
Rasmus Brandt57d4ac92019-02-04 12:00:24 +010083 const RateControlSettings settings_before =
84 RateControlSettings::ParseFromFieldTrials();
85 EXPECT_DOUBLE_EQ(settings_before.GetSimulcastHysteresisFactor(
86 VideoCodecMode::kRealtimeVideo),
87 1.0);
88 EXPECT_DOUBLE_EQ(settings_before.GetSimulcastHysteresisFactor(
89 VideoEncoderConfig::ContentType::kRealtimeVideo),
90 1.0);
91 EXPECT_DOUBLE_EQ(settings_before.GetSimulcastHysteresisFactor(
92 VideoCodecMode::kScreensharing),
93 1.35);
94 EXPECT_DOUBLE_EQ(settings_before.GetSimulcastHysteresisFactor(
95 VideoEncoderConfig::ContentType::kScreen),
96 1.35);
97
Rasmus Brandtc402dbe2019-02-04 11:09:46 +010098 test::ScopedFieldTrials field_trials(
99 "WebRTC-VideoRateControl/"
100 "video_hysteresis:1.2,screenshare_hysteresis:1.4/");
Rasmus Brandt57d4ac92019-02-04 12:00:24 +0100101 const RateControlSettings settings_after =
Rasmus Brandtc402dbe2019-02-04 11:09:46 +0100102 RateControlSettings::ParseFromFieldTrials();
103
Rasmus Brandt57d4ac92019-02-04 12:00:24 +0100104 EXPECT_DOUBLE_EQ(settings_after.GetSimulcastHysteresisFactor(
105 VideoCodecMode::kRealtimeVideo),
106 1.2);
107 EXPECT_DOUBLE_EQ(settings_after.GetSimulcastHysteresisFactor(
108 VideoEncoderConfig::ContentType::kRealtimeVideo),
109 1.2);
110 EXPECT_DOUBLE_EQ(settings_after.GetSimulcastHysteresisFactor(
111 VideoCodecMode::kScreensharing),
112 1.4);
113 EXPECT_DOUBLE_EQ(settings_after.GetSimulcastHysteresisFactor(
114 VideoEncoderConfig::ContentType::kScreen),
115 1.4);
116}
117
118TEST(RateControlSettingsTest, TriggerProbeOnMaxAllocatedBitrateChange) {
119 EXPECT_TRUE(RateControlSettings::ParseFromFieldTrials()
120 .TriggerProbeOnMaxAllocatedBitrateChange());
121
122 test::ScopedFieldTrials field_trials(
123 "WebRTC-VideoRateControl/probe_max_allocation:0/");
124 EXPECT_FALSE(RateControlSettings::ParseFromFieldTrials()
125 .TriggerProbeOnMaxAllocatedBitrateChange());
Rasmus Brandtc402dbe2019-02-04 11:09:46 +0100126}
127
Erik Språng7ca375c2019-02-06 16:20:17 +0100128TEST(RateControlSettingsTest, UseEncoderBitrateAdjuster) {
129 // Should be off by default.
130 EXPECT_FALSE(
131 RateControlSettings::ParseFromFieldTrials().UseEncoderBitrateAdjuster());
132
133 {
134 // Can be turned on via field trial.
135 test::ScopedFieldTrials field_trials(
136 "WebRTC-VideoRateControl/bitrate_adjuster:true/");
137 EXPECT_TRUE(RateControlSettings::ParseFromFieldTrials()
138 .UseEncoderBitrateAdjuster());
139 }
140}
141
Rasmus Brandtc402dbe2019-02-04 11:09:46 +0100142} // namespace
143
144} // namespace webrtc