| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 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 | 10 |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 69 uint64_t ConvertMsToAbsSendTime(int64_t time_ms) { | 69 uint64_t ConvertMsToAbsSendTime(int64_t time_ms) { |
| 70 return (((time_ms << 18) + 500) / 1000) & 0x00ffffff; | 70 return (((time_ms << 18) + 500) / 1000) & 0x00ffffff; |
| 71 } | 71 } |
| 72 | 72 |
| 73 class LoopbackTransportTest : public webrtc::Transport { | 73 class LoopbackTransportTest : public webrtc::Transport { |
| 74 public: | 74 public: |
| 75 LoopbackTransportTest() | 75 LoopbackTransportTest() |
| 76 : packets_sent_(0), | 76 : packets_sent_(0), |
| 77 last_sent_packet_len_(0), | 77 last_sent_packet_len_(0), |
| 78 total_bytes_sent_(0), | 78 total_bytes_sent_(0), |
| 79 last_sent_packet_(nullptr) {} | 79 last_sent_packet_(nullptr), |
| 80 last_packet_id_(-1) {} |
| 80 | 81 |
| 81 ~LoopbackTransportTest() { | 82 ~LoopbackTransportTest() { |
| 82 STLDeleteContainerPointers(sent_packets_.begin(), sent_packets_.end()); | 83 STLDeleteContainerPointers(sent_packets_.begin(), sent_packets_.end()); |
| 83 } | 84 } |
| 84 bool SendRtp(const uint8_t* data, | 85 bool SendRtp(const uint8_t* data, |
| 85 size_t len, | 86 size_t len, |
| 86 const PacketOptions& options) override { | 87 const PacketOptions& options) override { |
| 87 packets_sent_++; | 88 packets_sent_++; |
| 88 rtc::Buffer* buffer = | 89 rtc::Buffer* buffer = |
| 89 new rtc::Buffer(reinterpret_cast<const uint8_t*>(data), len); | 90 new rtc::Buffer(reinterpret_cast<const uint8_t*>(data), len); |
| 90 last_sent_packet_ = buffer->data(); | 91 last_sent_packet_ = buffer->data(); |
| 91 last_sent_packet_len_ = len; | 92 last_sent_packet_len_ = len; |
| 93 last_packet_id_ = options.packet_id; |
| 92 total_bytes_sent_ += len; | 94 total_bytes_sent_ += len; |
| 93 sent_packets_.push_back(buffer); | 95 sent_packets_.push_back(buffer); |
| 94 return true; | 96 return true; |
| 95 } | 97 } |
| 96 bool SendRtcp(const uint8_t* data, size_t len) override { return false; } | 98 bool SendRtcp(const uint8_t* data, size_t len) override { return false; } |
| 97 int packets_sent_; | 99 int packets_sent_; |
| 98 size_t last_sent_packet_len_; | 100 size_t last_sent_packet_len_; |
| 99 size_t total_bytes_sent_; | 101 size_t total_bytes_sent_; |
| 100 uint8_t* last_sent_packet_; | 102 uint8_t* last_sent_packet_; |
| 103 int last_packet_id_; |
| 101 std::vector<rtc::Buffer*> sent_packets_; | 104 std::vector<rtc::Buffer*> sent_packets_; |
| 102 }; | 105 }; |
| 103 | 106 |
| 104 } // namespace | 107 } // namespace |
| 105 | 108 |
| 106 class MockRtpPacketSender : public RtpPacketSender { | 109 class MockRtpPacketSender : public RtpPacketSender { |
| 107 public: | 110 public: |
| 108 MockRtpPacketSender() {} | 111 MockRtpPacketSender() {} |
| 109 virtual ~MockRtpPacketSender() {} | 112 virtual ~MockRtpPacketSender() {} |
| 110 | 113 |
| 111 MOCK_METHOD6(InsertPacket, | 114 MOCK_METHOD6(InsertPacket, |
| 112 void(Priority priority, | 115 void(Priority priority, |
| 113 uint32_t ssrc, | 116 uint32_t ssrc, |
| 114 uint16_t sequence_number, | 117 uint16_t sequence_number, |
| 115 int64_t capture_time_ms, | 118 int64_t capture_time_ms, |
| 116 size_t bytes, | 119 size_t bytes, |
| 117 bool retransmission)); | 120 bool retransmission)); |
| 118 }; | 121 }; |
| 119 | 122 |
| 123 class MockTransportSequenceNumberAllocator |
| 124 : public TransportSequenceNumberAllocator { |
| 125 public: |
| 126 MOCK_METHOD0(AllocateSequenceNumber, uint16_t()); |
| 127 }; |
| 128 |
| 120 class RtpSenderTest : public ::testing::Test { | 129 class RtpSenderTest : public ::testing::Test { |
| 121 protected: | 130 protected: |
| 122 RtpSenderTest() | 131 RtpSenderTest() |
| 123 : fake_clock_(kStartTime), | 132 : fake_clock_(kStartTime), |
| 124 mock_rtc_event_log_(), | 133 mock_rtc_event_log_(), |
| 125 mock_paced_sender_(), | 134 mock_paced_sender_(), |
| 126 rtp_sender_(), | 135 rtp_sender_(), |
| 127 payload_(kPayload), | 136 payload_(kPayload), |
| 128 transport_(), | 137 transport_(), |
| 129 kMarkerBit(true) { | 138 kMarkerBit(true) { |
| 130 } | 139 } |
| 131 | 140 |
| 132 void SetUp() override { SetUpRtpSender(true); } | 141 void SetUp() override { SetUpRtpSender(true); } |
| 133 | 142 |
| 134 void SetUpRtpSender(bool pacer) { | 143 void SetUpRtpSender(bool pacer) { |
| 135 rtp_sender_.reset(new RTPSender(false, &fake_clock_, &transport_, nullptr, | 144 rtp_sender_.reset(new RTPSender(false, &fake_clock_, &transport_, nullptr, |
| 136 pacer ? &mock_paced_sender_ : nullptr, | 145 pacer ? &mock_paced_sender_ : nullptr, |
| 137 nullptr, nullptr, nullptr, nullptr, nullptr, | 146 &seq_num_allocator_, nullptr, nullptr, |
| 138 &mock_rtc_event_log_)); | 147 nullptr, nullptr, &mock_rtc_event_log_)); |
| 139 rtp_sender_->SetSequenceNumber(kSeqNum); | 148 rtp_sender_->SetSequenceNumber(kSeqNum); |
| 140 } | 149 } |
| 141 | 150 |
| 142 SimulatedClock fake_clock_; | 151 SimulatedClock fake_clock_; |
| 143 MockRtcEventLog mock_rtc_event_log_; | 152 MockRtcEventLog mock_rtc_event_log_; |
| 144 MockRtpPacketSender mock_paced_sender_; | 153 MockRtpPacketSender mock_paced_sender_; |
| 154 MockTransportSequenceNumberAllocator seq_num_allocator_; |
| 145 rtc::scoped_ptr<RTPSender> rtp_sender_; | 155 rtc::scoped_ptr<RTPSender> rtp_sender_; |
| 146 int payload_; | 156 int payload_; |
| 147 LoopbackTransportTest transport_; | 157 LoopbackTransportTest transport_; |
| 148 const bool kMarkerBit; | 158 const bool kMarkerBit; |
| 149 uint8_t packet_[kMaxPacketLength]; | 159 uint8_t packet_[kMaxPacketLength]; |
| 150 | 160 |
| 151 void VerifyRTPHeaderCommon(const RTPHeader& rtp_header) { | 161 void VerifyRTPHeaderCommon(const RTPHeader& rtp_header) { |
| 152 VerifyRTPHeaderCommon(rtp_header, kMarkerBit, 0); | 162 VerifyRTPHeaderCommon(rtp_header, kMarkerBit, 0); |
| 153 } | 163 } |
| 154 | 164 |
| (...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 457 webrtc::RTPHeader rtp_header2; | 467 webrtc::RTPHeader rtp_header2; |
| 458 const bool valid_rtp_header2 = rtp_parser.Parse(&rtp_header2, nullptr); | 468 const bool valid_rtp_header2 = rtp_parser.Parse(&rtp_header2, nullptr); |
| 459 | 469 |
| 460 ASSERT_TRUE(valid_rtp_header2); | 470 ASSERT_TRUE(valid_rtp_header2); |
| 461 VerifyRTPHeaderCommon(rtp_header2); | 471 VerifyRTPHeaderCommon(rtp_header2); |
| 462 EXPECT_EQ(length, rtp_header2.headerLength); | 472 EXPECT_EQ(length, rtp_header2.headerLength); |
| 463 EXPECT_FALSE(rtp_header2.extension.hasAbsoluteSendTime); | 473 EXPECT_FALSE(rtp_header2.extension.hasAbsoluteSendTime); |
| 464 EXPECT_EQ(0u, rtp_header2.extension.absoluteSendTime); | 474 EXPECT_EQ(0u, rtp_header2.extension.absoluteSendTime); |
| 465 } | 475 } |
| 466 | 476 |
| 477 TEST_F(RtpSenderTestWithoutPacer, SendsPacketsWithTransportSequenceNumber) { |
| 478 // Ignore rtc event calls. |
| 479 EXPECT_CALL(mock_rtc_event_log_, |
| 480 LogRtpHeader(PacketDirection::kOutgoingPacket, _, _, _)); |
| 481 |
| 482 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( |
| 483 kRtpExtensionTransportSequenceNumber, |
| 484 kTransportSequenceNumberExtensionId)); |
| 485 |
| 486 char payload_name[RTP_PAYLOAD_NAME_SIZE] = "GENERIC"; |
| 487 const uint8_t payload_type = 127; |
| 488 ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 90000, |
| 489 0, 1500)); |
| 490 // Create a dummy payload of 5 bytes. |
| 491 uint8_t payload[] = {47, 11, 32, 93, 89}; |
| 492 |
| 493 const uint16_t kTransportSequenceNumber = 17; |
| 494 EXPECT_CALL(seq_num_allocator_, AllocateSequenceNumber()) |
| 495 .WillOnce(testing::Return(kTransportSequenceNumber)); |
| 496 const uint32_t kTimestamp = 1234; |
| 497 const int64_t kCaptureTimeMs = 4321; |
| 498 ASSERT_EQ(0, rtp_sender_->SendOutgoingData( |
| 499 kVideoFrameKey, payload_type, kTimestamp, kCaptureTimeMs, |
| 500 payload, sizeof(payload), nullptr)); |
| 501 |
| 502 RtpUtility::RtpHeaderParser rtp_parser(transport_.last_sent_packet_, |
| 503 transport_.last_sent_packet_len_); |
| 504 webrtc::RTPHeader rtp_header; |
| 505 RtpHeaderExtensionMap map; |
| 506 map.Register(kRtpExtensionTransportSequenceNumber, |
| 507 kTransportSequenceNumberExtensionId); |
| 508 EXPECT_TRUE(rtp_parser.Parse(&rtp_header, &map)); |
| 509 EXPECT_TRUE(rtp_header.extension.hasTransportSequenceNumber); |
| 510 EXPECT_EQ(kTransportSequenceNumber, |
| 511 rtp_header.extension.transportSequenceNumber); |
| 512 EXPECT_EQ(transport_.last_packet_id_, |
| 513 rtp_header.extension.transportSequenceNumber); |
| 514 } |
| 515 |
| 467 // Test CVO header extension is only set when marker bit is true. | 516 // Test CVO header extension is only set when marker bit is true. |
| 468 TEST_F(RtpSenderTestWithoutPacer, BuildRTPPacketWithVideoRotation_MarkerBit) { | 517 TEST_F(RtpSenderTestWithoutPacer, BuildRTPPacketWithVideoRotation_MarkerBit) { |
| 469 rtp_sender_->SetVideoRotation(kRotation); | 518 rtp_sender_->SetVideoRotation(kRotation); |
| 470 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( | 519 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( |
| 471 kRtpExtensionVideoRotation, kVideoRotationExtensionId)); | 520 kRtpExtensionVideoRotation, kVideoRotationExtensionId)); |
| 472 EXPECT_TRUE(rtp_sender_->ActivateCVORtpHeaderExtension()); | 521 EXPECT_TRUE(rtp_sender_->ActivateCVORtpHeaderExtension()); |
| 473 | 522 |
| 474 RtpHeaderExtensionMap map; | 523 RtpHeaderExtensionMap map; |
| 475 map.Register(kRtpExtensionVideoRotation, kVideoRotationExtensionId); | 524 map.Register(kRtpExtensionVideoRotation, kVideoRotationExtensionId); |
| 476 | 525 |
| (...skipping 1000 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1477 reinterpret_cast<uint8_t*>(transport_.sent_packets_[0]->data()), | 1526 reinterpret_cast<uint8_t*>(transport_.sent_packets_[0]->data()), |
| 1478 transport_.sent_packets_[0]->size(), true, &map, kSeqNum, hdr.rotation); | 1527 transport_.sent_packets_[0]->size(), true, &map, kSeqNum, hdr.rotation); |
| 1479 | 1528 |
| 1480 // Verify that this packet does have CVO byte. | 1529 // Verify that this packet does have CVO byte. |
| 1481 VerifyCVOPacket( | 1530 VerifyCVOPacket( |
| 1482 reinterpret_cast<uint8_t*>(transport_.sent_packets_[1]->data()), | 1531 reinterpret_cast<uint8_t*>(transport_.sent_packets_[1]->data()), |
| 1483 transport_.sent_packets_[1]->size(), true, &map, kSeqNum + 1, | 1532 transport_.sent_packets_[1]->size(), true, &map, kSeqNum + 1, |
| 1484 hdr.rotation); | 1533 hdr.rotation); |
| 1485 } | 1534 } |
| 1486 } // namespace webrtc | 1535 } // namespace webrtc |
| OLD | NEW |