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

Side by Side Diff: webrtc/modules/rtp_rtcp/source/rtp_sender_unittest.cc

Issue 1635093002: Add transport sequence number on the non-pacer path of the rtp sender. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Also make sure padding can be sent prior to video in the transport seq num case. Created 4 years, 10 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
OLDNEW
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
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
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 uint8_t payload[] = {47, 11, 32, 93, 89};
sprang_webrtc 2016/01/27 11:32:17 There's no special meaning to these values, right?
stefan-webrtc 2016/01/27 11:39:41 Nope :)
491
492 EXPECT_CALL(seq_num_allocator_, AllocateSequenceNumber())
493 .WillOnce(testing::Return(17));
sprang_webrtc 2016/01/27 11:32:17 Name 17 and check it at the end.
stefan-webrtc 2016/01/27 11:39:41 Done.
494 ASSERT_EQ(
495 0, rtp_sender_->SendOutgoingData(kVideoFrameKey, payload_type, 1234, 4321,
sprang_webrtc 2016/01/27 11:32:17 Nit: Perhaps name or comment on what 1234 and 4321
stefan-webrtc 2016/01/27 11:39:41 Done.
496 payload, sizeof(payload), nullptr));
497
498 RtpUtility::RtpHeaderParser rtp_parser(transport_.last_sent_packet_,
499 transport_.last_sent_packet_len_);
500 webrtc::RTPHeader rtp_header;
501 RtpHeaderExtensionMap map;
502 map.Register(kRtpExtensionTransportSequenceNumber,
503 kTransportSequenceNumberExtensionId);
504 EXPECT_TRUE(rtp_parser.Parse(&rtp_header, &map));
505 EXPECT_TRUE(rtp_header.extension.hasTransportSequenceNumber);
506 EXPECT_EQ(transport_.last_packet_id_,
507 rtp_header.extension.transportSequenceNumber);
508 }
509
467 // Test CVO header extension is only set when marker bit is true. 510 // Test CVO header extension is only set when marker bit is true.
468 TEST_F(RtpSenderTestWithoutPacer, BuildRTPPacketWithVideoRotation_MarkerBit) { 511 TEST_F(RtpSenderTestWithoutPacer, BuildRTPPacketWithVideoRotation_MarkerBit) {
469 rtp_sender_->SetVideoRotation(kRotation); 512 rtp_sender_->SetVideoRotation(kRotation);
470 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( 513 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
471 kRtpExtensionVideoRotation, kVideoRotationExtensionId)); 514 kRtpExtensionVideoRotation, kVideoRotationExtensionId));
472 EXPECT_TRUE(rtp_sender_->ActivateCVORtpHeaderExtension()); 515 EXPECT_TRUE(rtp_sender_->ActivateCVORtpHeaderExtension());
473 516
474 RtpHeaderExtensionMap map; 517 RtpHeaderExtensionMap map;
475 map.Register(kRtpExtensionVideoRotation, kVideoRotationExtensionId); 518 map.Register(kRtpExtensionVideoRotation, kVideoRotationExtensionId);
476 519
(...skipping 1000 matching lines...) Expand 10 before | Expand all | Expand 10 after
1477 reinterpret_cast<uint8_t*>(transport_.sent_packets_[0]->data()), 1520 reinterpret_cast<uint8_t*>(transport_.sent_packets_[0]->data()),
1478 transport_.sent_packets_[0]->size(), true, &map, kSeqNum, hdr.rotation); 1521 transport_.sent_packets_[0]->size(), true, &map, kSeqNum, hdr.rotation);
1479 1522
1480 // Verify that this packet does have CVO byte. 1523 // Verify that this packet does have CVO byte.
1481 VerifyCVOPacket( 1524 VerifyCVOPacket(
1482 reinterpret_cast<uint8_t*>(transport_.sent_packets_[1]->data()), 1525 reinterpret_cast<uint8_t*>(transport_.sent_packets_[1]->data()),
1483 transport_.sent_packets_[1]->size(), true, &map, kSeqNum + 1, 1526 transport_.sent_packets_[1]->size(), true, &map, kSeqNum + 1,
1484 hdr.rotation); 1527 hdr.rotation);
1485 } 1528 }
1486 } // namespace webrtc 1529 } // namespace webrtc
OLDNEW
« webrtc/modules/rtp_rtcp/source/rtp_sender.cc ('K') | « 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