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 #![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] 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] 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] 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 ({}) is not unreferenced (seq_start: {}, max_late: 10, pushed: 12)", 1441 i, 1442 seq_start 1443 ); 1444 } 1445 assert_eq!(s.buffer[seq_start.wrapping_add(14) as usize], Some(pkt4)); 1446 assert_eq!(s.buffer[seq_start.wrapping_add(12) as usize], Some(pkt5)); 1447 } 1448 } 1449 1450 #[test] 1451 fn test_sample_builder_push_max_zero() { 1452 let pkts = vec![Packet { 1453 header: Header { 1454 sequence_number: 0, 1455 timestamp: 0, 1456 marker: true, 1457 ..Default::default() 1458 }, 1459 payload: bytes!(0x01), 1460 }]; 1461 let d = FakeDepacketizer { 1462 head_checker: true, 1463 head_bytes: vec![bytes!(0x01)], 1464 }; 1465 let mut s = SampleBuilder::new(0, d, 1); 1466 s.push(pkts[0].clone()); 1467 assert!(s.pop().is_some(), "Should expect a popped sample.") 1468 } 1469 1470 #[test] 1471 fn test_pop_with_timestamp() { 1472 let mut s = SampleBuilder::new(0, FakeDepacketizer::new(), 1); 1473 assert_eq!(s.pop_with_timestamp(), None); 1474 } 1475 1476 #[test] 1477 fn test_sample_builder_data() { 1478 let mut s = SampleBuilder::new(10, FakeDepacketizer::new(), 1); 1479 let mut j: usize = 0; 1480 for i in 0..0x20000_usize { 1481 let p = Packet { 1482 header: Header { 1483 sequence_number: i as u16, 1484 timestamp: (i + 42) as u32, 1485 ..Default::default() 1486 }, 1487 payload: Bytes::copy_from_slice(&[i as u8]), 1488 }; 1489 s.push(p); 1490 while let Some((sample, ts)) = s.pop_with_timestamp() { 1491 assert_eq!(ts, (j + 42) as u32, "timestamp"); 1492 assert_eq!(sample.data.len(), 1, "data length"); 1493 assert_eq!(sample.data[0], j as u8, "timestamp"); 1494 j += 1; 1495 } 1496 } 1497 // only the last packet should be dropped 1498 assert_eq!(j, 0x1FFFF); 1499 } 1500