blob: 5cdbc38b9faba54ef80b9f44e2193bc09bde5d90 [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 Jansson93b1ea22019-09-18 18:31:52 +020028auto AllocationLimitsEq(uint32_t min_allocatable_rate_bps,
29 uint32_t max_padding_rate_bps,
30 uint32_t max_allocatable_rate_bps) {
31 return AllOf(Field(&BitrateAllocationLimits::min_allocatable_rate,
32 DataRate::bps(min_allocatable_rate_bps)),
33 Field(&BitrateAllocationLimits::max_allocatable_rate,
34 DataRate::bps(max_allocatable_rate_bps)),
35 Field(&BitrateAllocationLimits::max_padding_rate,
36 DataRate::bps(max_padding_rate_bps)));
37}
38
39auto AllocationLimitsEq(uint32_t min_allocatable_rate_bps,
40 uint32_t max_padding_rate_bps) {
41 return AllOf(Field(&BitrateAllocationLimits::min_allocatable_rate,
42 DataRate::bps(min_allocatable_rate_bps)),
43 Field(&BitrateAllocationLimits::max_padding_rate,
44 DataRate::bps(max_padding_rate_bps)));
45}
46
47class MockLimitObserver : public BitrateAllocator::LimitObserver {
perkj71ee44c2016-06-15 00:47:53 -070048 public:
Sebastian Jansson93b1ea22019-09-18 18:31:52 +020049 MOCK_METHOD1(OnAllocationLimitsChanged, void(BitrateAllocationLimits));
perkj71ee44c2016-06-15 00:47:53 -070050};
51
mflodman86aabb22016-03-11 15:44:32 +010052class TestBitrateObserver : public BitrateAllocatorObserver {
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000053 public:
54 TestBitrateObserver()
mflodman48a4beb2016-07-01 13:03:59 +020055 : last_bitrate_bps_(0),
56 last_fraction_loss_(0),
57 last_rtt_ms_(0),
minyue78b4d562016-11-30 04:47:39 -080058 last_probing_interval_ms_(0),
mflodman48a4beb2016-07-01 13:03:59 +020059 protection_ratio_(0.0) {}
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000060
mflodman48a4beb2016-07-01 13:03:59 +020061 void SetBitrateProtectionRatio(double protection_ratio) {
62 protection_ratio_ = protection_ratio;
63 }
64
Sebastian Janssonc0e4d452018-10-25 15:08:32 +020065 uint32_t OnBitrateUpdated(BitrateAllocationUpdate update) override {
Sebastian Jansson13e59032018-11-21 19:13:07 +010066 last_bitrate_bps_ = update.target_bitrate.bps();
67 last_fraction_loss_ =
68 rtc::dchecked_cast<uint8_t>(update.packet_loss_ratio * 256);
69 last_rtt_ms_ = update.round_trip_time.ms();
70 last_probing_interval_ms_ = update.bwe_period.ms();
71 return update.target_bitrate.bps() * protection_ratio_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000072 }
mflodman101f2502016-06-09 17:21:19 +020073 uint32_t last_bitrate_bps_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000074 uint8_t last_fraction_loss_;
mflodman101f2502016-06-09 17:21:19 +020075 int64_t last_rtt_ms_;
minyue78b4d562016-11-30 04:47:39 -080076 int last_probing_interval_ms_;
mflodman48a4beb2016-07-01 13:03:59 +020077 double protection_ratio_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000078};
79
Sebastian Jansson89c94b92018-11-20 17:16:36 +010080class BitrateAllocatorForTest : public BitrateAllocator {
81 public:
82 using BitrateAllocator::BitrateAllocator;
83 void OnNetworkChanged(uint32_t target_bitrate_bps,
84 uint8_t fraction_loss,
85 int64_t rtt,
86 int64_t bwe_period_ms) {
87 BitrateAllocator::OnNetworkChanged(target_bitrate_bps, target_bitrate_bps,
Florent Castelli4e615d52019-08-22 16:09:06 +020088 target_bitrate_bps, fraction_loss, rtt,
89 bwe_period_ms);
Sebastian Jansson89c94b92018-11-20 17:16:36 +010090 }
91};
92
minyue78b4d562016-11-30 04:47:39 -080093namespace {
94constexpr int64_t kDefaultProbingIntervalMs = 3000;
Seth Hampson24722b32017-12-22 09:36:42 -080095const double kDefaultBitratePriority = 1.0;
Yves Gerey665174f2018-06-19 15:03:05 +020096} // namespace
minyue78b4d562016-11-30 04:47:39 -080097
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000098class BitrateAllocatorTest : public ::testing::Test {
99 protected:
Sebastian Jansson89c94b92018-11-20 17:16:36 +0100100 BitrateAllocatorTest()
Sebastian Janssonda6806c2019-03-04 17:05:12 +0100101 : allocator_(new BitrateAllocatorForTest(Clock::GetRealTimeClock(),
102 &limit_observer_)) {
minyue78b4d562016-11-30 04:47:39 -0800103 allocator_->OnNetworkChanged(300000u, 0, 0, kDefaultProbingIntervalMs);
Stefan Holmere5904162015-03-26 11:11:06 +0100104 }
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000105 ~BitrateAllocatorTest() {}
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200106 void AddObserver(BitrateAllocatorObserver* observer,
107 uint32_t min_bitrate_bps,
108 uint32_t max_bitrate_bps,
109 uint32_t pad_up_bitrate_bps,
110 bool enforce_min_bitrate,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200111 double bitrate_priority) {
112 allocator_->AddObserver(
Jonas Olsson0182a032019-07-09 12:31:20 +0200113 observer,
114 {min_bitrate_bps, max_bitrate_bps, pad_up_bitrate_bps,
115 /* priority_bitrate */ 0, enforce_min_bitrate, bitrate_priority});
Sebastian Jansson464a5572019-02-12 13:32:32 +0100116 }
117 MediaStreamAllocationConfig DefaultConfig() const {
118 MediaStreamAllocationConfig default_config;
119 default_config.min_bitrate_bps = 0;
120 default_config.max_bitrate_bps = 1500000;
121 default_config.pad_up_bitrate_bps = 0;
122 default_config.priority_bitrate_bps = 0;
123 default_config.enforce_min_bitrate = true;
Sebastian Jansson464a5572019-02-12 13:32:32 +0100124 default_config.bitrate_priority = kDefaultBitratePriority;
125 return default_config;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200126 }
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000127
perkj71ee44c2016-06-15 00:47:53 -0700128 NiceMock<MockLimitObserver> limit_observer_;
Sebastian Jansson89c94b92018-11-20 17:16:36 +0100129 std::unique_ptr<BitrateAllocatorForTest> allocator_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000130};
131
Sebastian Jansson464a5572019-02-12 13:32:32 +0100132TEST_F(BitrateAllocatorTest, RespectsPriorityBitrate) {
133 TestBitrateObserver stream_a;
134 auto config_a = DefaultConfig();
135 config_a.min_bitrate_bps = 100000;
136 config_a.priority_bitrate_bps = 0;
137 allocator_->AddObserver(&stream_a, config_a);
138
139 TestBitrateObserver stream_b;
140 auto config_b = DefaultConfig();
141 config_b.min_bitrate_bps = 100000;
142 config_b.max_bitrate_bps = 300000;
143 config_b.priority_bitrate_bps = 300000;
144 allocator_->AddObserver(&stream_b, config_b);
145
146 allocator_->OnNetworkChanged(100000, 0, 0, 0);
147 EXPECT_EQ(stream_a.last_bitrate_bps_, 100000u);
148 EXPECT_EQ(stream_b.last_bitrate_bps_, 100000u);
149
150 allocator_->OnNetworkChanged(200000, 0, 0, 0);
151 EXPECT_EQ(stream_a.last_bitrate_bps_, 100000u);
152 EXPECT_EQ(stream_b.last_bitrate_bps_, 100000u);
153
154 allocator_->OnNetworkChanged(300000, 0, 0, 0);
155 EXPECT_EQ(stream_a.last_bitrate_bps_, 100000u);
156 EXPECT_EQ(stream_b.last_bitrate_bps_, 200000u);
157
158 allocator_->OnNetworkChanged(400000, 0, 0, 0);
159 EXPECT_EQ(stream_a.last_bitrate_bps_, 100000u);
160 EXPECT_EQ(stream_b.last_bitrate_bps_, 300000u);
161
162 allocator_->OnNetworkChanged(800000, 0, 0, 0);
163 EXPECT_EQ(stream_a.last_bitrate_bps_, 500000u);
164 EXPECT_EQ(stream_b.last_bitrate_bps_, 300000u);
165}
166
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000167TEST_F(BitrateAllocatorTest, UpdatingBitrateObserver) {
168 TestBitrateObserver bitrate_observer;
perkj71ee44c2016-06-15 00:47:53 -0700169 const uint32_t kMinSendBitrateBps = 100000;
170 const uint32_t kPadUpToBitrateBps = 50000;
philipelf69e7682018-02-28 13:06:28 +0100171 const uint32_t kMaxBitrateBps = 1500000;
perkj71ee44c2016-06-15 00:47:53 -0700172
philipelf69e7682018-02-28 13:06:28 +0100173 EXPECT_CALL(limit_observer_,
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200174 OnAllocationLimitsChanged(AllocationLimitsEq(
175 kMinSendBitrateBps, kPadUpToBitrateBps, kMaxBitrateBps)));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200176 AddObserver(&bitrate_observer, kMinSendBitrateBps, kMaxBitrateBps,
Jonas Olsson0182a032019-07-09 12:31:20 +0200177 kPadUpToBitrateBps, true, kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700178 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer));
minyue78b4d562016-11-30 04:47:39 -0800179 allocator_->OnNetworkChanged(200000, 0, 0, kDefaultProbingIntervalMs);
perkj57c21f92016-06-17 07:27:16 -0700180 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000181
Peter Boström8e4e8b02015-09-15 15:08:03 +0200182 // TODO(pbos): Expect capping to 1.5M instead of 3M when not boosting the max
mflodman0e7e2592015-11-12 21:02:42 -0800183 // bitrate for FEC/retransmissions (see todo in BitrateAllocator).
minyue78b4d562016-11-30 04:47:39 -0800184 allocator_->OnNetworkChanged(4000000, 0, 0, kDefaultProbingIntervalMs);
perkj57c21f92016-06-17 07:27:16 -0700185 EXPECT_EQ(3000000, allocator_->GetStartBitrate(&bitrate_observer));
perkj71ee44c2016-06-15 00:47:53 -0700186
187 // Expect |max_padding_bitrate_bps| to change to 0 if the observer is updated.
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200188 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(
189 AllocationLimitsEq(kMinSendBitrateBps, 0)));
Jonas Olsson0182a032019-07-09 12:31:20 +0200190 AddObserver(&bitrate_observer, kMinSendBitrateBps, 4000000, 0, true,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200191 kDefaultBitratePriority);
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200192 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(
193 AllocationLimitsEq(kMinSendBitrateBps, 0)));
perkj57c21f92016-06-17 07:27:16 -0700194 EXPECT_EQ(4000000, allocator_->GetStartBitrate(&bitrate_observer));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000195
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200196 AddObserver(&bitrate_observer, kMinSendBitrateBps, kMaxBitrateBps, 0, true,
Jonas Olsson0182a032019-07-09 12:31:20 +0200197 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700198 EXPECT_EQ(3000000, allocator_->GetStartBitrate(&bitrate_observer));
mflodman101f2502016-06-09 17:21:19 +0200199 EXPECT_EQ(3000000u, bitrate_observer.last_bitrate_bps_);
philipelf69e7682018-02-28 13:06:28 +0100200 allocator_->OnNetworkChanged(kMaxBitrateBps, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200201 EXPECT_EQ(1500000u, bitrate_observer.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000202}
203
204TEST_F(BitrateAllocatorTest, TwoBitrateObserversOneRtcpObserver) {
205 TestBitrateObserver bitrate_observer_1;
206 TestBitrateObserver bitrate_observer_2;
philipelf69e7682018-02-28 13:06:28 +0100207 const uint32_t kObs1StartBitrateBps = 100000;
208 const uint32_t kObs2StartBitrateBps = 200000;
209 const uint32_t kObs1MaxBitrateBps = 300000;
210 const uint32_t kObs2MaxBitrateBps = 300000;
211
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200212 EXPECT_CALL(limit_observer_,
213 OnAllocationLimitsChanged(AllocationLimitsEq(
214 kObs1StartBitrateBps, 0, kObs1MaxBitrateBps)));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200215 AddObserver(&bitrate_observer_1, kObs1StartBitrateBps, kObs1MaxBitrateBps, 0,
Jonas Olsson0182a032019-07-09 12:31:20 +0200216 true, kDefaultBitratePriority);
philipelf69e7682018-02-28 13:06:28 +0100217 EXPECT_EQ(static_cast<int>(kObs1MaxBitrateBps),
218 allocator_->GetStartBitrate(&bitrate_observer_1));
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200219 EXPECT_CALL(limit_observer_,
220 OnAllocationLimitsChanged(AllocationLimitsEq(
221 kObs1StartBitrateBps + kObs2StartBitrateBps, 0,
222 kObs1MaxBitrateBps + kObs2MaxBitrateBps)));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200223 AddObserver(&bitrate_observer_2, kObs2StartBitrateBps, kObs2MaxBitrateBps, 0,
Jonas Olsson0182a032019-07-09 12:31:20 +0200224 true, kDefaultBitratePriority);
philipelf69e7682018-02-28 13:06:28 +0100225 EXPECT_EQ(static_cast<int>(kObs2StartBitrateBps),
226 allocator_->GetStartBitrate(&bitrate_observer_2));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000227
mflodman48a4beb2016-07-01 13:03:59 +0200228 // Test too low start bitrate, hence lower than sum of min. Min bitrates
229 // will
230 // be allocated to all observers.
philipelf69e7682018-02-28 13:06:28 +0100231 allocator_->OnNetworkChanged(kObs2StartBitrateBps, 0, 50,
232 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200233 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
234 EXPECT_EQ(0, bitrate_observer_1.last_fraction_loss_);
235 EXPECT_EQ(50, bitrate_observer_1.last_rtt_ms_);
236 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
237 EXPECT_EQ(0, bitrate_observer_2.last_fraction_loss_);
238 EXPECT_EQ(50, bitrate_observer_2.last_rtt_ms_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000239
mflodman48a4beb2016-07-01 13:03:59 +0200240 // Test a bitrate which should be distributed equally.
minyue78b4d562016-11-30 04:47:39 -0800241 allocator_->OnNetworkChanged(500000, 0, 50, kDefaultProbingIntervalMs);
philipelf69e7682018-02-28 13:06:28 +0100242 const uint32_t kBitrateToShare =
243 500000 - kObs2StartBitrateBps - kObs1StartBitrateBps;
mflodman48a4beb2016-07-01 13:03:59 +0200244 EXPECT_EQ(100000u + kBitrateToShare / 2,
245 bitrate_observer_1.last_bitrate_bps_);
246 EXPECT_EQ(200000u + kBitrateToShare / 2,
247 bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000248
mflodman48a4beb2016-07-01 13:03:59 +0200249 // Limited by 2x max bitrates since we leave room for FEC and
250 // retransmissions.
minyue78b4d562016-11-30 04:47:39 -0800251 allocator_->OnNetworkChanged(1500000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200252 EXPECT_EQ(600000u, bitrate_observer_1.last_bitrate_bps_);
253 EXPECT_EQ(600000u, bitrate_observer_2.last_bitrate_bps_);
perkjec81bcd2016-05-11 06:01:13 -0700254
mflodman48a4beb2016-07-01 13:03:59 +0200255 // Verify that if the bandwidth estimate is set to zero, the allocated
256 // rate is
257 // zero.
minyue78b4d562016-11-30 04:47:39 -0800258 allocator_->OnNetworkChanged(0, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200259 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
260 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000261}
262
perkj71ee44c2016-06-15 00:47:53 -0700263TEST_F(BitrateAllocatorTest, RemoveObserverTriggersLimitObserver) {
264 TestBitrateObserver bitrate_observer;
265 const uint32_t kMinSendBitrateBps = 100000;
266 const uint32_t kPadUpToBitrateBps = 50000;
philipelf69e7682018-02-28 13:06:28 +0100267 const uint32_t kMaxBitrateBps = 1500000;
perkj71ee44c2016-06-15 00:47:53 -0700268
philipelf69e7682018-02-28 13:06:28 +0100269 EXPECT_CALL(limit_observer_,
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200270 OnAllocationLimitsChanged(AllocationLimitsEq(
271 kMinSendBitrateBps, kPadUpToBitrateBps, kMaxBitrateBps)));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200272 AddObserver(&bitrate_observer, kMinSendBitrateBps, kMaxBitrateBps,
Jonas Olsson0182a032019-07-09 12:31:20 +0200273 kPadUpToBitrateBps, true, kDefaultBitratePriority);
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200274 EXPECT_CALL(limit_observer_,
275 OnAllocationLimitsChanged(AllocationLimitsEq(0, 0)));
perkj71ee44c2016-06-15 00:47:53 -0700276 allocator_->RemoveObserver(&bitrate_observer);
277}
278
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000279class BitrateAllocatorTestNoEnforceMin : public ::testing::Test {
280 protected:
perkj71ee44c2016-06-15 00:47:53 -0700281 BitrateAllocatorTestNoEnforceMin()
Sebastian Janssonda6806c2019-03-04 17:05:12 +0100282 : allocator_(new BitrateAllocatorForTest(Clock::GetRealTimeClock(),
283 &limit_observer_)) {
minyue78b4d562016-11-30 04:47:39 -0800284 allocator_->OnNetworkChanged(300000u, 0, 0, kDefaultProbingIntervalMs);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000285 }
286 ~BitrateAllocatorTestNoEnforceMin() {}
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200287 void AddObserver(BitrateAllocatorObserver* observer,
288 uint32_t min_bitrate_bps,
289 uint32_t max_bitrate_bps,
290 uint32_t pad_up_bitrate_bps,
291 bool enforce_min_bitrate,
292 std::string track_id,
293 double bitrate_priority) {
294 allocator_->AddObserver(
Sebastian Jansson464a5572019-02-12 13:32:32 +0100295 observer, {min_bitrate_bps, max_bitrate_bps, pad_up_bitrate_bps, 0,
Jonas Olsson0182a032019-07-09 12:31:20 +0200296 enforce_min_bitrate, bitrate_priority});
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200297 }
perkj71ee44c2016-06-15 00:47:53 -0700298 NiceMock<MockLimitObserver> limit_observer_;
Sebastian Jansson89c94b92018-11-20 17:16:36 +0100299 std::unique_ptr<BitrateAllocatorForTest> allocator_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000300};
301
mflodman101f2502016-06-09 17:21:19 +0200302// The following three tests verify enforcing a minimum bitrate works as
303// intended.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000304TEST_F(BitrateAllocatorTestNoEnforceMin, OneBitrateObserver) {
305 TestBitrateObserver bitrate_observer_1;
perkj71ee44c2016-06-15 00:47:53 -0700306 // Expect OnAllocationLimitsChanged with |min_send_bitrate_bps| = 0 since
307 // AddObserver is called with |enforce_min_bitrate| = false.
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200308 EXPECT_CALL(limit_observer_,
309 OnAllocationLimitsChanged(AllocationLimitsEq(0, 0)));
310 EXPECT_CALL(limit_observer_,
311 OnAllocationLimitsChanged(AllocationLimitsEq(0, 120000)));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200312 AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "",
313 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200314 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000315
mflodman48a4beb2016-07-01 13:03:59 +0200316 // High BWE.
minyue78b4d562016-11-30 04:47:39 -0800317 allocator_->OnNetworkChanged(150000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200318 EXPECT_EQ(150000u, bitrate_observer_1.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000319
mflodman48a4beb2016-07-01 13:03:59 +0200320 // Low BWE.
minyue78b4d562016-11-30 04:47:39 -0800321 allocator_->OnNetworkChanged(10000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200322 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000323
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200324 EXPECT_CALL(limit_observer_,
325 OnAllocationLimitsChanged(AllocationLimitsEq(0, 0)));
mflodman48a4beb2016-07-01 13:03:59 +0200326 allocator_->RemoveObserver(&bitrate_observer_1);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000327}
328
329TEST_F(BitrateAllocatorTestNoEnforceMin, ThreeBitrateObservers) {
330 TestBitrateObserver bitrate_observer_1;
331 TestBitrateObserver bitrate_observer_2;
332 TestBitrateObserver bitrate_observer_3;
333 // Set up the observers with min bitrates at 100000, 200000, and 300000.
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200334 AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "",
335 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700336 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
Stefan Holmere5904162015-03-26 11:11:06 +0100337
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200338 AddObserver(&bitrate_observer_2, 200000, 400000, 0, false, "",
339 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700340 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200341 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
Stefan Holmere5904162015-03-26 11:11:06 +0100342
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200343 AddObserver(&bitrate_observer_3, 300000, 400000, 0, false, "",
344 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700345 EXPECT_EQ(0, allocator_->GetStartBitrate(&bitrate_observer_3));
mflodman101f2502016-06-09 17:21:19 +0200346 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
347 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000348
mflodman101f2502016-06-09 17:21:19 +0200349 // High BWE. Make sure the controllers get a fair share of the surplus (i.e.,
350 // what is left after each controller gets its min rate).
minyue78b4d562016-11-30 04:47:39 -0800351 allocator_->OnNetworkChanged(690000, 0, 0, kDefaultProbingIntervalMs);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000352 // Verify that each observer gets its min rate (sum of min rates is 600000),
353 // and that the remaining 90000 is divided equally among the three.
Stefan Holmere5904162015-03-26 11:11:06 +0100354 uint32_t bitrate_to_share = 690000u - 100000u - 200000u - 300000u;
mflodman101f2502016-06-09 17:21:19 +0200355 EXPECT_EQ(100000u + bitrate_to_share / 3,
356 bitrate_observer_1.last_bitrate_bps_);
357 EXPECT_EQ(200000u + bitrate_to_share / 3,
358 bitrate_observer_2.last_bitrate_bps_);
359 EXPECT_EQ(300000u + bitrate_to_share / 3,
360 bitrate_observer_3.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000361
mflodman101f2502016-06-09 17:21:19 +0200362 // BWE below the sum of observer's min bitrate.
minyue78b4d562016-11-30 04:47:39 -0800363 allocator_->OnNetworkChanged(300000, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200364 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_); // Min bitrate.
365 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_); // Min bitrate.
Yves Gerey665174f2018-06-19 15:03:05 +0200366 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_); // Nothing.
mflodman101f2502016-06-09 17:21:19 +0200367
368 // Increased BWE, but still below the sum of configured min bitrates for all
369 // observers and too little for observer 3. 1 and 2 will share the rest.
minyue78b4d562016-11-30 04:47:39 -0800370 allocator_->OnNetworkChanged(500000, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200371 EXPECT_EQ(200000u, bitrate_observer_1.last_bitrate_bps_); // Min + split.
372 EXPECT_EQ(300000u, bitrate_observer_2.last_bitrate_bps_); // Min + split.
Yves Gerey665174f2018-06-19 15:03:05 +0200373 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_); // Nothing.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000374
mflodman101f2502016-06-09 17:21:19 +0200375 // Below min for all.
minyue78b4d562016-11-30 04:47:39 -0800376 allocator_->OnNetworkChanged(10000, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200377 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
378 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
379 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000380
perkjec81bcd2016-05-11 06:01:13 -0700381 // Verify that zero estimated bandwidth, means that that all gets zero,
382 // regardless of set min bitrate.
minyue78b4d562016-11-30 04:47:39 -0800383 allocator_->OnNetworkChanged(0, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200384 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
385 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
386 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_);
perkjec81bcd2016-05-11 06:01:13 -0700387
mflodman86aabb22016-03-11 15:44:32 +0100388 allocator_->RemoveObserver(&bitrate_observer_1);
389 allocator_->RemoveObserver(&bitrate_observer_2);
390 allocator_->RemoveObserver(&bitrate_observer_3);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000391}
392
mflodman48a4beb2016-07-01 13:03:59 +0200393TEST_F(BitrateAllocatorTestNoEnforceMin, OneBitrateObserverWithPacketLoss) {
Erik Språngd1d7b232018-12-06 17:31:25 +0100394 const uint32_t kMinBitrateBps = 100000;
395 const uint32_t kMaxBitrateBps = 400000;
396 // Hysteresis adds another 10% or 20kbps to min bitrate.
397 const uint32_t kMinStartBitrateBps =
398 kMinBitrateBps + std::max(20000u, kMinBitrateBps / 10);
399
mflodman48a4beb2016-07-01 13:03:59 +0200400 // Expect OnAllocationLimitsChanged with |min_send_bitrate_bps| = 0 since
401 // AddObserver is called with |enforce_min_bitrate| = false.
Erik Språngd1d7b232018-12-06 17:31:25 +0100402 TestBitrateObserver bitrate_observer;
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200403 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(
404 AllocationLimitsEq(0, 0, kMaxBitrateBps)));
Erik Språngd1d7b232018-12-06 17:31:25 +0100405 AddObserver(&bitrate_observer, kMinBitrateBps, kMaxBitrateBps, 0, false, "",
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200406 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200407 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer));
408
409 // High BWE.
minyue78b4d562016-11-30 04:47:39 -0800410 allocator_->OnNetworkChanged(150000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200411 EXPECT_EQ(150000u, bitrate_observer.last_bitrate_bps_);
412
413 // Add loss and use a part of the bitrate for protection.
Erik Språngd1d7b232018-12-06 17:31:25 +0100414 const double kProtectionRatio = 0.4;
Rasmus Brandt681de202019-02-04 15:09:34 +0100415 const uint8_t fraction_loss = kProtectionRatio * 256;
Erik Språngd1d7b232018-12-06 17:31:25 +0100416 bitrate_observer.SetBitrateProtectionRatio(kProtectionRatio);
Rasmus Brandt681de202019-02-04 15:09:34 +0100417 allocator_->OnNetworkChanged(200000, 0, fraction_loss,
minyue78b4d562016-11-30 04:47:39 -0800418 kDefaultProbingIntervalMs);
Rasmus Brandt681de202019-02-04 15:09:34 +0100419 EXPECT_EQ(200000u, bitrate_observer.last_bitrate_bps_);
mflodman48a4beb2016-07-01 13:03:59 +0200420
421 // Above the min threshold, but not enough given the protection used.
Erik Språngd1d7b232018-12-06 17:31:25 +0100422 // Limits changed, as we will video is now off and we need to pad up to the
423 // start bitrate.
Erik Språngd1d7b232018-12-06 17:31:25 +0100424 // Verify the hysteresis is added for the protection.
425 const uint32_t kMinStartBitrateWithProtectionBps =
426 static_cast<uint32_t>(kMinStartBitrateBps * (1 + kProtectionRatio));
427 EXPECT_CALL(limit_observer_,
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200428 OnAllocationLimitsChanged(AllocationLimitsEq(
429 0, kMinStartBitrateWithProtectionBps, kMaxBitrateBps)));
Erik Språngd1d7b232018-12-06 17:31:25 +0100430 allocator_->OnNetworkChanged(kMinStartBitrateBps + 1000, 0, fraction_loss,
minyue78b4d562016-11-30 04:47:39 -0800431 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200432 EXPECT_EQ(0u, bitrate_observer.last_bitrate_bps_);
433
Erik Språngd1d7b232018-12-06 17:31:25 +0100434 allocator_->OnNetworkChanged(kMinStartBitrateWithProtectionBps - 1000, 0,
435 fraction_loss, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200436 EXPECT_EQ(0u, bitrate_observer.last_bitrate_bps_);
437
438 // Just enough to enable video again.
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200439 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(
440 AllocationLimitsEq(0, 0, kMaxBitrateBps)));
Erik Språngd1d7b232018-12-06 17:31:25 +0100441 allocator_->OnNetworkChanged(kMinStartBitrateWithProtectionBps, 0,
442 fraction_loss, kDefaultProbingIntervalMs);
443 EXPECT_EQ(kMinStartBitrateWithProtectionBps,
444 bitrate_observer.last_bitrate_bps_);
mflodman48a4beb2016-07-01 13:03:59 +0200445
446 // Remove all protection and make sure video is not paused as earlier.
447 bitrate_observer.SetBitrateProtectionRatio(0.0);
Erik Språngd1d7b232018-12-06 17:31:25 +0100448 allocator_->OnNetworkChanged(kMinStartBitrateWithProtectionBps - 1000, 0, 0,
449 kDefaultProbingIntervalMs);
450 EXPECT_EQ(kMinStartBitrateWithProtectionBps - 1000,
451 bitrate_observer.last_bitrate_bps_);
mflodman48a4beb2016-07-01 13:03:59 +0200452
Erik Språngd1d7b232018-12-06 17:31:25 +0100453 allocator_->OnNetworkChanged(kMinStartBitrateBps, 0, 0,
454 kDefaultProbingIntervalMs);
455 EXPECT_EQ(kMinStartBitrateBps, bitrate_observer.last_bitrate_bps_);
mflodman48a4beb2016-07-01 13:03:59 +0200456
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200457 EXPECT_CALL(limit_observer_,
458 OnAllocationLimitsChanged(AllocationLimitsEq(0, 0, 0)));
mflodman48a4beb2016-07-01 13:03:59 +0200459 allocator_->RemoveObserver(&bitrate_observer);
460}
461
Rasmus Brandt681de202019-02-04 15:09:34 +0100462TEST_F(BitrateAllocatorTest,
463 TotalAllocationLimitsAreUnaffectedByProtectionRatio) {
464 TestBitrateObserver bitrate_observer;
465
466 const uint32_t kMinBitrateBps = 100000;
467 const uint32_t kMaxBitrateBps = 400000;
468
469 // Register |bitrate_observer| and expect total allocation limits to change.
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200470 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(AllocationLimitsEq(
471 kMinBitrateBps, 0, kMaxBitrateBps)))
Rasmus Brandt681de202019-02-04 15:09:34 +0100472 .Times(1);
Sebastian Jansson464a5572019-02-12 13:32:32 +0100473 MediaStreamAllocationConfig allocation_config = DefaultConfig();
474 allocation_config.min_bitrate_bps = kMinBitrateBps;
475 allocation_config.max_bitrate_bps = kMaxBitrateBps;
476 allocator_->AddObserver(&bitrate_observer, allocation_config);
Rasmus Brandt681de202019-02-04 15:09:34 +0100477
478 // Observer uses 20% of it's allocated bitrate for protection.
479 bitrate_observer.SetBitrateProtectionRatio(/*protection_ratio=*/0.2);
480 // Total allocation limits are unaffected by the protection rate change.
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200481 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(_)).Times(0);
Rasmus Brandt681de202019-02-04 15:09:34 +0100482 allocator_->OnNetworkChanged(200000u, 0, 100, kDefaultProbingIntervalMs);
483
484 // Observer uses 0% of it's allocated bitrate for protection.
485 bitrate_observer.SetBitrateProtectionRatio(/*protection_ratio=*/0.0);
486 // Total allocation limits are unaffected by the protection rate change.
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200487 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(_)).Times(0);
Rasmus Brandt681de202019-02-04 15:09:34 +0100488 allocator_->OnNetworkChanged(200000u, 0, 100, kDefaultProbingIntervalMs);
489
490 // Observer again uses 20% of it's allocated bitrate for protection.
491 bitrate_observer.SetBitrateProtectionRatio(/*protection_ratio=*/0.2);
492 // Total allocation limits are unaffected by the protection rate change.
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200493 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(_)).Times(0);
Rasmus Brandt681de202019-02-04 15:09:34 +0100494 allocator_->OnNetworkChanged(200000u, 0, 100, kDefaultProbingIntervalMs);
495}
496
mflodman48a4beb2016-07-01 13:03:59 +0200497TEST_F(BitrateAllocatorTestNoEnforceMin, TwoBitrateObserverWithPacketLoss) {
498 TestBitrateObserver bitrate_observer_1;
499 TestBitrateObserver bitrate_observer_2;
500
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200501 AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "",
502 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200503 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200504 AddObserver(&bitrate_observer_2, 200000, 400000, 0, false, "",
505 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200506 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
507 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
508
509 // Enough bitrate for both.
510 bitrate_observer_2.SetBitrateProtectionRatio(0.5);
minyue78b4d562016-11-30 04:47:39 -0800511 allocator_->OnNetworkChanged(300000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200512 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
513 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
514
515 // Above min for observer 2, but too little given the protection used.
minyue78b4d562016-11-30 04:47:39 -0800516 allocator_->OnNetworkChanged(330000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200517 EXPECT_EQ(330000u, bitrate_observer_1.last_bitrate_bps_);
518 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
519
minyue78b4d562016-11-30 04:47:39 -0800520 allocator_->OnNetworkChanged(100000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200521 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
522 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
523
minyue78b4d562016-11-30 04:47:39 -0800524 allocator_->OnNetworkChanged(99999, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200525 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
526 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
527
minyue78b4d562016-11-30 04:47:39 -0800528 allocator_->OnNetworkChanged(119000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200529 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
530 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
531
minyue78b4d562016-11-30 04:47:39 -0800532 allocator_->OnNetworkChanged(120000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200533 EXPECT_EQ(120000u, bitrate_observer_1.last_bitrate_bps_);
534 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
535
536 // Verify the protection is accounted for before resuming observer 2.
minyue78b4d562016-11-30 04:47:39 -0800537 allocator_->OnNetworkChanged(429000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200538 EXPECT_EQ(400000u, bitrate_observer_1.last_bitrate_bps_);
539 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
540
minyue78b4d562016-11-30 04:47:39 -0800541 allocator_->OnNetworkChanged(430000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200542 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
543 EXPECT_EQ(330000u, bitrate_observer_2.last_bitrate_bps_);
544
545 allocator_->RemoveObserver(&bitrate_observer_1);
546 allocator_->RemoveObserver(&bitrate_observer_2);
547}
548
mflodman101f2502016-06-09 17:21:19 +0200549TEST_F(BitrateAllocatorTest, ThreeBitrateObserversLowBweEnforceMin) {
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000550 TestBitrateObserver bitrate_observer_1;
551 TestBitrateObserver bitrate_observer_2;
552 TestBitrateObserver bitrate_observer_3;
Stefan Holmere5904162015-03-26 11:11:06 +0100553
Jonas Olsson0182a032019-07-09 12:31:20 +0200554 AddObserver(&bitrate_observer_1, 100000, 400000, 0, true,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200555 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700556 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
557
Jonas Olsson0182a032019-07-09 12:31:20 +0200558 AddObserver(&bitrate_observer_2, 200000, 400000, 0, true,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200559 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700560 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200561 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
Stefan Holmere5904162015-03-26 11:11:06 +0100562
Jonas Olsson0182a032019-07-09 12:31:20 +0200563 AddObserver(&bitrate_observer_3, 300000, 400000, 0, true,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200564 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200565 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_3));
566 EXPECT_EQ(100000, static_cast<int>(bitrate_observer_1.last_bitrate_bps_));
567 EXPECT_EQ(200000, static_cast<int>(bitrate_observer_2.last_bitrate_bps_));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000568
mflodman48a4beb2016-07-01 13:03:59 +0200569 // Low BWE. Verify that all observers still get their respective min
570 // bitrate.
minyue78b4d562016-11-30 04:47:39 -0800571 allocator_->OnNetworkChanged(1000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200572 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_); // Min cap.
573 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_); // Min cap.
574 EXPECT_EQ(300000u, bitrate_observer_3.last_bitrate_bps_); // Min cap.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000575
mflodman48a4beb2016-07-01 13:03:59 +0200576 allocator_->RemoveObserver(&bitrate_observer_1);
577 allocator_->RemoveObserver(&bitrate_observer_2);
578 allocator_->RemoveObserver(&bitrate_observer_3);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000579}
perkjfea93092016-05-14 00:58:48 -0700580
581TEST_F(BitrateAllocatorTest, AddObserverWhileNetworkDown) {
582 TestBitrateObserver bitrate_observer_1;
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200583 EXPECT_CALL(limit_observer_,
584 OnAllocationLimitsChanged(AllocationLimitsEq(50000, 0)));
perkj57c21f92016-06-17 07:27:16 -0700585
Jonas Olsson0182a032019-07-09 12:31:20 +0200586 AddObserver(&bitrate_observer_1, 50000, 400000, 0, true,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200587 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700588 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
perkjfea93092016-05-14 00:58:48 -0700589
590 // Set network down, ie, no available bitrate.
minyue78b4d562016-11-30 04:47:39 -0800591 allocator_->OnNetworkChanged(0, 0, 0, kDefaultProbingIntervalMs);
perkjfea93092016-05-14 00:58:48 -0700592
mflodman101f2502016-06-09 17:21:19 +0200593 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
perkjfea93092016-05-14 00:58:48 -0700594
595 TestBitrateObserver bitrate_observer_2;
perkj71ee44c2016-06-15 00:47:53 -0700596 // Adding an observer while the network is down should not affect the limits.
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200597 EXPECT_CALL(limit_observer_,
598 OnAllocationLimitsChanged(AllocationLimitsEq(50000 + 50000, 0)));
Jonas Olsson0182a032019-07-09 12:31:20 +0200599 AddObserver(&bitrate_observer_2, 50000, 400000, 0, true,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200600 kDefaultBitratePriority);
perkjfea93092016-05-14 00:58:48 -0700601
602 // Expect the start_bitrate to be set as if the network was still up but that
603 // the new observer have been notified that the network is down.
perkj57c21f92016-06-17 07:27:16 -0700604 EXPECT_EQ(300000 / 2, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200605 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
606 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
perkjfea93092016-05-14 00:58:48 -0700607
608 // Set network back up.
minyue78b4d562016-11-30 04:47:39 -0800609 allocator_->OnNetworkChanged(1500000, 0, 50, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200610 EXPECT_EQ(750000u, bitrate_observer_1.last_bitrate_bps_);
611 EXPECT_EQ(750000u, bitrate_observer_2.last_bitrate_bps_);
612}
613
614TEST_F(BitrateAllocatorTest, MixedEnforecedConfigs) {
615 TestBitrateObserver enforced_observer;
Jonas Olsson0182a032019-07-09 12:31:20 +0200616 AddObserver(&enforced_observer, 6000, 30000, 0, true,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200617 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200618 EXPECT_EQ(60000, allocator_->GetStartBitrate(&enforced_observer));
mflodman101f2502016-06-09 17:21:19 +0200619
mflodman48a4beb2016-07-01 13:03:59 +0200620 TestBitrateObserver not_enforced_observer;
Jonas Olsson0182a032019-07-09 12:31:20 +0200621 AddObserver(&not_enforced_observer, 30000, 2500000, 0, false,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200622 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200623 EXPECT_EQ(270000, allocator_->GetStartBitrate(&not_enforced_observer));
624 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200625
minyue78b4d562016-11-30 04:47:39 -0800626 allocator_->OnNetworkChanged(36000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200627 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
628 EXPECT_EQ(30000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200629
minyue78b4d562016-11-30 04:47:39 -0800630 allocator_->OnNetworkChanged(35000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200631 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
632 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200633
minyue78b4d562016-11-30 04:47:39 -0800634 allocator_->OnNetworkChanged(5000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200635 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
636 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200637
minyue78b4d562016-11-30 04:47:39 -0800638 allocator_->OnNetworkChanged(36000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200639 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
640 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200641
minyue78b4d562016-11-30 04:47:39 -0800642 allocator_->OnNetworkChanged(55000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200643 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
644 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200645
minyue78b4d562016-11-30 04:47:39 -0800646 allocator_->OnNetworkChanged(56000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200647 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
648 EXPECT_EQ(50000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200649
minyue78b4d562016-11-30 04:47:39 -0800650 allocator_->OnNetworkChanged(56000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200651 EXPECT_EQ(16000u, enforced_observer.last_bitrate_bps_);
652 EXPECT_EQ(40000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200653
mflodman48a4beb2016-07-01 13:03:59 +0200654 allocator_->RemoveObserver(&enforced_observer);
655 allocator_->RemoveObserver(&not_enforced_observer);
mflodman101f2502016-06-09 17:21:19 +0200656}
657
658TEST_F(BitrateAllocatorTest, AvoidToggleAbsolute) {
659 TestBitrateObserver observer;
Jonas Olsson0182a032019-07-09 12:31:20 +0200660 AddObserver(&observer, 30000, 300000, 0, false, kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200661 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
mflodman101f2502016-06-09 17:21:19 +0200662
minyue78b4d562016-11-30 04:47:39 -0800663 allocator_->OnNetworkChanged(30000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200664 EXPECT_EQ(30000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200665
minyue78b4d562016-11-30 04:47:39 -0800666 allocator_->OnNetworkChanged(20000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200667 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200668
minyue78b4d562016-11-30 04:47:39 -0800669 allocator_->OnNetworkChanged(30000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200670 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200671
minyue78b4d562016-11-30 04:47:39 -0800672 allocator_->OnNetworkChanged(49000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200673 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200674
minyue78b4d562016-11-30 04:47:39 -0800675 allocator_->OnNetworkChanged(50000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200676 EXPECT_EQ(50000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200677
minyue78b4d562016-11-30 04:47:39 -0800678 allocator_->OnNetworkChanged(30000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200679 EXPECT_EQ(30000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200680
mflodman48a4beb2016-07-01 13:03:59 +0200681 allocator_->RemoveObserver(&observer);
mflodman101f2502016-06-09 17:21:19 +0200682}
683
684TEST_F(BitrateAllocatorTest, AvoidTogglePercent) {
685 TestBitrateObserver observer;
Jonas Olsson0182a032019-07-09 12:31:20 +0200686 AddObserver(&observer, 300000, 600000, 0, false, kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200687 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
mflodman101f2502016-06-09 17:21:19 +0200688
minyue78b4d562016-11-30 04:47:39 -0800689 allocator_->OnNetworkChanged(300000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200690 EXPECT_EQ(300000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200691
minyue78b4d562016-11-30 04:47:39 -0800692 allocator_->OnNetworkChanged(200000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200693 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200694
minyue78b4d562016-11-30 04:47:39 -0800695 allocator_->OnNetworkChanged(300000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200696 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200697
minyue78b4d562016-11-30 04:47:39 -0800698 allocator_->OnNetworkChanged(329000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200699 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200700
minyue78b4d562016-11-30 04:47:39 -0800701 allocator_->OnNetworkChanged(330000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200702 EXPECT_EQ(330000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200703
minyue78b4d562016-11-30 04:47:39 -0800704 allocator_->OnNetworkChanged(300000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200705 EXPECT_EQ(300000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200706
mflodman48a4beb2016-07-01 13:03:59 +0200707 allocator_->RemoveObserver(&observer);
perkjfea93092016-05-14 00:58:48 -0700708}
709
minyue78b4d562016-11-30 04:47:39 -0800710TEST_F(BitrateAllocatorTest, PassProbingInterval) {
711 TestBitrateObserver observer;
Jonas Olsson0182a032019-07-09 12:31:20 +0200712 AddObserver(&observer, 300000, 600000, 0, false, kDefaultBitratePriority);
minyue78b4d562016-11-30 04:47:39 -0800713 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
714
715 allocator_->OnNetworkChanged(300000, 0, 50, 5000);
716 EXPECT_EQ(5000, observer.last_probing_interval_ms_);
717
718 allocator_->RemoveObserver(&observer);
719}
720
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800721TEST_F(BitrateAllocatorTest, PriorityRateOneObserverBasic) {
722 TestBitrateObserver observer;
723 const uint32_t kMinSendBitrateBps = 10;
724 const uint32_t kMaxSendBitrateBps = 60;
725 const uint32_t kNetworkBandwidthBps = 30;
726
Jonas Olsson0182a032019-07-09 12:31:20 +0200727 AddObserver(&observer, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true, 2.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800728 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
729 kDefaultProbingIntervalMs);
730
731 EXPECT_EQ(kNetworkBandwidthBps, observer.last_bitrate_bps_);
732
733 allocator_->RemoveObserver(&observer);
734}
735
736// Tests that two observers with the same bitrate priority are allocated
737// their bitrate evenly.
738TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversBasic) {
739 TestBitrateObserver observer_low_1;
740 TestBitrateObserver observer_low_2;
741 const uint32_t kMinSendBitrateBps = 10;
742 const uint32_t kMaxSendBitrateBps = 60;
743 const uint32_t kNetworkBandwidthBps = 60;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200744 AddObserver(&observer_low_1, kMinSendBitrateBps, kMaxSendBitrateBps, 0, false,
Jonas Olsson0182a032019-07-09 12:31:20 +0200745 2.0);
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200746 AddObserver(&observer_low_2, kMinSendBitrateBps, kMaxSendBitrateBps, 0, false,
Jonas Olsson0182a032019-07-09 12:31:20 +0200747 2.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800748 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
749 kDefaultProbingIntervalMs);
750
751 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_1.last_bitrate_bps_);
752 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_2.last_bitrate_bps_);
753
754 allocator_->RemoveObserver(&observer_low_1);
755 allocator_->RemoveObserver(&observer_low_2);
756}
757
758// Tests that there is no difference in functionality when the min bitrate is
759// enforced.
760TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversBasicMinEnforced) {
761 TestBitrateObserver observer_low_1;
762 TestBitrateObserver observer_low_2;
763 const uint32_t kMinSendBitrateBps = 0;
764 const uint32_t kMaxSendBitrateBps = 60;
765 const uint32_t kNetworkBandwidthBps = 60;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200766 AddObserver(&observer_low_1, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
Jonas Olsson0182a032019-07-09 12:31:20 +0200767 2.0);
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200768 AddObserver(&observer_low_2, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
Jonas Olsson0182a032019-07-09 12:31:20 +0200769 2.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800770 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
771 kDefaultProbingIntervalMs);
772
773 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_1.last_bitrate_bps_);
774 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_2.last_bitrate_bps_);
775
776 allocator_->RemoveObserver(&observer_low_1);
777 allocator_->RemoveObserver(&observer_low_2);
778}
779
780// Tests that if the available bandwidth is the sum of the max bitrate
781// of all observers, they will be allocated their max.
782TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversBothAllocatedMax) {
783 TestBitrateObserver observer_low;
784 TestBitrateObserver observer_mid;
785 const uint32_t kMinSendBitrateBps = 0;
786 const uint32_t kMaxSendBitrateBps = 60;
787 const uint32_t kNetworkBandwidthBps = kMaxSendBitrateBps * 2;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200788 AddObserver(&observer_low, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
Jonas Olsson0182a032019-07-09 12:31:20 +0200789 2.0);
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200790 AddObserver(&observer_mid, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
Jonas Olsson0182a032019-07-09 12:31:20 +0200791 4.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800792 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
793 kDefaultProbingIntervalMs);
794
795 EXPECT_EQ(kMaxSendBitrateBps, observer_low.last_bitrate_bps_);
796 EXPECT_EQ(kMaxSendBitrateBps, observer_mid.last_bitrate_bps_);
797
798 allocator_->RemoveObserver(&observer_low);
799 allocator_->RemoveObserver(&observer_mid);
800}
801
802// Tests that after a higher bitrate priority observer has been allocated its
803// max bitrate the lower priority observer will then be allocated the remaining
804// bitrate.
805TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversOneAllocatedToMax) {
806 TestBitrateObserver observer_low;
807 TestBitrateObserver observer_mid;
Jonas Olsson0182a032019-07-09 12:31:20 +0200808 AddObserver(&observer_low, 10, 50, 0, false, 2.0);
809 AddObserver(&observer_mid, 10, 50, 0, false, 4.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800810 allocator_->OnNetworkChanged(90, 0, 0, kDefaultProbingIntervalMs);
811
812 EXPECT_EQ(40u, observer_low.last_bitrate_bps_);
813 EXPECT_EQ(50u, observer_mid.last_bitrate_bps_);
814
815 allocator_->RemoveObserver(&observer_low);
816 allocator_->RemoveObserver(&observer_mid);
817}
818
819// Tests that three observers with three different bitrate priorities will all
820// be allocated bitrate according to their relative bitrate priority.
821TEST_F(BitrateAllocatorTest,
822 PriorityRateThreeObserversAllocatedRelativeAmounts) {
823 TestBitrateObserver observer_low;
824 TestBitrateObserver observer_mid;
825 TestBitrateObserver observer_high;
826 const uint32_t kMaxBitrate = 100;
827 // Not enough bandwidth to fill any observer's max bitrate.
828 const uint32_t kNetworkBandwidthBps = 70;
829 const double kLowBitratePriority = 2.0;
830 const double kMidBitratePriority = 4.0;
831 const double kHighBitratePriority = 8.0;
832 const double kTotalBitratePriority =
833 kLowBitratePriority + kMidBitratePriority + kHighBitratePriority;
Jonas Olsson0182a032019-07-09 12:31:20 +0200834 AddObserver(&observer_low, 0, kMaxBitrate, 0, false, kLowBitratePriority);
835 AddObserver(&observer_mid, 0, kMaxBitrate, 0, false, kMidBitratePriority);
836 AddObserver(&observer_high, 0, kMaxBitrate, 0, false, kHighBitratePriority);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800837 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
838 kDefaultProbingIntervalMs);
839
840 const double kLowFractionAllocated =
841 kLowBitratePriority / kTotalBitratePriority;
842 const double kMidFractionAllocated =
843 kMidBitratePriority / kTotalBitratePriority;
844 const double kHighFractionAllocated =
845 kHighBitratePriority / kTotalBitratePriority;
846 EXPECT_EQ(kLowFractionAllocated * kNetworkBandwidthBps,
847 observer_low.last_bitrate_bps_);
848 EXPECT_EQ(kMidFractionAllocated * kNetworkBandwidthBps,
849 observer_mid.last_bitrate_bps_);
850 EXPECT_EQ(kHighFractionAllocated * kNetworkBandwidthBps,
851 observer_high.last_bitrate_bps_);
852
853 allocator_->RemoveObserver(&observer_low);
854 allocator_->RemoveObserver(&observer_mid);
855 allocator_->RemoveObserver(&observer_high);
856}
857
858// Tests that after the high priority observer has been allocated its maximum
859// bitrate, the other two observers are still allocated bitrate according to
860// their relative bitrate priority.
861TEST_F(BitrateAllocatorTest, PriorityRateThreeObserversHighAllocatedToMax) {
862 TestBitrateObserver observer_low;
863 const double kLowBitratePriority = 2.0;
864 TestBitrateObserver observer_mid;
865 const double kMidBitratePriority = 4.0;
866 TestBitrateObserver observer_high;
867 const double kHighBitratePriority = 8.0;
868
869 const uint32_t kAvailableBitrate = 90;
870 const uint32_t kMaxBitrate = 40;
871 const uint32_t kMinBitrate = 10;
872 // Remaining bitrate after allocating to all mins and knowing that the high
873 // priority observer will have its max bitrate allocated.
874 const uint32_t kRemainingBitrate =
875 kAvailableBitrate - kMaxBitrate - (2 * kMinBitrate);
876
Jonas Olsson0182a032019-07-09 12:31:20 +0200877 AddObserver(&observer_low, kMinBitrate, kMaxBitrate, 0, false,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200878 kLowBitratePriority);
Jonas Olsson0182a032019-07-09 12:31:20 +0200879 AddObserver(&observer_mid, kMinBitrate, kMaxBitrate, 0, false,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200880 kMidBitratePriority);
Jonas Olsson0182a032019-07-09 12:31:20 +0200881 AddObserver(&observer_high, kMinBitrate, kMaxBitrate, 0, false,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200882 kHighBitratePriority);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800883 allocator_->OnNetworkChanged(kAvailableBitrate, 0, 0,
884 kDefaultProbingIntervalMs);
885
886 const double kLowFractionAllocated =
887 kLowBitratePriority / (kLowBitratePriority + kMidBitratePriority);
888 const double kMidFractionAllocated =
889 kMidBitratePriority / (kLowBitratePriority + kMidBitratePriority);
890 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kLowFractionAllocated),
891 observer_low.last_bitrate_bps_);
892 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kMidFractionAllocated),
893 observer_mid.last_bitrate_bps_);
894 EXPECT_EQ(40u, observer_high.last_bitrate_bps_);
895
896 allocator_->RemoveObserver(&observer_low);
897 allocator_->RemoveObserver(&observer_mid);
898 allocator_->RemoveObserver(&observer_high);
899}
900
901// Tests that after the low priority observer has been allocated its maximum
902// bitrate, the other two observers are still allocated bitrate according to
903// their relative bitrate priority.
904TEST_F(BitrateAllocatorTest, PriorityRateThreeObserversLowAllocatedToMax) {
905 TestBitrateObserver observer_low;
906 const double kLowBitratePriority = 2.0;
907 const uint32_t kLowMaxBitrate = 10;
908 TestBitrateObserver observer_mid;
909 const double kMidBitratePriority = 4.0;
910 TestBitrateObserver observer_high;
911 const double kHighBitratePriority = 8.0;
912
913 const uint32_t kMinBitrate = 0;
914 const uint32_t kMaxBitrate = 60;
915 const uint32_t kAvailableBitrate = 100;
916 // Remaining bitrate knowing that the low priority observer is allocated its
917 // max bitrate. We know this because it is allocated 2.0/14.0 (1/7) of the
918 // available bitrate, so 70 bps would be sufficient network bandwidth.
919 const uint32_t kRemainingBitrate = kAvailableBitrate - kLowMaxBitrate;
920
Jonas Olsson0182a032019-07-09 12:31:20 +0200921 AddObserver(&observer_low, kMinBitrate, kLowMaxBitrate, 0, false,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200922 kLowBitratePriority);
Jonas Olsson0182a032019-07-09 12:31:20 +0200923 AddObserver(&observer_mid, kMinBitrate, kMaxBitrate, 0, false,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200924 kMidBitratePriority);
Jonas Olsson0182a032019-07-09 12:31:20 +0200925 AddObserver(&observer_high, kMinBitrate, kMaxBitrate, 0, false,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200926 kHighBitratePriority);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800927 allocator_->OnNetworkChanged(kAvailableBitrate, 0, 0,
928 kDefaultProbingIntervalMs);
929
930 const double kMidFractionAllocated =
931 kMidBitratePriority / (kMidBitratePriority + kHighBitratePriority);
932 const double kHighFractionAllocated =
933 kHighBitratePriority / (kMidBitratePriority + kHighBitratePriority);
934 EXPECT_EQ(kLowMaxBitrate, observer_low.last_bitrate_bps_);
935 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kMidFractionAllocated),
936 observer_mid.last_bitrate_bps_);
937 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kHighFractionAllocated),
938 observer_high.last_bitrate_bps_);
939
940 allocator_->RemoveObserver(&observer_low);
941 allocator_->RemoveObserver(&observer_mid);
942 allocator_->RemoveObserver(&observer_high);
943}
944
945// Tests that after two observers are allocated bitrate to their max, the
946// the remaining observer is allocated what's left appropriately. This test
947// handles an edge case where the medium and high observer reach their
948// "relative" max allocation at the same time. The high has 40 to allocate
949// above its min, and the mid has 20 to allocate above its min, which scaled
950// by their bitrate priority is the same for each.
951TEST_F(BitrateAllocatorTest, PriorityRateThreeObserversTwoAllocatedToMax) {
952 TestBitrateObserver observer_low;
953 TestBitrateObserver observer_mid;
954 TestBitrateObserver observer_high;
Jonas Olsson0182a032019-07-09 12:31:20 +0200955 AddObserver(&observer_low, 10, 40, 0, false, 2.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800956 // Scaled allocation above the min allocation is the same for these two,
957 // meaning they will get allocated their max at the same time.
958 // Scaled (target allocation) = (max - min) / bitrate priority
Jonas Olsson0182a032019-07-09 12:31:20 +0200959 AddObserver(&observer_mid, 10, 30, 0, false, 4.0);
960 AddObserver(&observer_high, 10, 50, 0, false, 8.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800961 allocator_->OnNetworkChanged(110, 0, 0, kDefaultProbingIntervalMs);
962
963 EXPECT_EQ(30u, observer_low.last_bitrate_bps_);
964 EXPECT_EQ(30u, observer_mid.last_bitrate_bps_);
965 EXPECT_EQ(50u, observer_high.last_bitrate_bps_);
966
967 allocator_->RemoveObserver(&observer_low);
968 allocator_->RemoveObserver(&observer_mid);
969 allocator_->RemoveObserver(&observer_high);
970}
971
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000972} // namespace webrtc