1 use rtp::{header::Header, packet::Packet, packetizer::Depacketizer};
2
3 use super::*;
4
5 // Turns u8 integers into Bytes Array
6 macro_rules! bytes {
7 ($($item:expr),*) => ({
8 static STATIC_SLICE: &'static [u8] = &[$($item), *];
9 Bytes::from_static(STATIC_SLICE)
10 });
11 }
12 #[derive(Default)]
13 pub struct SampleBuilderTest {
14 message: String,
15 packets: Vec<Packet>,
16 with_head_checker: bool,
17 head_bytes: Vec<bytes::Bytes>,
18 samples: Vec<Sample>,
19 max_late: u16,
20 max_late_timestamp: Duration,
21 extra_pop_attempts: usize,
22 }
23
24 pub struct FakeDepacketizer {
25 head_checker: bool,
26 head_bytes: Vec<bytes::Bytes>,
27 }
28
29 impl FakeDepacketizer {
new() -> Self30 fn new() -> Self {
31 Self {
32 head_checker: false,
33 head_bytes: vec![],
34 }
35 }
36 }
37
38 impl Depacketizer for FakeDepacketizer {
depacketize(&mut self, b: &Bytes) -> std::result::Result<bytes::Bytes, rtp::Error>39 fn depacketize(&mut self, b: &Bytes) -> std::result::Result<bytes::Bytes, rtp::Error> {
40 Ok(b.clone())
41 }
42
43 /// Checks if the packet is at the beginning of a partition. This
44 /// should return false if the result could not be determined, in
45 /// which case the caller will detect timestamp discontinuities.
is_partition_head(&self, payload: &Bytes) -> bool46 fn is_partition_head(&self, payload: &Bytes) -> bool {
47 if !self.head_checker {
48 // from .go: simulates a bug in 3.0 version, the tests should not assume the bug
49 return true;
50 }
51
52 for b in &self.head_bytes {
53 if *payload == b {
54 return true;
55 }
56 }
57 false
58 }
59
60 /// Checks if the packet is at the end of a partition. This should
61 /// return false if the result could not be determined.
is_partition_tail(&self, marker: bool, _payload: &Bytes) -> bool62 fn is_partition_tail(&self, marker: bool, _payload: &Bytes) -> bool {
63 marker
64 }
65 }
66
67 #[test]
test_sample_builder()68 pub fn test_sample_builder() {
69 #![allow(clippy::needless_update)]
70 let test_data: Vec<SampleBuilderTest> = vec![
71 SampleBuilderTest {
72 #[rustfmt::skip]
73 message: "Sample builder shouldn't emit anything if only one RTP packet has been pushed".into(),
74 packets: vec![Packet {
75 header: Header {
76 sequence_number: 5000,
77 timestamp: 5,
78 ..Default::default()
79 },
80 payload: bytes!(1),
81 ..Default::default()
82 }],
83 samples: vec![],
84 max_late: 50,
85 max_late_timestamp: Duration::from_secs(0),
86 ..Default::default()
87 },
88 SampleBuilderTest {
89 #[rustfmt::skip]
90 message: "Sample builder shouldn't emit anything if only one RTP packet has been pushed even if the marker bit is set".into(),
91 packets: vec![Packet {
92 header: Header {
93 sequence_number: 5000,
94 timestamp: 5,
95 marker: true,
96 ..Default::default()
97 },
98 payload: bytes!(1),
99 ..Default::default()
100 }],
101 samples: vec![],
102 max_late: 50,
103 max_late_timestamp: Duration::from_secs(0),
104 ..Default::default()
105 },
106 SampleBuilderTest {
107 #[rustfmt::skip]
108 message: "Sample builder should emit two packets, we had three packets with unique timestamps".into(),
109 packets: vec![
110 Packet {
111 // First packet
112 header: Header {
113 sequence_number: 5000,
114 timestamp: 5,
115 ..Default::default()
116 },
117 payload: bytes!(1),
118 ..Default::default()
119 },
120 Packet {
121 // Second packet
122 header: Header {
123 sequence_number: 5001,
124 timestamp: 6,
125 ..Default::default()
126 },
127 payload: bytes!(2),
128 ..Default::default()
129 },
130 Packet {
131 // Third packet
132 header: Header {
133 sequence_number: 5002,
134 timestamp: 7,
135 ..Default::default()
136 },
137 payload: bytes!(3),
138 ..Default::default()
139 },
140 ],
141 samples: vec![
142 Sample {
143 // First sample
144 data: bytes!(1),
145 duration: Duration::from_secs(1), // technically this is the default value, but since it was in .go source....
146 packet_timestamp: 5,
147 ..Default::default()
148 },
149 Sample {
150 // Second sample
151 data: bytes!(2),
152 duration: Duration::from_secs(1),
153 packet_timestamp: 6,
154 ..Default::default()
155 },
156 ],
157 max_late: 50,
158 max_late_timestamp: Duration::from_secs(0),
159 ..Default::default()
160 },
161 SampleBuilderTest {
162 #[rustfmt::skip]
163 message: "Sample builder should emit one packet, we had a packet end of sequence marker and run out of space".into(),
164 packets: vec![
165 Packet {
166 // First packet
167 header: Header {
168 sequence_number: 5000,
169 timestamp: 5,
170 marker: true,
171 ..Default::default()
172 },
173 payload: bytes!(1),
174 ..Default::default()
175 },
176 Packet {
177 // Second packet
178 header: Header {
179 sequence_number: 5002,
180 timestamp: 7,
181 ..Default::default()
182 },
183 payload: bytes!(2),
184 ..Default::default()
185 },
186 Packet {
187 // Third packet
188 header: Header {
189 sequence_number: 5004,
190 timestamp: 9,
191 ..Default::default()
192 },
193 payload: bytes!(3),
194 ..Default::default()
195 },
196 Packet {
197 // Fourth packet
198 header: Header {
199 sequence_number: 5006,
200 timestamp: 11,
201 ..Default::default()
202 },
203 payload: bytes!(4),
204 ..Default::default()
205 },
206 Packet {
207 // Fifth packet
208 header: Header {
209 sequence_number: 5008,
210 timestamp: 13,
211 ..Default::default()
212 },
213 payload: bytes!(5),
214 ..Default::default()
215 },
216 Packet {
217 // Sixth packet
218 header: Header {
219 sequence_number: 5010,
220 timestamp: 15,
221 ..Default::default()
222 },
223 payload: bytes!(6),
224 ..Default::default()
225 },
226 Packet {
227 // Seventh packet
228 header: Header {
229 sequence_number: 5012,
230 timestamp: 17,
231 ..Default::default()
232 },
233 payload: bytes!(7),
234 ..Default::default()
235 },
236 ],
237 samples: vec![Sample {
238 // First sample
239 data: bytes!(1),
240 duration: Duration::from_secs(2),
241 packet_timestamp: 5,
242 ..Default::default()
243 }],
244 max_late: 5,
245 max_late_timestamp: Duration::from_secs(0),
246 ..Default::default()
247 },
248 SampleBuilderTest {
249 #[rustfmt::skip]
250 message: "Sample builder shouldn't emit any packet, we do not have a valid end of sequence and run out of space".into(),
251 packets: vec![
252 Packet {
253 // First packet
254 header: Header {
255 sequence_number: 5000,
256 timestamp: 5,
257 ..Default::default()
258 },
259 payload: bytes!(1),
260 ..Default::default()
261 },
262 Packet {
263 // Second packet
264 header: Header {
265 sequence_number: 5002,
266 timestamp: 7,
267 ..Default::default()
268 },
269 payload: bytes!(2),
270 ..Default::default()
271 },
272 Packet {
273 // Third packet
274 header: Header {
275 sequence_number: 5004,
276 timestamp: 9,
277 ..Default::default()
278 },
279 payload: bytes!(3),
280 ..Default::default()
281 },
282 Packet {
283 // Fourth packet
284 header: Header {
285 sequence_number: 5006,
286 timestamp: 11,
287 ..Default::default()
288 },
289 payload: bytes!(4),
290 ..Default::default()
291 },
292 Packet {
293 // Fifth packet
294 header: Header {
295 sequence_number: 5008,
296 timestamp: 13,
297 ..Default::default()
298 },
299 payload: bytes!(5),
300 ..Default::default()
301 },
302 Packet {
303 // Sixth packet
304 header: Header {
305 sequence_number: 5010,
306 timestamp: 15,
307 ..Default::default()
308 },
309 payload: bytes!(6),
310 ..Default::default()
311 },
312 Packet {
313 // Seventh packet
314 header: Header {
315 sequence_number: 5012,
316 timestamp: 17,
317 ..Default::default()
318 },
319 payload: bytes!(7),
320 ..Default::default()
321 },
322 ],
323 samples: vec![],
324 max_late: 5,
325 max_late_timestamp: Duration::from_secs(0),
326 ..Default::default()
327 },
328 SampleBuilderTest {
329 #[rustfmt::skip]
330 message: "Sample builder should emit one packet, we had a packet end of sequence marker and run out of space".into(),
331 packets: vec![
332 Packet {
333 // First packet
334 header: Header {
335 sequence_number: 5000,
336 timestamp: 5,
337 marker: true,
338 ..Default::default()
339 },
340 payload: bytes!(1),
341 ..Default::default()
342 },
343 Packet {
344 // Second packet
345 header: Header {
346 sequence_number: 5002,
347 timestamp: 7,
348 marker: true,
349 ..Default::default()
350 },
351 payload: bytes!(2),
352 ..Default::default()
353 },
354 Packet {
355 // Third packet
356 header: Header {
357 sequence_number: 5004,
358 timestamp: 9,
359 ..Default::default()
360 },
361 payload: bytes!(3),
362 ..Default::default()
363 },
364 Packet {
365 // Fourth packet
366 header: Header {
367 sequence_number: 5006,
368 timestamp: 11,
369 ..Default::default()
370 },
371 payload: bytes!(4),
372 ..Default::default()
373 },
374 Packet {
375 // Fifth packet
376 header: Header {
377 sequence_number: 5008,
378 timestamp: 13,
379 ..Default::default()
380 },
381 payload: bytes!(5),
382 ..Default::default()
383 },
384 Packet {
385 // Sixth packet
386 header: Header {
387 sequence_number: 5010,
388 timestamp: 15,
389 ..Default::default()
390 },
391 payload: bytes!(6),
392 ..Default::default()
393 },
394 Packet {
395 // Seventh packet
396 header: Header {
397 sequence_number: 5012,
398 timestamp: 17,
399 ..Default::default()
400 },
401 payload: bytes!(7),
402 ..Default::default()
403 },
404 ],
405 samples: vec![
406 Sample {
407 // First (dropped) sample
408 data: bytes!(1),
409 duration: Duration::from_secs(2),
410 packet_timestamp: 5,
411 ..Default::default()
412 },
413 Sample {
414 // First correct sample
415 data: bytes!(2),
416 duration: Duration::from_secs(2),
417 packet_timestamp: 7,
418 prev_dropped_packets: 1,
419 ..Default::default()
420 },
421 ],
422 max_late: 5,
423 max_late_timestamp: Duration::from_secs(0),
424 ..Default::default()
425 },
426 SampleBuilderTest {
427 #[rustfmt::skip]
428 message: "Sample builder should emit one packet, we had two packets but with duplicate timestamps".into(),
429 packets: vec![
430 Packet {
431 // First packet
432 header: Header {
433 sequence_number: 5000,
434 timestamp: 5,
435 ..Default::default()
436 },
437 payload: bytes!(1),
438 ..Default::default()
439 },
440 Packet {
441 // Second packet
442 header: Header {
443 sequence_number: 5001,
444 timestamp: 6,
445 ..Default::default()
446 },
447 payload: bytes!(2),
448 ..Default::default()
449 },
450 Packet {
451 // Third packet
452 header: Header {
453 sequence_number: 5002,
454 timestamp: 6,
455 ..Default::default()
456 },
457 payload: bytes!(3),
458 ..Default::default()
459 },
460 Packet {
461 // Fourth packet
462 header: Header {
463 sequence_number: 5003,
464 timestamp: 7,
465 ..Default::default()
466 },
467 payload: bytes!(4),
468 ..Default::default()
469 },
470 ],
471 samples: vec![
472 Sample {
473 // First sample
474 data: bytes!(1),
475 duration: Duration::from_secs(1),
476 packet_timestamp: 5,
477 ..Default::default()
478 },
479 Sample {
480 // Second (duplicate) correct sample
481 data: bytes!(2, 3),
482 duration: Duration::from_secs(1),
483 packet_timestamp: 6,
484 ..Default::default()
485 },
486 ],
487 max_late: 50,
488 max_late_timestamp: Duration::from_secs(0),
489 ..Default::default()
490 },
491 SampleBuilderTest {
492 #[rustfmt::skip]
493 message: "Sample builder shouldn't emit a packet because we have a gap before a valid one".into(),
494 packets: vec![
495 Packet {
496 // First packet
497 header: Header {
498 sequence_number: 5000,
499 timestamp: 5,
500 marker: true,
501 ..Default::default()
502 },
503 payload: bytes!(1),
504 ..Default::default()
505 },
506 Packet {
507 // Second packet
508 header: Header {
509 sequence_number: 5007,
510 timestamp: 6,
511 marker: true,
512 ..Default::default()
513 },
514 payload: bytes!(2),
515 ..Default::default()
516 },
517 Packet {
518 // Third packet
519 header: Header {
520 sequence_number: 5008,
521 timestamp: 7,
522 ..Default::default()
523 },
524 payload: bytes!(3),
525 ..Default::default()
526 },
527 ],
528 samples: vec![],
529 max_late: 50,
530 max_late_timestamp: Duration::from_secs(0),
531 ..Default::default()
532 },
533 SampleBuilderTest {
534 #[rustfmt::skip]
535 message: "Sample builder shouldn't emit a packet after a gap as there are gaps and have not reached maxLate yet".into(),
536 packets: vec![
537 Packet {
538 // First packet
539 header: Header {
540 sequence_number: 5000,
541 timestamp: 5,
542 marker: true,
543 ..Default::default()
544 },
545 payload: bytes!(1),
546 ..Default::default()
547 },
548 Packet {
549 // Second packet
550 header: Header {
551 sequence_number: 5007,
552 timestamp: 6,
553 marker: true,
554 ..Default::default()
555 },
556 payload: bytes!(2),
557 ..Default::default()
558 },
559 Packet {
560 // Third packet
561 header: Header {
562 sequence_number: 5008,
563 timestamp: 7,
564 ..Default::default()
565 },
566 payload: bytes!(3),
567 ..Default::default()
568 },
569 ],
570 with_head_checker: true,
571 head_bytes: vec![bytes!(2)],
572 samples: vec![],
573 max_late: 50,
574 max_late_timestamp: Duration::from_secs(0),
575 ..Default::default()
576 },
577 SampleBuilderTest {
578 #[rustfmt::skip]
579 message: "Sample builder shouldn't emit a packet after a gap if PartitionHeadChecker doesn't assume it head".into(),
580 packets: vec![
581 Packet {
582 // First packet
583 header: Header {
584 sequence_number: 5000,
585 timestamp: 5,
586 marker: true,
587 ..Default::default()
588 },
589 payload: bytes!(1),
590 ..Default::default()
591 },
592 Packet {
593 // Second packet
594 header: Header {
595 sequence_number: 5007,
596 timestamp: 6,
597 marker: true,
598 ..Default::default()
599 },
600 payload: bytes!(2),
601 ..Default::default()
602 },
603 Packet {
604 // Third packet
605 header: Header {
606 sequence_number: 5008,
607 timestamp: 7,
608 ..Default::default()
609 },
610 payload: bytes!(3),
611 ..Default::default()
612 },
613 ],
614 with_head_checker: true,
615 head_bytes: vec![],
616 samples: vec![],
617 max_late: 50,
618 max_late_timestamp: Duration::from_secs(0),
619 ..Default::default()
620 },
621 SampleBuilderTest {
622 #[rustfmt::skip]
623 message: "Sample builder should emit multiple valid packets".into(),
624 packets: vec![
625 Packet {
626 // First packet
627 header: Header {
628 sequence_number: 5000,
629 timestamp: 1,
630 ..Default::default()
631 },
632 payload: bytes!(1),
633 ..Default::default()
634 },
635 Packet {
636 // Second packet
637 header: Header {
638 sequence_number: 5001,
639 timestamp: 2,
640 ..Default::default()
641 },
642 payload: bytes!(2),
643 ..Default::default()
644 },
645 Packet {
646 // Third packet
647 header: Header {
648 sequence_number: 5002,
649 timestamp: 3,
650 ..Default::default()
651 },
652 payload: bytes!(3),
653 ..Default::default()
654 },
655 Packet {
656 // Fourth packet
657 header: Header {
658 sequence_number: 5003,
659 timestamp: 4,
660 ..Default::default()
661 },
662 payload: bytes!(4),
663 ..Default::default()
664 },
665 Packet {
666 // Fifth packet
667 header: Header {
668 sequence_number: 5004,
669 timestamp: 5,
670 ..Default::default()
671 },
672 payload: bytes!(5),
673 ..Default::default()
674 },
675 Packet {
676 // Sixth packet
677 header: Header {
678 sequence_number: 5005,
679 timestamp: 6,
680 ..Default::default()
681 },
682 payload: bytes!(6),
683 ..Default::default()
684 },
685 ],
686 samples: vec![
687 Sample {
688 // First sample
689 data: bytes!(1),
690 duration: Duration::from_secs(1),
691 packet_timestamp: 1,
692 ..Default::default()
693 },
694 Sample {
695 // Second sample
696 data: bytes!(2),
697 duration: Duration::from_secs(1),
698 packet_timestamp: 2,
699 ..Default::default()
700 },
701 Sample {
702 // Third sample
703 data: bytes!(3),
704 duration: Duration::from_secs(1),
705 packet_timestamp: 3,
706 ..Default::default()
707 },
708 Sample {
709 // Fourth sample
710 data: bytes!(4),
711 duration: Duration::from_secs(1),
712 packet_timestamp: 4,
713 ..Default::default()
714 },
715 Sample {
716 // Fifth sample
717 data: bytes!(5),
718 duration: Duration::from_secs(1),
719 packet_timestamp: 5,
720 ..Default::default()
721 },
722 ],
723 max_late: 50,
724 max_late_timestamp: Duration::from_secs(0),
725 ..Default::default()
726 },
727 SampleBuilderTest {
728 #[rustfmt::skip]
729 message: "Sample builder should skip timestamps too old".into(),
730 packets: vec![
731 Packet {
732 // First packet
733 header: Header {
734 sequence_number: 5000,
735 timestamp: 1,
736 ..Default::default()
737 },
738 payload: bytes!(1),
739 ..Default::default()
740 },
741 Packet {
742 // Second packet
743 header: Header {
744 sequence_number: 5001,
745 timestamp: 2,
746 ..Default::default()
747 },
748 payload: bytes!(2),
749 ..Default::default()
750 },
751 Packet {
752 // Third packet
753 header: Header {
754 sequence_number: 5002,
755 timestamp: 3,
756 ..Default::default()
757 },
758 payload: bytes!(3),
759 ..Default::default()
760 },
761 Packet {
762 // Fourth packet
763 header: Header {
764 sequence_number: 5013,
765 timestamp: 4000,
766 ..Default::default()
767 },
768 payload: bytes!(4),
769 ..Default::default()
770 },
771 Packet {
772 // Fifth packet
773 header: Header {
774 sequence_number: 5014,
775 timestamp: 4000,
776 ..Default::default()
777 },
778 payload: bytes!(5),
779 ..Default::default()
780 },
781 Packet {
782 // Sixth packet
783 header: Header {
784 sequence_number: 5015,
785 timestamp: 4002,
786 ..Default::default()
787 },
788 payload: bytes!(6),
789 ..Default::default()
790 },
791 Packet {
792 // Seventh packet
793 header: Header {
794 sequence_number: 5016,
795 timestamp: 7000,
796 ..Default::default()
797 },
798 payload: bytes!(4),
799 ..Default::default()
800 },
801 Packet {
802 // Eigth packet
803 header: Header {
804 sequence_number: 5017,
805 timestamp: 7001,
806 ..Default::default()
807 },
808 payload: bytes!(5),
809 ..Default::default()
810 },
811 ],
812 samples: vec![Sample {
813 // First sample
814 data: bytes!(4, 5),
815 duration: Duration::from_secs(2),
816 packet_timestamp: 4000,
817 prev_dropped_packets: 12,
818 ..Default::default()
819 }],
820 with_head_checker: true,
821 head_bytes: vec![bytes!(4)],
822 max_late: 50,
823 max_late_timestamp: Duration::from_secs(2000),
824 ..Default::default()
825 },
826 // This test is based on observed RTP packet streams from Chrome. libWebRTC inserts padding
827 // packets to keep send rates steady, these are not important for sample building but we
828 // should identify them as padding packets to differentiate them from lost packets.
829 SampleBuilderTest {
830 #[rustfmt::skip]
831 message: "Sample builder should recognise padding packets".into(),
832 packets: vec![
833 Packet {
834 // First packet
835 header: Header {
836 sequence_number: 5000,
837 timestamp: 1,
838 ..Default::default()
839 },
840 payload: bytes!(1),
841 ..Default::default()
842 },
843 Packet {
844 // Second packet
845 header: Header {
846 sequence_number: 5001,
847 timestamp: 1,
848 ..Default::default()
849 },
850 payload: bytes!(2),
851 ..Default::default()
852 },
853 Packet {
854 // Third packet
855 header: Header {
856 sequence_number: 5002,
857 timestamp: 1,
858 marker: true,
859 ..Default::default()
860 },
861 payload: bytes!(3),
862 ..Default::default()
863 },
864 Packet {
865 // Padding packet 1
866 header: Header {
867 sequence_number: 5003,
868 timestamp: 1,
869 ..Default::default()
870 },
871 payload: Bytes::from_static(&[]),
872 ..Default::default()
873 },
874 Packet {
875 // Padding packet 2
876 header: Header {
877 sequence_number: 5004,
878 timestamp: 1,
879 ..Default::default()
880 },
881 payload: Bytes::from_static(&[]),
882 ..Default::default()
883 },
884 Packet {
885 // Sixth packet
886 header: Header {
887 sequence_number: 5005,
888 timestamp: 2,
889 ..Default::default()
890 },
891 payload: bytes!(1),
892 ..Default::default()
893 },
894 Packet {
895 // Seventh packet
896 header: Header {
897 sequence_number: 5006,
898 timestamp: 2,
899 marker: true,
900 ..Default::default()
901 },
902 payload: bytes!(7),
903 ..Default::default()
904 },
905 Packet {
906 // Seventh packet
907 header: Header {
908 sequence_number: 5007,
909 timestamp: 3,
910 ..Default::default()
911 },
912 payload: bytes!(1),
913 ..Default::default()
914 },
915 ],
916 samples: vec![
917 Sample {
918 // First sample
919 data: bytes!(1, 2, 3),
920 duration: Duration::from_secs(0),
921 packet_timestamp: 1,
922 prev_dropped_packets: 0,
923 ..Default::default()
924 },
925 Sample {
926 // Second sample
927 data: bytes!(1, 7),
928 duration: Duration::from_secs(1),
929 packet_timestamp: 2,
930 prev_dropped_packets: 2,
931 prev_padding_packets: 2,
932 ..Default::default()
933 },
934 ],
935 with_head_checker: true,
936 head_bytes: vec![bytes!(1)],
937 max_late: 50,
938 max_late_timestamp: Duration::from_secs(2000),
939 extra_pop_attempts: 1,
940 ..Default::default()
941 },
942 // This test is based on observed RTP packet streams when screen sharing in Chrome.
943 SampleBuilderTest {
944 #[rustfmt::skip]
945 message: "Sample builder should recognise padding packets when combined with max_late_timestamp".into(),
946 packets: vec![
947 Packet {
948 // First packet
949 header: Header {
950 sequence_number: 5000,
951 timestamp: 1,
952 ..Default::default()
953 },
954 payload: bytes!(1),
955 ..Default::default()
956 },
957 Packet {
958 // Second packet
959 header: Header {
960 sequence_number: 5001,
961 timestamp: 1,
962 ..Default::default()
963 },
964 payload: bytes!(2),
965 ..Default::default()
966 },
967 Packet {
968 // Third packet
969 header: Header {
970 sequence_number: 5002,
971 timestamp: 1,
972 marker: true,
973 ..Default::default()
974 },
975 payload: bytes!(3),
976 ..Default::default()
977 },
978 Packet {
979 // Padding packet 1
980 header: Header {
981 sequence_number: 5003,
982 timestamp: 1,
983 ..Default::default()
984 },
985 payload: Bytes::from_static(&[]),
986 ..Default::default()
987 },
988 Packet {
989 // Padding packet 2
990 header: Header {
991 sequence_number: 5004,
992 timestamp: 1,
993 ..Default::default()
994 },
995 payload: Bytes::from_static(&[]),
996 ..Default::default()
997 },
998 Packet {
999 // Sixth packet
1000 header: Header {
1001 sequence_number: 5005,
1002 timestamp: 3,
1003 ..Default::default()
1004 },
1005 payload: bytes!(1),
1006 ..Default::default()
1007 },
1008 Packet {
1009 // Seventh packet
1010 header: Header {
1011 sequence_number: 5006,
1012 timestamp: 3,
1013 marker: true,
1014 ..Default::default()
1015 },
1016 payload: bytes!(7),
1017 ..Default::default()
1018 },
1019 Packet {
1020 // Seventh packet
1021 header: Header {
1022 sequence_number: 5007,
1023 timestamp: 4,
1024 ..Default::default()
1025 },
1026 payload: bytes!(1),
1027 ..Default::default()
1028 },
1029 ],
1030 samples: vec![
1031 Sample {
1032 // First sample
1033 data: bytes!(1, 2, 3),
1034 duration: Duration::from_secs(0),
1035 packet_timestamp: 1,
1036 prev_dropped_packets: 0,
1037 ..Default::default()
1038 },
1039 Sample {
1040 // Second sample
1041 data: bytes!(1, 7),
1042 duration: Duration::from_secs(1),
1043 packet_timestamp: 3,
1044 prev_dropped_packets: 2,
1045 prev_padding_packets: 2,
1046 ..Default::default()
1047 },
1048 ],
1049 with_head_checker: true,
1050 head_bytes: vec![bytes!(1)],
1051 max_late: 50,
1052 max_late_timestamp: Duration::from_millis(1050),
1053 extra_pop_attempts: 1,
1054 ..Default::default()
1055 },
1056 // This test is based on observed RTP packet streams when screen sharing in Chrome.
1057 SampleBuilderTest {
1058 #[rustfmt::skip]
1059 message: "Sample builder should build a sample out of a packet that's both start and end".into(),
1060 packets: vec![
1061 Packet {
1062 header: Header {
1063 sequence_number: 5000,
1064 timestamp: 1,
1065 marker: true,
1066 ..Default::default()
1067 },
1068 payload: bytes!(1),
1069 ..Default::default()
1070 },
1071 Packet {
1072 header: Header {
1073 sequence_number: 5001,
1074 timestamp: 2,
1075 ..Default::default()
1076 },
1077 payload: bytes!(1),
1078 ..Default::default()
1079 },
1080 ],
1081 samples: vec![Sample {
1082 // First sample
1083 data: bytes!(1),
1084 duration: Duration::from_secs(1),
1085 packet_timestamp: 1,
1086 prev_dropped_packets: 0,
1087 ..Default::default()
1088 }],
1089 with_head_checker: true,
1090 head_bytes: vec![bytes!(1)],
1091 max_late: 50,
1092 max_late_timestamp: Duration::from_millis(1050),
1093 ..Default::default()
1094 },
1095 // This test is based on observed RTP packet streams when screen sharing in Chrome. In
1096 // particular the scenario used involved no movement on screen which causes Chrome to
1097 // generate padding packets.
1098 SampleBuilderTest {
1099 #[rustfmt::skip]
1100 message: "Sample builder should build a sample out of a packet that's both start and end following a run of padding packets".into(),
1101 packets: vec![
1102 // First valid packet
1103 Packet {
1104 header: Header {
1105 sequence_number: 5000,
1106 timestamp: 1,
1107 ..Default::default()
1108 },
1109 payload: bytes!(1),
1110 ..Default::default()
1111 },
1112 // Second valid packet
1113 Packet {
1114 header: Header {
1115 sequence_number: 5001,
1116 timestamp: 1,
1117 marker: true,
1118 ..Default::default()
1119 },
1120 payload: bytes!(2),
1121 ..Default::default()
1122 },
1123 // Padding packet 1
1124 Packet {
1125 header: Header {
1126 sequence_number: 5002,
1127 timestamp: 1,
1128 ..Default::default()
1129 },
1130 payload: Bytes::default(),
1131 ..Default::default()
1132 },
1133 // Padding packet 2
1134 Packet {
1135 header: Header {
1136 sequence_number: 5003,
1137 timestamp: 1,
1138 ..Default::default()
1139 },
1140 payload: Bytes::default(),
1141 ..Default::default()
1142 },
1143 // Third valid packet
1144 Packet {
1145 header: Header {
1146 sequence_number: 5004,
1147 timestamp: 2,
1148 marker: true,
1149 ..Default::default()
1150 },
1151 payload: bytes!(1),
1152 ..Default::default()
1153 },
1154 // Fourth valid packet, start of next sample
1155 Packet {
1156 header: Header {
1157 sequence_number: 5005,
1158 timestamp: 3,
1159 ..Default::default()
1160 },
1161 payload: bytes!(1),
1162 ..Default::default()
1163 },
1164 ],
1165 samples: vec![
1166 Sample {
1167 // First sample
1168 data: bytes!(1, 2),
1169 duration: Duration::from_secs(0),
1170 packet_timestamp: 1,
1171 prev_dropped_packets: 0,
1172 ..Default::default()
1173 },
1174 Sample {
1175 // Second sample
1176 data: bytes!(1),
1177 duration: Duration::from_secs(1),
1178 packet_timestamp: 2,
1179 prev_dropped_packets: 2,
1180 prev_padding_packets: 2,
1181 ..Default::default()
1182 },
1183 ],
1184 with_head_checker: true,
1185 head_bytes: vec![bytes!(1)],
1186 extra_pop_attempts: 1,
1187 max_late: 50,
1188 ..Default::default()
1189 },
1190 ];
1191
1192 for t in test_data {
1193 let d = FakeDepacketizer {
1194 head_checker: t.with_head_checker,
1195 head_bytes: t.head_bytes,
1196 };
1197
1198 let mut s = {
1199 let sample_builder = SampleBuilder::new(t.max_late, d, 1);
1200 if t.max_late_timestamp != Duration::from_secs(0) {
1201 sample_builder.with_max_time_delay(t.max_late_timestamp)
1202 } else {
1203 sample_builder
1204 }
1205 };
1206
1207 let mut samples = Vec::<Sample>::new();
1208 for p in t.packets {
1209 s.push(p)
1210 }
1211
1212 while let Some(sample) = s.pop() {
1213 samples.push(sample)
1214 }
1215
1216 for _ in 0..t.extra_pop_attempts {
1217 // Pop some more
1218 while let Some(sample) = s.pop() {
1219 samples.push(sample)
1220 }
1221 }
1222
1223 // Current problem: Sample does not implement Eq. Either implement myself or find another way of comparison. (Derive does not work)
1224 assert_eq!(t.samples, samples, "{}", t.message);
1225 }
1226 }
1227
1228 // SampleBuilder should respect maxLate if we popped successfully but then have a gap larger then maxLate
1229 #[test]
test_sample_builder_max_late()1230 fn test_sample_builder_max_late() {
1231 let mut s = SampleBuilder::new(50, FakeDepacketizer::new(), 1);
1232
1233 s.push(Packet {
1234 header: Header {
1235 sequence_number: 0,
1236 timestamp: 1,
1237 ..Default::default()
1238 },
1239 payload: bytes!(0x01),
1240 });
1241 s.push(Packet {
1242 header: Header {
1243 sequence_number: 1,
1244 timestamp: 2,
1245 ..Default::default()
1246 },
1247 payload: bytes!(0x01),
1248 });
1249 s.push(Packet {
1250 header: Header {
1251 sequence_number: 2,
1252 timestamp: 3,
1253 ..Default::default()
1254 },
1255 payload: bytes!(0x01),
1256 });
1257 assert_eq!(
1258 s.pop(),
1259 Some(Sample {
1260 data: bytes!(0x01),
1261 duration: Duration::from_secs(1),
1262 packet_timestamp: 1,
1263 ..Default::default()
1264 }),
1265 "Failed to build samples before gap"
1266 );
1267
1268 s.push(Packet {
1269 header: Header {
1270 sequence_number: 5000,
1271 timestamp: 500,
1272 ..Default::default()
1273 },
1274 payload: bytes!(0x02),
1275 });
1276 s.push(Packet {
1277 header: Header {
1278 sequence_number: 5001,
1279 timestamp: 501,
1280 ..Default::default()
1281 },
1282 payload: bytes!(0x02),
1283 });
1284 s.push(Packet {
1285 header: Header {
1286 sequence_number: 5002,
1287 timestamp: 502,
1288 ..Default::default()
1289 },
1290 payload: bytes!(0x02),
1291 });
1292
1293 assert_eq!(
1294 s.pop(),
1295 Some(Sample {
1296 data: bytes!(0x01),
1297 duration: Duration::from_secs(1),
1298 packet_timestamp: 2,
1299 ..Default::default()
1300 }),
1301 "Failed to build samples after large gap"
1302 );
1303 assert_eq!(None, s.pop(), "Failed to build samples after large gap");
1304
1305 s.push(Packet {
1306 header: Header {
1307 sequence_number: 6000,
1308 timestamp: 600,
1309 ..Default::default()
1310 },
1311 payload: bytes!(0x03),
1312 });
1313 assert_eq!(
1314 s.pop(),
1315 Some(Sample {
1316 data: bytes!(0x02),
1317 duration: Duration::from_secs(1),
1318 packet_timestamp: 500,
1319 prev_dropped_packets: 4998,
1320 ..Default::default()
1321 }),
1322 "Failed to build samples after large gap"
1323 );
1324 assert_eq!(
1325 s.pop(),
1326 Some(Sample {
1327 data: bytes!(0x02),
1328 duration: Duration::from_secs(1),
1329 packet_timestamp: 501,
1330 ..Default::default()
1331 }),
1332 "Failed to build samples after large gap"
1333 );
1334 }
1335
1336 #[test]
test_seqnum_distance()1337 fn test_seqnum_distance() {
1338 struct TestData {
1339 x: u16,
1340 y: u16,
1341 d: u16,
1342 }
1343 let test_data = vec![
1344 TestData {
1345 x: 0x0001,
1346 y: 0x0003,
1347 d: 0x0002,
1348 },
1349 TestData {
1350 x: 0x0003,
1351 y: 0x0001,
1352 d: 0x0002,
1353 },
1354 TestData {
1355 x: 0xFFF3,
1356 y: 0xFFF1,
1357 d: 0x0002,
1358 },
1359 TestData {
1360 x: 0xFFF1,
1361 y: 0xFFF3,
1362 d: 0x0002,
1363 },
1364 TestData {
1365 x: 0xFFFF,
1366 y: 0x0001,
1367 d: 0x0002,
1368 },
1369 TestData {
1370 x: 0x0001,
1371 y: 0xFFFF,
1372 d: 0x0002,
1373 },
1374 ];
1375
1376 for data in test_data {
1377 assert_eq!(
1378 seqnum_distance(data.x, data.y),
1379 data.d,
1380 "seqnum_distance({}, {}) returned {} which must be {}",
1381 data.x,
1382 data.y,
1383 seqnum_distance(data.x, data.y),
1384 data.d
1385 );
1386 }
1387 }
1388
1389 #[test]
test_sample_builder_clean_reference()1390 fn test_sample_builder_clean_reference() {
1391 for seq_start in [0_u16, 0xfff8, 0xfffe] {
1392 let mut s = SampleBuilder::new(10, FakeDepacketizer::new(), 1);
1393 s.push(Packet {
1394 header: Header {
1395 sequence_number: seq_start,
1396 timestamp: 0,
1397 ..Default::default()
1398 },
1399 payload: bytes!(0x01),
1400 });
1401 s.push(Packet {
1402 header: Header {
1403 sequence_number: seq_start.wrapping_add(1),
1404 timestamp: 0,
1405 ..Default::default()
1406 },
1407 payload: bytes!(0x02),
1408 });
1409 s.push(Packet {
1410 header: Header {
1411 sequence_number: seq_start.wrapping_add(2),
1412 timestamp: 0,
1413 ..Default::default()
1414 },
1415 payload: bytes!(0x03),
1416 });
1417 let pkt4 = Packet {
1418 header: Header {
1419 sequence_number: seq_start.wrapping_add(14),
1420 timestamp: 120,
1421 ..Default::default()
1422 },
1423 payload: bytes!(0x04),
1424 };
1425 s.push(pkt4.clone());
1426 let pkt5 = Packet {
1427 header: Header {
1428 sequence_number: seq_start.wrapping_add(12),
1429 timestamp: 120,
1430 ..Default::default()
1431 },
1432 payload: bytes!(0x05),
1433 };
1434 s.push(pkt5.clone());
1435
1436 for i in 0..3 {
1437 assert_eq!(
1438 s.buffer[seq_start.wrapping_add(i) as usize],
1439 None,
1440 "Old packet ({i}) is not unreferenced (seq_start: {seq_start}, max_late: 10, pushed: 12)"
1441 );
1442 }
1443 assert_eq!(s.buffer[seq_start.wrapping_add(14) as usize], Some(pkt4));
1444 assert_eq!(s.buffer[seq_start.wrapping_add(12) as usize], Some(pkt5));
1445 }
1446 }
1447
1448 #[test]
test_sample_builder_push_max_zero()1449 fn test_sample_builder_push_max_zero() {
1450 let pkts = vec![Packet {
1451 header: Header {
1452 sequence_number: 0,
1453 timestamp: 0,
1454 marker: true,
1455 ..Default::default()
1456 },
1457 payload: bytes!(0x01),
1458 }];
1459 let d = FakeDepacketizer {
1460 head_checker: true,
1461 head_bytes: vec![bytes!(0x01)],
1462 };
1463 let mut s = SampleBuilder::new(0, d, 1);
1464 s.push(pkts[0].clone());
1465 assert!(s.pop().is_some(), "Should expect a popped sample.")
1466 }
1467
1468 #[test]
test_pop_with_timestamp()1469 fn test_pop_with_timestamp() {
1470 let mut s = SampleBuilder::new(0, FakeDepacketizer::new(), 1);
1471 assert_eq!(s.pop_with_timestamp(), None);
1472 }
1473
1474 #[test]
test_sample_builder_data()1475 fn test_sample_builder_data() {
1476 let mut s = SampleBuilder::new(10, FakeDepacketizer::new(), 1);
1477 let mut j: usize = 0;
1478 for i in 0..0x20000_usize {
1479 let p = Packet {
1480 header: Header {
1481 sequence_number: i as u16,
1482 timestamp: (i + 42) as u32,
1483 ..Default::default()
1484 },
1485 payload: Bytes::copy_from_slice(&[i as u8]),
1486 };
1487 s.push(p);
1488 while let Some((sample, ts)) = s.pop_with_timestamp() {
1489 assert_eq!(ts, (j + 42) as u32, "timestamp");
1490 assert_eq!(sample.data.len(), 1, "data length");
1491 assert_eq!(sample.data[0], j as u8, "timestamp");
1492 j += 1;
1493 }
1494 }
1495 // only the last packet should be dropped
1496 assert_eq!(j, 0x1FFFF);
1497 }
1498