blob: 00fb23694832902a3029fd9f838e07d245647c61 [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,
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +010033 DataRate::BitsPerSec(min_allocatable_rate_bps)),
Sebastian Jansson93b1ea22019-09-18 18:31:52 +020034 Field(&BitrateAllocationLimits::max_allocatable_rate,
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +010035 DataRate::BitsPerSec(max_allocatable_rate_bps)),
Sebastian Jansson93b1ea22019-09-18 18:31:52 +020036 Field(&BitrateAllocationLimits::max_padding_rate,
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +010037 DataRate::BitsPerSec(max_padding_rate_bps)));
Sebastian Jansson93b1ea22019-09-18 18:31:52 +020038}
39
40auto AllocationLimitsEq(uint32_t min_allocatable_rate_bps,
41 uint32_t max_padding_rate_bps) {
42 return AllOf(Field(&BitrateAllocationLimits::min_allocatable_rate,
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +010043 DataRate::BitsPerSec(min_allocatable_rate_bps)),
Sebastian Jansson93b1ea22019-09-18 18:31:52 +020044 Field(&BitrateAllocationLimits::max_padding_rate,
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +010045 DataRate::BitsPerSec(max_padding_rate_bps)));
Sebastian Jansson93b1ea22019-09-18 18:31:52 +020046}
47
48class MockLimitObserver : public BitrateAllocator::LimitObserver {
perkj71ee44c2016-06-15 00:47:53 -070049 public:
Danil Chapovalov9a5efe92020-05-14 22:06:18 +020050 MOCK_METHOD(void,
51 OnAllocationLimitsChanged,
52 (BitrateAllocationLimits),
53 (override));
perkj71ee44c2016-06-15 00:47:53 -070054};
55
mflodman86aabb22016-03-11 15:44:32 +010056class TestBitrateObserver : public BitrateAllocatorObserver {
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000057 public:
58 TestBitrateObserver()
mflodman48a4beb2016-07-01 13:03:59 +020059 : last_bitrate_bps_(0),
60 last_fraction_loss_(0),
61 last_rtt_ms_(0),
minyue78b4d562016-11-30 04:47:39 -080062 last_probing_interval_ms_(0),
mflodman48a4beb2016-07-01 13:03:59 +020063 protection_ratio_(0.0) {}
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000064
mflodman48a4beb2016-07-01 13:03:59 +020065 void SetBitrateProtectionRatio(double protection_ratio) {
66 protection_ratio_ = protection_ratio;
67 }
68
Sebastian Janssonc0e4d452018-10-25 15:08:32 +020069 uint32_t OnBitrateUpdated(BitrateAllocationUpdate update) override {
Sebastian Jansson13e59032018-11-21 19:13:07 +010070 last_bitrate_bps_ = update.target_bitrate.bps();
71 last_fraction_loss_ =
72 rtc::dchecked_cast<uint8_t>(update.packet_loss_ratio * 256);
73 last_rtt_ms_ = update.round_trip_time.ms();
74 last_probing_interval_ms_ = update.bwe_period.ms();
75 return update.target_bitrate.bps() * protection_ratio_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000076 }
mflodman101f2502016-06-09 17:21:19 +020077 uint32_t last_bitrate_bps_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000078 uint8_t last_fraction_loss_;
mflodman101f2502016-06-09 17:21:19 +020079 int64_t last_rtt_ms_;
minyue78b4d562016-11-30 04:47:39 -080080 int last_probing_interval_ms_;
mflodman48a4beb2016-07-01 13:03:59 +020081 double protection_ratio_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000082};
83
minyue78b4d562016-11-30 04:47:39 -080084constexpr int64_t kDefaultProbingIntervalMs = 3000;
Seth Hampson24722b32017-12-22 09:36:42 -080085const double kDefaultBitratePriority = 1.0;
Sebastian Jansson40de3cc2019-09-19 14:54:43 +020086
87TargetTransferRate CreateTargetRateMessage(uint32_t target_bitrate_bps,
88 uint8_t fraction_loss,
89 int64_t rtt_ms,
90 int64_t bwe_period_ms) {
91 TargetTransferRate msg;
92 // The timestamp is just for log output, keeping it fixed just means fewer log
93 // messages in the test.
Danil Chapovalov0c626af2020-02-10 11:16:00 +010094 msg.at_time = Timestamp::Seconds(10000);
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +010095 msg.target_rate = DataRate::BitsPerSec(target_bitrate_bps);
Sebastian Jansson40de3cc2019-09-19 14:54:43 +020096 msg.stable_target_rate = msg.target_rate;
97 msg.network_estimate.bandwidth = msg.target_rate;
98 msg.network_estimate.loss_rate_ratio = fraction_loss / 255.0;
Danil Chapovalov0c626af2020-02-10 11:16:00 +010099 msg.network_estimate.round_trip_time = TimeDelta::Millis(rtt_ms);
100 msg.network_estimate.bwe_period = TimeDelta::Millis(bwe_period_ms);
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200101 return msg;
102}
Yves Gerey665174f2018-06-19 15:03:05 +0200103} // namespace
minyue78b4d562016-11-30 04:47:39 -0800104
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000105class BitrateAllocatorTest : public ::testing::Test {
106 protected:
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200107 BitrateAllocatorTest() : allocator_(new BitrateAllocator(&limit_observer_)) {
108 allocator_->OnNetworkEstimateChanged(
109 CreateTargetRateMessage(300000u, 0, 0, kDefaultProbingIntervalMs));
Stefan Holmere5904162015-03-26 11:11:06 +0100110 }
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000111 ~BitrateAllocatorTest() {}
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200112 void AddObserver(BitrateAllocatorObserver* observer,
113 uint32_t min_bitrate_bps,
114 uint32_t max_bitrate_bps,
115 uint32_t pad_up_bitrate_bps,
116 bool enforce_min_bitrate,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200117 double bitrate_priority) {
118 allocator_->AddObserver(
Jonas Olsson0182a032019-07-09 12:31:20 +0200119 observer,
120 {min_bitrate_bps, max_bitrate_bps, pad_up_bitrate_bps,
121 /* priority_bitrate */ 0, enforce_min_bitrate, bitrate_priority});
Sebastian Jansson464a5572019-02-12 13:32:32 +0100122 }
123 MediaStreamAllocationConfig DefaultConfig() const {
124 MediaStreamAllocationConfig default_config;
125 default_config.min_bitrate_bps = 0;
126 default_config.max_bitrate_bps = 1500000;
127 default_config.pad_up_bitrate_bps = 0;
128 default_config.priority_bitrate_bps = 0;
129 default_config.enforce_min_bitrate = true;
Sebastian Jansson464a5572019-02-12 13:32:32 +0100130 default_config.bitrate_priority = kDefaultBitratePriority;
131 return default_config;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200132 }
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000133
perkj71ee44c2016-06-15 00:47:53 -0700134 NiceMock<MockLimitObserver> limit_observer_;
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200135 std::unique_ptr<BitrateAllocator> allocator_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000136};
137
Sebastian Jansson464a5572019-02-12 13:32:32 +0100138TEST_F(BitrateAllocatorTest, RespectsPriorityBitrate) {
139 TestBitrateObserver stream_a;
140 auto config_a = DefaultConfig();
141 config_a.min_bitrate_bps = 100000;
142 config_a.priority_bitrate_bps = 0;
143 allocator_->AddObserver(&stream_a, config_a);
144
145 TestBitrateObserver stream_b;
146 auto config_b = DefaultConfig();
147 config_b.min_bitrate_bps = 100000;
148 config_b.max_bitrate_bps = 300000;
149 config_b.priority_bitrate_bps = 300000;
150 allocator_->AddObserver(&stream_b, config_b);
151
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200152 allocator_->OnNetworkEstimateChanged(
153 CreateTargetRateMessage(100000, 0, 0, 0));
Sebastian Jansson464a5572019-02-12 13:32:32 +0100154 EXPECT_EQ(stream_a.last_bitrate_bps_, 100000u);
155 EXPECT_EQ(stream_b.last_bitrate_bps_, 100000u);
156
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200157 allocator_->OnNetworkEstimateChanged(
158 CreateTargetRateMessage(200000, 0, 0, 0));
Sebastian Jansson464a5572019-02-12 13:32:32 +0100159 EXPECT_EQ(stream_a.last_bitrate_bps_, 100000u);
160 EXPECT_EQ(stream_b.last_bitrate_bps_, 100000u);
161
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200162 allocator_->OnNetworkEstimateChanged(
163 CreateTargetRateMessage(300000, 0, 0, 0));
Sebastian Jansson464a5572019-02-12 13:32:32 +0100164 EXPECT_EQ(stream_a.last_bitrate_bps_, 100000u);
165 EXPECT_EQ(stream_b.last_bitrate_bps_, 200000u);
166
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200167 allocator_->OnNetworkEstimateChanged(
168 CreateTargetRateMessage(400000, 0, 0, 0));
Sebastian Jansson464a5572019-02-12 13:32:32 +0100169 EXPECT_EQ(stream_a.last_bitrate_bps_, 100000u);
170 EXPECT_EQ(stream_b.last_bitrate_bps_, 300000u);
171
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200172 allocator_->OnNetworkEstimateChanged(
173 CreateTargetRateMessage(800000, 0, 0, 0));
Sebastian Jansson464a5572019-02-12 13:32:32 +0100174 EXPECT_EQ(stream_a.last_bitrate_bps_, 500000u);
175 EXPECT_EQ(stream_b.last_bitrate_bps_, 300000u);
176}
177
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000178TEST_F(BitrateAllocatorTest, UpdatingBitrateObserver) {
179 TestBitrateObserver bitrate_observer;
perkj71ee44c2016-06-15 00:47:53 -0700180 const uint32_t kMinSendBitrateBps = 100000;
181 const uint32_t kPadUpToBitrateBps = 50000;
philipelf69e7682018-02-28 13:06:28 +0100182 const uint32_t kMaxBitrateBps = 1500000;
perkj71ee44c2016-06-15 00:47:53 -0700183
philipelf69e7682018-02-28 13:06:28 +0100184 EXPECT_CALL(limit_observer_,
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200185 OnAllocationLimitsChanged(AllocationLimitsEq(
186 kMinSendBitrateBps, kPadUpToBitrateBps, kMaxBitrateBps)));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200187 AddObserver(&bitrate_observer, kMinSendBitrateBps, kMaxBitrateBps,
Jonas Olsson0182a032019-07-09 12:31:20 +0200188 kPadUpToBitrateBps, true, kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700189 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer));
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200190 allocator_->OnNetworkEstimateChanged(
191 CreateTargetRateMessage(200000, 0, 0, kDefaultProbingIntervalMs));
perkj57c21f92016-06-17 07:27:16 -0700192 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000193
Peter Boström8e4e8b02015-09-15 15:08:03 +0200194 // TODO(pbos): Expect capping to 1.5M instead of 3M when not boosting the max
mflodman0e7e2592015-11-12 21:02:42 -0800195 // bitrate for FEC/retransmissions (see todo in BitrateAllocator).
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200196 allocator_->OnNetworkEstimateChanged(
197 CreateTargetRateMessage(4000000, 0, 0, kDefaultProbingIntervalMs));
perkj57c21f92016-06-17 07:27:16 -0700198 EXPECT_EQ(3000000, allocator_->GetStartBitrate(&bitrate_observer));
perkj71ee44c2016-06-15 00:47:53 -0700199
200 // Expect |max_padding_bitrate_bps| to change to 0 if the observer is updated.
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200201 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(
202 AllocationLimitsEq(kMinSendBitrateBps, 0)));
Jonas Olsson0182a032019-07-09 12:31:20 +0200203 AddObserver(&bitrate_observer, kMinSendBitrateBps, 4000000, 0, true,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200204 kDefaultBitratePriority);
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200205 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(
206 AllocationLimitsEq(kMinSendBitrateBps, 0)));
perkj57c21f92016-06-17 07:27:16 -0700207 EXPECT_EQ(4000000, allocator_->GetStartBitrate(&bitrate_observer));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000208
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200209 AddObserver(&bitrate_observer, kMinSendBitrateBps, kMaxBitrateBps, 0, true,
Jonas Olsson0182a032019-07-09 12:31:20 +0200210 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700211 EXPECT_EQ(3000000, allocator_->GetStartBitrate(&bitrate_observer));
mflodman101f2502016-06-09 17:21:19 +0200212 EXPECT_EQ(3000000u, bitrate_observer.last_bitrate_bps_);
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200213 allocator_->OnNetworkEstimateChanged(
214 CreateTargetRateMessage(kMaxBitrateBps, 0, 0, kDefaultProbingIntervalMs));
mflodman101f2502016-06-09 17:21:19 +0200215 EXPECT_EQ(1500000u, bitrate_observer.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000216}
217
218TEST_F(BitrateAllocatorTest, TwoBitrateObserversOneRtcpObserver) {
219 TestBitrateObserver bitrate_observer_1;
220 TestBitrateObserver bitrate_observer_2;
philipelf69e7682018-02-28 13:06:28 +0100221 const uint32_t kObs1StartBitrateBps = 100000;
222 const uint32_t kObs2StartBitrateBps = 200000;
223 const uint32_t kObs1MaxBitrateBps = 300000;
224 const uint32_t kObs2MaxBitrateBps = 300000;
225
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200226 EXPECT_CALL(limit_observer_,
227 OnAllocationLimitsChanged(AllocationLimitsEq(
228 kObs1StartBitrateBps, 0, kObs1MaxBitrateBps)));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200229 AddObserver(&bitrate_observer_1, kObs1StartBitrateBps, kObs1MaxBitrateBps, 0,
Jonas Olsson0182a032019-07-09 12:31:20 +0200230 true, kDefaultBitratePriority);
philipelf69e7682018-02-28 13:06:28 +0100231 EXPECT_EQ(static_cast<int>(kObs1MaxBitrateBps),
232 allocator_->GetStartBitrate(&bitrate_observer_1));
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200233 EXPECT_CALL(limit_observer_,
234 OnAllocationLimitsChanged(AllocationLimitsEq(
235 kObs1StartBitrateBps + kObs2StartBitrateBps, 0,
236 kObs1MaxBitrateBps + kObs2MaxBitrateBps)));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200237 AddObserver(&bitrate_observer_2, kObs2StartBitrateBps, kObs2MaxBitrateBps, 0,
Jonas Olsson0182a032019-07-09 12:31:20 +0200238 true, kDefaultBitratePriority);
philipelf69e7682018-02-28 13:06:28 +0100239 EXPECT_EQ(static_cast<int>(kObs2StartBitrateBps),
240 allocator_->GetStartBitrate(&bitrate_observer_2));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000241
mflodman48a4beb2016-07-01 13:03:59 +0200242 // Test too low start bitrate, hence lower than sum of min. Min bitrates
243 // will
244 // be allocated to all observers.
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200245 allocator_->OnNetworkEstimateChanged(CreateTargetRateMessage(
246 kObs2StartBitrateBps, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200247 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
248 EXPECT_EQ(0, bitrate_observer_1.last_fraction_loss_);
249 EXPECT_EQ(50, bitrate_observer_1.last_rtt_ms_);
250 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
251 EXPECT_EQ(0, bitrate_observer_2.last_fraction_loss_);
252 EXPECT_EQ(50, bitrate_observer_2.last_rtt_ms_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000253
mflodman48a4beb2016-07-01 13:03:59 +0200254 // Test a bitrate which should be distributed equally.
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200255 allocator_->OnNetworkEstimateChanged(
256 CreateTargetRateMessage(500000, 0, 50, kDefaultProbingIntervalMs));
philipelf69e7682018-02-28 13:06:28 +0100257 const uint32_t kBitrateToShare =
258 500000 - kObs2StartBitrateBps - kObs1StartBitrateBps;
mflodman48a4beb2016-07-01 13:03:59 +0200259 EXPECT_EQ(100000u + kBitrateToShare / 2,
260 bitrate_observer_1.last_bitrate_bps_);
261 EXPECT_EQ(200000u + kBitrateToShare / 2,
262 bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000263
mflodman48a4beb2016-07-01 13:03:59 +0200264 // Limited by 2x max bitrates since we leave room for FEC and
265 // retransmissions.
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200266 allocator_->OnNetworkEstimateChanged(
267 CreateTargetRateMessage(1500000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200268 EXPECT_EQ(600000u, bitrate_observer_1.last_bitrate_bps_);
269 EXPECT_EQ(600000u, bitrate_observer_2.last_bitrate_bps_);
perkjec81bcd2016-05-11 06:01:13 -0700270
mflodman48a4beb2016-07-01 13:03:59 +0200271 // Verify that if the bandwidth estimate is set to zero, the allocated
272 // rate is
273 // zero.
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200274 allocator_->OnNetworkEstimateChanged(
275 CreateTargetRateMessage(0, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200276 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
277 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000278}
279
perkj71ee44c2016-06-15 00:47:53 -0700280TEST_F(BitrateAllocatorTest, RemoveObserverTriggersLimitObserver) {
281 TestBitrateObserver bitrate_observer;
282 const uint32_t kMinSendBitrateBps = 100000;
283 const uint32_t kPadUpToBitrateBps = 50000;
philipelf69e7682018-02-28 13:06:28 +0100284 const uint32_t kMaxBitrateBps = 1500000;
perkj71ee44c2016-06-15 00:47:53 -0700285
philipelf69e7682018-02-28 13:06:28 +0100286 EXPECT_CALL(limit_observer_,
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200287 OnAllocationLimitsChanged(AllocationLimitsEq(
288 kMinSendBitrateBps, kPadUpToBitrateBps, kMaxBitrateBps)));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200289 AddObserver(&bitrate_observer, kMinSendBitrateBps, kMaxBitrateBps,
Jonas Olsson0182a032019-07-09 12:31:20 +0200290 kPadUpToBitrateBps, true, kDefaultBitratePriority);
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200291 EXPECT_CALL(limit_observer_,
292 OnAllocationLimitsChanged(AllocationLimitsEq(0, 0)));
perkj71ee44c2016-06-15 00:47:53 -0700293 allocator_->RemoveObserver(&bitrate_observer);
294}
295
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000296class BitrateAllocatorTestNoEnforceMin : public ::testing::Test {
297 protected:
perkj71ee44c2016-06-15 00:47:53 -0700298 BitrateAllocatorTestNoEnforceMin()
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200299 : allocator_(new BitrateAllocator(&limit_observer_)) {
300 allocator_->OnNetworkEstimateChanged(
301 CreateTargetRateMessage(300000u, 0, 0, kDefaultProbingIntervalMs));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000302 }
303 ~BitrateAllocatorTestNoEnforceMin() {}
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200304 void AddObserver(BitrateAllocatorObserver* observer,
305 uint32_t min_bitrate_bps,
306 uint32_t max_bitrate_bps,
307 uint32_t pad_up_bitrate_bps,
308 bool enforce_min_bitrate,
309 std::string track_id,
310 double bitrate_priority) {
311 allocator_->AddObserver(
Sebastian Jansson464a5572019-02-12 13:32:32 +0100312 observer, {min_bitrate_bps, max_bitrate_bps, pad_up_bitrate_bps, 0,
Jonas Olsson0182a032019-07-09 12:31:20 +0200313 enforce_min_bitrate, bitrate_priority});
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200314 }
perkj71ee44c2016-06-15 00:47:53 -0700315 NiceMock<MockLimitObserver> limit_observer_;
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200316 std::unique_ptr<BitrateAllocator> allocator_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000317};
318
mflodman101f2502016-06-09 17:21:19 +0200319// The following three tests verify enforcing a minimum bitrate works as
320// intended.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000321TEST_F(BitrateAllocatorTestNoEnforceMin, OneBitrateObserver) {
322 TestBitrateObserver bitrate_observer_1;
perkj71ee44c2016-06-15 00:47:53 -0700323 // Expect OnAllocationLimitsChanged with |min_send_bitrate_bps| = 0 since
324 // AddObserver is called with |enforce_min_bitrate| = false.
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200325 EXPECT_CALL(limit_observer_,
326 OnAllocationLimitsChanged(AllocationLimitsEq(0, 0)));
327 EXPECT_CALL(limit_observer_,
328 OnAllocationLimitsChanged(AllocationLimitsEq(0, 120000)));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200329 AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "",
330 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200331 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000332
mflodman48a4beb2016-07-01 13:03:59 +0200333 // High BWE.
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200334 allocator_->OnNetworkEstimateChanged(
335 CreateTargetRateMessage(150000, 0, 0, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200336 EXPECT_EQ(150000u, bitrate_observer_1.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000337
mflodman48a4beb2016-07-01 13:03:59 +0200338 // Low BWE.
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200339 allocator_->OnNetworkEstimateChanged(
340 CreateTargetRateMessage(10000, 0, 0, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200341 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000342
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200343 EXPECT_CALL(limit_observer_,
344 OnAllocationLimitsChanged(AllocationLimitsEq(0, 0)));
mflodman48a4beb2016-07-01 13:03:59 +0200345 allocator_->RemoveObserver(&bitrate_observer_1);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000346}
347
348TEST_F(BitrateAllocatorTestNoEnforceMin, ThreeBitrateObservers) {
349 TestBitrateObserver bitrate_observer_1;
350 TestBitrateObserver bitrate_observer_2;
351 TestBitrateObserver bitrate_observer_3;
352 // Set up the observers with min bitrates at 100000, 200000, and 300000.
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200353 AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "",
354 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700355 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
Stefan Holmere5904162015-03-26 11:11:06 +0100356
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200357 AddObserver(&bitrate_observer_2, 200000, 400000, 0, false, "",
358 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700359 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200360 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
Stefan Holmere5904162015-03-26 11:11:06 +0100361
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200362 AddObserver(&bitrate_observer_3, 300000, 400000, 0, false, "",
363 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700364 EXPECT_EQ(0, allocator_->GetStartBitrate(&bitrate_observer_3));
mflodman101f2502016-06-09 17:21:19 +0200365 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
366 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000367
mflodman101f2502016-06-09 17:21:19 +0200368 // High BWE. Make sure the controllers get a fair share of the surplus (i.e.,
369 // what is left after each controller gets its min rate).
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200370 allocator_->OnNetworkEstimateChanged(
371 CreateTargetRateMessage(690000, 0, 0, kDefaultProbingIntervalMs));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000372 // Verify that each observer gets its min rate (sum of min rates is 600000),
373 // and that the remaining 90000 is divided equally among the three.
Stefan Holmere5904162015-03-26 11:11:06 +0100374 uint32_t bitrate_to_share = 690000u - 100000u - 200000u - 300000u;
mflodman101f2502016-06-09 17:21:19 +0200375 EXPECT_EQ(100000u + bitrate_to_share / 3,
376 bitrate_observer_1.last_bitrate_bps_);
377 EXPECT_EQ(200000u + bitrate_to_share / 3,
378 bitrate_observer_2.last_bitrate_bps_);
379 EXPECT_EQ(300000u + bitrate_to_share / 3,
380 bitrate_observer_3.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000381
mflodman101f2502016-06-09 17:21:19 +0200382 // BWE below the sum of observer's min bitrate.
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200383 allocator_->OnNetworkEstimateChanged(
384 CreateTargetRateMessage(300000, 0, 0, kDefaultProbingIntervalMs));
mflodman101f2502016-06-09 17:21:19 +0200385 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_); // Min bitrate.
386 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_); // Min bitrate.
Yves Gerey665174f2018-06-19 15:03:05 +0200387 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_); // Nothing.
mflodman101f2502016-06-09 17:21:19 +0200388
389 // Increased BWE, but still below the sum of configured min bitrates for all
390 // observers and too little for observer 3. 1 and 2 will share the rest.
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200391 allocator_->OnNetworkEstimateChanged(
392 CreateTargetRateMessage(500000, 0, 0, kDefaultProbingIntervalMs));
mflodman101f2502016-06-09 17:21:19 +0200393 EXPECT_EQ(200000u, bitrate_observer_1.last_bitrate_bps_); // Min + split.
394 EXPECT_EQ(300000u, bitrate_observer_2.last_bitrate_bps_); // Min + split.
Yves Gerey665174f2018-06-19 15:03:05 +0200395 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_); // Nothing.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000396
mflodman101f2502016-06-09 17:21:19 +0200397 // Below min for all.
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200398 allocator_->OnNetworkEstimateChanged(
399 CreateTargetRateMessage(10000, 0, 0, kDefaultProbingIntervalMs));
mflodman101f2502016-06-09 17:21:19 +0200400 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
401 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
402 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000403
perkjec81bcd2016-05-11 06:01:13 -0700404 // Verify that zero estimated bandwidth, means that that all gets zero,
405 // regardless of set min bitrate.
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200406 allocator_->OnNetworkEstimateChanged(
407 CreateTargetRateMessage(0, 0, 0, kDefaultProbingIntervalMs));
mflodman101f2502016-06-09 17:21:19 +0200408 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
409 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
410 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_);
perkjec81bcd2016-05-11 06:01:13 -0700411
mflodman86aabb22016-03-11 15:44:32 +0100412 allocator_->RemoveObserver(&bitrate_observer_1);
413 allocator_->RemoveObserver(&bitrate_observer_2);
414 allocator_->RemoveObserver(&bitrate_observer_3);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000415}
416
mflodman48a4beb2016-07-01 13:03:59 +0200417TEST_F(BitrateAllocatorTestNoEnforceMin, OneBitrateObserverWithPacketLoss) {
Erik Språngd1d7b232018-12-06 17:31:25 +0100418 const uint32_t kMinBitrateBps = 100000;
419 const uint32_t kMaxBitrateBps = 400000;
420 // Hysteresis adds another 10% or 20kbps to min bitrate.
421 const uint32_t kMinStartBitrateBps =
422 kMinBitrateBps + std::max(20000u, kMinBitrateBps / 10);
423
mflodman48a4beb2016-07-01 13:03:59 +0200424 // Expect OnAllocationLimitsChanged with |min_send_bitrate_bps| = 0 since
425 // AddObserver is called with |enforce_min_bitrate| = false.
Erik Språngd1d7b232018-12-06 17:31:25 +0100426 TestBitrateObserver bitrate_observer;
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200427 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(
428 AllocationLimitsEq(0, 0, kMaxBitrateBps)));
Erik Språngd1d7b232018-12-06 17:31:25 +0100429 AddObserver(&bitrate_observer, kMinBitrateBps, kMaxBitrateBps, 0, false, "",
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200430 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200431 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer));
432
433 // High BWE.
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200434 allocator_->OnNetworkEstimateChanged(
435 CreateTargetRateMessage(150000, 0, 0, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200436 EXPECT_EQ(150000u, bitrate_observer.last_bitrate_bps_);
437
438 // Add loss and use a part of the bitrate for protection.
Erik Språngd1d7b232018-12-06 17:31:25 +0100439 const double kProtectionRatio = 0.4;
Rasmus Brandt681de202019-02-04 15:09:34 +0100440 const uint8_t fraction_loss = kProtectionRatio * 256;
Erik Språngd1d7b232018-12-06 17:31:25 +0100441 bitrate_observer.SetBitrateProtectionRatio(kProtectionRatio);
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200442 allocator_->OnNetworkEstimateChanged(CreateTargetRateMessage(
443 200000, 0, fraction_loss, kDefaultProbingIntervalMs));
Rasmus Brandt681de202019-02-04 15:09:34 +0100444 EXPECT_EQ(200000u, bitrate_observer.last_bitrate_bps_);
mflodman48a4beb2016-07-01 13:03:59 +0200445
446 // Above the min threshold, but not enough given the protection used.
Erik Språngd1d7b232018-12-06 17:31:25 +0100447 // Limits changed, as we will video is now off and we need to pad up to the
448 // start bitrate.
Erik Språngd1d7b232018-12-06 17:31:25 +0100449 // Verify the hysteresis is added for the protection.
450 const uint32_t kMinStartBitrateWithProtectionBps =
451 static_cast<uint32_t>(kMinStartBitrateBps * (1 + kProtectionRatio));
452 EXPECT_CALL(limit_observer_,
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200453 OnAllocationLimitsChanged(AllocationLimitsEq(
454 0, kMinStartBitrateWithProtectionBps, kMaxBitrateBps)));
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200455 allocator_->OnNetworkEstimateChanged(CreateTargetRateMessage(
456 kMinStartBitrateBps + 1000, 0, fraction_loss, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200457 EXPECT_EQ(0u, bitrate_observer.last_bitrate_bps_);
458
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200459 allocator_->OnNetworkEstimateChanged(
460 CreateTargetRateMessage(kMinStartBitrateWithProtectionBps - 1000, 0,
461 fraction_loss, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200462 EXPECT_EQ(0u, bitrate_observer.last_bitrate_bps_);
463
464 // Just enough to enable video again.
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200465 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(
466 AllocationLimitsEq(0, 0, kMaxBitrateBps)));
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200467 allocator_->OnNetworkEstimateChanged(
468 CreateTargetRateMessage(kMinStartBitrateWithProtectionBps, 0,
469 fraction_loss, kDefaultProbingIntervalMs));
Erik Språngd1d7b232018-12-06 17:31:25 +0100470 EXPECT_EQ(kMinStartBitrateWithProtectionBps,
471 bitrate_observer.last_bitrate_bps_);
mflodman48a4beb2016-07-01 13:03:59 +0200472
473 // Remove all protection and make sure video is not paused as earlier.
474 bitrate_observer.SetBitrateProtectionRatio(0.0);
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200475 allocator_->OnNetworkEstimateChanged(
476 CreateTargetRateMessage(kMinStartBitrateWithProtectionBps - 1000, 0, 0,
477 kDefaultProbingIntervalMs));
Erik Språngd1d7b232018-12-06 17:31:25 +0100478 EXPECT_EQ(kMinStartBitrateWithProtectionBps - 1000,
479 bitrate_observer.last_bitrate_bps_);
mflodman48a4beb2016-07-01 13:03:59 +0200480
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200481 allocator_->OnNetworkEstimateChanged(CreateTargetRateMessage(
482 kMinStartBitrateBps, 0, 0, kDefaultProbingIntervalMs));
Erik Språngd1d7b232018-12-06 17:31:25 +0100483 EXPECT_EQ(kMinStartBitrateBps, bitrate_observer.last_bitrate_bps_);
mflodman48a4beb2016-07-01 13:03:59 +0200484
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200485 EXPECT_CALL(limit_observer_,
486 OnAllocationLimitsChanged(AllocationLimitsEq(0, 0, 0)));
mflodman48a4beb2016-07-01 13:03:59 +0200487 allocator_->RemoveObserver(&bitrate_observer);
488}
489
Rasmus Brandt681de202019-02-04 15:09:34 +0100490TEST_F(BitrateAllocatorTest,
491 TotalAllocationLimitsAreUnaffectedByProtectionRatio) {
492 TestBitrateObserver bitrate_observer;
493
494 const uint32_t kMinBitrateBps = 100000;
495 const uint32_t kMaxBitrateBps = 400000;
496
497 // Register |bitrate_observer| and expect total allocation limits to change.
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200498 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(AllocationLimitsEq(
499 kMinBitrateBps, 0, kMaxBitrateBps)))
Rasmus Brandt681de202019-02-04 15:09:34 +0100500 .Times(1);
Sebastian Jansson464a5572019-02-12 13:32:32 +0100501 MediaStreamAllocationConfig allocation_config = DefaultConfig();
502 allocation_config.min_bitrate_bps = kMinBitrateBps;
503 allocation_config.max_bitrate_bps = kMaxBitrateBps;
504 allocator_->AddObserver(&bitrate_observer, allocation_config);
Rasmus Brandt681de202019-02-04 15:09:34 +0100505
506 // Observer uses 20% of it's allocated bitrate for protection.
507 bitrate_observer.SetBitrateProtectionRatio(/*protection_ratio=*/0.2);
508 // Total allocation limits are unaffected by the protection rate change.
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200509 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(_)).Times(0);
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200510 allocator_->OnNetworkEstimateChanged(
511 CreateTargetRateMessage(200000u, 0, 100, kDefaultProbingIntervalMs));
Rasmus Brandt681de202019-02-04 15:09:34 +0100512
513 // Observer uses 0% of it's allocated bitrate for protection.
514 bitrate_observer.SetBitrateProtectionRatio(/*protection_ratio=*/0.0);
515 // Total allocation limits are unaffected by the protection rate change.
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200516 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(_)).Times(0);
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200517 allocator_->OnNetworkEstimateChanged(
518 CreateTargetRateMessage(200000u, 0, 100, kDefaultProbingIntervalMs));
Rasmus Brandt681de202019-02-04 15:09:34 +0100519
520 // Observer again uses 20% of it's allocated bitrate for protection.
521 bitrate_observer.SetBitrateProtectionRatio(/*protection_ratio=*/0.2);
522 // Total allocation limits are unaffected by the protection rate change.
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200523 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(_)).Times(0);
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200524 allocator_->OnNetworkEstimateChanged(
525 CreateTargetRateMessage(200000u, 0, 100, kDefaultProbingIntervalMs));
Rasmus Brandt681de202019-02-04 15:09:34 +0100526}
527
mflodman48a4beb2016-07-01 13:03:59 +0200528TEST_F(BitrateAllocatorTestNoEnforceMin, TwoBitrateObserverWithPacketLoss) {
529 TestBitrateObserver bitrate_observer_1;
530 TestBitrateObserver bitrate_observer_2;
531
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200532 AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "",
533 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200534 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200535 AddObserver(&bitrate_observer_2, 200000, 400000, 0, false, "",
536 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200537 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
538 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
539
540 // Enough bitrate for both.
541 bitrate_observer_2.SetBitrateProtectionRatio(0.5);
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200542 allocator_->OnNetworkEstimateChanged(
543 CreateTargetRateMessage(300000, 0, 0, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200544 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
545 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
546
547 // Above min for observer 2, but too little given the protection used.
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200548 allocator_->OnNetworkEstimateChanged(
549 CreateTargetRateMessage(330000, 0, 0, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200550 EXPECT_EQ(330000u, bitrate_observer_1.last_bitrate_bps_);
551 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
552
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200553 allocator_->OnNetworkEstimateChanged(
554 CreateTargetRateMessage(100000, 0, 0, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200555 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
556 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
557
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200558 allocator_->OnNetworkEstimateChanged(
559 CreateTargetRateMessage(99999, 0, 0, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200560 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
561 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
562
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200563 allocator_->OnNetworkEstimateChanged(
564 CreateTargetRateMessage(119000, 0, 0, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200565 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
566 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
567
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200568 allocator_->OnNetworkEstimateChanged(
569 CreateTargetRateMessage(120000, 0, 0, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200570 EXPECT_EQ(120000u, bitrate_observer_1.last_bitrate_bps_);
571 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
572
573 // Verify the protection is accounted for before resuming observer 2.
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200574 allocator_->OnNetworkEstimateChanged(
575 CreateTargetRateMessage(429000, 0, 0, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200576 EXPECT_EQ(400000u, bitrate_observer_1.last_bitrate_bps_);
577 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
578
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200579 allocator_->OnNetworkEstimateChanged(
580 CreateTargetRateMessage(430000, 0, 0, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200581 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
582 EXPECT_EQ(330000u, bitrate_observer_2.last_bitrate_bps_);
583
584 allocator_->RemoveObserver(&bitrate_observer_1);
585 allocator_->RemoveObserver(&bitrate_observer_2);
586}
587
mflodman101f2502016-06-09 17:21:19 +0200588TEST_F(BitrateAllocatorTest, ThreeBitrateObserversLowBweEnforceMin) {
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000589 TestBitrateObserver bitrate_observer_1;
590 TestBitrateObserver bitrate_observer_2;
591 TestBitrateObserver bitrate_observer_3;
Stefan Holmere5904162015-03-26 11:11:06 +0100592
Jonas Olsson0182a032019-07-09 12:31:20 +0200593 AddObserver(&bitrate_observer_1, 100000, 400000, 0, true,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200594 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700595 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
596
Jonas Olsson0182a032019-07-09 12:31:20 +0200597 AddObserver(&bitrate_observer_2, 200000, 400000, 0, true,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200598 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700599 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200600 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
Stefan Holmere5904162015-03-26 11:11:06 +0100601
Jonas Olsson0182a032019-07-09 12:31:20 +0200602 AddObserver(&bitrate_observer_3, 300000, 400000, 0, true,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200603 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200604 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_3));
605 EXPECT_EQ(100000, static_cast<int>(bitrate_observer_1.last_bitrate_bps_));
606 EXPECT_EQ(200000, static_cast<int>(bitrate_observer_2.last_bitrate_bps_));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000607
mflodman48a4beb2016-07-01 13:03:59 +0200608 // Low BWE. Verify that all observers still get their respective min
609 // bitrate.
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200610 allocator_->OnNetworkEstimateChanged(
611 CreateTargetRateMessage(1000, 0, 0, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200612 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_); // Min cap.
613 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_); // Min cap.
614 EXPECT_EQ(300000u, bitrate_observer_3.last_bitrate_bps_); // Min cap.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000615
mflodman48a4beb2016-07-01 13:03:59 +0200616 allocator_->RemoveObserver(&bitrate_observer_1);
617 allocator_->RemoveObserver(&bitrate_observer_2);
618 allocator_->RemoveObserver(&bitrate_observer_3);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000619}
perkjfea93092016-05-14 00:58:48 -0700620
621TEST_F(BitrateAllocatorTest, AddObserverWhileNetworkDown) {
622 TestBitrateObserver bitrate_observer_1;
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200623 EXPECT_CALL(limit_observer_,
624 OnAllocationLimitsChanged(AllocationLimitsEq(50000, 0)));
perkj57c21f92016-06-17 07:27:16 -0700625
Jonas Olsson0182a032019-07-09 12:31:20 +0200626 AddObserver(&bitrate_observer_1, 50000, 400000, 0, true,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200627 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700628 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
perkjfea93092016-05-14 00:58:48 -0700629
630 // Set network down, ie, no available bitrate.
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200631 allocator_->OnNetworkEstimateChanged(
632 CreateTargetRateMessage(0, 0, 0, kDefaultProbingIntervalMs));
perkjfea93092016-05-14 00:58:48 -0700633
mflodman101f2502016-06-09 17:21:19 +0200634 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
perkjfea93092016-05-14 00:58:48 -0700635
636 TestBitrateObserver bitrate_observer_2;
perkj71ee44c2016-06-15 00:47:53 -0700637 // Adding an observer while the network is down should not affect the limits.
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200638 EXPECT_CALL(limit_observer_,
639 OnAllocationLimitsChanged(AllocationLimitsEq(50000 + 50000, 0)));
Jonas Olsson0182a032019-07-09 12:31:20 +0200640 AddObserver(&bitrate_observer_2, 50000, 400000, 0, true,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200641 kDefaultBitratePriority);
perkjfea93092016-05-14 00:58:48 -0700642
643 // Expect the start_bitrate to be set as if the network was still up but that
644 // the new observer have been notified that the network is down.
perkj57c21f92016-06-17 07:27:16 -0700645 EXPECT_EQ(300000 / 2, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200646 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
647 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
perkjfea93092016-05-14 00:58:48 -0700648
649 // Set network back up.
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200650 allocator_->OnNetworkEstimateChanged(
651 CreateTargetRateMessage(1500000, 0, 50, kDefaultProbingIntervalMs));
mflodman101f2502016-06-09 17:21:19 +0200652 EXPECT_EQ(750000u, bitrate_observer_1.last_bitrate_bps_);
653 EXPECT_EQ(750000u, bitrate_observer_2.last_bitrate_bps_);
654}
655
656TEST_F(BitrateAllocatorTest, MixedEnforecedConfigs) {
657 TestBitrateObserver enforced_observer;
Jonas Olsson0182a032019-07-09 12:31:20 +0200658 AddObserver(&enforced_observer, 6000, 30000, 0, true,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200659 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200660 EXPECT_EQ(60000, allocator_->GetStartBitrate(&enforced_observer));
mflodman101f2502016-06-09 17:21:19 +0200661
mflodman48a4beb2016-07-01 13:03:59 +0200662 TestBitrateObserver not_enforced_observer;
Jonas Olsson0182a032019-07-09 12:31:20 +0200663 AddObserver(&not_enforced_observer, 30000, 2500000, 0, false,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200664 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200665 EXPECT_EQ(270000, allocator_->GetStartBitrate(&not_enforced_observer));
666 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200667
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200668 allocator_->OnNetworkEstimateChanged(
669 CreateTargetRateMessage(36000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200670 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
671 EXPECT_EQ(30000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200672
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200673 allocator_->OnNetworkEstimateChanged(
674 CreateTargetRateMessage(35000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200675 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
676 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200677
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200678 allocator_->OnNetworkEstimateChanged(
679 CreateTargetRateMessage(5000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200680 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
681 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200682
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200683 allocator_->OnNetworkEstimateChanged(
684 CreateTargetRateMessage(36000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200685 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
686 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200687
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200688 allocator_->OnNetworkEstimateChanged(
689 CreateTargetRateMessage(55000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200690 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
691 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200692
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200693 allocator_->OnNetworkEstimateChanged(
694 CreateTargetRateMessage(56000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200695 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
696 EXPECT_EQ(50000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200697
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200698 allocator_->OnNetworkEstimateChanged(
699 CreateTargetRateMessage(56000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200700 EXPECT_EQ(16000u, enforced_observer.last_bitrate_bps_);
701 EXPECT_EQ(40000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200702
mflodman48a4beb2016-07-01 13:03:59 +0200703 allocator_->RemoveObserver(&enforced_observer);
704 allocator_->RemoveObserver(&not_enforced_observer);
mflodman101f2502016-06-09 17:21:19 +0200705}
706
707TEST_F(BitrateAllocatorTest, AvoidToggleAbsolute) {
708 TestBitrateObserver observer;
Jonas Olsson0182a032019-07-09 12:31:20 +0200709 AddObserver(&observer, 30000, 300000, 0, false, kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200710 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
mflodman101f2502016-06-09 17:21:19 +0200711
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200712 allocator_->OnNetworkEstimateChanged(
713 CreateTargetRateMessage(30000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200714 EXPECT_EQ(30000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200715
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200716 allocator_->OnNetworkEstimateChanged(
717 CreateTargetRateMessage(20000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200718 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200719
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200720 allocator_->OnNetworkEstimateChanged(
721 CreateTargetRateMessage(30000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200722 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200723
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200724 allocator_->OnNetworkEstimateChanged(
725 CreateTargetRateMessage(49000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200726 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200727
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200728 allocator_->OnNetworkEstimateChanged(
729 CreateTargetRateMessage(50000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200730 EXPECT_EQ(50000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200731
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200732 allocator_->OnNetworkEstimateChanged(
733 CreateTargetRateMessage(30000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200734 EXPECT_EQ(30000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200735
mflodman48a4beb2016-07-01 13:03:59 +0200736 allocator_->RemoveObserver(&observer);
mflodman101f2502016-06-09 17:21:19 +0200737}
738
739TEST_F(BitrateAllocatorTest, AvoidTogglePercent) {
740 TestBitrateObserver observer;
Jonas Olsson0182a032019-07-09 12:31:20 +0200741 AddObserver(&observer, 300000, 600000, 0, false, kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200742 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
mflodman101f2502016-06-09 17:21:19 +0200743
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200744 allocator_->OnNetworkEstimateChanged(
745 CreateTargetRateMessage(300000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200746 EXPECT_EQ(300000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200747
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200748 allocator_->OnNetworkEstimateChanged(
749 CreateTargetRateMessage(200000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200750 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200751
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200752 allocator_->OnNetworkEstimateChanged(
753 CreateTargetRateMessage(300000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200754 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200755
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200756 allocator_->OnNetworkEstimateChanged(
757 CreateTargetRateMessage(329000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200758 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200759
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200760 allocator_->OnNetworkEstimateChanged(
761 CreateTargetRateMessage(330000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200762 EXPECT_EQ(330000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200763
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200764 allocator_->OnNetworkEstimateChanged(
765 CreateTargetRateMessage(300000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200766 EXPECT_EQ(300000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200767
mflodman48a4beb2016-07-01 13:03:59 +0200768 allocator_->RemoveObserver(&observer);
perkjfea93092016-05-14 00:58:48 -0700769}
770
minyue78b4d562016-11-30 04:47:39 -0800771TEST_F(BitrateAllocatorTest, PassProbingInterval) {
772 TestBitrateObserver observer;
Jonas Olsson0182a032019-07-09 12:31:20 +0200773 AddObserver(&observer, 300000, 600000, 0, false, kDefaultBitratePriority);
minyue78b4d562016-11-30 04:47:39 -0800774 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
775
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200776 allocator_->OnNetworkEstimateChanged(
777 CreateTargetRateMessage(300000, 0, 50, 5000));
minyue78b4d562016-11-30 04:47:39 -0800778 EXPECT_EQ(5000, observer.last_probing_interval_ms_);
779
780 allocator_->RemoveObserver(&observer);
781}
782
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800783TEST_F(BitrateAllocatorTest, PriorityRateOneObserverBasic) {
784 TestBitrateObserver observer;
785 const uint32_t kMinSendBitrateBps = 10;
786 const uint32_t kMaxSendBitrateBps = 60;
787 const uint32_t kNetworkBandwidthBps = 30;
788
Jonas Olsson0182a032019-07-09 12:31:20 +0200789 AddObserver(&observer, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true, 2.0);
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200790 allocator_->OnNetworkEstimateChanged(CreateTargetRateMessage(
791 kNetworkBandwidthBps, 0, 0, kDefaultProbingIntervalMs));
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800792
793 EXPECT_EQ(kNetworkBandwidthBps, observer.last_bitrate_bps_);
794
795 allocator_->RemoveObserver(&observer);
796}
797
798// Tests that two observers with the same bitrate priority are allocated
799// their bitrate evenly.
800TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversBasic) {
801 TestBitrateObserver observer_low_1;
802 TestBitrateObserver observer_low_2;
803 const uint32_t kMinSendBitrateBps = 10;
804 const uint32_t kMaxSendBitrateBps = 60;
805 const uint32_t kNetworkBandwidthBps = 60;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200806 AddObserver(&observer_low_1, kMinSendBitrateBps, kMaxSendBitrateBps, 0, false,
Jonas Olsson0182a032019-07-09 12:31:20 +0200807 2.0);
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200808 AddObserver(&observer_low_2, kMinSendBitrateBps, kMaxSendBitrateBps, 0, false,
Jonas Olsson0182a032019-07-09 12:31:20 +0200809 2.0);
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200810 allocator_->OnNetworkEstimateChanged(CreateTargetRateMessage(
811 kNetworkBandwidthBps, 0, 0, kDefaultProbingIntervalMs));
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800812
813 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_1.last_bitrate_bps_);
814 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_2.last_bitrate_bps_);
815
816 allocator_->RemoveObserver(&observer_low_1);
817 allocator_->RemoveObserver(&observer_low_2);
818}
819
820// Tests that there is no difference in functionality when the min bitrate is
821// enforced.
822TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversBasicMinEnforced) {
823 TestBitrateObserver observer_low_1;
824 TestBitrateObserver observer_low_2;
825 const uint32_t kMinSendBitrateBps = 0;
826 const uint32_t kMaxSendBitrateBps = 60;
827 const uint32_t kNetworkBandwidthBps = 60;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200828 AddObserver(&observer_low_1, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
Jonas Olsson0182a032019-07-09 12:31:20 +0200829 2.0);
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200830 AddObserver(&observer_low_2, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
Jonas Olsson0182a032019-07-09 12:31:20 +0200831 2.0);
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200832 allocator_->OnNetworkEstimateChanged(CreateTargetRateMessage(
833 kNetworkBandwidthBps, 0, 0, kDefaultProbingIntervalMs));
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800834
835 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_1.last_bitrate_bps_);
836 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_2.last_bitrate_bps_);
837
838 allocator_->RemoveObserver(&observer_low_1);
839 allocator_->RemoveObserver(&observer_low_2);
840}
841
842// Tests that if the available bandwidth is the sum of the max bitrate
843// of all observers, they will be allocated their max.
844TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversBothAllocatedMax) {
845 TestBitrateObserver observer_low;
846 TestBitrateObserver observer_mid;
847 const uint32_t kMinSendBitrateBps = 0;
848 const uint32_t kMaxSendBitrateBps = 60;
849 const uint32_t kNetworkBandwidthBps = kMaxSendBitrateBps * 2;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200850 AddObserver(&observer_low, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
Jonas Olsson0182a032019-07-09 12:31:20 +0200851 2.0);
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200852 AddObserver(&observer_mid, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
Jonas Olsson0182a032019-07-09 12:31:20 +0200853 4.0);
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200854 allocator_->OnNetworkEstimateChanged(CreateTargetRateMessage(
855 kNetworkBandwidthBps, 0, 0, kDefaultProbingIntervalMs));
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800856
857 EXPECT_EQ(kMaxSendBitrateBps, observer_low.last_bitrate_bps_);
858 EXPECT_EQ(kMaxSendBitrateBps, observer_mid.last_bitrate_bps_);
859
860 allocator_->RemoveObserver(&observer_low);
861 allocator_->RemoveObserver(&observer_mid);
862}
863
864// Tests that after a higher bitrate priority observer has been allocated its
865// max bitrate the lower priority observer will then be allocated the remaining
866// bitrate.
867TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversOneAllocatedToMax) {
868 TestBitrateObserver observer_low;
869 TestBitrateObserver observer_mid;
Jonas Olsson0182a032019-07-09 12:31:20 +0200870 AddObserver(&observer_low, 10, 50, 0, false, 2.0);
871 AddObserver(&observer_mid, 10, 50, 0, false, 4.0);
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200872 allocator_->OnNetworkEstimateChanged(
873 CreateTargetRateMessage(90, 0, 0, kDefaultProbingIntervalMs));
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800874
875 EXPECT_EQ(40u, observer_low.last_bitrate_bps_);
876 EXPECT_EQ(50u, observer_mid.last_bitrate_bps_);
877
878 allocator_->RemoveObserver(&observer_low);
879 allocator_->RemoveObserver(&observer_mid);
880}
881
882// Tests that three observers with three different bitrate priorities will all
883// be allocated bitrate according to their relative bitrate priority.
884TEST_F(BitrateAllocatorTest,
885 PriorityRateThreeObserversAllocatedRelativeAmounts) {
886 TestBitrateObserver observer_low;
887 TestBitrateObserver observer_mid;
888 TestBitrateObserver observer_high;
889 const uint32_t kMaxBitrate = 100;
890 // Not enough bandwidth to fill any observer's max bitrate.
891 const uint32_t kNetworkBandwidthBps = 70;
892 const double kLowBitratePriority = 2.0;
893 const double kMidBitratePriority = 4.0;
894 const double kHighBitratePriority = 8.0;
895 const double kTotalBitratePriority =
896 kLowBitratePriority + kMidBitratePriority + kHighBitratePriority;
Jonas Olsson0182a032019-07-09 12:31:20 +0200897 AddObserver(&observer_low, 0, kMaxBitrate, 0, false, kLowBitratePriority);
898 AddObserver(&observer_mid, 0, kMaxBitrate, 0, false, kMidBitratePriority);
899 AddObserver(&observer_high, 0, kMaxBitrate, 0, false, kHighBitratePriority);
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200900 allocator_->OnNetworkEstimateChanged(CreateTargetRateMessage(
901 kNetworkBandwidthBps, 0, 0, kDefaultProbingIntervalMs));
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800902
903 const double kLowFractionAllocated =
904 kLowBitratePriority / kTotalBitratePriority;
905 const double kMidFractionAllocated =
906 kMidBitratePriority / kTotalBitratePriority;
907 const double kHighFractionAllocated =
908 kHighBitratePriority / kTotalBitratePriority;
909 EXPECT_EQ(kLowFractionAllocated * kNetworkBandwidthBps,
910 observer_low.last_bitrate_bps_);
911 EXPECT_EQ(kMidFractionAllocated * kNetworkBandwidthBps,
912 observer_mid.last_bitrate_bps_);
913 EXPECT_EQ(kHighFractionAllocated * kNetworkBandwidthBps,
914 observer_high.last_bitrate_bps_);
915
916 allocator_->RemoveObserver(&observer_low);
917 allocator_->RemoveObserver(&observer_mid);
918 allocator_->RemoveObserver(&observer_high);
919}
920
921// Tests that after the high priority observer has been allocated its maximum
922// bitrate, the other two observers are still allocated bitrate according to
923// their relative bitrate priority.
924TEST_F(BitrateAllocatorTest, PriorityRateThreeObserversHighAllocatedToMax) {
925 TestBitrateObserver observer_low;
926 const double kLowBitratePriority = 2.0;
927 TestBitrateObserver observer_mid;
928 const double kMidBitratePriority = 4.0;
929 TestBitrateObserver observer_high;
930 const double kHighBitratePriority = 8.0;
931
932 const uint32_t kAvailableBitrate = 90;
933 const uint32_t kMaxBitrate = 40;
934 const uint32_t kMinBitrate = 10;
935 // Remaining bitrate after allocating to all mins and knowing that the high
936 // priority observer will have its max bitrate allocated.
937 const uint32_t kRemainingBitrate =
938 kAvailableBitrate - kMaxBitrate - (2 * kMinBitrate);
939
Jonas Olsson0182a032019-07-09 12:31:20 +0200940 AddObserver(&observer_low, kMinBitrate, kMaxBitrate, 0, false,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200941 kLowBitratePriority);
Jonas Olsson0182a032019-07-09 12:31:20 +0200942 AddObserver(&observer_mid, kMinBitrate, kMaxBitrate, 0, false,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200943 kMidBitratePriority);
Jonas Olsson0182a032019-07-09 12:31:20 +0200944 AddObserver(&observer_high, kMinBitrate, kMaxBitrate, 0, false,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200945 kHighBitratePriority);
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200946 allocator_->OnNetworkEstimateChanged(CreateTargetRateMessage(
947 kAvailableBitrate, 0, 0, kDefaultProbingIntervalMs));
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800948
949 const double kLowFractionAllocated =
950 kLowBitratePriority / (kLowBitratePriority + kMidBitratePriority);
951 const double kMidFractionAllocated =
952 kMidBitratePriority / (kLowBitratePriority + kMidBitratePriority);
953 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kLowFractionAllocated),
954 observer_low.last_bitrate_bps_);
955 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kMidFractionAllocated),
956 observer_mid.last_bitrate_bps_);
957 EXPECT_EQ(40u, observer_high.last_bitrate_bps_);
958
959 allocator_->RemoveObserver(&observer_low);
960 allocator_->RemoveObserver(&observer_mid);
961 allocator_->RemoveObserver(&observer_high);
962}
963
964// Tests that after the low priority observer has been allocated its maximum
965// bitrate, the other two observers are still allocated bitrate according to
966// their relative bitrate priority.
967TEST_F(BitrateAllocatorTest, PriorityRateThreeObserversLowAllocatedToMax) {
968 TestBitrateObserver observer_low;
969 const double kLowBitratePriority = 2.0;
970 const uint32_t kLowMaxBitrate = 10;
971 TestBitrateObserver observer_mid;
972 const double kMidBitratePriority = 4.0;
973 TestBitrateObserver observer_high;
974 const double kHighBitratePriority = 8.0;
975
976 const uint32_t kMinBitrate = 0;
977 const uint32_t kMaxBitrate = 60;
978 const uint32_t kAvailableBitrate = 100;
979 // Remaining bitrate knowing that the low priority observer is allocated its
980 // max bitrate. We know this because it is allocated 2.0/14.0 (1/7) of the
981 // available bitrate, so 70 bps would be sufficient network bandwidth.
982 const uint32_t kRemainingBitrate = kAvailableBitrate - kLowMaxBitrate;
983
Jonas Olsson0182a032019-07-09 12:31:20 +0200984 AddObserver(&observer_low, kMinBitrate, kLowMaxBitrate, 0, false,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200985 kLowBitratePriority);
Jonas Olsson0182a032019-07-09 12:31:20 +0200986 AddObserver(&observer_mid, kMinBitrate, kMaxBitrate, 0, false,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200987 kMidBitratePriority);
Jonas Olsson0182a032019-07-09 12:31:20 +0200988 AddObserver(&observer_high, kMinBitrate, kMaxBitrate, 0, false,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200989 kHighBitratePriority);
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200990 allocator_->OnNetworkEstimateChanged(CreateTargetRateMessage(
991 kAvailableBitrate, 0, 0, kDefaultProbingIntervalMs));
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800992
993 const double kMidFractionAllocated =
994 kMidBitratePriority / (kMidBitratePriority + kHighBitratePriority);
995 const double kHighFractionAllocated =
996 kHighBitratePriority / (kMidBitratePriority + kHighBitratePriority);
997 EXPECT_EQ(kLowMaxBitrate, observer_low.last_bitrate_bps_);
998 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kMidFractionAllocated),
999 observer_mid.last_bitrate_bps_);
1000 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kHighFractionAllocated),
1001 observer_high.last_bitrate_bps_);
1002
1003 allocator_->RemoveObserver(&observer_low);
1004 allocator_->RemoveObserver(&observer_mid);
1005 allocator_->RemoveObserver(&observer_high);
1006}
1007
1008// Tests that after two observers are allocated bitrate to their max, the
1009// the remaining observer is allocated what's left appropriately. This test
1010// handles an edge case where the medium and high observer reach their
1011// "relative" max allocation at the same time. The high has 40 to allocate
1012// above its min, and the mid has 20 to allocate above its min, which scaled
1013// by their bitrate priority is the same for each.
1014TEST_F(BitrateAllocatorTest, PriorityRateThreeObserversTwoAllocatedToMax) {
1015 TestBitrateObserver observer_low;
1016 TestBitrateObserver observer_mid;
1017 TestBitrateObserver observer_high;
Jonas Olsson0182a032019-07-09 12:31:20 +02001018 AddObserver(&observer_low, 10, 40, 0, false, 2.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -08001019 // Scaled allocation above the min allocation is the same for these two,
1020 // meaning they will get allocated their max at the same time.
1021 // Scaled (target allocation) = (max - min) / bitrate priority
Jonas Olsson0182a032019-07-09 12:31:20 +02001022 AddObserver(&observer_mid, 10, 30, 0, false, 4.0);
1023 AddObserver(&observer_high, 10, 50, 0, false, 8.0);
Sebastian Jansson40de3cc2019-09-19 14:54:43 +02001024 allocator_->OnNetworkEstimateChanged(
1025 CreateTargetRateMessage(110, 0, 0, kDefaultProbingIntervalMs));
Seth Hampsonfe73d6a2017-11-14 10:49:06 -08001026
1027 EXPECT_EQ(30u, observer_low.last_bitrate_bps_);
1028 EXPECT_EQ(30u, observer_mid.last_bitrate_bps_);
1029 EXPECT_EQ(50u, observer_high.last_bitrate_bps_);
1030
1031 allocator_->RemoveObserver(&observer_low);
1032 allocator_->RemoveObserver(&observer_mid);
1033 allocator_->RemoveObserver(&observer_high);
1034}
1035
stefan@webrtc.org792f1a12015-03-04 12:24:26 +00001036} // namespace webrtc