blob: fcf419e8cd16d84f4bc92241e1a39179f01c5476 [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
23class TestBitrateObserver: public BitrateObserver {
24 public:
25 TestBitrateObserver()
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +000026 : last_bitrate_(0),
27 last_fraction_loss_(0),
28 last_rtt_(0) {
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +000029 }
30
31 virtual void OnNetworkChanged(const uint32_t bitrate,
32 const uint8_t fraction_loss,
33 const uint32_t rtt) {
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +000034 last_bitrate_ = bitrate;
35 last_fraction_loss_ = fraction_loss;
36 last_rtt_ = rtt;
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +000037 }
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +000038 uint32_t last_bitrate_;
39 uint8_t last_fraction_loss_;
40 uint32_t last_rtt_;
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +000041};
42
43class BitrateControllerTest : public ::testing::Test {
44 protected:
45 BitrateControllerTest() {
46 }
47 ~BitrateControllerTest() {}
48
49 virtual void SetUp() {
50 controller_ = BitrateController::CreateBitrateController();
51 bandwidth_observer_ = controller_->CreateRtcpBandwidthObserver();
52 }
53
54 virtual void TearDown() {
55 delete bandwidth_observer_;
56 delete controller_;
57 }
58 BitrateController* controller_;
59 RtcpBandwidthObserver* bandwidth_observer_;
60};
61
62TEST_F(BitrateControllerTest, Basic) {
63 TestBitrateObserver bitrate_observer;
64 controller_->SetBitrateObserver(&bitrate_observer, 200000, 100000, 300000);
65 controller_->RemoveBitrateObserver(&bitrate_observer);
66}
67
68TEST_F(BitrateControllerTest, OneBitrateObserverOneRtcpObserver) {
69 TestBitrateObserver bitrate_observer;
70 controller_->SetBitrateObserver(&bitrate_observer, 200000, 100000, 300000);
71
72 // Receive a high remb, test bitrate inc.
73 bandwidth_observer_->OnReceivedEstimatedBitrate(400000);
74
75 // Test start bitrate.
76 bandwidth_observer_->OnReceivedRtcpReceiverReport(1, 0, 50, 1, 1);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +000077 EXPECT_EQ(0u, bitrate_observer.last_bitrate_);
78 EXPECT_EQ(0, bitrate_observer.last_fraction_loss_);
79 EXPECT_EQ(0u, bitrate_observer.last_rtt_);
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +000080
81 // Test bitrate increase 8% per second.
82 bandwidth_observer_->OnReceivedRtcpReceiverReport(1, 0, 50, 21, 1001);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +000083 EXPECT_EQ(217000u, bitrate_observer.last_bitrate_);
84 EXPECT_EQ(0, bitrate_observer.last_fraction_loss_);
85 EXPECT_EQ(50u, bitrate_observer.last_rtt_);
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +000086
87 bandwidth_observer_->OnReceivedRtcpReceiverReport(1, 0, 50, 41, 2001);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +000088 EXPECT_EQ(235360u, bitrate_observer.last_bitrate_);
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +000089
90 bandwidth_observer_->OnReceivedRtcpReceiverReport(1, 0, 50, 61, 3001);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +000091 EXPECT_EQ(255189u, bitrate_observer.last_bitrate_);
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +000092
pwestin@webrtc.orga2cd7322012-04-23 08:32:47 +000093 bandwidth_observer_->OnReceivedRtcpReceiverReport(1, 0, 50, 801, 4001);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +000094 EXPECT_EQ(276604u, bitrate_observer.last_bitrate_);
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +000095
96 bandwidth_observer_->OnReceivedRtcpReceiverReport(1, 0, 50, 101, 5001);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +000097 EXPECT_EQ(299732u, bitrate_observer.last_bitrate_);
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +000098
99 bandwidth_observer_->OnReceivedRtcpReceiverReport(1, 0, 50, 121, 6001);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000100 EXPECT_EQ(300000u, bitrate_observer.last_bitrate_); // Max cap.
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000101
102 bandwidth_observer_->OnReceivedRtcpReceiverReport(1, 0, 50, 141, 7001);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000103 EXPECT_EQ(300000u, bitrate_observer.last_bitrate_); // Max cap.
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000104
105 // Test that a low REMB trigger immediately.
106 bandwidth_observer_->OnReceivedEstimatedBitrate(250000);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000107 EXPECT_EQ(250000u, bitrate_observer.last_bitrate_);
108 EXPECT_EQ(0, bitrate_observer.last_fraction_loss_);
109 EXPECT_EQ(50u, bitrate_observer.last_rtt_);
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000110
111 bandwidth_observer_->OnReceivedEstimatedBitrate(1000);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000112 EXPECT_EQ(100000u, bitrate_observer.last_bitrate_); // Min cap.
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000113 controller_->RemoveBitrateObserver(&bitrate_observer);
114}
115
116TEST_F(BitrateControllerTest, OneBitrateObserverTwoRtcpObservers) {
117 TestBitrateObserver bitrate_observer;
118 controller_->SetBitrateObserver(&bitrate_observer, 200000, 100000, 300000);
119
120 RtcpBandwidthObserver* second_bandwidth_observer =
121 controller_->CreateRtcpBandwidthObserver();
122
123 // Receive a high remb, test bitrate inc.
124 bandwidth_observer_->OnReceivedEstimatedBitrate(400000);
125
126 // Test start bitrate.
127 bandwidth_observer_->OnReceivedRtcpReceiverReport(1, 0, 50, 1, 1);
128 second_bandwidth_observer->OnReceivedRtcpReceiverReport(1, 0, 100, 1, 1);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000129 EXPECT_EQ(0u, bitrate_observer.last_bitrate_);
130 EXPECT_EQ(0, bitrate_observer.last_fraction_loss_);
131 EXPECT_EQ(0u, bitrate_observer.last_rtt_);
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000132
133 // Test bitrate increase 8% per second.
pwestin@webrtc.orga2cd7322012-04-23 08:32:47 +0000134 bandwidth_observer_->OnReceivedRtcpReceiverReport(1, 0, 50, 21, 501);
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000135 second_bandwidth_observer->OnReceivedRtcpReceiverReport(1, 0, 100, 21, 1001);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000136 EXPECT_EQ(217000u, bitrate_observer.last_bitrate_);
137 EXPECT_EQ(0, bitrate_observer.last_fraction_loss_);
138 EXPECT_EQ(100u, bitrate_observer.last_rtt_);
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000139
140 // Extra report should not change estimate.
141 second_bandwidth_observer->OnReceivedRtcpReceiverReport(1, 0, 100, 31, 1501);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000142 EXPECT_EQ(217000u, bitrate_observer.last_bitrate_);
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000143
144 bandwidth_observer_->OnReceivedRtcpReceiverReport(1, 0, 50, 41, 2001);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000145 EXPECT_EQ(235360u, bitrate_observer.last_bitrate_);
pwestin@webrtc.orga2cd7322012-04-23 08:32:47 +0000146
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000147 // Second report should not change estimate.
148 second_bandwidth_observer->OnReceivedRtcpReceiverReport(1, 0, 100, 41, 2001);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000149 EXPECT_EQ(235360u, bitrate_observer.last_bitrate_);
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000150
151 // Reports from only one bandwidth observer is ok.
152 second_bandwidth_observer->OnReceivedRtcpReceiverReport(1, 0, 50, 61, 3001);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000153 EXPECT_EQ(255189u, bitrate_observer.last_bitrate_);
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000154
155 second_bandwidth_observer->OnReceivedRtcpReceiverReport(1, 0, 50, 81, 4001);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000156 EXPECT_EQ(276604u, bitrate_observer.last_bitrate_);
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000157
158 second_bandwidth_observer->OnReceivedRtcpReceiverReport(1, 0, 50, 101, 5001);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000159 EXPECT_EQ(299732u, bitrate_observer.last_bitrate_);
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000160
161 second_bandwidth_observer->OnReceivedRtcpReceiverReport(1, 0, 50, 121, 6001);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000162 EXPECT_EQ(300000u, bitrate_observer.last_bitrate_); // Max cap.
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000163
164 second_bandwidth_observer->OnReceivedRtcpReceiverReport(1, 0, 50, 141, 7001);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000165 EXPECT_EQ(300000u, bitrate_observer.last_bitrate_); // Max cap.
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000166
167 // Test that a low REMB trigger immediately.
168 // We don't care which bandwidth observer that delivers the REMB.
169 second_bandwidth_observer->OnReceivedEstimatedBitrate(250000);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000170 EXPECT_EQ(250000u, bitrate_observer.last_bitrate_);
171 EXPECT_EQ(0, bitrate_observer.last_fraction_loss_);
172 EXPECT_EQ(50u, bitrate_observer.last_rtt_);
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000173
174 bandwidth_observer_->OnReceivedEstimatedBitrate(1000);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000175 EXPECT_EQ(100000u, bitrate_observer.last_bitrate_); // Min cap.
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000176 controller_->RemoveBitrateObserver(&bitrate_observer);
177 delete second_bandwidth_observer;
178}
179
180TEST_F(BitrateControllerTest, TwoBitrateObserversOneRtcpObserver) {
181 TestBitrateObserver bitrate_observer_1;
182 TestBitrateObserver bitrate_observer_2;
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000183 controller_->SetBitrateObserver(&bitrate_observer_2, 200000, 200000, 300000);
stefan@webrtc.org1281dc02012-08-13 16:13:09 +0000184 controller_->SetBitrateObserver(&bitrate_observer_1, 200000, 100000, 300000);
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000185
186 // Receive a high remb, test bitrate inc.
187 bandwidth_observer_->OnReceivedEstimatedBitrate(400000);
188
189 // Test too low start bitrate, hence lower than sum of min.
190 bandwidth_observer_->OnReceivedRtcpReceiverReport(1, 0, 50, 1, 1);
pwestin@webrtc.orga2cd7322012-04-23 08:32:47 +0000191
192 // Test bitrate increase 8% per second, distributed equally.
193 bandwidth_observer_->OnReceivedRtcpReceiverReport(1, 0, 50, 21, 1001);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000194 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_);
195 EXPECT_EQ(0, bitrate_observer_1.last_fraction_loss_);
196 EXPECT_EQ(50u, bitrate_observer_1.last_rtt_);
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000197
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000198 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_);
199 EXPECT_EQ(0, bitrate_observer_2.last_fraction_loss_);
200 EXPECT_EQ(50u, bitrate_observer_2.last_rtt_);
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000201
pwestin@webrtc.orga2cd7322012-04-23 08:32:47 +0000202 bandwidth_observer_->OnReceivedRtcpReceiverReport(1, 0, 50, 41, 2001);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000203 EXPECT_EQ(112500u, bitrate_observer_1.last_bitrate_);
204 EXPECT_EQ(212500u, bitrate_observer_2.last_bitrate_);
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000205
pwestin@webrtc.orga2cd7322012-04-23 08:32:47 +0000206 bandwidth_observer_->OnReceivedRtcpReceiverReport(1, 0, 50, 61, 3001);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000207 EXPECT_EQ(126000u, bitrate_observer_1.last_bitrate_);
208 EXPECT_EQ(226000u, bitrate_observer_2.last_bitrate_);
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000209
pwestin@webrtc.orga2cd7322012-04-23 08:32:47 +0000210 bandwidth_observer_->OnReceivedRtcpReceiverReport(1, 0, 50, 81, 4001);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000211 EXPECT_EQ(140580u, bitrate_observer_1.last_bitrate_);
212 EXPECT_EQ(240580u, bitrate_observer_2.last_bitrate_);
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000213
214 // Check that the bitrate sum honor our REMB.
pwestin@webrtc.orga2cd7322012-04-23 08:32:47 +0000215 bandwidth_observer_->OnReceivedRtcpReceiverReport(1, 0, 50, 101, 5001);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000216 EXPECT_EQ(150000u, bitrate_observer_1.last_bitrate_);
217 EXPECT_EQ(250000u, bitrate_observer_2.last_bitrate_);
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000218
219 // Remove REMB cap, higher than sum of max.
220 bandwidth_observer_->OnReceivedEstimatedBitrate(700000);
221
pwestin@webrtc.orga2cd7322012-04-23 08:32:47 +0000222 bandwidth_observer_->OnReceivedRtcpReceiverReport(1, 0, 50, 121, 6001);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000223 EXPECT_EQ(166500u, bitrate_observer_1.last_bitrate_);
224 EXPECT_EQ(266500u, bitrate_observer_2.last_bitrate_);
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000225
pwestin@webrtc.orga2cd7322012-04-23 08:32:47 +0000226 bandwidth_observer_->OnReceivedRtcpReceiverReport(1, 0, 50, 141, 7001);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000227 EXPECT_EQ(184320u, bitrate_observer_1.last_bitrate_);
228 EXPECT_EQ(284320u, bitrate_observer_2.last_bitrate_);
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000229
pwestin@webrtc.orga2cd7322012-04-23 08:32:47 +0000230 bandwidth_observer_->OnReceivedRtcpReceiverReport(1, 0, 50, 161, 8001);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000231 EXPECT_EQ(207130u, bitrate_observer_1.last_bitrate_);
232 EXPECT_EQ(300000u, bitrate_observer_2.last_bitrate_); // Max cap.
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000233
pwestin@webrtc.orga2cd7322012-04-23 08:32:47 +0000234 bandwidth_observer_->OnReceivedRtcpReceiverReport(1, 0, 50, 181, 9001);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000235 EXPECT_EQ(248700u, bitrate_observer_1.last_bitrate_);
236 EXPECT_EQ(300000u, bitrate_observer_2.last_bitrate_);
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000237
pwestin@webrtc.orga2cd7322012-04-23 08:32:47 +0000238 bandwidth_observer_->OnReceivedRtcpReceiverReport(1, 0, 50, 201, 10001);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000239 EXPECT_EQ(293596u, bitrate_observer_1.last_bitrate_);
240 EXPECT_EQ(300000u, bitrate_observer_2.last_bitrate_);
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000241
pwestin@webrtc.orga2cd7322012-04-23 08:32:47 +0000242 bandwidth_observer_->OnReceivedRtcpReceiverReport(1, 0, 50, 221, 11001);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000243 EXPECT_EQ(300000u, bitrate_observer_1.last_bitrate_); // Max cap.
244 EXPECT_EQ(300000u, bitrate_observer_2.last_bitrate_);
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000245
246 // Test that a low REMB trigger immediately.
247 bandwidth_observer_->OnReceivedEstimatedBitrate(350000);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000248 EXPECT_EQ(125000u, bitrate_observer_1.last_bitrate_);
249 EXPECT_EQ(0, bitrate_observer_1.last_fraction_loss_);
250 EXPECT_EQ(50u, bitrate_observer_1.last_rtt_);
251 EXPECT_EQ(225000u, bitrate_observer_2.last_bitrate_);
252 EXPECT_EQ(0, bitrate_observer_2.last_fraction_loss_);
253 EXPECT_EQ(50u, bitrate_observer_2.last_rtt_);
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000254
255 bandwidth_observer_->OnReceivedEstimatedBitrate(1000);
kjellander@webrtc.org2e84c112012-05-31 13:55:01 +0000256 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_); // Min cap.
257 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_); // Min cap.
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000258 controller_->RemoveBitrateObserver(&bitrate_observer_1);
259 controller_->RemoveBitrateObserver(&bitrate_observer_2);
260}