blob: 253d3fb3df54cda2e5491633090479218cc306d4 [file] [log] [blame]
stefan@webrtc.org792f1a12015-03-04 12:24:26 +00001/*
2 * Copyright (c) 2012 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 <algorithm>
kwibergb25345e2016-03-12 06:10:44 -080012#include <memory>
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000013#include <vector>
14
15#include "testing/gtest/include/gtest/gtest.h"
mflodman0e7e2592015-11-12 21:02:42 -080016#include "webrtc/call/bitrate_allocator.h"
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000017#include "webrtc/modules/bitrate_controller/include/bitrate_controller.h"
18
19namespace webrtc {
20
mflodman86aabb22016-03-11 15:44:32 +010021class TestBitrateObserver : public BitrateAllocatorObserver {
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000022 public:
23 TestBitrateObserver()
24 : last_bitrate_(0), last_fraction_loss_(0), last_rtt_(0) {}
25
mflodman86aabb22016-03-11 15:44:32 +010026 virtual void OnBitrateUpdated(uint32_t bitrate,
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000027 uint8_t fraction_loss,
28 int64_t rtt) {
29 last_bitrate_ = bitrate;
30 last_fraction_loss_ = fraction_loss;
31 last_rtt_ = rtt;
32 }
33 uint32_t last_bitrate_;
34 uint8_t last_fraction_loss_;
35 int64_t last_rtt_;
36};
37
38class BitrateAllocatorTest : public ::testing::Test {
39 protected:
Stefan Holmere5904162015-03-26 11:11:06 +010040 BitrateAllocatorTest() : allocator_(new BitrateAllocator()) {
41 allocator_->OnNetworkChanged(300000u, 0, 0);
42 }
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000043 ~BitrateAllocatorTest() {}
44
kwibergb25345e2016-03-12 06:10:44 -080045 std::unique_ptr<BitrateAllocator> allocator_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000046};
47
48TEST_F(BitrateAllocatorTest, UpdatingBitrateObserver) {
49 TestBitrateObserver bitrate_observer;
Peter Boström8e4e8b02015-09-15 15:08:03 +020050 int start_bitrate =
mflodman2ebe5b12016-05-13 01:43:51 -070051 allocator_->AddObserver(&bitrate_observer, 100000, 1500000, true);
Stefan Holmere5904162015-03-26 11:11:06 +010052 EXPECT_EQ(300000, start_bitrate);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000053 allocator_->OnNetworkChanged(200000, 0, 0);
54 EXPECT_EQ(200000u, bitrate_observer.last_bitrate_);
55
Peter Boström8e4e8b02015-09-15 15:08:03 +020056 // TODO(pbos): Expect capping to 1.5M instead of 3M when not boosting the max
mflodman0e7e2592015-11-12 21:02:42 -080057 // bitrate for FEC/retransmissions (see todo in BitrateAllocator).
Peter Boström8e4e8b02015-09-15 15:08:03 +020058 allocator_->OnNetworkChanged(4000000, 0, 0);
59 EXPECT_EQ(3000000u, bitrate_observer.last_bitrate_);
mflodman2ebe5b12016-05-13 01:43:51 -070060 start_bitrate =
61 allocator_->AddObserver(&bitrate_observer, 100000, 4000000, true);
Peter Boström8e4e8b02015-09-15 15:08:03 +020062 EXPECT_EQ(4000000, start_bitrate);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000063
mflodman2ebe5b12016-05-13 01:43:51 -070064 start_bitrate =
65 allocator_->AddObserver(&bitrate_observer, 100000, 1500000, true);
Peter Boström8e4e8b02015-09-15 15:08:03 +020066 EXPECT_EQ(3000000, start_bitrate);
67 EXPECT_EQ(3000000u, bitrate_observer.last_bitrate_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000068 allocator_->OnNetworkChanged(1500000, 0, 0);
69 EXPECT_EQ(1500000u, bitrate_observer.last_bitrate_);
70}
71
72TEST_F(BitrateAllocatorTest, TwoBitrateObserversOneRtcpObserver) {
73 TestBitrateObserver bitrate_observer_1;
74 TestBitrateObserver bitrate_observer_2;
Peter Boström8e4e8b02015-09-15 15:08:03 +020075 int start_bitrate =
mflodman2ebe5b12016-05-13 01:43:51 -070076 allocator_->AddObserver(&bitrate_observer_1, 100000, 300000, true);
Stefan Holmere5904162015-03-26 11:11:06 +010077 EXPECT_EQ(300000, start_bitrate);
mflodman2ebe5b12016-05-13 01:43:51 -070078 start_bitrate =
79 allocator_->AddObserver(&bitrate_observer_2, 200000, 300000, true);
Stefan Holmere5904162015-03-26 11:11:06 +010080 EXPECT_EQ(200000, start_bitrate);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000081
82 // Test too low start bitrate, hence lower than sum of min. Min bitrates will
83 // be allocated to all observers.
84 allocator_->OnNetworkChanged(200000, 0, 50);
85 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_);
86 EXPECT_EQ(0, bitrate_observer_1.last_fraction_loss_);
87 EXPECT_EQ(50, bitrate_observer_1.last_rtt_);
88 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_);
89 EXPECT_EQ(0, bitrate_observer_2.last_fraction_loss_);
90 EXPECT_EQ(50, bitrate_observer_2.last_rtt_);
91
92 // Test a bitrate which should be distributed equally.
93 allocator_->OnNetworkChanged(500000, 0, 50);
94 const uint32_t kBitrateToShare = 500000 - 200000 - 100000;
95 EXPECT_EQ(100000u + kBitrateToShare / 2, bitrate_observer_1.last_bitrate_);
96 EXPECT_EQ(200000u + kBitrateToShare / 2, bitrate_observer_2.last_bitrate_);
97
Stefan Holmere5904162015-03-26 11:11:06 +010098 // Limited by 2x max bitrates since we leave room for FEC and retransmissions.
99 allocator_->OnNetworkChanged(1500000, 0, 50);
100 EXPECT_EQ(600000u, bitrate_observer_1.last_bitrate_);
101 EXPECT_EQ(600000u, bitrate_observer_2.last_bitrate_);
perkjec81bcd2016-05-11 06:01:13 -0700102
103 // Verify that if the bandwidth estimate is set to zero, the allocated rate is
104 // zero.
105 allocator_->OnNetworkChanged(0, 0, 50);
106 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_);
107 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000108}
109
110class BitrateAllocatorTestNoEnforceMin : public ::testing::Test {
111 protected:
112 BitrateAllocatorTestNoEnforceMin() : allocator_(new BitrateAllocator()) {
Stefan Holmere5904162015-03-26 11:11:06 +0100113 allocator_->OnNetworkChanged(300000u, 0, 0);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000114 }
115 ~BitrateAllocatorTestNoEnforceMin() {}
116
kwibergb25345e2016-03-12 06:10:44 -0800117 std::unique_ptr<BitrateAllocator> allocator_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000118};
119
120// The following three tests verify that the EnforceMinBitrate() method works
121// as intended.
122TEST_F(BitrateAllocatorTestNoEnforceMin, OneBitrateObserver) {
123 TestBitrateObserver bitrate_observer_1;
Peter Boström8e4e8b02015-09-15 15:08:03 +0200124 int start_bitrate =
mflodman2ebe5b12016-05-13 01:43:51 -0700125 allocator_->AddObserver(&bitrate_observer_1, 100000, 400000, false);
Stefan Holmere5904162015-03-26 11:11:06 +0100126 EXPECT_EQ(300000, start_bitrate);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000127
128 // High REMB.
129 allocator_->OnNetworkChanged(150000, 0, 0);
130 EXPECT_EQ(150000u, bitrate_observer_1.last_bitrate_);
131
132 // Low REMB.
133 allocator_->OnNetworkChanged(10000, 0, 0);
134 EXPECT_EQ(10000u, bitrate_observer_1.last_bitrate_);
135
mflodman86aabb22016-03-11 15:44:32 +0100136 allocator_->RemoveObserver(&bitrate_observer_1);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000137}
138
139TEST_F(BitrateAllocatorTestNoEnforceMin, ThreeBitrateObservers) {
140 TestBitrateObserver bitrate_observer_1;
141 TestBitrateObserver bitrate_observer_2;
142 TestBitrateObserver bitrate_observer_3;
143 // Set up the observers with min bitrates at 100000, 200000, and 300000.
Peter Boström8e4e8b02015-09-15 15:08:03 +0200144 int start_bitrate =
mflodman2ebe5b12016-05-13 01:43:51 -0700145 allocator_->AddObserver(&bitrate_observer_1, 100000, 400000, false);
Stefan Holmere5904162015-03-26 11:11:06 +0100146 EXPECT_EQ(300000, start_bitrate);
147
mflodman2ebe5b12016-05-13 01:43:51 -0700148 start_bitrate =
149 allocator_->AddObserver(&bitrate_observer_2, 200000, 400000, false);
Stefan Holmere5904162015-03-26 11:11:06 +0100150 EXPECT_EQ(200000, start_bitrate);
151 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_);
152
mflodman2ebe5b12016-05-13 01:43:51 -0700153 start_bitrate =
154 allocator_->AddObserver(&bitrate_observer_3, 300000, 400000, false);
Stefan Holmere5904162015-03-26 11:11:06 +0100155 EXPECT_EQ(0, start_bitrate);
156 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_);
157 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000158
159 // High REMB. Make sure the controllers get a fair share of the surplus
160 // (i.e., what is left after each controller gets its min rate).
161 allocator_->OnNetworkChanged(690000, 0, 0);
162 // Verify that each observer gets its min rate (sum of min rates is 600000),
163 // and that the remaining 90000 is divided equally among the three.
Stefan Holmere5904162015-03-26 11:11:06 +0100164 uint32_t bitrate_to_share = 690000u - 100000u - 200000u - 300000u;
165 EXPECT_EQ(100000u + bitrate_to_share / 3, bitrate_observer_1.last_bitrate_);
166 EXPECT_EQ(200000u + bitrate_to_share / 3, bitrate_observer_2.last_bitrate_);
167 EXPECT_EQ(300000u + bitrate_to_share / 3, bitrate_observer_3.last_bitrate_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000168
169 // High REMB, but below the sum of min bitrates.
170 allocator_->OnNetworkChanged(500000, 0, 0);
171 // Verify that the first and second observers get their min bitrates, and the
172 // third gets the remainder.
173 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_); // Min bitrate.
174 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_); // Min bitrate.
175 EXPECT_EQ(200000u, bitrate_observer_3.last_bitrate_); // Remainder.
176
177 // Low REMB.
178 allocator_->OnNetworkChanged(10000, 0, 0);
179 // Verify that the first observer gets all the rate, and the rest get zero.
180 EXPECT_EQ(10000u, bitrate_observer_1.last_bitrate_);
181 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_);
182 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_);
183
perkjec81bcd2016-05-11 06:01:13 -0700184 allocator_->OnNetworkChanged(0, 0, 0);
185 // Verify that zero estimated bandwidth, means that that all gets zero,
186 // regardless of set min bitrate.
187 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_);
188 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_);
189 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_);
190
mflodman86aabb22016-03-11 15:44:32 +0100191 allocator_->RemoveObserver(&bitrate_observer_1);
192 allocator_->RemoveObserver(&bitrate_observer_2);
193 allocator_->RemoveObserver(&bitrate_observer_3);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000194}
195
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000196TEST_F(BitrateAllocatorTest, ThreeBitrateObserversLowRembEnforceMin) {
197 TestBitrateObserver bitrate_observer_1;
198 TestBitrateObserver bitrate_observer_2;
199 TestBitrateObserver bitrate_observer_3;
Peter Boström8e4e8b02015-09-15 15:08:03 +0200200 int start_bitrate =
mflodman2ebe5b12016-05-13 01:43:51 -0700201 allocator_->AddObserver(&bitrate_observer_1, 100000, 400000, true);
Stefan Holmere5904162015-03-26 11:11:06 +0100202 EXPECT_EQ(300000, start_bitrate);
203
mflodman2ebe5b12016-05-13 01:43:51 -0700204 start_bitrate =
205 allocator_->AddObserver(&bitrate_observer_2, 200000, 400000, true);
Stefan Holmere5904162015-03-26 11:11:06 +0100206 EXPECT_EQ(200000, start_bitrate);
207 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_);
208
mflodman2ebe5b12016-05-13 01:43:51 -0700209 start_bitrate =
210 allocator_->AddObserver(&bitrate_observer_3, 300000, 400000, true);
Stefan Holmere5904162015-03-26 11:11:06 +0100211 EXPECT_EQ(300000, start_bitrate);
212 EXPECT_EQ(100000, static_cast<int>(bitrate_observer_1.last_bitrate_));
213 EXPECT_EQ(200000, static_cast<int>(bitrate_observer_2.last_bitrate_));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000214
215 // Low REMB. Verify that all observers still get their respective min bitrate.
216 allocator_->OnNetworkChanged(1000, 0, 0);
217 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_); // Min cap.
218 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_); // Min cap.
219 EXPECT_EQ(300000u, bitrate_observer_3.last_bitrate_); // Min cap.
220
mflodman86aabb22016-03-11 15:44:32 +0100221 allocator_->RemoveObserver(&bitrate_observer_1);
222 allocator_->RemoveObserver(&bitrate_observer_2);
223 allocator_->RemoveObserver(&bitrate_observer_3);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000224}
225} // namespace webrtc