| 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 364 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 375 | 375 |
| 376 private: | 376 private: |
| 377 Action OnSendRtp(const uint8_t* packet, size_t length) override { | 377 Action OnSendRtp(const uint8_t* packet, size_t length) override { |
| 378 RTPHeader header; | 378 RTPHeader header; |
| 379 EXPECT_TRUE(rtp_parser_->Parse(packet, length, &header)); | 379 EXPECT_TRUE(rtp_parser_->Parse(packet, length, &header)); |
| 380 | 380 |
| 381 // Never drop retransmitted packets. | 381 // Never drop retransmitted packets. |
| 382 if (dropped_packets_.find(header.sequenceNumber) != | 382 if (dropped_packets_.find(header.sequenceNumber) != |
| 383 dropped_packets_.end()) { | 383 dropped_packets_.end()) { |
| 384 retransmitted_packets_.insert(header.sequenceNumber); | 384 retransmitted_packets_.insert(header.sequenceNumber); |
| 385 if (nacks_left_ == 0 && | 385 if (nacks_left_ <= 0 && |
| 386 retransmitted_packets_.size() == dropped_packets_.size()) { | 386 retransmitted_packets_.size() == dropped_packets_.size()) { |
| 387 observation_complete_->Set(); | 387 observation_complete_->Set(); |
| 388 } | 388 } |
| 389 return SEND_PACKET; | 389 return SEND_PACKET; |
| 390 } | 390 } |
| 391 | 391 |
| 392 ++sent_rtp_packets_; | 392 ++sent_rtp_packets_; |
| 393 | 393 |
| 394 // Enough NACKs received, stop dropping packets. | 394 // Enough NACKs received, stop dropping packets. |
| 395 if (nacks_left_ == 0) | 395 if (nacks_left_ <= 0) |
| 396 return SEND_PACKET; | 396 return SEND_PACKET; |
| 397 | 397 |
| 398 // Check if it's time for a new loss burst. | 398 // Check if it's time for a new loss burst. |
| 399 if (sent_rtp_packets_ % kPacketsBetweenLossBursts == 0) | 399 if (sent_rtp_packets_ % kPacketsBetweenLossBursts == 0) |
| 400 packets_left_to_drop_ = kLossBurstSize; | 400 packets_left_to_drop_ = kLossBurstSize; |
| 401 | 401 |
| 402 // Never drop padding packets as those won't be retransmitted. | 402 // Never drop padding packets as those won't be retransmitted. |
| 403 if (packets_left_to_drop_ > 0 && header.paddingLength == 0) { | 403 if (packets_left_to_drop_ > 0 && header.paddingLength == 0) { |
| 404 --packets_left_to_drop_; | 404 --packets_left_to_drop_; |
| 405 dropped_packets_.insert(header.sequenceNumber); | 405 dropped_packets_.insert(header.sequenceNumber); |
| (...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 671 bool has_last_sequence_number_; | 671 bool has_last_sequence_number_; |
| 672 uint16_t last_sequence_number_; | 672 uint16_t last_sequence_number_; |
| 673 } test(config); | 673 } test(config); |
| 674 | 674 |
| 675 RunBaseTest(&test); | 675 RunBaseTest(&test); |
| 676 } | 676 } |
| 677 | 677 |
| 678 // This test drops second RTP packet with a marker bit set, makes sure it's | 678 // This test drops second RTP packet with a marker bit set, makes sure it's |
| 679 // retransmitted and renders. Retransmission SSRCs are also checked. | 679 // retransmitted and renders. Retransmission SSRCs are also checked. |
| 680 void EndToEndTest::DecodesRetransmittedFrame(bool use_rtx, bool use_red) { | 680 void EndToEndTest::DecodesRetransmittedFrame(bool use_rtx, bool use_red) { |
| 681 static const int kDroppedFrameNumber = 2; | 681 // Must be set high enough to allow the bitrate probing to finish. |
| 682 static const int kMinProbePackets = 30; |
| 683 static const int kDroppedFrameNumber = kMinProbePackets + 1; |
| 682 class RetransmissionObserver : public test::EndToEndTest, | 684 class RetransmissionObserver : public test::EndToEndTest, |
| 683 public I420FrameCallback { | 685 public I420FrameCallback { |
| 684 public: | 686 public: |
| 685 explicit RetransmissionObserver(bool use_rtx, bool use_red) | 687 explicit RetransmissionObserver(bool use_rtx, bool use_red) |
| 686 : EndToEndTest(kDefaultTimeoutMs), | 688 : EndToEndTest(kDefaultTimeoutMs), |
| 687 payload_type_(GetPayloadType(false, use_red)), | 689 payload_type_(GetPayloadType(false, use_red)), |
| 688 retransmission_ssrc_(use_rtx ? kSendRtxSsrcs[0] : kSendSsrcs[0]), | 690 retransmission_ssrc_(use_rtx ? kSendRtxSsrcs[0] : kSendSsrcs[0]), |
| 689 retransmission_payload_type_(GetPayloadType(use_rtx, use_red)), | 691 retransmission_payload_type_(GetPayloadType(use_rtx, use_red)), |
| 690 marker_bits_observed_(0), | 692 marker_bits_observed_(0), |
| 693 num_packets_observed_(0), |
| 691 retransmitted_timestamp_(0), | 694 retransmitted_timestamp_(0), |
| 692 frame_retransmitted_(false) {} | 695 frame_retransmitted_(false) {} |
| 693 | 696 |
| 694 private: | 697 private: |
| 695 Action OnSendRtp(const uint8_t* packet, size_t length) override { | 698 Action OnSendRtp(const uint8_t* packet, size_t length) override { |
| 696 RTPHeader header; | 699 RTPHeader header; |
| 697 EXPECT_TRUE(parser_->Parse(packet, length, &header)); | 700 EXPECT_TRUE(parser_->Parse(packet, length, &header)); |
| 698 | 701 |
| 702 // We accept some padding or RTX packets in the beginning to enable |
| 703 // bitrate probing. |
| 704 if (num_packets_observed_++ < kMinProbePackets && |
| 705 header.payloadType != payload_type_) { |
| 706 EXPECT_TRUE(retransmission_payload_type_ == header.payloadType || |
| 707 length == header.headerLength + header.paddingLength); |
| 708 return SEND_PACKET; |
| 709 } |
| 699 if (header.timestamp == retransmitted_timestamp_) { | 710 if (header.timestamp == retransmitted_timestamp_) { |
| 700 EXPECT_EQ(retransmission_ssrc_, header.ssrc); | 711 EXPECT_EQ(retransmission_ssrc_, header.ssrc); |
| 701 EXPECT_EQ(retransmission_payload_type_, header.payloadType); | 712 EXPECT_EQ(retransmission_payload_type_, header.payloadType); |
| 702 frame_retransmitted_ = true; | 713 frame_retransmitted_ = true; |
| 703 return SEND_PACKET; | 714 return SEND_PACKET; |
| 704 } | 715 } |
| 705 | 716 |
| 706 EXPECT_EQ(kSendSsrcs[0], header.ssrc); | 717 EXPECT_EQ(kSendSsrcs[0], header.ssrc); |
| 707 EXPECT_EQ(payload_type_, header.payloadType); | 718 EXPECT_EQ(payload_type_, header.payloadType); |
| 708 | 719 |
| 709 // Found the second frame's final packet, drop this and expect a | 720 // Found the final packet of the frame to inflict loss to, drop this and |
| 710 // retransmission. | 721 // expect a retransmission. |
| 711 if (header.markerBit && ++marker_bits_observed_ == kDroppedFrameNumber) { | 722 if (header.markerBit && ++marker_bits_observed_ == kDroppedFrameNumber) { |
| 712 retransmitted_timestamp_ = header.timestamp; | 723 retransmitted_timestamp_ = header.timestamp; |
| 713 return DROP_PACKET; | 724 return DROP_PACKET; |
| 714 } | 725 } |
| 715 | 726 |
| 716 return SEND_PACKET; | 727 return SEND_PACKET; |
| 717 } | 728 } |
| 718 | 729 |
| 719 void FrameCallback(VideoFrame* frame) override { | 730 void FrameCallback(VideoFrame* frame) override { |
| 720 rtc::CritScope lock(&crit_); | 731 rtc::CritScope lock(&crit_); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 755 | 766 |
| 756 int GetPayloadType(bool use_rtx, bool use_red) { | 767 int GetPayloadType(bool use_rtx, bool use_red) { |
| 757 return use_rtx ? kSendRtxPayloadType | 768 return use_rtx ? kSendRtxPayloadType |
| 758 : (use_red ? kRedPayloadType : kFakeSendPayloadType); | 769 : (use_red ? kRedPayloadType : kFakeSendPayloadType); |
| 759 } | 770 } |
| 760 | 771 |
| 761 const int payload_type_; | 772 const int payload_type_; |
| 762 const uint32_t retransmission_ssrc_; | 773 const uint32_t retransmission_ssrc_; |
| 763 const int retransmission_payload_type_; | 774 const int retransmission_payload_type_; |
| 764 int marker_bits_observed_; | 775 int marker_bits_observed_; |
| 776 int num_packets_observed_; |
| 765 uint32_t retransmitted_timestamp_; | 777 uint32_t retransmitted_timestamp_; |
| 766 bool frame_retransmitted_; | 778 bool frame_retransmitted_; |
| 767 } test(use_rtx, use_red); | 779 } test(use_rtx, use_red); |
| 768 | 780 |
| 769 RunBaseTest(&test); | 781 RunBaseTest(&test); |
| 770 } | 782 } |
| 771 | 783 |
| 772 TEST_F(EndToEndTest, DecodesRetransmittedFrame) { | 784 TEST_F(EndToEndTest, DecodesRetransmittedFrame) { |
| 773 DecodesRetransmittedFrame(false, false); | 785 DecodesRetransmittedFrame(false, false); |
| 774 } | 786 } |
| (...skipping 2272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3047 EXPECT_TRUE(default_receive_config.rtp.rtx.empty()) | 3059 EXPECT_TRUE(default_receive_config.rtp.rtx.empty()) |
| 3048 << "Enabling RTX requires rtpmap: rtx negotiation."; | 3060 << "Enabling RTX requires rtpmap: rtx negotiation."; |
| 3049 EXPECT_TRUE(default_receive_config.rtp.extensions.empty()) | 3061 EXPECT_TRUE(default_receive_config.rtp.extensions.empty()) |
| 3050 << "Enabling RTP extensions require negotiation."; | 3062 << "Enabling RTP extensions require negotiation."; |
| 3051 | 3063 |
| 3052 VerifyEmptyNackConfig(default_receive_config.rtp.nack); | 3064 VerifyEmptyNackConfig(default_receive_config.rtp.nack); |
| 3053 VerifyEmptyFecConfig(default_receive_config.rtp.fec); | 3065 VerifyEmptyFecConfig(default_receive_config.rtp.fec); |
| 3054 } | 3066 } |
| 3055 | 3067 |
| 3056 } // namespace webrtc | 3068 } // namespace webrtc |
| OLD | NEW |