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, | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |