blob: 5add5f73749151f97ba2d6f5c2db4d5461068d79 [file] [log] [blame]
Stefan Holmere5904162015-03-26 11:11:06 +01001/*
2 * Copyright (c) 2015 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 "modules/pacing/packet_router.h"
12
Yves Gerey3e707812018-11-28 16:47:49 +010013#include <cstddef>
14#include <cstdint>
Erik Språngf6468d22019-07-05 16:53:43 +020015#include <utility>
Stefan Holmere5904162015-03-26 11:11:06 +010016
Erik Språngf6468d22019-07-05 16:53:43 +020017#include "absl/memory/memory.h"
Yves Gerey3e707812018-11-28 16:47:49 +010018#include "api/units/time_delta.h"
Erik Språngf6468d22019-07-05 16:53:43 +020019#include "modules/rtp_rtcp/include/rtp_header_extension_map.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020020#include "modules/rtp_rtcp/mocks/mock_rtp_rtcp.h"
21#include "modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h"
22#include "rtc_base/checks.h"
Steve Anton10542f22019-01-11 09:11:00 -080023#include "rtc_base/fake_clock.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020024#include "test/gmock.h"
25#include "test/gtest.h"
Stefan Holmere5904162015-03-26 11:11:06 +010026
Stefan Holmere5904162015-03-26 11:11:06 +010027namespace webrtc {
28
eladalon822ff2b2017-08-01 06:30:28 -070029// TODO(eladalon): Restructure and/or replace the existing monolithic tests
30// (only some of the test are monolithic) according to the new
31// guidelines - small tests for one thing at a time.
32// (I'm not removing any tests during CL, so as to demonstrate no regressions.)
33
eladalonb1338fe2017-08-01 09:36:19 -070034namespace {
danilchap47085372017-08-10 06:03:57 -070035
36using ::testing::_;
37using ::testing::AnyNumber;
38using ::testing::AtLeast;
39using ::testing::Field;
40using ::testing::Gt;
41using ::testing::Le;
42using ::testing::NiceMock;
Erik Språngf6468d22019-07-05 16:53:43 +020043using ::testing::Property;
danilchap47085372017-08-10 06:03:57 -070044using ::testing::Return;
45using ::testing::ReturnPointee;
46using ::testing::SaveArg;
47
eladalonb1338fe2017-08-01 09:36:19 -070048constexpr int kProbeMinProbes = 5;
49constexpr int kProbeMinBytes = 1000;
50
eladalonb1338fe2017-08-01 09:36:19 -070051} // namespace
eladalon822ff2b2017-08-01 06:30:28 -070052
eladalon32040ef2017-08-02 06:29:00 -070053TEST(PacketRouterTest, Sanity_NoModuleRegistered_TimeToSendPacket) {
54 PacketRouter packet_router;
55
56 constexpr uint16_t ssrc = 1234;
57 constexpr uint16_t sequence_number = 17;
58 constexpr uint64_t timestamp = 7890;
59 constexpr bool retransmission = false;
60 const PacedPacketInfo paced_info(1, kProbeMinProbes, kProbeMinBytes);
61
Erik Språngd2879622019-05-10 08:29:01 -070062 EXPECT_EQ(RtpPacketSendResult::kPacketNotFound,
63 packet_router.TimeToSendPacket(ssrc, sequence_number, timestamp,
64 retransmission, paced_info));
eladalon32040ef2017-08-02 06:29:00 -070065}
66
67TEST(PacketRouterTest, Sanity_NoModuleRegistered_TimeToSendPadding) {
68 PacketRouter packet_router;
69
70 constexpr size_t bytes = 300;
71 const PacedPacketInfo paced_info(1, kProbeMinProbes, kProbeMinBytes);
72
73 EXPECT_EQ(packet_router.TimeToSendPadding(bytes, paced_info), 0u);
74}
75
76TEST(PacketRouterTest, Sanity_NoModuleRegistered_OnReceiveBitrateChanged) {
77 PacketRouter packet_router;
78
79 const std::vector<uint32_t> ssrcs = {1, 2, 3};
80 constexpr uint32_t bitrate_bps = 10000;
81
82 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_bps);
83}
84
85TEST(PacketRouterTest, Sanity_NoModuleRegistered_SendRemb) {
86 PacketRouter packet_router;
87
88 const std::vector<uint32_t> ssrcs = {1, 2, 3};
89 constexpr uint32_t bitrate_bps = 10000;
90
91 EXPECT_FALSE(packet_router.SendRemb(bitrate_bps, ssrcs));
92}
93
94TEST(PacketRouterTest, Sanity_NoModuleRegistered_SendTransportFeedback) {
95 PacketRouter packet_router;
96
97 rtcp::TransportFeedback feedback;
98
99 EXPECT_FALSE(packet_router.SendTransportFeedback(&feedback));
100}
101
eladalonb1338fe2017-08-01 09:36:19 -0700102TEST(PacketRouterTest, TimeToSendPacket) {
103 PacketRouter packet_router;
eladalon6c9556e2017-07-10 03:33:00 -0700104 NiceMock<MockRtpRtcp> rtp_1;
105 NiceMock<MockRtpRtcp> rtp_2;
eladalonb1338fe2017-08-01 09:36:19 -0700106
107 packet_router.AddSendRtpModule(&rtp_1, false);
108 packet_router.AddSendRtpModule(&rtp_2, false);
Stefan Holmere5904162015-03-26 11:11:06 +0100109
110 const uint16_t kSsrc1 = 1234;
111 uint16_t sequence_number = 17;
112 uint64_t timestamp = 7890;
113 bool retransmission = false;
114
115 // Send on the first module by letting rtp_1 be sending with correct ssrc.
Danil Chapovalovdb59de32019-06-26 11:06:41 +0200116 ON_CALL(rtp_1, SendingMedia).WillByDefault(Return(true));
117 ON_CALL(rtp_1, SSRC).WillByDefault(Return(kSsrc1));
philipelc7bf32a2017-02-17 03:59:43 -0800118 EXPECT_CALL(rtp_1, TimeToSendPacket(
119 kSsrc1, sequence_number, timestamp, retransmission,
120 Field(&PacedPacketInfo::probe_cluster_id, 1)))
Stefan Holmere5904162015-03-26 11:11:06 +0100121 .Times(1)
Erik Språngd2879622019-05-10 08:29:01 -0700122 .WillOnce(Return(RtpPacketSendResult::kSuccess));
Danil Chapovalovdb59de32019-06-26 11:06:41 +0200123 EXPECT_CALL(rtp_2, TimeToSendPacket).Times(0);
Erik Språngd2879622019-05-10 08:29:01 -0700124 EXPECT_EQ(RtpPacketSendResult::kSuccess,
125 packet_router.TimeToSendPacket(
126 kSsrc1, sequence_number, timestamp, retransmission,
127 PacedPacketInfo(1, kProbeMinProbes, kProbeMinBytes)));
Stefan Holmere5904162015-03-26 11:11:06 +0100128
129 // Send on the second module by letting rtp_2 be sending, but not rtp_1.
130 ++sequence_number;
131 timestamp += 30;
132 retransmission = true;
133 const uint16_t kSsrc2 = 4567;
Danil Chapovalovdb59de32019-06-26 11:06:41 +0200134 ON_CALL(rtp_1, SendingMedia).WillByDefault(Return(false));
135 ON_CALL(rtp_2, SendingMedia).WillByDefault(Return(true));
136 ON_CALL(rtp_2, SSRC).WillByDefault(Return(kSsrc2));
137 EXPECT_CALL(rtp_1, TimeToSendPacket).Times(0);
philipelc7bf32a2017-02-17 03:59:43 -0800138 EXPECT_CALL(rtp_2, TimeToSendPacket(
139 kSsrc2, sequence_number, timestamp, retransmission,
140 Field(&PacedPacketInfo::probe_cluster_id, 2)))
Stefan Holmere5904162015-03-26 11:11:06 +0100141 .Times(1)
Erik Språngd2879622019-05-10 08:29:01 -0700142 .WillOnce(Return(RtpPacketSendResult::kSuccess));
143 EXPECT_EQ(RtpPacketSendResult::kSuccess,
144 packet_router.TimeToSendPacket(
145 kSsrc2, sequence_number, timestamp, retransmission,
146 PacedPacketInfo(2, kProbeMinProbes, kProbeMinBytes)));
Stefan Holmere5904162015-03-26 11:11:06 +0100147
148 // No module is sending, hence no packet should be sent.
Danil Chapovalovdb59de32019-06-26 11:06:41 +0200149 ON_CALL(rtp_1, SendingMedia).WillByDefault(Return(false));
150 ON_CALL(rtp_2, SendingMedia).WillByDefault(Return(false));
151 EXPECT_CALL(rtp_1, TimeToSendPacket).Times(0);
152 EXPECT_CALL(rtp_2, TimeToSendPacket).Times(0);
Erik Språngd2879622019-05-10 08:29:01 -0700153 EXPECT_EQ(RtpPacketSendResult::kPacketNotFound,
154 packet_router.TimeToSendPacket(
155 kSsrc1, sequence_number, timestamp, retransmission,
156 PacedPacketInfo(1, kProbeMinProbes, kProbeMinBytes)));
Stefan Holmere5904162015-03-26 11:11:06 +0100157
158 // Add a packet with incorrect ssrc and test it's dropped in the router.
Danil Chapovalovdb59de32019-06-26 11:06:41 +0200159 ON_CALL(rtp_1, SendingMedia).WillByDefault(Return(true));
160 ON_CALL(rtp_1, SSRC).WillByDefault(Return(kSsrc1));
161 ON_CALL(rtp_2, SendingMedia).WillByDefault(Return(true));
162 ON_CALL(rtp_2, SSRC).WillByDefault(Return(kSsrc2));
163 EXPECT_CALL(rtp_1, TimeToSendPacket).Times(0);
164 EXPECT_CALL(rtp_2, TimeToSendPacket).Times(0);
Erik Språngd2879622019-05-10 08:29:01 -0700165 EXPECT_EQ(RtpPacketSendResult::kPacketNotFound,
166 packet_router.TimeToSendPacket(
167 kSsrc1 + kSsrc2, sequence_number, timestamp, retransmission,
168 PacedPacketInfo(1, kProbeMinProbes, kProbeMinBytes)));
Stefan Holmere5904162015-03-26 11:11:06 +0100169
eladalonb1338fe2017-08-01 09:36:19 -0700170 packet_router.RemoveSendRtpModule(&rtp_1);
Stefan Holmere5904162015-03-26 11:11:06 +0100171
172 // rtp_1 has been removed, try sending a packet on that ssrc and make sure
173 // it is dropped as expected by not expecting any calls to rtp_1.
Danil Chapovalovdb59de32019-06-26 11:06:41 +0200174 ON_CALL(rtp_2, SendingMedia).WillByDefault(Return(true));
175 ON_CALL(rtp_2, SSRC).WillByDefault(Return(kSsrc2));
176 EXPECT_CALL(rtp_2, TimeToSendPacket).Times(0);
Erik Språngd2879622019-05-10 08:29:01 -0700177 EXPECT_EQ(RtpPacketSendResult::kPacketNotFound,
178 packet_router.TimeToSendPacket(
179 kSsrc1, sequence_number, timestamp, retransmission,
180 PacedPacketInfo(PacedPacketInfo::kNotAProbe, kProbeMinBytes,
181 kProbeMinBytes)));
Stefan Holmere5904162015-03-26 11:11:06 +0100182
eladalonb1338fe2017-08-01 09:36:19 -0700183 packet_router.RemoveSendRtpModule(&rtp_2);
Stefan Holmere5904162015-03-26 11:11:06 +0100184}
185
eladalonb1338fe2017-08-01 09:36:19 -0700186TEST(PacketRouterTest, TimeToSendPadding) {
187 PacketRouter packet_router;
188
sprang867fb522015-08-03 04:38:41 -0700189 const uint16_t kSsrc1 = 1234;
190 const uint16_t kSsrc2 = 4567;
191
eladalon6c9556e2017-07-10 03:33:00 -0700192 NiceMock<MockRtpRtcp> rtp_1;
stefan16b02212017-01-27 07:12:16 -0800193 EXPECT_CALL(rtp_1, RtxSendStatus()).WillOnce(Return(kRtxOff));
sprang867fb522015-08-03 04:38:41 -0700194 EXPECT_CALL(rtp_1, SSRC()).WillRepeatedly(Return(kSsrc1));
eladalon6c9556e2017-07-10 03:33:00 -0700195 NiceMock<MockRtpRtcp> rtp_2;
stefan16b02212017-01-27 07:12:16 -0800196 // rtp_2 will be prioritized for padding.
197 EXPECT_CALL(rtp_2, RtxSendStatus()).WillOnce(Return(kRtxRedundantPayloads));
sprang867fb522015-08-03 04:38:41 -0700198 EXPECT_CALL(rtp_2, SSRC()).WillRepeatedly(Return(kSsrc2));
eladalonb1338fe2017-08-01 09:36:19 -0700199 packet_router.AddSendRtpModule(&rtp_1, false);
200 packet_router.AddSendRtpModule(&rtp_2, false);
Stefan Holmere5904162015-03-26 11:11:06 +0100201
sprang867fb522015-08-03 04:38:41 -0700202 // Default configuration, sending padding on all modules sending media,
stefan16b02212017-01-27 07:12:16 -0800203 // ordered by priority (based on rtx mode).
Stefan Holmere5904162015-03-26 11:11:06 +0100204 const size_t requested_padding_bytes = 1000;
205 const size_t sent_padding_bytes = 890;
Mirko Bonadei66147e82019-07-12 08:37:30 +0000206 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true));
207 EXPECT_CALL(rtp_2, HasBweExtensions()).Times(1).WillOnce(Return(true));
philipelc7bf32a2017-02-17 03:59:43 -0800208 EXPECT_CALL(rtp_2,
209 TimeToSendPadding(requested_padding_bytes,
210 Field(&PacedPacketInfo::probe_cluster_id, 111)))
Stefan Holmere5904162015-03-26 11:11:06 +0100211 .Times(1)
212 .WillOnce(Return(sent_padding_bytes));
Mirko Bonadei66147e82019-07-12 08:37:30 +0000213 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(true));
214 EXPECT_CALL(rtp_1, HasBweExtensions()).Times(1).WillOnce(Return(true));
philipelc7bf32a2017-02-17 03:59:43 -0800215 EXPECT_CALL(rtp_1,
216 TimeToSendPadding(requested_padding_bytes - sent_padding_bytes,
217 Field(&PacedPacketInfo::probe_cluster_id, 111)))
sprang867fb522015-08-03 04:38:41 -0700218 .Times(1)
219 .WillOnce(Return(requested_padding_bytes - sent_padding_bytes));
220 EXPECT_EQ(requested_padding_bytes,
eladalonb1338fe2017-08-01 09:36:19 -0700221 packet_router.TimeToSendPadding(
philipelc7bf32a2017-02-17 03:59:43 -0800222 requested_padding_bytes,
223 PacedPacketInfo(111, kProbeMinBytes, kProbeMinBytes)));
Stefan Holmere5904162015-03-26 11:11:06 +0100224
stefan16b02212017-01-27 07:12:16 -0800225 // Let only the lower priority module be sending and verify the padding
226 // request is routed there.
Mirko Bonadei66147e82019-07-12 08:37:30 +0000227 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(false));
stefan16b02212017-01-27 07:12:16 -0800228 EXPECT_CALL(rtp_2, TimeToSendPadding(requested_padding_bytes, _)).Times(0);
Mirko Bonadei66147e82019-07-12 08:37:30 +0000229 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(true));
230 EXPECT_CALL(rtp_1, HasBweExtensions()).Times(1).WillOnce(Return(true));
stefan16b02212017-01-27 07:12:16 -0800231 EXPECT_CALL(rtp_1, TimeToSendPadding(_, _))
Stefan Holmere5904162015-03-26 11:11:06 +0100232 .Times(1)
233 .WillOnce(Return(sent_padding_bytes));
234 EXPECT_EQ(sent_padding_bytes,
eladalonb1338fe2017-08-01 09:36:19 -0700235 packet_router.TimeToSendPadding(
philipelc7bf32a2017-02-17 03:59:43 -0800236 requested_padding_bytes,
237 PacedPacketInfo(PacedPacketInfo::kNotAProbe, kProbeMinBytes,
238 kProbeMinBytes)));
Stefan Holmere5904162015-03-26 11:11:06 +0100239
240 // No sending module at all.
Mirko Bonadei66147e82019-07-12 08:37:30 +0000241 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(false));
philipela1ed0b32016-06-01 06:31:17 -0700242 EXPECT_CALL(rtp_1, TimeToSendPadding(requested_padding_bytes, _)).Times(0);
Mirko Bonadei66147e82019-07-12 08:37:30 +0000243 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(false));
philipela1ed0b32016-06-01 06:31:17 -0700244 EXPECT_CALL(rtp_2, TimeToSendPadding(_, _)).Times(0);
Yves Gerey665174f2018-06-19 15:03:05 +0200245 EXPECT_EQ(0u, packet_router.TimeToSendPadding(
246 requested_padding_bytes,
247 PacedPacketInfo(PacedPacketInfo::kNotAProbe, kProbeMinBytes,
248 kProbeMinBytes)));
Stefan Holmere5904162015-03-26 11:11:06 +0100249
Mirko Bonadei66147e82019-07-12 08:37:30 +0000250 // Only one module has BWE extensions.
251 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(true));
252 EXPECT_CALL(rtp_1, HasBweExtensions()).Times(1).WillOnce(Return(false));
253 EXPECT_CALL(rtp_1, TimeToSendPadding(requested_padding_bytes, _)).Times(0);
254 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true));
255 EXPECT_CALL(rtp_2, HasBweExtensions()).Times(1).WillOnce(Return(true));
256 EXPECT_CALL(rtp_2, TimeToSendPadding(requested_padding_bytes, _))
257 .Times(1)
258 .WillOnce(Return(sent_padding_bytes));
259 EXPECT_EQ(sent_padding_bytes,
260 packet_router.TimeToSendPadding(
261 requested_padding_bytes,
262 PacedPacketInfo(PacedPacketInfo::kNotAProbe, kProbeMinBytes,
263 kProbeMinBytes)));
264
eladalonb1338fe2017-08-01 09:36:19 -0700265 packet_router.RemoveSendRtpModule(&rtp_1);
Stefan Holmere5904162015-03-26 11:11:06 +0100266
267 // rtp_1 has been removed, try sending padding and make sure rtp_1 isn't asked
268 // to send by not expecting any calls. Instead verify rtp_2 is called.
Mirko Bonadei66147e82019-07-12 08:37:30 +0000269 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true));
270 EXPECT_CALL(rtp_2, HasBweExtensions()).Times(1).WillOnce(Return(true));
philipela1ed0b32016-06-01 06:31:17 -0700271 EXPECT_CALL(rtp_2, TimeToSendPadding(requested_padding_bytes, _)).Times(1);
Yves Gerey665174f2018-06-19 15:03:05 +0200272 EXPECT_EQ(0u, packet_router.TimeToSendPadding(
273 requested_padding_bytes,
274 PacedPacketInfo(PacedPacketInfo::kNotAProbe, kProbeMinBytes,
275 kProbeMinBytes)));
Stefan Holmere5904162015-03-26 11:11:06 +0100276
eladalonb1338fe2017-08-01 09:36:19 -0700277 packet_router.RemoveSendRtpModule(&rtp_2);
Peter Boström3dd5d1d2016-02-25 16:56:48 +0100278}
279
Erik Språng478cb462019-06-26 15:49:27 +0200280TEST(PacketRouterTest, GeneratePaddingPicksCorrectModule) {
281 PacketRouter packet_router;
282
283 // Two RTP modules. The first (prioritized due to rtx) isn't sending media so
284 // should not be called.
285 const uint16_t kSsrc1 = 1234;
286 const uint16_t kSsrc2 = 4567;
287
288 NiceMock<MockRtpRtcp> rtp_1;
289 ON_CALL(rtp_1, RtxSendStatus()).WillByDefault(Return(kRtxRedundantPayloads));
290 ON_CALL(rtp_1, SSRC()).WillByDefault(Return(kSsrc1));
Mirko Bonadei66147e82019-07-12 08:37:30 +0000291 ON_CALL(rtp_1, SendingMedia()).WillByDefault(Return(false));
292 ON_CALL(rtp_1, HasBweExtensions()).WillByDefault(Return(false));
Erik Språng478cb462019-06-26 15:49:27 +0200293
294 NiceMock<MockRtpRtcp> rtp_2;
295 ON_CALL(rtp_2, RtxSendStatus()).WillByDefault(Return(kRtxOff));
296 ON_CALL(rtp_2, SSRC()).WillByDefault(Return(kSsrc2));
Mirko Bonadei66147e82019-07-12 08:37:30 +0000297 ON_CALL(rtp_2, SendingMedia()).WillByDefault(Return(true));
298 ON_CALL(rtp_2, HasBweExtensions()).WillByDefault(Return(true));
Erik Språng478cb462019-06-26 15:49:27 +0200299
300 packet_router.AddSendRtpModule(&rtp_1, false);
301 packet_router.AddSendRtpModule(&rtp_2, false);
302
303 const size_t kPaddingSize = 123;
Erik Språngf6468d22019-07-05 16:53:43 +0200304 const size_t kExpectedPaddingPackets = 1;
Erik Språng478cb462019-06-26 15:49:27 +0200305 EXPECT_CALL(rtp_1, GeneratePadding(_)).Times(0);
Erik Språngf6468d22019-07-05 16:53:43 +0200306 EXPECT_CALL(rtp_2, GeneratePadding(kPaddingSize))
307 .WillOnce([&](size_t padding_size) {
308 return std::vector<std::unique_ptr<RtpPacketToSend>>(
309 kExpectedPaddingPackets);
310 });
311 auto generated_padding = packet_router.GeneratePadding(kPaddingSize);
312 EXPECT_EQ(generated_padding.size(), kExpectedPaddingPackets);
Erik Språng478cb462019-06-26 15:49:27 +0200313
314 packet_router.RemoveSendRtpModule(&rtp_1);
315 packet_router.RemoveSendRtpModule(&rtp_2);
316}
317
Erik Språng8b7ca4a2018-05-17 13:43:35 +0200318TEST(PacketRouterTest, PadsOnLastActiveMediaStream) {
319 PacketRouter packet_router;
320
321 const uint16_t kSsrc1 = 1234;
322 const uint16_t kSsrc2 = 4567;
323 const uint16_t kSsrc3 = 8901;
324
325 // First two rtp modules send media and have rtx.
326 NiceMock<MockRtpRtcp> rtp_1;
327 EXPECT_CALL(rtp_1, RtxSendStatus())
328 .WillRepeatedly(Return(kRtxRedundantPayloads));
329 EXPECT_CALL(rtp_1, SSRC()).WillRepeatedly(Return(kSsrc1));
330 EXPECT_CALL(rtp_1, SendingMedia()).WillRepeatedly(Return(true));
Mirko Bonadei66147e82019-07-12 08:37:30 +0000331 EXPECT_CALL(rtp_1, HasBweExtensions()).WillRepeatedly(Return(true));
Erik Språng8b7ca4a2018-05-17 13:43:35 +0200332
333 NiceMock<MockRtpRtcp> rtp_2;
334 EXPECT_CALL(rtp_2, RtxSendStatus())
335 .WillRepeatedly(Return(kRtxRedundantPayloads));
336 EXPECT_CALL(rtp_2, SSRC()).WillRepeatedly(Return(kSsrc2));
337 EXPECT_CALL(rtp_2, SendingMedia()).WillRepeatedly(Return(true));
Mirko Bonadei66147e82019-07-12 08:37:30 +0000338 EXPECT_CALL(rtp_2, HasBweExtensions()).WillRepeatedly(Return(true));
Erik Språng8b7ca4a2018-05-17 13:43:35 +0200339
340 // Third module is sending media, but does not support rtx.
341 NiceMock<MockRtpRtcp> rtp_3;
342 EXPECT_CALL(rtp_3, RtxSendStatus()).WillRepeatedly(Return(kRtxOff));
343 EXPECT_CALL(rtp_3, SSRC()).WillRepeatedly(Return(kSsrc3));
344 EXPECT_CALL(rtp_3, SendingMedia()).WillRepeatedly(Return(true));
Mirko Bonadei66147e82019-07-12 08:37:30 +0000345 EXPECT_CALL(rtp_3, HasBweExtensions()).WillRepeatedly(Return(true));
Erik Språng8b7ca4a2018-05-17 13:43:35 +0200346
347 packet_router.AddSendRtpModule(&rtp_1, false);
348 packet_router.AddSendRtpModule(&rtp_2, false);
349 packet_router.AddSendRtpModule(&rtp_3, false);
350
351 const size_t kPaddingBytes = 100;
352
353 // Initially, padding will be sent on last added rtp module that sends media
354 // and supports rtx.
355 EXPECT_CALL(rtp_2, TimeToSendPadding(kPaddingBytes, _))
356 .Times(1)
357 .WillOnce(Return(kPaddingBytes));
358 packet_router.TimeToSendPadding(kPaddingBytes, PacedPacketInfo());
359
360 // Send media on first module. Padding should be sent on that module.
361 EXPECT_CALL(rtp_1, TimeToSendPacket(kSsrc1, _, _, _, _));
362 packet_router.TimeToSendPacket(kSsrc1, 0, 0, false, PacedPacketInfo());
363
364 EXPECT_CALL(rtp_1, TimeToSendPadding(kPaddingBytes, _))
365 .Times(1)
366 .WillOnce(Return(kPaddingBytes));
367 packet_router.TimeToSendPadding(kPaddingBytes, PacedPacketInfo());
368
369 // Send media on second module. Padding should be sent there.
370 EXPECT_CALL(rtp_2, TimeToSendPacket(kSsrc2, _, _, _, _));
371 packet_router.TimeToSendPacket(kSsrc2, 0, 0, false, PacedPacketInfo());
372
373 EXPECT_CALL(rtp_2, TimeToSendPadding(kPaddingBytes, _))
374 .Times(1)
375 .WillOnce(Return(kPaddingBytes));
376 packet_router.TimeToSendPadding(kPaddingBytes, PacedPacketInfo());
377
378 // Remove second module, padding should now fall back to first module.
379 packet_router.RemoveSendRtpModule(&rtp_2);
380 EXPECT_CALL(rtp_1, TimeToSendPadding(kPaddingBytes, _))
381 .Times(1)
382 .WillOnce(Return(kPaddingBytes));
383 packet_router.TimeToSendPadding(kPaddingBytes, PacedPacketInfo());
384
385 // Remove first module too, leaving only the one without rtx.
386 packet_router.RemoveSendRtpModule(&rtp_1);
387
388 EXPECT_CALL(rtp_3, TimeToSendPadding(kPaddingBytes, _))
389 .Times(1)
390 .WillOnce(Return(kPaddingBytes));
391 packet_router.TimeToSendPadding(kPaddingBytes, PacedPacketInfo());
392
393 packet_router.RemoveSendRtpModule(&rtp_3);
394}
395
eladalonb1338fe2017-08-01 09:36:19 -0700396TEST(PacketRouterTest, SenderOnlyFunctionsRespectSendingMedia) {
397 PacketRouter packet_router;
eladalon6c9556e2017-07-10 03:33:00 -0700398 NiceMock<MockRtpRtcp> rtp;
eladalonb1338fe2017-08-01 09:36:19 -0700399 packet_router.AddSendRtpModule(&rtp, false);
Peter Boström3dd5d1d2016-02-25 16:56:48 +0100400 static const uint16_t kSsrc = 1234;
401 EXPECT_CALL(rtp, SSRC()).WillRepeatedly(Return(kSsrc));
402 EXPECT_CALL(rtp, SendingMedia()).WillRepeatedly(Return(false));
403
404 // Verify that TimeToSendPacket does not end up in a receiver.
philipela1ed0b32016-06-01 06:31:17 -0700405 EXPECT_CALL(rtp, TimeToSendPacket(_, _, _, _, _)).Times(0);
Erik Språngd2879622019-05-10 08:29:01 -0700406 EXPECT_EQ(RtpPacketSendResult::kPacketNotFound,
407 packet_router.TimeToSendPacket(
408 kSsrc, 1, 1, false,
409 PacedPacketInfo(PacedPacketInfo::kNotAProbe, kProbeMinBytes,
410 kProbeMinBytes)));
Peter Boström3dd5d1d2016-02-25 16:56:48 +0100411 // Verify that TimeToSendPadding does not end up in a receiver.
philipela1ed0b32016-06-01 06:31:17 -0700412 EXPECT_CALL(rtp, TimeToSendPadding(_, _)).Times(0);
Yves Gerey665174f2018-06-19 15:03:05 +0200413 EXPECT_EQ(0u, packet_router.TimeToSendPadding(
414 200, PacedPacketInfo(PacedPacketInfo::kNotAProbe,
415 kProbeMinBytes, kProbeMinBytes)));
Peter Boström3dd5d1d2016-02-25 16:56:48 +0100416
eladalonb1338fe2017-08-01 09:36:19 -0700417 packet_router.RemoveSendRtpModule(&rtp);
Stefan Holmere5904162015-03-26 11:11:06 +0100418}
sprang867fb522015-08-03 04:38:41 -0700419
eladalonb1338fe2017-08-01 09:36:19 -0700420TEST(PacketRouterTest, AllocateSequenceNumbers) {
421 PacketRouter packet_router;
422
sprang867fb522015-08-03 04:38:41 -0700423 const uint16_t kStartSeq = 0xFFF0;
424 const size_t kNumPackets = 32;
425
eladalonb1338fe2017-08-01 09:36:19 -0700426 packet_router.SetTransportWideSequenceNumber(kStartSeq - 1);
sprang867fb522015-08-03 04:38:41 -0700427
428 for (size_t i = 0; i < kNumPackets; ++i) {
eladalonb1338fe2017-08-01 09:36:19 -0700429 uint16_t seq = packet_router.AllocateSequenceNumber();
sprang867fb522015-08-03 04:38:41 -0700430 uint32_t expected_unwrapped_seq = static_cast<uint32_t>(kStartSeq) + i;
431 EXPECT_EQ(static_cast<uint16_t>(expected_unwrapped_seq & 0xFFFF), seq);
432 }
433}
stefanbba9dec2016-02-01 04:39:55 -0800434
eladalonb1338fe2017-08-01 09:36:19 -0700435TEST(PacketRouterTest, SendTransportFeedback) {
436 PacketRouter packet_router;
eladalon6c9556e2017-07-10 03:33:00 -0700437 NiceMock<MockRtpRtcp> rtp_1;
438 NiceMock<MockRtpRtcp> rtp_2;
eladalonb1338fe2017-08-01 09:36:19 -0700439
440 packet_router.AddSendRtpModule(&rtp_1, false);
441 packet_router.AddReceiveRtpModule(&rtp_2, false);
stefanbba9dec2016-02-01 04:39:55 -0800442
443 rtcp::TransportFeedback feedback;
nisse05843312017-04-18 23:38:35 -0700444 EXPECT_CALL(rtp_1, SendFeedbackPacket(_)).Times(1).WillOnce(Return(true));
eladalonb1338fe2017-08-01 09:36:19 -0700445 packet_router.SendTransportFeedback(&feedback);
446 packet_router.RemoveSendRtpModule(&rtp_1);
nisse05843312017-04-18 23:38:35 -0700447 EXPECT_CALL(rtp_2, SendFeedbackPacket(_)).Times(1).WillOnce(Return(true));
eladalonb1338fe2017-08-01 09:36:19 -0700448 packet_router.SendTransportFeedback(&feedback);
449 packet_router.RemoveReceiveRtpModule(&rtp_2);
stefanbba9dec2016-02-01 04:39:55 -0800450}
nisse05843312017-04-18 23:38:35 -0700451
eladalon822ff2b2017-08-01 06:30:28 -0700452#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
eladalonb1338fe2017-08-01 09:36:19 -0700453TEST(PacketRouterTest, DoubleRegistrationOfSendModuleDisallowed) {
454 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700455 NiceMock<MockRtpRtcp> module;
456
457 constexpr bool remb_candidate = false; // Value irrelevant.
eladalonb1338fe2017-08-01 09:36:19 -0700458 packet_router.AddSendRtpModule(&module, remb_candidate);
459 EXPECT_DEATH(packet_router.AddSendRtpModule(&module, remb_candidate), "");
eladalon822ff2b2017-08-01 06:30:28 -0700460
461 // Test tear-down
eladalonb1338fe2017-08-01 09:36:19 -0700462 packet_router.RemoveSendRtpModule(&module);
eladalon822ff2b2017-08-01 06:30:28 -0700463}
464
eladalonb1338fe2017-08-01 09:36:19 -0700465TEST(PacketRouterTest, DoubleRegistrationOfReceiveModuleDisallowed) {
466 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700467 NiceMock<MockRtpRtcp> module;
468
469 constexpr bool remb_candidate = false; // Value irrelevant.
eladalonb1338fe2017-08-01 09:36:19 -0700470 packet_router.AddReceiveRtpModule(&module, remb_candidate);
471 EXPECT_DEATH(packet_router.AddReceiveRtpModule(&module, remb_candidate), "");
eladalon822ff2b2017-08-01 06:30:28 -0700472
473 // Test tear-down
eladalonb1338fe2017-08-01 09:36:19 -0700474 packet_router.RemoveReceiveRtpModule(&module);
eladalon822ff2b2017-08-01 06:30:28 -0700475}
476
eladalonb1338fe2017-08-01 09:36:19 -0700477TEST(PacketRouterTest, RemovalOfNeverAddedSendModuleDisallowed) {
478 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700479 NiceMock<MockRtpRtcp> module;
480
eladalonb1338fe2017-08-01 09:36:19 -0700481 EXPECT_DEATH(packet_router.RemoveSendRtpModule(&module), "");
eladalon822ff2b2017-08-01 06:30:28 -0700482}
483
eladalonb1338fe2017-08-01 09:36:19 -0700484TEST(PacketRouterTest, RemovalOfNeverAddedReceiveModuleDisallowed) {
485 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700486 NiceMock<MockRtpRtcp> module;
487
eladalonb1338fe2017-08-01 09:36:19 -0700488 EXPECT_DEATH(packet_router.RemoveReceiveRtpModule(&module), "");
eladalon822ff2b2017-08-01 06:30:28 -0700489}
490#endif // RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
491
nisse05843312017-04-18 23:38:35 -0700492TEST(PacketRouterRembTest, LowerEstimateToSendRemb) {
493 rtc::ScopedFakeClock clock;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200494 NiceMock<MockRtpRtcp> rtp;
nisse05843312017-04-18 23:38:35 -0700495 PacketRouter packet_router;
496
eladalon822ff2b2017-08-01 06:30:28 -0700497 packet_router.AddSendRtpModule(&rtp, true);
nisse05843312017-04-18 23:38:35 -0700498
499 uint32_t bitrate_estimate = 456;
500 const std::vector<uint32_t> ssrcs = {1234};
501
nisse05843312017-04-18 23:38:35 -0700502 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
503
504 // Call OnReceiveBitrateChanged twice to get a first estimate.
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200505 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200506 EXPECT_CALL(rtp, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700507 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
508
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200509 // Lower the estimate with more than 3% to trigger a call to SetRemb right
nisse05843312017-04-18 23:38:35 -0700510 // away.
511 bitrate_estimate = bitrate_estimate - 100;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200512 EXPECT_CALL(rtp, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700513 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
514
nisse05843312017-04-18 23:38:35 -0700515 packet_router.RemoveSendRtpModule(&rtp);
516}
517
518TEST(PacketRouterRembTest, VerifyIncreasingAndDecreasing) {
519 rtc::ScopedFakeClock clock;
eladalon6c9556e2017-07-10 03:33:00 -0700520 NiceMock<MockRtpRtcp> rtp;
nisse05843312017-04-18 23:38:35 -0700521 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700522 packet_router.AddSendRtpModule(&rtp, true);
nisse05843312017-04-18 23:38:35 -0700523
524 uint32_t bitrate_estimate[] = {456, 789};
525 std::vector<uint32_t> ssrcs = {1234, 5678};
526
nisse05843312017-04-18 23:38:35 -0700527 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[0]);
528
529 // Call OnReceiveBitrateChanged twice to get a first estimate.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200530 EXPECT_CALL(rtp, SetRemb(bitrate_estimate[0], ssrcs)).Times(1);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200531 clock.AdvanceTime(TimeDelta::ms(1000));
nisse05843312017-04-18 23:38:35 -0700532 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[0]);
533
534 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[1] + 100);
535
536 // Lower the estimate to trigger a callback.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200537 EXPECT_CALL(rtp, SetRemb(bitrate_estimate[1], ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700538 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[1]);
539
540 packet_router.RemoveSendRtpModule(&rtp);
541}
542
543TEST(PacketRouterRembTest, NoRembForIncreasedBitrate) {
544 rtc::ScopedFakeClock clock;
eladalon6c9556e2017-07-10 03:33:00 -0700545 NiceMock<MockRtpRtcp> rtp;
nisse05843312017-04-18 23:38:35 -0700546 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700547 packet_router.AddSendRtpModule(&rtp, true);
nisse05843312017-04-18 23:38:35 -0700548
549 uint32_t bitrate_estimate = 456;
550 std::vector<uint32_t> ssrcs = {1234, 5678};
551
nisse05843312017-04-18 23:38:35 -0700552 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
553
554 // Call OnReceiveBitrateChanged twice to get a first estimate.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200555 EXPECT_CALL(rtp, SetRemb(bitrate_estimate, ssrcs)).Times(1);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200556 clock.AdvanceTime(TimeDelta::ms(1000));
nisse05843312017-04-18 23:38:35 -0700557 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
558
559 // Increased estimate shouldn't trigger a callback right away.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200560 EXPECT_CALL(rtp, SetRemb(_, _)).Times(0);
nisse05843312017-04-18 23:38:35 -0700561 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate + 1);
562
563 // Decreasing the estimate less than 3% shouldn't trigger a new callback.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200564 EXPECT_CALL(rtp, SetRemb(_, _)).Times(0);
nisse05843312017-04-18 23:38:35 -0700565 int lower_estimate = bitrate_estimate * 98 / 100;
566 packet_router.OnReceiveBitrateChanged(ssrcs, lower_estimate);
567
568 packet_router.RemoveSendRtpModule(&rtp);
569}
570
571TEST(PacketRouterRembTest, ChangeSendRtpModule) {
572 rtc::ScopedFakeClock clock;
eladalon6c9556e2017-07-10 03:33:00 -0700573 NiceMock<MockRtpRtcp> rtp_send;
574 NiceMock<MockRtpRtcp> rtp_recv;
nisse05843312017-04-18 23:38:35 -0700575 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700576 packet_router.AddSendRtpModule(&rtp_send, true);
577 packet_router.AddReceiveRtpModule(&rtp_recv, true);
nisse05843312017-04-18 23:38:35 -0700578
579 uint32_t bitrate_estimate = 456;
580 std::vector<uint32_t> ssrcs = {1234, 5678};
581
nisse05843312017-04-18 23:38:35 -0700582 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
583
584 // Call OnReceiveBitrateChanged twice to get a first estimate.
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200585 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200586 EXPECT_CALL(rtp_send, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700587 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
588
589 // Decrease estimate to trigger a REMB.
590 bitrate_estimate = bitrate_estimate - 100;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200591 EXPECT_CALL(rtp_send, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700592 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
593
594 // Remove the sending module -> should get remb on the second module.
595 packet_router.RemoveSendRtpModule(&rtp_send);
596
nisse05843312017-04-18 23:38:35 -0700597 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
598
599 bitrate_estimate = bitrate_estimate - 100;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200600 EXPECT_CALL(rtp_recv, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700601 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
602
603 packet_router.RemoveReceiveRtpModule(&rtp_recv);
604}
605
606TEST(PacketRouterRembTest, OnlyOneRembForRepeatedOnReceiveBitrateChanged) {
607 rtc::ScopedFakeClock clock;
eladalon6c9556e2017-07-10 03:33:00 -0700608 NiceMock<MockRtpRtcp> rtp;
nisse05843312017-04-18 23:38:35 -0700609 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700610 packet_router.AddSendRtpModule(&rtp, true);
nisse05843312017-04-18 23:38:35 -0700611
612 uint32_t bitrate_estimate = 456;
613 const std::vector<uint32_t> ssrcs = {1234};
614
nisse05843312017-04-18 23:38:35 -0700615 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
616
617 // Call OnReceiveBitrateChanged twice to get a first estimate.
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200618 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200619 EXPECT_CALL(rtp, SetRemb(_, _)).Times(1);
nisse05843312017-04-18 23:38:35 -0700620 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
621
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200622 // Lower the estimate, should trigger a call to SetRemb right away.
nisse05843312017-04-18 23:38:35 -0700623 bitrate_estimate = bitrate_estimate - 100;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200624 EXPECT_CALL(rtp, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700625 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
626
627 // Call OnReceiveBitrateChanged again, this should not trigger a new callback.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200628 EXPECT_CALL(rtp, SetRemb(_, _)).Times(0);
nisse05843312017-04-18 23:38:35 -0700629 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
630 packet_router.RemoveSendRtpModule(&rtp);
631}
632
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200633TEST(PacketRouterRembTest, SetMaxDesiredReceiveBitrateLimitsSetRemb) {
danilchap47085372017-08-10 06:03:57 -0700634 rtc::ScopedFakeClock clock;
635 PacketRouter packet_router;
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200636 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200637 NiceMock<MockRtpRtcp> remb_sender;
danilchap47085372017-08-10 06:03:57 -0700638 constexpr bool remb_candidate = true;
639 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
danilchap47085372017-08-10 06:03:57 -0700640
Danil Chapovalov1de4b622017-12-13 13:35:10 +0100641 const int64_t cap_bitrate = 100000;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200642 EXPECT_CALL(remb_sender, SetRemb(Le(cap_bitrate), _)).Times(AtLeast(1));
643 EXPECT_CALL(remb_sender, SetRemb(Gt(cap_bitrate), _)).Times(0);
danilchap47085372017-08-10 06:03:57 -0700644
645 const std::vector<uint32_t> ssrcs = {1234};
646 packet_router.SetMaxDesiredReceiveBitrate(cap_bitrate);
647 packet_router.OnReceiveBitrateChanged(ssrcs, cap_bitrate + 5000);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200648 clock.AdvanceTime(TimeDelta::ms(1000));
danilchap47085372017-08-10 06:03:57 -0700649 packet_router.OnReceiveBitrateChanged(ssrcs, cap_bitrate - 5000);
650
651 // Test tear-down.
652 packet_router.RemoveSendRtpModule(&remb_sender);
653}
654
655TEST(PacketRouterRembTest,
656 SetMaxDesiredReceiveBitrateTriggersRembWhenMoreRestrictive) {
657 rtc::ScopedFakeClock clock;
658 PacketRouter packet_router;
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200659 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200660 NiceMock<MockRtpRtcp> remb_sender;
danilchap47085372017-08-10 06:03:57 -0700661 constexpr bool remb_candidate = true;
662 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
danilchap47085372017-08-10 06:03:57 -0700663
Danil Chapovalov1de4b622017-12-13 13:35:10 +0100664 const int64_t measured_bitrate_bps = 150000;
665 const int64_t cap_bitrate_bps = measured_bitrate_bps - 5000;
danilchap47085372017-08-10 06:03:57 -0700666 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200667 EXPECT_CALL(remb_sender, SetRemb(measured_bitrate_bps, _));
danilchap47085372017-08-10 06:03:57 -0700668 packet_router.OnReceiveBitrateChanged(ssrcs, measured_bitrate_bps);
669
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200670 EXPECT_CALL(remb_sender, SetRemb(cap_bitrate_bps, _));
danilchap47085372017-08-10 06:03:57 -0700671 packet_router.SetMaxDesiredReceiveBitrate(cap_bitrate_bps);
672
673 // Test tear-down.
674 packet_router.RemoveSendRtpModule(&remb_sender);
675}
676
677TEST(PacketRouterRembTest,
678 SetMaxDesiredReceiveBitrateDoesNotTriggerRembWhenAsRestrictive) {
679 rtc::ScopedFakeClock clock;
680 PacketRouter packet_router;
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200681 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200682 NiceMock<MockRtpRtcp> remb_sender;
danilchap47085372017-08-10 06:03:57 -0700683 constexpr bool remb_candidate = true;
684 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
danilchap47085372017-08-10 06:03:57 -0700685
686 const uint32_t measured_bitrate_bps = 150000;
687 const uint32_t cap_bitrate_bps = measured_bitrate_bps;
688 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200689 EXPECT_CALL(remb_sender, SetRemb(measured_bitrate_bps, _));
danilchap47085372017-08-10 06:03:57 -0700690 packet_router.OnReceiveBitrateChanged(ssrcs, measured_bitrate_bps);
691
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200692 EXPECT_CALL(remb_sender, SetRemb(_, _)).Times(0);
danilchap47085372017-08-10 06:03:57 -0700693 packet_router.SetMaxDesiredReceiveBitrate(cap_bitrate_bps);
694
695 // Test tear-down.
696 packet_router.RemoveSendRtpModule(&remb_sender);
697}
698
699TEST(PacketRouterRembTest,
700 SetMaxDesiredReceiveBitrateDoesNotTriggerRembWhenLessRestrictive) {
701 rtc::ScopedFakeClock clock;
702 PacketRouter packet_router;
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200703 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200704 NiceMock<MockRtpRtcp> remb_sender;
danilchap47085372017-08-10 06:03:57 -0700705 constexpr bool remb_candidate = true;
706 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
danilchap47085372017-08-10 06:03:57 -0700707
708 const uint32_t measured_bitrate_bps = 150000;
709 const uint32_t cap_bitrate_bps = measured_bitrate_bps + 500;
710 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200711 EXPECT_CALL(remb_sender, SetRemb(measured_bitrate_bps, _));
danilchap47085372017-08-10 06:03:57 -0700712 packet_router.OnReceiveBitrateChanged(ssrcs, measured_bitrate_bps);
713
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200714 EXPECT_CALL(remb_sender, SetRemb(_, _)).Times(0);
danilchap47085372017-08-10 06:03:57 -0700715 packet_router.SetMaxDesiredReceiveBitrate(cap_bitrate_bps);
716
717 // Test tear-down.
718 packet_router.RemoveSendRtpModule(&remb_sender);
719}
720
721TEST(PacketRouterRembTest,
722 SetMaxDesiredReceiveBitrateTriggersRembWhenNoRecentMeasure) {
723 rtc::ScopedFakeClock clock;
724 PacketRouter packet_router;
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200725 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200726 NiceMock<MockRtpRtcp> remb_sender;
danilchap47085372017-08-10 06:03:57 -0700727 constexpr bool remb_candidate = true;
728 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
danilchap47085372017-08-10 06:03:57 -0700729
730 const uint32_t measured_bitrate_bps = 150000;
731 const uint32_t cap_bitrate_bps = measured_bitrate_bps + 5000;
732 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200733 EXPECT_CALL(remb_sender, SetRemb(measured_bitrate_bps, _));
danilchap47085372017-08-10 06:03:57 -0700734 packet_router.OnReceiveBitrateChanged(ssrcs, measured_bitrate_bps);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200735 clock.AdvanceTime(TimeDelta::ms(1000));
danilchap47085372017-08-10 06:03:57 -0700736
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200737 EXPECT_CALL(remb_sender, SetRemb(cap_bitrate_bps, _));
danilchap47085372017-08-10 06:03:57 -0700738 packet_router.SetMaxDesiredReceiveBitrate(cap_bitrate_bps);
739
740 // Test tear-down.
741 packet_router.RemoveSendRtpModule(&remb_sender);
742}
743
744TEST(PacketRouterRembTest,
745 SetMaxDesiredReceiveBitrateTriggersRembWhenNoMeasures) {
746 rtc::ScopedFakeClock clock;
747 PacketRouter packet_router;
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200748 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200749 NiceMock<MockRtpRtcp> remb_sender;
danilchap47085372017-08-10 06:03:57 -0700750 constexpr bool remb_candidate = true;
751 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
danilchap47085372017-08-10 06:03:57 -0700752
753 // Set cap.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200754 EXPECT_CALL(remb_sender, SetRemb(100000, _)).Times(1);
danilchap47085372017-08-10 06:03:57 -0700755 packet_router.SetMaxDesiredReceiveBitrate(100000);
756 // Increase cap.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200757 EXPECT_CALL(remb_sender, SetRemb(200000, _)).Times(1);
danilchap47085372017-08-10 06:03:57 -0700758 packet_router.SetMaxDesiredReceiveBitrate(200000);
759 // Decrease cap.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200760 EXPECT_CALL(remb_sender, SetRemb(150000, _)).Times(1);
danilchap47085372017-08-10 06:03:57 -0700761 packet_router.SetMaxDesiredReceiveBitrate(150000);
762
763 // Test tear-down.
764 packet_router.RemoveSendRtpModule(&remb_sender);
765}
766
nisse05843312017-04-18 23:38:35 -0700767// Only register receiving modules and make sure we fallback to trigger a REMB
768// packet on this one.
769TEST(PacketRouterRembTest, NoSendingRtpModule) {
770 rtc::ScopedFakeClock clock;
eladalon6c9556e2017-07-10 03:33:00 -0700771 NiceMock<MockRtpRtcp> rtp;
nisse05843312017-04-18 23:38:35 -0700772 PacketRouter packet_router;
773
eladalon822ff2b2017-08-01 06:30:28 -0700774 packet_router.AddReceiveRtpModule(&rtp, true);
nisse05843312017-04-18 23:38:35 -0700775
776 uint32_t bitrate_estimate = 456;
777 const std::vector<uint32_t> ssrcs = {1234};
778
nisse05843312017-04-18 23:38:35 -0700779 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
780
781 // Call OnReceiveBitrateChanged twice to get a first estimate.
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200782 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200783 EXPECT_CALL(rtp, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700784 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
785
786 // Lower the estimate to trigger a new packet REMB packet.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200787 EXPECT_CALL(rtp, SetRemb(bitrate_estimate - 100, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700788 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate - 100);
789
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200790 EXPECT_CALL(rtp, UnsetRemb()).Times(1);
nisse05843312017-04-18 23:38:35 -0700791 packet_router.RemoveReceiveRtpModule(&rtp);
792}
793
eladalon822ff2b2017-08-01 06:30:28 -0700794TEST(PacketRouterRembTest, NonCandidateSendRtpModuleNotUsedForRemb) {
795 rtc::ScopedFakeClock clock;
796 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200797 NiceMock<MockRtpRtcp> module;
eladalon822ff2b2017-08-01 06:30:28 -0700798
799 constexpr bool remb_candidate = false;
800
801 packet_router.AddSendRtpModule(&module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700802
803 constexpr uint32_t bitrate_estimate = 456;
804 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200805 EXPECT_CALL(module, SetRemb(_, _)).Times(0);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200806 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700807 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
808
809 // Test tear-down
810 packet_router.RemoveSendRtpModule(&module);
811}
812
813TEST(PacketRouterRembTest, CandidateSendRtpModuleUsedForRemb) {
814 rtc::ScopedFakeClock clock;
815 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200816 NiceMock<MockRtpRtcp> module;
eladalon822ff2b2017-08-01 06:30:28 -0700817
818 constexpr bool remb_candidate = true;
819
820 packet_router.AddSendRtpModule(&module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700821
822 constexpr uint32_t bitrate_estimate = 456;
823 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200824 EXPECT_CALL(module, SetRemb(bitrate_estimate, ssrcs)).Times(1);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200825 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700826 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
827
828 // Test tear-down
829 packet_router.RemoveSendRtpModule(&module);
830}
831
832TEST(PacketRouterRembTest, NonCandidateReceiveRtpModuleNotUsedForRemb) {
833 rtc::ScopedFakeClock clock;
834 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200835 NiceMock<MockRtpRtcp> module;
eladalon822ff2b2017-08-01 06:30:28 -0700836
837 constexpr bool remb_candidate = false;
838
839 packet_router.AddReceiveRtpModule(&module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700840
841 constexpr uint32_t bitrate_estimate = 456;
842 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200843 EXPECT_CALL(module, SetRemb(_, _)).Times(0);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200844 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700845 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
846
847 // Test tear-down
848 packet_router.RemoveReceiveRtpModule(&module);
849}
850
851TEST(PacketRouterRembTest, CandidateReceiveRtpModuleUsedForRemb) {
852 rtc::ScopedFakeClock clock;
853 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200854 NiceMock<MockRtpRtcp> module;
eladalon822ff2b2017-08-01 06:30:28 -0700855
856 constexpr bool remb_candidate = true;
857
858 packet_router.AddReceiveRtpModule(&module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700859
860 constexpr uint32_t bitrate_estimate = 456;
861 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200862 EXPECT_CALL(module, SetRemb(bitrate_estimate, ssrcs)).Times(1);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200863 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700864 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
865
866 // Test tear-down
867 packet_router.RemoveReceiveRtpModule(&module);
868}
869
870TEST(PacketRouterRembTest,
871 SendCandidatePreferredOverReceiveCandidate_SendModuleAddedFirst) {
872 rtc::ScopedFakeClock clock;
873 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200874 NiceMock<MockRtpRtcp> send_module;
875 NiceMock<MockRtpRtcp> receive_module;
eladalon822ff2b2017-08-01 06:30:28 -0700876
877 constexpr bool remb_candidate = true;
878
879 // Send module added - activated.
880 packet_router.AddSendRtpModule(&send_module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700881
882 // Receive module added - the send module remains the active one.
883 packet_router.AddReceiveRtpModule(&receive_module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700884
885 constexpr uint32_t bitrate_estimate = 456;
886 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200887 EXPECT_CALL(send_module, SetRemb(bitrate_estimate, ssrcs)).Times(1);
888 EXPECT_CALL(receive_module, SetRemb(_, _)).Times(0);
eladalon822ff2b2017-08-01 06:30:28 -0700889
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200890 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700891 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
892
893 // Test tear-down
894 packet_router.RemoveReceiveRtpModule(&receive_module);
895 packet_router.RemoveSendRtpModule(&send_module);
896}
897
898TEST(PacketRouterRembTest,
899 SendCandidatePreferredOverReceiveCandidate_ReceiveModuleAddedFirst) {
900 rtc::ScopedFakeClock clock;
901 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200902 NiceMock<MockRtpRtcp> send_module;
903 NiceMock<MockRtpRtcp> receive_module;
eladalon822ff2b2017-08-01 06:30:28 -0700904
905 constexpr bool remb_candidate = true;
906
907 // Receive module added - activated.
908 packet_router.AddReceiveRtpModule(&receive_module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700909
910 // Send module added - replaces receive module as active.
911 packet_router.AddSendRtpModule(&send_module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700912
913 constexpr uint32_t bitrate_estimate = 456;
914 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200915 EXPECT_CALL(send_module, SetRemb(bitrate_estimate, ssrcs)).Times(1);
916 EXPECT_CALL(receive_module, SetRemb(_, _)).Times(0);
eladalon822ff2b2017-08-01 06:30:28 -0700917
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200918 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700919 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
920
921 // Test tear-down
922 packet_router.RemoveReceiveRtpModule(&receive_module);
923 packet_router.RemoveSendRtpModule(&send_module);
924}
925
926TEST(PacketRouterRembTest, ReceiveModuleTakesOverWhenLastSendModuleRemoved) {
927 rtc::ScopedFakeClock clock;
928 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200929 NiceMock<MockRtpRtcp> send_module;
930 NiceMock<MockRtpRtcp> receive_module;
eladalon822ff2b2017-08-01 06:30:28 -0700931
932 constexpr bool remb_candidate = true;
933
934 // Send module active, receive module inactive.
935 packet_router.AddSendRtpModule(&send_module, remb_candidate);
936 packet_router.AddReceiveRtpModule(&receive_module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700937
938 // Send module removed - receive module becomes active.
939 packet_router.RemoveSendRtpModule(&send_module);
eladalon822ff2b2017-08-01 06:30:28 -0700940 constexpr uint32_t bitrate_estimate = 456;
941 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200942 EXPECT_CALL(send_module, SetRemb(_, _)).Times(0);
943 EXPECT_CALL(receive_module, SetRemb(bitrate_estimate, ssrcs)).Times(1);
eladalon822ff2b2017-08-01 06:30:28 -0700944
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200945 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700946 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
947
948 // Test tear-down
949 packet_router.RemoveReceiveRtpModule(&receive_module);
950}
951
Erik Språngf6468d22019-07-05 16:53:43 +0200952TEST(PacketRouterTest, SendPacketWithoutTransportSequenceNumbers) {
953 PacketRouter packet_router;
954 NiceMock<MockRtpRtcp> rtp_1;
955 packet_router.AddSendRtpModule(&rtp_1, false);
956
957 const uint16_t kSsrc1 = 1234;
958 ON_CALL(rtp_1, SendingMedia).WillByDefault(Return(true));
959 ON_CALL(rtp_1, SSRC).WillByDefault(Return(kSsrc1));
960
961 // Send a packet without TransportSequenceNumber extension registered,
962 // packets sent should not have the extension set.
963 RtpHeaderExtensionMap extension_manager;
964 auto packet = absl::make_unique<RtpPacketToSend>(&extension_manager);
965 packet->SetSsrc(kSsrc1);
966 EXPECT_CALL(
967 rtp_1,
968 TrySendPacket(
969 Property(&RtpPacketToSend::HasExtension<TransportSequenceNumber>,
970 false),
971 _))
972 .WillOnce(Return(true));
973 packet_router.SendPacket(std::move(packet), PacedPacketInfo());
974
975 packet_router.RemoveSendRtpModule(&rtp_1);
976}
977
978TEST(PacketRouterTest, SendPacketAssignsTransportSequenceNumbers) {
979 PacketRouter packet_router;
980 NiceMock<MockRtpRtcp> rtp_1;
981 NiceMock<MockRtpRtcp> rtp_2;
982
983 packet_router.AddSendRtpModule(&rtp_1, false);
984 packet_router.AddSendRtpModule(&rtp_2, false);
985
986 const uint16_t kSsrc1 = 1234;
987 const uint16_t kSsrc2 = 2345;
988
989 ON_CALL(rtp_1, SendingMedia).WillByDefault(Return(true));
990 ON_CALL(rtp_1, SSRC).WillByDefault(Return(kSsrc1));
991 ON_CALL(rtp_2, SendingMedia).WillByDefault(Return(true));
992 ON_CALL(rtp_2, SSRC).WillByDefault(Return(kSsrc2));
993
994 RtpHeaderExtensionMap extension_manager;
995 const int kTransportSequenceNumberExtensionId = 1;
996 extension_manager.Register(kRtpExtensionTransportSequenceNumber,
997 kTransportSequenceNumberExtensionId);
998
999 uint16_t transport_sequence_number = 0;
1000
1001 auto packet = absl::make_unique<RtpPacketToSend>(&extension_manager);
1002 EXPECT_TRUE(packet->ReserveExtension<TransportSequenceNumber>());
1003 packet->SetSsrc(kSsrc1);
1004 EXPECT_CALL(
1005 rtp_1,
1006 TrySendPacket(
1007 Property(&RtpPacketToSend::GetExtension<TransportSequenceNumber>,
1008 transport_sequence_number),
1009 _))
1010 .WillOnce(Return(true));
1011 packet_router.SendPacket(std::move(packet), PacedPacketInfo());
1012
1013 ++transport_sequence_number;
1014 packet = absl::make_unique<RtpPacketToSend>(&extension_manager);
1015 EXPECT_TRUE(packet->ReserveExtension<TransportSequenceNumber>());
1016 packet->SetSsrc(kSsrc2);
1017
1018 // There will be a failed attempt to send on kSsrc1 before trying
1019 // the correct RTP module.
1020 EXPECT_CALL(rtp_1, TrySendPacket).WillOnce(Return(false));
1021 EXPECT_CALL(
1022 rtp_2,
1023 TrySendPacket(
1024 Property(&RtpPacketToSend::GetExtension<TransportSequenceNumber>,
1025 transport_sequence_number),
1026 _))
1027 .WillOnce(Return(true));
1028 packet_router.SendPacket(std::move(packet), PacedPacketInfo());
1029
1030 packet_router.RemoveSendRtpModule(&rtp_1);
1031 packet_router.RemoveSendRtpModule(&rtp_2);
1032}
1033
Stefan Holmere5904162015-03-26 11:11:06 +01001034} // namespace webrtc