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 23 matching lines...) Expand all Loading... |
34 namespace webrtc { | 34 namespace webrtc { |
35 | 35 |
36 namespace { | 36 namespace { |
37 const int kTransmissionTimeOffsetExtensionId = 1; | 37 const int kTransmissionTimeOffsetExtensionId = 1; |
38 const int kAbsoluteSendTimeExtensionId = 14; | 38 const int kAbsoluteSendTimeExtensionId = 14; |
39 const int kTransportSequenceNumberExtensionId = 13; | 39 const int kTransportSequenceNumberExtensionId = 13; |
40 const int kPayload = 100; | 40 const int kPayload = 100; |
41 const int kRtxPayload = 98; | 41 const int kRtxPayload = 98; |
42 const uint32_t kTimestamp = 10; | 42 const uint32_t kTimestamp = 10; |
43 const uint16_t kSeqNum = 33; | 43 const uint16_t kSeqNum = 33; |
44 const int kTimeOffset = 22222; | |
45 const int kMaxPacketLength = 1500; | 44 const int kMaxPacketLength = 1500; |
46 const uint32_t kAbsoluteSendTime = 0x00aabbcc; | |
47 const uint8_t kAudioLevel = 0x5a; | 45 const uint8_t kAudioLevel = 0x5a; |
48 const uint16_t kTransportSequenceNumber = 0xaabbu; | 46 const uint16_t kTransportSequenceNumber = 0xaabbu; |
49 const uint8_t kAudioLevelExtensionId = 9; | 47 const uint8_t kAudioLevelExtensionId = 9; |
50 const int kAudioPayload = 103; | 48 const int kAudioPayload = 103; |
51 const uint64_t kStartTime = 123456789; | 49 const uint64_t kStartTime = 123456789; |
52 const size_t kMaxPaddingSize = 224u; | 50 const size_t kMaxPaddingSize = 224u; |
53 const int kVideoRotationExtensionId = 5; | 51 const int kVideoRotationExtensionId = 5; |
54 const VideoRotation kRotation = kVideoRotation_270; | |
55 const size_t kGenericHeaderLength = 1; | 52 const size_t kGenericHeaderLength = 1; |
56 const uint8_t kPayloadData[] = {47, 11, 32, 93, 89}; | 53 const uint8_t kPayloadData[] = {47, 11, 32, 93, 89}; |
57 | 54 |
58 using ::testing::_; | 55 using ::testing::_; |
59 using ::testing::ElementsAreArray; | 56 using ::testing::ElementsAreArray; |
60 | 57 |
61 const uint8_t* GetPayloadData(const RTPHeader& rtp_header, | 58 const uint8_t* GetPayloadData(const RTPHeader& rtp_header, |
62 const uint8_t* packet) { | 59 const uint8_t* packet) { |
63 return packet + rtp_header.headerLength; | 60 return packet + rtp_header.headerLength; |
64 } | 61 } |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
169 testing::NiceMock<MockRtcEventLog> mock_rtc_event_log_; | 166 testing::NiceMock<MockRtcEventLog> mock_rtc_event_log_; |
170 MockRtpPacketSender mock_paced_sender_; | 167 MockRtpPacketSender mock_paced_sender_; |
171 testing::StrictMock<MockTransportSequenceNumberAllocator> seq_num_allocator_; | 168 testing::StrictMock<MockTransportSequenceNumberAllocator> seq_num_allocator_; |
172 testing::StrictMock<MockSendPacketObserver> send_packet_observer_; | 169 testing::StrictMock<MockSendPacketObserver> send_packet_observer_; |
173 testing::StrictMock<MockTransportFeedbackObserver> feedback_observer_; | 170 testing::StrictMock<MockTransportFeedbackObserver> feedback_observer_; |
174 RateLimiter retransmission_rate_limiter_; | 171 RateLimiter retransmission_rate_limiter_; |
175 std::unique_ptr<RTPSender> rtp_sender_; | 172 std::unique_ptr<RTPSender> rtp_sender_; |
176 int payload_; | 173 int payload_; |
177 LoopbackTransportTest transport_; | 174 LoopbackTransportTest transport_; |
178 const bool kMarkerBit; | 175 const bool kMarkerBit; |
179 uint8_t packet_[kMaxPacketLength]; | |
180 | 176 |
181 void VerifyRTPHeaderCommon(const RTPHeader& rtp_header) { | 177 void VerifyRTPHeaderCommon(const RTPHeader& rtp_header) { |
182 VerifyRTPHeaderCommon(rtp_header, kMarkerBit, 0); | 178 VerifyRTPHeaderCommon(rtp_header, kMarkerBit, 0); |
183 } | 179 } |
184 | 180 |
185 void VerifyRTPHeaderCommon(const RTPHeader& rtp_header, bool marker_bit) { | 181 void VerifyRTPHeaderCommon(const RTPHeader& rtp_header, bool marker_bit) { |
186 VerifyRTPHeaderCommon(rtp_header, marker_bit, 0); | 182 VerifyRTPHeaderCommon(rtp_header, marker_bit, 0); |
187 } | 183 } |
188 | 184 |
189 void VerifyRTPHeaderCommon(const RTPHeader& rtp_header, | 185 void VerifyRTPHeaderCommon(const RTPHeader& rtp_header, |
190 bool marker_bit, | 186 bool marker_bit, |
191 uint8_t number_of_csrcs) { | 187 uint8_t number_of_csrcs) { |
192 EXPECT_EQ(marker_bit, rtp_header.markerBit); | 188 EXPECT_EQ(marker_bit, rtp_header.markerBit); |
193 EXPECT_EQ(payload_, rtp_header.payloadType); | 189 EXPECT_EQ(payload_, rtp_header.payloadType); |
194 EXPECT_EQ(kSeqNum, rtp_header.sequenceNumber); | 190 EXPECT_EQ(kSeqNum, rtp_header.sequenceNumber); |
195 EXPECT_EQ(kTimestamp, rtp_header.timestamp); | 191 EXPECT_EQ(kTimestamp, rtp_header.timestamp); |
196 EXPECT_EQ(rtp_sender_->SSRC(), rtp_header.ssrc); | 192 EXPECT_EQ(rtp_sender_->SSRC(), rtp_header.ssrc); |
197 EXPECT_EQ(number_of_csrcs, rtp_header.numCSRCs); | 193 EXPECT_EQ(number_of_csrcs, rtp_header.numCSRCs); |
198 EXPECT_EQ(0U, rtp_header.paddingLength); | 194 EXPECT_EQ(0U, rtp_header.paddingLength); |
199 } | 195 } |
200 | 196 |
| 197 std::unique_ptr<RtpPacketToSend> BuildRtpPacket(int payload_type, |
| 198 bool marker_bit, |
| 199 uint32_t timestamp, |
| 200 int64_t capture_time_ms) { |
| 201 auto packet = rtp_sender_->AllocatePacket(); |
| 202 packet->SetPayloadType(payload_type); |
| 203 packet->SetMarker(marker_bit); |
| 204 packet->SetTimestamp(timestamp); |
| 205 packet->set_capture_time_ms(capture_time_ms); |
| 206 EXPECT_TRUE(rtp_sender_->AssignSequenceNumber(packet.get())); |
| 207 return packet; |
| 208 } |
| 209 |
201 void SendPacket(int64_t capture_time_ms, int payload_length) { | 210 void SendPacket(int64_t capture_time_ms, int payload_length) { |
202 uint32_t timestamp = capture_time_ms * 90; | 211 uint32_t timestamp = capture_time_ms * 90; |
203 int32_t rtp_length = rtp_sender_->BuildRtpHeader( | 212 auto packet = |
204 packet_, kPayload, kMarkerBit, timestamp, capture_time_ms); | 213 BuildRtpPacket(kPayload, kMarkerBit, timestamp, capture_time_ms); |
205 ASSERT_GE(rtp_length, 0); | 214 packet->AllocatePayload(payload_length); |
206 | 215 |
207 // Packet should be stored in a send bucket. | 216 // Packet should be stored in a send bucket. |
208 EXPECT_TRUE(rtp_sender_->SendToNetwork( | 217 EXPECT_TRUE(rtp_sender_->SendToNetwork(std::move(packet), |
209 packet_, payload_length, rtp_length, capture_time_ms, | 218 kAllowRetransmission, |
210 kAllowRetransmission, RtpPacketSender::kNormalPriority)); | 219 RtpPacketSender::kNormalPriority)); |
211 } | 220 } |
212 | 221 |
213 void SendGenericPayload() { | 222 void SendGenericPayload() { |
214 const uint32_t kTimestamp = 1234; | 223 const uint32_t kTimestamp = 1234; |
215 const uint8_t kPayloadType = 127; | 224 const uint8_t kPayloadType = 127; |
216 const int64_t kCaptureTimeMs = fake_clock_.TimeInMilliseconds(); | 225 const int64_t kCaptureTimeMs = fake_clock_.TimeInMilliseconds(); |
217 char payload_name[RTP_PAYLOAD_NAME_SIZE] = "GENERIC"; | 226 char payload_name[RTP_PAYLOAD_NAME_SIZE] = "GENERIC"; |
218 EXPECT_EQ(0, rtp_sender_->RegisterPayload(payload_name, kPayloadType, 90000, | 227 EXPECT_EQ(0, rtp_sender_->RegisterPayload(payload_name, kPayloadType, 90000, |
219 0, 1500)); | 228 0, 1500)); |
220 | 229 |
(...skipping 22 matching lines...) Expand all Loading... |
243 | 252 |
244 void VerifyCVOPacket(uint8_t* data, | 253 void VerifyCVOPacket(uint8_t* data, |
245 size_t len, | 254 size_t len, |
246 bool expect_cvo, | 255 bool expect_cvo, |
247 RtpHeaderExtensionMap* map, | 256 RtpHeaderExtensionMap* map, |
248 uint16_t seq_num, | 257 uint16_t seq_num, |
249 VideoRotation rotation) { | 258 VideoRotation rotation) { |
250 webrtc::RtpUtility::RtpHeaderParser rtp_parser(data, len); | 259 webrtc::RtpUtility::RtpHeaderParser rtp_parser(data, len); |
251 | 260 |
252 webrtc::RTPHeader rtp_header; | 261 webrtc::RTPHeader rtp_header; |
253 size_t length = static_cast<size_t>(rtp_sender_->BuildRtpHeader( | |
254 packet_, kPayload, expect_cvo /* marker_bit */, kTimestamp, 0)); | |
255 if (expect_cvo) { | |
256 ASSERT_EQ(kRtpHeaderSize + rtp_sender_->RtpHeaderExtensionLength(), | |
257 length); | |
258 } else { | |
259 ASSERT_EQ(kRtpHeaderSize, length); | |
260 } | |
261 ASSERT_TRUE(rtp_parser.Parse(&rtp_header, map)); | 262 ASSERT_TRUE(rtp_parser.Parse(&rtp_header, map)); |
262 ASSERT_FALSE(rtp_parser.RTCP()); | 263 ASSERT_FALSE(rtp_parser.RTCP()); |
263 EXPECT_EQ(payload_, rtp_header.payloadType); | 264 EXPECT_EQ(payload_, rtp_header.payloadType); |
264 EXPECT_EQ(seq_num, rtp_header.sequenceNumber); | 265 EXPECT_EQ(seq_num, rtp_header.sequenceNumber); |
265 EXPECT_EQ(kTimestamp, rtp_header.timestamp); | 266 EXPECT_EQ(kTimestamp, rtp_header.timestamp); |
266 EXPECT_EQ(rtp_sender_->SSRC(), rtp_header.ssrc); | 267 EXPECT_EQ(rtp_sender_->SSRC(), rtp_header.ssrc); |
267 EXPECT_EQ(0, rtp_header.numCSRCs); | 268 EXPECT_EQ(0, rtp_header.numCSRCs); |
268 EXPECT_EQ(0U, rtp_header.paddingLength); | 269 EXPECT_EQ(0U, rtp_header.paddingLength); |
269 EXPECT_EQ(rotation, rtp_header.extension.videoRotation); | 270 EXPECT_EQ(rotation, rtp_header.extension.videoRotation); |
270 } | 271 } |
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
463 ASSERT_TRUE(rtp_sender_->TimeToSendPadding(kPaddingSize, -1)); | 464 ASSERT_TRUE(rtp_sender_->TimeToSendPadding(kPaddingSize, -1)); |
464 | 465 |
465 ASSERT_EQ(1u, transport_.sent_packets_.size()); | 466 ASSERT_EQ(1u, transport_.sent_packets_.size()); |
466 // Parse the padding packet and verify its timestamp. | 467 // Parse the padding packet and verify its timestamp. |
467 RtpPacketToSend padding_packet(nullptr); | 468 RtpPacketToSend padding_packet(nullptr); |
468 ASSERT_TRUE(padding_packet.Parse(transport_.sent_packets_[0]->data(), | 469 ASSERT_TRUE(padding_packet.Parse(transport_.sent_packets_[0]->data(), |
469 transport_.sent_packets_[0]->size())); | 470 transport_.sent_packets_[0]->size())); |
470 EXPECT_EQ(kTimestamp, padding_packet.Timestamp()); | 471 EXPECT_EQ(kTimestamp, padding_packet.Timestamp()); |
471 } | 472 } |
472 | 473 |
473 TEST_F(RtpSenderTestWithoutPacer, BuildRTPPacket) { | |
474 size_t length = static_cast<size_t>(rtp_sender_->BuildRtpHeader( | |
475 packet_, kPayload, kMarkerBit, kTimestamp, 0)); | |
476 ASSERT_EQ(kRtpHeaderSize, length); | |
477 | |
478 // Verify | |
479 webrtc::RtpUtility::RtpHeaderParser rtp_parser(packet_, length); | |
480 webrtc::RTPHeader rtp_header; | |
481 | |
482 const bool valid_rtp_header = rtp_parser.Parse(&rtp_header, nullptr); | |
483 | |
484 ASSERT_TRUE(valid_rtp_header); | |
485 ASSERT_FALSE(rtp_parser.RTCP()); | |
486 VerifyRTPHeaderCommon(rtp_header); | |
487 EXPECT_EQ(length, rtp_header.headerLength); | |
488 EXPECT_FALSE(rtp_header.extension.hasTransmissionTimeOffset); | |
489 EXPECT_FALSE(rtp_header.extension.hasAbsoluteSendTime); | |
490 EXPECT_FALSE(rtp_header.extension.hasAudioLevel); | |
491 EXPECT_EQ(0, rtp_header.extension.transmissionTimeOffset); | |
492 EXPECT_EQ(0u, rtp_header.extension.absoluteSendTime); | |
493 EXPECT_FALSE(rtp_header.extension.voiceActivity); | |
494 EXPECT_EQ(0u, rtp_header.extension.audioLevel); | |
495 EXPECT_EQ(0u, rtp_header.extension.videoRotation); | |
496 } | |
497 | |
498 TEST_F(RtpSenderTestWithoutPacer, | |
499 BuildRTPPacketWithTransmissionOffsetExtension) { | |
500 EXPECT_EQ(0, rtp_sender_->SetTransmissionTimeOffset(kTimeOffset)); | |
501 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( | |
502 kRtpExtensionTransmissionTimeOffset, | |
503 kTransmissionTimeOffsetExtensionId)); | |
504 | |
505 size_t length = static_cast<size_t>(rtp_sender_->BuildRtpHeader( | |
506 packet_, kPayload, kMarkerBit, kTimestamp, 0)); | |
507 ASSERT_EQ(kRtpHeaderSize + rtp_sender_->RtpHeaderExtensionLength(), length); | |
508 | |
509 // Verify | |
510 webrtc::RtpUtility::RtpHeaderParser rtp_parser(packet_, length); | |
511 webrtc::RTPHeader rtp_header; | |
512 | |
513 RtpHeaderExtensionMap map; | |
514 map.Register(kRtpExtensionTransmissionTimeOffset, | |
515 kTransmissionTimeOffsetExtensionId); | |
516 const bool valid_rtp_header = rtp_parser.Parse(&rtp_header, &map); | |
517 | |
518 ASSERT_TRUE(valid_rtp_header); | |
519 ASSERT_FALSE(rtp_parser.RTCP()); | |
520 VerifyRTPHeaderCommon(rtp_header); | |
521 EXPECT_EQ(length, rtp_header.headerLength); | |
522 EXPECT_TRUE(rtp_header.extension.hasTransmissionTimeOffset); | |
523 EXPECT_EQ(kTimeOffset, rtp_header.extension.transmissionTimeOffset); | |
524 | |
525 // Parse without map extension | |
526 webrtc::RTPHeader rtp_header2; | |
527 const bool valid_rtp_header2 = rtp_parser.Parse(&rtp_header2, nullptr); | |
528 | |
529 ASSERT_TRUE(valid_rtp_header2); | |
530 VerifyRTPHeaderCommon(rtp_header2); | |
531 EXPECT_EQ(length, rtp_header2.headerLength); | |
532 EXPECT_FALSE(rtp_header2.extension.hasTransmissionTimeOffset); | |
533 EXPECT_EQ(0, rtp_header2.extension.transmissionTimeOffset); | |
534 } | |
535 | |
536 TEST_F(RtpSenderTestWithoutPacer, | |
537 BuildRTPPacketWithNegativeTransmissionOffsetExtension) { | |
538 const int kNegTimeOffset = -500; | |
539 EXPECT_EQ(0, rtp_sender_->SetTransmissionTimeOffset(kNegTimeOffset)); | |
540 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( | |
541 kRtpExtensionTransmissionTimeOffset, | |
542 kTransmissionTimeOffsetExtensionId)); | |
543 | |
544 size_t length = static_cast<size_t>(rtp_sender_->BuildRtpHeader( | |
545 packet_, kPayload, kMarkerBit, kTimestamp, 0)); | |
546 ASSERT_EQ(kRtpHeaderSize + rtp_sender_->RtpHeaderExtensionLength(), length); | |
547 | |
548 // Verify | |
549 webrtc::RtpUtility::RtpHeaderParser rtp_parser(packet_, length); | |
550 webrtc::RTPHeader rtp_header; | |
551 | |
552 RtpHeaderExtensionMap map; | |
553 map.Register(kRtpExtensionTransmissionTimeOffset, | |
554 kTransmissionTimeOffsetExtensionId); | |
555 const bool valid_rtp_header = rtp_parser.Parse(&rtp_header, &map); | |
556 | |
557 ASSERT_TRUE(valid_rtp_header); | |
558 ASSERT_FALSE(rtp_parser.RTCP()); | |
559 VerifyRTPHeaderCommon(rtp_header); | |
560 EXPECT_EQ(length, rtp_header.headerLength); | |
561 EXPECT_TRUE(rtp_header.extension.hasTransmissionTimeOffset); | |
562 EXPECT_EQ(kNegTimeOffset, rtp_header.extension.transmissionTimeOffset); | |
563 } | |
564 | |
565 TEST_F(RtpSenderTestWithoutPacer, BuildRTPPacketWithAbsoluteSendTimeExtension) { | |
566 EXPECT_EQ(0, rtp_sender_->SetAbsoluteSendTime(kAbsoluteSendTime)); | |
567 EXPECT_EQ( | |
568 0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime, | |
569 kAbsoluteSendTimeExtensionId)); | |
570 | |
571 size_t length = static_cast<size_t>(rtp_sender_->BuildRtpHeader( | |
572 packet_, kPayload, kMarkerBit, kTimestamp, 0)); | |
573 ASSERT_EQ(kRtpHeaderSize + rtp_sender_->RtpHeaderExtensionLength(), length); | |
574 | |
575 // Verify | |
576 webrtc::RtpUtility::RtpHeaderParser rtp_parser(packet_, length); | |
577 webrtc::RTPHeader rtp_header; | |
578 | |
579 RtpHeaderExtensionMap map; | |
580 map.Register(kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId); | |
581 const bool valid_rtp_header = rtp_parser.Parse(&rtp_header, &map); | |
582 | |
583 ASSERT_TRUE(valid_rtp_header); | |
584 ASSERT_FALSE(rtp_parser.RTCP()); | |
585 VerifyRTPHeaderCommon(rtp_header); | |
586 EXPECT_EQ(length, rtp_header.headerLength); | |
587 EXPECT_TRUE(rtp_header.extension.hasAbsoluteSendTime); | |
588 EXPECT_EQ(kAbsoluteSendTime, rtp_header.extension.absoluteSendTime); | |
589 | |
590 // Parse without map extension | |
591 webrtc::RTPHeader rtp_header2; | |
592 const bool valid_rtp_header2 = rtp_parser.Parse(&rtp_header2, nullptr); | |
593 | |
594 ASSERT_TRUE(valid_rtp_header2); | |
595 VerifyRTPHeaderCommon(rtp_header2); | |
596 EXPECT_EQ(length, rtp_header2.headerLength); | |
597 EXPECT_FALSE(rtp_header2.extension.hasAbsoluteSendTime); | |
598 EXPECT_EQ(0u, rtp_header2.extension.absoluteSendTime); | |
599 } | |
600 | |
601 TEST_F(RtpSenderTestWithoutPacer, SendsPacketsWithTransportSequenceNumber) { | 474 TEST_F(RtpSenderTestWithoutPacer, SendsPacketsWithTransportSequenceNumber) { |
602 rtp_sender_.reset(new RTPSender( | 475 rtp_sender_.reset(new RTPSender( |
603 false, &fake_clock_, &transport_, nullptr, | 476 false, &fake_clock_, &transport_, nullptr, |
604 &seq_num_allocator_, &feedback_observer_, nullptr, nullptr, nullptr, | 477 &seq_num_allocator_, &feedback_observer_, nullptr, nullptr, nullptr, |
605 &mock_rtc_event_log_, &send_packet_observer_, | 478 &mock_rtc_event_log_, &send_packet_observer_, |
606 &retransmission_rate_limiter_)); | 479 &retransmission_rate_limiter_)); |
607 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( | 480 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( |
608 kRtpExtensionTransportSequenceNumber, | 481 kRtpExtensionTransportSequenceNumber, |
609 kTransportSequenceNumberExtensionId)); | 482 kTransportSequenceNumberExtensionId)); |
610 | 483 |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
645 kTransportSequenceNumberExtensionId)); | 518 kTransportSequenceNumberExtensionId)); |
646 EXPECT_CALL(seq_num_allocator_, AllocateSequenceNumber()) | 519 EXPECT_CALL(seq_num_allocator_, AllocateSequenceNumber()) |
647 .WillOnce(testing::Return(kTransportSequenceNumber)); | 520 .WillOnce(testing::Return(kTransportSequenceNumber)); |
648 EXPECT_CALL(send_packet_observer_, | 521 EXPECT_CALL(send_packet_observer_, |
649 OnSendPacket(kTransportSequenceNumber, _, _)) | 522 OnSendPacket(kTransportSequenceNumber, _, _)) |
650 .Times(1); | 523 .Times(1); |
651 | 524 |
652 SendGenericPayload(); | 525 SendGenericPayload(); |
653 } | 526 } |
654 | 527 |
655 // Test CVO header extension is only set when marker bit is true. | |
656 TEST_F(RtpSenderTestWithoutPacer, BuildRTPPacketWithVideoRotation_MarkerBit) { | |
657 rtp_sender_->SetVideoRotation(kRotation); | |
658 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( | |
659 kRtpExtensionVideoRotation, kVideoRotationExtensionId)); | |
660 EXPECT_TRUE(rtp_sender_->ActivateCVORtpHeaderExtension()); | |
661 | |
662 RtpHeaderExtensionMap map; | |
663 map.Register(kRtpExtensionVideoRotation, kVideoRotationExtensionId); | |
664 | |
665 size_t length = static_cast<size_t>( | |
666 rtp_sender_->BuildRtpHeader(packet_, kPayload, true, kTimestamp, 0)); | |
667 ASSERT_EQ(kRtpHeaderSize + rtp_sender_->RtpHeaderExtensionLength(), length); | |
668 | |
669 // Verify | |
670 webrtc::RtpUtility::RtpHeaderParser rtp_parser(packet_, length); | |
671 webrtc::RTPHeader rtp_header; | |
672 | |
673 ASSERT_TRUE(rtp_parser.Parse(&rtp_header, &map)); | |
674 ASSERT_FALSE(rtp_parser.RTCP()); | |
675 VerifyRTPHeaderCommon(rtp_header); | |
676 EXPECT_EQ(length, rtp_header.headerLength); | |
677 EXPECT_TRUE(rtp_header.extension.hasVideoRotation); | |
678 EXPECT_EQ(kRotation, rtp_header.extension.videoRotation); | |
679 } | |
680 | |
681 // Test CVO header extension is not set when marker bit is false. | |
682 TEST_F(RtpSenderTestWithoutPacer, | |
683 DISABLED_BuildRTPPacketWithVideoRotation_NoMarkerBit) { | |
684 rtp_sender_->SetVideoRotation(kRotation); | |
685 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( | |
686 kRtpExtensionVideoRotation, kVideoRotationExtensionId)); | |
687 EXPECT_TRUE(rtp_sender_->ActivateCVORtpHeaderExtension()); | |
688 | |
689 RtpHeaderExtensionMap map; | |
690 map.Register(kRtpExtensionVideoRotation, kVideoRotationExtensionId); | |
691 | |
692 size_t length = static_cast<size_t>( | |
693 rtp_sender_->BuildRtpHeader(packet_, kPayload, false, kTimestamp, 0)); | |
694 ASSERT_EQ(kRtpHeaderSize, length); | |
695 | |
696 // Verify | |
697 webrtc::RtpUtility::RtpHeaderParser rtp_parser(packet_, length); | |
698 webrtc::RTPHeader rtp_header; | |
699 | |
700 ASSERT_TRUE(rtp_parser.Parse(&rtp_header, &map)); | |
701 ASSERT_FALSE(rtp_parser.RTCP()); | |
702 VerifyRTPHeaderCommon(rtp_header, false); | |
703 EXPECT_EQ(length, rtp_header.headerLength); | |
704 EXPECT_FALSE(rtp_header.extension.hasVideoRotation); | |
705 } | |
706 | |
707 TEST_F(RtpSenderTestWithoutPacer, BuildRTPPacketWithAudioLevelExtension) { | |
708 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAudioLevel, | |
709 kAudioLevelExtensionId)); | |
710 | |
711 size_t length = static_cast<size_t>(rtp_sender_->BuildRtpHeader( | |
712 packet_, kPayload, kMarkerBit, kTimestamp, 0)); | |
713 ASSERT_EQ(kRtpHeaderSize + rtp_sender_->RtpHeaderExtensionLength(), length); | |
714 | |
715 // Verify | |
716 webrtc::RtpUtility::RtpHeaderParser rtp_parser(packet_, length); | |
717 webrtc::RTPHeader rtp_header; | |
718 | |
719 // Updating audio level is done in RTPSenderAudio, so simulate it here. | |
720 rtp_parser.Parse(&rtp_header); | |
721 rtp_sender_->UpdateAudioLevel(packet_, length, rtp_header, true, kAudioLevel); | |
722 | |
723 RtpHeaderExtensionMap map; | |
724 map.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId); | |
725 const bool valid_rtp_header = rtp_parser.Parse(&rtp_header, &map); | |
726 | |
727 ASSERT_TRUE(valid_rtp_header); | |
728 ASSERT_FALSE(rtp_parser.RTCP()); | |
729 VerifyRTPHeaderCommon(rtp_header); | |
730 EXPECT_EQ(length, rtp_header.headerLength); | |
731 EXPECT_TRUE(rtp_header.extension.hasAudioLevel); | |
732 EXPECT_TRUE(rtp_header.extension.voiceActivity); | |
733 EXPECT_EQ(kAudioLevel, rtp_header.extension.audioLevel); | |
734 | |
735 // Parse without map extension | |
736 webrtc::RTPHeader rtp_header2; | |
737 const bool valid_rtp_header2 = rtp_parser.Parse(&rtp_header2, nullptr); | |
738 | |
739 ASSERT_TRUE(valid_rtp_header2); | |
740 VerifyRTPHeaderCommon(rtp_header2); | |
741 EXPECT_EQ(length, rtp_header2.headerLength); | |
742 EXPECT_FALSE(rtp_header2.extension.hasAudioLevel); | |
743 EXPECT_FALSE(rtp_header2.extension.voiceActivity); | |
744 EXPECT_EQ(0u, rtp_header2.extension.audioLevel); | |
745 } | |
746 | |
747 TEST_F(RtpSenderTestWithoutPacer, | |
748 BuildRTPPacketWithCSRCAndAudioLevelExtension) { | |
749 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAudioLevel, | |
750 kAudioLevelExtensionId)); | |
751 std::vector<uint32_t> csrcs; | |
752 csrcs.push_back(0x23456789); | |
753 rtp_sender_->SetCsrcs(csrcs); | |
754 size_t length = static_cast<size_t>(rtp_sender_->BuildRtpHeader( | |
755 packet_, kPayload, kMarkerBit, kTimestamp, 0)); | |
756 | |
757 // Verify | |
758 webrtc::RtpUtility::RtpHeaderParser rtp_parser(packet_, length); | |
759 webrtc::RTPHeader rtp_header; | |
760 | |
761 // Updating audio level is done in RTPSenderAudio, so simulate it here. | |
762 rtp_parser.Parse(&rtp_header); | |
763 EXPECT_TRUE(rtp_sender_->UpdateAudioLevel(packet_, length, rtp_header, true, | |
764 kAudioLevel)); | |
765 | |
766 RtpHeaderExtensionMap map; | |
767 map.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId); | |
768 const bool valid_rtp_header = rtp_parser.Parse(&rtp_header, &map); | |
769 | |
770 ASSERT_TRUE(valid_rtp_header); | |
771 ASSERT_FALSE(rtp_parser.RTCP()); | |
772 VerifyRTPHeaderCommon(rtp_header, kMarkerBit, csrcs.size()); | |
773 EXPECT_EQ(length, rtp_header.headerLength); | |
774 EXPECT_TRUE(rtp_header.extension.hasAudioLevel); | |
775 EXPECT_TRUE(rtp_header.extension.voiceActivity); | |
776 EXPECT_EQ(kAudioLevel, rtp_header.extension.audioLevel); | |
777 EXPECT_EQ(1u, rtp_header.numCSRCs); | |
778 EXPECT_EQ(csrcs[0], rtp_header.arrOfCSRCs[0]); | |
779 } | |
780 | |
781 TEST_F(RtpSenderTestWithoutPacer, BuildRTPPacketWithHeaderExtensions) { | |
782 EXPECT_EQ(0, rtp_sender_->SetTransmissionTimeOffset(kTimeOffset)); | |
783 EXPECT_EQ(0, rtp_sender_->SetAbsoluteSendTime(kAbsoluteSendTime)); | |
784 EXPECT_EQ(0, | |
785 rtp_sender_->SetTransportSequenceNumber(kTransportSequenceNumber)); | |
786 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( | |
787 kRtpExtensionTransmissionTimeOffset, | |
788 kTransmissionTimeOffsetExtensionId)); | |
789 EXPECT_EQ( | |
790 0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime, | |
791 kAbsoluteSendTimeExtensionId)); | |
792 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAudioLevel, | |
793 kAudioLevelExtensionId)); | |
794 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( | |
795 kRtpExtensionTransportSequenceNumber, | |
796 kTransportSequenceNumberExtensionId)); | |
797 | |
798 size_t length = static_cast<size_t>(rtp_sender_->BuildRtpHeader( | |
799 packet_, kPayload, kMarkerBit, kTimestamp, 0)); | |
800 ASSERT_EQ(kRtpHeaderSize + rtp_sender_->RtpHeaderExtensionLength(), length); | |
801 | |
802 // Verify | |
803 webrtc::RtpUtility::RtpHeaderParser rtp_parser(packet_, length); | |
804 webrtc::RTPHeader rtp_header; | |
805 | |
806 // Updating audio level is done in RTPSenderAudio, so simulate it here. | |
807 rtp_parser.Parse(&rtp_header); | |
808 rtp_sender_->UpdateAudioLevel(packet_, length, rtp_header, true, kAudioLevel); | |
809 | |
810 RtpHeaderExtensionMap map; | |
811 map.Register(kRtpExtensionTransmissionTimeOffset, | |
812 kTransmissionTimeOffsetExtensionId); | |
813 map.Register(kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId); | |
814 map.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId); | |
815 map.Register(kRtpExtensionTransportSequenceNumber, | |
816 kTransportSequenceNumberExtensionId); | |
817 const bool valid_rtp_header = rtp_parser.Parse(&rtp_header, &map); | |
818 | |
819 ASSERT_TRUE(valid_rtp_header); | |
820 ASSERT_FALSE(rtp_parser.RTCP()); | |
821 VerifyRTPHeaderCommon(rtp_header); | |
822 EXPECT_EQ(length, rtp_header.headerLength); | |
823 EXPECT_TRUE(rtp_header.extension.hasTransmissionTimeOffset); | |
824 EXPECT_TRUE(rtp_header.extension.hasAbsoluteSendTime); | |
825 EXPECT_TRUE(rtp_header.extension.hasAudioLevel); | |
826 EXPECT_TRUE(rtp_header.extension.hasTransportSequenceNumber); | |
827 EXPECT_EQ(kTimeOffset, rtp_header.extension.transmissionTimeOffset); | |
828 EXPECT_EQ(kAbsoluteSendTime, rtp_header.extension.absoluteSendTime); | |
829 EXPECT_TRUE(rtp_header.extension.voiceActivity); | |
830 EXPECT_EQ(kAudioLevel, rtp_header.extension.audioLevel); | |
831 EXPECT_EQ(kTransportSequenceNumber, | |
832 rtp_header.extension.transportSequenceNumber); | |
833 | |
834 // Parse without map extension | |
835 webrtc::RTPHeader rtp_header2; | |
836 const bool valid_rtp_header2 = rtp_parser.Parse(&rtp_header2, nullptr); | |
837 | |
838 ASSERT_TRUE(valid_rtp_header2); | |
839 VerifyRTPHeaderCommon(rtp_header2); | |
840 EXPECT_EQ(length, rtp_header2.headerLength); | |
841 EXPECT_FALSE(rtp_header2.extension.hasTransmissionTimeOffset); | |
842 EXPECT_FALSE(rtp_header2.extension.hasAbsoluteSendTime); | |
843 EXPECT_FALSE(rtp_header2.extension.hasAudioLevel); | |
844 EXPECT_FALSE(rtp_header2.extension.hasTransportSequenceNumber); | |
845 | |
846 EXPECT_EQ(0, rtp_header2.extension.transmissionTimeOffset); | |
847 EXPECT_EQ(0u, rtp_header2.extension.absoluteSendTime); | |
848 EXPECT_FALSE(rtp_header2.extension.voiceActivity); | |
849 EXPECT_EQ(0u, rtp_header2.extension.audioLevel); | |
850 EXPECT_EQ(0u, rtp_header2.extension.transportSequenceNumber); | |
851 } | |
852 | |
853 TEST_F(RtpSenderTest, SendsPacketsWithTransportSequenceNumber) { | 528 TEST_F(RtpSenderTest, SendsPacketsWithTransportSequenceNumber) { |
854 rtp_sender_.reset(new RTPSender( | 529 rtp_sender_.reset(new RTPSender( |
855 false, &fake_clock_, &transport_, &mock_paced_sender_, | 530 false, &fake_clock_, &transport_, &mock_paced_sender_, |
856 &seq_num_allocator_, &feedback_observer_, nullptr, nullptr, nullptr, | 531 &seq_num_allocator_, &feedback_observer_, nullptr, nullptr, nullptr, |
857 &mock_rtc_event_log_, &send_packet_observer_, | 532 &mock_rtc_event_log_, &send_packet_observer_, |
858 &retransmission_rate_limiter_)); | 533 &retransmission_rate_limiter_)); |
859 rtp_sender_->SetStorePacketsStatus(true, 10); | 534 rtp_sender_->SetStorePacketsStatus(true, 10); |
860 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( | 535 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( |
861 kRtpExtensionTransportSequenceNumber, | 536 kRtpExtensionTransportSequenceNumber, |
862 kTransportSequenceNumberExtensionId)); | 537 kTransportSequenceNumberExtensionId)); |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
901 LogRtpHeader(PacketDirection::kOutgoingPacket, _, _, _)); | 576 LogRtpHeader(PacketDirection::kOutgoingPacket, _, _, _)); |
902 | 577 |
903 rtp_sender_->SetStorePacketsStatus(true, 10); | 578 rtp_sender_->SetStorePacketsStatus(true, 10); |
904 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( | 579 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( |
905 kRtpExtensionTransmissionTimeOffset, | 580 kRtpExtensionTransmissionTimeOffset, |
906 kTransmissionTimeOffsetExtensionId)); | 581 kTransmissionTimeOffsetExtensionId)); |
907 EXPECT_EQ( | 582 EXPECT_EQ( |
908 0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime, | 583 0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime, |
909 kAbsoluteSendTimeExtensionId)); | 584 kAbsoluteSendTimeExtensionId)); |
910 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds(); | 585 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds(); |
911 int rtp_length_int = rtp_sender_->BuildRtpHeader( | 586 auto packet = |
912 packet_, kPayload, kMarkerBit, kTimestamp, capture_time_ms); | 587 BuildRtpPacket(kPayload, kMarkerBit, kTimestamp, capture_time_ms); |
913 ASSERT_NE(-1, rtp_length_int); | 588 size_t packet_size = packet->size(); |
914 size_t rtp_length = static_cast<size_t>(rtp_length_int); | |
915 | 589 |
916 // Packet should be stored in a send bucket. | 590 // Packet should be stored in a send bucket. |
917 EXPECT_TRUE(rtp_sender_->SendToNetwork(packet_, 0, rtp_length, | 591 EXPECT_TRUE(rtp_sender_->SendToNetwork(std::move(packet), |
918 capture_time_ms, kAllowRetransmission, | 592 kAllowRetransmission, |
919 RtpPacketSender::kNormalPriority)); | 593 RtpPacketSender::kNormalPriority)); |
920 | 594 |
921 EXPECT_EQ(0, transport_.packets_sent_); | 595 EXPECT_EQ(0, transport_.packets_sent_); |
922 | 596 |
923 const int kStoredTimeInMs = 100; | 597 const int kStoredTimeInMs = 100; |
924 fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs); | 598 fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs); |
925 | 599 |
926 rtp_sender_->TimeToSendPacket(kSeqNum, capture_time_ms, false, | 600 rtp_sender_->TimeToSendPacket(kSeqNum, capture_time_ms, false, |
927 PacketInfo::kNotAProbe); | 601 PacketInfo::kNotAProbe); |
928 | 602 |
929 // Process send bucket. Packet should now be sent. | 603 // Process send bucket. Packet should now be sent. |
930 EXPECT_EQ(1, transport_.packets_sent_); | 604 EXPECT_EQ(1, transport_.packets_sent_); |
931 EXPECT_EQ(rtp_length, transport_.last_sent_packet_len_); | 605 EXPECT_EQ(packet_size, transport_.last_sent_packet_len_); |
932 // Parse sent packet. | 606 // Parse sent packet. |
933 webrtc::RtpUtility::RtpHeaderParser rtp_parser(transport_.last_sent_packet_, | 607 webrtc::RtpUtility::RtpHeaderParser rtp_parser(transport_.last_sent_packet_, |
934 rtp_length); | 608 packet_size); |
935 webrtc::RTPHeader rtp_header; | 609 webrtc::RTPHeader rtp_header; |
936 RtpHeaderExtensionMap map; | 610 RtpHeaderExtensionMap map; |
937 map.Register(kRtpExtensionTransmissionTimeOffset, | 611 map.Register(kRtpExtensionTransmissionTimeOffset, |
938 kTransmissionTimeOffsetExtensionId); | 612 kTransmissionTimeOffsetExtensionId); |
939 map.Register(kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId); | 613 map.Register(kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId); |
940 const bool valid_rtp_header = rtp_parser.Parse(&rtp_header, &map); | 614 const bool valid_rtp_header = rtp_parser.Parse(&rtp_header, &map); |
941 ASSERT_TRUE(valid_rtp_header); | 615 ASSERT_TRUE(valid_rtp_header); |
942 | 616 |
943 // Verify transmission time offset. | 617 // Verify transmission time offset. |
944 EXPECT_EQ(kStoredTimeInMs * 90, rtp_header.extension.transmissionTimeOffset); | 618 EXPECT_EQ(kStoredTimeInMs * 90, rtp_header.extension.transmissionTimeOffset); |
945 uint64_t expected_send_time = | 619 uint64_t expected_send_time = |
946 ConvertMsToAbsSendTime(fake_clock_.TimeInMilliseconds()); | 620 ConvertMsToAbsSendTime(fake_clock_.TimeInMilliseconds()); |
947 EXPECT_EQ(expected_send_time, rtp_header.extension.absoluteSendTime); | 621 EXPECT_EQ(expected_send_time, rtp_header.extension.absoluteSendTime); |
948 } | 622 } |
949 | 623 |
950 TEST_F(RtpSenderTest, TrafficSmoothingRetransmits) { | 624 TEST_F(RtpSenderTest, TrafficSmoothingRetransmits) { |
951 EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kNormalPriority, | 625 EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kNormalPriority, |
952 _, kSeqNum, _, _, _)); | 626 _, kSeqNum, _, _, _)); |
953 EXPECT_CALL(mock_rtc_event_log_, | 627 EXPECT_CALL(mock_rtc_event_log_, |
954 LogRtpHeader(PacketDirection::kOutgoingPacket, _, _, _)); | 628 LogRtpHeader(PacketDirection::kOutgoingPacket, _, _, _)); |
955 | 629 |
956 rtp_sender_->SetStorePacketsStatus(true, 10); | 630 rtp_sender_->SetStorePacketsStatus(true, 10); |
957 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( | 631 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( |
958 kRtpExtensionTransmissionTimeOffset, | 632 kRtpExtensionTransmissionTimeOffset, |
959 kTransmissionTimeOffsetExtensionId)); | 633 kTransmissionTimeOffsetExtensionId)); |
960 EXPECT_EQ( | 634 EXPECT_EQ( |
961 0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime, | 635 0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime, |
962 kAbsoluteSendTimeExtensionId)); | 636 kAbsoluteSendTimeExtensionId)); |
963 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds(); | 637 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds(); |
964 int rtp_length_int = rtp_sender_->BuildRtpHeader( | 638 auto packet = |
965 packet_, kPayload, kMarkerBit, kTimestamp, capture_time_ms); | 639 BuildRtpPacket(kPayload, kMarkerBit, kTimestamp, capture_time_ms); |
966 ASSERT_NE(-1, rtp_length_int); | 640 size_t packet_size = packet->size(); |
967 size_t rtp_length = static_cast<size_t>(rtp_length_int); | |
968 | 641 |
969 // Packet should be stored in a send bucket. | 642 // Packet should be stored in a send bucket. |
970 EXPECT_TRUE(rtp_sender_->SendToNetwork(packet_, 0, rtp_length, | 643 EXPECT_TRUE(rtp_sender_->SendToNetwork(std::move(packet), |
971 capture_time_ms, kAllowRetransmission, | 644 kAllowRetransmission, |
972 RtpPacketSender::kNormalPriority)); | 645 RtpPacketSender::kNormalPriority)); |
973 | 646 |
974 EXPECT_EQ(0, transport_.packets_sent_); | 647 EXPECT_EQ(0, transport_.packets_sent_); |
975 | 648 |
976 EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kNormalPriority, | 649 EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kNormalPriority, |
977 _, kSeqNum, _, _, _)); | 650 _, kSeqNum, _, _, _)); |
978 | 651 |
979 const int kStoredTimeInMs = 100; | 652 const int kStoredTimeInMs = 100; |
980 fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs); | 653 fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs); |
981 | 654 |
982 EXPECT_EQ(rtp_length_int, rtp_sender_->ReSendPacket(kSeqNum)); | 655 EXPECT_EQ(static_cast<int>(packet_size), rtp_sender_->ReSendPacket(kSeqNum)); |
983 EXPECT_EQ(0, transport_.packets_sent_); | 656 EXPECT_EQ(0, transport_.packets_sent_); |
984 | 657 |
985 rtp_sender_->TimeToSendPacket(kSeqNum, capture_time_ms, false, | 658 rtp_sender_->TimeToSendPacket(kSeqNum, capture_time_ms, false, |
986 PacketInfo::kNotAProbe); | 659 PacketInfo::kNotAProbe); |
987 | 660 |
988 // Process send bucket. Packet should now be sent. | 661 // Process send bucket. Packet should now be sent. |
989 EXPECT_EQ(1, transport_.packets_sent_); | 662 EXPECT_EQ(1, transport_.packets_sent_); |
990 EXPECT_EQ(rtp_length, transport_.last_sent_packet_len_); | 663 EXPECT_EQ(packet_size, transport_.last_sent_packet_len_); |
991 | 664 |
992 // Parse sent packet. | 665 // Parse sent packet. |
993 webrtc::RtpUtility::RtpHeaderParser rtp_parser(transport_.last_sent_packet_, | 666 webrtc::RtpUtility::RtpHeaderParser rtp_parser(transport_.last_sent_packet_, |
994 rtp_length); | 667 packet_size); |
995 webrtc::RTPHeader rtp_header; | 668 webrtc::RTPHeader rtp_header; |
996 RtpHeaderExtensionMap map; | 669 RtpHeaderExtensionMap map; |
997 map.Register(kRtpExtensionTransmissionTimeOffset, | 670 map.Register(kRtpExtensionTransmissionTimeOffset, |
998 kTransmissionTimeOffsetExtensionId); | 671 kTransmissionTimeOffsetExtensionId); |
999 map.Register(kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId); | 672 map.Register(kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId); |
1000 const bool valid_rtp_header = rtp_parser.Parse(&rtp_header, &map); | 673 const bool valid_rtp_header = rtp_parser.Parse(&rtp_header, &map); |
1001 ASSERT_TRUE(valid_rtp_header); | 674 ASSERT_TRUE(valid_rtp_header); |
1002 | 675 |
1003 // Verify transmission time offset. | 676 // Verify transmission time offset. |
1004 EXPECT_EQ(kStoredTimeInMs * 90, rtp_header.extension.transmissionTimeOffset); | 677 EXPECT_EQ(kStoredTimeInMs * 90, rtp_header.extension.transmissionTimeOffset); |
(...skipping 30 matching lines...) Expand all Loading... |
1035 std::unique_ptr<webrtc::RtpHeaderParser> rtp_parser( | 708 std::unique_ptr<webrtc::RtpHeaderParser> rtp_parser( |
1036 webrtc::RtpHeaderParser::Create()); | 709 webrtc::RtpHeaderParser::Create()); |
1037 ASSERT_TRUE(rtp_parser.get() != nullptr); | 710 ASSERT_TRUE(rtp_parser.get() != nullptr); |
1038 rtp_parser->RegisterRtpHeaderExtension(kRtpExtensionTransmissionTimeOffset, | 711 rtp_parser->RegisterRtpHeaderExtension(kRtpExtensionTransmissionTimeOffset, |
1039 kTransmissionTimeOffsetExtensionId); | 712 kTransmissionTimeOffsetExtensionId); |
1040 rtp_parser->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime, | 713 rtp_parser->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime, |
1041 kAbsoluteSendTimeExtensionId); | 714 kAbsoluteSendTimeExtensionId); |
1042 webrtc::RTPHeader rtp_header; | 715 webrtc::RTPHeader rtp_header; |
1043 | 716 |
1044 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds(); | 717 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds(); |
1045 int rtp_length_int = rtp_sender_->BuildRtpHeader( | 718 auto packet = |
1046 packet_, kPayload, kMarkerBit, timestamp, capture_time_ms); | 719 BuildRtpPacket(kPayload, kMarkerBit, timestamp, capture_time_ms); |
1047 const uint32_t media_packet_timestamp = timestamp; | 720 const uint32_t media_packet_timestamp = timestamp; |
1048 ASSERT_NE(-1, rtp_length_int); | 721 size_t packet_size = packet->size(); |
1049 size_t rtp_length = static_cast<size_t>(rtp_length_int); | |
1050 | 722 |
1051 // Packet should be stored in a send bucket. | 723 // Packet should be stored in a send bucket. |
1052 EXPECT_TRUE(rtp_sender_->SendToNetwork(packet_, 0, rtp_length, | 724 EXPECT_TRUE(rtp_sender_->SendToNetwork(std::move(packet), |
1053 capture_time_ms, kAllowRetransmission, | 725 kAllowRetransmission, |
1054 RtpPacketSender::kNormalPriority)); | 726 RtpPacketSender::kNormalPriority)); |
1055 | 727 |
1056 int total_packets_sent = 0; | 728 int total_packets_sent = 0; |
1057 EXPECT_EQ(total_packets_sent, transport_.packets_sent_); | 729 EXPECT_EQ(total_packets_sent, transport_.packets_sent_); |
1058 | 730 |
1059 const int kStoredTimeInMs = 100; | 731 const int kStoredTimeInMs = 100; |
1060 fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs); | 732 fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs); |
1061 rtp_sender_->TimeToSendPacket(seq_num++, capture_time_ms, false, | 733 rtp_sender_->TimeToSendPacket(seq_num++, capture_time_ms, false, |
1062 PacketInfo::kNotAProbe); | 734 PacketInfo::kNotAProbe); |
1063 // Packet should now be sent. This test doesn't verify the regular video | 735 // Packet should now be sent. This test doesn't verify the regular video |
(...skipping 29 matching lines...) Expand all Loading... |
1093 EXPECT_EQ(offset, rtp_header.extension.transmissionTimeOffset); | 765 EXPECT_EQ(offset, rtp_header.extension.transmissionTimeOffset); |
1094 uint64_t expected_send_time = | 766 uint64_t expected_send_time = |
1095 ConvertMsToAbsSendTime(fake_clock_.TimeInMilliseconds()); | 767 ConvertMsToAbsSendTime(fake_clock_.TimeInMilliseconds()); |
1096 EXPECT_EQ(expected_send_time, rtp_header.extension.absoluteSendTime); | 768 EXPECT_EQ(expected_send_time, rtp_header.extension.absoluteSendTime); |
1097 fake_clock_.AdvanceTimeMilliseconds(kPaddingPeriodMs); | 769 fake_clock_.AdvanceTimeMilliseconds(kPaddingPeriodMs); |
1098 timestamp += 90 * kPaddingPeriodMs; | 770 timestamp += 90 * kPaddingPeriodMs; |
1099 } | 771 } |
1100 | 772 |
1101 // Send a regular video packet again. | 773 // Send a regular video packet again. |
1102 capture_time_ms = fake_clock_.TimeInMilliseconds(); | 774 capture_time_ms = fake_clock_.TimeInMilliseconds(); |
1103 rtp_length_int = rtp_sender_->BuildRtpHeader(packet_, kPayload, kMarkerBit, | 775 packet = BuildRtpPacket(kPayload, kMarkerBit, timestamp, capture_time_ms); |
1104 timestamp, capture_time_ms); | 776 packet_size = packet->size(); |
1105 ASSERT_NE(-1, rtp_length_int); | |
1106 rtp_length = static_cast<size_t>(rtp_length_int); | |
1107 | 777 |
1108 EXPECT_CALL(mock_paced_sender_, | 778 EXPECT_CALL(mock_paced_sender_, |
1109 InsertPacket(RtpPacketSender::kNormalPriority, _, _, _, _, _)); | 779 InsertPacket(RtpPacketSender::kNormalPriority, _, _, _, _, _)); |
1110 | 780 |
1111 // Packet should be stored in a send bucket. | 781 // Packet should be stored in a send bucket. |
1112 EXPECT_TRUE(rtp_sender_->SendToNetwork(packet_, 0, rtp_length, | 782 EXPECT_TRUE(rtp_sender_->SendToNetwork(std::move(packet), |
1113 capture_time_ms, kAllowRetransmission, | 783 kAllowRetransmission, |
1114 RtpPacketSender::kNormalPriority)); | 784 RtpPacketSender::kNormalPriority)); |
1115 | 785 |
1116 rtp_sender_->TimeToSendPacket(seq_num, capture_time_ms, false, | 786 rtp_sender_->TimeToSendPacket(seq_num, capture_time_ms, false, |
1117 PacketInfo::kNotAProbe); | 787 PacketInfo::kNotAProbe); |
1118 // Process send bucket. | 788 // Process send bucket. |
1119 EXPECT_EQ(++total_packets_sent, transport_.packets_sent_); | 789 EXPECT_EQ(++total_packets_sent, transport_.packets_sent_); |
1120 EXPECT_EQ(rtp_length, transport_.last_sent_packet_len_); | 790 EXPECT_EQ(packet_size, transport_.last_sent_packet_len_); |
1121 // Parse sent packet. | 791 // Parse sent packet. |
1122 ASSERT_TRUE( | 792 ASSERT_TRUE(rtp_parser->Parse(transport_.last_sent_packet_, packet_size, |
1123 rtp_parser->Parse(transport_.last_sent_packet_, rtp_length, &rtp_header)); | 793 &rtp_header)); |
1124 | 794 |
1125 // Verify sequence number and timestamp. | 795 // Verify sequence number and timestamp. |
1126 EXPECT_EQ(seq_num, rtp_header.sequenceNumber); | 796 EXPECT_EQ(seq_num, rtp_header.sequenceNumber); |
1127 EXPECT_EQ(timestamp, rtp_header.timestamp); | 797 EXPECT_EQ(timestamp, rtp_header.timestamp); |
1128 // Verify transmission time offset. This packet is sent without delay. | 798 // Verify transmission time offset. This packet is sent without delay. |
1129 EXPECT_EQ(0, rtp_header.extension.transmissionTimeOffset); | 799 EXPECT_EQ(0, rtp_header.extension.transmissionTimeOffset); |
1130 uint64_t expected_send_time = | 800 uint64_t expected_send_time = |
1131 ConvertMsToAbsSendTime(fake_clock_.TimeInMilliseconds()); | 801 ConvertMsToAbsSendTime(fake_clock_.TimeInMilliseconds()); |
1132 EXPECT_EQ(expected_send_time, rtp_header.extension.absoluteSendTime); | 802 EXPECT_EQ(expected_send_time, rtp_header.extension.absoluteSendTime); |
1133 } | 803 } |
(...skipping 618 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1752 // Must be at least 5ms in between retransmission attempts. | 1422 // Must be at least 5ms in between retransmission attempts. |
1753 fake_clock_.AdvanceTimeMilliseconds(5); | 1423 fake_clock_.AdvanceTimeMilliseconds(5); |
1754 | 1424 |
1755 // Resending should not work, bandwidth exceeded. | 1425 // Resending should not work, bandwidth exceeded. |
1756 rtp_sender_->OnReceivedNack(sequence_numbers, 0); | 1426 rtp_sender_->OnReceivedNack(sequence_numbers, 0); |
1757 EXPECT_EQ(kNumPackets * 2, transport_.packets_sent_); | 1427 EXPECT_EQ(kNumPackets * 2, transport_.packets_sent_); |
1758 } | 1428 } |
1759 | 1429 |
1760 // Verify that all packets of a frame have CVO byte set. | 1430 // Verify that all packets of a frame have CVO byte set. |
1761 TEST_F(RtpSenderVideoTest, SendVideoWithCVO) { | 1431 TEST_F(RtpSenderVideoTest, SendVideoWithCVO) { |
| 1432 uint8_t kFrame[kMaxPacketLength]; |
1762 RTPVideoHeader hdr = {0}; | 1433 RTPVideoHeader hdr = {0}; |
1763 hdr.rotation = kVideoRotation_90; | 1434 hdr.rotation = kVideoRotation_90; |
1764 | 1435 |
1765 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( | 1436 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( |
1766 kRtpExtensionVideoRotation, kVideoRotationExtensionId)); | 1437 kRtpExtensionVideoRotation, kVideoRotationExtensionId)); |
1767 EXPECT_TRUE(rtp_sender_->ActivateCVORtpHeaderExtension()); | 1438 EXPECT_TRUE(rtp_sender_->ActivateCVORtpHeaderExtension()); |
1768 | 1439 |
1769 EXPECT_EQ( | 1440 EXPECT_EQ( |
1770 RtpUtility::Word32Align(kRtpOneByteHeaderLength + kVideoRotationLength), | 1441 RtpUtility::Word32Align(kRtpOneByteHeaderLength + kVideoRotationLength), |
1771 rtp_sender_->RtpHeaderExtensionLength()); | 1442 rtp_sender_->RtpHeaderExtensionLength()); |
1772 | 1443 |
1773 rtp_sender_video_->SendVideo(kRtpVideoGeneric, kVideoFrameKey, kPayload, | 1444 rtp_sender_video_->SendVideo(kRtpVideoGeneric, kVideoFrameKey, kPayload, |
1774 kTimestamp, 0, packet_, sizeof(packet_), nullptr, | 1445 kTimestamp, 0, kFrame, sizeof(kFrame), nullptr, |
1775 &hdr); | 1446 &hdr); |
1776 | 1447 |
1777 RtpHeaderExtensionMap map; | 1448 RtpHeaderExtensionMap map; |
1778 map.Register(kRtpExtensionVideoRotation, kVideoRotationExtensionId); | 1449 map.Register(kRtpExtensionVideoRotation, kVideoRotationExtensionId); |
1779 | 1450 |
1780 // Verify that this packet does have CVO byte. | 1451 // Verify that this packet does have CVO byte. |
1781 VerifyCVOPacket( | 1452 VerifyCVOPacket( |
1782 reinterpret_cast<uint8_t*>(transport_.sent_packets_[0]->data()), | 1453 reinterpret_cast<uint8_t*>(transport_.sent_packets_[0]->data()), |
1783 transport_.sent_packets_[0]->size(), true, &map, kSeqNum, hdr.rotation); | 1454 transport_.sent_packets_[0]->size(), true, &map, kSeqNum, hdr.rotation); |
1784 | 1455 |
(...skipping 19 matching lines...) Expand all Loading... |
1804 ConvertCVOByteToVideoRotation(flip_bit | camera_bit | 0)); | 1475 ConvertCVOByteToVideoRotation(flip_bit | camera_bit | 0)); |
1805 EXPECT_EQ(kVideoRotation_90, | 1476 EXPECT_EQ(kVideoRotation_90, |
1806 ConvertCVOByteToVideoRotation(flip_bit | camera_bit | 1)); | 1477 ConvertCVOByteToVideoRotation(flip_bit | camera_bit | 1)); |
1807 EXPECT_EQ(kVideoRotation_180, | 1478 EXPECT_EQ(kVideoRotation_180, |
1808 ConvertCVOByteToVideoRotation(flip_bit | camera_bit | 2)); | 1479 ConvertCVOByteToVideoRotation(flip_bit | camera_bit | 2)); |
1809 EXPECT_EQ(kVideoRotation_270, | 1480 EXPECT_EQ(kVideoRotation_270, |
1810 ConvertCVOByteToVideoRotation(flip_bit | camera_bit | 3)); | 1481 ConvertCVOByteToVideoRotation(flip_bit | camera_bit | 3)); |
1811 } | 1482 } |
1812 | 1483 |
1813 } // namespace webrtc | 1484 } // namespace webrtc |
OLD | NEW |