Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(14)

Side by Side Diff: webrtc/video/end_to_end_tests.cc

Issue 1385563005: Transport sequence number should be set also for retransmissions. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « webrtc/modules/rtp_rtcp/source/rtp_sender.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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>
11 #include <map> 11 #include <map>
12 #include <sstream> 12 #include <sstream>
13 #include <string> 13 #include <string>
14 14
15 #include "testing/gtest/include/gtest/gtest.h" 15 #include "testing/gtest/include/gtest/gtest.h"
16 16
17 #include "webrtc/base/checks.h" 17 #include "webrtc/base/checks.h"
18 #include "webrtc/base/event.h" 18 #include "webrtc/base/event.h"
19 #include "webrtc/base/scoped_ptr.h" 19 #include "webrtc/base/scoped_ptr.h"
20 #include "webrtc/call.h" 20 #include "webrtc/call.h"
21 #include "webrtc/call/transport_adapter.h" 21 #include "webrtc/call/transport_adapter.h"
22 #include "webrtc/frame_callback.h" 22 #include "webrtc/frame_callback.h"
23 #include "webrtc/modules/rtp_rtcp/source/byte_io.h"
23 #include "webrtc/modules/rtp_rtcp/source/rtcp_utility.h" 24 #include "webrtc/modules/rtp_rtcp/source/rtcp_utility.h"
24 #include "webrtc/modules/video_coding/codecs/vp8/include/vp8.h" 25 #include "webrtc/modules/video_coding/codecs/vp8/include/vp8.h"
25 #include "webrtc/modules/video_coding/codecs/vp9/include/vp9.h" 26 #include "webrtc/modules/video_coding/codecs/vp9/include/vp9.h"
26 #include "webrtc/modules/video_coding/main/interface/video_coding_defines.h" 27 #include "webrtc/modules/video_coding/main/interface/video_coding_defines.h"
27 #include "webrtc/system_wrappers/interface/critical_section_wrapper.h" 28 #include "webrtc/system_wrappers/interface/critical_section_wrapper.h"
28 #include "webrtc/system_wrappers/interface/event_wrapper.h" 29 #include "webrtc/system_wrappers/interface/event_wrapper.h"
29 #include "webrtc/system_wrappers/interface/metrics.h" 30 #include "webrtc/system_wrappers/interface/metrics.h"
30 #include "webrtc/system_wrappers/interface/sleep.h" 31 #include "webrtc/system_wrappers/interface/sleep.h"
31 #include "webrtc/test/call_test.h" 32 #include "webrtc/test/call_test.h"
32 #include "webrtc/test/direct_transport.h" 33 #include "webrtc/test/direct_transport.h"
(...skipping 1295 matching lines...) Expand 10 before | Expand all | Expand 10 after
1328 } 1329 }
1329 1330
1330 private: 1331 private:
1331 rtc::scoped_ptr<VideoOutputObserver> observers_[kNumStreams]; 1332 rtc::scoped_ptr<VideoOutputObserver> observers_[kNumStreams];
1332 } tester; 1333 } tester;
1333 1334
1334 tester.RunTest(); 1335 tester.RunTest();
1335 } 1336 }
1336 1337
1337 TEST_F(EndToEndTest, AssignsTransportSequenceNumbers) { 1338 TEST_F(EndToEndTest, AssignsTransportSequenceNumbers) {
1338 // TODO(sprang): Extend this to verify received values once send-side BWE
1339 // is in place.
1340
1341 static const int kExtensionId = 5; 1339 static const int kExtensionId = 5;
1342 1340
1343 class RtpExtensionHeaderObserver : public test::DirectTransport { 1341 class RtpExtensionHeaderObserver : public test::DirectTransport {
1344 public: 1342 public:
1345 RtpExtensionHeaderObserver() 1343 RtpExtensionHeaderObserver()
1346 : done_(EventWrapper::Create()), 1344 : done_(EventWrapper::Create()),
1347 parser_(RtpHeaderParser::Create()), 1345 parser_(RtpHeaderParser::Create()),
1348 last_seq_(0), 1346 last_seq_(0),
1349 padding_observed_(false), 1347 padding_observed_(false),
1350 rtx_padding_observed_(false) { 1348 rtx_padding_observed_(false),
1349 retransmit_observed_(false) {
1351 parser_->RegisterRtpHeaderExtension(kRtpExtensionTransportSequenceNumber, 1350 parser_->RegisterRtpHeaderExtension(kRtpExtensionTransportSequenceNumber,
1352 kExtensionId); 1351 kExtensionId);
1353 } 1352 }
1354 virtual ~RtpExtensionHeaderObserver() {} 1353 virtual ~RtpExtensionHeaderObserver() {}
1355 1354
1356 bool SendRtp(const uint8_t* data, 1355 bool SendRtp(const uint8_t* data,
1357 size_t length, 1356 size_t length,
1358 const PacketOptions& options) override { 1357 const PacketOptions& options) override {
1359 if (IsDone()) 1358 if (IsDone())
1360 return false; 1359 return false;
1361 1360
1362 RTPHeader header; 1361 RTPHeader header;
1363 EXPECT_TRUE(parser_->Parse(data, length, &header)); 1362 EXPECT_TRUE(parser_->Parse(data, length, &header));
1363 bool drop_packet = false;
1364
1364 if (header.extension.hasTransportSequenceNumber) { 1365 if (header.extension.hasTransportSequenceNumber) {
1365 EXPECT_EQ(options.packet_id, 1366 EXPECT_EQ(options.packet_id,
1366 header.extension.transportSequenceNumber); 1367 header.extension.transportSequenceNumber);
1367 if (!streams_observed_.empty()) { 1368 if (!streams_observed_.empty()) {
1368 EXPECT_EQ(static_cast<uint16_t>(last_seq_ + 1), 1369 EXPECT_EQ(static_cast<uint16_t>(last_seq_ + 1),
1369 header.extension.transportSequenceNumber); 1370 header.extension.transportSequenceNumber);
1370 } 1371 }
1371 last_seq_ = header.extension.transportSequenceNumber; 1372 last_seq_ = header.extension.transportSequenceNumber;
1372 1373
1374 // Drop every 20th packet, so we get retransmits.
1375 if (header.sequenceNumber % 20 == 0) {
1376 dropped_seq_.insert(header.sequenceNumber);
1377 drop_packet = true;
1378 }
1379
1373 size_t payload_length = 1380 size_t payload_length =
1374 length - (header.headerLength + header.paddingLength); 1381 length - (header.headerLength + header.paddingLength);
1375 if (payload_length == 0) { 1382 if (payload_length == 0) {
1376 padding_observed_ = true; 1383 padding_observed_ = true;
1377 } else if (header.payloadType == kSendRtxPayloadType) { 1384 } else if (header.payloadType == kSendRtxPayloadType) {
1378 rtx_padding_observed_ = true; 1385 uint16_t original_sequence_number =
1386 ByteReader<uint16_t>::ReadBigEndian(&data[header.headerLength]);
1387 if (dropped_seq_.find(original_sequence_number) !=
1388 dropped_seq_.end()) {
1389 retransmit_observed_ = true;
1390 } else {
1391 rtx_padding_observed_ = true;
1392 }
1379 } else { 1393 } else {
1380 streams_observed_.insert(header.ssrc); 1394 streams_observed_.insert(header.ssrc);
1381 } 1395 }
1382 1396
1383 if (IsDone()) 1397 if (IsDone())
1384 done_->Set(); 1398 done_->Set();
1385 } 1399 }
1400 if (drop_packet)
1401 return true;
1386 return test::DirectTransport::SendRtp(data, length, options); 1402 return test::DirectTransport::SendRtp(data, length, options);
1387 } 1403 }
1388 1404
1389 bool IsDone() { 1405 bool IsDone() {
1390 return streams_observed_.size() == MultiStreamTest::kNumStreams && 1406 return streams_observed_.size() == MultiStreamTest::kNumStreams &&
1391 padding_observed_ && rtx_padding_observed_; 1407 padding_observed_ && retransmit_observed_ && rtx_padding_observed_;
1392 } 1408 }
1393 1409
1394 EventTypeWrapper Wait() { return done_->Wait(kDefaultTimeoutMs); } 1410 EventTypeWrapper Wait() { return done_->Wait(kDefaultTimeoutMs); }
1395 1411
1396 rtc::scoped_ptr<EventWrapper> done_; 1412 rtc::scoped_ptr<EventWrapper> done_;
1397 rtc::scoped_ptr<RtpHeaderParser> parser_; 1413 rtc::scoped_ptr<RtpHeaderParser> parser_;
1398 uint16_t last_seq_; 1414 uint16_t last_seq_;
1399 std::set<uint32_t> streams_observed_; 1415 std::set<uint32_t> streams_observed_;
1416 std::set<uint16_t> dropped_seq_;
1400 bool padding_observed_; 1417 bool padding_observed_;
1401 bool rtx_padding_observed_; 1418 bool rtx_padding_observed_;
1419 bool retransmit_observed_;
1402 }; 1420 };
1403 1421
1404 class TransportSequenceNumberTester : public MultiStreamTest { 1422 class TransportSequenceNumberTester : public MultiStreamTest {
1405 public: 1423 public:
1406 TransportSequenceNumberTester() : observer_(nullptr) {} 1424 TransportSequenceNumberTester() : observer_(nullptr) {}
1407 virtual ~TransportSequenceNumberTester() {} 1425 virtual ~TransportSequenceNumberTester() {}
1408 1426
1409 protected: 1427 protected:
1410 void Wait() override { 1428 void Wait() override {
1411 RTC_DCHECK(observer_ != nullptr); 1429 RTC_DCHECK(observer_ != nullptr);
(...skipping 1719 matching lines...) Expand 10 before | Expand all | Expand 10 after
3131 EXPECT_TRUE(default_receive_config.rtp.rtx.empty()) 3149 EXPECT_TRUE(default_receive_config.rtp.rtx.empty())
3132 << "Enabling RTX requires rtpmap: rtx negotiation."; 3150 << "Enabling RTX requires rtpmap: rtx negotiation.";
3133 EXPECT_TRUE(default_receive_config.rtp.extensions.empty()) 3151 EXPECT_TRUE(default_receive_config.rtp.extensions.empty())
3134 << "Enabling RTP extensions require negotiation."; 3152 << "Enabling RTP extensions require negotiation.";
3135 3153
3136 VerifyEmptyNackConfig(default_receive_config.rtp.nack); 3154 VerifyEmptyNackConfig(default_receive_config.rtp.nack);
3137 VerifyEmptyFecConfig(default_receive_config.rtp.fec); 3155 VerifyEmptyFecConfig(default_receive_config.rtp.fec);
3138 } 3156 }
3139 3157
3140 } // namespace webrtc 3158 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/modules/rtp_rtcp/source/rtp_sender.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698