OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 #include <algorithm> | 10 #include <algorithm> |
(...skipping 585 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
596 | 596 |
597 uint32_t local_ssrc_; | 597 uint32_t local_ssrc_; |
598 uint32_t remote_ssrc_; | 598 uint32_t remote_ssrc_; |
599 Transport* receive_transport_; | 599 Transport* receive_transport_; |
600 rtc::Optional<uint16_t> sequence_number_to_retransmit_; | 600 rtc::Optional<uint16_t> sequence_number_to_retransmit_; |
601 } test; | 601 } test; |
602 | 602 |
603 RunBaseTest(&test); | 603 RunBaseTest(&test); |
604 } | 604 } |
605 | 605 |
606 TEST_P(EndToEndTest, ReceivesUlpfec) { | 606 // Disable due to failure, see bugs.webrtc.org/7050 for |
| 607 // details. |
| 608 TEST_P(EndToEndTest, DISABLED_CanReceiveUlpfec) { |
607 class UlpfecRenderObserver : public test::EndToEndTest, | 609 class UlpfecRenderObserver : public test::EndToEndTest, |
608 public rtc::VideoSinkInterface<VideoFrame> { | 610 public rtc::VideoSinkInterface<VideoFrame> { |
609 public: | 611 public: |
610 UlpfecRenderObserver() | 612 UlpfecRenderObserver() |
611 : EndToEndTest(kDefaultTimeoutMs), | 613 : EndToEndTest(kDefaultTimeoutMs), state_(kFirstPacket) {} |
612 random_(0xcafef00d1), | |
613 num_packets_sent_(0) {} | |
614 | 614 |
615 private: | 615 private: |
616 Action OnSendRtp(const uint8_t* packet, size_t length) override { | 616 Action OnSendRtp(const uint8_t* packet, size_t length) override { |
617 rtc::CritScope lock(&crit_); | 617 rtc::CritScope lock(&crit_); |
618 RTPHeader header; | 618 RTPHeader header; |
619 EXPECT_TRUE(parser_->Parse(packet, length, &header)); | 619 EXPECT_TRUE(parser_->Parse(packet, length, &header)); |
620 | 620 |
621 EXPECT_TRUE(header.payloadType == kFakeVideoSendPayloadType || | |
622 header.payloadType == kRedPayloadType) | |
623 << "Unknown payload type received."; | |
624 EXPECT_EQ(kVideoSendSsrcs[0], header.ssrc) << "Unknown SSRC received."; | |
625 | |
626 // Parse RED header. | |
627 int encapsulated_payload_type = -1; | 621 int encapsulated_payload_type = -1; |
628 if (header.payloadType == kRedPayloadType) { | 622 if (header.payloadType == kRedPayloadType) { |
629 encapsulated_payload_type = | 623 encapsulated_payload_type = |
630 static_cast<int>(packet[header.headerLength]); | 624 static_cast<int>(packet[header.headerLength]); |
631 | 625 if (encapsulated_payload_type != kFakeVideoSendPayloadType) |
632 EXPECT_TRUE(encapsulated_payload_type == kFakeVideoSendPayloadType || | 626 EXPECT_EQ(kUlpfecPayloadType, encapsulated_payload_type); |
633 encapsulated_payload_type == kUlpfecPayloadType) | 627 } else { |
634 << "Unknown encapsulated payload type received."; | 628 EXPECT_EQ(kFakeVideoSendPayloadType, header.payloadType); |
635 } | 629 } |
636 | 630 |
637 // To reduce test flakiness, always let ULPFEC packets through. | 631 if (protected_sequence_numbers_.count(header.sequenceNumber) != 0) { |
638 if (encapsulated_payload_type == kUlpfecPayloadType) { | 632 // Retransmitted packet, should not count. |
| 633 protected_sequence_numbers_.erase(header.sequenceNumber); |
| 634 auto ts_it = protected_timestamps_.find(header.timestamp); |
| 635 EXPECT_NE(ts_it, protected_timestamps_.end()); |
| 636 protected_timestamps_.erase(ts_it); |
639 return SEND_PACKET; | 637 return SEND_PACKET; |
640 } | 638 } |
641 | 639 |
642 // Simulate 5% video packet loss after rampup period. Record the | 640 switch (state_) { |
643 // corresponding timestamps that were dropped. | 641 case kFirstPacket: |
644 if (num_packets_sent_++ > 100 && random_.Rand(1, 100) <= 5) { | 642 state_ = kDropEveryOtherPacketUntilUlpfec; |
645 if (encapsulated_payload_type == kFakeVideoSendPayloadType) { | 643 break; |
646 dropped_sequence_numbers_.insert(header.sequenceNumber); | 644 case kDropEveryOtherPacketUntilUlpfec: |
647 dropped_timestamps_.insert(header.timestamp); | 645 if (encapsulated_payload_type == kUlpfecPayloadType) { |
648 } | 646 state_ = kDropNextMediaPacket; |
649 | 647 return SEND_PACKET; |
650 return DROP_PACKET; | 648 } |
| 649 if (header.sequenceNumber % 2 == 0) |
| 650 return DROP_PACKET; |
| 651 break; |
| 652 case kDropNextMediaPacket: |
| 653 if (encapsulated_payload_type == kFakeVideoSendPayloadType) { |
| 654 protected_sequence_numbers_.insert(header.sequenceNumber); |
| 655 protected_timestamps_.insert(header.timestamp); |
| 656 state_ = kDropEveryOtherPacketUntilUlpfec; |
| 657 return DROP_PACKET; |
| 658 } |
| 659 break; |
651 } | 660 } |
652 | 661 |
653 return SEND_PACKET; | 662 return SEND_PACKET; |
654 } | 663 } |
655 | 664 |
656 void OnFrame(const VideoFrame& video_frame) override { | 665 void OnFrame(const VideoFrame& video_frame) override { |
657 rtc::CritScope lock(&crit_); | 666 rtc::CritScope lock(&crit_); |
658 // Rendering frame with timestamp of packet that was dropped -> FEC | 667 // Rendering frame with timestamp of packet that was dropped -> FEC |
659 // protection worked. | 668 // protection worked. |
660 auto it = dropped_timestamps_.find(video_frame.timestamp()); | 669 if (protected_timestamps_.count(video_frame.timestamp()) != 0) |
661 if (it != dropped_timestamps_.end()) { | |
662 observation_complete_.Set(); | 670 observation_complete_.Set(); |
663 } | |
664 } | 671 } |
665 | 672 |
| 673 enum { |
| 674 kFirstPacket, |
| 675 kDropEveryOtherPacketUntilUlpfec, |
| 676 kDropNextMediaPacket, |
| 677 } state_; |
| 678 |
666 void ModifyVideoConfigs( | 679 void ModifyVideoConfigs( |
667 VideoSendStream::Config* send_config, | 680 VideoSendStream::Config* send_config, |
668 std::vector<VideoReceiveStream::Config>* receive_configs, | 681 std::vector<VideoReceiveStream::Config>* receive_configs, |
669 VideoEncoderConfig* encoder_config) override { | 682 VideoEncoderConfig* encoder_config) override { |
670 send_config->rtp.extensions.push_back( | 683 // TODO(pbos): Run this test with combined NACK/ULPFEC enabled as well. |
671 RtpExtension(RtpExtension::kTransportSequenceNumberUri, | 684 // int rtp_history_ms = 1000; |
672 test::kTransportSequenceNumberExtensionId)); | 685 // (*receive_configs)[0].rtp.nack.rtp_history_ms = rtp_history_ms; |
| 686 // send_config->rtp.nack.rtp_history_ms = rtp_history_ms; |
673 send_config->rtp.ulpfec.red_payload_type = kRedPayloadType; | 687 send_config->rtp.ulpfec.red_payload_type = kRedPayloadType; |
674 send_config->rtp.ulpfec.ulpfec_payload_type = kUlpfecPayloadType; | 688 send_config->rtp.ulpfec.ulpfec_payload_type = kUlpfecPayloadType; |
675 | 689 |
676 (*receive_configs)[0].rtp.transport_cc = true; | |
677 (*receive_configs)[0].rtp.ulpfec.red_payload_type = kRedPayloadType; | 690 (*receive_configs)[0].rtp.ulpfec.red_payload_type = kRedPayloadType; |
678 (*receive_configs)[0].rtp.ulpfec.ulpfec_payload_type = kUlpfecPayloadType; | 691 (*receive_configs)[0].rtp.ulpfec.ulpfec_payload_type = kUlpfecPayloadType; |
679 (*receive_configs)[0].renderer = this; | 692 (*receive_configs)[0].renderer = this; |
680 } | 693 } |
681 | 694 |
682 void PerformTest() override { | 695 void PerformTest() override { |
683 EXPECT_TRUE(Wait()) | 696 EXPECT_TRUE(Wait()) |
684 << "Timed out waiting for dropped frames to be rendered."; | 697 << "Timed out waiting for dropped frames to be rendered."; |
685 } | 698 } |
686 | 699 |
687 rtc::CriticalSection crit_; | 700 rtc::CriticalSection crit_; |
688 std::set<uint32_t> dropped_sequence_numbers_ GUARDED_BY(crit_); | 701 std::set<uint32_t> protected_sequence_numbers_ GUARDED_BY(crit_); |
689 // Several packets can have the same timestamp. | 702 // Since several packets can have the same timestamp a multiset is used |
690 std::multiset<uint32_t> dropped_timestamps_ GUARDED_BY(crit_); | 703 // instead of a set. |
691 Random random_; | 704 std::multiset<uint32_t> protected_timestamps_ GUARDED_BY(crit_); |
692 int num_packets_sent_; | |
693 } test; | 705 } test; |
694 | 706 |
695 RunBaseTest(&test); | 707 RunBaseTest(&test); |
696 } | 708 } |
697 | 709 |
698 class FlexfecRenderObserver : public test::EndToEndTest, | 710 class FlexfecRenderObserver : public test::EndToEndTest, |
699 public rtc::VideoSinkInterface<VideoFrame> { | 711 public rtc::VideoSinkInterface<VideoFrame> { |
700 public: | 712 public: |
701 static constexpr uint32_t kVideoLocalSsrc = 123; | 713 static constexpr uint32_t kVideoLocalSsrc = 123; |
702 static constexpr uint32_t kFlexfecLocalSsrc = 456; | 714 static constexpr uint32_t kFlexfecLocalSsrc = 456; |
703 | 715 |
704 explicit FlexfecRenderObserver(bool enable_nack, bool expect_flexfec_rtcp) | 716 explicit FlexfecRenderObserver(bool expect_flexfec_rtcp) |
705 : test::EndToEndTest(test::CallTest::kDefaultTimeoutMs), | 717 : test::EndToEndTest(test::CallTest::kDefaultTimeoutMs), |
706 enable_nack_(enable_nack), | |
707 expect_flexfec_rtcp_(expect_flexfec_rtcp), | 718 expect_flexfec_rtcp_(expect_flexfec_rtcp), |
708 received_flexfec_rtcp_(false), | 719 received_flexfec_rtcp_(false), |
709 random_(0xcafef00d1), | 720 random_(0xcafef00d1) {} |
710 num_packets_sent_(0) {} | |
711 | 721 |
712 size_t GetNumFlexfecStreams() const override { return 1; } | 722 size_t GetNumFlexfecStreams() const override { return 1; } |
713 | 723 |
714 private: | 724 private: |
715 Action OnSendRtp(const uint8_t* packet, size_t length) override { | 725 Action OnSendRtp(const uint8_t* packet, size_t length) override { |
716 rtc::CritScope lock(&crit_); | 726 rtc::CritScope lock(&crit_); |
717 RTPHeader header; | 727 RTPHeader header; |
718 EXPECT_TRUE(parser_->Parse(packet, length, &header)); | 728 EXPECT_TRUE(parser_->Parse(packet, length, &header)); |
719 | 729 |
720 EXPECT_TRUE(header.payloadType == | 730 uint8_t payload_type = header.payloadType; |
721 test::CallTest::kFakeVideoSendPayloadType || | 731 if (payload_type != test::CallTest::kFakeVideoSendPayloadType) { |
722 header.payloadType == test::CallTest::kFlexfecPayloadType || | 732 EXPECT_EQ(test::CallTest::kFlexfecPayloadType, payload_type); |
723 (enable_nack_ && | |
724 header.payloadType == test::CallTest::kSendRtxPayloadType)) | |
725 << "Unknown payload type received."; | |
726 EXPECT_TRUE( | |
727 header.ssrc == test::CallTest::kVideoSendSsrcs[0] || | |
728 header.ssrc == test::CallTest::kFlexfecSendSsrc || | |
729 (enable_nack_ && header.ssrc == test::CallTest::kSendRtxSsrcs[0])) | |
730 << "Unknown SSRC received."; | |
731 | |
732 // To reduce test flakiness, always let FlexFEC packets through. | |
733 if (header.payloadType == test::CallTest::kFlexfecPayloadType) { | |
734 EXPECT_EQ(test::CallTest::kFlexfecSendSsrc, header.ssrc); | |
735 | |
736 return SEND_PACKET; | |
737 } | 733 } |
738 | 734 |
739 // To reduce test flakiness, always let RTX packets through. | 735 // Is this a retransmitted media packet? From the perspective of FEC, this |
740 if (header.payloadType == test::CallTest::kSendRtxPayloadType) { | 736 // packet is then no longer dropped, so remove it from the list of |
741 EXPECT_EQ(test::CallTest::kSendRtxSsrcs[0], header.ssrc); | 737 // dropped packets. |
742 | 738 if (payload_type == test::CallTest::kFakeVideoSendPayloadType) { |
743 // Parse RTX header. | 739 auto seq_num_it = dropped_sequence_numbers_.find(header.sequenceNumber); |
744 uint16_t original_sequence_number = | |
745 ByteReader<uint16_t>::ReadBigEndian(&packet[header.headerLength]); | |
746 | |
747 // From the perspective of FEC, a retransmitted packet is no longer | |
748 // dropped, so remove it from list of dropped packets. | |
749 auto seq_num_it = | |
750 dropped_sequence_numbers_.find(original_sequence_number); | |
751 if (seq_num_it != dropped_sequence_numbers_.end()) { | 740 if (seq_num_it != dropped_sequence_numbers_.end()) { |
752 dropped_sequence_numbers_.erase(seq_num_it); | 741 dropped_sequence_numbers_.erase(seq_num_it); |
753 auto ts_it = dropped_timestamps_.find(header.timestamp); | 742 auto ts_it = dropped_timestamps_.find(header.timestamp); |
754 EXPECT_NE(ts_it, dropped_timestamps_.end()); | 743 EXPECT_NE(ts_it, dropped_timestamps_.end()); |
755 dropped_timestamps_.erase(ts_it); | 744 dropped_timestamps_.erase(ts_it); |
| 745 |
| 746 return SEND_PACKET; |
756 } | 747 } |
757 | |
758 return SEND_PACKET; | |
759 } | 748 } |
760 | 749 |
761 // Simulate 5% video packet loss after rampup period. Record the | 750 // Simulate 5% packet loss. Record what media packets, and corresponding |
762 // corresponding timestamps that were dropped. | 751 // timestamps, that were dropped. |
763 if (num_packets_sent_++ > 100 && random_.Rand(1, 100) <= 5) { | 752 if (random_.Rand(1, 100) <= 5) { |
764 EXPECT_EQ(test::CallTest::kFakeVideoSendPayloadType, header.payloadType); | 753 if (payload_type == test::CallTest::kFakeVideoSendPayloadType) { |
765 EXPECT_EQ(test::CallTest::kVideoSendSsrcs[0], header.ssrc); | 754 dropped_sequence_numbers_.insert(header.sequenceNumber); |
766 | 755 dropped_timestamps_.insert(header.timestamp); |
767 dropped_sequence_numbers_.insert(header.sequenceNumber); | 756 } |
768 dropped_timestamps_.insert(header.timestamp); | |
769 | 757 |
770 return DROP_PACKET; | 758 return DROP_PACKET; |
771 } | 759 } |
772 | 760 |
773 return SEND_PACKET; | 761 return SEND_PACKET; |
774 } | 762 } |
775 | 763 |
776 Action OnReceiveRtcp(const uint8_t* data, size_t length) override { | 764 Action OnReceiveRtcp(const uint8_t* data, size_t length) override { |
777 test::RtcpPacketParser parser; | 765 test::RtcpPacketParser parser; |
778 | 766 |
779 parser.Parse(data, length); | 767 parser.Parse(data, length); |
780 if (parser.sender_ssrc() == kFlexfecLocalSsrc) { | 768 if (parser.sender_ssrc() == kFlexfecLocalSsrc) { |
781 EXPECT_EQ(1, parser.receiver_report()->num_packets()); | 769 EXPECT_EQ(1, parser.receiver_report()->num_packets()); |
782 const std::vector<rtcp::ReportBlock>& report_blocks = | 770 const std::vector<rtcp::ReportBlock>& report_blocks = |
783 parser.receiver_report()->report_blocks(); | 771 parser.receiver_report()->report_blocks(); |
784 if (!report_blocks.empty()) { | 772 if (!report_blocks.empty()) { |
785 EXPECT_EQ(1U, report_blocks.size()); | 773 EXPECT_EQ(1U, report_blocks.size()); |
786 EXPECT_EQ(test::CallTest::kFlexfecSendSsrc, | 774 EXPECT_EQ(test::CallTest::kFlexfecSendSsrc, |
787 report_blocks[0].source_ssrc()); | 775 report_blocks[0].source_ssrc()); |
788 rtc::CritScope lock(&crit_); | 776 rtc::CritScope lock(&crit_); |
789 received_flexfec_rtcp_ = true; | 777 received_flexfec_rtcp_ = true; |
790 } | 778 } |
791 } | 779 } |
792 | 780 |
793 return SEND_PACKET; | 781 return SEND_PACKET; |
794 } | 782 } |
795 | 783 |
796 test::PacketTransport* CreateSendTransport(Call* sender_call) override { | |
797 // At low RTT (< kLowRttNackMs) -> NACK only, no FEC. | |
798 const int kNetworkDelayMs = 100; | |
799 FakeNetworkPipe::Config config; | |
800 config.queue_delay_ms = kNetworkDelayMs; | |
801 return new test::PacketTransport(sender_call, this, | |
802 test::PacketTransport::kSender, config); | |
803 } | |
804 | |
805 void OnFrame(const VideoFrame& video_frame) override { | 784 void OnFrame(const VideoFrame& video_frame) override { |
806 rtc::CritScope lock(&crit_); | 785 rtc::CritScope lock(&crit_); |
807 // Rendering frame with timestamp of packet that was dropped -> FEC | 786 // Rendering frame with timestamp of packet that was dropped -> FEC |
808 // protection worked. | 787 // protection worked. |
809 auto it = dropped_timestamps_.find(video_frame.timestamp()); | 788 auto it = dropped_timestamps_.find(video_frame.timestamp()); |
810 if (it != dropped_timestamps_.end()) { | 789 if (it != dropped_timestamps_.end()) { |
811 if (!expect_flexfec_rtcp_ || received_flexfec_rtcp_) { | 790 if (!expect_flexfec_rtcp_ || received_flexfec_rtcp_) { |
812 observation_complete_.Set(); | 791 observation_complete_.Set(); |
813 } | 792 } |
814 } | 793 } |
815 } | 794 } |
816 | 795 |
817 void ModifyVideoConfigs( | 796 void ModifyVideoConfigs( |
818 VideoSendStream::Config* send_config, | 797 VideoSendStream::Config* send_config, |
819 std::vector<VideoReceiveStream::Config>* receive_configs, | 798 std::vector<VideoReceiveStream::Config>* receive_configs, |
820 VideoEncoderConfig* encoder_config) override { | 799 VideoEncoderConfig* encoder_config) override { |
821 send_config->rtp.extensions.push_back( | |
822 RtpExtension(RtpExtension::kTransportSequenceNumberUri, | |
823 test::kTransportSequenceNumberExtensionId)); | |
824 | |
825 (*receive_configs)[0].rtp.local_ssrc = kVideoLocalSsrc; | 800 (*receive_configs)[0].rtp.local_ssrc = kVideoLocalSsrc; |
826 (*receive_configs)[0].rtp.transport_cc = true; | |
827 (*receive_configs)[0].renderer = this; | 801 (*receive_configs)[0].renderer = this; |
828 | |
829 if (enable_nack_) { | |
830 send_config->rtp.nack.rtp_history_ms = test::CallTest::kNackRtpHistoryMs; | |
831 send_config->rtp.ulpfec.red_rtx_payload_type = | |
832 test::CallTest::kRtxRedPayloadType; | |
833 send_config->rtp.rtx.ssrcs.push_back(test::CallTest::kSendRtxSsrcs[0]); | |
834 send_config->rtp.rtx.payload_type = test::CallTest::kSendRtxPayloadType; | |
835 | |
836 (*receive_configs)[0].rtp.nack.rtp_history_ms = | |
837 test::CallTest::kNackRtpHistoryMs; | |
838 (*receive_configs)[0].rtp.ulpfec.red_rtx_payload_type = | |
839 test::CallTest::kRtxRedPayloadType; | |
840 | |
841 (*receive_configs)[0].rtp.rtx_ssrc = test::CallTest::kSendRtxSsrcs[0]; | |
842 (*receive_configs)[0] | |
843 .rtp.rtx_payload_types[test::CallTest::kVideoSendPayloadType] = | |
844 test::CallTest::kSendRtxPayloadType; | |
845 } | |
846 } | 802 } |
847 | 803 |
848 void ModifyFlexfecConfigs( | 804 void ModifyFlexfecConfigs( |
849 std::vector<FlexfecReceiveStream::Config>* receive_configs) override { | 805 std::vector<FlexfecReceiveStream::Config>* receive_configs) override { |
850 (*receive_configs)[0].local_ssrc = kFlexfecLocalSsrc; | 806 (*receive_configs)[0].local_ssrc = kFlexfecLocalSsrc; |
851 } | 807 } |
852 | 808 |
853 void PerformTest() override { | 809 void PerformTest() override { |
854 EXPECT_TRUE(Wait()) | 810 EXPECT_TRUE(Wait()) |
855 << "Timed out waiting for dropped frames to be rendered."; | 811 << "Timed out waiting for dropped frames to be rendered."; |
856 } | 812 } |
857 | 813 |
858 rtc::CriticalSection crit_; | 814 rtc::CriticalSection crit_; |
859 std::set<uint32_t> dropped_sequence_numbers_ GUARDED_BY(crit_); | 815 std::set<uint32_t> dropped_sequence_numbers_ GUARDED_BY(crit_); |
860 // Several packets can have the same timestamp. | 816 // Since several packets can have the same timestamp a multiset is used |
| 817 // instead of a set. |
861 std::multiset<uint32_t> dropped_timestamps_ GUARDED_BY(crit_); | 818 std::multiset<uint32_t> dropped_timestamps_ GUARDED_BY(crit_); |
862 const bool enable_nack_; | |
863 const bool expect_flexfec_rtcp_; | 819 const bool expect_flexfec_rtcp_; |
864 bool received_flexfec_rtcp_ GUARDED_BY(crit_); | 820 bool received_flexfec_rtcp_ GUARDED_BY(crit_); |
865 Random random_; | 821 Random random_; |
866 int num_packets_sent_; | |
867 }; | 822 }; |
868 | 823 |
869 TEST_P(EndToEndTest, RecoversWithFlexfec) { | 824 // Disable due to failure, see bugs.webrtc.org/7050 for |
870 FlexfecRenderObserver test(false, false); | 825 // details. |
| 826 TEST_P(EndToEndTest, DISABLED_ReceivesFlexfec) { |
| 827 FlexfecRenderObserver test(false); |
871 RunBaseTest(&test); | 828 RunBaseTest(&test); |
872 } | 829 } |
873 | 830 |
874 TEST_P(EndToEndTest, RecoversWithFlexfecAndNack) { | 831 // Disable due to failure, see bugs.webrtc.org/7050 for |
875 FlexfecRenderObserver test(true, false); | 832 // details. |
| 833 TEST_P(EndToEndTest, DISABLED_ReceivesFlexfecAndSendsCorrespondingRtcp) { |
| 834 FlexfecRenderObserver test(true); |
876 RunBaseTest(&test); | 835 RunBaseTest(&test); |
877 } | 836 } |
878 | 837 |
879 TEST_P(EndToEndTest, RecoversWithFlexfecAndSendsCorrespondingRtcp) { | |
880 FlexfecRenderObserver test(false, true); | |
881 RunBaseTest(&test); | |
882 } | |
883 | |
884 TEST_P(EndToEndTest, ReceivedUlpfecPacketsNotNacked) { | 838 TEST_P(EndToEndTest, ReceivedUlpfecPacketsNotNacked) { |
885 class UlpfecNackObserver : public test::EndToEndTest { | 839 class UlpfecNackObserver : public test::EndToEndTest { |
886 public: | 840 public: |
887 UlpfecNackObserver() | 841 UlpfecNackObserver() |
888 : EndToEndTest(kDefaultTimeoutMs), | 842 : EndToEndTest(kDefaultTimeoutMs), |
889 state_(kFirstPacket), | 843 state_(kFirstPacket), |
890 ulpfec_sequence_number_(0), | 844 ulpfec_sequence_number_(0), |
891 has_last_sequence_number_(false), | 845 has_last_sequence_number_(false), |
892 last_sequence_number_(0), | 846 last_sequence_number_(0), |
893 encoder_(VP8Encoder::Create()), | 847 encoder_(VP8Encoder::Create()), |
(...skipping 3285 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4179 std::unique_ptr<VideoEncoder> encoder_; | 4133 std::unique_ptr<VideoEncoder> encoder_; |
4180 std::unique_ptr<VideoDecoder> decoder_; | 4134 std::unique_ptr<VideoDecoder> decoder_; |
4181 rtc::CriticalSection crit_; | 4135 rtc::CriticalSection crit_; |
4182 int recorded_frames_ GUARDED_BY(crit_); | 4136 int recorded_frames_ GUARDED_BY(crit_); |
4183 } test(this); | 4137 } test(this); |
4184 | 4138 |
4185 RunBaseTest(&test); | 4139 RunBaseTest(&test); |
4186 } | 4140 } |
4187 | 4141 |
4188 } // namespace webrtc | 4142 } // namespace webrtc |
OLD | NEW |