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 566 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 Loading... |
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, |
| 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(nacks.begin(), nacks.end(), |
| 672 fec_sequence_number_) == nacks.end()) |
| 673 << "Got nack for FEC packet"; |
656 if (!nacks.empty() && | 674 if (!nacks.empty() && |
657 IsNewerSequenceNumber(nacks.back(), fec_sequence_number_)) { | 675 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(); | 676 observation_complete_.Set(); |
661 } | 677 } |
662 } | 678 } |
663 return SEND_PACKET; | 679 return SEND_PACKET; |
664 } | 680 } |
665 | 681 |
666 test::PacketTransport* CreateSendTransport(Call* sender_call) override { | 682 test::PacketTransport* CreateSendTransport(Call* sender_call) override { |
667 // At low RTT (< kLowRttNackMs) -> NACK only, no FEC. | 683 // At low RTT (< kLowRttNackMs) -> NACK only, no FEC. |
668 // Configure some network delay. | 684 // Configure some network delay. |
669 const int kNetworkDelayMs = 50; | 685 const int kNetworkDelayMs = 50; |
(...skipping 13 matching lines...) Expand all Loading... |
683 } | 699 } |
684 | 700 |
685 void ModifyVideoConfigs( | 701 void ModifyVideoConfigs( |
686 VideoSendStream::Config* send_config, | 702 VideoSendStream::Config* send_config, |
687 std::vector<VideoReceiveStream::Config>* receive_configs, | 703 std::vector<VideoReceiveStream::Config>* receive_configs, |
688 VideoEncoderConfig* encoder_config) override { | 704 VideoEncoderConfig* encoder_config) override { |
689 // Configure hybrid NACK/FEC. | 705 // Configure hybrid NACK/FEC. |
690 send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs; | 706 send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs; |
691 send_config->rtp.fec.red_payload_type = kRedPayloadType; | 707 send_config->rtp.fec.red_payload_type = kRedPayloadType; |
692 send_config->rtp.fec.ulpfec_payload_type = kUlpfecPayloadType; | 708 send_config->rtp.fec.ulpfec_payload_type = kUlpfecPayloadType; |
| 709 // Set codec to VP8, otherwise NACK/FEC hybrid will be disabled. |
| 710 send_config->encoder_settings.encoder = encoder_.get(); |
| 711 send_config->encoder_settings.payload_name = "VP8"; |
| 712 send_config->encoder_settings.payload_type = kFakeVideoSendPayloadType; |
| 713 encoder_config->streams[0].min_bitrate_bps = 50000; |
| 714 encoder_config->streams[0].max_bitrate_bps = |
| 715 encoder_config->streams[0].target_bitrate_bps = 2000000; |
| 716 |
693 (*receive_configs)[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs; | 717 (*receive_configs)[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs; |
694 (*receive_configs)[0].rtp.fec.red_payload_type = kRedPayloadType; | 718 (*receive_configs)[0].rtp.fec.red_payload_type = kRedPayloadType; |
695 (*receive_configs)[0].rtp.fec.ulpfec_payload_type = kUlpfecPayloadType; | 719 (*receive_configs)[0].rtp.fec.ulpfec_payload_type = kUlpfecPayloadType; |
| 720 |
| 721 (*receive_configs)[0].decoders.resize(1); |
| 722 (*receive_configs)[0].decoders[0].payload_type = |
| 723 send_config->encoder_settings.payload_type; |
| 724 (*receive_configs)[0].decoders[0].payload_name = |
| 725 send_config->encoder_settings.payload_name; |
| 726 (*receive_configs)[0].decoders[0].decoder = decoder_.get(); |
696 } | 727 } |
697 | 728 |
698 void PerformTest() override { | 729 void PerformTest() override { |
699 EXPECT_TRUE(Wait()) | 730 EXPECT_TRUE(Wait()) |
700 << "Timed out while waiting for FEC packets to be received."; | 731 << "Timed out while waiting for FEC packets to be received."; |
701 } | 732 } |
702 | 733 |
703 enum { | 734 enum { |
704 kFirstPacket, | 735 kFirstPacket, |
705 kDropEveryOtherPacketUntilFec, | 736 kDropEveryOtherPacketUntilFec, |
706 kDropAllMediaPacketsUntilFec, | 737 kDropAllMediaPacketsUntilFec, |
| 738 kDropOneMediaPacket, |
| 739 kPassOneMediaPacket, |
707 kVerifyFecPacketNotInNackList, | 740 kVerifyFecPacketNotInNackList, |
708 } state_; | 741 } state_; |
709 | 742 |
710 rtc::CriticalSection crit_; | 743 rtc::CriticalSection crit_; |
711 uint16_t fec_sequence_number_ GUARDED_BY(&crit_); | 744 uint16_t fec_sequence_number_ GUARDED_BY(&crit_); |
712 bool has_last_sequence_number_; | 745 bool has_last_sequence_number_; |
713 uint16_t last_sequence_number_; | 746 uint16_t last_sequence_number_; |
| 747 std::unique_ptr<webrtc::VideoEncoder> encoder_; |
| 748 std::unique_ptr<webrtc::VideoDecoder> decoder_; |
714 } test; | 749 } test; |
715 | 750 |
716 RunBaseTest(&test); | 751 RunBaseTest(&test); |
717 } | 752 } |
718 | 753 |
719 // This test drops second RTP packet with a marker bit set, makes sure it's | 754 // This test drops second RTP packet with a marker bit set, makes sure it's |
720 // retransmitted and renders. Retransmission SSRCs are also checked. | 755 // retransmitted and renders. Retransmission SSRCs are also checked. |
721 void EndToEndTest::DecodesRetransmittedFrame(bool enable_rtx, bool enable_red) { | 756 void EndToEndTest::DecodesRetransmittedFrame(bool enable_rtx, bool enable_red) { |
722 static const int kDroppedFrameNumber = 10; | 757 static const int kDroppedFrameNumber = 10; |
723 class RetransmissionObserver : public test::EndToEndTest, | 758 class RetransmissionObserver : public test::EndToEndTest, |
(...skipping 2774 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3498 private: | 3533 private: |
3499 bool video_observed_; | 3534 bool video_observed_; |
3500 bool audio_observed_; | 3535 bool audio_observed_; |
3501 SequenceNumberUnwrapper unwrapper_; | 3536 SequenceNumberUnwrapper unwrapper_; |
3502 std::set<int64_t> received_packet_ids_; | 3537 std::set<int64_t> received_packet_ids_; |
3503 } test; | 3538 } test; |
3504 | 3539 |
3505 RunBaseTest(&test); | 3540 RunBaseTest(&test); |
3506 } | 3541 } |
3507 } // namespace webrtc | 3542 } // namespace webrtc |
OLD | NEW |