diff --git a/webrtc/modules/rtp_rtcp/source/rtp_sender.cc b/webrtc/modules/rtp_rtcp/source/rtp_sender.cc index 252ffb2a3e..9d134afbcc 100644 --- a/webrtc/modules/rtp_rtcp/source/rtp_sender.cc +++ b/webrtc/modules/rtp_rtcp/source/rtp_sender.cc @@ -695,6 +695,7 @@ int32_t RTPSender::ReSendPacket(uint16_t packet_id, int64_t min_resend_time) { size_t length = IP_PACKET_SIZE; uint8_t data_buffer[IP_PACKET_SIZE]; int64_t capture_time_ms; + if (!packet_history_.GetPacketAndSetSendTime(packet_id, min_resend_time, true, data_buffer, &length, &capture_time_ms)) { @@ -922,8 +923,8 @@ bool RTPSender::PrepareAndSendPacket(uint8_t* buffer, // TODO(sprang): Potentially too much overhead in IsRegistered()? bool using_transport_seq = rtp_header_extension_map_.IsRegistered( kRtpExtensionTransportSequenceNumber) && - transport_sequence_number_allocator_ && - !is_retransmit; + transport_sequence_number_allocator_; + PacketOptions options; if (using_transport_seq) { options.packet_id = diff --git a/webrtc/video/end_to_end_tests.cc b/webrtc/video/end_to_end_tests.cc index 305dcb0aaf..715399adbe 100644 --- a/webrtc/video/end_to_end_tests.cc +++ b/webrtc/video/end_to_end_tests.cc @@ -20,6 +20,7 @@ #include "webrtc/call.h" #include "webrtc/call/transport_adapter.h" #include "webrtc/frame_callback.h" +#include "webrtc/modules/rtp_rtcp/source/byte_io.h" #include "webrtc/modules/rtp_rtcp/source/rtcp_utility.h" #include "webrtc/modules/video_coding/codecs/vp8/include/vp8.h" #include "webrtc/modules/video_coding/codecs/vp9/include/vp9.h" @@ -1335,9 +1336,6 @@ TEST_F(EndToEndTest, SendsAndReceivesMultipleStreams) { } TEST_F(EndToEndTest, AssignsTransportSequenceNumbers) { - // TODO(sprang): Extend this to verify received values once send-side BWE - // is in place. - static const int kExtensionId = 5; class RtpExtensionHeaderObserver : public test::DirectTransport { @@ -1347,7 +1345,8 @@ TEST_F(EndToEndTest, AssignsTransportSequenceNumbers) { parser_(RtpHeaderParser::Create()), last_seq_(0), padding_observed_(false), - rtx_padding_observed_(false) { + rtx_padding_observed_(false), + retransmit_observed_(false) { parser_->RegisterRtpHeaderExtension(kRtpExtensionTransportSequenceNumber, kExtensionId); } @@ -1361,6 +1360,8 @@ TEST_F(EndToEndTest, AssignsTransportSequenceNumbers) { RTPHeader header; EXPECT_TRUE(parser_->Parse(data, length, &header)); + bool drop_packet = false; + if (header.extension.hasTransportSequenceNumber) { EXPECT_EQ(options.packet_id, header.extension.transportSequenceNumber); @@ -1370,12 +1371,25 @@ TEST_F(EndToEndTest, AssignsTransportSequenceNumbers) { } last_seq_ = header.extension.transportSequenceNumber; + // Drop every 20th packet, so we get retransmits. + if (header.sequenceNumber % 20 == 0) { + dropped_seq_.insert(header.sequenceNumber); + drop_packet = true; + } + size_t payload_length = length - (header.headerLength + header.paddingLength); if (payload_length == 0) { padding_observed_ = true; } else if (header.payloadType == kSendRtxPayloadType) { - rtx_padding_observed_ = true; + uint16_t original_sequence_number = + ByteReader::ReadBigEndian(&data[header.headerLength]); + if (dropped_seq_.find(original_sequence_number) != + dropped_seq_.end()) { + retransmit_observed_ = true; + } else { + rtx_padding_observed_ = true; + } } else { streams_observed_.insert(header.ssrc); } @@ -1383,12 +1397,14 @@ TEST_F(EndToEndTest, AssignsTransportSequenceNumbers) { if (IsDone()) done_->Set(); } + if (drop_packet) + return true; return test::DirectTransport::SendRtp(data, length, options); } bool IsDone() { return streams_observed_.size() == MultiStreamTest::kNumStreams && - padding_observed_ && rtx_padding_observed_; + padding_observed_ && retransmit_observed_ && rtx_padding_observed_; } EventTypeWrapper Wait() { return done_->Wait(kDefaultTimeoutMs); } @@ -1397,8 +1413,10 @@ TEST_F(EndToEndTest, AssignsTransportSequenceNumbers) { rtc::scoped_ptr parser_; uint16_t last_seq_; std::set streams_observed_; + std::set dropped_seq_; bool padding_observed_; bool rtx_padding_observed_; + bool retransmit_observed_; }; class TransportSequenceNumberTester : public MultiStreamTest {