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