| 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> |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |