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

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

Issue 2017713002: Reenable EndToEndTest.ReceivedFecPacketsNotNacked (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: fix flakiness Created 4 years, 6 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 566 matching lines...) Expand 10 before | Expand all | Expand 10 after
577 } 577 }
578 578
579 rtc::CriticalSection crit_; 579 rtc::CriticalSection crit_;
580 std::set<uint32_t> protected_sequence_numbers_ GUARDED_BY(crit_); 580 std::set<uint32_t> protected_sequence_numbers_ GUARDED_BY(crit_);
581 std::set<uint32_t> protected_timestamps_ GUARDED_BY(crit_); 581 std::set<uint32_t> protected_timestamps_ GUARDED_BY(crit_);
582 } test; 582 } test;
583 583
584 RunBaseTest(&test); 584 RunBaseTest(&test);
585 } 585 }
586 586
587 // Flacky on all platforms. See webrtc:4328. 587 TEST_F(EndToEndTest, ReceivedFecPacketsNotNacked) {
588 TEST_F(EndToEndTest, DISABLED_ReceivedFecPacketsNotNacked) {
589 class FecNackObserver : public test::EndToEndTest { 588 class FecNackObserver : public test::EndToEndTest {
590 public: 589 public:
591 FecNackObserver() 590 FecNackObserver()
592 : EndToEndTest(kDefaultTimeoutMs), 591 : EndToEndTest(kDefaultTimeoutMs),
593 state_(kFirstPacket), 592 state_(kFirstPacket),
594 fec_sequence_number_(0), 593 fec_sequence_number_(0),
595 has_last_sequence_number_(false), 594 has_last_sequence_number_(false),
596 last_sequence_number_(0) {} 595 last_sequence_number_(0),
596 encoder_(VideoEncoder::Create(VideoEncoder::EncoderType::kVp8)),
597 decoder_(VP8Decoder::Create()) {}
597 598
598 private: 599 private:
599 Action OnSendRtp(const uint8_t* packet, size_t length) override { 600 Action OnSendRtp(const uint8_t* packet, size_t length) override {
600 rtc::CritScope lock_(&crit_); 601 rtc::CritScope lock_(&crit_);
601 RTPHeader header; 602 RTPHeader header;
602 EXPECT_TRUE(parser_->Parse(packet, length, &header)); 603 EXPECT_TRUE(parser_->Parse(packet, length, &header));
603 604
604 int encapsulated_payload_type = -1; 605 int encapsulated_payload_type = -1;
605 if (header.payloadType == kRedPayloadType) { 606 if (header.payloadType == kRedPayloadType) {
606 encapsulated_payload_type = 607 encapsulated_payload_type =
(...skipping 22 matching lines...) Expand all
629 if (fec_packet) { 630 if (fec_packet) {
630 state_ = kDropAllMediaPacketsUntilFec; 631 state_ = kDropAllMediaPacketsUntilFec;
631 } else if (header.sequenceNumber % 2 == 0) { 632 } else if (header.sequenceNumber % 2 == 0) {
632 return DROP_PACKET; 633 return DROP_PACKET;
633 } 634 }
634 break; 635 break;
635 case kDropAllMediaPacketsUntilFec: 636 case kDropAllMediaPacketsUntilFec:
636 if (!fec_packet) 637 if (!fec_packet)
637 return DROP_PACKET; 638 return DROP_PACKET;
638 fec_sequence_number_ = header.sequenceNumber; 639 fec_sequence_number_ = header.sequenceNumber;
640 state_ = kDropOneMediaPacket;
641 break;
642 case kDropOneMediaPacket:
643 if (fec_packet)
644 return DROP_PACKET;
645 state_ = kPassOneMediaPacket;
646 return DROP_PACKET;
647 break;
648 case kPassOneMediaPacket:
649 if (fec_packet)
650 return DROP_PACKET;
651 // Pass one media packet after dropped packet after last fec,
pbos-webrtc 2016/05/27 11:53:25 FEC
danilchap 2016/05/27 12:11:57 Done.
652 // otherwise receiver might never see a seq_no after
653 // |fec_sequence_number_|
639 state_ = kVerifyFecPacketNotInNackList; 654 state_ = kVerifyFecPacketNotInNackList;
640 break; 655 break;
641 case kVerifyFecPacketNotInNackList: 656 case kVerifyFecPacketNotInNackList:
642 // Continue to drop packets. Make sure no frame can be decoded. 657 // Continue to drop packets. Make sure no frame can be decoded.
643 if (fec_packet || header.sequenceNumber % 2 == 0) 658 if (fec_packet || header.sequenceNumber % 2 == 0)
644 return DROP_PACKET; 659 return DROP_PACKET;
645 break; 660 break;
646 } 661 }
647 return SEND_PACKET; 662 return SEND_PACKET;
648 } 663 }
649 664
650 Action OnReceiveRtcp(const uint8_t* packet, size_t length) override { 665 Action OnReceiveRtcp(const uint8_t* packet, size_t length) override {
651 rtc::CritScope lock_(&crit_); 666 rtc::CritScope lock_(&crit_);
652 if (state_ == kVerifyFecPacketNotInNackList) { 667 if (state_ == kVerifyFecPacketNotInNackList) {
653 test::RtcpPacketParser rtcp_parser; 668 test::RtcpPacketParser rtcp_parser;
654 rtcp_parser.Parse(packet, length); 669 rtcp_parser.Parse(packet, length);
655 std::vector<uint16_t> nacks = rtcp_parser.nack_item()->last_nack_list(); 670 std::vector<uint16_t> nacks = rtcp_parser.nack_item()->last_nack_list();
671 EXPECT_TRUE(std::find(
672 nacks.begin(), nacks.end(), fec_sequence_number_) == nacks.end());
pbos-webrtc 2016/05/27 11:53:25 Add a << "error message" to this explaining what w
danilchap 2016/05/27 12:11:57 Done.
656 if (!nacks.empty() && 673 if (!nacks.empty() &&
657 IsNewerSequenceNumber(nacks.back(), fec_sequence_number_)) { 674 IsNewerSequenceNumber(nacks.back(), fec_sequence_number_)) {
658 EXPECT_TRUE(std::find(
659 nacks.begin(), nacks.end(), fec_sequence_number_) == nacks.end());
660 observation_complete_.Set(); 675 observation_complete_.Set();
661 } 676 }
662 } 677 }
663 return SEND_PACKET; 678 return SEND_PACKET;
664 } 679 }
665 680
666 test::PacketTransport* CreateSendTransport(Call* sender_call) override { 681 test::PacketTransport* CreateSendTransport(Call* sender_call) override {
667 // At low RTT (< kLowRttNackMs) -> NACK only, no FEC. 682 // At low RTT (< kLowRttNackMs) -> NACK only, no FEC.
668 // Configure some network delay. 683 // Configure some network delay.
669 const int kNetworkDelayMs = 50; 684 const int kNetworkDelayMs = 50;
(...skipping 13 matching lines...) Expand all
683 } 698 }
684 699
685 void ModifyVideoConfigs( 700 void ModifyVideoConfigs(
686 VideoSendStream::Config* send_config, 701 VideoSendStream::Config* send_config,
687 std::vector<VideoReceiveStream::Config>* receive_configs, 702 std::vector<VideoReceiveStream::Config>* receive_configs,
688 VideoEncoderConfig* encoder_config) override { 703 VideoEncoderConfig* encoder_config) override {
689 // Configure hybrid NACK/FEC. 704 // Configure hybrid NACK/FEC.
690 send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs; 705 send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
691 send_config->rtp.fec.red_payload_type = kRedPayloadType; 706 send_config->rtp.fec.red_payload_type = kRedPayloadType;
692 send_config->rtp.fec.ulpfec_payload_type = kUlpfecPayloadType; 707 send_config->rtp.fec.ulpfec_payload_type = kUlpfecPayloadType;
708 // Set codec to VP8, otherwise NACK/FEC hybrid will be disabled.
709 send_config->encoder_settings.encoder = encoder_.get();
710 send_config->encoder_settings.payload_name = "VP8";
pbos-webrtc 2016/05/27 11:53:25 For the future (if this goes flaky on DrMemory or
711 send_config->encoder_settings.payload_type = kFakeVideoSendPayloadType;
712 encoder_config->streams[0].min_bitrate_bps = 50000;
713 encoder_config->streams[0].max_bitrate_bps =
714 encoder_config->streams[0].target_bitrate_bps = 2000000;
715
693 (*receive_configs)[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs; 716 (*receive_configs)[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
694 (*receive_configs)[0].rtp.fec.red_payload_type = kRedPayloadType; 717 (*receive_configs)[0].rtp.fec.red_payload_type = kRedPayloadType;
695 (*receive_configs)[0].rtp.fec.ulpfec_payload_type = kUlpfecPayloadType; 718 (*receive_configs)[0].rtp.fec.ulpfec_payload_type = kUlpfecPayloadType;
719
720 (*receive_configs)[0].decoders.resize(1);
721 (*receive_configs)[0].decoders[0].payload_type =
722 send_config->encoder_settings.payload_type;
723 (*receive_configs)[0].decoders[0].payload_name =
724 send_config->encoder_settings.payload_name;
725 (*receive_configs)[0].decoders[0].decoder = decoder_.get();
696 } 726 }
697 727
698 void PerformTest() override { 728 void PerformTest() override {
699 EXPECT_TRUE(Wait()) 729 EXPECT_TRUE(Wait())
700 << "Timed out while waiting for FEC packets to be received."; 730 << "Timed out while waiting for FEC packets to be received.";
701 } 731 }
702 732
703 enum { 733 enum {
704 kFirstPacket, 734 kFirstPacket,
705 kDropEveryOtherPacketUntilFec, 735 kDropEveryOtherPacketUntilFec,
706 kDropAllMediaPacketsUntilFec, 736 kDropAllMediaPacketsUntilFec,
737 kDropOneMediaPacket,
738 kPassOneMediaPacket,
707 kVerifyFecPacketNotInNackList, 739 kVerifyFecPacketNotInNackList,
708 } state_; 740 } state_;
709 741
710 rtc::CriticalSection crit_; 742 rtc::CriticalSection crit_;
711 uint16_t fec_sequence_number_ GUARDED_BY(&crit_); 743 uint16_t fec_sequence_number_ GUARDED_BY(&crit_);
712 bool has_last_sequence_number_; 744 bool has_last_sequence_number_;
713 uint16_t last_sequence_number_; 745 uint16_t last_sequence_number_;
746 std::unique_ptr<webrtc::VideoEncoder> encoder_;
747 std::unique_ptr<webrtc::VideoDecoder> decoder_;
714 } test; 748 } test;
715 749
716 RunBaseTest(&test); 750 RunBaseTest(&test);
717 } 751 }
718 752
719 // This test drops second RTP packet with a marker bit set, makes sure it's 753 // This test drops second RTP packet with a marker bit set, makes sure it's
720 // retransmitted and renders. Retransmission SSRCs are also checked. 754 // retransmitted and renders. Retransmission SSRCs are also checked.
721 void EndToEndTest::DecodesRetransmittedFrame(bool enable_rtx, bool enable_red) { 755 void EndToEndTest::DecodesRetransmittedFrame(bool enable_rtx, bool enable_red) {
722 static const int kDroppedFrameNumber = 10; 756 static const int kDroppedFrameNumber = 10;
723 class RetransmissionObserver : public test::EndToEndTest, 757 class RetransmissionObserver : public test::EndToEndTest,
(...skipping 2774 matching lines...) Expand 10 before | Expand all | Expand 10 after
3498 private: 3532 private:
3499 bool video_observed_; 3533 bool video_observed_;
3500 bool audio_observed_; 3534 bool audio_observed_;
3501 SequenceNumberUnwrapper unwrapper_; 3535 SequenceNumberUnwrapper unwrapper_;
3502 std::set<int64_t> received_packet_ids_; 3536 std::set<int64_t> received_packet_ids_;
3503 } test; 3537 } test;
3504 3538
3505 RunBaseTest(&test); 3539 RunBaseTest(&test);
3506 } 3540 }
3507 } // namespace webrtc 3541 } // 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