Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(521)

Side by Side Diff: webrtc/video/end_to_end_tests.cc

Issue 2675573004: Improve and re-enable FEC end-to-end tests. (Closed)
Patch Set: Minimal rebase. Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698