Index: webrtc/video/end_to_end_tests.cc |
diff --git a/webrtc/video/end_to_end_tests.cc b/webrtc/video/end_to_end_tests.cc |
index 305dcb0aaf8f3029c2f0d254fcbd83388265ac38..715399adbe54d481cf2996e5c1f21e475f0a1e92 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<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 { |