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