1 /*
2 * Copyright (c) 2017 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 #include "call/rtp_demuxer.h"
12
13 #include <memory>
14 #include <set>
15 #include <string>
16
17 #include "call/test/mock_rtp_packet_sink_interface.h"
18 #include "modules/rtp_rtcp/include/rtp_header_extension_map.h"
19 #include "modules/rtp_rtcp/source/rtp_header_extensions.h"
20 #include "modules/rtp_rtcp/source/rtp_packet_received.h"
21 #include "rtc_base/arraysize.h"
22 #include "rtc_base/checks.h"
23 #include "rtc_base/numerics/safe_conversions.h"
24 #include "test/gmock.h"
25 #include "test/gtest.h"
26
27 namespace webrtc {
28
29 namespace {
30
31 using ::testing::_;
32 using ::testing::AtLeast;
33 using ::testing::InSequence;
34 using ::testing::NiceMock;
35
36 class RtpDemuxerTest : public ::testing::Test {
37 protected:
~RtpDemuxerTest()38 ~RtpDemuxerTest() {
39 for (auto* sink : sinks_to_tear_down_) {
40 demuxer_.RemoveSink(sink);
41 }
42 }
43
44 // These are convenience methods for calling demuxer.AddSink with different
45 // parameters and will ensure that the sink is automatically removed when the
46 // test case finishes.
47
AddSink(const RtpDemuxerCriteria & criteria,RtpPacketSinkInterface * sink)48 bool AddSink(const RtpDemuxerCriteria& criteria,
49 RtpPacketSinkInterface* sink) {
50 bool added = demuxer_.AddSink(criteria, sink);
51 if (added) {
52 sinks_to_tear_down_.insert(sink);
53 }
54 return added;
55 }
56
AddSinkOnlySsrc(uint32_t ssrc,RtpPacketSinkInterface * sink)57 bool AddSinkOnlySsrc(uint32_t ssrc, RtpPacketSinkInterface* sink) {
58 RtpDemuxerCriteria criteria;
59 criteria.ssrcs = {ssrc};
60 return AddSink(criteria, sink);
61 }
62
AddSinkOnlyRsid(const std::string & rsid,RtpPacketSinkInterface * sink)63 bool AddSinkOnlyRsid(const std::string& rsid, RtpPacketSinkInterface* sink) {
64 RtpDemuxerCriteria criteria;
65 criteria.rsid = rsid;
66 return AddSink(criteria, sink);
67 }
68
AddSinkOnlyMid(const std::string & mid,RtpPacketSinkInterface * sink)69 bool AddSinkOnlyMid(const std::string& mid, RtpPacketSinkInterface* sink) {
70 RtpDemuxerCriteria criteria;
71 criteria.mid = mid;
72 return AddSink(criteria, sink);
73 }
74
AddSinkBothMidRsid(const std::string & mid,const std::string & rsid,RtpPacketSinkInterface * sink)75 bool AddSinkBothMidRsid(const std::string& mid,
76 const std::string& rsid,
77 RtpPacketSinkInterface* sink) {
78 RtpDemuxerCriteria criteria;
79 criteria.mid = mid;
80 criteria.rsid = rsid;
81 return AddSink(criteria, sink);
82 }
83
RemoveSink(RtpPacketSinkInterface * sink)84 bool RemoveSink(RtpPacketSinkInterface* sink) {
85 sinks_to_tear_down_.erase(sink);
86 return demuxer_.RemoveSink(sink);
87 }
88
89 // The CreatePacket* methods are helpers for creating new RTP packets with
90 // various attributes set. Tests should use the helper that provides the
91 // minimum information needed to exercise the behavior under test. Tests also
92 // should not rely on any behavior which is not clearly described in the
93 // helper name/arguments. Any additional settings that are not covered by the
94 // helper should be set manually on the packet once it has been returned.
95 // For example, most tests in this file do not care about the RTP sequence
96 // number, but to ensure that the returned packets are valid the helpers will
97 // auto-increment the sequence number starting with 1. Tests that rely on
98 // specific sequence number behavior should call SetSequenceNumber manually on
99 // the returned packet.
100
101 // Intended for use only by other CreatePacket* helpers.
CreatePacket(uint32_t ssrc,RtpPacketReceived::ExtensionManager * extension_manager)102 std::unique_ptr<RtpPacketReceived> CreatePacket(
103 uint32_t ssrc,
104 RtpPacketReceived::ExtensionManager* extension_manager) {
105 auto packet = std::make_unique<RtpPacketReceived>(extension_manager);
106 packet->SetSsrc(ssrc);
107 packet->SetSequenceNumber(next_sequence_number_++);
108 return packet;
109 }
110
CreatePacketWithSsrc(uint32_t ssrc)111 std::unique_ptr<RtpPacketReceived> CreatePacketWithSsrc(uint32_t ssrc) {
112 return CreatePacket(ssrc, nullptr);
113 }
114
CreatePacketWithSsrcMid(uint32_t ssrc,const std::string & mid)115 std::unique_ptr<RtpPacketReceived> CreatePacketWithSsrcMid(
116 uint32_t ssrc,
117 const std::string& mid) {
118 RtpPacketReceived::ExtensionManager extension_manager;
119 extension_manager.Register<RtpMid>(11);
120
121 auto packet = CreatePacket(ssrc, &extension_manager);
122 packet->SetExtension<RtpMid>(mid);
123 return packet;
124 }
125
CreatePacketWithSsrcRsid(uint32_t ssrc,const std::string & rsid)126 std::unique_ptr<RtpPacketReceived> CreatePacketWithSsrcRsid(
127 uint32_t ssrc,
128 const std::string& rsid) {
129 RtpPacketReceived::ExtensionManager extension_manager;
130 extension_manager.Register<RtpStreamId>(6);
131
132 auto packet = CreatePacket(ssrc, &extension_manager);
133 packet->SetExtension<RtpStreamId>(rsid);
134 return packet;
135 }
136
CreatePacketWithSsrcRrid(uint32_t ssrc,const std::string & rrid)137 std::unique_ptr<RtpPacketReceived> CreatePacketWithSsrcRrid(
138 uint32_t ssrc,
139 const std::string& rrid) {
140 RtpPacketReceived::ExtensionManager extension_manager;
141 extension_manager.Register<RepairedRtpStreamId>(7);
142
143 auto packet = CreatePacket(ssrc, &extension_manager);
144 packet->SetExtension<RepairedRtpStreamId>(rrid);
145 return packet;
146 }
147
CreatePacketWithSsrcMidRsid(uint32_t ssrc,const std::string & mid,const std::string & rsid)148 std::unique_ptr<RtpPacketReceived> CreatePacketWithSsrcMidRsid(
149 uint32_t ssrc,
150 const std::string& mid,
151 const std::string& rsid) {
152 RtpPacketReceived::ExtensionManager extension_manager;
153 extension_manager.Register<RtpMid>(11);
154 extension_manager.Register<RtpStreamId>(6);
155
156 auto packet = CreatePacket(ssrc, &extension_manager);
157 packet->SetExtension<RtpMid>(mid);
158 packet->SetExtension<RtpStreamId>(rsid);
159 return packet;
160 }
161
CreatePacketWithSsrcRsidRrid(uint32_t ssrc,const std::string & rsid,const std::string & rrid)162 std::unique_ptr<RtpPacketReceived> CreatePacketWithSsrcRsidRrid(
163 uint32_t ssrc,
164 const std::string& rsid,
165 const std::string& rrid) {
166 RtpPacketReceived::ExtensionManager extension_manager;
167 extension_manager.Register<RtpStreamId>(6);
168 extension_manager.Register<RepairedRtpStreamId>(7);
169
170 auto packet = CreatePacket(ssrc, &extension_manager);
171 packet->SetExtension<RtpStreamId>(rsid);
172 packet->SetExtension<RepairedRtpStreamId>(rrid);
173 return packet;
174 }
175
176 RtpDemuxer demuxer_;
177 std::set<RtpPacketSinkInterface*> sinks_to_tear_down_;
178 uint16_t next_sequence_number_ = 1;
179 };
180
181 class RtpDemuxerDeathTest : public RtpDemuxerTest {};
182
183 MATCHER_P(SamePacketAs, other, "") {
184 return arg.Ssrc() == other.Ssrc() &&
185 arg.SequenceNumber() == other.SequenceNumber();
186 }
187
TEST_F(RtpDemuxerTest,CanAddSinkBySsrc)188 TEST_F(RtpDemuxerTest, CanAddSinkBySsrc) {
189 MockRtpPacketSink sink;
190 constexpr uint32_t ssrc = 1;
191
192 EXPECT_TRUE(AddSinkOnlySsrc(ssrc, &sink));
193 }
194
TEST_F(RtpDemuxerTest,AllowAddSinkWithOverlappingPayloadTypesIfDifferentMid)195 TEST_F(RtpDemuxerTest, AllowAddSinkWithOverlappingPayloadTypesIfDifferentMid) {
196 const std::string mid1 = "v";
197 const std::string mid2 = "a";
198 constexpr uint8_t pt1 = 30;
199 constexpr uint8_t pt2 = 31;
200 constexpr uint8_t pt3 = 32;
201
202 RtpDemuxerCriteria pt1_pt2;
203 pt1_pt2.mid = mid1;
204 pt1_pt2.payload_types = {pt1, pt2};
205 MockRtpPacketSink sink1;
206 AddSink(pt1_pt2, &sink1);
207
208 RtpDemuxerCriteria pt1_pt3;
209 pt1_pt2.mid = mid2;
210 pt1_pt3.payload_types = {pt1, pt3};
211 MockRtpPacketSink sink2;
212 EXPECT_TRUE(AddSink(pt1_pt3, &sink2));
213 }
214
TEST_F(RtpDemuxerTest,RejectAddSinkForSameMidOnly)215 TEST_F(RtpDemuxerTest, RejectAddSinkForSameMidOnly) {
216 const std::string mid = "mid";
217
218 MockRtpPacketSink sink;
219 AddSinkOnlyMid(mid, &sink);
220 EXPECT_FALSE(AddSinkOnlyMid(mid, &sink));
221 }
222
TEST_F(RtpDemuxerTest,RejectAddSinkForSameMidRsid)223 TEST_F(RtpDemuxerTest, RejectAddSinkForSameMidRsid) {
224 const std::string mid = "v";
225 const std::string rsid = "1";
226
227 MockRtpPacketSink sink1;
228 AddSinkBothMidRsid(mid, rsid, &sink1);
229
230 MockRtpPacketSink sink2;
231 EXPECT_FALSE(AddSinkBothMidRsid(mid, rsid, &sink2));
232 }
233
TEST_F(RtpDemuxerTest,RejectAddSinkForConflictingMidAndMidRsid)234 TEST_F(RtpDemuxerTest, RejectAddSinkForConflictingMidAndMidRsid) {
235 const std::string mid = "v";
236 const std::string rsid = "1";
237
238 MockRtpPacketSink mid_sink;
239 AddSinkOnlyMid(mid, &mid_sink);
240
241 // This sink would never get any packets routed to it because the above sink
242 // would receive them all.
243 MockRtpPacketSink mid_rsid_sink;
244 EXPECT_FALSE(AddSinkBothMidRsid(mid, rsid, &mid_rsid_sink));
245 }
246
TEST_F(RtpDemuxerTest,RejectAddSinkForConflictingMidRsidAndMid)247 TEST_F(RtpDemuxerTest, RejectAddSinkForConflictingMidRsidAndMid) {
248 const std::string mid = "v";
249 const std::string rsid = "";
250
251 MockRtpPacketSink mid_rsid_sink;
252 AddSinkBothMidRsid(mid, rsid, &mid_rsid_sink);
253
254 // This sink would shadow the above sink.
255 MockRtpPacketSink mid_sink;
256 EXPECT_FALSE(AddSinkOnlyMid(mid, &mid_sink));
257 }
258
TEST_F(RtpDemuxerTest,AddSinkFailsIfCalledForTwoSinksWithSameSsrc)259 TEST_F(RtpDemuxerTest, AddSinkFailsIfCalledForTwoSinksWithSameSsrc) {
260 MockRtpPacketSink sink_a;
261 MockRtpPacketSink sink_b;
262 constexpr uint32_t ssrc = 1;
263 ASSERT_TRUE(AddSinkOnlySsrc(ssrc, &sink_a));
264
265 EXPECT_FALSE(AddSinkOnlySsrc(ssrc, &sink_b));
266 }
267
TEST_F(RtpDemuxerTest,AddSinkFailsIfCalledTwiceEvenIfSameSinkWithSameSsrc)268 TEST_F(RtpDemuxerTest, AddSinkFailsIfCalledTwiceEvenIfSameSinkWithSameSsrc) {
269 MockRtpPacketSink sink;
270 constexpr uint32_t ssrc = 1;
271 ASSERT_TRUE(AddSinkOnlySsrc(ssrc, &sink));
272
273 EXPECT_FALSE(AddSinkOnlySsrc(ssrc, &sink));
274 }
275
276 // TODO(steveanton): Currently fails because payload type validation is not
277 // complete in AddSink (see note in rtp_demuxer.cc).
TEST_F(RtpDemuxerTest,DISABLED_RejectAddSinkForSamePayloadTypes)278 TEST_F(RtpDemuxerTest, DISABLED_RejectAddSinkForSamePayloadTypes) {
279 constexpr uint8_t pt1 = 30;
280 constexpr uint8_t pt2 = 31;
281
282 RtpDemuxerCriteria pt1_pt2;
283 pt1_pt2.payload_types = {pt1, pt2};
284 MockRtpPacketSink sink1;
285 AddSink(pt1_pt2, &sink1);
286
287 RtpDemuxerCriteria pt2_pt1;
288 pt2_pt1.payload_types = {pt2, pt1};
289 MockRtpPacketSink sink2;
290 EXPECT_FALSE(AddSink(pt2_pt1, &sink2));
291 }
292
293 // Routing Tests
294
TEST_F(RtpDemuxerTest,OnRtpPacketCalledOnCorrectSinkBySsrc)295 TEST_F(RtpDemuxerTest, OnRtpPacketCalledOnCorrectSinkBySsrc) {
296 constexpr uint32_t ssrcs[] = {101, 202, 303};
297 MockRtpPacketSink sinks[arraysize(ssrcs)];
298 for (size_t i = 0; i < arraysize(ssrcs); i++) {
299 AddSinkOnlySsrc(ssrcs[i], &sinks[i]);
300 }
301
302 for (size_t i = 0; i < arraysize(ssrcs); i++) {
303 auto packet = CreatePacketWithSsrc(ssrcs[i]);
304 EXPECT_CALL(sinks[i], OnRtpPacket(SamePacketAs(*packet))).Times(1);
305 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
306 }
307 }
308
TEST_F(RtpDemuxerTest,OnRtpPacketCalledOnCorrectSinkByRsid)309 TEST_F(RtpDemuxerTest, OnRtpPacketCalledOnCorrectSinkByRsid) {
310 const std::string rsids[] = {"a", "b", "c"};
311 MockRtpPacketSink sinks[arraysize(rsids)];
312 for (size_t i = 0; i < arraysize(rsids); i++) {
313 AddSinkOnlyRsid(rsids[i], &sinks[i]);
314 }
315
316 for (size_t i = 0; i < arraysize(rsids); i++) {
317 auto packet =
318 CreatePacketWithSsrcRsid(rtc::checked_cast<uint32_t>(i), rsids[i]);
319 EXPECT_CALL(sinks[i], OnRtpPacket(SamePacketAs(*packet))).Times(1);
320 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
321 }
322 }
323
TEST_F(RtpDemuxerTest,OnRtpPacketCalledOnCorrectSinkByMid)324 TEST_F(RtpDemuxerTest, OnRtpPacketCalledOnCorrectSinkByMid) {
325 const std::string mids[] = {"a", "v", "s"};
326 MockRtpPacketSink sinks[arraysize(mids)];
327 for (size_t i = 0; i < arraysize(mids); i++) {
328 AddSinkOnlyMid(mids[i], &sinks[i]);
329 }
330
331 for (size_t i = 0; i < arraysize(mids); i++) {
332 auto packet =
333 CreatePacketWithSsrcMid(rtc::checked_cast<uint32_t>(i), mids[i]);
334 EXPECT_CALL(sinks[i], OnRtpPacket(SamePacketAs(*packet))).Times(1);
335 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
336 }
337 }
338
TEST_F(RtpDemuxerTest,OnRtpPacketCalledOnCorrectSinkByMidAndRsid)339 TEST_F(RtpDemuxerTest, OnRtpPacketCalledOnCorrectSinkByMidAndRsid) {
340 const std::string mid = "v";
341 const std::string rsid = "1";
342 constexpr uint32_t ssrc = 10;
343
344 MockRtpPacketSink sink;
345 AddSinkBothMidRsid(mid, rsid, &sink);
346
347 auto packet = CreatePacketWithSsrcMidRsid(ssrc, mid, rsid);
348 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
349 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
350 }
351
TEST_F(RtpDemuxerTest,OnRtpPacketCalledOnCorrectSinkByRepairedRsid)352 TEST_F(RtpDemuxerTest, OnRtpPacketCalledOnCorrectSinkByRepairedRsid) {
353 const std::string rrid = "1";
354 constexpr uint32_t ssrc = 10;
355
356 MockRtpPacketSink sink;
357 AddSinkOnlyRsid(rrid, &sink);
358
359 auto packet_with_rrid = CreatePacketWithSsrcRrid(ssrc, rrid);
360 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_with_rrid))).Times(1);
361 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_with_rrid));
362 }
363
TEST_F(RtpDemuxerTest,OnRtpPacketCalledOnCorrectSinkByPayloadType)364 TEST_F(RtpDemuxerTest, OnRtpPacketCalledOnCorrectSinkByPayloadType) {
365 constexpr uint32_t ssrc = 10;
366 constexpr uint8_t payload_type = 30;
367
368 MockRtpPacketSink sink;
369 RtpDemuxerCriteria criteria;
370 criteria.payload_types = {payload_type};
371 AddSink(criteria, &sink);
372
373 auto packet = CreatePacketWithSsrc(ssrc);
374 packet->SetPayloadType(payload_type);
375 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
376 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
377 }
378
TEST_F(RtpDemuxerTest,PacketsDeliveredInRightOrder)379 TEST_F(RtpDemuxerTest, PacketsDeliveredInRightOrder) {
380 constexpr uint32_t ssrc = 101;
381 MockRtpPacketSink sink;
382 AddSinkOnlySsrc(ssrc, &sink);
383
384 std::unique_ptr<RtpPacketReceived> packets[5];
385 for (size_t i = 0; i < arraysize(packets); i++) {
386 packets[i] = CreatePacketWithSsrc(ssrc);
387 packets[i]->SetSequenceNumber(rtc::checked_cast<uint16_t>(i));
388 }
389
390 InSequence sequence;
391 for (const auto& packet : packets) {
392 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
393 }
394
395 for (const auto& packet : packets) {
396 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
397 }
398 }
399
TEST_F(RtpDemuxerTest,SinkMappedToMultipleSsrcs)400 TEST_F(RtpDemuxerTest, SinkMappedToMultipleSsrcs) {
401 constexpr uint32_t ssrcs[] = {404, 505, 606};
402 MockRtpPacketSink sink;
403 for (uint32_t ssrc : ssrcs) {
404 AddSinkOnlySsrc(ssrc, &sink);
405 }
406
407 // The sink which is associated with multiple SSRCs gets the callback
408 // triggered for each of those SSRCs.
409 for (uint32_t ssrc : ssrcs) {
410 auto packet = CreatePacketWithSsrc(ssrc);
411 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
412 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
413 }
414 }
415
TEST_F(RtpDemuxerTest,NoCallbackOnSsrcSinkRemovedBeforeFirstPacket)416 TEST_F(RtpDemuxerTest, NoCallbackOnSsrcSinkRemovedBeforeFirstPacket) {
417 constexpr uint32_t ssrc = 404;
418 MockRtpPacketSink sink;
419 AddSinkOnlySsrc(ssrc, &sink);
420
421 ASSERT_TRUE(RemoveSink(&sink));
422
423 // The removed sink does not get callbacks.
424 auto packet = CreatePacketWithSsrc(ssrc);
425 EXPECT_CALL(sink, OnRtpPacket(_)).Times(0); // Not called.
426 EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
427 }
428
TEST_F(RtpDemuxerTest,NoCallbackOnSsrcSinkRemovedAfterFirstPacket)429 TEST_F(RtpDemuxerTest, NoCallbackOnSsrcSinkRemovedAfterFirstPacket) {
430 constexpr uint32_t ssrc = 404;
431 NiceMock<MockRtpPacketSink> sink;
432 AddSinkOnlySsrc(ssrc, &sink);
433
434 InSequence sequence;
435 for (size_t i = 0; i < 10; i++) {
436 ASSERT_TRUE(demuxer_.OnRtpPacket(*CreatePacketWithSsrc(ssrc)));
437 }
438
439 ASSERT_TRUE(RemoveSink(&sink));
440
441 // The removed sink does not get callbacks.
442 auto packet = CreatePacketWithSsrc(ssrc);
443 EXPECT_CALL(sink, OnRtpPacket(_)).Times(0); // Not called.
444 EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
445 }
446
447 // An SSRC may only be mapped to a single sink. However, since configuration
448 // of this associations might come from the network, we need to fail gracefully.
TEST_F(RtpDemuxerTest,OnlyOneSinkPerSsrcGetsOnRtpPacketTriggered)449 TEST_F(RtpDemuxerTest, OnlyOneSinkPerSsrcGetsOnRtpPacketTriggered) {
450 MockRtpPacketSink sinks[3];
451 constexpr uint32_t ssrc = 404;
452 ASSERT_TRUE(AddSinkOnlySsrc(ssrc, &sinks[0]));
453 ASSERT_FALSE(AddSinkOnlySsrc(ssrc, &sinks[1]));
454 ASSERT_FALSE(AddSinkOnlySsrc(ssrc, &sinks[2]));
455
456 // The first sink associated with the SSRC remains active; other sinks
457 // were not really added, and so do not get OnRtpPacket() called.
458 auto packet = CreatePacketWithSsrc(ssrc);
459 EXPECT_CALL(sinks[0], OnRtpPacket(SamePacketAs(*packet))).Times(1);
460 EXPECT_CALL(sinks[1], OnRtpPacket(_)).Times(0);
461 EXPECT_CALL(sinks[2], OnRtpPacket(_)).Times(0);
462 ASSERT_TRUE(demuxer_.OnRtpPacket(*packet));
463 }
464
TEST_F(RtpDemuxerTest,NoRepeatedCallbackOnRepeatedAddSinkForSameSink)465 TEST_F(RtpDemuxerTest, NoRepeatedCallbackOnRepeatedAddSinkForSameSink) {
466 constexpr uint32_t ssrc = 111;
467 MockRtpPacketSink sink;
468
469 ASSERT_TRUE(AddSinkOnlySsrc(ssrc, &sink));
470 ASSERT_FALSE(AddSinkOnlySsrc(ssrc, &sink));
471
472 auto packet = CreatePacketWithSsrc(ssrc);
473 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
474 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
475 }
476
TEST_F(RtpDemuxerTest,RemoveSinkReturnsFalseForNeverAddedSink)477 TEST_F(RtpDemuxerTest, RemoveSinkReturnsFalseForNeverAddedSink) {
478 MockRtpPacketSink sink;
479 EXPECT_FALSE(RemoveSink(&sink));
480 }
481
TEST_F(RtpDemuxerTest,RemoveSinkReturnsTrueForPreviouslyAddedSsrcSink)482 TEST_F(RtpDemuxerTest, RemoveSinkReturnsTrueForPreviouslyAddedSsrcSink) {
483 constexpr uint32_t ssrc = 101;
484 MockRtpPacketSink sink;
485 AddSinkOnlySsrc(ssrc, &sink);
486
487 EXPECT_TRUE(RemoveSink(&sink));
488 }
489
TEST_F(RtpDemuxerTest,RemoveSinkReturnsTrueForUnresolvedPreviouslyAddedRsidSink)490 TEST_F(RtpDemuxerTest,
491 RemoveSinkReturnsTrueForUnresolvedPreviouslyAddedRsidSink) {
492 const std::string rsid = "a";
493 MockRtpPacketSink sink;
494 AddSinkOnlyRsid(rsid, &sink);
495
496 EXPECT_TRUE(RemoveSink(&sink));
497 }
498
TEST_F(RtpDemuxerTest,RemoveSinkReturnsTrueForResolvedPreviouslyAddedRsidSink)499 TEST_F(RtpDemuxerTest,
500 RemoveSinkReturnsTrueForResolvedPreviouslyAddedRsidSink) {
501 const std::string rsid = "a";
502 constexpr uint32_t ssrc = 101;
503 NiceMock<MockRtpPacketSink> sink;
504 AddSinkOnlyRsid(rsid, &sink);
505 ASSERT_TRUE(demuxer_.OnRtpPacket(*CreatePacketWithSsrcRsid(ssrc, rsid)));
506
507 EXPECT_TRUE(RemoveSink(&sink));
508 }
509
TEST_F(RtpDemuxerTest,RsidLearnedAndLaterPacketsDeliveredWithOnlySsrc)510 TEST_F(RtpDemuxerTest, RsidLearnedAndLaterPacketsDeliveredWithOnlySsrc) {
511 MockRtpPacketSink sink;
512 const std::string rsid = "a";
513 AddSinkOnlyRsid(rsid, &sink);
514
515 // Create a sequence of RTP packets, where only the first one actually
516 // mentions the RSID.
517 std::unique_ptr<RtpPacketReceived> packets[5];
518 constexpr uint32_t rsid_ssrc = 111;
519 packets[0] = CreatePacketWithSsrcRsid(rsid_ssrc, rsid);
520 for (size_t i = 1; i < arraysize(packets); i++) {
521 packets[i] = CreatePacketWithSsrc(rsid_ssrc);
522 }
523
524 // The first packet associates the RSID with the SSRC, thereby allowing the
525 // demuxer to correctly demux all of the packets.
526 InSequence sequence;
527 for (const auto& packet : packets) {
528 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
529 }
530 for (const auto& packet : packets) {
531 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
532 }
533 }
534
TEST_F(RtpDemuxerTest,NoCallbackOnRsidSinkRemovedBeforeFirstPacket)535 TEST_F(RtpDemuxerTest, NoCallbackOnRsidSinkRemovedBeforeFirstPacket) {
536 MockRtpPacketSink sink;
537 const std::string rsid = "a";
538 AddSinkOnlyRsid(rsid, &sink);
539
540 // Sink removed - it won't get triggers even if packets with its RSID arrive.
541 ASSERT_TRUE(RemoveSink(&sink));
542
543 constexpr uint32_t ssrc = 111;
544 auto packet = CreatePacketWithSsrcRsid(ssrc, rsid);
545 EXPECT_CALL(sink, OnRtpPacket(_)).Times(0); // Not called.
546 EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
547 }
548
TEST_F(RtpDemuxerTest,NoCallbackOnRsidSinkRemovedAfterFirstPacket)549 TEST_F(RtpDemuxerTest, NoCallbackOnRsidSinkRemovedAfterFirstPacket) {
550 NiceMock<MockRtpPacketSink> sink;
551 const std::string rsid = "a";
552 AddSinkOnlyRsid(rsid, &sink);
553
554 InSequence sequence;
555 constexpr uint32_t ssrc = 111;
556 for (size_t i = 0; i < 10; i++) {
557 auto packet = CreatePacketWithSsrcRsid(ssrc, rsid);
558 ASSERT_TRUE(demuxer_.OnRtpPacket(*packet));
559 }
560
561 // Sink removed - it won't get triggers even if packets with its RSID arrive.
562 ASSERT_TRUE(RemoveSink(&sink));
563
564 auto packet = CreatePacketWithSsrcRsid(ssrc, rsid);
565 EXPECT_CALL(sink, OnRtpPacket(_)).Times(0); // Not called.
566 EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
567 }
568
TEST_F(RtpDemuxerTest,NoCallbackOnMidSinkRemovedBeforeFirstPacket)569 TEST_F(RtpDemuxerTest, NoCallbackOnMidSinkRemovedBeforeFirstPacket) {
570 const std::string mid = "v";
571 constexpr uint32_t ssrc = 10;
572
573 MockRtpPacketSink sink;
574 AddSinkOnlyMid(mid, &sink);
575 RemoveSink(&sink);
576
577 auto packet = CreatePacketWithSsrcMid(ssrc, mid);
578 EXPECT_CALL(sink, OnRtpPacket(_)).Times(0);
579 EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
580 }
581
TEST_F(RtpDemuxerTest,NoCallbackOnMidSinkRemovedAfterFirstPacket)582 TEST_F(RtpDemuxerTest, NoCallbackOnMidSinkRemovedAfterFirstPacket) {
583 const std::string mid = "v";
584 constexpr uint32_t ssrc = 10;
585
586 NiceMock<MockRtpPacketSink> sink;
587 AddSinkOnlyMid(mid, &sink);
588
589 auto p1 = CreatePacketWithSsrcMid(ssrc, mid);
590 demuxer_.OnRtpPacket(*p1);
591
592 RemoveSink(&sink);
593
594 auto p2 = CreatePacketWithSsrcMid(ssrc, mid);
595 EXPECT_CALL(sink, OnRtpPacket(_)).Times(0);
596 EXPECT_FALSE(demuxer_.OnRtpPacket(*p2));
597 }
598
TEST_F(RtpDemuxerTest,NoCallbackOnMidRsidSinkRemovedAfterFirstPacket)599 TEST_F(RtpDemuxerTest, NoCallbackOnMidRsidSinkRemovedAfterFirstPacket) {
600 const std::string mid = "v";
601 const std::string rsid = "1";
602 constexpr uint32_t ssrc = 10;
603
604 NiceMock<MockRtpPacketSink> sink;
605 AddSinkBothMidRsid(mid, rsid, &sink);
606
607 auto p1 = CreatePacketWithSsrcMidRsid(ssrc, mid, rsid);
608 demuxer_.OnRtpPacket(*p1);
609
610 RemoveSink(&sink);
611
612 auto p2 = CreatePacketWithSsrcMidRsid(ssrc, mid, rsid);
613 EXPECT_CALL(sink, OnRtpPacket(_)).Times(0);
614 EXPECT_FALSE(demuxer_.OnRtpPacket(*p2));
615 }
616
617 // The RSID to SSRC mapping should be one-to-one. If we end up receiving
618 // two (or more) packets with the same SSRC, but different RSIDs, we guarantee
619 // delivery to one of them but not both.
TEST_F(RtpDemuxerTest,FirstSsrcAssociatedWithAnRsidIsNotForgotten)620 TEST_F(RtpDemuxerTest, FirstSsrcAssociatedWithAnRsidIsNotForgotten) {
621 // Each sink has a distinct RSID.
622 MockRtpPacketSink sink_a;
623 const std::string rsid_a = "a";
624 AddSinkOnlyRsid(rsid_a, &sink_a);
625
626 MockRtpPacketSink sink_b;
627 const std::string rsid_b = "b";
628 AddSinkOnlyRsid(rsid_b, &sink_b);
629
630 InSequence sequence; // Verify that the order of delivery is unchanged.
631
632 constexpr uint32_t shared_ssrc = 100;
633
634 // First a packet with |rsid_a| is received, and |sink_a| is associated with
635 // its SSRC.
636 auto packet_a = CreatePacketWithSsrcRsid(shared_ssrc, rsid_a);
637 EXPECT_CALL(sink_a, OnRtpPacket(SamePacketAs(*packet_a))).Times(1);
638 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_a));
639
640 // Second, a packet with |rsid_b| is received. We guarantee that |sink_b|
641 // receives it.
642 auto packet_b = CreatePacketWithSsrcRsid(shared_ssrc, rsid_b);
643 EXPECT_CALL(sink_a, OnRtpPacket(_)).Times(0);
644 EXPECT_CALL(sink_b, OnRtpPacket(SamePacketAs(*packet_b))).Times(1);
645 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_b));
646
647 // Known edge-case; adding a new RSID association makes us re-examine all
648 // SSRCs. |sink_b| may or may not be associated with the SSRC now; we make
649 // no promises on that. However, since the RSID is specified and it cannot be
650 // found the packet should be dropped.
651 MockRtpPacketSink sink_c;
652 const std::string rsid_c = "c";
653 constexpr uint32_t some_other_ssrc = shared_ssrc + 1;
654 AddSinkOnlySsrc(some_other_ssrc, &sink_c);
655
656 auto packet_c = CreatePacketWithSsrcMid(shared_ssrc, rsid_c);
657 EXPECT_CALL(sink_a, OnRtpPacket(_)).Times(0);
658 EXPECT_CALL(sink_b, OnRtpPacket(_)).Times(0);
659 EXPECT_CALL(sink_c, OnRtpPacket(_)).Times(0);
660 EXPECT_FALSE(demuxer_.OnRtpPacket(*packet_c));
661 }
662
TEST_F(RtpDemuxerTest,MultipleRsidsOnSameSink)663 TEST_F(RtpDemuxerTest, MultipleRsidsOnSameSink) {
664 MockRtpPacketSink sink;
665 const std::string rsids[] = {"a", "b", "c"};
666
667 for (const std::string& rsid : rsids) {
668 AddSinkOnlyRsid(rsid, &sink);
669 }
670
671 InSequence sequence;
672 for (size_t i = 0; i < arraysize(rsids); i++) {
673 // Assign different SSRCs and sequence numbers to all packets.
674 const uint32_t ssrc = 1000 + static_cast<uint32_t>(i);
675 const uint16_t sequence_number = 50 + static_cast<uint16_t>(i);
676 auto packet = CreatePacketWithSsrcRsid(ssrc, rsids[i]);
677 packet->SetSequenceNumber(sequence_number);
678 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
679 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
680 }
681 }
682
683 // RSIDs are given higher priority than SSRC because we believe senders are less
684 // likely to mislabel packets with RSID than mislabel them with SSRCs.
TEST_F(RtpDemuxerTest,SinkWithBothRsidAndSsrcAssociations)685 TEST_F(RtpDemuxerTest, SinkWithBothRsidAndSsrcAssociations) {
686 MockRtpPacketSink sink;
687 constexpr uint32_t standalone_ssrc = 10101;
688 constexpr uint32_t rsid_ssrc = 20202;
689 const std::string rsid = "1";
690
691 AddSinkOnlySsrc(standalone_ssrc, &sink);
692 AddSinkOnlyRsid(rsid, &sink);
693
694 InSequence sequence;
695
696 auto ssrc_packet = CreatePacketWithSsrc(standalone_ssrc);
697 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*ssrc_packet))).Times(1);
698 EXPECT_TRUE(demuxer_.OnRtpPacket(*ssrc_packet));
699
700 auto rsid_packet = CreatePacketWithSsrcRsid(rsid_ssrc, rsid);
701 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*rsid_packet))).Times(1);
702 EXPECT_TRUE(demuxer_.OnRtpPacket(*rsid_packet));
703 }
704
705 // Packets are always guaranteed to be routed to only one sink.
TEST_F(RtpDemuxerTest,AssociatingByRsidAndBySsrcCannotTriggerDoubleCall)706 TEST_F(RtpDemuxerTest, AssociatingByRsidAndBySsrcCannotTriggerDoubleCall) {
707 constexpr uint32_t ssrc = 10101;
708 const std::string rsid = "a";
709
710 MockRtpPacketSink sink;
711 AddSinkOnlySsrc(ssrc, &sink);
712 AddSinkOnlyRsid(rsid, &sink);
713
714 auto packet = CreatePacketWithSsrcRsid(ssrc, rsid);
715 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
716 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
717 }
718
719
720 // If one sink is associated with SSRC x, and another sink with RSID y, then if
721 // we receive a packet with both SSRC x and RSID y, route that to only the sink
722 // for RSID y since we believe RSID tags to be more trustworthy than signaled
723 // SSRCs.
TEST_F(RtpDemuxerTest,PacketFittingBothRsidSinkAndSsrcSinkGivenOnlyToRsidSink)724 TEST_F(RtpDemuxerTest,
725 PacketFittingBothRsidSinkAndSsrcSinkGivenOnlyToRsidSink) {
726 constexpr uint32_t ssrc = 111;
727 MockRtpPacketSink ssrc_sink;
728 AddSinkOnlySsrc(ssrc, &ssrc_sink);
729
730 const std::string rsid = "a";
731 MockRtpPacketSink rsid_sink;
732 AddSinkOnlyRsid(rsid, &rsid_sink);
733
734 auto packet = CreatePacketWithSsrcRsid(ssrc, rsid);
735
736 EXPECT_CALL(ssrc_sink, OnRtpPacket(_)).Times(0);
737 EXPECT_CALL(rsid_sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
738 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
739 }
740
741 // We're not expecting RSIDs to be resolved to SSRCs which were previously
742 // mapped to sinks, and make no guarantees except for graceful handling.
TEST_F(RtpDemuxerTest,GracefullyHandleRsidBeingMappedToPrevouslyAssociatedSsrc)743 TEST_F(RtpDemuxerTest,
744 GracefullyHandleRsidBeingMappedToPrevouslyAssociatedSsrc) {
745 constexpr uint32_t ssrc = 111;
746 NiceMock<MockRtpPacketSink> ssrc_sink;
747 AddSinkOnlySsrc(ssrc, &ssrc_sink);
748
749 const std::string rsid = "a";
750 NiceMock<MockRtpPacketSink> rsid_sink;
751 AddSinkOnlyRsid(rsid, &rsid_sink);
752
753 // The SSRC was mapped to an SSRC sink, but was even active (packets flowed
754 // over it).
755 auto packet = CreatePacketWithSsrcRsid(ssrc, rsid);
756 demuxer_.OnRtpPacket(*packet);
757
758 // If the SSRC sink is ever removed, the RSID sink *might* receive indications
759 // of packets, and observers *might* be informed. Only graceful handling
760 // is guaranteed.
761 RemoveSink(&ssrc_sink);
762 EXPECT_CALL(rsid_sink, OnRtpPacket(SamePacketAs(*packet))).Times(AtLeast(0));
763 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
764 }
765
766 // Tests that when one MID sink is configured, packets that include the MID
767 // extension will get routed to that sink and any packets that use the same
768 // SSRC as one of those packets later will also get routed to the sink, even
769 // if a new SSRC is introduced for the same MID.
TEST_F(RtpDemuxerTest,RoutedByMidWhenSsrcAdded)770 TEST_F(RtpDemuxerTest, RoutedByMidWhenSsrcAdded) {
771 const std::string mid = "v";
772 NiceMock<MockRtpPacketSink> sink;
773 AddSinkOnlyMid(mid, &sink);
774
775 constexpr uint32_t ssrc1 = 10;
776 constexpr uint32_t ssrc2 = 11;
777
778 auto packet_ssrc1_mid = CreatePacketWithSsrcMid(ssrc1, mid);
779 demuxer_.OnRtpPacket(*packet_ssrc1_mid);
780 auto packet_ssrc2_mid = CreatePacketWithSsrcMid(ssrc2, mid);
781 demuxer_.OnRtpPacket(*packet_ssrc2_mid);
782
783 auto packet_ssrc1_only = CreatePacketWithSsrc(ssrc1);
784 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_ssrc1_only))).Times(1);
785 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_ssrc1_only));
786
787 auto packet_ssrc2_only = CreatePacketWithSsrc(ssrc2);
788 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_ssrc2_only))).Times(1);
789 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_ssrc2_only));
790 }
791
TEST_F(RtpDemuxerTest,DontLearnMidSsrcBindingBeforeSinkAdded)792 TEST_F(RtpDemuxerTest, DontLearnMidSsrcBindingBeforeSinkAdded) {
793 const std::string mid = "v";
794 constexpr uint32_t ssrc = 10;
795
796 auto packet_ssrc_mid = CreatePacketWithSsrcMid(ssrc, mid);
797 ASSERT_FALSE(demuxer_.OnRtpPacket(*packet_ssrc_mid));
798
799 MockRtpPacketSink sink;
800 AddSinkOnlyMid(mid, &sink);
801
802 auto packet_ssrc_only = CreatePacketWithSsrc(ssrc);
803 EXPECT_CALL(sink, OnRtpPacket(_)).Times(0);
804 EXPECT_FALSE(demuxer_.OnRtpPacket(*packet_ssrc_only));
805 }
806
TEST_F(RtpDemuxerTest,DontForgetMidSsrcBindingWhenSinkRemoved)807 TEST_F(RtpDemuxerTest, DontForgetMidSsrcBindingWhenSinkRemoved) {
808 const std::string mid = "v";
809 constexpr uint32_t ssrc = 10;
810
811 NiceMock<MockRtpPacketSink> sink1;
812 AddSinkOnlyMid(mid, &sink1);
813
814 auto packet_with_mid = CreatePacketWithSsrcMid(ssrc, mid);
815 demuxer_.OnRtpPacket(*packet_with_mid);
816
817 RemoveSink(&sink1);
818
819 MockRtpPacketSink sink2;
820 AddSinkOnlyMid(mid, &sink2);
821
822 auto packet_with_ssrc = CreatePacketWithSsrc(ssrc);
823 EXPECT_CALL(sink2, OnRtpPacket(SamePacketAs(*packet_with_ssrc)));
824 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_with_ssrc));
825 }
826
827 // If a sink is added with only a MID, then any packet with that MID no matter
828 // the RSID should be routed to that sink.
TEST_F(RtpDemuxerTest,RoutedByMidWithAnyRsid)829 TEST_F(RtpDemuxerTest, RoutedByMidWithAnyRsid) {
830 const std::string mid = "v";
831 const std::string rsid1 = "1";
832 const std::string rsid2 = "2";
833 constexpr uint32_t ssrc1 = 10;
834 constexpr uint32_t ssrc2 = 11;
835
836 MockRtpPacketSink sink;
837 AddSinkOnlyMid(mid, &sink);
838
839 InSequence sequence;
840
841 auto packet_ssrc1_rsid1 = CreatePacketWithSsrcMidRsid(ssrc1, mid, rsid1);
842 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_ssrc1_rsid1))).Times(1);
843 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_ssrc1_rsid1));
844
845 auto packet_ssrc2_rsid2 = CreatePacketWithSsrcMidRsid(ssrc2, mid, rsid2);
846 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_ssrc2_rsid2))).Times(1);
847 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_ssrc2_rsid2));
848 }
849
850 // These two tests verify that for a sink added with a MID, RSID pair, if the
851 // MID and RSID are learned in separate packets (e.g., because the header
852 // extensions are sent separately), then a later packet with just SSRC will get
853 // routed to that sink.
854 // The first test checks that the functionality works when MID is learned first.
855 // The second test checks that the functionality works when RSID is learned
856 // first.
TEST_F(RtpDemuxerTest,LearnMidThenRsidSeparatelyAndRouteBySsrc)857 TEST_F(RtpDemuxerTest, LearnMidThenRsidSeparatelyAndRouteBySsrc) {
858 const std::string mid = "v";
859 const std::string rsid = "1";
860 constexpr uint32_t ssrc = 10;
861
862 NiceMock<MockRtpPacketSink> sink;
863 AddSinkBothMidRsid(mid, rsid, &sink);
864
865 auto packet_with_mid = CreatePacketWithSsrcMid(ssrc, mid);
866 ASSERT_FALSE(demuxer_.OnRtpPacket(*packet_with_mid));
867
868 auto packet_with_rsid = CreatePacketWithSsrcRsid(ssrc, rsid);
869 ASSERT_TRUE(demuxer_.OnRtpPacket(*packet_with_rsid));
870
871 auto packet_with_ssrc = CreatePacketWithSsrc(ssrc);
872 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_with_ssrc))).Times(1);
873 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_with_ssrc));
874 }
875
TEST_F(RtpDemuxerTest,LearnRsidThenMidSeparatelyAndRouteBySsrc)876 TEST_F(RtpDemuxerTest, LearnRsidThenMidSeparatelyAndRouteBySsrc) {
877 const std::string mid = "v";
878 const std::string rsid = "1";
879 constexpr uint32_t ssrc = 10;
880
881 NiceMock<MockRtpPacketSink> sink;
882 AddSinkBothMidRsid(mid, rsid, &sink);
883
884 auto packet_with_rsid = CreatePacketWithSsrcRsid(ssrc, rsid);
885 ASSERT_FALSE(demuxer_.OnRtpPacket(*packet_with_rsid));
886
887 auto packet_with_mid = CreatePacketWithSsrcMid(ssrc, mid);
888 ASSERT_TRUE(demuxer_.OnRtpPacket(*packet_with_mid));
889
890 auto packet_with_ssrc = CreatePacketWithSsrc(ssrc);
891 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_with_ssrc))).Times(1);
892 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_with_ssrc));
893 }
894
TEST_F(RtpDemuxerTest,DontLearnMidRsidBindingBeforeSinkAdded)895 TEST_F(RtpDemuxerTest, DontLearnMidRsidBindingBeforeSinkAdded) {
896 const std::string mid = "v";
897 const std::string rsid = "1";
898 constexpr uint32_t ssrc = 10;
899
900 auto packet_with_both = CreatePacketWithSsrcMidRsid(ssrc, mid, rsid);
901 ASSERT_FALSE(demuxer_.OnRtpPacket(*packet_with_both));
902
903 MockRtpPacketSink sink;
904 AddSinkBothMidRsid(mid, rsid, &sink);
905
906 auto packet_with_ssrc = CreatePacketWithSsrc(ssrc);
907 EXPECT_CALL(sink, OnRtpPacket(_)).Times(0);
908 EXPECT_FALSE(demuxer_.OnRtpPacket(*packet_with_ssrc));
909 }
910
TEST_F(RtpDemuxerTest,DontForgetMidRsidBindingWhenSinkRemoved)911 TEST_F(RtpDemuxerTest, DontForgetMidRsidBindingWhenSinkRemoved) {
912 const std::string mid = "v";
913 const std::string rsid = "1";
914 constexpr uint32_t ssrc = 10;
915
916 NiceMock<MockRtpPacketSink> sink1;
917 AddSinkBothMidRsid(mid, rsid, &sink1);
918
919 auto packet_with_both = CreatePacketWithSsrcMidRsid(ssrc, mid, rsid);
920 demuxer_.OnRtpPacket(*packet_with_both);
921
922 RemoveSink(&sink1);
923
924 MockRtpPacketSink sink2;
925 AddSinkBothMidRsid(mid, rsid, &sink2);
926
927 auto packet_with_ssrc = CreatePacketWithSsrc(ssrc);
928 EXPECT_CALL(sink2, OnRtpPacket(SamePacketAs(*packet_with_ssrc)));
929 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_with_ssrc));
930 }
931
TEST_F(RtpDemuxerTest,LearnMidRsidBindingAfterSinkAdded)932 TEST_F(RtpDemuxerTest, LearnMidRsidBindingAfterSinkAdded) {
933 const std::string mid = "v";
934 const std::string rsid = "1";
935 constexpr uint32_t ssrc = 10;
936
937 NiceMock<MockRtpPacketSink> sink;
938 AddSinkBothMidRsid(mid, rsid, &sink);
939
940 auto packet_with_both = CreatePacketWithSsrcMidRsid(ssrc, mid, rsid);
941 demuxer_.OnRtpPacket(*packet_with_both);
942
943 auto packet_with_ssrc = CreatePacketWithSsrc(ssrc);
944 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_with_ssrc)));
945 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_with_ssrc));
946 }
947
TEST_F(RtpDemuxerTest,DropByPayloadTypeIfNoSink)948 TEST_F(RtpDemuxerTest, DropByPayloadTypeIfNoSink) {
949 constexpr uint8_t payload_type = 30;
950 constexpr uint32_t ssrc = 10;
951
952 auto packet = CreatePacketWithSsrc(ssrc);
953 packet->SetPayloadType(payload_type);
954 EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
955 }
956
957 // For legacy applications, it's possible for us to demux if the payload type is
958 // unique. But if multiple sinks are registered with different MIDs and the same
959 // payload types, then we cannot route a packet with just payload type because
960 // it is ambiguous which sink it should be sent to.
TEST_F(RtpDemuxerTest,DropByPayloadTypeIfAddedInMultipleSinks)961 TEST_F(RtpDemuxerTest, DropByPayloadTypeIfAddedInMultipleSinks) {
962 const std::string mid1 = "v";
963 const std::string mid2 = "a";
964 constexpr uint8_t payload_type = 30;
965 constexpr uint32_t ssrc = 10;
966
967 RtpDemuxerCriteria mid1_pt;
968 mid1_pt.mid = mid1;
969 mid1_pt.payload_types = {payload_type};
970 MockRtpPacketSink sink1;
971 AddSink(mid1_pt, &sink1);
972
973 RtpDemuxerCriteria mid2_pt;
974 mid2_pt.mid = mid2;
975 mid2_pt.payload_types = {payload_type};
976 MockRtpPacketSink sink2;
977 AddSink(mid2_pt, &sink2);
978
979 auto packet = CreatePacketWithSsrc(ssrc);
980 packet->SetPayloadType(payload_type);
981
982 EXPECT_CALL(sink1, OnRtpPacket(_)).Times(0);
983 EXPECT_CALL(sink2, OnRtpPacket(_)).Times(0);
984 EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
985 }
986
987 // If two sinks are added with different MIDs but the same payload types, then
988 // we cannot demux on the payload type only unless one of the sinks is removed.
TEST_F(RtpDemuxerTest,RoutedByPayloadTypeIfAmbiguousSinkRemoved)989 TEST_F(RtpDemuxerTest, RoutedByPayloadTypeIfAmbiguousSinkRemoved) {
990 const std::string mid1 = "v";
991 const std::string mid2 = "a";
992 constexpr uint8_t payload_type = 30;
993 constexpr uint32_t ssrc = 10;
994
995 RtpDemuxerCriteria mid1_pt;
996 mid1_pt.mid = mid1;
997 mid1_pt.payload_types = {payload_type};
998 MockRtpPacketSink sink1;
999 AddSink(mid1_pt, &sink1);
1000
1001 RtpDemuxerCriteria mid2_pt;
1002 mid2_pt.mid = mid2;
1003 mid2_pt.payload_types = {payload_type};
1004 MockRtpPacketSink sink2;
1005 AddSink(mid2_pt, &sink2);
1006
1007 RemoveSink(&sink1);
1008
1009 auto packet = CreatePacketWithSsrc(ssrc);
1010 packet->SetPayloadType(payload_type);
1011
1012 EXPECT_CALL(sink1, OnRtpPacket(_)).Times(0);
1013 EXPECT_CALL(sink2, OnRtpPacket(SamePacketAs(*packet))).Times(1);
1014
1015 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
1016 }
1017
TEST_F(RtpDemuxerTest,RoutedByPayloadTypeLatchesSsrc)1018 TEST_F(RtpDemuxerTest, RoutedByPayloadTypeLatchesSsrc) {
1019 constexpr uint8_t payload_type = 30;
1020 constexpr uint32_t ssrc = 10;
1021
1022 RtpDemuxerCriteria pt;
1023 pt.payload_types = {payload_type};
1024 NiceMock<MockRtpPacketSink> sink;
1025 AddSink(pt, &sink);
1026
1027 auto packet_with_pt = CreatePacketWithSsrc(ssrc);
1028 packet_with_pt->SetPayloadType(payload_type);
1029 ASSERT_TRUE(demuxer_.OnRtpPacket(*packet_with_pt));
1030
1031 auto packet_with_ssrc = CreatePacketWithSsrc(ssrc);
1032 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_with_ssrc))).Times(1);
1033 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_with_ssrc));
1034 }
1035
1036 // RSIDs are scoped within MID, so if two sinks are registered with the same
1037 // RSIDs but different MIDs, then packets containing both extensions should be
1038 // routed to the correct one.
TEST_F(RtpDemuxerTest,PacketWithSameRsidDifferentMidRoutedToProperSink)1039 TEST_F(RtpDemuxerTest, PacketWithSameRsidDifferentMidRoutedToProperSink) {
1040 const std::string mid1 = "mid1";
1041 const std::string mid2 = "mid2";
1042 const std::string rsid = "rsid";
1043 constexpr uint32_t ssrc1 = 10;
1044 constexpr uint32_t ssrc2 = 11;
1045
1046 NiceMock<MockRtpPacketSink> mid1_sink;
1047 AddSinkBothMidRsid(mid1, rsid, &mid1_sink);
1048
1049 MockRtpPacketSink mid2_sink;
1050 AddSinkBothMidRsid(mid2, rsid, &mid2_sink);
1051
1052 auto packet_mid1 = CreatePacketWithSsrcMidRsid(ssrc1, mid1, rsid);
1053 ASSERT_TRUE(demuxer_.OnRtpPacket(*packet_mid1));
1054
1055 auto packet_mid2 = CreatePacketWithSsrcMidRsid(ssrc2, mid2, rsid);
1056 EXPECT_CALL(mid2_sink, OnRtpPacket(SamePacketAs(*packet_mid2))).Times(1);
1057 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_mid2));
1058 }
1059
1060 // If a sink is first bound to a given SSRC by signaling but later a new sink is
1061 // bound to a given MID by a later signaling, then when a packet arrives with
1062 // both the SSRC and MID, then the signaled MID sink should take precedence.
TEST_F(RtpDemuxerTest,SignaledMidShouldOverwriteSignaledSsrc)1063 TEST_F(RtpDemuxerTest, SignaledMidShouldOverwriteSignaledSsrc) {
1064 constexpr uint32_t ssrc = 11;
1065 const std::string mid = "mid";
1066
1067 MockRtpPacketSink ssrc_sink;
1068 AddSinkOnlySsrc(ssrc, &ssrc_sink);
1069
1070 MockRtpPacketSink mid_sink;
1071 AddSinkOnlyMid(mid, &mid_sink);
1072
1073 auto p = CreatePacketWithSsrcMid(ssrc, mid);
1074 EXPECT_CALL(ssrc_sink, OnRtpPacket(_)).Times(0);
1075 EXPECT_CALL(mid_sink, OnRtpPacket(SamePacketAs(*p))).Times(1);
1076 EXPECT_TRUE(demuxer_.OnRtpPacket(*p));
1077 }
1078
1079 // Extends the previous test to also ensure that later packets that do not
1080 // specify MID are still routed to the MID sink rather than the overwritten SSRC
1081 // sink.
TEST_F(RtpDemuxerTest,SignaledMidShouldOverwriteSignalledSsrcPersistent)1082 TEST_F(RtpDemuxerTest, SignaledMidShouldOverwriteSignalledSsrcPersistent) {
1083 constexpr uint32_t ssrc = 11;
1084 const std::string mid = "mid";
1085
1086 MockRtpPacketSink ssrc_sink;
1087 AddSinkOnlySsrc(ssrc, &ssrc_sink);
1088
1089 NiceMock<MockRtpPacketSink> mid_sink;
1090 AddSinkOnlyMid(mid, &mid_sink);
1091
1092 EXPECT_CALL(ssrc_sink, OnRtpPacket(_)).Times(0);
1093
1094 auto packet_with_mid = CreatePacketWithSsrcMid(ssrc, mid);
1095 demuxer_.OnRtpPacket(*packet_with_mid);
1096
1097 auto packet_without_mid = CreatePacketWithSsrc(ssrc);
1098 EXPECT_CALL(mid_sink, OnRtpPacket(SamePacketAs(*packet_without_mid)))
1099 .Times(1);
1100 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_without_mid));
1101 }
1102
TEST_F(RtpDemuxerTest,RouteByPayloadTypeMultipleMatch)1103 TEST_F(RtpDemuxerTest, RouteByPayloadTypeMultipleMatch) {
1104 constexpr uint32_t ssrc = 10;
1105 constexpr uint8_t pt1 = 30;
1106 constexpr uint8_t pt2 = 31;
1107
1108 MockRtpPacketSink sink;
1109 RtpDemuxerCriteria criteria;
1110 criteria.payload_types = {pt1, pt2};
1111 AddSink(criteria, &sink);
1112
1113 auto packet_with_pt1 = CreatePacketWithSsrc(ssrc);
1114 packet_with_pt1->SetPayloadType(pt1);
1115 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_with_pt1)));
1116 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_with_pt1));
1117
1118 auto packet_with_pt2 = CreatePacketWithSsrc(ssrc);
1119 packet_with_pt2->SetPayloadType(pt2);
1120 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_with_pt2)));
1121 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_with_pt2));
1122 }
1123
TEST_F(RtpDemuxerTest,DontDemuxOnMidAloneIfAddedWithRsid)1124 TEST_F(RtpDemuxerTest, DontDemuxOnMidAloneIfAddedWithRsid) {
1125 const std::string mid = "v";
1126 const std::string rsid = "1";
1127 constexpr uint32_t ssrc = 10;
1128
1129 MockRtpPacketSink sink;
1130 AddSinkBothMidRsid(mid, rsid, &sink);
1131
1132 EXPECT_CALL(sink, OnRtpPacket(_)).Times(0);
1133
1134 auto packet = CreatePacketWithSsrcMid(ssrc, mid);
1135 EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
1136 }
1137
TEST_F(RtpDemuxerTest,DemuxBySsrcEvenWithMidAndRsid)1138 TEST_F(RtpDemuxerTest, DemuxBySsrcEvenWithMidAndRsid) {
1139 const std::string mid = "v";
1140 const std::string rsid = "1";
1141 constexpr uint32_t ssrc = 10;
1142
1143 RtpDemuxerCriteria criteria;
1144 criteria.rsid = rsid;
1145 criteria.mid = mid;
1146 criteria.ssrcs = {ssrc};
1147 MockRtpPacketSink sink;
1148 AddSink(criteria, &sink);
1149
1150 auto packet = CreatePacketWithSsrc(ssrc);
1151 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
1152 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
1153 }
1154
1155 // In slight deviation from the BUNDLE spec, if we match a sink according to
1156 // SSRC, then we do not verify payload type against the criteria and defer to
1157 // the sink to check that it is correct.
TEST_F(RtpDemuxerTest,DoNotCheckPayloadTypeIfMatchedByOtherCriteria)1158 TEST_F(RtpDemuxerTest, DoNotCheckPayloadTypeIfMatchedByOtherCriteria) {
1159 constexpr uint32_t ssrc = 10;
1160 constexpr uint8_t payload_type = 30;
1161 constexpr uint8_t different_payload_type = payload_type + 1;
1162
1163 RtpDemuxerCriteria criteria;
1164 criteria.ssrcs = {ssrc};
1165 criteria.payload_types = {payload_type};
1166 MockRtpPacketSink sink;
1167 AddSink(criteria, &sink);
1168
1169 auto packet = CreatePacketWithSsrc(ssrc);
1170 packet->SetPayloadType(different_payload_type);
1171 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
1172 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
1173 }
1174
1175 // If a repair packet includes an RSID it should be ignored and the packet
1176 // should be routed by its RRID.
TEST_F(RtpDemuxerTest,PacketWithRsidAndRridRoutedByRrid)1177 TEST_F(RtpDemuxerTest, PacketWithRsidAndRridRoutedByRrid) {
1178 const std::string rsid = "1";
1179 const std::string rrid = "1r";
1180 constexpr uint32_t ssrc = 10;
1181
1182 MockRtpPacketSink sink_rsid;
1183 AddSinkOnlyRsid(rsid, &sink_rsid);
1184
1185 MockRtpPacketSink sink_rrid;
1186 AddSinkOnlyRsid(rrid, &sink_rrid);
1187
1188 auto packet = CreatePacketWithSsrcRsidRrid(ssrc, rsid, rrid);
1189 EXPECT_CALL(sink_rsid, OnRtpPacket(_)).Times(0);
1190 EXPECT_CALL(sink_rrid, OnRtpPacket(SamePacketAs(*packet))).Times(1);
1191 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
1192 }
1193
1194 // Same test as above but checks that the latched SSRC routes to the RRID sink.
TEST_F(RtpDemuxerTest,PacketWithRsidAndRridLatchesSsrcToRrid)1195 TEST_F(RtpDemuxerTest, PacketWithRsidAndRridLatchesSsrcToRrid) {
1196 const std::string rsid = "1";
1197 const std::string rrid = "1r";
1198 constexpr uint32_t ssrc = 10;
1199
1200 MockRtpPacketSink sink_rsid;
1201 AddSinkOnlyRsid(rsid, &sink_rsid);
1202
1203 NiceMock<MockRtpPacketSink> sink_rrid;
1204 AddSinkOnlyRsid(rrid, &sink_rrid);
1205
1206 auto packet_rsid_rrid = CreatePacketWithSsrcRsidRrid(ssrc, rsid, rrid);
1207 demuxer_.OnRtpPacket(*packet_rsid_rrid);
1208
1209 auto packet_ssrc_only = CreatePacketWithSsrc(ssrc);
1210 EXPECT_CALL(sink_rsid, OnRtpPacket(_)).Times(0);
1211 EXPECT_CALL(sink_rrid, OnRtpPacket(SamePacketAs(*packet_ssrc_only))).Times(1);
1212 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_ssrc_only));
1213 }
1214
1215 // Tests that a packet which includes MID and RSID is dropped and not routed by
1216 // SSRC if the MID and RSID do not match an added sink.
TEST_F(RtpDemuxerTest,PacketWithMidAndUnknownRsidIsNotRoutedBySsrc)1217 TEST_F(RtpDemuxerTest, PacketWithMidAndUnknownRsidIsNotRoutedBySsrc) {
1218 constexpr uint32_t ssrc = 10;
1219 const std::string mid = "v";
1220 const std::string rsid = "1";
1221 const std::string wrong_rsid = "2";
1222
1223 RtpDemuxerCriteria criteria;
1224 criteria.mid = mid;
1225 criteria.rsid = rsid;
1226 criteria.ssrcs = {ssrc};
1227 MockRtpPacketSink sink;
1228 AddSink(criteria, &sink);
1229
1230 auto packet = CreatePacketWithSsrcMidRsid(ssrc, mid, wrong_rsid);
1231 EXPECT_CALL(sink, OnRtpPacket(_)).Times(0);
1232 EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
1233 }
1234
1235 // Tests that a packet which includes MID and RSID is dropped and not routed by
1236 // payload type if the MID and RSID do not match an added sink.
TEST_F(RtpDemuxerTest,PacketWithMidAndUnknownRsidIsNotRoutedByPayloadType)1237 TEST_F(RtpDemuxerTest, PacketWithMidAndUnknownRsidIsNotRoutedByPayloadType) {
1238 constexpr uint32_t ssrc = 10;
1239 const std::string mid = "v";
1240 const std::string rsid = "1";
1241 const std::string wrong_rsid = "2";
1242 constexpr uint8_t payload_type = 30;
1243
1244 RtpDemuxerCriteria criteria;
1245 criteria.mid = mid;
1246 criteria.rsid = rsid;
1247 criteria.payload_types = {payload_type};
1248 MockRtpPacketSink sink;
1249 AddSink(criteria, &sink);
1250
1251 auto packet = CreatePacketWithSsrcMidRsid(ssrc, mid, wrong_rsid);
1252 packet->SetPayloadType(payload_type);
1253 EXPECT_CALL(sink, OnRtpPacket(_)).Times(0);
1254 EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
1255 }
1256
1257 #if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
1258
TEST_F(RtpDemuxerDeathTest,CriteriaMustBeNonEmpty)1259 TEST_F(RtpDemuxerDeathTest, CriteriaMustBeNonEmpty) {
1260 MockRtpPacketSink sink;
1261 RtpDemuxerCriteria criteria;
1262 EXPECT_DEATH(AddSink(criteria, &sink), "");
1263 }
1264
TEST_F(RtpDemuxerDeathTest,RsidMustBeAlphaNumeric)1265 TEST_F(RtpDemuxerDeathTest, RsidMustBeAlphaNumeric) {
1266 MockRtpPacketSink sink;
1267 EXPECT_DEATH(AddSinkOnlyRsid("a_3", &sink), "");
1268 }
1269
TEST_F(RtpDemuxerDeathTest,MidMustBeToken)1270 TEST_F(RtpDemuxerDeathTest, MidMustBeToken) {
1271 MockRtpPacketSink sink;
1272 EXPECT_DEATH(AddSinkOnlyMid("a(3)", &sink), "");
1273 }
1274
TEST_F(RtpDemuxerDeathTest,RsidMustNotExceedMaximumLength)1275 TEST_F(RtpDemuxerDeathTest, RsidMustNotExceedMaximumLength) {
1276 MockRtpPacketSink sink;
1277 std::string rsid(BaseRtpStringExtension::kMaxValueSizeBytes + 1, 'a');
1278 EXPECT_DEATH(AddSinkOnlyRsid(rsid, &sink), "");
1279 }
1280
TEST_F(RtpDemuxerDeathTest,MidMustNotExceedMaximumLength)1281 TEST_F(RtpDemuxerDeathTest, MidMustNotExceedMaximumLength) {
1282 MockRtpPacketSink sink;
1283 std::string mid(BaseRtpStringExtension::kMaxValueSizeBytes + 1, 'a');
1284 EXPECT_DEATH(AddSinkOnlyMid(mid, &sink), "");
1285 }
1286
1287 #endif
1288
1289 } // namespace
1290 } // namespace webrtc
1291