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