blob: ff1c6f988a19425d937fa25503380565570dcdff [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 Bonadei999a72a2019-07-12 17:33:46 +0000206 EXPECT_CALL(rtp_2, SupportsPadding).Times(1).WillOnce(Return(true));
philipelc7bf32a2017-02-17 03:59:43 -0800207 EXPECT_CALL(rtp_2,
208 TimeToSendPadding(requested_padding_bytes,
209 Field(&PacedPacketInfo::probe_cluster_id, 111)))
Stefan Holmere5904162015-03-26 11:11:06 +0100210 .Times(1)
211 .WillOnce(Return(sent_padding_bytes));
Mirko Bonadei999a72a2019-07-12 17:33:46 +0000212 EXPECT_CALL(rtp_1, SupportsPadding).WillOnce(Return(true));
philipelc7bf32a2017-02-17 03:59:43 -0800213 EXPECT_CALL(rtp_1,
214 TimeToSendPadding(requested_padding_bytes - sent_padding_bytes,
215 Field(&PacedPacketInfo::probe_cluster_id, 111)))
sprang867fb522015-08-03 04:38:41 -0700216 .Times(1)
217 .WillOnce(Return(requested_padding_bytes - sent_padding_bytes));
218 EXPECT_EQ(requested_padding_bytes,
eladalonb1338fe2017-08-01 09:36:19 -0700219 packet_router.TimeToSendPadding(
philipelc7bf32a2017-02-17 03:59:43 -0800220 requested_padding_bytes,
221 PacedPacketInfo(111, kProbeMinBytes, kProbeMinBytes)));
Stefan Holmere5904162015-03-26 11:11:06 +0100222
stefan16b02212017-01-27 07:12:16 -0800223 // Let only the lower priority module be sending and verify the padding
224 // request is routed there.
Mirko Bonadei999a72a2019-07-12 17:33:46 +0000225 EXPECT_CALL(rtp_2, SupportsPadding).WillOnce(Return(false));
stefan16b02212017-01-27 07:12:16 -0800226 EXPECT_CALL(rtp_2, TimeToSendPadding(requested_padding_bytes, _)).Times(0);
Mirko Bonadei999a72a2019-07-12 17:33:46 +0000227 EXPECT_CALL(rtp_1, SupportsPadding).WillOnce(Return(true));
stefan16b02212017-01-27 07:12:16 -0800228 EXPECT_CALL(rtp_1, TimeToSendPadding(_, _))
Stefan Holmere5904162015-03-26 11:11:06 +0100229 .Times(1)
230 .WillOnce(Return(sent_padding_bytes));
231 EXPECT_EQ(sent_padding_bytes,
eladalonb1338fe2017-08-01 09:36:19 -0700232 packet_router.TimeToSendPadding(
philipelc7bf32a2017-02-17 03:59:43 -0800233 requested_padding_bytes,
234 PacedPacketInfo(PacedPacketInfo::kNotAProbe, kProbeMinBytes,
235 kProbeMinBytes)));
Stefan Holmere5904162015-03-26 11:11:06 +0100236
237 // No sending module at all.
Mirko Bonadei999a72a2019-07-12 17:33:46 +0000238 EXPECT_CALL(rtp_1, SupportsPadding).WillOnce(Return(false));
philipela1ed0b32016-06-01 06:31:17 -0700239 EXPECT_CALL(rtp_1, TimeToSendPadding(requested_padding_bytes, _)).Times(0);
Mirko Bonadei999a72a2019-07-12 17:33:46 +0000240 EXPECT_CALL(rtp_2, SupportsPadding).WillOnce(Return(false));
philipela1ed0b32016-06-01 06:31:17 -0700241 EXPECT_CALL(rtp_2, TimeToSendPadding(_, _)).Times(0);
Yves Gerey665174f2018-06-19 15:03:05 +0200242 EXPECT_EQ(0u, packet_router.TimeToSendPadding(
243 requested_padding_bytes,
244 PacedPacketInfo(PacedPacketInfo::kNotAProbe, kProbeMinBytes,
245 kProbeMinBytes)));
Stefan Holmere5904162015-03-26 11:11:06 +0100246
eladalonb1338fe2017-08-01 09:36:19 -0700247 packet_router.RemoveSendRtpModule(&rtp_1);
Stefan Holmere5904162015-03-26 11:11:06 +0100248
249 // rtp_1 has been removed, try sending padding and make sure rtp_1 isn't asked
250 // to send by not expecting any calls. Instead verify rtp_2 is called.
Mirko Bonadei999a72a2019-07-12 17:33:46 +0000251 EXPECT_CALL(rtp_2, SupportsPadding).WillOnce(Return(true));
philipela1ed0b32016-06-01 06:31:17 -0700252 EXPECT_CALL(rtp_2, TimeToSendPadding(requested_padding_bytes, _)).Times(1);
Yves Gerey665174f2018-06-19 15:03:05 +0200253 EXPECT_EQ(0u, packet_router.TimeToSendPadding(
254 requested_padding_bytes,
255 PacedPacketInfo(PacedPacketInfo::kNotAProbe, kProbeMinBytes,
256 kProbeMinBytes)));
Stefan Holmere5904162015-03-26 11:11:06 +0100257
eladalonb1338fe2017-08-01 09:36:19 -0700258 packet_router.RemoveSendRtpModule(&rtp_2);
Peter Boström3dd5d1d2016-02-25 16:56:48 +0100259}
260
Erik Språng478cb462019-06-26 15:49:27 +0200261TEST(PacketRouterTest, GeneratePaddingPicksCorrectModule) {
262 PacketRouter packet_router;
263
264 // Two RTP modules. The first (prioritized due to rtx) isn't sending media so
265 // should not be called.
266 const uint16_t kSsrc1 = 1234;
267 const uint16_t kSsrc2 = 4567;
268
269 NiceMock<MockRtpRtcp> rtp_1;
270 ON_CALL(rtp_1, RtxSendStatus()).WillByDefault(Return(kRtxRedundantPayloads));
271 ON_CALL(rtp_1, SSRC()).WillByDefault(Return(kSsrc1));
Mirko Bonadei999a72a2019-07-12 17:33:46 +0000272 ON_CALL(rtp_1, SupportsPadding).WillByDefault(Return(false));
Erik Språng478cb462019-06-26 15:49:27 +0200273
274 NiceMock<MockRtpRtcp> rtp_2;
275 ON_CALL(rtp_2, RtxSendStatus()).WillByDefault(Return(kRtxOff));
276 ON_CALL(rtp_2, SSRC()).WillByDefault(Return(kSsrc2));
Mirko Bonadei999a72a2019-07-12 17:33:46 +0000277 ON_CALL(rtp_2, SupportsPadding).WillByDefault(Return(true));
Erik Språng478cb462019-06-26 15:49:27 +0200278
279 packet_router.AddSendRtpModule(&rtp_1, false);
280 packet_router.AddSendRtpModule(&rtp_2, false);
281
282 const size_t kPaddingSize = 123;
Erik Språngf6468d22019-07-05 16:53:43 +0200283 const size_t kExpectedPaddingPackets = 1;
Erik Språng478cb462019-06-26 15:49:27 +0200284 EXPECT_CALL(rtp_1, GeneratePadding(_)).Times(0);
Erik Språngf6468d22019-07-05 16:53:43 +0200285 EXPECT_CALL(rtp_2, GeneratePadding(kPaddingSize))
286 .WillOnce([&](size_t padding_size) {
287 return std::vector<std::unique_ptr<RtpPacketToSend>>(
288 kExpectedPaddingPackets);
289 });
290 auto generated_padding = packet_router.GeneratePadding(kPaddingSize);
291 EXPECT_EQ(generated_padding.size(), kExpectedPaddingPackets);
Erik Språng478cb462019-06-26 15:49:27 +0200292
293 packet_router.RemoveSendRtpModule(&rtp_1);
294 packet_router.RemoveSendRtpModule(&rtp_2);
295}
296
Erik Språng8b7ca4a2018-05-17 13:43:35 +0200297TEST(PacketRouterTest, PadsOnLastActiveMediaStream) {
298 PacketRouter packet_router;
299
300 const uint16_t kSsrc1 = 1234;
301 const uint16_t kSsrc2 = 4567;
302 const uint16_t kSsrc3 = 8901;
303
304 // First two rtp modules send media and have rtx.
305 NiceMock<MockRtpRtcp> rtp_1;
306 EXPECT_CALL(rtp_1, RtxSendStatus())
307 .WillRepeatedly(Return(kRtxRedundantPayloads));
308 EXPECT_CALL(rtp_1, SSRC()).WillRepeatedly(Return(kSsrc1));
309 EXPECT_CALL(rtp_1, SendingMedia()).WillRepeatedly(Return(true));
Mirko Bonadei999a72a2019-07-12 17:33:46 +0000310 EXPECT_CALL(rtp_1, SupportsPadding).WillRepeatedly(Return(true));
311 EXPECT_CALL(rtp_1, SupportsRtxPayloadPadding).WillRepeatedly(Return(true));
Erik Språng8b7ca4a2018-05-17 13:43:35 +0200312
313 NiceMock<MockRtpRtcp> rtp_2;
314 EXPECT_CALL(rtp_2, RtxSendStatus())
315 .WillRepeatedly(Return(kRtxRedundantPayloads));
316 EXPECT_CALL(rtp_2, SSRC()).WillRepeatedly(Return(kSsrc2));
317 EXPECT_CALL(rtp_2, SendingMedia()).WillRepeatedly(Return(true));
Mirko Bonadei999a72a2019-07-12 17:33:46 +0000318 EXPECT_CALL(rtp_2, SupportsPadding).WillRepeatedly(Return(true));
319 EXPECT_CALL(rtp_2, SupportsRtxPayloadPadding).WillRepeatedly(Return(true));
Erik Språng8b7ca4a2018-05-17 13:43:35 +0200320
321 // Third module is sending media, but does not support rtx.
322 NiceMock<MockRtpRtcp> rtp_3;
323 EXPECT_CALL(rtp_3, RtxSendStatus()).WillRepeatedly(Return(kRtxOff));
324 EXPECT_CALL(rtp_3, SSRC()).WillRepeatedly(Return(kSsrc3));
325 EXPECT_CALL(rtp_3, SendingMedia()).WillRepeatedly(Return(true));
Mirko Bonadei999a72a2019-07-12 17:33:46 +0000326 EXPECT_CALL(rtp_3, SupportsPadding).WillRepeatedly(Return(true));
327 EXPECT_CALL(rtp_3, SupportsRtxPayloadPadding).WillRepeatedly(Return(true));
Erik Språng8b7ca4a2018-05-17 13:43:35 +0200328
329 packet_router.AddSendRtpModule(&rtp_1, false);
330 packet_router.AddSendRtpModule(&rtp_2, false);
331 packet_router.AddSendRtpModule(&rtp_3, false);
332
333 const size_t kPaddingBytes = 100;
334
335 // Initially, padding will be sent on last added rtp module that sends media
336 // and supports rtx.
337 EXPECT_CALL(rtp_2, TimeToSendPadding(kPaddingBytes, _))
338 .Times(1)
339 .WillOnce(Return(kPaddingBytes));
340 packet_router.TimeToSendPadding(kPaddingBytes, PacedPacketInfo());
341
342 // Send media on first module. Padding should be sent on that module.
343 EXPECT_CALL(rtp_1, TimeToSendPacket(kSsrc1, _, _, _, _));
344 packet_router.TimeToSendPacket(kSsrc1, 0, 0, false, PacedPacketInfo());
345
346 EXPECT_CALL(rtp_1, TimeToSendPadding(kPaddingBytes, _))
347 .Times(1)
348 .WillOnce(Return(kPaddingBytes));
349 packet_router.TimeToSendPadding(kPaddingBytes, PacedPacketInfo());
350
351 // Send media on second module. Padding should be sent there.
352 EXPECT_CALL(rtp_2, TimeToSendPacket(kSsrc2, _, _, _, _));
353 packet_router.TimeToSendPacket(kSsrc2, 0, 0, false, PacedPacketInfo());
354
355 EXPECT_CALL(rtp_2, TimeToSendPadding(kPaddingBytes, _))
356 .Times(1)
357 .WillOnce(Return(kPaddingBytes));
358 packet_router.TimeToSendPadding(kPaddingBytes, PacedPacketInfo());
359
360 // Remove second module, padding should now fall back to first module.
361 packet_router.RemoveSendRtpModule(&rtp_2);
362 EXPECT_CALL(rtp_1, TimeToSendPadding(kPaddingBytes, _))
363 .Times(1)
364 .WillOnce(Return(kPaddingBytes));
365 packet_router.TimeToSendPadding(kPaddingBytes, PacedPacketInfo());
366
367 // Remove first module too, leaving only the one without rtx.
368 packet_router.RemoveSendRtpModule(&rtp_1);
369
370 EXPECT_CALL(rtp_3, TimeToSendPadding(kPaddingBytes, _))
371 .Times(1)
372 .WillOnce(Return(kPaddingBytes));
373 packet_router.TimeToSendPadding(kPaddingBytes, PacedPacketInfo());
374
375 packet_router.RemoveSendRtpModule(&rtp_3);
376}
377
eladalonb1338fe2017-08-01 09:36:19 -0700378TEST(PacketRouterTest, SenderOnlyFunctionsRespectSendingMedia) {
379 PacketRouter packet_router;
eladalon6c9556e2017-07-10 03:33:00 -0700380 NiceMock<MockRtpRtcp> rtp;
eladalonb1338fe2017-08-01 09:36:19 -0700381 packet_router.AddSendRtpModule(&rtp, false);
Peter Boström3dd5d1d2016-02-25 16:56:48 +0100382 static const uint16_t kSsrc = 1234;
383 EXPECT_CALL(rtp, SSRC()).WillRepeatedly(Return(kSsrc));
384 EXPECT_CALL(rtp, SendingMedia()).WillRepeatedly(Return(false));
385
386 // Verify that TimeToSendPacket does not end up in a receiver.
philipela1ed0b32016-06-01 06:31:17 -0700387 EXPECT_CALL(rtp, TimeToSendPacket(_, _, _, _, _)).Times(0);
Erik Språngd2879622019-05-10 08:29:01 -0700388 EXPECT_EQ(RtpPacketSendResult::kPacketNotFound,
389 packet_router.TimeToSendPacket(
390 kSsrc, 1, 1, false,
391 PacedPacketInfo(PacedPacketInfo::kNotAProbe, kProbeMinBytes,
392 kProbeMinBytes)));
Peter Boström3dd5d1d2016-02-25 16:56:48 +0100393 // Verify that TimeToSendPadding does not end up in a receiver.
philipela1ed0b32016-06-01 06:31:17 -0700394 EXPECT_CALL(rtp, TimeToSendPadding(_, _)).Times(0);
Yves Gerey665174f2018-06-19 15:03:05 +0200395 EXPECT_EQ(0u, packet_router.TimeToSendPadding(
396 200, PacedPacketInfo(PacedPacketInfo::kNotAProbe,
397 kProbeMinBytes, kProbeMinBytes)));
Peter Boström3dd5d1d2016-02-25 16:56:48 +0100398
eladalonb1338fe2017-08-01 09:36:19 -0700399 packet_router.RemoveSendRtpModule(&rtp);
Stefan Holmere5904162015-03-26 11:11:06 +0100400}
sprang867fb522015-08-03 04:38:41 -0700401
eladalonb1338fe2017-08-01 09:36:19 -0700402TEST(PacketRouterTest, AllocateSequenceNumbers) {
403 PacketRouter packet_router;
404
sprang867fb522015-08-03 04:38:41 -0700405 const uint16_t kStartSeq = 0xFFF0;
406 const size_t kNumPackets = 32;
407
eladalonb1338fe2017-08-01 09:36:19 -0700408 packet_router.SetTransportWideSequenceNumber(kStartSeq - 1);
sprang867fb522015-08-03 04:38:41 -0700409
410 for (size_t i = 0; i < kNumPackets; ++i) {
eladalonb1338fe2017-08-01 09:36:19 -0700411 uint16_t seq = packet_router.AllocateSequenceNumber();
sprang867fb522015-08-03 04:38:41 -0700412 uint32_t expected_unwrapped_seq = static_cast<uint32_t>(kStartSeq) + i;
413 EXPECT_EQ(static_cast<uint16_t>(expected_unwrapped_seq & 0xFFFF), seq);
414 }
415}
stefanbba9dec2016-02-01 04:39:55 -0800416
eladalonb1338fe2017-08-01 09:36:19 -0700417TEST(PacketRouterTest, SendTransportFeedback) {
418 PacketRouter packet_router;
eladalon6c9556e2017-07-10 03:33:00 -0700419 NiceMock<MockRtpRtcp> rtp_1;
420 NiceMock<MockRtpRtcp> rtp_2;
eladalonb1338fe2017-08-01 09:36:19 -0700421
422 packet_router.AddSendRtpModule(&rtp_1, false);
423 packet_router.AddReceiveRtpModule(&rtp_2, false);
stefanbba9dec2016-02-01 04:39:55 -0800424
425 rtcp::TransportFeedback feedback;
nisse05843312017-04-18 23:38:35 -0700426 EXPECT_CALL(rtp_1, SendFeedbackPacket(_)).Times(1).WillOnce(Return(true));
eladalonb1338fe2017-08-01 09:36:19 -0700427 packet_router.SendTransportFeedback(&feedback);
428 packet_router.RemoveSendRtpModule(&rtp_1);
nisse05843312017-04-18 23:38:35 -0700429 EXPECT_CALL(rtp_2, SendFeedbackPacket(_)).Times(1).WillOnce(Return(true));
eladalonb1338fe2017-08-01 09:36:19 -0700430 packet_router.SendTransportFeedback(&feedback);
431 packet_router.RemoveReceiveRtpModule(&rtp_2);
stefanbba9dec2016-02-01 04:39:55 -0800432}
nisse05843312017-04-18 23:38:35 -0700433
eladalon822ff2b2017-08-01 06:30:28 -0700434#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
eladalonb1338fe2017-08-01 09:36:19 -0700435TEST(PacketRouterTest, DoubleRegistrationOfSendModuleDisallowed) {
436 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700437 NiceMock<MockRtpRtcp> module;
438
439 constexpr bool remb_candidate = false; // Value irrelevant.
eladalonb1338fe2017-08-01 09:36:19 -0700440 packet_router.AddSendRtpModule(&module, remb_candidate);
441 EXPECT_DEATH(packet_router.AddSendRtpModule(&module, remb_candidate), "");
eladalon822ff2b2017-08-01 06:30:28 -0700442
443 // Test tear-down
eladalonb1338fe2017-08-01 09:36:19 -0700444 packet_router.RemoveSendRtpModule(&module);
eladalon822ff2b2017-08-01 06:30:28 -0700445}
446
eladalonb1338fe2017-08-01 09:36:19 -0700447TEST(PacketRouterTest, DoubleRegistrationOfReceiveModuleDisallowed) {
448 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700449 NiceMock<MockRtpRtcp> module;
450
451 constexpr bool remb_candidate = false; // Value irrelevant.
eladalonb1338fe2017-08-01 09:36:19 -0700452 packet_router.AddReceiveRtpModule(&module, remb_candidate);
453 EXPECT_DEATH(packet_router.AddReceiveRtpModule(&module, remb_candidate), "");
eladalon822ff2b2017-08-01 06:30:28 -0700454
455 // Test tear-down
eladalonb1338fe2017-08-01 09:36:19 -0700456 packet_router.RemoveReceiveRtpModule(&module);
eladalon822ff2b2017-08-01 06:30:28 -0700457}
458
eladalonb1338fe2017-08-01 09:36:19 -0700459TEST(PacketRouterTest, RemovalOfNeverAddedSendModuleDisallowed) {
460 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700461 NiceMock<MockRtpRtcp> module;
462
eladalonb1338fe2017-08-01 09:36:19 -0700463 EXPECT_DEATH(packet_router.RemoveSendRtpModule(&module), "");
eladalon822ff2b2017-08-01 06:30:28 -0700464}
465
eladalonb1338fe2017-08-01 09:36:19 -0700466TEST(PacketRouterTest, RemovalOfNeverAddedReceiveModuleDisallowed) {
467 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700468 NiceMock<MockRtpRtcp> module;
469
eladalonb1338fe2017-08-01 09:36:19 -0700470 EXPECT_DEATH(packet_router.RemoveReceiveRtpModule(&module), "");
eladalon822ff2b2017-08-01 06:30:28 -0700471}
472#endif // RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
473
nisse05843312017-04-18 23:38:35 -0700474TEST(PacketRouterRembTest, LowerEstimateToSendRemb) {
475 rtc::ScopedFakeClock clock;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200476 NiceMock<MockRtpRtcp> rtp;
nisse05843312017-04-18 23:38:35 -0700477 PacketRouter packet_router;
478
eladalon822ff2b2017-08-01 06:30:28 -0700479 packet_router.AddSendRtpModule(&rtp, true);
nisse05843312017-04-18 23:38:35 -0700480
481 uint32_t bitrate_estimate = 456;
482 const std::vector<uint32_t> ssrcs = {1234};
483
nisse05843312017-04-18 23:38:35 -0700484 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
485
486 // Call OnReceiveBitrateChanged twice to get a first estimate.
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200487 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200488 EXPECT_CALL(rtp, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700489 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
490
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200491 // Lower the estimate with more than 3% to trigger a call to SetRemb right
nisse05843312017-04-18 23:38:35 -0700492 // away.
493 bitrate_estimate = bitrate_estimate - 100;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200494 EXPECT_CALL(rtp, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700495 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
496
nisse05843312017-04-18 23:38:35 -0700497 packet_router.RemoveSendRtpModule(&rtp);
498}
499
500TEST(PacketRouterRembTest, VerifyIncreasingAndDecreasing) {
501 rtc::ScopedFakeClock clock;
eladalon6c9556e2017-07-10 03:33:00 -0700502 NiceMock<MockRtpRtcp> rtp;
nisse05843312017-04-18 23:38:35 -0700503 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700504 packet_router.AddSendRtpModule(&rtp, true);
nisse05843312017-04-18 23:38:35 -0700505
506 uint32_t bitrate_estimate[] = {456, 789};
507 std::vector<uint32_t> ssrcs = {1234, 5678};
508
nisse05843312017-04-18 23:38:35 -0700509 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[0]);
510
511 // Call OnReceiveBitrateChanged twice to get a first estimate.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200512 EXPECT_CALL(rtp, SetRemb(bitrate_estimate[0], ssrcs)).Times(1);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200513 clock.AdvanceTime(TimeDelta::ms(1000));
nisse05843312017-04-18 23:38:35 -0700514 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[0]);
515
516 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[1] + 100);
517
518 // Lower the estimate to trigger a callback.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200519 EXPECT_CALL(rtp, SetRemb(bitrate_estimate[1], ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700520 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[1]);
521
522 packet_router.RemoveSendRtpModule(&rtp);
523}
524
525TEST(PacketRouterRembTest, NoRembForIncreasedBitrate) {
526 rtc::ScopedFakeClock clock;
eladalon6c9556e2017-07-10 03:33:00 -0700527 NiceMock<MockRtpRtcp> rtp;
nisse05843312017-04-18 23:38:35 -0700528 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700529 packet_router.AddSendRtpModule(&rtp, true);
nisse05843312017-04-18 23:38:35 -0700530
531 uint32_t bitrate_estimate = 456;
532 std::vector<uint32_t> ssrcs = {1234, 5678};
533
nisse05843312017-04-18 23:38:35 -0700534 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
535
536 // Call OnReceiveBitrateChanged twice to get a first estimate.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200537 EXPECT_CALL(rtp, SetRemb(bitrate_estimate, ssrcs)).Times(1);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200538 clock.AdvanceTime(TimeDelta::ms(1000));
nisse05843312017-04-18 23:38:35 -0700539 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
540
541 // Increased estimate shouldn't trigger a callback right away.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200542 EXPECT_CALL(rtp, SetRemb(_, _)).Times(0);
nisse05843312017-04-18 23:38:35 -0700543 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate + 1);
544
545 // Decreasing the estimate less than 3% shouldn't trigger a new callback.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200546 EXPECT_CALL(rtp, SetRemb(_, _)).Times(0);
nisse05843312017-04-18 23:38:35 -0700547 int lower_estimate = bitrate_estimate * 98 / 100;
548 packet_router.OnReceiveBitrateChanged(ssrcs, lower_estimate);
549
550 packet_router.RemoveSendRtpModule(&rtp);
551}
552
553TEST(PacketRouterRembTest, ChangeSendRtpModule) {
554 rtc::ScopedFakeClock clock;
eladalon6c9556e2017-07-10 03:33:00 -0700555 NiceMock<MockRtpRtcp> rtp_send;
556 NiceMock<MockRtpRtcp> rtp_recv;
nisse05843312017-04-18 23:38:35 -0700557 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700558 packet_router.AddSendRtpModule(&rtp_send, true);
559 packet_router.AddReceiveRtpModule(&rtp_recv, true);
nisse05843312017-04-18 23:38:35 -0700560
561 uint32_t bitrate_estimate = 456;
562 std::vector<uint32_t> ssrcs = {1234, 5678};
563
nisse05843312017-04-18 23:38:35 -0700564 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
565
566 // Call OnReceiveBitrateChanged twice to get a first estimate.
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200567 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200568 EXPECT_CALL(rtp_send, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700569 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
570
571 // Decrease estimate to trigger a REMB.
572 bitrate_estimate = bitrate_estimate - 100;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200573 EXPECT_CALL(rtp_send, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700574 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
575
576 // Remove the sending module -> should get remb on the second module.
577 packet_router.RemoveSendRtpModule(&rtp_send);
578
nisse05843312017-04-18 23:38:35 -0700579 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
580
581 bitrate_estimate = bitrate_estimate - 100;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200582 EXPECT_CALL(rtp_recv, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700583 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
584
585 packet_router.RemoveReceiveRtpModule(&rtp_recv);
586}
587
588TEST(PacketRouterRembTest, OnlyOneRembForRepeatedOnReceiveBitrateChanged) {
589 rtc::ScopedFakeClock clock;
eladalon6c9556e2017-07-10 03:33:00 -0700590 NiceMock<MockRtpRtcp> rtp;
nisse05843312017-04-18 23:38:35 -0700591 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700592 packet_router.AddSendRtpModule(&rtp, true);
nisse05843312017-04-18 23:38:35 -0700593
594 uint32_t bitrate_estimate = 456;
595 const std::vector<uint32_t> ssrcs = {1234};
596
nisse05843312017-04-18 23:38:35 -0700597 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
598
599 // Call OnReceiveBitrateChanged twice to get a first estimate.
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200600 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200601 EXPECT_CALL(rtp, SetRemb(_, _)).Times(1);
nisse05843312017-04-18 23:38:35 -0700602 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
603
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200604 // Lower the estimate, should trigger a call to SetRemb right away.
nisse05843312017-04-18 23:38:35 -0700605 bitrate_estimate = bitrate_estimate - 100;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200606 EXPECT_CALL(rtp, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700607 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
608
609 // Call OnReceiveBitrateChanged again, this should not trigger a new callback.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200610 EXPECT_CALL(rtp, SetRemb(_, _)).Times(0);
nisse05843312017-04-18 23:38:35 -0700611 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
612 packet_router.RemoveSendRtpModule(&rtp);
613}
614
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200615TEST(PacketRouterRembTest, SetMaxDesiredReceiveBitrateLimitsSetRemb) {
danilchap47085372017-08-10 06:03:57 -0700616 rtc::ScopedFakeClock clock;
617 PacketRouter packet_router;
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200618 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200619 NiceMock<MockRtpRtcp> remb_sender;
danilchap47085372017-08-10 06:03:57 -0700620 constexpr bool remb_candidate = true;
621 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
danilchap47085372017-08-10 06:03:57 -0700622
Danil Chapovalov1de4b622017-12-13 13:35:10 +0100623 const int64_t cap_bitrate = 100000;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200624 EXPECT_CALL(remb_sender, SetRemb(Le(cap_bitrate), _)).Times(AtLeast(1));
625 EXPECT_CALL(remb_sender, SetRemb(Gt(cap_bitrate), _)).Times(0);
danilchap47085372017-08-10 06:03:57 -0700626
627 const std::vector<uint32_t> ssrcs = {1234};
628 packet_router.SetMaxDesiredReceiveBitrate(cap_bitrate);
629 packet_router.OnReceiveBitrateChanged(ssrcs, cap_bitrate + 5000);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200630 clock.AdvanceTime(TimeDelta::ms(1000));
danilchap47085372017-08-10 06:03:57 -0700631 packet_router.OnReceiveBitrateChanged(ssrcs, cap_bitrate - 5000);
632
633 // Test tear-down.
634 packet_router.RemoveSendRtpModule(&remb_sender);
635}
636
637TEST(PacketRouterRembTest,
638 SetMaxDesiredReceiveBitrateTriggersRembWhenMoreRestrictive) {
639 rtc::ScopedFakeClock clock;
640 PacketRouter packet_router;
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200641 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200642 NiceMock<MockRtpRtcp> remb_sender;
danilchap47085372017-08-10 06:03:57 -0700643 constexpr bool remb_candidate = true;
644 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
danilchap47085372017-08-10 06:03:57 -0700645
Danil Chapovalov1de4b622017-12-13 13:35:10 +0100646 const int64_t measured_bitrate_bps = 150000;
647 const int64_t cap_bitrate_bps = measured_bitrate_bps - 5000;
danilchap47085372017-08-10 06:03:57 -0700648 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200649 EXPECT_CALL(remb_sender, SetRemb(measured_bitrate_bps, _));
danilchap47085372017-08-10 06:03:57 -0700650 packet_router.OnReceiveBitrateChanged(ssrcs, measured_bitrate_bps);
651
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200652 EXPECT_CALL(remb_sender, SetRemb(cap_bitrate_bps, _));
danilchap47085372017-08-10 06:03:57 -0700653 packet_router.SetMaxDesiredReceiveBitrate(cap_bitrate_bps);
654
655 // Test tear-down.
656 packet_router.RemoveSendRtpModule(&remb_sender);
657}
658
659TEST(PacketRouterRembTest,
660 SetMaxDesiredReceiveBitrateDoesNotTriggerRembWhenAsRestrictive) {
661 rtc::ScopedFakeClock clock;
662 PacketRouter packet_router;
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200663 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200664 NiceMock<MockRtpRtcp> remb_sender;
danilchap47085372017-08-10 06:03:57 -0700665 constexpr bool remb_candidate = true;
666 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
danilchap47085372017-08-10 06:03:57 -0700667
668 const uint32_t measured_bitrate_bps = 150000;
669 const uint32_t cap_bitrate_bps = measured_bitrate_bps;
670 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200671 EXPECT_CALL(remb_sender, SetRemb(measured_bitrate_bps, _));
danilchap47085372017-08-10 06:03:57 -0700672 packet_router.OnReceiveBitrateChanged(ssrcs, measured_bitrate_bps);
673
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200674 EXPECT_CALL(remb_sender, SetRemb(_, _)).Times(0);
danilchap47085372017-08-10 06:03:57 -0700675 packet_router.SetMaxDesiredReceiveBitrate(cap_bitrate_bps);
676
677 // Test tear-down.
678 packet_router.RemoveSendRtpModule(&remb_sender);
679}
680
681TEST(PacketRouterRembTest,
682 SetMaxDesiredReceiveBitrateDoesNotTriggerRembWhenLessRestrictive) {
683 rtc::ScopedFakeClock clock;
684 PacketRouter packet_router;
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200685 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200686 NiceMock<MockRtpRtcp> remb_sender;
danilchap47085372017-08-10 06:03:57 -0700687 constexpr bool remb_candidate = true;
688 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
danilchap47085372017-08-10 06:03:57 -0700689
690 const uint32_t measured_bitrate_bps = 150000;
691 const uint32_t cap_bitrate_bps = measured_bitrate_bps + 500;
692 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200693 EXPECT_CALL(remb_sender, SetRemb(measured_bitrate_bps, _));
danilchap47085372017-08-10 06:03:57 -0700694 packet_router.OnReceiveBitrateChanged(ssrcs, measured_bitrate_bps);
695
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200696 EXPECT_CALL(remb_sender, SetRemb(_, _)).Times(0);
danilchap47085372017-08-10 06:03:57 -0700697 packet_router.SetMaxDesiredReceiveBitrate(cap_bitrate_bps);
698
699 // Test tear-down.
700 packet_router.RemoveSendRtpModule(&remb_sender);
701}
702
703TEST(PacketRouterRembTest,
704 SetMaxDesiredReceiveBitrateTriggersRembWhenNoRecentMeasure) {
705 rtc::ScopedFakeClock clock;
706 PacketRouter packet_router;
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200707 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200708 NiceMock<MockRtpRtcp> remb_sender;
danilchap47085372017-08-10 06:03:57 -0700709 constexpr bool remb_candidate = true;
710 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
danilchap47085372017-08-10 06:03:57 -0700711
712 const uint32_t measured_bitrate_bps = 150000;
713 const uint32_t cap_bitrate_bps = measured_bitrate_bps + 5000;
714 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200715 EXPECT_CALL(remb_sender, SetRemb(measured_bitrate_bps, _));
danilchap47085372017-08-10 06:03:57 -0700716 packet_router.OnReceiveBitrateChanged(ssrcs, measured_bitrate_bps);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200717 clock.AdvanceTime(TimeDelta::ms(1000));
danilchap47085372017-08-10 06:03:57 -0700718
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200719 EXPECT_CALL(remb_sender, SetRemb(cap_bitrate_bps, _));
danilchap47085372017-08-10 06:03:57 -0700720 packet_router.SetMaxDesiredReceiveBitrate(cap_bitrate_bps);
721
722 // Test tear-down.
723 packet_router.RemoveSendRtpModule(&remb_sender);
724}
725
726TEST(PacketRouterRembTest,
727 SetMaxDesiredReceiveBitrateTriggersRembWhenNoMeasures) {
728 rtc::ScopedFakeClock clock;
729 PacketRouter packet_router;
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200730 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200731 NiceMock<MockRtpRtcp> remb_sender;
danilchap47085372017-08-10 06:03:57 -0700732 constexpr bool remb_candidate = true;
733 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
danilchap47085372017-08-10 06:03:57 -0700734
735 // Set cap.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200736 EXPECT_CALL(remb_sender, SetRemb(100000, _)).Times(1);
danilchap47085372017-08-10 06:03:57 -0700737 packet_router.SetMaxDesiredReceiveBitrate(100000);
738 // Increase cap.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200739 EXPECT_CALL(remb_sender, SetRemb(200000, _)).Times(1);
danilchap47085372017-08-10 06:03:57 -0700740 packet_router.SetMaxDesiredReceiveBitrate(200000);
741 // Decrease cap.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200742 EXPECT_CALL(remb_sender, SetRemb(150000, _)).Times(1);
danilchap47085372017-08-10 06:03:57 -0700743 packet_router.SetMaxDesiredReceiveBitrate(150000);
744
745 // Test tear-down.
746 packet_router.RemoveSendRtpModule(&remb_sender);
747}
748
nisse05843312017-04-18 23:38:35 -0700749// Only register receiving modules and make sure we fallback to trigger a REMB
750// packet on this one.
751TEST(PacketRouterRembTest, NoSendingRtpModule) {
752 rtc::ScopedFakeClock clock;
eladalon6c9556e2017-07-10 03:33:00 -0700753 NiceMock<MockRtpRtcp> rtp;
nisse05843312017-04-18 23:38:35 -0700754 PacketRouter packet_router;
755
eladalon822ff2b2017-08-01 06:30:28 -0700756 packet_router.AddReceiveRtpModule(&rtp, true);
nisse05843312017-04-18 23:38:35 -0700757
758 uint32_t bitrate_estimate = 456;
759 const std::vector<uint32_t> ssrcs = {1234};
760
nisse05843312017-04-18 23:38:35 -0700761 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
762
763 // Call OnReceiveBitrateChanged twice to get a first estimate.
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200764 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200765 EXPECT_CALL(rtp, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700766 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
767
768 // Lower the estimate to trigger a new packet REMB packet.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200769 EXPECT_CALL(rtp, SetRemb(bitrate_estimate - 100, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700770 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate - 100);
771
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200772 EXPECT_CALL(rtp, UnsetRemb()).Times(1);
nisse05843312017-04-18 23:38:35 -0700773 packet_router.RemoveReceiveRtpModule(&rtp);
774}
775
eladalon822ff2b2017-08-01 06:30:28 -0700776TEST(PacketRouterRembTest, NonCandidateSendRtpModuleNotUsedForRemb) {
777 rtc::ScopedFakeClock clock;
778 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200779 NiceMock<MockRtpRtcp> module;
eladalon822ff2b2017-08-01 06:30:28 -0700780
781 constexpr bool remb_candidate = false;
782
783 packet_router.AddSendRtpModule(&module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700784
785 constexpr uint32_t bitrate_estimate = 456;
786 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200787 EXPECT_CALL(module, SetRemb(_, _)).Times(0);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200788 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700789 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
790
791 // Test tear-down
792 packet_router.RemoveSendRtpModule(&module);
793}
794
795TEST(PacketRouterRembTest, CandidateSendRtpModuleUsedForRemb) {
796 rtc::ScopedFakeClock clock;
797 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200798 NiceMock<MockRtpRtcp> module;
eladalon822ff2b2017-08-01 06:30:28 -0700799
800 constexpr bool remb_candidate = true;
801
802 packet_router.AddSendRtpModule(&module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700803
804 constexpr uint32_t bitrate_estimate = 456;
805 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200806 EXPECT_CALL(module, SetRemb(bitrate_estimate, ssrcs)).Times(1);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200807 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700808 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
809
810 // Test tear-down
811 packet_router.RemoveSendRtpModule(&module);
812}
813
814TEST(PacketRouterRembTest, NonCandidateReceiveRtpModuleNotUsedForRemb) {
815 rtc::ScopedFakeClock clock;
816 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200817 NiceMock<MockRtpRtcp> module;
eladalon822ff2b2017-08-01 06:30:28 -0700818
819 constexpr bool remb_candidate = false;
820
821 packet_router.AddReceiveRtpModule(&module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700822
823 constexpr uint32_t bitrate_estimate = 456;
824 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200825 EXPECT_CALL(module, SetRemb(_, _)).Times(0);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200826 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700827 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
828
829 // Test tear-down
830 packet_router.RemoveReceiveRtpModule(&module);
831}
832
833TEST(PacketRouterRembTest, CandidateReceiveRtpModuleUsedForRemb) {
834 rtc::ScopedFakeClock clock;
835 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200836 NiceMock<MockRtpRtcp> module;
eladalon822ff2b2017-08-01 06:30:28 -0700837
838 constexpr bool remb_candidate = true;
839
840 packet_router.AddReceiveRtpModule(&module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700841
842 constexpr uint32_t bitrate_estimate = 456;
843 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200844 EXPECT_CALL(module, SetRemb(bitrate_estimate, ssrcs)).Times(1);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200845 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700846 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
847
848 // Test tear-down
849 packet_router.RemoveReceiveRtpModule(&module);
850}
851
852TEST(PacketRouterRembTest,
853 SendCandidatePreferredOverReceiveCandidate_SendModuleAddedFirst) {
854 rtc::ScopedFakeClock clock;
855 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200856 NiceMock<MockRtpRtcp> send_module;
857 NiceMock<MockRtpRtcp> receive_module;
eladalon822ff2b2017-08-01 06:30:28 -0700858
859 constexpr bool remb_candidate = true;
860
861 // Send module added - activated.
862 packet_router.AddSendRtpModule(&send_module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700863
864 // Receive module added - the send module remains the active one.
865 packet_router.AddReceiveRtpModule(&receive_module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700866
867 constexpr uint32_t bitrate_estimate = 456;
868 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200869 EXPECT_CALL(send_module, SetRemb(bitrate_estimate, ssrcs)).Times(1);
870 EXPECT_CALL(receive_module, SetRemb(_, _)).Times(0);
eladalon822ff2b2017-08-01 06:30:28 -0700871
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200872 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700873 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
874
875 // Test tear-down
876 packet_router.RemoveReceiveRtpModule(&receive_module);
877 packet_router.RemoveSendRtpModule(&send_module);
878}
879
880TEST(PacketRouterRembTest,
881 SendCandidatePreferredOverReceiveCandidate_ReceiveModuleAddedFirst) {
882 rtc::ScopedFakeClock clock;
883 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200884 NiceMock<MockRtpRtcp> send_module;
885 NiceMock<MockRtpRtcp> receive_module;
eladalon822ff2b2017-08-01 06:30:28 -0700886
887 constexpr bool remb_candidate = true;
888
889 // Receive module added - activated.
890 packet_router.AddReceiveRtpModule(&receive_module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700891
892 // Send module added - replaces receive module as active.
893 packet_router.AddSendRtpModule(&send_module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700894
895 constexpr uint32_t bitrate_estimate = 456;
896 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200897 EXPECT_CALL(send_module, SetRemb(bitrate_estimate, ssrcs)).Times(1);
898 EXPECT_CALL(receive_module, SetRemb(_, _)).Times(0);
eladalon822ff2b2017-08-01 06:30:28 -0700899
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200900 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700901 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
902
903 // Test tear-down
904 packet_router.RemoveReceiveRtpModule(&receive_module);
905 packet_router.RemoveSendRtpModule(&send_module);
906}
907
908TEST(PacketRouterRembTest, ReceiveModuleTakesOverWhenLastSendModuleRemoved) {
909 rtc::ScopedFakeClock clock;
910 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200911 NiceMock<MockRtpRtcp> send_module;
912 NiceMock<MockRtpRtcp> receive_module;
eladalon822ff2b2017-08-01 06:30:28 -0700913
914 constexpr bool remb_candidate = true;
915
916 // Send module active, receive module inactive.
917 packet_router.AddSendRtpModule(&send_module, remb_candidate);
918 packet_router.AddReceiveRtpModule(&receive_module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700919
920 // Send module removed - receive module becomes active.
921 packet_router.RemoveSendRtpModule(&send_module);
eladalon822ff2b2017-08-01 06:30:28 -0700922 constexpr uint32_t bitrate_estimate = 456;
923 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200924 EXPECT_CALL(send_module, SetRemb(_, _)).Times(0);
925 EXPECT_CALL(receive_module, SetRemb(bitrate_estimate, ssrcs)).Times(1);
eladalon822ff2b2017-08-01 06:30:28 -0700926
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200927 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700928 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
929
930 // Test tear-down
931 packet_router.RemoveReceiveRtpModule(&receive_module);
932}
933
Erik Språngf6468d22019-07-05 16:53:43 +0200934TEST(PacketRouterTest, SendPacketWithoutTransportSequenceNumbers) {
935 PacketRouter packet_router;
936 NiceMock<MockRtpRtcp> rtp_1;
937 packet_router.AddSendRtpModule(&rtp_1, false);
938
939 const uint16_t kSsrc1 = 1234;
940 ON_CALL(rtp_1, SendingMedia).WillByDefault(Return(true));
941 ON_CALL(rtp_1, SSRC).WillByDefault(Return(kSsrc1));
942
943 // Send a packet without TransportSequenceNumber extension registered,
944 // packets sent should not have the extension set.
945 RtpHeaderExtensionMap extension_manager;
946 auto packet = absl::make_unique<RtpPacketToSend>(&extension_manager);
947 packet->SetSsrc(kSsrc1);
948 EXPECT_CALL(
949 rtp_1,
950 TrySendPacket(
951 Property(&RtpPacketToSend::HasExtension<TransportSequenceNumber>,
952 false),
953 _))
954 .WillOnce(Return(true));
955 packet_router.SendPacket(std::move(packet), PacedPacketInfo());
956
957 packet_router.RemoveSendRtpModule(&rtp_1);
958}
959
960TEST(PacketRouterTest, SendPacketAssignsTransportSequenceNumbers) {
961 PacketRouter packet_router;
962 NiceMock<MockRtpRtcp> rtp_1;
963 NiceMock<MockRtpRtcp> rtp_2;
964
965 packet_router.AddSendRtpModule(&rtp_1, false);
966 packet_router.AddSendRtpModule(&rtp_2, false);
967
968 const uint16_t kSsrc1 = 1234;
969 const uint16_t kSsrc2 = 2345;
970
971 ON_CALL(rtp_1, SendingMedia).WillByDefault(Return(true));
972 ON_CALL(rtp_1, SSRC).WillByDefault(Return(kSsrc1));
973 ON_CALL(rtp_2, SendingMedia).WillByDefault(Return(true));
974 ON_CALL(rtp_2, SSRC).WillByDefault(Return(kSsrc2));
975
976 RtpHeaderExtensionMap extension_manager;
977 const int kTransportSequenceNumberExtensionId = 1;
978 extension_manager.Register(kRtpExtensionTransportSequenceNumber,
979 kTransportSequenceNumberExtensionId);
980
Erik Språng6cdab462019-07-15 19:40:13 +0200981 // Transport sequence numbers start at 1, for historical reasons.
982 uint16_t transport_sequence_number = 1;
Erik Språngf6468d22019-07-05 16:53:43 +0200983
984 auto packet = absl::make_unique<RtpPacketToSend>(&extension_manager);
985 EXPECT_TRUE(packet->ReserveExtension<TransportSequenceNumber>());
986 packet->SetSsrc(kSsrc1);
987 EXPECT_CALL(
988 rtp_1,
989 TrySendPacket(
990 Property(&RtpPacketToSend::GetExtension<TransportSequenceNumber>,
991 transport_sequence_number),
992 _))
993 .WillOnce(Return(true));
994 packet_router.SendPacket(std::move(packet), PacedPacketInfo());
995
996 ++transport_sequence_number;
997 packet = absl::make_unique<RtpPacketToSend>(&extension_manager);
998 EXPECT_TRUE(packet->ReserveExtension<TransportSequenceNumber>());
999 packet->SetSsrc(kSsrc2);
1000
1001 // There will be a failed attempt to send on kSsrc1 before trying
1002 // the correct RTP module.
1003 EXPECT_CALL(rtp_1, TrySendPacket).WillOnce(Return(false));
1004 EXPECT_CALL(
1005 rtp_2,
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 packet_router.RemoveSendRtpModule(&rtp_1);
1014 packet_router.RemoveSendRtpModule(&rtp_2);
1015}
1016
Stefan Holmere5904162015-03-26 11:11:06 +01001017} // namespace webrtc