blob: ae9a1921e5884577b415f28df8ee62b0938557f6 [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
Rasmus Brandt57d4ac92019-02-04 12:00:24 +010026 test::ScopedFieldTrials field_trials("WebRTC-VideoRateControl/cwnd:100/");
27 const RateControlSettings settings_after =
28 RateControlSettings::ParseFromFieldTrials();
29 EXPECT_TRUE(settings_after.UseCongestionWindow());
30 EXPECT_EQ(settings_after.GetCongestionWindowAdditionalTimeMs(), 100);
31}
32
33TEST(RateControlSettingsTest, CongestionWindowPushback) {
34 EXPECT_FALSE(RateControlSettings::ParseFromFieldTrials()
35 .UseCongestionWindowPushback());
36
37 test::ScopedFieldTrials field_trials(
38 "WebRTC-VideoRateControl/cwnd:100,cwnd_pushback:100000/");
39 const RateControlSettings settings_after =
40 RateControlSettings::ParseFromFieldTrials();
41 EXPECT_TRUE(settings_after.UseCongestionWindowPushback());
42 EXPECT_EQ(settings_after.CongestionWindowMinPushbackTargetBitrateBps(),
43 100000u);
44}
45
46TEST(RateControlSettingsTest, PacingFactor) {
47 EXPECT_FALSE(RateControlSettings::ParseFromFieldTrials().GetPacingFactor());
48
49 test::ScopedFieldTrials field_trials(
50 "WebRTC-VideoRateControl/pacing_factor:1.2/");
51 const RateControlSettings settings_after =
52 RateControlSettings::ParseFromFieldTrials();
53 // Need to explicitly dereference the absl::optional
54 // for the EXPECT_DOUBLE_EQ to compile.
55 ASSERT_TRUE(settings_after.GetPacingFactor());
56 EXPECT_DOUBLE_EQ(*settings_after.GetPacingFactor(), 1.2);
57}
58
59TEST(RateControlSettingsTest, AlrProbing) {
60 EXPECT_FALSE(RateControlSettings::ParseFromFieldTrials().UseAlrProbing());
61
62 test::ScopedFieldTrials field_trials(
63 "WebRTC-VideoRateControl/alr_probing:1/");
64 EXPECT_TRUE(RateControlSettings::ParseFromFieldTrials().UseAlrProbing());
65}
66
67TEST(RateControlSettingsTest, LibvpxTrustedRateController) {
68 const RateControlSettings settings_before =
69 RateControlSettings::ParseFromFieldTrials();
70 EXPECT_FALSE(settings_before.LibvpxVp8TrustedRateController());
71 EXPECT_FALSE(settings_before.LibvpxVp9TrustedRateController());
72
73 test::ScopedFieldTrials field_trials(
74 "WebRTC-VideoRateControl/trust_vp8:1,trust_vp9:1/");
75 const RateControlSettings settings_after =
76 RateControlSettings::ParseFromFieldTrials();
77 EXPECT_TRUE(settings_after.LibvpxVp8TrustedRateController());
78 EXPECT_TRUE(settings_after.LibvpxVp9TrustedRateController());
Rasmus Brandtc402dbe2019-02-04 11:09:46 +010079}
80
81TEST(RateControlSettingsTest, GetSimulcastHysteresisFactor) {
Rasmus Brandt57d4ac92019-02-04 12:00:24 +010082 const RateControlSettings settings_before =
83 RateControlSettings::ParseFromFieldTrials();
84 EXPECT_DOUBLE_EQ(settings_before.GetSimulcastHysteresisFactor(
85 VideoCodecMode::kRealtimeVideo),
86 1.0);
87 EXPECT_DOUBLE_EQ(settings_before.GetSimulcastHysteresisFactor(
88 VideoEncoderConfig::ContentType::kRealtimeVideo),
89 1.0);
90 EXPECT_DOUBLE_EQ(settings_before.GetSimulcastHysteresisFactor(
91 VideoCodecMode::kScreensharing),
92 1.35);
93 EXPECT_DOUBLE_EQ(settings_before.GetSimulcastHysteresisFactor(
94 VideoEncoderConfig::ContentType::kScreen),
95 1.35);
96
Rasmus Brandtc402dbe2019-02-04 11:09:46 +010097 test::ScopedFieldTrials field_trials(
98 "WebRTC-VideoRateControl/"
99 "video_hysteresis:1.2,screenshare_hysteresis:1.4/");
Rasmus Brandt57d4ac92019-02-04 12:00:24 +0100100 const RateControlSettings settings_after =
Rasmus Brandtc402dbe2019-02-04 11:09:46 +0100101 RateControlSettings::ParseFromFieldTrials();
102
Rasmus Brandt57d4ac92019-02-04 12:00:24 +0100103 EXPECT_DOUBLE_EQ(settings_after.GetSimulcastHysteresisFactor(
104 VideoCodecMode::kRealtimeVideo),
105 1.2);
106 EXPECT_DOUBLE_EQ(settings_after.GetSimulcastHysteresisFactor(
107 VideoEncoderConfig::ContentType::kRealtimeVideo),
108 1.2);
109 EXPECT_DOUBLE_EQ(settings_after.GetSimulcastHysteresisFactor(
110 VideoCodecMode::kScreensharing),
111 1.4);
112 EXPECT_DOUBLE_EQ(settings_after.GetSimulcastHysteresisFactor(
113 VideoEncoderConfig::ContentType::kScreen),
114 1.4);
115}
116
117TEST(RateControlSettingsTest, TriggerProbeOnMaxAllocatedBitrateChange) {
118 EXPECT_TRUE(RateControlSettings::ParseFromFieldTrials()
119 .TriggerProbeOnMaxAllocatedBitrateChange());
120
121 test::ScopedFieldTrials field_trials(
122 "WebRTC-VideoRateControl/probe_max_allocation:0/");
123 EXPECT_FALSE(RateControlSettings::ParseFromFieldTrials()
124 .TriggerProbeOnMaxAllocatedBitrateChange());
Rasmus Brandtc402dbe2019-02-04 11:09:46 +0100125}
126
127} // namespace
128
129} // namespace webrtc