Transport sequence number should be set also for retransmissions.

When fetching a packet from the rtp packet history, cuased by a
retransmission, the transport seq extension header is enabled but the
sequence number is set to 0. A new transport seq should be assigned in
this case.

BUG=

Review URL: https://codereview.webrtc.org/1385563005

Cr-Commit-Position: refs/heads/master@{#10183}
This commit is contained in:
sprang
2015-10-06 06:02:53 -07:00
committed by Commit bot
parent 86fa298c3e
commit af4ced986b
2 changed files with 27 additions and 8 deletions

View File

@ -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 =

View File

@ -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<uint16_t>::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<RtpHeaderParser> parser_;
uint16_t last_seq_;
std::set<uint32_t> streams_observed_;
std::set<uint16_t> dropped_seq_;
bool padding_observed_;
bool rtx_padding_observed_;
bool retransmit_observed_;
};
class TransportSequenceNumberTester : public MultiStreamTest {