blob: edb3f7e30eb2d0ceb308953dab38ca59013c8580 [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
Jonas Olssona4d87372019-07-05 19:08:33 +020011#include "call/bitrate_allocator.h"
12
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000013#include <algorithm>
kwibergb25345e2016-03-12 06:10:44 -080014#include <memory>
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000015#include <vector>
16
Sebastian Jansson4ad51d82019-06-11 11:24:40 +020017#include "system_wrappers/include/clock.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020018#include "test/gmock.h"
19#include "test/gtest.h"
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000020
Seth Hampsonfe73d6a2017-11-14 10:49:06 -080021using ::testing::_;
Sebastian Jansson93b1ea22019-09-18 18:31:52 +020022using ::testing::AllOf;
23using ::testing::Field;
Rasmus Brandt681de202019-02-04 15:09:34 +010024using ::testing::NiceMock;
perkj71ee44c2016-06-15 00:47:53 -070025
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000026namespace webrtc {
27
Sebastian Jansson40de3cc2019-09-19 14:54:43 +020028namespace {
Sebastian Jansson93b1ea22019-09-18 18:31:52 +020029auto AllocationLimitsEq(uint32_t min_allocatable_rate_bps,
30 uint32_t max_padding_rate_bps,
31 uint32_t max_allocatable_rate_bps) {
32 return AllOf(Field(&BitrateAllocationLimits::min_allocatable_rate,
33 DataRate::bps(min_allocatable_rate_bps)),
34 Field(&BitrateAllocationLimits::max_allocatable_rate,
35 DataRate::bps(max_allocatable_rate_bps)),
36 Field(&BitrateAllocationLimits::max_padding_rate,
37 DataRate::bps(max_padding_rate_bps)));
38}
39
40auto AllocationLimitsEq(uint32_t min_allocatable_rate_bps,
41 uint32_t max_padding_rate_bps) {
42 return AllOf(Field(&BitrateAllocationLimits::min_allocatable_rate,
43 DataRate::bps(min_allocatable_rate_bps)),
44 Field(&BitrateAllocationLimits::max_padding_rate,
45 DataRate::bps(max_padding_rate_bps)));
46}
47
48class MockLimitObserver : public BitrateAllocator::LimitObserver {
perkj71ee44c2016-06-15 00:47:53 -070049 public:
Sebastian Jansson93b1ea22019-09-18 18:31:52 +020050 MOCK_METHOD1(OnAllocationLimitsChanged, void(BitrateAllocationLimits));
perkj71ee44c2016-06-15 00:47:53 -070051};
52
mflodman86aabb22016-03-11 15:44:32 +010053class TestBitrateObserver : public BitrateAllocatorObserver {
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000054 public:
55 TestBitrateObserver()
mflodman48a4beb2016-07-01 13:03:59 +020056 : last_bitrate_bps_(0),
57 last_fraction_loss_(0),
58 last_rtt_ms_(0),
minyue78b4d562016-11-30 04:47:39 -080059 last_probing_interval_ms_(0),
mflodman48a4beb2016-07-01 13:03:59 +020060 protection_ratio_(0.0) {}
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000061
mflodman48a4beb2016-07-01 13:03:59 +020062 void SetBitrateProtectionRatio(double protection_ratio) {
63 protection_ratio_ = protection_ratio;
64 }
65
Sebastian Janssonc0e4d452018-10-25 15:08:32 +020066 uint32_t OnBitrateUpdated(BitrateAllocationUpdate update) override {
Sebastian Jansson13e59032018-11-21 19:13:07 +010067 last_bitrate_bps_ = update.target_bitrate.bps();
68 last_fraction_loss_ =
69 rtc::dchecked_cast<uint8_t>(update.packet_loss_ratio * 256);
70 last_rtt_ms_ = update.round_trip_time.ms();
71 last_probing_interval_ms_ = update.bwe_period.ms();
72 return update.target_bitrate.bps() * protection_ratio_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000073 }
mflodman101f2502016-06-09 17:21:19 +020074 uint32_t last_bitrate_bps_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000075 uint8_t last_fraction_loss_;
mflodman101f2502016-06-09 17:21:19 +020076 int64_t last_rtt_ms_;
minyue78b4d562016-11-30 04:47:39 -080077 int last_probing_interval_ms_;
mflodman48a4beb2016-07-01 13:03:59 +020078 double protection_ratio_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000079};
80
minyue78b4d562016-11-30 04:47:39 -080081constexpr int64_t kDefaultProbingIntervalMs = 3000;
Seth Hampson24722b32017-12-22 09:36:42 -080082const double kDefaultBitratePriority = 1.0;
Sebastian Jansson40de3cc2019-09-19 14:54:43 +020083
84TargetTransferRate CreateTargetRateMessage(uint32_t target_bitrate_bps,
85 uint8_t fraction_loss,
86 int64_t rtt_ms,
87 int64_t bwe_period_ms) {
88 TargetTransferRate msg;
89 // The timestamp is just for log output, keeping it fixed just means fewer log
90 // messages in the test.
91 msg.at_time = Timestamp::seconds(10000);
92 msg.target_rate = DataRate::bps(target_bitrate_bps);
93 msg.stable_target_rate = msg.target_rate;
94 msg.network_estimate.bandwidth = msg.target_rate;
95 msg.network_estimate.loss_rate_ratio = fraction_loss / 255.0;
96 msg.network_estimate.round_trip_time = TimeDelta::ms(rtt_ms);
97 msg.network_estimate.bwe_period = TimeDelta::ms(bwe_period_ms);
98 return msg;
99}
Yves Gerey665174f2018-06-19 15:03:05 +0200100} // namespace
minyue78b4d562016-11-30 04:47:39 -0800101
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000102class BitrateAllocatorTest : public ::testing::Test {
103 protected:
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200104 BitrateAllocatorTest() : allocator_(new BitrateAllocator(&limit_observer_)) {
105 allocator_->OnNetworkEstimateChanged(
106 CreateTargetRateMessage(300000u, 0, 0, kDefaultProbingIntervalMs));
Stefan Holmere5904162015-03-26 11:11:06 +0100107 }
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000108 ~BitrateAllocatorTest() {}
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200109 void AddObserver(BitrateAllocatorObserver* observer,
110 uint32_t min_bitrate_bps,
111 uint32_t max_bitrate_bps,
112 uint32_t pad_up_bitrate_bps,
113 bool enforce_min_bitrate,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200114 double bitrate_priority) {
115 allocator_->AddObserver(
Jonas Olsson0182a032019-07-09 12:31:20 +0200116 observer,
117 {min_bitrate_bps, max_bitrate_bps, pad_up_bitrate_bps,
118 /* priority_bitrate */ 0, enforce_min_bitrate, bitrate_priority});
Sebastian Jansson464a5572019-02-12 13:32:32 +0100119 }
120 MediaStreamAllocationConfig DefaultConfig() const {
121 MediaStreamAllocationConfig default_config;
122 default_config.min_bitrate_bps = 0;
123 default_config.max_bitrate_bps = 1500000;
124 default_config.pad_up_bitrate_bps = 0;
125 default_config.priority_bitrate_bps = 0;
126 default_config.enforce_min_bitrate = true;
Sebastian Jansson464a5572019-02-12 13:32:32 +0100127 default_config.bitrate_priority = kDefaultBitratePriority;
128 return default_config;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200129 }
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000130
perkj71ee44c2016-06-15 00:47:53 -0700131 NiceMock<MockLimitObserver> limit_observer_;
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200132 std::unique_ptr<BitrateAllocator> allocator_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000133};
134
Sebastian Jansson464a5572019-02-12 13:32:32 +0100135TEST_F(BitrateAllocatorTest, RespectsPriorityBitrate) {
136 TestBitrateObserver stream_a;
137 auto config_a = DefaultConfig();
138 config_a.min_bitrate_bps = 100000;
139 config_a.priority_bitrate_bps = 0;
140 allocator_->AddObserver(&stream_a, config_a);
141
142 TestBitrateObserver stream_b;
143 auto config_b = DefaultConfig();
144 config_b.min_bitrate_bps = 100000;
145 config_b.max_bitrate_bps = 300000;
146 config_b.priority_bitrate_bps = 300000;
147 allocator_->AddObserver(&stream_b, config_b);
148
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200149 allocator_->OnNetworkEstimateChanged(
150 CreateTargetRateMessage(100000, 0, 0, 0));
Sebastian Jansson464a5572019-02-12 13:32:32 +0100151 EXPECT_EQ(stream_a.last_bitrate_bps_, 100000u);
152 EXPECT_EQ(stream_b.last_bitrate_bps_, 100000u);
153
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200154 allocator_->OnNetworkEstimateChanged(
155 CreateTargetRateMessage(200000, 0, 0, 0));
Sebastian Jansson464a5572019-02-12 13:32:32 +0100156 EXPECT_EQ(stream_a.last_bitrate_bps_, 100000u);
157 EXPECT_EQ(stream_b.last_bitrate_bps_, 100000u);
158
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200159 allocator_->OnNetworkEstimateChanged(
160 CreateTargetRateMessage(300000, 0, 0, 0));
Sebastian Jansson464a5572019-02-12 13:32:32 +0100161 EXPECT_EQ(stream_a.last_bitrate_bps_, 100000u);
162 EXPECT_EQ(stream_b.last_bitrate_bps_, 200000u);
163
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200164 allocator_->OnNetworkEstimateChanged(
165 CreateTargetRateMessage(400000, 0, 0, 0));
Sebastian Jansson464a5572019-02-12 13:32:32 +0100166 EXPECT_EQ(stream_a.last_bitrate_bps_, 100000u);
167 EXPECT_EQ(stream_b.last_bitrate_bps_, 300000u);
168
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200169 allocator_->OnNetworkEstimateChanged(
170 CreateTargetRateMessage(800000, 0, 0, 0));
Sebastian Jansson464a5572019-02-12 13:32:32 +0100171 EXPECT_EQ(stream_a.last_bitrate_bps_, 500000u);
172 EXPECT_EQ(stream_b.last_bitrate_bps_, 300000u);
173}
174
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000175TEST_F(BitrateAllocatorTest, UpdatingBitrateObserver) {
176 TestBitrateObserver bitrate_observer;
perkj71ee44c2016-06-15 00:47:53 -0700177 const uint32_t kMinSendBitrateBps = 100000;
178 const uint32_t kPadUpToBitrateBps = 50000;
philipelf69e7682018-02-28 13:06:28 +0100179 const uint32_t kMaxBitrateBps = 1500000;
perkj71ee44c2016-06-15 00:47:53 -0700180
philipelf69e7682018-02-28 13:06:28 +0100181 EXPECT_CALL(limit_observer_,
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200182 OnAllocationLimitsChanged(AllocationLimitsEq(
183 kMinSendBitrateBps, kPadUpToBitrateBps, kMaxBitrateBps)));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200184 AddObserver(&bitrate_observer, kMinSendBitrateBps, kMaxBitrateBps,
Jonas Olsson0182a032019-07-09 12:31:20 +0200185 kPadUpToBitrateBps, true, kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700186 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer));
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200187 allocator_->OnNetworkEstimateChanged(
188 CreateTargetRateMessage(200000, 0, 0, kDefaultProbingIntervalMs));
perkj57c21f92016-06-17 07:27:16 -0700189 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000190
Peter Boström8e4e8b02015-09-15 15:08:03 +0200191 // TODO(pbos): Expect capping to 1.5M instead of 3M when not boosting the max
mflodman0e7e2592015-11-12 21:02:42 -0800192 // bitrate for FEC/retransmissions (see todo in BitrateAllocator).
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200193 allocator_->OnNetworkEstimateChanged(
194 CreateTargetRateMessage(4000000, 0, 0, kDefaultProbingIntervalMs));
perkj57c21f92016-06-17 07:27:16 -0700195 EXPECT_EQ(3000000, allocator_->GetStartBitrate(&bitrate_observer));
perkj71ee44c2016-06-15 00:47:53 -0700196
197 // Expect |max_padding_bitrate_bps| to change to 0 if the observer is updated.
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200198 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(
199 AllocationLimitsEq(kMinSendBitrateBps, 0)));
Jonas Olsson0182a032019-07-09 12:31:20 +0200200 AddObserver(&bitrate_observer, kMinSendBitrateBps, 4000000, 0, true,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200201 kDefaultBitratePriority);
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200202 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(
203 AllocationLimitsEq(kMinSendBitrateBps, 0)));
perkj57c21f92016-06-17 07:27:16 -0700204 EXPECT_EQ(4000000, allocator_->GetStartBitrate(&bitrate_observer));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000205
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200206 AddObserver(&bitrate_observer, kMinSendBitrateBps, kMaxBitrateBps, 0, true,
Jonas Olsson0182a032019-07-09 12:31:20 +0200207 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700208 EXPECT_EQ(3000000, allocator_->GetStartBitrate(&bitrate_observer));
mflodman101f2502016-06-09 17:21:19 +0200209 EXPECT_EQ(3000000u, bitrate_observer.last_bitrate_bps_);
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200210 allocator_->OnNetworkEstimateChanged(
211 CreateTargetRateMessage(kMaxBitrateBps, 0, 0, kDefaultProbingIntervalMs));
mflodman101f2502016-06-09 17:21:19 +0200212 EXPECT_EQ(1500000u, bitrate_observer.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000213}
214
215TEST_F(BitrateAllocatorTest, TwoBitrateObserversOneRtcpObserver) {
216 TestBitrateObserver bitrate_observer_1;
217 TestBitrateObserver bitrate_observer_2;
philipelf69e7682018-02-28 13:06:28 +0100218 const uint32_t kObs1StartBitrateBps = 100000;
219 const uint32_t kObs2StartBitrateBps = 200000;
220 const uint32_t kObs1MaxBitrateBps = 300000;
221 const uint32_t kObs2MaxBitrateBps = 300000;
222
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200223 EXPECT_CALL(limit_observer_,
224 OnAllocationLimitsChanged(AllocationLimitsEq(
225 kObs1StartBitrateBps, 0, kObs1MaxBitrateBps)));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200226 AddObserver(&bitrate_observer_1, kObs1StartBitrateBps, kObs1MaxBitrateBps, 0,
Jonas Olsson0182a032019-07-09 12:31:20 +0200227 true, kDefaultBitratePriority);
philipelf69e7682018-02-28 13:06:28 +0100228 EXPECT_EQ(static_cast<int>(kObs1MaxBitrateBps),
229 allocator_->GetStartBitrate(&bitrate_observer_1));
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200230 EXPECT_CALL(limit_observer_,
231 OnAllocationLimitsChanged(AllocationLimitsEq(
232 kObs1StartBitrateBps + kObs2StartBitrateBps, 0,
233 kObs1MaxBitrateBps + kObs2MaxBitrateBps)));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200234 AddObserver(&bitrate_observer_2, kObs2StartBitrateBps, kObs2MaxBitrateBps, 0,
Jonas Olsson0182a032019-07-09 12:31:20 +0200235 true, kDefaultBitratePriority);
philipelf69e7682018-02-28 13:06:28 +0100236 EXPECT_EQ(static_cast<int>(kObs2StartBitrateBps),
237 allocator_->GetStartBitrate(&bitrate_observer_2));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000238
mflodman48a4beb2016-07-01 13:03:59 +0200239 // Test too low start bitrate, hence lower than sum of min. Min bitrates
240 // will
241 // be allocated to all observers.
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200242 allocator_->OnNetworkEstimateChanged(CreateTargetRateMessage(
243 kObs2StartBitrateBps, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200244 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
245 EXPECT_EQ(0, bitrate_observer_1.last_fraction_loss_);
246 EXPECT_EQ(50, bitrate_observer_1.last_rtt_ms_);
247 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
248 EXPECT_EQ(0, bitrate_observer_2.last_fraction_loss_);
249 EXPECT_EQ(50, bitrate_observer_2.last_rtt_ms_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000250
mflodman48a4beb2016-07-01 13:03:59 +0200251 // Test a bitrate which should be distributed equally.
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200252 allocator_->OnNetworkEstimateChanged(
253 CreateTargetRateMessage(500000, 0, 50, kDefaultProbingIntervalMs));
philipelf69e7682018-02-28 13:06:28 +0100254 const uint32_t kBitrateToShare =
255 500000 - kObs2StartBitrateBps - kObs1StartBitrateBps;
mflodman48a4beb2016-07-01 13:03:59 +0200256 EXPECT_EQ(100000u + kBitrateToShare / 2,
257 bitrate_observer_1.last_bitrate_bps_);
258 EXPECT_EQ(200000u + kBitrateToShare / 2,
259 bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000260
mflodman48a4beb2016-07-01 13:03:59 +0200261 // Limited by 2x max bitrates since we leave room for FEC and
262 // retransmissions.
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200263 allocator_->OnNetworkEstimateChanged(
264 CreateTargetRateMessage(1500000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200265 EXPECT_EQ(600000u, bitrate_observer_1.last_bitrate_bps_);
266 EXPECT_EQ(600000u, bitrate_observer_2.last_bitrate_bps_);
perkjec81bcd2016-05-11 06:01:13 -0700267
mflodman48a4beb2016-07-01 13:03:59 +0200268 // Verify that if the bandwidth estimate is set to zero, the allocated
269 // rate is
270 // zero.
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200271 allocator_->OnNetworkEstimateChanged(
272 CreateTargetRateMessage(0, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200273 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
274 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000275}
276
perkj71ee44c2016-06-15 00:47:53 -0700277TEST_F(BitrateAllocatorTest, RemoveObserverTriggersLimitObserver) {
278 TestBitrateObserver bitrate_observer;
279 const uint32_t kMinSendBitrateBps = 100000;
280 const uint32_t kPadUpToBitrateBps = 50000;
philipelf69e7682018-02-28 13:06:28 +0100281 const uint32_t kMaxBitrateBps = 1500000;
perkj71ee44c2016-06-15 00:47:53 -0700282
philipelf69e7682018-02-28 13:06:28 +0100283 EXPECT_CALL(limit_observer_,
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200284 OnAllocationLimitsChanged(AllocationLimitsEq(
285 kMinSendBitrateBps, kPadUpToBitrateBps, kMaxBitrateBps)));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200286 AddObserver(&bitrate_observer, kMinSendBitrateBps, kMaxBitrateBps,
Jonas Olsson0182a032019-07-09 12:31:20 +0200287 kPadUpToBitrateBps, true, kDefaultBitratePriority);
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200288 EXPECT_CALL(limit_observer_,
289 OnAllocationLimitsChanged(AllocationLimitsEq(0, 0)));
perkj71ee44c2016-06-15 00:47:53 -0700290 allocator_->RemoveObserver(&bitrate_observer);
291}
292
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000293class BitrateAllocatorTestNoEnforceMin : public ::testing::Test {
294 protected:
perkj71ee44c2016-06-15 00:47:53 -0700295 BitrateAllocatorTestNoEnforceMin()
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200296 : allocator_(new BitrateAllocator(&limit_observer_)) {
297 allocator_->OnNetworkEstimateChanged(
298 CreateTargetRateMessage(300000u, 0, 0, kDefaultProbingIntervalMs));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000299 }
300 ~BitrateAllocatorTestNoEnforceMin() {}
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200301 void AddObserver(BitrateAllocatorObserver* observer,
302 uint32_t min_bitrate_bps,
303 uint32_t max_bitrate_bps,
304 uint32_t pad_up_bitrate_bps,
305 bool enforce_min_bitrate,
306 std::string track_id,
307 double bitrate_priority) {
308 allocator_->AddObserver(
Sebastian Jansson464a5572019-02-12 13:32:32 +0100309 observer, {min_bitrate_bps, max_bitrate_bps, pad_up_bitrate_bps, 0,
Jonas Olsson0182a032019-07-09 12:31:20 +0200310 enforce_min_bitrate, bitrate_priority});
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200311 }
perkj71ee44c2016-06-15 00:47:53 -0700312 NiceMock<MockLimitObserver> limit_observer_;
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200313 std::unique_ptr<BitrateAllocator> allocator_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000314};
315
mflodman101f2502016-06-09 17:21:19 +0200316// The following three tests verify enforcing a minimum bitrate works as
317// intended.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000318TEST_F(BitrateAllocatorTestNoEnforceMin, OneBitrateObserver) {
319 TestBitrateObserver bitrate_observer_1;
perkj71ee44c2016-06-15 00:47:53 -0700320 // Expect OnAllocationLimitsChanged with |min_send_bitrate_bps| = 0 since
321 // AddObserver is called with |enforce_min_bitrate| = false.
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200322 EXPECT_CALL(limit_observer_,
323 OnAllocationLimitsChanged(AllocationLimitsEq(0, 0)));
324 EXPECT_CALL(limit_observer_,
325 OnAllocationLimitsChanged(AllocationLimitsEq(0, 120000)));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200326 AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "",
327 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200328 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000329
mflodman48a4beb2016-07-01 13:03:59 +0200330 // High BWE.
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200331 allocator_->OnNetworkEstimateChanged(
332 CreateTargetRateMessage(150000, 0, 0, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200333 EXPECT_EQ(150000u, bitrate_observer_1.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000334
mflodman48a4beb2016-07-01 13:03:59 +0200335 // Low BWE.
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200336 allocator_->OnNetworkEstimateChanged(
337 CreateTargetRateMessage(10000, 0, 0, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200338 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000339
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200340 EXPECT_CALL(limit_observer_,
341 OnAllocationLimitsChanged(AllocationLimitsEq(0, 0)));
mflodman48a4beb2016-07-01 13:03:59 +0200342 allocator_->RemoveObserver(&bitrate_observer_1);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000343}
344
345TEST_F(BitrateAllocatorTestNoEnforceMin, ThreeBitrateObservers) {
346 TestBitrateObserver bitrate_observer_1;
347 TestBitrateObserver bitrate_observer_2;
348 TestBitrateObserver bitrate_observer_3;
349 // Set up the observers with min bitrates at 100000, 200000, and 300000.
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200350 AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "",
351 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700352 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
Stefan Holmere5904162015-03-26 11:11:06 +0100353
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200354 AddObserver(&bitrate_observer_2, 200000, 400000, 0, false, "",
355 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700356 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200357 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
Stefan Holmere5904162015-03-26 11:11:06 +0100358
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200359 AddObserver(&bitrate_observer_3, 300000, 400000, 0, false, "",
360 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700361 EXPECT_EQ(0, allocator_->GetStartBitrate(&bitrate_observer_3));
mflodman101f2502016-06-09 17:21:19 +0200362 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
363 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000364
mflodman101f2502016-06-09 17:21:19 +0200365 // High BWE. Make sure the controllers get a fair share of the surplus (i.e.,
366 // what is left after each controller gets its min rate).
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200367 allocator_->OnNetworkEstimateChanged(
368 CreateTargetRateMessage(690000, 0, 0, kDefaultProbingIntervalMs));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000369 // Verify that each observer gets its min rate (sum of min rates is 600000),
370 // and that the remaining 90000 is divided equally among the three.
Stefan Holmere5904162015-03-26 11:11:06 +0100371 uint32_t bitrate_to_share = 690000u - 100000u - 200000u - 300000u;
mflodman101f2502016-06-09 17:21:19 +0200372 EXPECT_EQ(100000u + bitrate_to_share / 3,
373 bitrate_observer_1.last_bitrate_bps_);
374 EXPECT_EQ(200000u + bitrate_to_share / 3,
375 bitrate_observer_2.last_bitrate_bps_);
376 EXPECT_EQ(300000u + bitrate_to_share / 3,
377 bitrate_observer_3.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000378
mflodman101f2502016-06-09 17:21:19 +0200379 // BWE below the sum of observer's min bitrate.
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200380 allocator_->OnNetworkEstimateChanged(
381 CreateTargetRateMessage(300000, 0, 0, kDefaultProbingIntervalMs));
mflodman101f2502016-06-09 17:21:19 +0200382 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_); // Min bitrate.
383 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_); // Min bitrate.
Yves Gerey665174f2018-06-19 15:03:05 +0200384 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_); // Nothing.
mflodman101f2502016-06-09 17:21:19 +0200385
386 // Increased BWE, but still below the sum of configured min bitrates for all
387 // observers and too little for observer 3. 1 and 2 will share the rest.
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200388 allocator_->OnNetworkEstimateChanged(
389 CreateTargetRateMessage(500000, 0, 0, kDefaultProbingIntervalMs));
mflodman101f2502016-06-09 17:21:19 +0200390 EXPECT_EQ(200000u, bitrate_observer_1.last_bitrate_bps_); // Min + split.
391 EXPECT_EQ(300000u, bitrate_observer_2.last_bitrate_bps_); // Min + split.
Yves Gerey665174f2018-06-19 15:03:05 +0200392 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_); // Nothing.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000393
mflodman101f2502016-06-09 17:21:19 +0200394 // Below min for all.
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200395 allocator_->OnNetworkEstimateChanged(
396 CreateTargetRateMessage(10000, 0, 0, kDefaultProbingIntervalMs));
mflodman101f2502016-06-09 17:21:19 +0200397 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
398 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
399 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000400
perkjec81bcd2016-05-11 06:01:13 -0700401 // Verify that zero estimated bandwidth, means that that all gets zero,
402 // regardless of set min bitrate.
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200403 allocator_->OnNetworkEstimateChanged(
404 CreateTargetRateMessage(0, 0, 0, kDefaultProbingIntervalMs));
mflodman101f2502016-06-09 17:21:19 +0200405 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
406 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
407 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_);
perkjec81bcd2016-05-11 06:01:13 -0700408
mflodman86aabb22016-03-11 15:44:32 +0100409 allocator_->RemoveObserver(&bitrate_observer_1);
410 allocator_->RemoveObserver(&bitrate_observer_2);
411 allocator_->RemoveObserver(&bitrate_observer_3);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000412}
413
mflodman48a4beb2016-07-01 13:03:59 +0200414TEST_F(BitrateAllocatorTestNoEnforceMin, OneBitrateObserverWithPacketLoss) {
Erik Språngd1d7b232018-12-06 17:31:25 +0100415 const uint32_t kMinBitrateBps = 100000;
416 const uint32_t kMaxBitrateBps = 400000;
417 // Hysteresis adds another 10% or 20kbps to min bitrate.
418 const uint32_t kMinStartBitrateBps =
419 kMinBitrateBps + std::max(20000u, kMinBitrateBps / 10);
420
mflodman48a4beb2016-07-01 13:03:59 +0200421 // Expect OnAllocationLimitsChanged with |min_send_bitrate_bps| = 0 since
422 // AddObserver is called with |enforce_min_bitrate| = false.
Erik Språngd1d7b232018-12-06 17:31:25 +0100423 TestBitrateObserver bitrate_observer;
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200424 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(
425 AllocationLimitsEq(0, 0, kMaxBitrateBps)));
Erik Språngd1d7b232018-12-06 17:31:25 +0100426 AddObserver(&bitrate_observer, kMinBitrateBps, kMaxBitrateBps, 0, false, "",
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200427 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200428 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer));
429
430 // High BWE.
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200431 allocator_->OnNetworkEstimateChanged(
432 CreateTargetRateMessage(150000, 0, 0, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200433 EXPECT_EQ(150000u, bitrate_observer.last_bitrate_bps_);
434
435 // Add loss and use a part of the bitrate for protection.
Erik Språngd1d7b232018-12-06 17:31:25 +0100436 const double kProtectionRatio = 0.4;
Rasmus Brandt681de202019-02-04 15:09:34 +0100437 const uint8_t fraction_loss = kProtectionRatio * 256;
Erik Språngd1d7b232018-12-06 17:31:25 +0100438 bitrate_observer.SetBitrateProtectionRatio(kProtectionRatio);
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200439 allocator_->OnNetworkEstimateChanged(CreateTargetRateMessage(
440 200000, 0, fraction_loss, kDefaultProbingIntervalMs));
Rasmus Brandt681de202019-02-04 15:09:34 +0100441 EXPECT_EQ(200000u, bitrate_observer.last_bitrate_bps_);
mflodman48a4beb2016-07-01 13:03:59 +0200442
443 // Above the min threshold, but not enough given the protection used.
Erik Språngd1d7b232018-12-06 17:31:25 +0100444 // Limits changed, as we will video is now off and we need to pad up to the
445 // start bitrate.
Erik Språngd1d7b232018-12-06 17:31:25 +0100446 // Verify the hysteresis is added for the protection.
447 const uint32_t kMinStartBitrateWithProtectionBps =
448 static_cast<uint32_t>(kMinStartBitrateBps * (1 + kProtectionRatio));
449 EXPECT_CALL(limit_observer_,
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200450 OnAllocationLimitsChanged(AllocationLimitsEq(
451 0, kMinStartBitrateWithProtectionBps, kMaxBitrateBps)));
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200452 allocator_->OnNetworkEstimateChanged(CreateTargetRateMessage(
453 kMinStartBitrateBps + 1000, 0, fraction_loss, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200454 EXPECT_EQ(0u, bitrate_observer.last_bitrate_bps_);
455
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200456 allocator_->OnNetworkEstimateChanged(
457 CreateTargetRateMessage(kMinStartBitrateWithProtectionBps - 1000, 0,
458 fraction_loss, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200459 EXPECT_EQ(0u, bitrate_observer.last_bitrate_bps_);
460
461 // Just enough to enable video again.
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200462 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(
463 AllocationLimitsEq(0, 0, kMaxBitrateBps)));
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200464 allocator_->OnNetworkEstimateChanged(
465 CreateTargetRateMessage(kMinStartBitrateWithProtectionBps, 0,
466 fraction_loss, kDefaultProbingIntervalMs));
Erik Språngd1d7b232018-12-06 17:31:25 +0100467 EXPECT_EQ(kMinStartBitrateWithProtectionBps,
468 bitrate_observer.last_bitrate_bps_);
mflodman48a4beb2016-07-01 13:03:59 +0200469
470 // Remove all protection and make sure video is not paused as earlier.
471 bitrate_observer.SetBitrateProtectionRatio(0.0);
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200472 allocator_->OnNetworkEstimateChanged(
473 CreateTargetRateMessage(kMinStartBitrateWithProtectionBps - 1000, 0, 0,
474 kDefaultProbingIntervalMs));
Erik Språngd1d7b232018-12-06 17:31:25 +0100475 EXPECT_EQ(kMinStartBitrateWithProtectionBps - 1000,
476 bitrate_observer.last_bitrate_bps_);
mflodman48a4beb2016-07-01 13:03:59 +0200477
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200478 allocator_->OnNetworkEstimateChanged(CreateTargetRateMessage(
479 kMinStartBitrateBps, 0, 0, kDefaultProbingIntervalMs));
Erik Språngd1d7b232018-12-06 17:31:25 +0100480 EXPECT_EQ(kMinStartBitrateBps, bitrate_observer.last_bitrate_bps_);
mflodman48a4beb2016-07-01 13:03:59 +0200481
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200482 EXPECT_CALL(limit_observer_,
483 OnAllocationLimitsChanged(AllocationLimitsEq(0, 0, 0)));
mflodman48a4beb2016-07-01 13:03:59 +0200484 allocator_->RemoveObserver(&bitrate_observer);
485}
486
Rasmus Brandt681de202019-02-04 15:09:34 +0100487TEST_F(BitrateAllocatorTest,
488 TotalAllocationLimitsAreUnaffectedByProtectionRatio) {
489 TestBitrateObserver bitrate_observer;
490
491 const uint32_t kMinBitrateBps = 100000;
492 const uint32_t kMaxBitrateBps = 400000;
493
494 // Register |bitrate_observer| and expect total allocation limits to change.
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200495 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(AllocationLimitsEq(
496 kMinBitrateBps, 0, kMaxBitrateBps)))
Rasmus Brandt681de202019-02-04 15:09:34 +0100497 .Times(1);
Sebastian Jansson464a5572019-02-12 13:32:32 +0100498 MediaStreamAllocationConfig allocation_config = DefaultConfig();
499 allocation_config.min_bitrate_bps = kMinBitrateBps;
500 allocation_config.max_bitrate_bps = kMaxBitrateBps;
501 allocator_->AddObserver(&bitrate_observer, allocation_config);
Rasmus Brandt681de202019-02-04 15:09:34 +0100502
503 // Observer uses 20% of it's allocated bitrate for protection.
504 bitrate_observer.SetBitrateProtectionRatio(/*protection_ratio=*/0.2);
505 // Total allocation limits are unaffected by the protection rate change.
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200506 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(_)).Times(0);
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200507 allocator_->OnNetworkEstimateChanged(
508 CreateTargetRateMessage(200000u, 0, 100, kDefaultProbingIntervalMs));
Rasmus Brandt681de202019-02-04 15:09:34 +0100509
510 // Observer uses 0% of it's allocated bitrate for protection.
511 bitrate_observer.SetBitrateProtectionRatio(/*protection_ratio=*/0.0);
512 // Total allocation limits are unaffected by the protection rate change.
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200513 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(_)).Times(0);
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200514 allocator_->OnNetworkEstimateChanged(
515 CreateTargetRateMessage(200000u, 0, 100, kDefaultProbingIntervalMs));
Rasmus Brandt681de202019-02-04 15:09:34 +0100516
517 // Observer again uses 20% of it's allocated bitrate for protection.
518 bitrate_observer.SetBitrateProtectionRatio(/*protection_ratio=*/0.2);
519 // Total allocation limits are unaffected by the protection rate change.
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200520 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(_)).Times(0);
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200521 allocator_->OnNetworkEstimateChanged(
522 CreateTargetRateMessage(200000u, 0, 100, kDefaultProbingIntervalMs));
Rasmus Brandt681de202019-02-04 15:09:34 +0100523}
524
mflodman48a4beb2016-07-01 13:03:59 +0200525TEST_F(BitrateAllocatorTestNoEnforceMin, TwoBitrateObserverWithPacketLoss) {
526 TestBitrateObserver bitrate_observer_1;
527 TestBitrateObserver bitrate_observer_2;
528
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200529 AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "",
530 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200531 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200532 AddObserver(&bitrate_observer_2, 200000, 400000, 0, false, "",
533 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200534 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
535 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
536
537 // Enough bitrate for both.
538 bitrate_observer_2.SetBitrateProtectionRatio(0.5);
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200539 allocator_->OnNetworkEstimateChanged(
540 CreateTargetRateMessage(300000, 0, 0, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200541 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
542 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
543
544 // Above min for observer 2, but too little given the protection used.
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200545 allocator_->OnNetworkEstimateChanged(
546 CreateTargetRateMessage(330000, 0, 0, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200547 EXPECT_EQ(330000u, bitrate_observer_1.last_bitrate_bps_);
548 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
549
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200550 allocator_->OnNetworkEstimateChanged(
551 CreateTargetRateMessage(100000, 0, 0, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200552 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
553 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
554
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200555 allocator_->OnNetworkEstimateChanged(
556 CreateTargetRateMessage(99999, 0, 0, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200557 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
558 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
559
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200560 allocator_->OnNetworkEstimateChanged(
561 CreateTargetRateMessage(119000, 0, 0, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200562 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
563 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
564
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200565 allocator_->OnNetworkEstimateChanged(
566 CreateTargetRateMessage(120000, 0, 0, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200567 EXPECT_EQ(120000u, bitrate_observer_1.last_bitrate_bps_);
568 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
569
570 // Verify the protection is accounted for before resuming observer 2.
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200571 allocator_->OnNetworkEstimateChanged(
572 CreateTargetRateMessage(429000, 0, 0, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200573 EXPECT_EQ(400000u, bitrate_observer_1.last_bitrate_bps_);
574 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
575
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200576 allocator_->OnNetworkEstimateChanged(
577 CreateTargetRateMessage(430000, 0, 0, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200578 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
579 EXPECT_EQ(330000u, bitrate_observer_2.last_bitrate_bps_);
580
581 allocator_->RemoveObserver(&bitrate_observer_1);
582 allocator_->RemoveObserver(&bitrate_observer_2);
583}
584
mflodman101f2502016-06-09 17:21:19 +0200585TEST_F(BitrateAllocatorTest, ThreeBitrateObserversLowBweEnforceMin) {
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000586 TestBitrateObserver bitrate_observer_1;
587 TestBitrateObserver bitrate_observer_2;
588 TestBitrateObserver bitrate_observer_3;
Stefan Holmere5904162015-03-26 11:11:06 +0100589
Jonas Olsson0182a032019-07-09 12:31:20 +0200590 AddObserver(&bitrate_observer_1, 100000, 400000, 0, true,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200591 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700592 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
593
Jonas Olsson0182a032019-07-09 12:31:20 +0200594 AddObserver(&bitrate_observer_2, 200000, 400000, 0, true,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200595 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700596 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200597 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
Stefan Holmere5904162015-03-26 11:11:06 +0100598
Jonas Olsson0182a032019-07-09 12:31:20 +0200599 AddObserver(&bitrate_observer_3, 300000, 400000, 0, true,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200600 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200601 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_3));
602 EXPECT_EQ(100000, static_cast<int>(bitrate_observer_1.last_bitrate_bps_));
603 EXPECT_EQ(200000, static_cast<int>(bitrate_observer_2.last_bitrate_bps_));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000604
mflodman48a4beb2016-07-01 13:03:59 +0200605 // Low BWE. Verify that all observers still get their respective min
606 // bitrate.
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200607 allocator_->OnNetworkEstimateChanged(
608 CreateTargetRateMessage(1000, 0, 0, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200609 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_); // Min cap.
610 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_); // Min cap.
611 EXPECT_EQ(300000u, bitrate_observer_3.last_bitrate_bps_); // Min cap.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000612
mflodman48a4beb2016-07-01 13:03:59 +0200613 allocator_->RemoveObserver(&bitrate_observer_1);
614 allocator_->RemoveObserver(&bitrate_observer_2);
615 allocator_->RemoveObserver(&bitrate_observer_3);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000616}
perkjfea93092016-05-14 00:58:48 -0700617
618TEST_F(BitrateAllocatorTest, AddObserverWhileNetworkDown) {
619 TestBitrateObserver bitrate_observer_1;
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200620 EXPECT_CALL(limit_observer_,
621 OnAllocationLimitsChanged(AllocationLimitsEq(50000, 0)));
perkj57c21f92016-06-17 07:27:16 -0700622
Jonas Olsson0182a032019-07-09 12:31:20 +0200623 AddObserver(&bitrate_observer_1, 50000, 400000, 0, true,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200624 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700625 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
perkjfea93092016-05-14 00:58:48 -0700626
627 // Set network down, ie, no available bitrate.
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200628 allocator_->OnNetworkEstimateChanged(
629 CreateTargetRateMessage(0, 0, 0, kDefaultProbingIntervalMs));
perkjfea93092016-05-14 00:58:48 -0700630
mflodman101f2502016-06-09 17:21:19 +0200631 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
perkjfea93092016-05-14 00:58:48 -0700632
633 TestBitrateObserver bitrate_observer_2;
perkj71ee44c2016-06-15 00:47:53 -0700634 // Adding an observer while the network is down should not affect the limits.
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200635 EXPECT_CALL(limit_observer_,
636 OnAllocationLimitsChanged(AllocationLimitsEq(50000 + 50000, 0)));
Jonas Olsson0182a032019-07-09 12:31:20 +0200637 AddObserver(&bitrate_observer_2, 50000, 400000, 0, true,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200638 kDefaultBitratePriority);
perkjfea93092016-05-14 00:58:48 -0700639
640 // Expect the start_bitrate to be set as if the network was still up but that
641 // the new observer have been notified that the network is down.
perkj57c21f92016-06-17 07:27:16 -0700642 EXPECT_EQ(300000 / 2, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200643 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
644 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
perkjfea93092016-05-14 00:58:48 -0700645
646 // Set network back up.
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200647 allocator_->OnNetworkEstimateChanged(
648 CreateTargetRateMessage(1500000, 0, 50, kDefaultProbingIntervalMs));
mflodman101f2502016-06-09 17:21:19 +0200649 EXPECT_EQ(750000u, bitrate_observer_1.last_bitrate_bps_);
650 EXPECT_EQ(750000u, bitrate_observer_2.last_bitrate_bps_);
651}
652
653TEST_F(BitrateAllocatorTest, MixedEnforecedConfigs) {
654 TestBitrateObserver enforced_observer;
Jonas Olsson0182a032019-07-09 12:31:20 +0200655 AddObserver(&enforced_observer, 6000, 30000, 0, true,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200656 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200657 EXPECT_EQ(60000, allocator_->GetStartBitrate(&enforced_observer));
mflodman101f2502016-06-09 17:21:19 +0200658
mflodman48a4beb2016-07-01 13:03:59 +0200659 TestBitrateObserver not_enforced_observer;
Jonas Olsson0182a032019-07-09 12:31:20 +0200660 AddObserver(&not_enforced_observer, 30000, 2500000, 0, false,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200661 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200662 EXPECT_EQ(270000, allocator_->GetStartBitrate(&not_enforced_observer));
663 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200664
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200665 allocator_->OnNetworkEstimateChanged(
666 CreateTargetRateMessage(36000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200667 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
668 EXPECT_EQ(30000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200669
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200670 allocator_->OnNetworkEstimateChanged(
671 CreateTargetRateMessage(35000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200672 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
673 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200674
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200675 allocator_->OnNetworkEstimateChanged(
676 CreateTargetRateMessage(5000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200677 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
678 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200679
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200680 allocator_->OnNetworkEstimateChanged(
681 CreateTargetRateMessage(36000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200682 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
683 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200684
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200685 allocator_->OnNetworkEstimateChanged(
686 CreateTargetRateMessage(55000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200687 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
688 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200689
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200690 allocator_->OnNetworkEstimateChanged(
691 CreateTargetRateMessage(56000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200692 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
693 EXPECT_EQ(50000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200694
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200695 allocator_->OnNetworkEstimateChanged(
696 CreateTargetRateMessage(56000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200697 EXPECT_EQ(16000u, enforced_observer.last_bitrate_bps_);
698 EXPECT_EQ(40000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200699
mflodman48a4beb2016-07-01 13:03:59 +0200700 allocator_->RemoveObserver(&enforced_observer);
701 allocator_->RemoveObserver(&not_enforced_observer);
mflodman101f2502016-06-09 17:21:19 +0200702}
703
704TEST_F(BitrateAllocatorTest, AvoidToggleAbsolute) {
705 TestBitrateObserver observer;
Jonas Olsson0182a032019-07-09 12:31:20 +0200706 AddObserver(&observer, 30000, 300000, 0, false, kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200707 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
mflodman101f2502016-06-09 17:21:19 +0200708
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200709 allocator_->OnNetworkEstimateChanged(
710 CreateTargetRateMessage(30000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200711 EXPECT_EQ(30000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200712
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200713 allocator_->OnNetworkEstimateChanged(
714 CreateTargetRateMessage(20000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200715 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200716
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200717 allocator_->OnNetworkEstimateChanged(
718 CreateTargetRateMessage(30000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200719 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200720
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200721 allocator_->OnNetworkEstimateChanged(
722 CreateTargetRateMessage(49000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200723 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200724
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200725 allocator_->OnNetworkEstimateChanged(
726 CreateTargetRateMessage(50000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200727 EXPECT_EQ(50000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200728
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200729 allocator_->OnNetworkEstimateChanged(
730 CreateTargetRateMessage(30000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200731 EXPECT_EQ(30000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200732
mflodman48a4beb2016-07-01 13:03:59 +0200733 allocator_->RemoveObserver(&observer);
mflodman101f2502016-06-09 17:21:19 +0200734}
735
736TEST_F(BitrateAllocatorTest, AvoidTogglePercent) {
737 TestBitrateObserver observer;
Jonas Olsson0182a032019-07-09 12:31:20 +0200738 AddObserver(&observer, 300000, 600000, 0, false, kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200739 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
mflodman101f2502016-06-09 17:21:19 +0200740
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200741 allocator_->OnNetworkEstimateChanged(
742 CreateTargetRateMessage(300000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200743 EXPECT_EQ(300000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200744
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200745 allocator_->OnNetworkEstimateChanged(
746 CreateTargetRateMessage(200000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200747 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200748
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200749 allocator_->OnNetworkEstimateChanged(
750 CreateTargetRateMessage(300000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200751 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200752
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200753 allocator_->OnNetworkEstimateChanged(
754 CreateTargetRateMessage(329000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200755 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200756
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200757 allocator_->OnNetworkEstimateChanged(
758 CreateTargetRateMessage(330000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200759 EXPECT_EQ(330000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200760
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200761 allocator_->OnNetworkEstimateChanged(
762 CreateTargetRateMessage(300000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200763 EXPECT_EQ(300000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200764
mflodman48a4beb2016-07-01 13:03:59 +0200765 allocator_->RemoveObserver(&observer);
perkjfea93092016-05-14 00:58:48 -0700766}
767
minyue78b4d562016-11-30 04:47:39 -0800768TEST_F(BitrateAllocatorTest, PassProbingInterval) {
769 TestBitrateObserver observer;
Jonas Olsson0182a032019-07-09 12:31:20 +0200770 AddObserver(&observer, 300000, 600000, 0, false, kDefaultBitratePriority);
minyue78b4d562016-11-30 04:47:39 -0800771 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
772
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200773 allocator_->OnNetworkEstimateChanged(
774 CreateTargetRateMessage(300000, 0, 50, 5000));
minyue78b4d562016-11-30 04:47:39 -0800775 EXPECT_EQ(5000, observer.last_probing_interval_ms_);
776
777 allocator_->RemoveObserver(&observer);
778}
779
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800780TEST_F(BitrateAllocatorTest, PriorityRateOneObserverBasic) {
781 TestBitrateObserver observer;
782 const uint32_t kMinSendBitrateBps = 10;
783 const uint32_t kMaxSendBitrateBps = 60;
784 const uint32_t kNetworkBandwidthBps = 30;
785
Jonas Olsson0182a032019-07-09 12:31:20 +0200786 AddObserver(&observer, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true, 2.0);
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200787 allocator_->OnNetworkEstimateChanged(CreateTargetRateMessage(
788 kNetworkBandwidthBps, 0, 0, kDefaultProbingIntervalMs));
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800789
790 EXPECT_EQ(kNetworkBandwidthBps, observer.last_bitrate_bps_);
791
792 allocator_->RemoveObserver(&observer);
793}
794
795// Tests that two observers with the same bitrate priority are allocated
796// their bitrate evenly.
797TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversBasic) {
798 TestBitrateObserver observer_low_1;
799 TestBitrateObserver observer_low_2;
800 const uint32_t kMinSendBitrateBps = 10;
801 const uint32_t kMaxSendBitrateBps = 60;
802 const uint32_t kNetworkBandwidthBps = 60;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200803 AddObserver(&observer_low_1, kMinSendBitrateBps, kMaxSendBitrateBps, 0, false,
Jonas Olsson0182a032019-07-09 12:31:20 +0200804 2.0);
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200805 AddObserver(&observer_low_2, kMinSendBitrateBps, kMaxSendBitrateBps, 0, false,
Jonas Olsson0182a032019-07-09 12:31:20 +0200806 2.0);
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200807 allocator_->OnNetworkEstimateChanged(CreateTargetRateMessage(
808 kNetworkBandwidthBps, 0, 0, kDefaultProbingIntervalMs));
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800809
810 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_1.last_bitrate_bps_);
811 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_2.last_bitrate_bps_);
812
813 allocator_->RemoveObserver(&observer_low_1);
814 allocator_->RemoveObserver(&observer_low_2);
815}
816
817// Tests that there is no difference in functionality when the min bitrate is
818// enforced.
819TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversBasicMinEnforced) {
820 TestBitrateObserver observer_low_1;
821 TestBitrateObserver observer_low_2;
822 const uint32_t kMinSendBitrateBps = 0;
823 const uint32_t kMaxSendBitrateBps = 60;
824 const uint32_t kNetworkBandwidthBps = 60;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200825 AddObserver(&observer_low_1, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
Jonas Olsson0182a032019-07-09 12:31:20 +0200826 2.0);
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200827 AddObserver(&observer_low_2, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
Jonas Olsson0182a032019-07-09 12:31:20 +0200828 2.0);
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200829 allocator_->OnNetworkEstimateChanged(CreateTargetRateMessage(
830 kNetworkBandwidthBps, 0, 0, kDefaultProbingIntervalMs));
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800831
832 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_1.last_bitrate_bps_);
833 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_2.last_bitrate_bps_);
834
835 allocator_->RemoveObserver(&observer_low_1);
836 allocator_->RemoveObserver(&observer_low_2);
837}
838
839// Tests that if the available bandwidth is the sum of the max bitrate
840// of all observers, they will be allocated their max.
841TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversBothAllocatedMax) {
842 TestBitrateObserver observer_low;
843 TestBitrateObserver observer_mid;
844 const uint32_t kMinSendBitrateBps = 0;
845 const uint32_t kMaxSendBitrateBps = 60;
846 const uint32_t kNetworkBandwidthBps = kMaxSendBitrateBps * 2;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200847 AddObserver(&observer_low, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
Jonas Olsson0182a032019-07-09 12:31:20 +0200848 2.0);
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200849 AddObserver(&observer_mid, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
Jonas Olsson0182a032019-07-09 12:31:20 +0200850 4.0);
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200851 allocator_->OnNetworkEstimateChanged(CreateTargetRateMessage(
852 kNetworkBandwidthBps, 0, 0, kDefaultProbingIntervalMs));
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800853
854 EXPECT_EQ(kMaxSendBitrateBps, observer_low.last_bitrate_bps_);
855 EXPECT_EQ(kMaxSendBitrateBps, observer_mid.last_bitrate_bps_);
856
857 allocator_->RemoveObserver(&observer_low);
858 allocator_->RemoveObserver(&observer_mid);
859}
860
861// Tests that after a higher bitrate priority observer has been allocated its
862// max bitrate the lower priority observer will then be allocated the remaining
863// bitrate.
864TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversOneAllocatedToMax) {
865 TestBitrateObserver observer_low;
866 TestBitrateObserver observer_mid;
Jonas Olsson0182a032019-07-09 12:31:20 +0200867 AddObserver(&observer_low, 10, 50, 0, false, 2.0);
868 AddObserver(&observer_mid, 10, 50, 0, false, 4.0);
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200869 allocator_->OnNetworkEstimateChanged(
870 CreateTargetRateMessage(90, 0, 0, kDefaultProbingIntervalMs));
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800871
872 EXPECT_EQ(40u, observer_low.last_bitrate_bps_);
873 EXPECT_EQ(50u, observer_mid.last_bitrate_bps_);
874
875 allocator_->RemoveObserver(&observer_low);
876 allocator_->RemoveObserver(&observer_mid);
877}
878
879// Tests that three observers with three different bitrate priorities will all
880// be allocated bitrate according to their relative bitrate priority.
881TEST_F(BitrateAllocatorTest,
882 PriorityRateThreeObserversAllocatedRelativeAmounts) {
883 TestBitrateObserver observer_low;
884 TestBitrateObserver observer_mid;
885 TestBitrateObserver observer_high;
886 const uint32_t kMaxBitrate = 100;
887 // Not enough bandwidth to fill any observer's max bitrate.
888 const uint32_t kNetworkBandwidthBps = 70;
889 const double kLowBitratePriority = 2.0;
890 const double kMidBitratePriority = 4.0;
891 const double kHighBitratePriority = 8.0;
892 const double kTotalBitratePriority =
893 kLowBitratePriority + kMidBitratePriority + kHighBitratePriority;
Jonas Olsson0182a032019-07-09 12:31:20 +0200894 AddObserver(&observer_low, 0, kMaxBitrate, 0, false, kLowBitratePriority);
895 AddObserver(&observer_mid, 0, kMaxBitrate, 0, false, kMidBitratePriority);
896 AddObserver(&observer_high, 0, kMaxBitrate, 0, false, kHighBitratePriority);
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200897 allocator_->OnNetworkEstimateChanged(CreateTargetRateMessage(
898 kNetworkBandwidthBps, 0, 0, kDefaultProbingIntervalMs));
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800899
900 const double kLowFractionAllocated =
901 kLowBitratePriority / kTotalBitratePriority;
902 const double kMidFractionAllocated =
903 kMidBitratePriority / kTotalBitratePriority;
904 const double kHighFractionAllocated =
905 kHighBitratePriority / kTotalBitratePriority;
906 EXPECT_EQ(kLowFractionAllocated * kNetworkBandwidthBps,
907 observer_low.last_bitrate_bps_);
908 EXPECT_EQ(kMidFractionAllocated * kNetworkBandwidthBps,
909 observer_mid.last_bitrate_bps_);
910 EXPECT_EQ(kHighFractionAllocated * kNetworkBandwidthBps,
911 observer_high.last_bitrate_bps_);
912
913 allocator_->RemoveObserver(&observer_low);
914 allocator_->RemoveObserver(&observer_mid);
915 allocator_->RemoveObserver(&observer_high);
916}
917
918// Tests that after the high priority observer has been allocated its maximum
919// bitrate, the other two observers are still allocated bitrate according to
920// their relative bitrate priority.
921TEST_F(BitrateAllocatorTest, PriorityRateThreeObserversHighAllocatedToMax) {
922 TestBitrateObserver observer_low;
923 const double kLowBitratePriority = 2.0;
924 TestBitrateObserver observer_mid;
925 const double kMidBitratePriority = 4.0;
926 TestBitrateObserver observer_high;
927 const double kHighBitratePriority = 8.0;
928
929 const uint32_t kAvailableBitrate = 90;
930 const uint32_t kMaxBitrate = 40;
931 const uint32_t kMinBitrate = 10;
932 // Remaining bitrate after allocating to all mins and knowing that the high
933 // priority observer will have its max bitrate allocated.
934 const uint32_t kRemainingBitrate =
935 kAvailableBitrate - kMaxBitrate - (2 * kMinBitrate);
936
Jonas Olsson0182a032019-07-09 12:31:20 +0200937 AddObserver(&observer_low, kMinBitrate, kMaxBitrate, 0, false,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200938 kLowBitratePriority);
Jonas Olsson0182a032019-07-09 12:31:20 +0200939 AddObserver(&observer_mid, kMinBitrate, kMaxBitrate, 0, false,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200940 kMidBitratePriority);
Jonas Olsson0182a032019-07-09 12:31:20 +0200941 AddObserver(&observer_high, kMinBitrate, kMaxBitrate, 0, false,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200942 kHighBitratePriority);
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200943 allocator_->OnNetworkEstimateChanged(CreateTargetRateMessage(
944 kAvailableBitrate, 0, 0, kDefaultProbingIntervalMs));
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800945
946 const double kLowFractionAllocated =
947 kLowBitratePriority / (kLowBitratePriority + kMidBitratePriority);
948 const double kMidFractionAllocated =
949 kMidBitratePriority / (kLowBitratePriority + kMidBitratePriority);
950 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kLowFractionAllocated),
951 observer_low.last_bitrate_bps_);
952 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kMidFractionAllocated),
953 observer_mid.last_bitrate_bps_);
954 EXPECT_EQ(40u, observer_high.last_bitrate_bps_);
955
956 allocator_->RemoveObserver(&observer_low);
957 allocator_->RemoveObserver(&observer_mid);
958 allocator_->RemoveObserver(&observer_high);
959}
960
961// Tests that after the low priority observer has been allocated its maximum
962// bitrate, the other two observers are still allocated bitrate according to
963// their relative bitrate priority.
964TEST_F(BitrateAllocatorTest, PriorityRateThreeObserversLowAllocatedToMax) {
965 TestBitrateObserver observer_low;
966 const double kLowBitratePriority = 2.0;
967 const uint32_t kLowMaxBitrate = 10;
968 TestBitrateObserver observer_mid;
969 const double kMidBitratePriority = 4.0;
970 TestBitrateObserver observer_high;
971 const double kHighBitratePriority = 8.0;
972
973 const uint32_t kMinBitrate = 0;
974 const uint32_t kMaxBitrate = 60;
975 const uint32_t kAvailableBitrate = 100;
976 // Remaining bitrate knowing that the low priority observer is allocated its
977 // max bitrate. We know this because it is allocated 2.0/14.0 (1/7) of the
978 // available bitrate, so 70 bps would be sufficient network bandwidth.
979 const uint32_t kRemainingBitrate = kAvailableBitrate - kLowMaxBitrate;
980
Jonas Olsson0182a032019-07-09 12:31:20 +0200981 AddObserver(&observer_low, kMinBitrate, kLowMaxBitrate, 0, false,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200982 kLowBitratePriority);
Jonas Olsson0182a032019-07-09 12:31:20 +0200983 AddObserver(&observer_mid, kMinBitrate, kMaxBitrate, 0, false,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200984 kMidBitratePriority);
Jonas Olsson0182a032019-07-09 12:31:20 +0200985 AddObserver(&observer_high, kMinBitrate, kMaxBitrate, 0, false,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200986 kHighBitratePriority);
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200987 allocator_->OnNetworkEstimateChanged(CreateTargetRateMessage(
988 kAvailableBitrate, 0, 0, kDefaultProbingIntervalMs));
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800989
990 const double kMidFractionAllocated =
991 kMidBitratePriority / (kMidBitratePriority + kHighBitratePriority);
992 const double kHighFractionAllocated =
993 kHighBitratePriority / (kMidBitratePriority + kHighBitratePriority);
994 EXPECT_EQ(kLowMaxBitrate, observer_low.last_bitrate_bps_);
995 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kMidFractionAllocated),
996 observer_mid.last_bitrate_bps_);
997 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kHighFractionAllocated),
998 observer_high.last_bitrate_bps_);
999
1000 allocator_->RemoveObserver(&observer_low);
1001 allocator_->RemoveObserver(&observer_mid);
1002 allocator_->RemoveObserver(&observer_high);
1003}
1004
1005// Tests that after two observers are allocated bitrate to their max, the
1006// the remaining observer is allocated what's left appropriately. This test
1007// handles an edge case where the medium and high observer reach their
1008// "relative" max allocation at the same time. The high has 40 to allocate
1009// above its min, and the mid has 20 to allocate above its min, which scaled
1010// by their bitrate priority is the same for each.
1011TEST_F(BitrateAllocatorTest, PriorityRateThreeObserversTwoAllocatedToMax) {
1012 TestBitrateObserver observer_low;
1013 TestBitrateObserver observer_mid;
1014 TestBitrateObserver observer_high;
Jonas Olsson0182a032019-07-09 12:31:20 +02001015 AddObserver(&observer_low, 10, 40, 0, false, 2.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -08001016 // Scaled allocation above the min allocation is the same for these two,
1017 // meaning they will get allocated their max at the same time.
1018 // Scaled (target allocation) = (max - min) / bitrate priority
Jonas Olsson0182a032019-07-09 12:31:20 +02001019 AddObserver(&observer_mid, 10, 30, 0, false, 4.0);
1020 AddObserver(&observer_high, 10, 50, 0, false, 8.0);
Sebastian Jansson40de3cc2019-09-19 14:54:43 +02001021 allocator_->OnNetworkEstimateChanged(
1022 CreateTargetRateMessage(110, 0, 0, kDefaultProbingIntervalMs));
Seth Hampsonfe73d6a2017-11-14 10:49:06 -08001023
1024 EXPECT_EQ(30u, observer_low.last_bitrate_bps_);
1025 EXPECT_EQ(30u, observer_mid.last_bitrate_bps_);
1026 EXPECT_EQ(50u, observer_high.last_bitrate_bps_);
1027
1028 allocator_->RemoveObserver(&observer_low);
1029 allocator_->RemoveObserver(&observer_mid);
1030 allocator_->RemoveObserver(&observer_high);
1031}
1032
stefan@webrtc.org792f1a12015-03-04 12:24:26 +00001033} // namespace webrtc