blob: 69bdd83397d9cade9c6df739fe5e2cdb80da3c76 [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
Ali Tofigh641a1b12022-05-17 11:48:46 +020017#include "absl/strings/string_view.h"
Sebastian Jansson4ad51d82019-06-11 11:24:40 +020018#include "system_wrappers/include/clock.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020019#include "test/gmock.h"
20#include "test/gtest.h"
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000021
Seth Hampsonfe73d6a2017-11-14 10:49:06 -080022using ::testing::_;
Sebastian Jansson93b1ea22019-09-18 18:31:52 +020023using ::testing::AllOf;
24using ::testing::Field;
Rasmus Brandt681de202019-02-04 15:09:34 +010025using ::testing::NiceMock;
perkj71ee44c2016-06-15 00:47:53 -070026
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000027namespace webrtc {
28
Sebastian Jansson40de3cc2019-09-19 14:54:43 +020029namespace {
Sebastian Jansson93b1ea22019-09-18 18:31:52 +020030auto AllocationLimitsEq(uint32_t min_allocatable_rate_bps,
31 uint32_t max_padding_rate_bps,
32 uint32_t max_allocatable_rate_bps) {
33 return AllOf(Field(&BitrateAllocationLimits::min_allocatable_rate,
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +010034 DataRate::BitsPerSec(min_allocatable_rate_bps)),
Sebastian Jansson93b1ea22019-09-18 18:31:52 +020035 Field(&BitrateAllocationLimits::max_allocatable_rate,
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +010036 DataRate::BitsPerSec(max_allocatable_rate_bps)),
Sebastian Jansson93b1ea22019-09-18 18:31:52 +020037 Field(&BitrateAllocationLimits::max_padding_rate,
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +010038 DataRate::BitsPerSec(max_padding_rate_bps)));
Sebastian Jansson93b1ea22019-09-18 18:31:52 +020039}
40
41auto AllocationLimitsEq(uint32_t min_allocatable_rate_bps,
42 uint32_t max_padding_rate_bps) {
43 return AllOf(Field(&BitrateAllocationLimits::min_allocatable_rate,
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +010044 DataRate::BitsPerSec(min_allocatable_rate_bps)),
Sebastian Jansson93b1ea22019-09-18 18:31:52 +020045 Field(&BitrateAllocationLimits::max_padding_rate,
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +010046 DataRate::BitsPerSec(max_padding_rate_bps)));
Sebastian Jansson93b1ea22019-09-18 18:31:52 +020047}
48
49class MockLimitObserver : public BitrateAllocator::LimitObserver {
perkj71ee44c2016-06-15 00:47:53 -070050 public:
Danil Chapovalov9a5efe92020-05-14 22:06:18 +020051 MOCK_METHOD(void,
52 OnAllocationLimitsChanged,
53 (BitrateAllocationLimits),
54 (override));
perkj71ee44c2016-06-15 00:47:53 -070055};
56
mflodman86aabb22016-03-11 15:44:32 +010057class TestBitrateObserver : public BitrateAllocatorObserver {
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000058 public:
59 TestBitrateObserver()
mflodman48a4beb2016-07-01 13:03:59 +020060 : last_bitrate_bps_(0),
61 last_fraction_loss_(0),
62 last_rtt_ms_(0),
minyue78b4d562016-11-30 04:47:39 -080063 last_probing_interval_ms_(0),
mflodman48a4beb2016-07-01 13:03:59 +020064 protection_ratio_(0.0) {}
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000065
mflodman48a4beb2016-07-01 13:03:59 +020066 void SetBitrateProtectionRatio(double protection_ratio) {
67 protection_ratio_ = protection_ratio;
68 }
69
Sebastian Janssonc0e4d452018-10-25 15:08:32 +020070 uint32_t OnBitrateUpdated(BitrateAllocationUpdate update) override {
Sebastian Jansson13e59032018-11-21 19:13:07 +010071 last_bitrate_bps_ = update.target_bitrate.bps();
72 last_fraction_loss_ =
73 rtc::dchecked_cast<uint8_t>(update.packet_loss_ratio * 256);
74 last_rtt_ms_ = update.round_trip_time.ms();
75 last_probing_interval_ms_ = update.bwe_period.ms();
76 return update.target_bitrate.bps() * protection_ratio_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000077 }
mflodman101f2502016-06-09 17:21:19 +020078 uint32_t last_bitrate_bps_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000079 uint8_t last_fraction_loss_;
mflodman101f2502016-06-09 17:21:19 +020080 int64_t last_rtt_ms_;
minyue78b4d562016-11-30 04:47:39 -080081 int last_probing_interval_ms_;
mflodman48a4beb2016-07-01 13:03:59 +020082 double protection_ratio_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000083};
84
minyue78b4d562016-11-30 04:47:39 -080085constexpr int64_t kDefaultProbingIntervalMs = 3000;
Seth Hampson24722b32017-12-22 09:36:42 -080086const double kDefaultBitratePriority = 1.0;
Sebastian Jansson40de3cc2019-09-19 14:54:43 +020087
88TargetTransferRate CreateTargetRateMessage(uint32_t target_bitrate_bps,
89 uint8_t fraction_loss,
90 int64_t rtt_ms,
91 int64_t bwe_period_ms) {
92 TargetTransferRate msg;
93 // The timestamp is just for log output, keeping it fixed just means fewer log
94 // messages in the test.
Danil Chapovalov0c626af2020-02-10 11:16:00 +010095 msg.at_time = Timestamp::Seconds(10000);
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +010096 msg.target_rate = DataRate::BitsPerSec(target_bitrate_bps);
Sebastian Jansson40de3cc2019-09-19 14:54:43 +020097 msg.stable_target_rate = msg.target_rate;
98 msg.network_estimate.bandwidth = msg.target_rate;
99 msg.network_estimate.loss_rate_ratio = fraction_loss / 255.0;
Danil Chapovalov0c626af2020-02-10 11:16:00 +0100100 msg.network_estimate.round_trip_time = TimeDelta::Millis(rtt_ms);
101 msg.network_estimate.bwe_period = TimeDelta::Millis(bwe_period_ms);
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200102 return msg;
103}
Yves Gerey665174f2018-06-19 15:03:05 +0200104} // namespace
minyue78b4d562016-11-30 04:47:39 -0800105
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000106class BitrateAllocatorTest : public ::testing::Test {
107 protected:
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200108 BitrateAllocatorTest() : allocator_(new BitrateAllocator(&limit_observer_)) {
109 allocator_->OnNetworkEstimateChanged(
110 CreateTargetRateMessage(300000u, 0, 0, kDefaultProbingIntervalMs));
Stefan Holmere5904162015-03-26 11:11:06 +0100111 }
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000112 ~BitrateAllocatorTest() {}
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200113 void AddObserver(BitrateAllocatorObserver* observer,
114 uint32_t min_bitrate_bps,
115 uint32_t max_bitrate_bps,
116 uint32_t pad_up_bitrate_bps,
117 bool enforce_min_bitrate,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200118 double bitrate_priority) {
119 allocator_->AddObserver(
Jonas Olsson0182a032019-07-09 12:31:20 +0200120 observer,
121 {min_bitrate_bps, max_bitrate_bps, pad_up_bitrate_bps,
122 /* priority_bitrate */ 0, enforce_min_bitrate, bitrate_priority});
Sebastian Jansson464a5572019-02-12 13:32:32 +0100123 }
124 MediaStreamAllocationConfig DefaultConfig() const {
125 MediaStreamAllocationConfig default_config;
126 default_config.min_bitrate_bps = 0;
127 default_config.max_bitrate_bps = 1500000;
128 default_config.pad_up_bitrate_bps = 0;
129 default_config.priority_bitrate_bps = 0;
130 default_config.enforce_min_bitrate = true;
Sebastian Jansson464a5572019-02-12 13:32:32 +0100131 default_config.bitrate_priority = kDefaultBitratePriority;
132 return default_config;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200133 }
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000134
perkj71ee44c2016-06-15 00:47:53 -0700135 NiceMock<MockLimitObserver> limit_observer_;
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200136 std::unique_ptr<BitrateAllocator> allocator_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000137};
138
Sebastian Jansson464a5572019-02-12 13:32:32 +0100139TEST_F(BitrateAllocatorTest, RespectsPriorityBitrate) {
140 TestBitrateObserver stream_a;
141 auto config_a = DefaultConfig();
142 config_a.min_bitrate_bps = 100000;
143 config_a.priority_bitrate_bps = 0;
144 allocator_->AddObserver(&stream_a, config_a);
145
146 TestBitrateObserver stream_b;
147 auto config_b = DefaultConfig();
148 config_b.min_bitrate_bps = 100000;
149 config_b.max_bitrate_bps = 300000;
150 config_b.priority_bitrate_bps = 300000;
151 allocator_->AddObserver(&stream_b, config_b);
152
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200153 allocator_->OnNetworkEstimateChanged(
154 CreateTargetRateMessage(100000, 0, 0, 0));
Sebastian Jansson464a5572019-02-12 13:32:32 +0100155 EXPECT_EQ(stream_a.last_bitrate_bps_, 100000u);
156 EXPECT_EQ(stream_b.last_bitrate_bps_, 100000u);
157
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200158 allocator_->OnNetworkEstimateChanged(
159 CreateTargetRateMessage(200000, 0, 0, 0));
Sebastian Jansson464a5572019-02-12 13:32:32 +0100160 EXPECT_EQ(stream_a.last_bitrate_bps_, 100000u);
161 EXPECT_EQ(stream_b.last_bitrate_bps_, 100000u);
162
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200163 allocator_->OnNetworkEstimateChanged(
164 CreateTargetRateMessage(300000, 0, 0, 0));
Sebastian Jansson464a5572019-02-12 13:32:32 +0100165 EXPECT_EQ(stream_a.last_bitrate_bps_, 100000u);
166 EXPECT_EQ(stream_b.last_bitrate_bps_, 200000u);
167
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200168 allocator_->OnNetworkEstimateChanged(
169 CreateTargetRateMessage(400000, 0, 0, 0));
Sebastian Jansson464a5572019-02-12 13:32:32 +0100170 EXPECT_EQ(stream_a.last_bitrate_bps_, 100000u);
171 EXPECT_EQ(stream_b.last_bitrate_bps_, 300000u);
172
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200173 allocator_->OnNetworkEstimateChanged(
174 CreateTargetRateMessage(800000, 0, 0, 0));
Sebastian Jansson464a5572019-02-12 13:32:32 +0100175 EXPECT_EQ(stream_a.last_bitrate_bps_, 500000u);
176 EXPECT_EQ(stream_b.last_bitrate_bps_, 300000u);
177}
178
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000179TEST_F(BitrateAllocatorTest, UpdatingBitrateObserver) {
180 TestBitrateObserver bitrate_observer;
perkj71ee44c2016-06-15 00:47:53 -0700181 const uint32_t kMinSendBitrateBps = 100000;
182 const uint32_t kPadUpToBitrateBps = 50000;
philipelf69e7682018-02-28 13:06:28 +0100183 const uint32_t kMaxBitrateBps = 1500000;
perkj71ee44c2016-06-15 00:47:53 -0700184
philipelf69e7682018-02-28 13:06:28 +0100185 EXPECT_CALL(limit_observer_,
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200186 OnAllocationLimitsChanged(AllocationLimitsEq(
187 kMinSendBitrateBps, kPadUpToBitrateBps, kMaxBitrateBps)));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200188 AddObserver(&bitrate_observer, kMinSendBitrateBps, kMaxBitrateBps,
Jonas Olsson0182a032019-07-09 12:31:20 +0200189 kPadUpToBitrateBps, true, kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700190 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer));
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200191 allocator_->OnNetworkEstimateChanged(
192 CreateTargetRateMessage(200000, 0, 0, kDefaultProbingIntervalMs));
perkj57c21f92016-06-17 07:27:16 -0700193 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000194
Peter Boström8e4e8b02015-09-15 15:08:03 +0200195 // TODO(pbos): Expect capping to 1.5M instead of 3M when not boosting the max
mflodman0e7e2592015-11-12 21:02:42 -0800196 // bitrate for FEC/retransmissions (see todo in BitrateAllocator).
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200197 allocator_->OnNetworkEstimateChanged(
198 CreateTargetRateMessage(4000000, 0, 0, kDefaultProbingIntervalMs));
perkj57c21f92016-06-17 07:27:16 -0700199 EXPECT_EQ(3000000, allocator_->GetStartBitrate(&bitrate_observer));
perkj71ee44c2016-06-15 00:47:53 -0700200
Artem Titovea240272021-07-26 12:40:21 +0200201 // Expect `max_padding_bitrate_bps` to change to 0 if the observer is updated.
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200202 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(
203 AllocationLimitsEq(kMinSendBitrateBps, 0)));
Jonas Olsson0182a032019-07-09 12:31:20 +0200204 AddObserver(&bitrate_observer, kMinSendBitrateBps, 4000000, 0, true,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200205 kDefaultBitratePriority);
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200206 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(
207 AllocationLimitsEq(kMinSendBitrateBps, 0)));
perkj57c21f92016-06-17 07:27:16 -0700208 EXPECT_EQ(4000000, allocator_->GetStartBitrate(&bitrate_observer));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000209
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200210 AddObserver(&bitrate_observer, kMinSendBitrateBps, kMaxBitrateBps, 0, true,
Jonas Olsson0182a032019-07-09 12:31:20 +0200211 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700212 EXPECT_EQ(3000000, allocator_->GetStartBitrate(&bitrate_observer));
mflodman101f2502016-06-09 17:21:19 +0200213 EXPECT_EQ(3000000u, bitrate_observer.last_bitrate_bps_);
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200214 allocator_->OnNetworkEstimateChanged(
215 CreateTargetRateMessage(kMaxBitrateBps, 0, 0, kDefaultProbingIntervalMs));
mflodman101f2502016-06-09 17:21:19 +0200216 EXPECT_EQ(1500000u, bitrate_observer.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000217}
218
219TEST_F(BitrateAllocatorTest, TwoBitrateObserversOneRtcpObserver) {
220 TestBitrateObserver bitrate_observer_1;
221 TestBitrateObserver bitrate_observer_2;
philipelf69e7682018-02-28 13:06:28 +0100222 const uint32_t kObs1StartBitrateBps = 100000;
223 const uint32_t kObs2StartBitrateBps = 200000;
224 const uint32_t kObs1MaxBitrateBps = 300000;
225 const uint32_t kObs2MaxBitrateBps = 300000;
226
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200227 EXPECT_CALL(limit_observer_,
228 OnAllocationLimitsChanged(AllocationLimitsEq(
229 kObs1StartBitrateBps, 0, kObs1MaxBitrateBps)));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200230 AddObserver(&bitrate_observer_1, kObs1StartBitrateBps, kObs1MaxBitrateBps, 0,
Jonas Olsson0182a032019-07-09 12:31:20 +0200231 true, kDefaultBitratePriority);
philipelf69e7682018-02-28 13:06:28 +0100232 EXPECT_EQ(static_cast<int>(kObs1MaxBitrateBps),
233 allocator_->GetStartBitrate(&bitrate_observer_1));
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200234 EXPECT_CALL(limit_observer_,
235 OnAllocationLimitsChanged(AllocationLimitsEq(
236 kObs1StartBitrateBps + kObs2StartBitrateBps, 0,
237 kObs1MaxBitrateBps + kObs2MaxBitrateBps)));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200238 AddObserver(&bitrate_observer_2, kObs2StartBitrateBps, kObs2MaxBitrateBps, 0,
Jonas Olsson0182a032019-07-09 12:31:20 +0200239 true, kDefaultBitratePriority);
philipelf69e7682018-02-28 13:06:28 +0100240 EXPECT_EQ(static_cast<int>(kObs2StartBitrateBps),
241 allocator_->GetStartBitrate(&bitrate_observer_2));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000242
mflodman48a4beb2016-07-01 13:03:59 +0200243 // Test too low start bitrate, hence lower than sum of min. Min bitrates
244 // will
245 // be allocated to all observers.
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200246 allocator_->OnNetworkEstimateChanged(CreateTargetRateMessage(
247 kObs2StartBitrateBps, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200248 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
249 EXPECT_EQ(0, bitrate_observer_1.last_fraction_loss_);
250 EXPECT_EQ(50, bitrate_observer_1.last_rtt_ms_);
251 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
252 EXPECT_EQ(0, bitrate_observer_2.last_fraction_loss_);
253 EXPECT_EQ(50, bitrate_observer_2.last_rtt_ms_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000254
mflodman48a4beb2016-07-01 13:03:59 +0200255 // Test a bitrate which should be distributed equally.
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200256 allocator_->OnNetworkEstimateChanged(
257 CreateTargetRateMessage(500000, 0, 50, kDefaultProbingIntervalMs));
philipelf69e7682018-02-28 13:06:28 +0100258 const uint32_t kBitrateToShare =
259 500000 - kObs2StartBitrateBps - kObs1StartBitrateBps;
mflodman48a4beb2016-07-01 13:03:59 +0200260 EXPECT_EQ(100000u + kBitrateToShare / 2,
261 bitrate_observer_1.last_bitrate_bps_);
262 EXPECT_EQ(200000u + kBitrateToShare / 2,
263 bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000264
mflodman48a4beb2016-07-01 13:03:59 +0200265 // Limited by 2x max bitrates since we leave room for FEC and
266 // retransmissions.
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200267 allocator_->OnNetworkEstimateChanged(
268 CreateTargetRateMessage(1500000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200269 EXPECT_EQ(600000u, bitrate_observer_1.last_bitrate_bps_);
270 EXPECT_EQ(600000u, bitrate_observer_2.last_bitrate_bps_);
perkjec81bcd2016-05-11 06:01:13 -0700271
mflodman48a4beb2016-07-01 13:03:59 +0200272 // Verify that if the bandwidth estimate is set to zero, the allocated
273 // rate is
274 // zero.
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200275 allocator_->OnNetworkEstimateChanged(
276 CreateTargetRateMessage(0, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200277 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
278 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000279}
280
perkj71ee44c2016-06-15 00:47:53 -0700281TEST_F(BitrateAllocatorTest, RemoveObserverTriggersLimitObserver) {
282 TestBitrateObserver bitrate_observer;
283 const uint32_t kMinSendBitrateBps = 100000;
284 const uint32_t kPadUpToBitrateBps = 50000;
philipelf69e7682018-02-28 13:06:28 +0100285 const uint32_t kMaxBitrateBps = 1500000;
perkj71ee44c2016-06-15 00:47:53 -0700286
philipelf69e7682018-02-28 13:06:28 +0100287 EXPECT_CALL(limit_observer_,
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200288 OnAllocationLimitsChanged(AllocationLimitsEq(
289 kMinSendBitrateBps, kPadUpToBitrateBps, kMaxBitrateBps)));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200290 AddObserver(&bitrate_observer, kMinSendBitrateBps, kMaxBitrateBps,
Jonas Olsson0182a032019-07-09 12:31:20 +0200291 kPadUpToBitrateBps, true, kDefaultBitratePriority);
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200292 EXPECT_CALL(limit_observer_,
293 OnAllocationLimitsChanged(AllocationLimitsEq(0, 0)));
perkj71ee44c2016-06-15 00:47:53 -0700294 allocator_->RemoveObserver(&bitrate_observer);
295}
296
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000297class BitrateAllocatorTestNoEnforceMin : public ::testing::Test {
298 protected:
perkj71ee44c2016-06-15 00:47:53 -0700299 BitrateAllocatorTestNoEnforceMin()
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200300 : allocator_(new BitrateAllocator(&limit_observer_)) {
301 allocator_->OnNetworkEstimateChanged(
302 CreateTargetRateMessage(300000u, 0, 0, kDefaultProbingIntervalMs));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000303 }
304 ~BitrateAllocatorTestNoEnforceMin() {}
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200305 void AddObserver(BitrateAllocatorObserver* observer,
306 uint32_t min_bitrate_bps,
307 uint32_t max_bitrate_bps,
308 uint32_t pad_up_bitrate_bps,
309 bool enforce_min_bitrate,
Ali Tofigh641a1b12022-05-17 11:48:46 +0200310 absl::string_view track_id,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200311 double bitrate_priority) {
312 allocator_->AddObserver(
Sebastian Jansson464a5572019-02-12 13:32:32 +0100313 observer, {min_bitrate_bps, max_bitrate_bps, pad_up_bitrate_bps, 0,
Jonas Olsson0182a032019-07-09 12:31:20 +0200314 enforce_min_bitrate, bitrate_priority});
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200315 }
perkj71ee44c2016-06-15 00:47:53 -0700316 NiceMock<MockLimitObserver> limit_observer_;
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200317 std::unique_ptr<BitrateAllocator> allocator_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000318};
319
mflodman101f2502016-06-09 17:21:19 +0200320// The following three tests verify enforcing a minimum bitrate works as
321// intended.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000322TEST_F(BitrateAllocatorTestNoEnforceMin, OneBitrateObserver) {
323 TestBitrateObserver bitrate_observer_1;
Artem Titovea240272021-07-26 12:40:21 +0200324 // Expect OnAllocationLimitsChanged with `min_send_bitrate_bps` = 0 since
325 // AddObserver is called with `enforce_min_bitrate` = false.
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200326 EXPECT_CALL(limit_observer_,
327 OnAllocationLimitsChanged(AllocationLimitsEq(0, 0)));
328 EXPECT_CALL(limit_observer_,
329 OnAllocationLimitsChanged(AllocationLimitsEq(0, 120000)));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200330 AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "",
331 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200332 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000333
mflodman48a4beb2016-07-01 13:03:59 +0200334 // High BWE.
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200335 allocator_->OnNetworkEstimateChanged(
336 CreateTargetRateMessage(150000, 0, 0, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200337 EXPECT_EQ(150000u, bitrate_observer_1.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000338
mflodman48a4beb2016-07-01 13:03:59 +0200339 // Low BWE.
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200340 allocator_->OnNetworkEstimateChanged(
341 CreateTargetRateMessage(10000, 0, 0, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200342 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000343
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200344 EXPECT_CALL(limit_observer_,
345 OnAllocationLimitsChanged(AllocationLimitsEq(0, 0)));
mflodman48a4beb2016-07-01 13:03:59 +0200346 allocator_->RemoveObserver(&bitrate_observer_1);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000347}
348
349TEST_F(BitrateAllocatorTestNoEnforceMin, ThreeBitrateObservers) {
350 TestBitrateObserver bitrate_observer_1;
351 TestBitrateObserver bitrate_observer_2;
352 TestBitrateObserver bitrate_observer_3;
353 // Set up the observers with min bitrates at 100000, 200000, and 300000.
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200354 AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "",
355 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700356 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
Stefan Holmere5904162015-03-26 11:11:06 +0100357
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200358 AddObserver(&bitrate_observer_2, 200000, 400000, 0, false, "",
359 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700360 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200361 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
Stefan Holmere5904162015-03-26 11:11:06 +0100362
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200363 AddObserver(&bitrate_observer_3, 300000, 400000, 0, false, "",
364 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700365 EXPECT_EQ(0, allocator_->GetStartBitrate(&bitrate_observer_3));
mflodman101f2502016-06-09 17:21:19 +0200366 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
367 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000368
mflodman101f2502016-06-09 17:21:19 +0200369 // High BWE. Make sure the controllers get a fair share of the surplus (i.e.,
370 // what is left after each controller gets its min rate).
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200371 allocator_->OnNetworkEstimateChanged(
372 CreateTargetRateMessage(690000, 0, 0, kDefaultProbingIntervalMs));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000373 // Verify that each observer gets its min rate (sum of min rates is 600000),
374 // and that the remaining 90000 is divided equally among the three.
Stefan Holmere5904162015-03-26 11:11:06 +0100375 uint32_t bitrate_to_share = 690000u - 100000u - 200000u - 300000u;
mflodman101f2502016-06-09 17:21:19 +0200376 EXPECT_EQ(100000u + bitrate_to_share / 3,
377 bitrate_observer_1.last_bitrate_bps_);
378 EXPECT_EQ(200000u + bitrate_to_share / 3,
379 bitrate_observer_2.last_bitrate_bps_);
380 EXPECT_EQ(300000u + bitrate_to_share / 3,
381 bitrate_observer_3.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000382
mflodman101f2502016-06-09 17:21:19 +0200383 // BWE below the sum of observer's min bitrate.
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200384 allocator_->OnNetworkEstimateChanged(
385 CreateTargetRateMessage(300000, 0, 0, kDefaultProbingIntervalMs));
mflodman101f2502016-06-09 17:21:19 +0200386 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_); // Min bitrate.
387 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_); // Min bitrate.
Yves Gerey665174f2018-06-19 15:03:05 +0200388 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_); // Nothing.
mflodman101f2502016-06-09 17:21:19 +0200389
390 // Increased BWE, but still below the sum of configured min bitrates for all
391 // observers and too little for observer 3. 1 and 2 will share the rest.
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200392 allocator_->OnNetworkEstimateChanged(
393 CreateTargetRateMessage(500000, 0, 0, kDefaultProbingIntervalMs));
mflodman101f2502016-06-09 17:21:19 +0200394 EXPECT_EQ(200000u, bitrate_observer_1.last_bitrate_bps_); // Min + split.
395 EXPECT_EQ(300000u, bitrate_observer_2.last_bitrate_bps_); // Min + split.
Yves Gerey665174f2018-06-19 15:03:05 +0200396 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_); // Nothing.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000397
mflodman101f2502016-06-09 17:21:19 +0200398 // Below min for all.
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200399 allocator_->OnNetworkEstimateChanged(
400 CreateTargetRateMessage(10000, 0, 0, kDefaultProbingIntervalMs));
mflodman101f2502016-06-09 17:21:19 +0200401 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
402 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
403 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000404
perkjec81bcd2016-05-11 06:01:13 -0700405 // Verify that zero estimated bandwidth, means that that all gets zero,
406 // regardless of set min bitrate.
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200407 allocator_->OnNetworkEstimateChanged(
408 CreateTargetRateMessage(0, 0, 0, kDefaultProbingIntervalMs));
mflodman101f2502016-06-09 17:21:19 +0200409 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
410 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
411 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_);
perkjec81bcd2016-05-11 06:01:13 -0700412
mflodman86aabb22016-03-11 15:44:32 +0100413 allocator_->RemoveObserver(&bitrate_observer_1);
414 allocator_->RemoveObserver(&bitrate_observer_2);
415 allocator_->RemoveObserver(&bitrate_observer_3);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000416}
417
mflodman48a4beb2016-07-01 13:03:59 +0200418TEST_F(BitrateAllocatorTestNoEnforceMin, OneBitrateObserverWithPacketLoss) {
Erik Språngd1d7b232018-12-06 17:31:25 +0100419 const uint32_t kMinBitrateBps = 100000;
420 const uint32_t kMaxBitrateBps = 400000;
421 // Hysteresis adds another 10% or 20kbps to min bitrate.
422 const uint32_t kMinStartBitrateBps =
423 kMinBitrateBps + std::max(20000u, kMinBitrateBps / 10);
424
Artem Titovea240272021-07-26 12:40:21 +0200425 // Expect OnAllocationLimitsChanged with `min_send_bitrate_bps` = 0 since
426 // AddObserver is called with `enforce_min_bitrate` = false.
Erik Språngd1d7b232018-12-06 17:31:25 +0100427 TestBitrateObserver bitrate_observer;
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200428 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(
429 AllocationLimitsEq(0, 0, kMaxBitrateBps)));
Erik Språngd1d7b232018-12-06 17:31:25 +0100430 AddObserver(&bitrate_observer, kMinBitrateBps, kMaxBitrateBps, 0, false, "",
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200431 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200432 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer));
433
434 // High BWE.
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200435 allocator_->OnNetworkEstimateChanged(
436 CreateTargetRateMessage(150000, 0, 0, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200437 EXPECT_EQ(150000u, bitrate_observer.last_bitrate_bps_);
438
439 // Add loss and use a part of the bitrate for protection.
Erik Språngd1d7b232018-12-06 17:31:25 +0100440 const double kProtectionRatio = 0.4;
Rasmus Brandt681de202019-02-04 15:09:34 +0100441 const uint8_t fraction_loss = kProtectionRatio * 256;
Erik Språngd1d7b232018-12-06 17:31:25 +0100442 bitrate_observer.SetBitrateProtectionRatio(kProtectionRatio);
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200443 allocator_->OnNetworkEstimateChanged(CreateTargetRateMessage(
444 200000, 0, fraction_loss, kDefaultProbingIntervalMs));
Rasmus Brandt681de202019-02-04 15:09:34 +0100445 EXPECT_EQ(200000u, bitrate_observer.last_bitrate_bps_);
mflodman48a4beb2016-07-01 13:03:59 +0200446
447 // Above the min threshold, but not enough given the protection used.
Erik Språngd1d7b232018-12-06 17:31:25 +0100448 // Limits changed, as we will video is now off and we need to pad up to the
449 // start bitrate.
Erik Språngd1d7b232018-12-06 17:31:25 +0100450 // Verify the hysteresis is added for the protection.
451 const uint32_t kMinStartBitrateWithProtectionBps =
452 static_cast<uint32_t>(kMinStartBitrateBps * (1 + kProtectionRatio));
453 EXPECT_CALL(limit_observer_,
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200454 OnAllocationLimitsChanged(AllocationLimitsEq(
455 0, kMinStartBitrateWithProtectionBps, kMaxBitrateBps)));
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200456 allocator_->OnNetworkEstimateChanged(CreateTargetRateMessage(
457 kMinStartBitrateBps + 1000, 0, fraction_loss, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200458 EXPECT_EQ(0u, bitrate_observer.last_bitrate_bps_);
459
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200460 allocator_->OnNetworkEstimateChanged(
461 CreateTargetRateMessage(kMinStartBitrateWithProtectionBps - 1000, 0,
462 fraction_loss, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200463 EXPECT_EQ(0u, bitrate_observer.last_bitrate_bps_);
464
465 // Just enough to enable video again.
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200466 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(
467 AllocationLimitsEq(0, 0, kMaxBitrateBps)));
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200468 allocator_->OnNetworkEstimateChanged(
469 CreateTargetRateMessage(kMinStartBitrateWithProtectionBps, 0,
470 fraction_loss, kDefaultProbingIntervalMs));
Erik Språngd1d7b232018-12-06 17:31:25 +0100471 EXPECT_EQ(kMinStartBitrateWithProtectionBps,
472 bitrate_observer.last_bitrate_bps_);
mflodman48a4beb2016-07-01 13:03:59 +0200473
474 // Remove all protection and make sure video is not paused as earlier.
475 bitrate_observer.SetBitrateProtectionRatio(0.0);
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200476 allocator_->OnNetworkEstimateChanged(
477 CreateTargetRateMessage(kMinStartBitrateWithProtectionBps - 1000, 0, 0,
478 kDefaultProbingIntervalMs));
Erik Språngd1d7b232018-12-06 17:31:25 +0100479 EXPECT_EQ(kMinStartBitrateWithProtectionBps - 1000,
480 bitrate_observer.last_bitrate_bps_);
mflodman48a4beb2016-07-01 13:03:59 +0200481
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200482 allocator_->OnNetworkEstimateChanged(CreateTargetRateMessage(
483 kMinStartBitrateBps, 0, 0, kDefaultProbingIntervalMs));
Erik Språngd1d7b232018-12-06 17:31:25 +0100484 EXPECT_EQ(kMinStartBitrateBps, bitrate_observer.last_bitrate_bps_);
mflodman48a4beb2016-07-01 13:03:59 +0200485
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200486 EXPECT_CALL(limit_observer_,
487 OnAllocationLimitsChanged(AllocationLimitsEq(0, 0, 0)));
mflodman48a4beb2016-07-01 13:03:59 +0200488 allocator_->RemoveObserver(&bitrate_observer);
489}
490
Rasmus Brandt681de202019-02-04 15:09:34 +0100491TEST_F(BitrateAllocatorTest,
492 TotalAllocationLimitsAreUnaffectedByProtectionRatio) {
493 TestBitrateObserver bitrate_observer;
494
495 const uint32_t kMinBitrateBps = 100000;
496 const uint32_t kMaxBitrateBps = 400000;
497
Artem Titovea240272021-07-26 12:40:21 +0200498 // Register `bitrate_observer` and expect total allocation limits to change.
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200499 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(AllocationLimitsEq(
500 kMinBitrateBps, 0, kMaxBitrateBps)))
Rasmus Brandt681de202019-02-04 15:09:34 +0100501 .Times(1);
Sebastian Jansson464a5572019-02-12 13:32:32 +0100502 MediaStreamAllocationConfig allocation_config = DefaultConfig();
503 allocation_config.min_bitrate_bps = kMinBitrateBps;
504 allocation_config.max_bitrate_bps = kMaxBitrateBps;
505 allocator_->AddObserver(&bitrate_observer, allocation_config);
Rasmus Brandt681de202019-02-04 15:09:34 +0100506
507 // Observer uses 20% of it's allocated bitrate for protection.
508 bitrate_observer.SetBitrateProtectionRatio(/*protection_ratio=*/0.2);
509 // Total allocation limits are unaffected by the protection rate change.
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200510 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(_)).Times(0);
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200511 allocator_->OnNetworkEstimateChanged(
512 CreateTargetRateMessage(200000u, 0, 100, kDefaultProbingIntervalMs));
Rasmus Brandt681de202019-02-04 15:09:34 +0100513
514 // Observer uses 0% of it's allocated bitrate for protection.
515 bitrate_observer.SetBitrateProtectionRatio(/*protection_ratio=*/0.0);
516 // Total allocation limits are unaffected by the protection rate change.
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200517 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(_)).Times(0);
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200518 allocator_->OnNetworkEstimateChanged(
519 CreateTargetRateMessage(200000u, 0, 100, kDefaultProbingIntervalMs));
Rasmus Brandt681de202019-02-04 15:09:34 +0100520
521 // Observer again uses 20% of it's allocated bitrate for protection.
522 bitrate_observer.SetBitrateProtectionRatio(/*protection_ratio=*/0.2);
523 // Total allocation limits are unaffected by the protection rate change.
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200524 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(_)).Times(0);
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200525 allocator_->OnNetworkEstimateChanged(
526 CreateTargetRateMessage(200000u, 0, 100, kDefaultProbingIntervalMs));
Rasmus Brandt681de202019-02-04 15:09:34 +0100527}
528
mflodman48a4beb2016-07-01 13:03:59 +0200529TEST_F(BitrateAllocatorTestNoEnforceMin, TwoBitrateObserverWithPacketLoss) {
530 TestBitrateObserver bitrate_observer_1;
531 TestBitrateObserver bitrate_observer_2;
532
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200533 AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "",
534 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200535 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200536 AddObserver(&bitrate_observer_2, 200000, 400000, 0, false, "",
537 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200538 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
539 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
540
541 // Enough bitrate for both.
542 bitrate_observer_2.SetBitrateProtectionRatio(0.5);
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200543 allocator_->OnNetworkEstimateChanged(
544 CreateTargetRateMessage(300000, 0, 0, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200545 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
546 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
547
548 // Above min for observer 2, but too little given the protection used.
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200549 allocator_->OnNetworkEstimateChanged(
550 CreateTargetRateMessage(330000, 0, 0, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200551 EXPECT_EQ(330000u, bitrate_observer_1.last_bitrate_bps_);
552 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
553
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200554 allocator_->OnNetworkEstimateChanged(
555 CreateTargetRateMessage(100000, 0, 0, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200556 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
557 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
558
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200559 allocator_->OnNetworkEstimateChanged(
560 CreateTargetRateMessage(99999, 0, 0, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200561 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
562 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
563
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200564 allocator_->OnNetworkEstimateChanged(
565 CreateTargetRateMessage(119000, 0, 0, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200566 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
567 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
568
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200569 allocator_->OnNetworkEstimateChanged(
570 CreateTargetRateMessage(120000, 0, 0, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200571 EXPECT_EQ(120000u, bitrate_observer_1.last_bitrate_bps_);
572 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
573
574 // Verify the protection is accounted for before resuming observer 2.
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200575 allocator_->OnNetworkEstimateChanged(
576 CreateTargetRateMessage(429000, 0, 0, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200577 EXPECT_EQ(400000u, bitrate_observer_1.last_bitrate_bps_);
578 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
579
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200580 allocator_->OnNetworkEstimateChanged(
581 CreateTargetRateMessage(430000, 0, 0, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200582 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
583 EXPECT_EQ(330000u, bitrate_observer_2.last_bitrate_bps_);
584
585 allocator_->RemoveObserver(&bitrate_observer_1);
586 allocator_->RemoveObserver(&bitrate_observer_2);
587}
588
mflodman101f2502016-06-09 17:21:19 +0200589TEST_F(BitrateAllocatorTest, ThreeBitrateObserversLowBweEnforceMin) {
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000590 TestBitrateObserver bitrate_observer_1;
591 TestBitrateObserver bitrate_observer_2;
592 TestBitrateObserver bitrate_observer_3;
Stefan Holmere5904162015-03-26 11:11:06 +0100593
Jonas Olsson0182a032019-07-09 12:31:20 +0200594 AddObserver(&bitrate_observer_1, 100000, 400000, 0, true,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200595 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700596 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
597
Jonas Olsson0182a032019-07-09 12:31:20 +0200598 AddObserver(&bitrate_observer_2, 200000, 400000, 0, true,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200599 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700600 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200601 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
Stefan Holmere5904162015-03-26 11:11:06 +0100602
Jonas Olsson0182a032019-07-09 12:31:20 +0200603 AddObserver(&bitrate_observer_3, 300000, 400000, 0, true,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200604 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200605 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_3));
606 EXPECT_EQ(100000, static_cast<int>(bitrate_observer_1.last_bitrate_bps_));
607 EXPECT_EQ(200000, static_cast<int>(bitrate_observer_2.last_bitrate_bps_));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000608
mflodman48a4beb2016-07-01 13:03:59 +0200609 // Low BWE. Verify that all observers still get their respective min
610 // bitrate.
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200611 allocator_->OnNetworkEstimateChanged(
612 CreateTargetRateMessage(1000, 0, 0, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200613 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_); // Min cap.
614 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_); // Min cap.
615 EXPECT_EQ(300000u, bitrate_observer_3.last_bitrate_bps_); // Min cap.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000616
mflodman48a4beb2016-07-01 13:03:59 +0200617 allocator_->RemoveObserver(&bitrate_observer_1);
618 allocator_->RemoveObserver(&bitrate_observer_2);
619 allocator_->RemoveObserver(&bitrate_observer_3);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000620}
perkjfea93092016-05-14 00:58:48 -0700621
622TEST_F(BitrateAllocatorTest, AddObserverWhileNetworkDown) {
623 TestBitrateObserver bitrate_observer_1;
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200624 EXPECT_CALL(limit_observer_,
625 OnAllocationLimitsChanged(AllocationLimitsEq(50000, 0)));
perkj57c21f92016-06-17 07:27:16 -0700626
Jonas Olsson0182a032019-07-09 12:31:20 +0200627 AddObserver(&bitrate_observer_1, 50000, 400000, 0, true,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200628 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700629 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
perkjfea93092016-05-14 00:58:48 -0700630
631 // Set network down, ie, no available bitrate.
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200632 allocator_->OnNetworkEstimateChanged(
633 CreateTargetRateMessage(0, 0, 0, kDefaultProbingIntervalMs));
perkjfea93092016-05-14 00:58:48 -0700634
mflodman101f2502016-06-09 17:21:19 +0200635 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
perkjfea93092016-05-14 00:58:48 -0700636
637 TestBitrateObserver bitrate_observer_2;
perkj71ee44c2016-06-15 00:47:53 -0700638 // Adding an observer while the network is down should not affect the limits.
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200639 EXPECT_CALL(limit_observer_,
640 OnAllocationLimitsChanged(AllocationLimitsEq(50000 + 50000, 0)));
Jonas Olsson0182a032019-07-09 12:31:20 +0200641 AddObserver(&bitrate_observer_2, 50000, 400000, 0, true,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200642 kDefaultBitratePriority);
perkjfea93092016-05-14 00:58:48 -0700643
644 // Expect the start_bitrate to be set as if the network was still up but that
645 // the new observer have been notified that the network is down.
perkj57c21f92016-06-17 07:27:16 -0700646 EXPECT_EQ(300000 / 2, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200647 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
648 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
perkjfea93092016-05-14 00:58:48 -0700649
650 // Set network back up.
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200651 allocator_->OnNetworkEstimateChanged(
652 CreateTargetRateMessage(1500000, 0, 50, kDefaultProbingIntervalMs));
mflodman101f2502016-06-09 17:21:19 +0200653 EXPECT_EQ(750000u, bitrate_observer_1.last_bitrate_bps_);
654 EXPECT_EQ(750000u, bitrate_observer_2.last_bitrate_bps_);
655}
656
657TEST_F(BitrateAllocatorTest, MixedEnforecedConfigs) {
658 TestBitrateObserver enforced_observer;
Jonas Olsson0182a032019-07-09 12:31:20 +0200659 AddObserver(&enforced_observer, 6000, 30000, 0, true,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200660 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200661 EXPECT_EQ(60000, allocator_->GetStartBitrate(&enforced_observer));
mflodman101f2502016-06-09 17:21:19 +0200662
mflodman48a4beb2016-07-01 13:03:59 +0200663 TestBitrateObserver not_enforced_observer;
Jonas Olsson0182a032019-07-09 12:31:20 +0200664 AddObserver(&not_enforced_observer, 30000, 2500000, 0, false,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200665 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200666 EXPECT_EQ(270000, allocator_->GetStartBitrate(&not_enforced_observer));
667 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200668
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200669 allocator_->OnNetworkEstimateChanged(
670 CreateTargetRateMessage(36000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200671 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
672 EXPECT_EQ(30000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200673
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200674 allocator_->OnNetworkEstimateChanged(
675 CreateTargetRateMessage(35000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200676 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
677 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200678
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200679 allocator_->OnNetworkEstimateChanged(
680 CreateTargetRateMessage(5000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200681 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
682 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200683
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200684 allocator_->OnNetworkEstimateChanged(
685 CreateTargetRateMessage(36000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200686 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
687 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200688
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200689 allocator_->OnNetworkEstimateChanged(
690 CreateTargetRateMessage(55000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200691 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
692 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200693
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200694 allocator_->OnNetworkEstimateChanged(
695 CreateTargetRateMessage(56000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200696 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
697 EXPECT_EQ(50000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200698
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200699 allocator_->OnNetworkEstimateChanged(
700 CreateTargetRateMessage(56000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200701 EXPECT_EQ(16000u, enforced_observer.last_bitrate_bps_);
702 EXPECT_EQ(40000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200703
mflodman48a4beb2016-07-01 13:03:59 +0200704 allocator_->RemoveObserver(&enforced_observer);
705 allocator_->RemoveObserver(&not_enforced_observer);
mflodman101f2502016-06-09 17:21:19 +0200706}
707
708TEST_F(BitrateAllocatorTest, AvoidToggleAbsolute) {
709 TestBitrateObserver observer;
Jonas Olsson0182a032019-07-09 12:31:20 +0200710 AddObserver(&observer, 30000, 300000, 0, false, kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200711 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
mflodman101f2502016-06-09 17:21:19 +0200712
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200713 allocator_->OnNetworkEstimateChanged(
714 CreateTargetRateMessage(30000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200715 EXPECT_EQ(30000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200716
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200717 allocator_->OnNetworkEstimateChanged(
718 CreateTargetRateMessage(20000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200719 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200720
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200721 allocator_->OnNetworkEstimateChanged(
722 CreateTargetRateMessage(30000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200723 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200724
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200725 allocator_->OnNetworkEstimateChanged(
726 CreateTargetRateMessage(49000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200727 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200728
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200729 allocator_->OnNetworkEstimateChanged(
730 CreateTargetRateMessage(50000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200731 EXPECT_EQ(50000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200732
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200733 allocator_->OnNetworkEstimateChanged(
734 CreateTargetRateMessage(30000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200735 EXPECT_EQ(30000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200736
mflodman48a4beb2016-07-01 13:03:59 +0200737 allocator_->RemoveObserver(&observer);
mflodman101f2502016-06-09 17:21:19 +0200738}
739
740TEST_F(BitrateAllocatorTest, AvoidTogglePercent) {
741 TestBitrateObserver observer;
Jonas Olsson0182a032019-07-09 12:31:20 +0200742 AddObserver(&observer, 300000, 600000, 0, false, kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200743 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
mflodman101f2502016-06-09 17:21:19 +0200744
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200745 allocator_->OnNetworkEstimateChanged(
746 CreateTargetRateMessage(300000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200747 EXPECT_EQ(300000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200748
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200749 allocator_->OnNetworkEstimateChanged(
750 CreateTargetRateMessage(200000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200751 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200752
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200753 allocator_->OnNetworkEstimateChanged(
754 CreateTargetRateMessage(300000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200755 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200756
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200757 allocator_->OnNetworkEstimateChanged(
758 CreateTargetRateMessage(329000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200759 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200760
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200761 allocator_->OnNetworkEstimateChanged(
762 CreateTargetRateMessage(330000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200763 EXPECT_EQ(330000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200764
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200765 allocator_->OnNetworkEstimateChanged(
766 CreateTargetRateMessage(300000, 0, 50, kDefaultProbingIntervalMs));
mflodman48a4beb2016-07-01 13:03:59 +0200767 EXPECT_EQ(300000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200768
mflodman48a4beb2016-07-01 13:03:59 +0200769 allocator_->RemoveObserver(&observer);
perkjfea93092016-05-14 00:58:48 -0700770}
771
minyue78b4d562016-11-30 04:47:39 -0800772TEST_F(BitrateAllocatorTest, PassProbingInterval) {
773 TestBitrateObserver observer;
Jonas Olsson0182a032019-07-09 12:31:20 +0200774 AddObserver(&observer, 300000, 600000, 0, false, kDefaultBitratePriority);
minyue78b4d562016-11-30 04:47:39 -0800775 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
776
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200777 allocator_->OnNetworkEstimateChanged(
778 CreateTargetRateMessage(300000, 0, 50, 5000));
minyue78b4d562016-11-30 04:47:39 -0800779 EXPECT_EQ(5000, observer.last_probing_interval_ms_);
780
781 allocator_->RemoveObserver(&observer);
782}
783
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800784TEST_F(BitrateAllocatorTest, PriorityRateOneObserverBasic) {
785 TestBitrateObserver observer;
786 const uint32_t kMinSendBitrateBps = 10;
787 const uint32_t kMaxSendBitrateBps = 60;
788 const uint32_t kNetworkBandwidthBps = 30;
789
Jonas Olsson0182a032019-07-09 12:31:20 +0200790 AddObserver(&observer, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true, 2.0);
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200791 allocator_->OnNetworkEstimateChanged(CreateTargetRateMessage(
792 kNetworkBandwidthBps, 0, 0, kDefaultProbingIntervalMs));
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800793
794 EXPECT_EQ(kNetworkBandwidthBps, observer.last_bitrate_bps_);
795
796 allocator_->RemoveObserver(&observer);
797}
798
799// Tests that two observers with the same bitrate priority are allocated
800// their bitrate evenly.
801TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversBasic) {
802 TestBitrateObserver observer_low_1;
803 TestBitrateObserver observer_low_2;
804 const uint32_t kMinSendBitrateBps = 10;
805 const uint32_t kMaxSendBitrateBps = 60;
806 const uint32_t kNetworkBandwidthBps = 60;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200807 AddObserver(&observer_low_1, kMinSendBitrateBps, kMaxSendBitrateBps, 0, false,
Jonas Olsson0182a032019-07-09 12:31:20 +0200808 2.0);
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200809 AddObserver(&observer_low_2, kMinSendBitrateBps, kMaxSendBitrateBps, 0, false,
Jonas Olsson0182a032019-07-09 12:31:20 +0200810 2.0);
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200811 allocator_->OnNetworkEstimateChanged(CreateTargetRateMessage(
812 kNetworkBandwidthBps, 0, 0, kDefaultProbingIntervalMs));
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800813
814 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_1.last_bitrate_bps_);
815 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_2.last_bitrate_bps_);
816
817 allocator_->RemoveObserver(&observer_low_1);
818 allocator_->RemoveObserver(&observer_low_2);
819}
820
821// Tests that there is no difference in functionality when the min bitrate is
822// enforced.
823TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversBasicMinEnforced) {
824 TestBitrateObserver observer_low_1;
825 TestBitrateObserver observer_low_2;
826 const uint32_t kMinSendBitrateBps = 0;
827 const uint32_t kMaxSendBitrateBps = 60;
828 const uint32_t kNetworkBandwidthBps = 60;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200829 AddObserver(&observer_low_1, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
Jonas Olsson0182a032019-07-09 12:31:20 +0200830 2.0);
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200831 AddObserver(&observer_low_2, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
Jonas Olsson0182a032019-07-09 12:31:20 +0200832 2.0);
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200833 allocator_->OnNetworkEstimateChanged(CreateTargetRateMessage(
834 kNetworkBandwidthBps, 0, 0, kDefaultProbingIntervalMs));
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800835
836 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_1.last_bitrate_bps_);
837 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_2.last_bitrate_bps_);
838
839 allocator_->RemoveObserver(&observer_low_1);
840 allocator_->RemoveObserver(&observer_low_2);
841}
842
843// Tests that if the available bandwidth is the sum of the max bitrate
844// of all observers, they will be allocated their max.
845TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversBothAllocatedMax) {
846 TestBitrateObserver observer_low;
847 TestBitrateObserver observer_mid;
848 const uint32_t kMinSendBitrateBps = 0;
849 const uint32_t kMaxSendBitrateBps = 60;
850 const uint32_t kNetworkBandwidthBps = kMaxSendBitrateBps * 2;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200851 AddObserver(&observer_low, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
Jonas Olsson0182a032019-07-09 12:31:20 +0200852 2.0);
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200853 AddObserver(&observer_mid, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
Jonas Olsson0182a032019-07-09 12:31:20 +0200854 4.0);
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200855 allocator_->OnNetworkEstimateChanged(CreateTargetRateMessage(
856 kNetworkBandwidthBps, 0, 0, kDefaultProbingIntervalMs));
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800857
858 EXPECT_EQ(kMaxSendBitrateBps, observer_low.last_bitrate_bps_);
859 EXPECT_EQ(kMaxSendBitrateBps, observer_mid.last_bitrate_bps_);
860
861 allocator_->RemoveObserver(&observer_low);
862 allocator_->RemoveObserver(&observer_mid);
863}
864
865// Tests that after a higher bitrate priority observer has been allocated its
866// max bitrate the lower priority observer will then be allocated the remaining
867// bitrate.
868TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversOneAllocatedToMax) {
869 TestBitrateObserver observer_low;
870 TestBitrateObserver observer_mid;
Jonas Olsson0182a032019-07-09 12:31:20 +0200871 AddObserver(&observer_low, 10, 50, 0, false, 2.0);
872 AddObserver(&observer_mid, 10, 50, 0, false, 4.0);
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200873 allocator_->OnNetworkEstimateChanged(
874 CreateTargetRateMessage(90, 0, 0, kDefaultProbingIntervalMs));
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800875
876 EXPECT_EQ(40u, observer_low.last_bitrate_bps_);
877 EXPECT_EQ(50u, observer_mid.last_bitrate_bps_);
878
879 allocator_->RemoveObserver(&observer_low);
880 allocator_->RemoveObserver(&observer_mid);
881}
882
883// Tests that three observers with three different bitrate priorities will all
884// be allocated bitrate according to their relative bitrate priority.
885TEST_F(BitrateAllocatorTest,
886 PriorityRateThreeObserversAllocatedRelativeAmounts) {
887 TestBitrateObserver observer_low;
888 TestBitrateObserver observer_mid;
889 TestBitrateObserver observer_high;
890 const uint32_t kMaxBitrate = 100;
891 // Not enough bandwidth to fill any observer's max bitrate.
892 const uint32_t kNetworkBandwidthBps = 70;
893 const double kLowBitratePriority = 2.0;
894 const double kMidBitratePriority = 4.0;
895 const double kHighBitratePriority = 8.0;
896 const double kTotalBitratePriority =
897 kLowBitratePriority + kMidBitratePriority + kHighBitratePriority;
Jonas Olsson0182a032019-07-09 12:31:20 +0200898 AddObserver(&observer_low, 0, kMaxBitrate, 0, false, kLowBitratePriority);
899 AddObserver(&observer_mid, 0, kMaxBitrate, 0, false, kMidBitratePriority);
900 AddObserver(&observer_high, 0, kMaxBitrate, 0, false, kHighBitratePriority);
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200901 allocator_->OnNetworkEstimateChanged(CreateTargetRateMessage(
902 kNetworkBandwidthBps, 0, 0, kDefaultProbingIntervalMs));
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800903
904 const double kLowFractionAllocated =
905 kLowBitratePriority / kTotalBitratePriority;
906 const double kMidFractionAllocated =
907 kMidBitratePriority / kTotalBitratePriority;
908 const double kHighFractionAllocated =
909 kHighBitratePriority / kTotalBitratePriority;
910 EXPECT_EQ(kLowFractionAllocated * kNetworkBandwidthBps,
911 observer_low.last_bitrate_bps_);
912 EXPECT_EQ(kMidFractionAllocated * kNetworkBandwidthBps,
913 observer_mid.last_bitrate_bps_);
914 EXPECT_EQ(kHighFractionAllocated * kNetworkBandwidthBps,
915 observer_high.last_bitrate_bps_);
916
917 allocator_->RemoveObserver(&observer_low);
918 allocator_->RemoveObserver(&observer_mid);
919 allocator_->RemoveObserver(&observer_high);
920}
921
922// Tests that after the high priority observer has been allocated its maximum
923// bitrate, the other two observers are still allocated bitrate according to
924// their relative bitrate priority.
925TEST_F(BitrateAllocatorTest, PriorityRateThreeObserversHighAllocatedToMax) {
926 TestBitrateObserver observer_low;
927 const double kLowBitratePriority = 2.0;
928 TestBitrateObserver observer_mid;
929 const double kMidBitratePriority = 4.0;
930 TestBitrateObserver observer_high;
931 const double kHighBitratePriority = 8.0;
932
933 const uint32_t kAvailableBitrate = 90;
934 const uint32_t kMaxBitrate = 40;
935 const uint32_t kMinBitrate = 10;
936 // Remaining bitrate after allocating to all mins and knowing that the high
937 // priority observer will have its max bitrate allocated.
938 const uint32_t kRemainingBitrate =
939 kAvailableBitrate - kMaxBitrate - (2 * kMinBitrate);
940
Jonas Olsson0182a032019-07-09 12:31:20 +0200941 AddObserver(&observer_low, kMinBitrate, kMaxBitrate, 0, false,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200942 kLowBitratePriority);
Jonas Olsson0182a032019-07-09 12:31:20 +0200943 AddObserver(&observer_mid, kMinBitrate, kMaxBitrate, 0, false,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200944 kMidBitratePriority);
Jonas Olsson0182a032019-07-09 12:31:20 +0200945 AddObserver(&observer_high, kMinBitrate, kMaxBitrate, 0, false,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200946 kHighBitratePriority);
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200947 allocator_->OnNetworkEstimateChanged(CreateTargetRateMessage(
948 kAvailableBitrate, 0, 0, kDefaultProbingIntervalMs));
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800949
950 const double kLowFractionAllocated =
951 kLowBitratePriority / (kLowBitratePriority + kMidBitratePriority);
952 const double kMidFractionAllocated =
953 kMidBitratePriority / (kLowBitratePriority + kMidBitratePriority);
954 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kLowFractionAllocated),
955 observer_low.last_bitrate_bps_);
956 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kMidFractionAllocated),
957 observer_mid.last_bitrate_bps_);
958 EXPECT_EQ(40u, observer_high.last_bitrate_bps_);
959
960 allocator_->RemoveObserver(&observer_low);
961 allocator_->RemoveObserver(&observer_mid);
962 allocator_->RemoveObserver(&observer_high);
963}
964
965// Tests that after the low priority observer has been allocated its maximum
966// bitrate, the other two observers are still allocated bitrate according to
967// their relative bitrate priority.
968TEST_F(BitrateAllocatorTest, PriorityRateThreeObserversLowAllocatedToMax) {
969 TestBitrateObserver observer_low;
970 const double kLowBitratePriority = 2.0;
971 const uint32_t kLowMaxBitrate = 10;
972 TestBitrateObserver observer_mid;
973 const double kMidBitratePriority = 4.0;
974 TestBitrateObserver observer_high;
975 const double kHighBitratePriority = 8.0;
976
977 const uint32_t kMinBitrate = 0;
978 const uint32_t kMaxBitrate = 60;
979 const uint32_t kAvailableBitrate = 100;
980 // Remaining bitrate knowing that the low priority observer is allocated its
981 // max bitrate. We know this because it is allocated 2.0/14.0 (1/7) of the
982 // available bitrate, so 70 bps would be sufficient network bandwidth.
983 const uint32_t kRemainingBitrate = kAvailableBitrate - kLowMaxBitrate;
984
Jonas Olsson0182a032019-07-09 12:31:20 +0200985 AddObserver(&observer_low, kMinBitrate, kLowMaxBitrate, 0, false,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200986 kLowBitratePriority);
Jonas Olsson0182a032019-07-09 12:31:20 +0200987 AddObserver(&observer_mid, kMinBitrate, kMaxBitrate, 0, false,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200988 kMidBitratePriority);
Jonas Olsson0182a032019-07-09 12:31:20 +0200989 AddObserver(&observer_high, kMinBitrate, kMaxBitrate, 0, false,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200990 kHighBitratePriority);
Sebastian Jansson40de3cc2019-09-19 14:54:43 +0200991 allocator_->OnNetworkEstimateChanged(CreateTargetRateMessage(
992 kAvailableBitrate, 0, 0, kDefaultProbingIntervalMs));
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800993
994 const double kMidFractionAllocated =
995 kMidBitratePriority / (kMidBitratePriority + kHighBitratePriority);
996 const double kHighFractionAllocated =
997 kHighBitratePriority / (kMidBitratePriority + kHighBitratePriority);
998 EXPECT_EQ(kLowMaxBitrate, observer_low.last_bitrate_bps_);
999 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kMidFractionAllocated),
1000 observer_mid.last_bitrate_bps_);
1001 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kHighFractionAllocated),
1002 observer_high.last_bitrate_bps_);
1003
1004 allocator_->RemoveObserver(&observer_low);
1005 allocator_->RemoveObserver(&observer_mid);
1006 allocator_->RemoveObserver(&observer_high);
1007}
1008
1009// Tests that after two observers are allocated bitrate to their max, the
1010// the remaining observer is allocated what's left appropriately. This test
1011// handles an edge case where the medium and high observer reach their
1012// "relative" max allocation at the same time. The high has 40 to allocate
1013// above its min, and the mid has 20 to allocate above its min, which scaled
1014// by their bitrate priority is the same for each.
1015TEST_F(BitrateAllocatorTest, PriorityRateThreeObserversTwoAllocatedToMax) {
1016 TestBitrateObserver observer_low;
1017 TestBitrateObserver observer_mid;
1018 TestBitrateObserver observer_high;
Jonas Olsson0182a032019-07-09 12:31:20 +02001019 AddObserver(&observer_low, 10, 40, 0, false, 2.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -08001020 // Scaled allocation above the min allocation is the same for these two,
1021 // meaning they will get allocated their max at the same time.
1022 // Scaled (target allocation) = (max - min) / bitrate priority
Jonas Olsson0182a032019-07-09 12:31:20 +02001023 AddObserver(&observer_mid, 10, 30, 0, false, 4.0);
1024 AddObserver(&observer_high, 10, 50, 0, false, 8.0);
Sebastian Jansson40de3cc2019-09-19 14:54:43 +02001025 allocator_->OnNetworkEstimateChanged(
1026 CreateTargetRateMessage(110, 0, 0, kDefaultProbingIntervalMs));
Seth Hampsonfe73d6a2017-11-14 10:49:06 -08001027
1028 EXPECT_EQ(30u, observer_low.last_bitrate_bps_);
1029 EXPECT_EQ(30u, observer_mid.last_bitrate_bps_);
1030 EXPECT_EQ(50u, observer_high.last_bitrate_bps_);
1031
1032 allocator_->RemoveObserver(&observer_low);
1033 allocator_->RemoveObserver(&observer_mid);
1034 allocator_->RemoveObserver(&observer_high);
1035}
1036
stefan@webrtc.org792f1a12015-03-04 12:24:26 +00001037} // namespace webrtc