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