blob: 7abe71b510584cde92b0112a8316f0b1e5d2571a [file] [log] [blame]
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +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
pbos@webrtc.org2e10b8e2013-07-16 12:54:53 +000011#include "testing/gtest/include/gtest/gtest.h"
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +000012
13#include <algorithm>
14#include <vector>
15
pbos@webrtc.org2e10b8e2013-07-16 12:54:53 +000016#include "webrtc/modules/bitrate_controller/include/bitrate_controller.h"
17#include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp_defines.h"
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +000018
19using webrtc::RtcpBandwidthObserver;
20using webrtc::BitrateObserver;
21using webrtc::BitrateController;
22
stefan@webrtc.org28a331e2013-09-17 07:49:56 +000023uint8_t WeightedLoss(int num_packets1, uint8_t fraction_loss1,
24 int num_packets2, uint8_t fraction_loss2) {
25 int weighted_sum = num_packets1 * fraction_loss1 +
26 num_packets2 * fraction_loss2;
27 int total_num_packets = num_packets1 + num_packets2;
28 return (weighted_sum + total_num_packets / 2) / total_num_packets;
29}
30
31webrtc::RTCPReportBlock CreateReportBlock(
32 uint32_t remote_ssrc, uint32_t source_ssrc,
33 uint8_t fraction_lost, uint32_t extended_high_sequence_number) {
34 return webrtc::RTCPReportBlock(remote_ssrc, source_ssrc, fraction_lost, 0,
35 extended_high_sequence_number, 0, 0, 0);
36}
37
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +000038class TestBitrateObserver: public BitrateObserver {
39 public:
40 TestBitrateObserver()
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +000041 : last_bitrate_(0),
42 last_fraction_loss_(0),
43 last_rtt_(0) {
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +000044 }
45
46 virtual void OnNetworkChanged(const uint32_t bitrate,
47 const uint8_t fraction_loss,
48 const uint32_t rtt) {
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +000049 last_bitrate_ = bitrate;
50 last_fraction_loss_ = fraction_loss;
51 last_rtt_ = rtt;
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +000052 }
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +000053 uint32_t last_bitrate_;
54 uint8_t last_fraction_loss_;
55 uint32_t last_rtt_;
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +000056};
57
58class BitrateControllerTest : public ::testing::Test {
59 protected:
60 BitrateControllerTest() {
61 }
62 ~BitrateControllerTest() {}
63
64 virtual void SetUp() {
65 controller_ = BitrateController::CreateBitrateController();
66 bandwidth_observer_ = controller_->CreateRtcpBandwidthObserver();
67 }
68
69 virtual void TearDown() {
70 delete bandwidth_observer_;
71 delete controller_;
72 }
73 BitrateController* controller_;
74 RtcpBandwidthObserver* bandwidth_observer_;
75};
76
77TEST_F(BitrateControllerTest, Basic) {
78 TestBitrateObserver bitrate_observer;
79 controller_->SetBitrateObserver(&bitrate_observer, 200000, 100000, 300000);
80 controller_->RemoveBitrateObserver(&bitrate_observer);
81}
82
83TEST_F(BitrateControllerTest, OneBitrateObserverOneRtcpObserver) {
84 TestBitrateObserver bitrate_observer;
85 controller_->SetBitrateObserver(&bitrate_observer, 200000, 100000, 300000);
86
87 // Receive a high remb, test bitrate inc.
88 bandwidth_observer_->OnReceivedEstimatedBitrate(400000);
89
90 // Test start bitrate.
stefan@webrtc.org28a331e2013-09-17 07:49:56 +000091 webrtc::ReportBlockList report_blocks;
92 report_blocks.push_back(CreateReportBlock(1, 2, 0, 1));
93 bandwidth_observer_->OnReceivedRtcpReceiverReport(report_blocks, 50, 1);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +000094 EXPECT_EQ(0u, bitrate_observer.last_bitrate_);
95 EXPECT_EQ(0, bitrate_observer.last_fraction_loss_);
96 EXPECT_EQ(0u, bitrate_observer.last_rtt_);
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +000097
98 // Test bitrate increase 8% per second.
stefan@webrtc.org28a331e2013-09-17 07:49:56 +000099 report_blocks.clear();
100 report_blocks.push_back(CreateReportBlock(1, 2, 0, 21));
101 bandwidth_observer_->OnReceivedRtcpReceiverReport(report_blocks, 50, 1001);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000102 EXPECT_EQ(217000u, bitrate_observer.last_bitrate_);
103 EXPECT_EQ(0, bitrate_observer.last_fraction_loss_);
104 EXPECT_EQ(50u, bitrate_observer.last_rtt_);
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000105
stefan@webrtc.org28a331e2013-09-17 07:49:56 +0000106 report_blocks.clear();
107 report_blocks.push_back(CreateReportBlock(1, 2, 0, 41));
108 bandwidth_observer_->OnReceivedRtcpReceiverReport(report_blocks, 50, 2001);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000109 EXPECT_EQ(235360u, bitrate_observer.last_bitrate_);
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000110
stefan@webrtc.org28a331e2013-09-17 07:49:56 +0000111 report_blocks.clear();
112 report_blocks.push_back(CreateReportBlock(1, 2, 0, 61));
113 bandwidth_observer_->OnReceivedRtcpReceiverReport(report_blocks, 50, 3001);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000114 EXPECT_EQ(255189u, bitrate_observer.last_bitrate_);
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000115
stefan@webrtc.org28a331e2013-09-17 07:49:56 +0000116 report_blocks.clear();
117 report_blocks.push_back(CreateReportBlock(1, 2, 0, 801));
118 bandwidth_observer_->OnReceivedRtcpReceiverReport(report_blocks, 50, 4001);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000119 EXPECT_EQ(276604u, bitrate_observer.last_bitrate_);
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000120
stefan@webrtc.org28a331e2013-09-17 07:49:56 +0000121 report_blocks.clear();
122 report_blocks.push_back(CreateReportBlock(1, 2, 0, 101));
123 bandwidth_observer_->OnReceivedRtcpReceiverReport(report_blocks, 50, 5001);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000124 EXPECT_EQ(299732u, bitrate_observer.last_bitrate_);
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000125
stefan@webrtc.org28a331e2013-09-17 07:49:56 +0000126 report_blocks.clear();
127 report_blocks.push_back(CreateReportBlock(1, 2, 0, 121));
128 bandwidth_observer_->OnReceivedRtcpReceiverReport(report_blocks, 50, 6001);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000129 EXPECT_EQ(300000u, bitrate_observer.last_bitrate_); // Max cap.
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000130
stefan@webrtc.org28a331e2013-09-17 07:49:56 +0000131 report_blocks.clear();
132 report_blocks.push_back(CreateReportBlock(1, 2, 0, 141));
133 bandwidth_observer_->OnReceivedRtcpReceiverReport(report_blocks, 50, 7001);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000134 EXPECT_EQ(300000u, bitrate_observer.last_bitrate_); // Max cap.
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000135
136 // Test that a low REMB trigger immediately.
137 bandwidth_observer_->OnReceivedEstimatedBitrate(250000);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000138 EXPECT_EQ(250000u, bitrate_observer.last_bitrate_);
139 EXPECT_EQ(0, bitrate_observer.last_fraction_loss_);
140 EXPECT_EQ(50u, bitrate_observer.last_rtt_);
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000141
142 bandwidth_observer_->OnReceivedEstimatedBitrate(1000);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000143 EXPECT_EQ(100000u, bitrate_observer.last_bitrate_); // Min cap.
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000144 controller_->RemoveBitrateObserver(&bitrate_observer);
145}
146
147TEST_F(BitrateControllerTest, OneBitrateObserverTwoRtcpObservers) {
148 TestBitrateObserver bitrate_observer;
149 controller_->SetBitrateObserver(&bitrate_observer, 200000, 100000, 300000);
150
151 RtcpBandwidthObserver* second_bandwidth_observer =
152 controller_->CreateRtcpBandwidthObserver();
153
154 // Receive a high remb, test bitrate inc.
155 bandwidth_observer_->OnReceivedEstimatedBitrate(400000);
156
157 // Test start bitrate.
stefan@webrtc.org28a331e2013-09-17 07:49:56 +0000158 webrtc::ReportBlockList report_blocks;
159 report_blocks.push_back(CreateReportBlock(1, 2, 0, 1));
160 bandwidth_observer_->OnReceivedRtcpReceiverReport(report_blocks, 50, 1);
161 second_bandwidth_observer->OnReceivedRtcpReceiverReport(
162 report_blocks, 100, 1);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000163 EXPECT_EQ(0u, bitrate_observer.last_bitrate_);
164 EXPECT_EQ(0, bitrate_observer.last_fraction_loss_);
165 EXPECT_EQ(0u, bitrate_observer.last_rtt_);
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000166
167 // Test bitrate increase 8% per second.
stefan@webrtc.org28a331e2013-09-17 07:49:56 +0000168 report_blocks.clear();
169 report_blocks.push_back(CreateReportBlock(1, 2, 0, 21));
170 bandwidth_observer_->OnReceivedRtcpReceiverReport(report_blocks, 50, 501);
171 second_bandwidth_observer->OnReceivedRtcpReceiverReport(report_blocks, 100,
172 1001);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000173 EXPECT_EQ(217000u, bitrate_observer.last_bitrate_);
174 EXPECT_EQ(0, bitrate_observer.last_fraction_loss_);
175 EXPECT_EQ(100u, bitrate_observer.last_rtt_);
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000176
177 // Extra report should not change estimate.
stefan@webrtc.org28a331e2013-09-17 07:49:56 +0000178 report_blocks.clear();
179 report_blocks.push_back(CreateReportBlock(1, 2, 0, 31));
180 second_bandwidth_observer->OnReceivedRtcpReceiverReport(report_blocks, 100,
181 1501);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000182 EXPECT_EQ(217000u, bitrate_observer.last_bitrate_);
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000183
stefan@webrtc.org28a331e2013-09-17 07:49:56 +0000184 report_blocks.clear();
185 report_blocks.push_back(CreateReportBlock(1, 2, 0, 41));
186 bandwidth_observer_->OnReceivedRtcpReceiverReport(report_blocks, 50, 2001);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000187 EXPECT_EQ(235360u, bitrate_observer.last_bitrate_);
pwestin@webrtc.orga2cd7322012-04-23 08:32:47 +0000188
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000189 // Second report should not change estimate.
stefan@webrtc.org28a331e2013-09-17 07:49:56 +0000190 report_blocks.clear();
191 report_blocks.push_back(CreateReportBlock(1, 2, 0, 41));
192 second_bandwidth_observer->OnReceivedRtcpReceiverReport(report_blocks, 100,
193 2001);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000194 EXPECT_EQ(235360u, bitrate_observer.last_bitrate_);
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000195
196 // Reports from only one bandwidth observer is ok.
stefan@webrtc.org28a331e2013-09-17 07:49:56 +0000197 report_blocks.clear();
198 report_blocks.push_back(CreateReportBlock(1, 2, 0, 61));
199 second_bandwidth_observer->OnReceivedRtcpReceiverReport(report_blocks, 50,
200 3001);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000201 EXPECT_EQ(255189u, bitrate_observer.last_bitrate_);
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000202
stefan@webrtc.org28a331e2013-09-17 07:49:56 +0000203 report_blocks.clear();
204 report_blocks.push_back(CreateReportBlock(1, 2, 0, 81));
205 second_bandwidth_observer->OnReceivedRtcpReceiverReport(report_blocks, 50,
206 4001);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000207 EXPECT_EQ(276604u, bitrate_observer.last_bitrate_);
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000208
stefan@webrtc.org28a331e2013-09-17 07:49:56 +0000209 report_blocks.clear();
210 report_blocks.push_back(CreateReportBlock(1, 2, 0, 101));
211 second_bandwidth_observer->OnReceivedRtcpReceiverReport(report_blocks, 50,
212 5001);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000213 EXPECT_EQ(299732u, bitrate_observer.last_bitrate_);
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000214
stefan@webrtc.org28a331e2013-09-17 07:49:56 +0000215 report_blocks.clear();
216 report_blocks.push_back(CreateReportBlock(1, 2, 0, 121));
217 second_bandwidth_observer->OnReceivedRtcpReceiverReport(report_blocks, 50,
218 6001);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000219 EXPECT_EQ(300000u, bitrate_observer.last_bitrate_); // Max cap.
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000220
stefan@webrtc.org28a331e2013-09-17 07:49:56 +0000221 report_blocks.clear();
222 report_blocks.push_back(CreateReportBlock(1, 2, 0, 141));
223 second_bandwidth_observer->OnReceivedRtcpReceiverReport(report_blocks, 50,
224 7001);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000225 EXPECT_EQ(300000u, bitrate_observer.last_bitrate_); // Max cap.
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000226
227 // Test that a low REMB trigger immediately.
228 // We don't care which bandwidth observer that delivers the REMB.
229 second_bandwidth_observer->OnReceivedEstimatedBitrate(250000);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000230 EXPECT_EQ(250000u, bitrate_observer.last_bitrate_);
231 EXPECT_EQ(0, bitrate_observer.last_fraction_loss_);
232 EXPECT_EQ(50u, bitrate_observer.last_rtt_);
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000233
234 bandwidth_observer_->OnReceivedEstimatedBitrate(1000);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000235 EXPECT_EQ(100000u, bitrate_observer.last_bitrate_); // Min cap.
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000236 controller_->RemoveBitrateObserver(&bitrate_observer);
237 delete second_bandwidth_observer;
238}
239
stefan@webrtc.org28a331e2013-09-17 07:49:56 +0000240TEST_F(BitrateControllerTest, OneBitrateObserverMultipleReportBlocks) {
241 TestBitrateObserver bitrate_observer;
242 uint32_t sequence_number[2] = {0, 0xFF00};
243 const uint32_t kStartBitrate = 200000;
244 const uint32_t kMinBitrate = 100000;
245 const uint32_t kMaxBitrate = 300000;
246 controller_->SetBitrateObserver(&bitrate_observer, kStartBitrate, kMinBitrate,
247 kMaxBitrate);
248
249 // Receive a high REMB, test bitrate increase.
250 bandwidth_observer_->OnReceivedEstimatedBitrate(400000);
251
252 webrtc::ReportBlockList report_blocks;
253 int64_t time_ms = 1001;
254 uint32_t last_bitrate = 0;
255 // Ramp up to max bitrate.
256 for (int i = 0; i < 6; ++i) {
257 report_blocks.push_back(CreateReportBlock(1, 2, 0, sequence_number[0]));
258 report_blocks.push_back(CreateReportBlock(1, 3, 0, sequence_number[1]));
259 bandwidth_observer_->OnReceivedRtcpReceiverReport(report_blocks, 50,
260 time_ms);
261 EXPECT_GT(bitrate_observer.last_bitrate_, last_bitrate);
262 EXPECT_EQ(0, bitrate_observer.last_fraction_loss_);
263 EXPECT_EQ(50u, bitrate_observer.last_rtt_);
264 last_bitrate = bitrate_observer.last_bitrate_;
265 time_ms += 1000;
266 sequence_number[0] += 20;
267 sequence_number[1] += 1;
268 report_blocks.clear();
269 }
270
271 EXPECT_EQ(kMaxBitrate, bitrate_observer.last_bitrate_);
272
273 // Packet loss on the first stream. Verify that bitrate decreases.
274 report_blocks.push_back(CreateReportBlock(1, 2, 50, sequence_number[0]));
275 report_blocks.push_back(CreateReportBlock(1, 3, 0, sequence_number[1]));
276 bandwidth_observer_->OnReceivedRtcpReceiverReport(report_blocks, 50, time_ms);
277 EXPECT_LT(bitrate_observer.last_bitrate_, last_bitrate);
278 EXPECT_EQ(WeightedLoss(20, 50, 1, 0), bitrate_observer.last_fraction_loss_);
279 EXPECT_EQ(50u, bitrate_observer.last_rtt_);
280 last_bitrate = bitrate_observer.last_bitrate_;
281 sequence_number[0] += 20;
282 sequence_number[1] += 20;
283 time_ms += 1000;
284 report_blocks.clear();
285
286 // Packet loss on the second stream. Verify that bitrate decreases.
287 report_blocks.push_back(CreateReportBlock(1, 2, 0, sequence_number[0]));
288 report_blocks.push_back(CreateReportBlock(1, 3, 75, sequence_number[1]));
289 bandwidth_observer_->OnReceivedRtcpReceiverReport(report_blocks, 50, time_ms);
290 EXPECT_LT(bitrate_observer.last_bitrate_, last_bitrate);
291 EXPECT_EQ(WeightedLoss(20, 0, 20, 75), bitrate_observer.last_fraction_loss_);
292 EXPECT_EQ(50u, bitrate_observer.last_rtt_);
293 last_bitrate = bitrate_observer.last_bitrate_;
294 sequence_number[0] += 20;
295 sequence_number[1] += 1;
296 time_ms += 1000;
297 report_blocks.clear();
298
299 // All packets lost on stream with few packets, no back-off.
300 report_blocks.push_back(CreateReportBlock(1, 2, 1, sequence_number[0]));
301 report_blocks.push_back(CreateReportBlock(1, 3, 255, sequence_number[1]));
302 bandwidth_observer_->OnReceivedRtcpReceiverReport(report_blocks, 50, time_ms);
303 EXPECT_EQ(bitrate_observer.last_bitrate_, last_bitrate);
304 EXPECT_EQ(WeightedLoss(20, 1, 1, 255), bitrate_observer.last_fraction_loss_);
305 EXPECT_EQ(50u, bitrate_observer.last_rtt_);
306 last_bitrate = bitrate_observer.last_bitrate_;
307 sequence_number[0] += 20;
308 sequence_number[1] += 1;
309 report_blocks.clear();
310}
311
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000312TEST_F(BitrateControllerTest, TwoBitrateObserversOneRtcpObserver) {
313 TestBitrateObserver bitrate_observer_1;
314 TestBitrateObserver bitrate_observer_2;
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000315 controller_->SetBitrateObserver(&bitrate_observer_2, 200000, 200000, 300000);
stefan@webrtc.org1281dc02012-08-13 16:13:09 +0000316 controller_->SetBitrateObserver(&bitrate_observer_1, 200000, 100000, 300000);
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000317
318 // Receive a high remb, test bitrate inc.
319 bandwidth_observer_->OnReceivedEstimatedBitrate(400000);
320
321 // Test too low start bitrate, hence lower than sum of min.
stefan@webrtc.org28a331e2013-09-17 07:49:56 +0000322 webrtc::ReportBlockList report_blocks;
323 report_blocks.push_back(CreateReportBlock(1, 2, 0, 1));
324 bandwidth_observer_->OnReceivedRtcpReceiverReport(report_blocks, 50, 1);
pwestin@webrtc.orga2cd7322012-04-23 08:32:47 +0000325
326 // Test bitrate increase 8% per second, distributed equally.
stefan@webrtc.org28a331e2013-09-17 07:49:56 +0000327 report_blocks.clear();
328 report_blocks.push_back(CreateReportBlock(1, 2, 0, 21));
329 bandwidth_observer_->OnReceivedRtcpReceiverReport(report_blocks, 50, 1001);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000330 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_);
331 EXPECT_EQ(0, bitrate_observer_1.last_fraction_loss_);
332 EXPECT_EQ(50u, bitrate_observer_1.last_rtt_);
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000333
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000334 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_);
335 EXPECT_EQ(0, bitrate_observer_2.last_fraction_loss_);
336 EXPECT_EQ(50u, bitrate_observer_2.last_rtt_);
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000337
stefan@webrtc.org28a331e2013-09-17 07:49:56 +0000338 report_blocks.clear();
339 report_blocks.push_back(CreateReportBlock(1, 2, 0, 41));
340 bandwidth_observer_->OnReceivedRtcpReceiverReport(report_blocks, 50, 2001);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000341 EXPECT_EQ(112500u, bitrate_observer_1.last_bitrate_);
342 EXPECT_EQ(212500u, bitrate_observer_2.last_bitrate_);
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000343
stefan@webrtc.org28a331e2013-09-17 07:49:56 +0000344 report_blocks.clear();
345 report_blocks.push_back(CreateReportBlock(1, 2, 0, 61));
346 bandwidth_observer_->OnReceivedRtcpReceiverReport(report_blocks, 50, 3001);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000347 EXPECT_EQ(126000u, bitrate_observer_1.last_bitrate_);
348 EXPECT_EQ(226000u, bitrate_observer_2.last_bitrate_);
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000349
stefan@webrtc.org28a331e2013-09-17 07:49:56 +0000350 report_blocks.clear();
351 report_blocks.push_back(CreateReportBlock(1, 2, 0, 81));
352 bandwidth_observer_->OnReceivedRtcpReceiverReport(report_blocks, 50, 4001);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000353 EXPECT_EQ(140580u, bitrate_observer_1.last_bitrate_);
354 EXPECT_EQ(240580u, bitrate_observer_2.last_bitrate_);
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000355
356 // Check that the bitrate sum honor our REMB.
stefan@webrtc.org28a331e2013-09-17 07:49:56 +0000357 report_blocks.clear();
358 report_blocks.push_back(CreateReportBlock(1, 2, 0, 101));
359 bandwidth_observer_->OnReceivedRtcpReceiverReport(report_blocks, 50, 5001);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000360 EXPECT_EQ(150000u, bitrate_observer_1.last_bitrate_);
361 EXPECT_EQ(250000u, bitrate_observer_2.last_bitrate_);
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000362
363 // Remove REMB cap, higher than sum of max.
364 bandwidth_observer_->OnReceivedEstimatedBitrate(700000);
365
stefan@webrtc.org28a331e2013-09-17 07:49:56 +0000366 report_blocks.clear();
367 report_blocks.push_back(CreateReportBlock(1, 2, 0, 121));
368 bandwidth_observer_->OnReceivedRtcpReceiverReport(report_blocks, 50, 6001);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000369 EXPECT_EQ(166500u, bitrate_observer_1.last_bitrate_);
370 EXPECT_EQ(266500u, bitrate_observer_2.last_bitrate_);
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000371
stefan@webrtc.org28a331e2013-09-17 07:49:56 +0000372 report_blocks.clear();
373 report_blocks.push_back(CreateReportBlock(1, 2, 0, 141));
374 bandwidth_observer_->OnReceivedRtcpReceiverReport(report_blocks, 50, 7001);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000375 EXPECT_EQ(184320u, bitrate_observer_1.last_bitrate_);
376 EXPECT_EQ(284320u, bitrate_observer_2.last_bitrate_);
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000377
stefan@webrtc.org28a331e2013-09-17 07:49:56 +0000378 report_blocks.clear();
379 report_blocks.push_back(CreateReportBlock(1, 2, 0, 161));
380 bandwidth_observer_->OnReceivedRtcpReceiverReport(report_blocks, 50, 8001);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000381 EXPECT_EQ(207130u, bitrate_observer_1.last_bitrate_);
382 EXPECT_EQ(300000u, bitrate_observer_2.last_bitrate_); // Max cap.
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000383
stefan@webrtc.org28a331e2013-09-17 07:49:56 +0000384 report_blocks.clear();
385 report_blocks.push_back(CreateReportBlock(1, 2, 0, 181));
386 bandwidth_observer_->OnReceivedRtcpReceiverReport(report_blocks, 50, 9001);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000387 EXPECT_EQ(248700u, bitrate_observer_1.last_bitrate_);
388 EXPECT_EQ(300000u, bitrate_observer_2.last_bitrate_);
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000389
stefan@webrtc.org28a331e2013-09-17 07:49:56 +0000390 report_blocks.clear();
391 report_blocks.push_back(CreateReportBlock(1, 2, 0, 201));
392 bandwidth_observer_->OnReceivedRtcpReceiverReport(report_blocks, 50, 10001);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000393 EXPECT_EQ(293596u, bitrate_observer_1.last_bitrate_);
394 EXPECT_EQ(300000u, bitrate_observer_2.last_bitrate_);
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000395
stefan@webrtc.org28a331e2013-09-17 07:49:56 +0000396 report_blocks.clear();
397 report_blocks.push_back(CreateReportBlock(1, 2, 0, 221));
398 bandwidth_observer_->OnReceivedRtcpReceiverReport(report_blocks, 50, 11001);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000399 EXPECT_EQ(300000u, bitrate_observer_1.last_bitrate_); // Max cap.
400 EXPECT_EQ(300000u, bitrate_observer_2.last_bitrate_);
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000401
402 // Test that a low REMB trigger immediately.
403 bandwidth_observer_->OnReceivedEstimatedBitrate(350000);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000404 EXPECT_EQ(125000u, bitrate_observer_1.last_bitrate_);
405 EXPECT_EQ(0, bitrate_observer_1.last_fraction_loss_);
406 EXPECT_EQ(50u, bitrate_observer_1.last_rtt_);
407 EXPECT_EQ(225000u, bitrate_observer_2.last_bitrate_);
408 EXPECT_EQ(0, bitrate_observer_2.last_fraction_loss_);
409 EXPECT_EQ(50u, bitrate_observer_2.last_rtt_);
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000410
411 bandwidth_observer_->OnReceivedEstimatedBitrate(1000);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000412 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_); // Min cap.
413 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_); // Min cap.
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000414 controller_->RemoveBitrateObserver(&bitrate_observer_1);
415 controller_->RemoveBitrateObserver(&bitrate_observer_2);
416}