blob: 1f0b70c516cf3f17e8871e57695bcaa72bad5301 [file] [log] [blame]
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +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
11
12// This file includes unit tests for ViERemb.
13
pbos@webrtc.org281cff82013-05-17 13:44:48 +000014#include "testing/gmock/include/gmock/gmock.h"
15#include "testing/gtest/include/gtest/gtest.h"
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +000016
mflodman@webrtc.org1d507452012-11-22 09:41:42 +000017#include <vector>
18
mflodman@webrtc.orge6527c12012-11-16 13:24:18 +000019#include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp.h"
20#include "webrtc/modules/rtp_rtcp/mocks/mock_rtp_rtcp.h"
wuchengli@chromium.org1bdf1862014-05-28 07:00:51 +000021#include "webrtc/modules/utility/interface/mock/mock_process_thread.h"
mflodman@webrtc.orge6527c12012-11-16 13:24:18 +000022#include "webrtc/system_wrappers/interface/scoped_ptr.h"
23#include "webrtc/system_wrappers/interface/tick_util.h"
24#include "webrtc/video_engine/vie_remb.h"
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +000025
26using ::testing::_;
27using ::testing::AnyNumber;
wuchengli@chromium.org1bdf1862014-05-28 07:00:51 +000028using ::testing::NiceMock;
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +000029using ::testing::Return;
30
31namespace webrtc {
32
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +000033class ViERembTest : public ::testing::Test {
34 protected:
35 virtual void SetUp() {
mflodman@webrtc.orge6527c12012-11-16 13:24:18 +000036 TickTime::UseFakeClock(12345);
wuchengli@chromium.org1bdf1862014-05-28 07:00:51 +000037 process_thread_.reset(new NiceMock<MockProcessThread>);
stefan@webrtc.org2a5dbce2013-02-01 14:33:42 +000038 vie_remb_.reset(new VieRemb());
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +000039 }
wuchengli@chromium.org1bdf1862014-05-28 07:00:51 +000040 scoped_ptr<MockProcessThread> process_thread_;
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +000041 scoped_ptr<VieRemb> vie_remb_;
42};
43
44TEST_F(ViERembTest, OneModuleTestForSendingRemb) {
45 MockRtpRtcp rtp;
46 vie_remb_->AddReceiveChannel(&rtp);
47 vie_remb_->AddRembSender(&rtp);
48
49 const unsigned int bitrate_estimate = 456;
50 unsigned int ssrc = 1234;
stefan@webrtc.org7d324912012-11-19 10:09:20 +000051 std::vector<unsigned int> ssrcs(&ssrc, &ssrc + 1);
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +000052
solenberg@webrtc.orgb7716d82013-05-22 19:04:19 +000053 vie_remb_->OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +000054
mflodman@webrtc.orge6527c12012-11-16 13:24:18 +000055 TickTime::AdvanceFakeClock(1000);
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +000056 EXPECT_CALL(rtp, SetREMBData(bitrate_estimate, 1, _))
57 .Times(1);
solenberg@webrtc.orgb7716d82013-05-22 19:04:19 +000058 vie_remb_->OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +000059
60 // Lower bitrate to send another REMB packet.
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +000061 EXPECT_CALL(rtp, SetREMBData(bitrate_estimate - 100, 1, _))
62 .Times(1);
solenberg@webrtc.orgb7716d82013-05-22 19:04:19 +000063 vie_remb_->OnReceiveBitrateChanged(ssrcs, bitrate_estimate - 100);
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +000064
65 vie_remb_->RemoveReceiveChannel(&rtp);
66 vie_remb_->RemoveRembSender(&rtp);
67}
68
69TEST_F(ViERembTest, LowerEstimateToSendRemb) {
70 MockRtpRtcp rtp;
71 vie_remb_->AddReceiveChannel(&rtp);
72 vie_remb_->AddRembSender(&rtp);
73
74 unsigned int bitrate_estimate = 456;
75 unsigned int ssrc = 1234;
stefan@webrtc.org7d324912012-11-19 10:09:20 +000076 std::vector<unsigned int> ssrcs(&ssrc, &ssrc + 1);
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +000077
solenberg@webrtc.orgb7716d82013-05-22 19:04:19 +000078 vie_remb_->OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
stefan@webrtc.org2a5dbce2013-02-01 14:33:42 +000079 // Call OnReceiveBitrateChanged twice to get a first estimate.
mflodman@webrtc.orge6527c12012-11-16 13:24:18 +000080 TickTime::AdvanceFakeClock(1000);
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +000081 EXPECT_CALL(rtp, SetREMBData(bitrate_estimate, 1, _))
82 .Times(1);
solenberg@webrtc.orgb7716d82013-05-22 19:04:19 +000083 vie_remb_->OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +000084
85 // Lower the estimate with more than 3% to trigger a call to SetREMBData right
86 // away.
87 bitrate_estimate = bitrate_estimate - 100;
88 EXPECT_CALL(rtp, SetREMBData(bitrate_estimate, 1, _))
89 .Times(1);
solenberg@webrtc.orgb7716d82013-05-22 19:04:19 +000090 vie_remb_->OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +000091}
92
93TEST_F(ViERembTest, VerifyIncreasingAndDecreasing) {
94 MockRtpRtcp rtp_0;
95 MockRtpRtcp rtp_1;
96 vie_remb_->AddReceiveChannel(&rtp_0);
97 vie_remb_->AddRembSender(&rtp_0);
98 vie_remb_->AddReceiveChannel(&rtp_1);
99
100 unsigned int bitrate_estimate[] = { 456, 789 };
101 unsigned int ssrc[] = { 1234, 5678 };
stefan@webrtc.org7d324912012-11-19 10:09:20 +0000102 std::vector<unsigned int> ssrcs(ssrc, ssrc + sizeof(ssrc) / sizeof(ssrc[0]));
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +0000103
solenberg@webrtc.orgb7716d82013-05-22 19:04:19 +0000104 vie_remb_->OnReceiveBitrateChanged(ssrcs, bitrate_estimate[0]);
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +0000105
stefan@webrtc.org2a5dbce2013-02-01 14:33:42 +0000106 // Call OnReceiveBitrateChanged twice to get a first estimate.
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +0000107 EXPECT_CALL(rtp_0, SetREMBData(bitrate_estimate[0], 2, _))
108 .Times(1);
mflodman@webrtc.orge6527c12012-11-16 13:24:18 +0000109 TickTime::AdvanceFakeClock(1000);
solenberg@webrtc.orgb7716d82013-05-22 19:04:19 +0000110 vie_remb_->OnReceiveBitrateChanged(ssrcs, bitrate_estimate[0]);
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +0000111
solenberg@webrtc.orgb7716d82013-05-22 19:04:19 +0000112 vie_remb_->OnReceiveBitrateChanged(ssrcs, bitrate_estimate[1] + 100);
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +0000113
114 // Lower the estimate to trigger a callback.
115 EXPECT_CALL(rtp_0, SetREMBData(bitrate_estimate[1], 2, _))
116 .Times(1);
solenberg@webrtc.orgb7716d82013-05-22 19:04:19 +0000117 vie_remb_->OnReceiveBitrateChanged(ssrcs, bitrate_estimate[1]);
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +0000118
119 vie_remb_->RemoveReceiveChannel(&rtp_0);
120 vie_remb_->RemoveRembSender(&rtp_0);
121 vie_remb_->RemoveReceiveChannel(&rtp_1);
122}
123
124TEST_F(ViERembTest, NoRembForIncreasedBitrate) {
125 MockRtpRtcp rtp_0;
126 MockRtpRtcp rtp_1;
127 vie_remb_->AddReceiveChannel(&rtp_0);
128 vie_remb_->AddRembSender(&rtp_0);
129 vie_remb_->AddReceiveChannel(&rtp_1);
130
131 unsigned int bitrate_estimate = 456;
132 unsigned int ssrc[] = { 1234, 5678 };
stefan@webrtc.org7d324912012-11-19 10:09:20 +0000133 std::vector<unsigned int> ssrcs(ssrc, ssrc + sizeof(ssrc) / sizeof(ssrc[0]));
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +0000134
solenberg@webrtc.orgb7716d82013-05-22 19:04:19 +0000135 vie_remb_->OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
stefan@webrtc.org2a5dbce2013-02-01 14:33:42 +0000136 // Call OnReceiveBitrateChanged twice to get a first estimate.
mflodman@webrtc.orge6527c12012-11-16 13:24:18 +0000137 TickTime::AdvanceFakeClock(1000);
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +0000138 EXPECT_CALL(rtp_0, SetREMBData(bitrate_estimate, 2, _))
139 .Times(1);
solenberg@webrtc.orgb7716d82013-05-22 19:04:19 +0000140 vie_remb_->OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +0000141
142 // Increased estimate shouldn't trigger a callback right away.
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +0000143 EXPECT_CALL(rtp_0, SetREMBData(_, _, _))
144 .Times(0);
solenberg@webrtc.orgb7716d82013-05-22 19:04:19 +0000145 vie_remb_->OnReceiveBitrateChanged(ssrcs, bitrate_estimate + 1);
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +0000146
147 // Decreasing the estimate less than 3% shouldn't trigger a new callback.
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +0000148 EXPECT_CALL(rtp_0, SetREMBData(_, _, _))
149 .Times(0);
stefan@webrtc.org2a5dbce2013-02-01 14:33:42 +0000150 int lower_estimate = bitrate_estimate * 98 / 100;
solenberg@webrtc.orgb7716d82013-05-22 19:04:19 +0000151 vie_remb_->OnReceiveBitrateChanged(ssrcs, lower_estimate);
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +0000152
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +0000153 vie_remb_->RemoveReceiveChannel(&rtp_1);
154 vie_remb_->RemoveReceiveChannel(&rtp_0);
155 vie_remb_->RemoveRembSender(&rtp_0);
156}
157
158TEST_F(ViERembTest, ChangeSendRtpModule) {
159 MockRtpRtcp rtp_0;
160 MockRtpRtcp rtp_1;
161 vie_remb_->AddReceiveChannel(&rtp_0);
162 vie_remb_->AddRembSender(&rtp_0);
163 vie_remb_->AddReceiveChannel(&rtp_1);
164
165 unsigned int bitrate_estimate = 456;
166 unsigned int ssrc[] = { 1234, 5678 };
stefan@webrtc.org7d324912012-11-19 10:09:20 +0000167 std::vector<unsigned int> ssrcs(ssrc, ssrc + sizeof(ssrc) / sizeof(ssrc[0]));
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +0000168
solenberg@webrtc.orgb7716d82013-05-22 19:04:19 +0000169 vie_remb_->OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
stefan@webrtc.org2a5dbce2013-02-01 14:33:42 +0000170 // Call OnReceiveBitrateChanged twice to get a first estimate.
mflodman@webrtc.orge6527c12012-11-16 13:24:18 +0000171 TickTime::AdvanceFakeClock(1000);
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +0000172 EXPECT_CALL(rtp_0, SetREMBData(bitrate_estimate, 2, _))
173 .Times(1);
solenberg@webrtc.orgb7716d82013-05-22 19:04:19 +0000174 vie_remb_->OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +0000175
176 // Decrease estimate to trigger a REMB.
177 bitrate_estimate = bitrate_estimate - 100;
178 EXPECT_CALL(rtp_0, SetREMBData(bitrate_estimate, 2, _))
179 .Times(1);
solenberg@webrtc.orgb7716d82013-05-22 19:04:19 +0000180 vie_remb_->OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +0000181
182 // Remove the sending module, add it again -> should get remb on the second
183 // module.
184 vie_remb_->RemoveRembSender(&rtp_0);
185 vie_remb_->AddRembSender(&rtp_1);
solenberg@webrtc.orgb7716d82013-05-22 19:04:19 +0000186 vie_remb_->OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +0000187
188 bitrate_estimate = bitrate_estimate - 100;
189 EXPECT_CALL(rtp_1, SetREMBData(bitrate_estimate, 2, _))
190 .Times(1);
solenberg@webrtc.orgb7716d82013-05-22 19:04:19 +0000191 vie_remb_->OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +0000192
193 vie_remb_->RemoveReceiveChannel(&rtp_0);
194 vie_remb_->RemoveReceiveChannel(&rtp_1);
195}
196
197TEST_F(ViERembTest, OnlyOneRembForDoubleProcess) {
198 MockRtpRtcp rtp;
199 unsigned int bitrate_estimate = 456;
200 unsigned int ssrc = 1234;
stefan@webrtc.org7d324912012-11-19 10:09:20 +0000201 std::vector<unsigned int> ssrcs(&ssrc, &ssrc + 1);
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +0000202
203 vie_remb_->AddReceiveChannel(&rtp);
204 vie_remb_->AddRembSender(&rtp);
solenberg@webrtc.orgb7716d82013-05-22 19:04:19 +0000205 vie_remb_->OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
stefan@webrtc.org2a5dbce2013-02-01 14:33:42 +0000206 // Call OnReceiveBitrateChanged twice to get a first estimate.
mflodman@webrtc.orge6527c12012-11-16 13:24:18 +0000207 TickTime::AdvanceFakeClock(1000);
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +0000208 EXPECT_CALL(rtp, SetREMBData(_, _, _))
209 .Times(1);
solenberg@webrtc.orgb7716d82013-05-22 19:04:19 +0000210 vie_remb_->OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +0000211
212 // Lower the estimate, should trigger a call to SetREMBData right away.
213 bitrate_estimate = bitrate_estimate - 100;
214 EXPECT_CALL(rtp, SetREMBData(bitrate_estimate, 1, _))
215 .Times(1);
solenberg@webrtc.orgb7716d82013-05-22 19:04:19 +0000216 vie_remb_->OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +0000217
stefan@webrtc.org2a5dbce2013-02-01 14:33:42 +0000218 // Call OnReceiveBitrateChanged again, this should not trigger a new callback.
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +0000219 EXPECT_CALL(rtp, SetREMBData(_, _, _))
220 .Times(0);
solenberg@webrtc.orgb7716d82013-05-22 19:04:19 +0000221 vie_remb_->OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +0000222 vie_remb_->RemoveReceiveChannel(&rtp);
223 vie_remb_->RemoveRembSender(&rtp);
224}
225
226// Only register receiving modules and make sure we fallback to trigger a REMB
227// packet on this one.
228TEST_F(ViERembTest, NoSendingRtpModule) {
229 MockRtpRtcp rtp;
230 vie_remb_->AddReceiveChannel(&rtp);
231
232 unsigned int bitrate_estimate = 456;
233 unsigned int ssrc = 1234;
stefan@webrtc.org7d324912012-11-19 10:09:20 +0000234 std::vector<unsigned int> ssrcs(&ssrc, &ssrc + 1);
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +0000235
solenberg@webrtc.orgb7716d82013-05-22 19:04:19 +0000236 vie_remb_->OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +0000237
stefan@webrtc.org2a5dbce2013-02-01 14:33:42 +0000238 // Call OnReceiveBitrateChanged twice to get a first estimate.
mflodman@webrtc.orge6527c12012-11-16 13:24:18 +0000239 TickTime::AdvanceFakeClock(1000);
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +0000240 EXPECT_CALL(rtp, SetREMBData(_, _, _))
241 .Times(1);
solenberg@webrtc.orgb7716d82013-05-22 19:04:19 +0000242 vie_remb_->OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +0000243
244 // Lower the estimate to trigger a new packet REMB packet.
245 bitrate_estimate = bitrate_estimate - 100;
246 EXPECT_CALL(rtp, SetREMBData(_, _, _))
247 .Times(1);
solenberg@webrtc.orgb7716d82013-05-22 19:04:19 +0000248 vie_remb_->OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +0000249}
250
251} // namespace webrtc