blob: 5760e6880997239e8944ddf86670a3a74a78841e [file] [log] [blame]
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +00001/*
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
11
12#include <list>
13
14#include "testing/gmock/include/gmock/gmock.h"
15#include "testing/gtest/include/gtest/gtest.h"
kwiberg@webrtc.org00b8f6b2015-02-26 14:34:55 +000016#include "webrtc/base/scoped_ptr.h"
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +000017#include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp.h"
18#include "webrtc/modules/rtp_rtcp/mocks/mock_rtp_rtcp.h"
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +000019#include "webrtc/video_engine/payload_router.h"
20
21using ::testing::_;
22using ::testing::AnyNumber;
23using ::testing::NiceMock;
24using ::testing::Return;
25
26namespace webrtc {
27
28class PayloadRouterTest : public ::testing::Test {
29 protected:
30 virtual void SetUp() {
31 payload_router_.reset(new PayloadRouter());
32 }
kwiberg@webrtc.org00b8f6b2015-02-26 14:34:55 +000033 rtc::scoped_ptr<PayloadRouter> payload_router_;
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +000034};
35
36TEST_F(PayloadRouterTest, SendOnOneModule) {
37 MockRtpRtcp rtp;
38 std::list<RtpRtcp*> modules(1, &rtp);
39
40 payload_router_->SetSendingRtpModules(modules);
41
42 uint8_t payload = 'a';
43 FrameType frame_type = kVideoFrameKey;
44 int8_t payload_type = 96;
45
46 EXPECT_CALL(rtp, SendOutgoingData(frame_type, payload_type, 0, 0, _, 1, NULL,
47 NULL))
48 .Times(0);
49 EXPECT_FALSE(payload_router_->RoutePayload(frame_type, payload_type, 0, 0,
50 &payload, 1, NULL, NULL));
51
52 payload_router_->set_active(true);
53 EXPECT_CALL(rtp, SendOutgoingData(frame_type, payload_type, 0, 0, _, 1, NULL,
54 NULL))
55 .Times(1);
56 EXPECT_TRUE(payload_router_->RoutePayload(frame_type, payload_type, 0, 0,
57 &payload, 1, NULL, NULL));
58
59 payload_router_->set_active(false);
60 EXPECT_CALL(rtp, SendOutgoingData(frame_type, payload_type, 0, 0, _, 1, NULL,
61 NULL))
62 .Times(0);
63 EXPECT_FALSE(payload_router_->RoutePayload(frame_type, payload_type, 0, 0,
64 &payload, 1, NULL, NULL));
65
66 payload_router_->set_active(true);
67 EXPECT_CALL(rtp, SendOutgoingData(frame_type, payload_type, 0, 0, _, 1, NULL,
68 NULL))
69 .Times(1);
70 EXPECT_TRUE(payload_router_->RoutePayload(frame_type, payload_type, 0, 0,
71 &payload, 1, NULL, NULL));
72
73 modules.clear();
74 payload_router_->SetSendingRtpModules(modules);
75 EXPECT_CALL(rtp, SendOutgoingData(frame_type, payload_type, 0, 0, _, 1, NULL,
76 NULL))
77 .Times(0);
78 EXPECT_FALSE(payload_router_->RoutePayload(frame_type, payload_type, 0, 0,
79 &payload, 1, NULL, NULL));
80}
81
82TEST_F(PayloadRouterTest, SendSimulcast) {
83 MockRtpRtcp rtp_1;
84 MockRtpRtcp rtp_2;
85 std::list<RtpRtcp*> modules;
86 modules.push_back(&rtp_1);
87 modules.push_back(&rtp_2);
88
89 payload_router_->SetSendingRtpModules(modules);
90
91 uint8_t payload_1 = 'a';
92 FrameType frame_type_1 = kVideoFrameKey;
93 int8_t payload_type_1 = 96;
94 RTPVideoHeader rtp_hdr_1;
95 rtp_hdr_1.simulcastIdx = 0;
96
97 payload_router_->set_active(true);
98 EXPECT_CALL(rtp_1, SendOutgoingData(frame_type_1, payload_type_1, 0, 0, _, 1,
99 NULL, &rtp_hdr_1))
100 .Times(1);
101 EXPECT_CALL(rtp_2, SendOutgoingData(_, _, _, _, _, _, _, _))
102 .Times(0);
103 EXPECT_TRUE(payload_router_->RoutePayload(frame_type_1, payload_type_1, 0, 0,
104 &payload_1, 1, NULL, &rtp_hdr_1));
105
106 uint8_t payload_2 = 'b';
107 FrameType frame_type_2 = kVideoFrameDelta;
108 int8_t payload_type_2 = 97;
109 RTPVideoHeader rtp_hdr_2;
110 rtp_hdr_2.simulcastIdx = 1;
111 EXPECT_CALL(rtp_2, SendOutgoingData(frame_type_2, payload_type_2, 0, 0, _, 1,
112 NULL, &rtp_hdr_2))
113 .Times(1);
114 EXPECT_CALL(rtp_1, SendOutgoingData(_, _, _, _, _, _, _, _))
115 .Times(0);
116 EXPECT_TRUE(payload_router_->RoutePayload(frame_type_2, payload_type_2, 0, 0,
117 &payload_2, 1, NULL, &rtp_hdr_2));
118
mflodman@webrtc.org50e28162015-02-23 07:45:11 +0000119 // Inactive.
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +0000120 payload_router_->set_active(false);
121 EXPECT_CALL(rtp_1, SendOutgoingData(_, _, _, _, _, _, _, _))
122 .Times(0);
123 EXPECT_CALL(rtp_2, SendOutgoingData(_, _, _, _, _, _, _, _))
124 .Times(0);
125 EXPECT_FALSE(payload_router_->RoutePayload(frame_type_1, payload_type_1, 0, 0,
126 &payload_1, 1, NULL, &rtp_hdr_1));
127 EXPECT_FALSE(payload_router_->RoutePayload(frame_type_2, payload_type_2, 0, 0,
128 &payload_2, 1, NULL, &rtp_hdr_2));
mflodman@webrtc.org50e28162015-02-23 07:45:11 +0000129
130 // Invalid simulcast index.
131 payload_router_->set_active(true);
132 EXPECT_CALL(rtp_1, SendOutgoingData(_, _, _, _, _, _, _, _))
133 .Times(0);
134 EXPECT_CALL(rtp_2, SendOutgoingData(_, _, _, _, _, _, _, _))
135 .Times(0);
136 rtp_hdr_1.simulcastIdx = 2;
137 EXPECT_FALSE(payload_router_->RoutePayload(frame_type_1, payload_type_1, 0, 0,
138 &payload_1, 1, NULL, &rtp_hdr_1));
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +0000139}
140
mflodman@webrtc.orga4ef2ce2015-02-12 09:54:18 +0000141TEST_F(PayloadRouterTest, MaxPayloadLength) {
142 // Without any limitations from the modules, verify we get the max payload
143 // length for IP/UDP/SRTP with a MTU of 150 bytes.
144 const size_t kDefaultMaxLength = 1500 - 20 - 8 - 12 - 4;
145 EXPECT_EQ(kDefaultMaxLength, payload_router_->DefaultMaxPayloadLength());
146 EXPECT_EQ(kDefaultMaxLength, payload_router_->MaxPayloadLength());
147
148 MockRtpRtcp rtp_1;
149 MockRtpRtcp rtp_2;
150 std::list<RtpRtcp*> modules;
151 modules.push_back(&rtp_1);
152 modules.push_back(&rtp_2);
153 payload_router_->SetSendingRtpModules(modules);
154
155 // Modules return a higher length than the default value.
156 EXPECT_CALL(rtp_1, MaxDataPayloadLength())
157 .Times(1)
158 .WillOnce(Return(kDefaultMaxLength + 10));
159 EXPECT_CALL(rtp_2, MaxDataPayloadLength())
160 .Times(1)
161 .WillOnce(Return(kDefaultMaxLength + 10));
162 EXPECT_EQ(kDefaultMaxLength, payload_router_->MaxPayloadLength());
163
164 // The modules return a value lower than default.
165 const size_t kTestMinPayloadLength = 1001;
166 EXPECT_CALL(rtp_1, MaxDataPayloadLength())
167 .Times(1)
168 .WillOnce(Return(kTestMinPayloadLength + 10));
169 EXPECT_CALL(rtp_2, MaxDataPayloadLength())
170 .Times(1)
171 .WillOnce(Return(kTestMinPayloadLength));
172 EXPECT_EQ(kTestMinPayloadLength, payload_router_->MaxPayloadLength());
173}
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +0000174
mflodman@webrtc.org290cb562015-02-17 10:15:06 +0000175TEST_F(PayloadRouterTest, TimeToSendPacket) {
176 MockRtpRtcp rtp_1;
177 MockRtpRtcp rtp_2;
178 std::list<RtpRtcp*> modules;
179 modules.push_back(&rtp_1);
180 modules.push_back(&rtp_2);
181 payload_router_->SetSendingRtpModules(modules);
182
183 const uint16_t kSsrc1 = 1234;
184 uint16_t sequence_number = 17;
185 uint64_t timestamp = 7890;
186 bool retransmission = false;
187
188 // Send on the first module by letting rtp_1 be sending with correct ssrc.
189 EXPECT_CALL(rtp_1, SendingMedia())
190 .Times(1)
191 .WillOnce(Return(true));
192 EXPECT_CALL(rtp_1, SSRC())
193 .Times(1)
194 .WillOnce(Return(kSsrc1));
195 EXPECT_CALL(rtp_1, TimeToSendPacket(kSsrc1, sequence_number, timestamp,
196 retransmission))
197 .Times(1)
198 .WillOnce(Return(true));
199 EXPECT_CALL(rtp_2, TimeToSendPacket(_, _, _, _))
200 .Times(0);
201 EXPECT_TRUE(payload_router_->TimeToSendPacket(
202 kSsrc1, sequence_number, timestamp, retransmission));
203
204
205 // Send on the second module by letting rtp_2 be sending, but not rtp_1.
206 ++sequence_number;
207 timestamp += 30;
208 retransmission = true;
209 const uint16_t kSsrc2 = 4567;
210 EXPECT_CALL(rtp_1, SendingMedia())
211 .Times(1)
212 .WillOnce(Return(false));
213 EXPECT_CALL(rtp_2, SendingMedia())
214 .Times(1)
215 .WillOnce(Return(true));
216 EXPECT_CALL(rtp_2, SSRC())
217 .Times(1)
218 .WillOnce(Return(kSsrc2));
219 EXPECT_CALL(rtp_1, TimeToSendPacket(_, _, _, _))
220 .Times(0);
221 EXPECT_CALL(rtp_2, TimeToSendPacket(kSsrc2, sequence_number, timestamp,
222 retransmission))
223 .Times(1)
224 .WillOnce(Return(true));
225 EXPECT_TRUE(payload_router_->TimeToSendPacket(
226 kSsrc2, sequence_number, timestamp, retransmission));
227
228 // No module is sending, hence no packet should be sent.
229 EXPECT_CALL(rtp_1, SendingMedia())
230 .Times(1)
231 .WillOnce(Return(false));
232 EXPECT_CALL(rtp_1, TimeToSendPacket(_, _, _,_))
233 .Times(0);
234 EXPECT_CALL(rtp_2, SendingMedia())
235 .Times(1)
236 .WillOnce(Return(false));
237 EXPECT_CALL(rtp_2, TimeToSendPacket(_, _, _, _))
238 .Times(0);
239 EXPECT_TRUE(payload_router_->TimeToSendPacket(
240 kSsrc1, sequence_number, timestamp, retransmission));
241
242 // Add a packet with incorrect ssrc and test it's dropped in the router.
243 EXPECT_CALL(rtp_1, SendingMedia())
244 .Times(1)
245 .WillOnce(Return(true));
246 EXPECT_CALL(rtp_1, SSRC())
247 .Times(1)
248 .WillOnce(Return(kSsrc1));
249 EXPECT_CALL(rtp_2, SendingMedia())
250 .Times(1)
251 .WillOnce(Return(true));
252 EXPECT_CALL(rtp_2, SSRC())
253 .Times(1)
254 .WillOnce(Return(kSsrc2));
255 EXPECT_CALL(rtp_1, TimeToSendPacket(_, _, _,_))
256 .Times(0);
257 EXPECT_CALL(rtp_2, TimeToSendPacket(_, _, _, _))
258 .Times(0);
259 EXPECT_TRUE(payload_router_->TimeToSendPacket(
260 kSsrc1 + kSsrc2, sequence_number, timestamp, retransmission));
261}
262
263TEST_F(PayloadRouterTest, TimeToSendPadding) {
264 MockRtpRtcp rtp_1;
265 MockRtpRtcp rtp_2;
266 std::list<RtpRtcp*> modules;
267 modules.push_back(&rtp_1);
268 modules.push_back(&rtp_2);
269 payload_router_->SetSendingRtpModules(modules);
270
mflodman@webrtc.org290cb562015-02-17 10:15:06 +0000271 // Default configuration, sending padding on the first sending module.
272 const size_t requested_padding_bytes = 1000;
273 const size_t sent_padding_bytes = 890;
274 EXPECT_CALL(rtp_1, SendingMedia())
275 .Times(1)
276 .WillOnce(Return(true));
277 EXPECT_CALL(rtp_1, TimeToSendPadding(requested_padding_bytes))
278 .Times(1)
279 .WillOnce(Return(sent_padding_bytes));
280 EXPECT_CALL(rtp_2, TimeToSendPadding(_))
281 .Times(0);
282 EXPECT_EQ(sent_padding_bytes,
283 payload_router_->TimeToSendPadding(requested_padding_bytes));
284
285 // Let only the second module be sending and verify the padding request is
286 // routed there.
287 EXPECT_CALL(rtp_1, SendingMedia())
288 .Times(1)
289 .WillOnce(Return(false));
290 EXPECT_CALL(rtp_1, TimeToSendPadding(requested_padding_bytes))
291 .Times(0);
292 EXPECT_CALL(rtp_2, SendingMedia())
293 .Times(1)
294 .WillOnce(Return(true));
295 EXPECT_CALL(rtp_2, TimeToSendPadding(_))
296 .Times(1)
297 .WillOnce(Return(sent_padding_bytes));
298 EXPECT_EQ(sent_padding_bytes,
299 payload_router_->TimeToSendPadding(requested_padding_bytes));
300
301 // No sending module at all.
302 EXPECT_CALL(rtp_1, SendingMedia())
303 .Times(1)
304 .WillOnce(Return(false));
305 EXPECT_CALL(rtp_1, TimeToSendPadding(requested_padding_bytes))
306 .Times(0);
307 EXPECT_CALL(rtp_2, SendingMedia())
308 .Times(1)
309 .WillOnce(Return(false));
310 EXPECT_CALL(rtp_2, TimeToSendPadding(_))
311 .Times(0);
312 EXPECT_EQ(static_cast<size_t>(0),
313 payload_router_->TimeToSendPadding(requested_padding_bytes));
314}
mflodman@webrtc.org50e28162015-02-23 07:45:11 +0000315
316TEST_F(PayloadRouterTest, SetTargetSendBitrates) {
317 MockRtpRtcp rtp_1;
318 MockRtpRtcp rtp_2;
319 std::list<RtpRtcp*> modules;
320 modules.push_back(&rtp_1);
321 modules.push_back(&rtp_2);
322 payload_router_->SetSendingRtpModules(modules);
323
324 const uint32_t bitrate_1 = 10000;
325 const uint32_t bitrate_2 = 76543;
326 std::vector<uint32_t> bitrates (2, bitrate_1);
327 bitrates[1] = bitrate_2;
328 EXPECT_CALL(rtp_1, SetTargetSendBitrate(bitrate_1))
329 .Times(1);
330 EXPECT_CALL(rtp_2, SetTargetSendBitrate(bitrate_2))
331 .Times(1);
332 payload_router_->SetTargetSendBitrates(bitrates);
333
334 bitrates.resize(1);
335 EXPECT_CALL(rtp_1, SetTargetSendBitrate(bitrate_1))
336 .Times(0);
337 EXPECT_CALL(rtp_2, SetTargetSendBitrate(bitrate_2))
338 .Times(0);
339 payload_router_->SetTargetSendBitrates(bitrates);
340
341 bitrates.resize(3);
342 bitrates[1] = bitrate_2;
343 bitrates[2] = bitrate_1 + bitrate_2;
344 EXPECT_CALL(rtp_1, SetTargetSendBitrate(bitrate_1))
345 .Times(1);
346 EXPECT_CALL(rtp_2, SetTargetSendBitrate(bitrate_2))
347 .Times(1);
348 payload_router_->SetTargetSendBitrates(bitrates);
349 }
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +0000350} // namespace webrtc