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 |
11 #include <memory> | 11 #include <memory> |
12 #include <vector> | 12 #include <vector> |
13 | 13 |
14 #include "webrtc/base/buffer.h" | 14 #include "webrtc/base/buffer.h" |
15 #include "webrtc/base/rate_limiter.h" | 15 #include "webrtc/base/rate_limiter.h" |
16 #include "webrtc/call/mock/mock_rtc_event_log.h" | 16 #include "webrtc/call/mock/mock_rtc_event_log.h" |
17 #include "webrtc/modules/rtp_rtcp/include/rtp_cvo.h" | 17 #include "webrtc/modules/rtp_rtcp/include/rtp_cvo.h" |
18 #include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h" | 18 #include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h" |
19 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h" | 19 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h" |
20 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h" | 20 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h" |
21 #include "webrtc/modules/rtp_rtcp/source/rtp_format_video_generic.h" | 21 #include "webrtc/modules/rtp_rtcp/source/rtp_format_video_generic.h" |
22 #include "webrtc/modules/rtp_rtcp/source/rtp_header_extension.h" | 22 #include "webrtc/modules/rtp_rtcp/source/rtp_header_extension.h" |
23 #include "webrtc/modules/rtp_rtcp/source/rtp_header_extensions.h" | 23 #include "webrtc/modules/rtp_rtcp/source/rtp_header_extensions.h" |
| 24 #include "webrtc/modules/rtp_rtcp/source/rtp_packet_received.h" |
24 #include "webrtc/modules/rtp_rtcp/source/rtp_packet_to_send.h" | 25 #include "webrtc/modules/rtp_rtcp/source/rtp_packet_to_send.h" |
25 #include "webrtc/modules/rtp_rtcp/source/rtp_sender.h" | 26 #include "webrtc/modules/rtp_rtcp/source/rtp_sender.h" |
26 #include "webrtc/modules/rtp_rtcp/source/rtp_sender_video.h" | 27 #include "webrtc/modules/rtp_rtcp/source/rtp_sender_video.h" |
27 #include "webrtc/modules/rtp_rtcp/source/rtp_utility.h" | 28 #include "webrtc/modules/rtp_rtcp/source/rtp_utility.h" |
28 #include "webrtc/system_wrappers/include/stl_util.h" | 29 #include "webrtc/system_wrappers/include/stl_util.h" |
29 #include "webrtc/test/gmock.h" | 30 #include "webrtc/test/gmock.h" |
30 #include "webrtc/test/gtest.h" | 31 #include "webrtc/test/gtest.h" |
31 #include "webrtc/test/mock_transport.h" | 32 #include "webrtc/test/mock_transport.h" |
32 #include "webrtc/typedefs.h" | 33 #include "webrtc/typedefs.h" |
33 | 34 |
(...skipping 14 matching lines...) Expand all Loading... |
48 const int kAudioPayload = 103; | 49 const int kAudioPayload = 103; |
49 const uint64_t kStartTime = 123456789; | 50 const uint64_t kStartTime = 123456789; |
50 const size_t kMaxPaddingSize = 224u; | 51 const size_t kMaxPaddingSize = 224u; |
51 const int kVideoRotationExtensionId = 5; | 52 const int kVideoRotationExtensionId = 5; |
52 const size_t kGenericHeaderLength = 1; | 53 const size_t kGenericHeaderLength = 1; |
53 const uint8_t kPayloadData[] = {47, 11, 32, 93, 89}; | 54 const uint8_t kPayloadData[] = {47, 11, 32, 93, 89}; |
54 | 55 |
55 using ::testing::_; | 56 using ::testing::_; |
56 using ::testing::ElementsAreArray; | 57 using ::testing::ElementsAreArray; |
57 | 58 |
58 const uint8_t* GetPayloadData(const RTPHeader& rtp_header, | |
59 const uint8_t* packet) { | |
60 return packet + rtp_header.headerLength; | |
61 } | |
62 | |
63 size_t GetPayloadDataLength(const RTPHeader& rtp_header, | |
64 const size_t packet_length) { | |
65 return packet_length - rtp_header.headerLength - rtp_header.paddingLength; | |
66 } | |
67 | |
68 uint64_t ConvertMsToAbsSendTime(int64_t time_ms) { | 59 uint64_t ConvertMsToAbsSendTime(int64_t time_ms) { |
69 return (((time_ms << 18) + 500) / 1000) & 0x00ffffff; | 60 return (((time_ms << 18) + 500) / 1000) & 0x00ffffff; |
70 } | 61 } |
71 | 62 |
72 class LoopbackTransportTest : public webrtc::Transport { | 63 class LoopbackTransportTest : public webrtc::Transport { |
73 public: | 64 public: |
74 LoopbackTransportTest() | 65 LoopbackTransportTest() : total_bytes_sent_(0), last_packet_id_(-1) { |
75 : packets_sent_(0), | 66 receivers_extensions_.Register(kRtpExtensionTransmissionTimeOffset, |
76 last_sent_packet_len_(0), | 67 kTransmissionTimeOffsetExtensionId); |
77 total_bytes_sent_(0), | 68 receivers_extensions_.Register(kRtpExtensionAbsoluteSendTime, |
78 last_sent_packet_(nullptr), | 69 kAbsoluteSendTimeExtensionId); |
79 last_packet_id_(-1) {} | 70 receivers_extensions_.Register(kRtpExtensionTransportSequenceNumber, |
| 71 kTransportSequenceNumberExtensionId); |
| 72 receivers_extensions_.Register(kRtpExtensionVideoRotation, |
| 73 kVideoRotationExtensionId); |
| 74 receivers_extensions_.Register(kRtpExtensionAudioLevel, |
| 75 kAudioLevelExtensionId); |
| 76 } |
80 | 77 |
81 ~LoopbackTransportTest() { | |
82 STLDeleteContainerPointers(sent_packets_.begin(), sent_packets_.end()); | |
83 } | |
84 bool SendRtp(const uint8_t* data, | 78 bool SendRtp(const uint8_t* data, |
85 size_t len, | 79 size_t len, |
86 const PacketOptions& options) override { | 80 const PacketOptions& options) override { |
87 packets_sent_++; | |
88 rtc::Buffer* buffer = | |
89 new rtc::Buffer(reinterpret_cast<const uint8_t*>(data), len); | |
90 last_sent_packet_ = buffer->data(); | |
91 last_sent_packet_len_ = len; | |
92 last_packet_id_ = options.packet_id; | 81 last_packet_id_ = options.packet_id; |
93 total_bytes_sent_ += len; | 82 total_bytes_sent_ += len; |
94 sent_packets_.push_back(buffer); | 83 sent_packets_.push_back(RtpPacketReceived(&receivers_extensions_)); |
| 84 EXPECT_TRUE(sent_packets_.back().Parse(data, len)); |
95 return true; | 85 return true; |
96 } | 86 } |
97 bool SendRtcp(const uint8_t* data, size_t len) override { return false; } | 87 bool SendRtcp(const uint8_t* data, size_t len) override { return false; } |
98 int packets_sent_; | 88 const RtpPacketReceived& last_sent_packet() { return sent_packets_.back(); } |
99 size_t last_sent_packet_len_; | 89 int packets_sent() { return sent_packets_.size(); } |
| 90 |
100 size_t total_bytes_sent_; | 91 size_t total_bytes_sent_; |
101 uint8_t* last_sent_packet_; | |
102 int last_packet_id_; | 92 int last_packet_id_; |
103 std::vector<rtc::Buffer*> sent_packets_; | 93 std::vector<RtpPacketReceived> sent_packets_; |
| 94 |
| 95 private: |
| 96 RtpHeaderExtensionMap receivers_extensions_; |
104 }; | 97 }; |
105 | 98 |
106 } // namespace | 99 } // namespace |
107 | 100 |
108 class MockRtpPacketSender : public RtpPacketSender { | 101 class MockRtpPacketSender : public RtpPacketSender { |
109 public: | 102 public: |
110 MockRtpPacketSender() {} | 103 MockRtpPacketSender() {} |
111 virtual ~MockRtpPacketSender() {} | 104 virtual ~MockRtpPacketSender() {} |
112 | 105 |
113 MOCK_METHOD6(InsertPacket, | 106 MOCK_METHOD6(InsertPacket, |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
243 class RtpSenderVideoTest : public RtpSenderTest { | 236 class RtpSenderVideoTest : public RtpSenderTest { |
244 protected: | 237 protected: |
245 void SetUp() override { | 238 void SetUp() override { |
246 // TODO(pbos): Set up to use pacer. | 239 // TODO(pbos): Set up to use pacer. |
247 SetUpRtpSender(false); | 240 SetUpRtpSender(false); |
248 rtp_sender_video_.reset( | 241 rtp_sender_video_.reset( |
249 new RTPSenderVideo(&fake_clock_, rtp_sender_.get())); | 242 new RTPSenderVideo(&fake_clock_, rtp_sender_.get())); |
250 } | 243 } |
251 std::unique_ptr<RTPSenderVideo> rtp_sender_video_; | 244 std::unique_ptr<RTPSenderVideo> rtp_sender_video_; |
252 | 245 |
253 void VerifyCVOPacket(uint8_t* data, | 246 void VerifyCVOPacket(const RtpPacketReceived& rtp_packet, |
254 size_t len, | |
255 bool expect_cvo, | 247 bool expect_cvo, |
256 RtpHeaderExtensionMap* map, | |
257 uint16_t seq_num, | 248 uint16_t seq_num, |
258 VideoRotation rotation) { | 249 VideoRotation expected_rotation) { |
259 webrtc::RtpUtility::RtpHeaderParser rtp_parser(data, len); | 250 EXPECT_EQ(payload_, rtp_packet.PayloadType()); |
260 | 251 EXPECT_EQ(seq_num, rtp_packet.SequenceNumber()); |
261 webrtc::RTPHeader rtp_header; | 252 EXPECT_EQ(kTimestamp, rtp_packet.Timestamp()); |
262 ASSERT_TRUE(rtp_parser.Parse(&rtp_header, map)); | 253 EXPECT_EQ(rtp_sender_->SSRC(), rtp_packet.Ssrc()); |
263 ASSERT_FALSE(rtp_parser.RTCP()); | 254 EXPECT_EQ(0U, rtp_packet.Csrcs().size()); |
264 EXPECT_EQ(payload_, rtp_header.payloadType); | 255 EXPECT_EQ(0U, rtp_packet.padding_size()); |
265 EXPECT_EQ(seq_num, rtp_header.sequenceNumber); | 256 VideoRotation actual_rotation; |
266 EXPECT_EQ(kTimestamp, rtp_header.timestamp); | 257 EXPECT_TRUE(rtp_packet.GetExtension<VideoOrientation>(&actual_rotation)); |
267 EXPECT_EQ(rtp_sender_->SSRC(), rtp_header.ssrc); | 258 EXPECT_EQ(expected_rotation, actual_rotation); |
268 EXPECT_EQ(0, rtp_header.numCSRCs); | |
269 EXPECT_EQ(0U, rtp_header.paddingLength); | |
270 EXPECT_EQ(rotation, rtp_header.extension.videoRotation); | |
271 } | 259 } |
272 }; | 260 }; |
273 | 261 |
274 TEST_F(RtpSenderTestWithoutPacer, | 262 TEST_F(RtpSenderTestWithoutPacer, |
275 RegisterRtpTransmissionTimeOffsetHeaderExtension) { | 263 RegisterRtpTransmissionTimeOffsetHeaderExtension) { |
276 EXPECT_EQ(0u, rtp_sender_->RtpHeaderExtensionLength()); | 264 EXPECT_EQ(0u, rtp_sender_->RtpHeaderExtensionLength()); |
277 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( | 265 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( |
278 kRtpExtensionTransmissionTimeOffset, | 266 kRtpExtensionTransmissionTimeOffset, |
279 kTransmissionTimeOffsetExtensionId)); | 267 kTransmissionTimeOffsetExtensionId)); |
280 EXPECT_EQ(kRtpOneByteHeaderLength + kTransmissionTimeOffsetLength, | 268 EXPECT_EQ(kRtpOneByteHeaderLength + kTransmissionTimeOffsetLength, |
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
454 constexpr size_t kPaddingSize = 100; | 442 constexpr size_t kPaddingSize = 100; |
455 auto packet = rtp_sender_->AllocatePacket(); | 443 auto packet = rtp_sender_->AllocatePacket(); |
456 ASSERT_TRUE(packet); | 444 ASSERT_TRUE(packet); |
457 packet->SetMarker(true); | 445 packet->SetMarker(true); |
458 packet->SetTimestamp(kTimestamp); | 446 packet->SetTimestamp(kTimestamp); |
459 | 447 |
460 ASSERT_TRUE(rtp_sender_->AssignSequenceNumber(packet.get())); | 448 ASSERT_TRUE(rtp_sender_->AssignSequenceNumber(packet.get())); |
461 ASSERT_TRUE(rtp_sender_->TimeToSendPadding(kPaddingSize, -1)); | 449 ASSERT_TRUE(rtp_sender_->TimeToSendPadding(kPaddingSize, -1)); |
462 | 450 |
463 ASSERT_EQ(1u, transport_.sent_packets_.size()); | 451 ASSERT_EQ(1u, transport_.sent_packets_.size()); |
464 // Parse the padding packet and verify its timestamp. | 452 // Verify padding packet timestamp. |
465 RtpPacketToSend padding_packet(nullptr); | 453 EXPECT_EQ(kTimestamp, transport_.last_sent_packet().Timestamp()); |
466 ASSERT_TRUE(padding_packet.Parse(transport_.sent_packets_[0]->data(), | |
467 transport_.sent_packets_[0]->size())); | |
468 EXPECT_EQ(kTimestamp, padding_packet.Timestamp()); | |
469 } | 454 } |
470 | 455 |
471 TEST_F(RtpSenderTestWithoutPacer, SendsPacketsWithTransportSequenceNumber) { | 456 TEST_F(RtpSenderTestWithoutPacer, SendsPacketsWithTransportSequenceNumber) { |
472 rtp_sender_.reset(new RTPSender( | 457 rtp_sender_.reset(new RTPSender( |
473 false, &fake_clock_, &transport_, nullptr, | 458 false, &fake_clock_, &transport_, nullptr, |
474 &seq_num_allocator_, &feedback_observer_, nullptr, nullptr, nullptr, | 459 &seq_num_allocator_, &feedback_observer_, nullptr, nullptr, nullptr, |
475 &mock_rtc_event_log_, &send_packet_observer_, | 460 &mock_rtc_event_log_, &send_packet_observer_, |
476 &retransmission_rate_limiter_)); | 461 &retransmission_rate_limiter_)); |
477 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( | 462 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( |
478 kRtpExtensionTransportSequenceNumber, | 463 kRtpExtensionTransportSequenceNumber, |
479 kTransportSequenceNumberExtensionId)); | 464 kTransportSequenceNumberExtensionId)); |
480 | 465 |
481 EXPECT_CALL(seq_num_allocator_, AllocateSequenceNumber()) | 466 EXPECT_CALL(seq_num_allocator_, AllocateSequenceNumber()) |
482 .WillOnce(testing::Return(kTransportSequenceNumber)); | 467 .WillOnce(testing::Return(kTransportSequenceNumber)); |
483 EXPECT_CALL(send_packet_observer_, | 468 EXPECT_CALL(send_packet_observer_, |
484 OnSendPacket(kTransportSequenceNumber, _, _)) | 469 OnSendPacket(kTransportSequenceNumber, _, _)) |
485 .Times(1); | 470 .Times(1); |
486 EXPECT_CALL(feedback_observer_, | 471 EXPECT_CALL(feedback_observer_, |
487 AddPacket(kTransportSequenceNumber, | 472 AddPacket(kTransportSequenceNumber, |
488 sizeof(kPayloadData) + kGenericHeaderLength, | 473 sizeof(kPayloadData) + kGenericHeaderLength, |
489 PacketInfo::kNotAProbe)) | 474 PacketInfo::kNotAProbe)) |
490 .Times(1); | 475 .Times(1); |
491 | 476 |
492 SendGenericPayload(); | 477 SendGenericPayload(); |
493 | 478 |
494 RtpUtility::RtpHeaderParser rtp_parser(transport_.last_sent_packet_, | 479 const auto& packet = transport_.last_sent_packet(); |
495 transport_.last_sent_packet_len_); | 480 uint16_t transport_seq_no; |
496 webrtc::RTPHeader rtp_header; | 481 ASSERT_TRUE(packet.GetExtension<TransportSequenceNumber>(&transport_seq_no)); |
497 RtpHeaderExtensionMap map; | 482 EXPECT_EQ(kTransportSequenceNumber, transport_seq_no); |
498 map.Register(kRtpExtensionTransportSequenceNumber, | 483 EXPECT_EQ(transport_.last_packet_id_, transport_seq_no); |
499 kTransportSequenceNumberExtensionId); | |
500 EXPECT_TRUE(rtp_parser.Parse(&rtp_header, &map)); | |
501 EXPECT_TRUE(rtp_header.extension.hasTransportSequenceNumber); | |
502 EXPECT_EQ(kTransportSequenceNumber, | |
503 rtp_header.extension.transportSequenceNumber); | |
504 EXPECT_EQ(transport_.last_packet_id_, | |
505 rtp_header.extension.transportSequenceNumber); | |
506 } | 484 } |
507 | 485 |
508 TEST_F(RtpSenderTestWithoutPacer, NoAllocationIfNotRegistered) { | 486 TEST_F(RtpSenderTestWithoutPacer, NoAllocationIfNotRegistered) { |
509 SendGenericPayload(); | 487 SendGenericPayload(); |
510 } | 488 } |
511 | 489 |
512 TEST_F(RtpSenderTestWithoutPacer, OnSendPacketUpdated) { | 490 TEST_F(RtpSenderTestWithoutPacer, OnSendPacketUpdated) { |
513 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( | 491 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( |
514 kRtpExtensionTransportSequenceNumber, | 492 kRtpExtensionTransportSequenceNumber, |
515 kTransportSequenceNumberExtensionId)); | 493 kTransportSequenceNumberExtensionId)); |
(...skipping 29 matching lines...) Expand all Loading... |
545 EXPECT_CALL( | 523 EXPECT_CALL( |
546 feedback_observer_, | 524 feedback_observer_, |
547 AddPacket(kTransportSequenceNumber, | 525 AddPacket(kTransportSequenceNumber, |
548 sizeof(kPayloadData) + kGenericHeaderLength, kProbeClusterId)) | 526 sizeof(kPayloadData) + kGenericHeaderLength, kProbeClusterId)) |
549 .Times(1); | 527 .Times(1); |
550 | 528 |
551 SendGenericPayload(); | 529 SendGenericPayload(); |
552 rtp_sender_->TimeToSendPacket(seq_num, fake_clock_.TimeInMilliseconds(), | 530 rtp_sender_->TimeToSendPacket(seq_num, fake_clock_.TimeInMilliseconds(), |
553 false, kProbeClusterId); | 531 false, kProbeClusterId); |
554 | 532 |
555 RtpUtility::RtpHeaderParser rtp_parser(transport_.last_sent_packet_, | 533 const auto& packet = transport_.last_sent_packet(); |
556 transport_.last_sent_packet_len_); | 534 uint16_t transport_seq_no; |
557 webrtc::RTPHeader rtp_header; | 535 EXPECT_TRUE(packet.GetExtension<TransportSequenceNumber>(&transport_seq_no)); |
558 RtpHeaderExtensionMap map; | 536 EXPECT_EQ(kTransportSequenceNumber, transport_seq_no); |
559 map.Register(kRtpExtensionTransportSequenceNumber, | 537 EXPECT_EQ(transport_.last_packet_id_, transport_seq_no); |
560 kTransportSequenceNumberExtensionId); | |
561 EXPECT_TRUE(rtp_parser.Parse(&rtp_header, &map)); | |
562 EXPECT_TRUE(rtp_header.extension.hasTransportSequenceNumber); | |
563 EXPECT_EQ(kTransportSequenceNumber, | |
564 rtp_header.extension.transportSequenceNumber); | |
565 EXPECT_EQ(transport_.last_packet_id_, | |
566 rtp_header.extension.transportSequenceNumber); | |
567 } | 538 } |
568 | 539 |
569 TEST_F(RtpSenderTest, TrafficSmoothingWithExtensions) { | 540 TEST_F(RtpSenderTest, TrafficSmoothingWithExtensions) { |
570 EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kNormalPriority, | 541 EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kNormalPriority, |
571 _, kSeqNum, _, _, _)); | 542 _, kSeqNum, _, _, _)); |
572 EXPECT_CALL(mock_rtc_event_log_, | 543 EXPECT_CALL(mock_rtc_event_log_, |
573 LogRtpHeader(PacketDirection::kOutgoingPacket, _, _, _)); | 544 LogRtpHeader(PacketDirection::kOutgoingPacket, _, _, _)); |
574 | 545 |
575 rtp_sender_->SetStorePacketsStatus(true, 10); | 546 rtp_sender_->SetStorePacketsStatus(true, 10); |
576 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( | 547 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( |
577 kRtpExtensionTransmissionTimeOffset, | 548 kRtpExtensionTransmissionTimeOffset, |
578 kTransmissionTimeOffsetExtensionId)); | 549 kTransmissionTimeOffsetExtensionId)); |
579 EXPECT_EQ( | 550 EXPECT_EQ( |
580 0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime, | 551 0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime, |
581 kAbsoluteSendTimeExtensionId)); | 552 kAbsoluteSendTimeExtensionId)); |
582 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds(); | 553 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds(); |
583 auto packet = | 554 auto packet = |
584 BuildRtpPacket(kPayload, kMarkerBit, kTimestamp, capture_time_ms); | 555 BuildRtpPacket(kPayload, kMarkerBit, kTimestamp, capture_time_ms); |
585 size_t packet_size = packet->size(); | 556 size_t packet_size = packet->size(); |
586 | 557 |
587 // Packet should be stored in a send bucket. | 558 // Packet should be stored in a send bucket. |
588 EXPECT_TRUE(rtp_sender_->SendToNetwork(std::move(packet), | 559 EXPECT_TRUE(rtp_sender_->SendToNetwork(std::move(packet), |
589 kAllowRetransmission, | 560 kAllowRetransmission, |
590 RtpPacketSender::kNormalPriority)); | 561 RtpPacketSender::kNormalPriority)); |
591 | 562 |
592 EXPECT_EQ(0, transport_.packets_sent_); | 563 EXPECT_EQ(0, transport_.packets_sent()); |
593 | 564 |
594 const int kStoredTimeInMs = 100; | 565 const int kStoredTimeInMs = 100; |
595 fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs); | 566 fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs); |
596 | 567 |
597 rtp_sender_->TimeToSendPacket(kSeqNum, capture_time_ms, false, | 568 rtp_sender_->TimeToSendPacket(kSeqNum, capture_time_ms, false, |
598 PacketInfo::kNotAProbe); | 569 PacketInfo::kNotAProbe); |
599 | 570 |
600 // Process send bucket. Packet should now be sent. | 571 // Process send bucket. Packet should now be sent. |
601 EXPECT_EQ(1, transport_.packets_sent_); | 572 EXPECT_EQ(1, transport_.packets_sent()); |
602 EXPECT_EQ(packet_size, transport_.last_sent_packet_len_); | 573 EXPECT_EQ(packet_size, transport_.last_sent_packet().size()); |
603 // Parse sent packet. | 574 |
604 webrtc::RtpUtility::RtpHeaderParser rtp_parser(transport_.last_sent_packet_, | |
605 packet_size); | |
606 webrtc::RTPHeader rtp_header; | 575 webrtc::RTPHeader rtp_header; |
607 RtpHeaderExtensionMap map; | 576 transport_.last_sent_packet().GetHeader(&rtp_header); |
608 map.Register(kRtpExtensionTransmissionTimeOffset, | |
609 kTransmissionTimeOffsetExtensionId); | |
610 map.Register(kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId); | |
611 const bool valid_rtp_header = rtp_parser.Parse(&rtp_header, &map); | |
612 ASSERT_TRUE(valid_rtp_header); | |
613 | 577 |
614 // Verify transmission time offset. | 578 // Verify transmission time offset. |
615 EXPECT_EQ(kStoredTimeInMs * 90, rtp_header.extension.transmissionTimeOffset); | 579 EXPECT_EQ(kStoredTimeInMs * 90, rtp_header.extension.transmissionTimeOffset); |
616 uint64_t expected_send_time = | 580 uint64_t expected_send_time = |
617 ConvertMsToAbsSendTime(fake_clock_.TimeInMilliseconds()); | 581 ConvertMsToAbsSendTime(fake_clock_.TimeInMilliseconds()); |
618 EXPECT_EQ(expected_send_time, rtp_header.extension.absoluteSendTime); | 582 EXPECT_EQ(expected_send_time, rtp_header.extension.absoluteSendTime); |
619 } | 583 } |
620 | 584 |
621 TEST_F(RtpSenderTest, TrafficSmoothingRetransmits) { | 585 TEST_F(RtpSenderTest, TrafficSmoothingRetransmits) { |
622 EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kNormalPriority, | 586 EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kNormalPriority, |
(...skipping 11 matching lines...) Expand all Loading... |
634 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds(); | 598 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds(); |
635 auto packet = | 599 auto packet = |
636 BuildRtpPacket(kPayload, kMarkerBit, kTimestamp, capture_time_ms); | 600 BuildRtpPacket(kPayload, kMarkerBit, kTimestamp, capture_time_ms); |
637 size_t packet_size = packet->size(); | 601 size_t packet_size = packet->size(); |
638 | 602 |
639 // Packet should be stored in a send bucket. | 603 // Packet should be stored in a send bucket. |
640 EXPECT_TRUE(rtp_sender_->SendToNetwork(std::move(packet), | 604 EXPECT_TRUE(rtp_sender_->SendToNetwork(std::move(packet), |
641 kAllowRetransmission, | 605 kAllowRetransmission, |
642 RtpPacketSender::kNormalPriority)); | 606 RtpPacketSender::kNormalPriority)); |
643 | 607 |
644 EXPECT_EQ(0, transport_.packets_sent_); | 608 EXPECT_EQ(0, transport_.packets_sent()); |
645 | 609 |
646 EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kNormalPriority, | 610 EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kNormalPriority, |
647 _, kSeqNum, _, _, _)); | 611 _, kSeqNum, _, _, _)); |
648 | 612 |
649 const int kStoredTimeInMs = 100; | 613 const int kStoredTimeInMs = 100; |
650 fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs); | 614 fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs); |
651 | 615 |
652 EXPECT_EQ(static_cast<int>(packet_size), rtp_sender_->ReSendPacket(kSeqNum)); | 616 EXPECT_EQ(static_cast<int>(packet_size), rtp_sender_->ReSendPacket(kSeqNum)); |
653 EXPECT_EQ(0, transport_.packets_sent_); | 617 EXPECT_EQ(0, transport_.packets_sent()); |
654 | 618 |
655 rtp_sender_->TimeToSendPacket(kSeqNum, capture_time_ms, false, | 619 rtp_sender_->TimeToSendPacket(kSeqNum, capture_time_ms, false, |
656 PacketInfo::kNotAProbe); | 620 PacketInfo::kNotAProbe); |
657 | 621 |
658 // Process send bucket. Packet should now be sent. | 622 // Process send bucket. Packet should now be sent. |
659 EXPECT_EQ(1, transport_.packets_sent_); | 623 EXPECT_EQ(1, transport_.packets_sent()); |
660 EXPECT_EQ(packet_size, transport_.last_sent_packet_len_); | 624 EXPECT_EQ(packet_size, transport_.last_sent_packet().size()); |
661 | 625 |
662 // Parse sent packet. | |
663 webrtc::RtpUtility::RtpHeaderParser rtp_parser(transport_.last_sent_packet_, | |
664 packet_size); | |
665 webrtc::RTPHeader rtp_header; | 626 webrtc::RTPHeader rtp_header; |
666 RtpHeaderExtensionMap map; | 627 transport_.last_sent_packet().GetHeader(&rtp_header); |
667 map.Register(kRtpExtensionTransmissionTimeOffset, | |
668 kTransmissionTimeOffsetExtensionId); | |
669 map.Register(kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId); | |
670 const bool valid_rtp_header = rtp_parser.Parse(&rtp_header, &map); | |
671 ASSERT_TRUE(valid_rtp_header); | |
672 | 628 |
673 // Verify transmission time offset. | 629 // Verify transmission time offset. |
674 EXPECT_EQ(kStoredTimeInMs * 90, rtp_header.extension.transmissionTimeOffset); | 630 EXPECT_EQ(kStoredTimeInMs * 90, rtp_header.extension.transmissionTimeOffset); |
675 uint64_t expected_send_time = | 631 uint64_t expected_send_time = |
676 ConvertMsToAbsSendTime(fake_clock_.TimeInMilliseconds()); | 632 ConvertMsToAbsSendTime(fake_clock_.TimeInMilliseconds()); |
677 EXPECT_EQ(expected_send_time, rtp_header.extension.absoluteSendTime); | 633 EXPECT_EQ(expected_send_time, rtp_header.extension.absoluteSendTime); |
678 } | 634 } |
679 | 635 |
680 // This test sends 1 regular video packet, then 4 padding packets, and then | 636 // This test sends 1 regular video packet, then 4 padding packets, and then |
681 // 1 more regular packet. | 637 // 1 more regular packet. |
(...skipping 12 matching lines...) Expand all Loading... |
694 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( | 650 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( |
695 kRtpExtensionTransmissionTimeOffset, | 651 kRtpExtensionTransmissionTimeOffset, |
696 kTransmissionTimeOffsetExtensionId)); | 652 kTransmissionTimeOffsetExtensionId)); |
697 rtp_header_len += 4; // 4 bytes extension. | 653 rtp_header_len += 4; // 4 bytes extension. |
698 EXPECT_EQ( | 654 EXPECT_EQ( |
699 0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime, | 655 0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime, |
700 kAbsoluteSendTimeExtensionId)); | 656 kAbsoluteSendTimeExtensionId)); |
701 rtp_header_len += 4; // 4 bytes extension. | 657 rtp_header_len += 4; // 4 bytes extension. |
702 rtp_header_len += 4; // 4 extra bytes common to all extension headers. | 658 rtp_header_len += 4; // 4 extra bytes common to all extension headers. |
703 | 659 |
704 // Create and set up parser. | |
705 std::unique_ptr<webrtc::RtpHeaderParser> rtp_parser( | |
706 webrtc::RtpHeaderParser::Create()); | |
707 ASSERT_TRUE(rtp_parser.get() != nullptr); | |
708 rtp_parser->RegisterRtpHeaderExtension(kRtpExtensionTransmissionTimeOffset, | |
709 kTransmissionTimeOffsetExtensionId); | |
710 rtp_parser->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime, | |
711 kAbsoluteSendTimeExtensionId); | |
712 webrtc::RTPHeader rtp_header; | 660 webrtc::RTPHeader rtp_header; |
713 | 661 |
714 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds(); | 662 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds(); |
715 auto packet = | 663 auto packet = |
716 BuildRtpPacket(kPayload, kMarkerBit, timestamp, capture_time_ms); | 664 BuildRtpPacket(kPayload, kMarkerBit, timestamp, capture_time_ms); |
717 const uint32_t media_packet_timestamp = timestamp; | 665 const uint32_t media_packet_timestamp = timestamp; |
718 size_t packet_size = packet->size(); | 666 size_t packet_size = packet->size(); |
719 | 667 |
720 // Packet should be stored in a send bucket. | 668 // Packet should be stored in a send bucket. |
721 EXPECT_TRUE(rtp_sender_->SendToNetwork(std::move(packet), | 669 EXPECT_TRUE(rtp_sender_->SendToNetwork(std::move(packet), |
722 kAllowRetransmission, | 670 kAllowRetransmission, |
723 RtpPacketSender::kNormalPriority)); | 671 RtpPacketSender::kNormalPriority)); |
724 | 672 |
725 int total_packets_sent = 0; | 673 int total_packets_sent = 0; |
726 EXPECT_EQ(total_packets_sent, transport_.packets_sent_); | 674 EXPECT_EQ(total_packets_sent, transport_.packets_sent()); |
727 | 675 |
728 const int kStoredTimeInMs = 100; | 676 const int kStoredTimeInMs = 100; |
729 fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs); | 677 fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs); |
730 rtp_sender_->TimeToSendPacket(seq_num++, capture_time_ms, false, | 678 rtp_sender_->TimeToSendPacket(seq_num++, capture_time_ms, false, |
731 PacketInfo::kNotAProbe); | 679 PacketInfo::kNotAProbe); |
732 // Packet should now be sent. This test doesn't verify the regular video | 680 // Packet should now be sent. This test doesn't verify the regular video |
733 // packet, since it is tested in another test. | 681 // packet, since it is tested in another test. |
734 EXPECT_EQ(++total_packets_sent, transport_.packets_sent_); | 682 EXPECT_EQ(++total_packets_sent, transport_.packets_sent()); |
735 timestamp += 90 * kStoredTimeInMs; | 683 timestamp += 90 * kStoredTimeInMs; |
736 | 684 |
737 // Send padding 4 times, waiting 50 ms between each. | 685 // Send padding 4 times, waiting 50 ms between each. |
738 for (int i = 0; i < 4; ++i) { | 686 for (int i = 0; i < 4; ++i) { |
739 const int kPaddingPeriodMs = 50; | 687 const int kPaddingPeriodMs = 50; |
740 const size_t kPaddingBytes = 100; | 688 const size_t kPaddingBytes = 100; |
741 const size_t kMaxPaddingLength = 224; // Value taken from rtp_sender.cc. | 689 const size_t kMaxPaddingLength = 224; // Value taken from rtp_sender.cc. |
742 // Padding will be forced to full packets. | 690 // Padding will be forced to full packets. |
743 EXPECT_EQ(kMaxPaddingLength, rtp_sender_->TimeToSendPadding( | 691 EXPECT_EQ(kMaxPaddingLength, rtp_sender_->TimeToSendPadding( |
744 kPaddingBytes, PacketInfo::kNotAProbe)); | 692 kPaddingBytes, PacketInfo::kNotAProbe)); |
745 | 693 |
746 // Process send bucket. Padding should now be sent. | 694 // Process send bucket. Padding should now be sent. |
747 EXPECT_EQ(++total_packets_sent, transport_.packets_sent_); | 695 EXPECT_EQ(++total_packets_sent, transport_.packets_sent()); |
748 EXPECT_EQ(kMaxPaddingLength + rtp_header_len, | 696 EXPECT_EQ(kMaxPaddingLength + rtp_header_len, |
749 transport_.last_sent_packet_len_); | 697 transport_.last_sent_packet().size()); |
750 // Parse sent packet. | 698 |
751 ASSERT_TRUE(rtp_parser->Parse(transport_.last_sent_packet_, | 699 transport_.last_sent_packet().GetHeader(&rtp_header); |
752 transport_.last_sent_packet_len_, | |
753 &rtp_header)); | |
754 EXPECT_EQ(kMaxPaddingLength, rtp_header.paddingLength); | 700 EXPECT_EQ(kMaxPaddingLength, rtp_header.paddingLength); |
755 | 701 |
756 // Verify sequence number and timestamp. The timestamp should be the same | 702 // Verify sequence number and timestamp. The timestamp should be the same |
757 // as the last media packet. | 703 // as the last media packet. |
758 EXPECT_EQ(seq_num++, rtp_header.sequenceNumber); | 704 EXPECT_EQ(seq_num++, rtp_header.sequenceNumber); |
759 EXPECT_EQ(media_packet_timestamp, rtp_header.timestamp); | 705 EXPECT_EQ(media_packet_timestamp, rtp_header.timestamp); |
760 // Verify transmission time offset. | 706 // Verify transmission time offset. |
761 int offset = timestamp - media_packet_timestamp; | 707 int offset = timestamp - media_packet_timestamp; |
762 EXPECT_EQ(offset, rtp_header.extension.transmissionTimeOffset); | 708 EXPECT_EQ(offset, rtp_header.extension.transmissionTimeOffset); |
763 uint64_t expected_send_time = | 709 uint64_t expected_send_time = |
(...skipping 12 matching lines...) Expand all Loading... |
776 InsertPacket(RtpPacketSender::kNormalPriority, _, _, _, _, _)); | 722 InsertPacket(RtpPacketSender::kNormalPriority, _, _, _, _, _)); |
777 | 723 |
778 // Packet should be stored in a send bucket. | 724 // Packet should be stored in a send bucket. |
779 EXPECT_TRUE(rtp_sender_->SendToNetwork(std::move(packet), | 725 EXPECT_TRUE(rtp_sender_->SendToNetwork(std::move(packet), |
780 kAllowRetransmission, | 726 kAllowRetransmission, |
781 RtpPacketSender::kNormalPriority)); | 727 RtpPacketSender::kNormalPriority)); |
782 | 728 |
783 rtp_sender_->TimeToSendPacket(seq_num, capture_time_ms, false, | 729 rtp_sender_->TimeToSendPacket(seq_num, capture_time_ms, false, |
784 PacketInfo::kNotAProbe); | 730 PacketInfo::kNotAProbe); |
785 // Process send bucket. | 731 // Process send bucket. |
786 EXPECT_EQ(++total_packets_sent, transport_.packets_sent_); | 732 EXPECT_EQ(++total_packets_sent, transport_.packets_sent()); |
787 EXPECT_EQ(packet_size, transport_.last_sent_packet_len_); | 733 EXPECT_EQ(packet_size, transport_.last_sent_packet().size()); |
788 // Parse sent packet. | 734 transport_.last_sent_packet().GetHeader(&rtp_header); |
789 ASSERT_TRUE(rtp_parser->Parse(transport_.last_sent_packet_, packet_size, | |
790 &rtp_header)); | |
791 | 735 |
792 // Verify sequence number and timestamp. | 736 // Verify sequence number and timestamp. |
793 EXPECT_EQ(seq_num, rtp_header.sequenceNumber); | 737 EXPECT_EQ(seq_num, rtp_header.sequenceNumber); |
794 EXPECT_EQ(timestamp, rtp_header.timestamp); | 738 EXPECT_EQ(timestamp, rtp_header.timestamp); |
795 // Verify transmission time offset. This packet is sent without delay. | 739 // Verify transmission time offset. This packet is sent without delay. |
796 EXPECT_EQ(0, rtp_header.extension.transmissionTimeOffset); | 740 EXPECT_EQ(0, rtp_header.extension.transmissionTimeOffset); |
797 uint64_t expected_send_time = | 741 uint64_t expected_send_time = |
798 ConvertMsToAbsSendTime(fake_clock_.TimeInMilliseconds()); | 742 ConvertMsToAbsSendTime(fake_clock_.TimeInMilliseconds()); |
799 EXPECT_EQ(expected_send_time, rtp_header.extension.absoluteSendTime); | 743 EXPECT_EQ(expected_send_time, rtp_header.extension.absoluteSendTime); |
800 } | 744 } |
801 | 745 |
802 TEST_F(RtpSenderTest, OnSendPacketUpdated) { | 746 TEST_F(RtpSenderTest, OnSendPacketUpdated) { |
803 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( | 747 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( |
804 kRtpExtensionTransportSequenceNumber, | 748 kRtpExtensionTransportSequenceNumber, |
805 kTransportSequenceNumberExtensionId)); | 749 kTransportSequenceNumberExtensionId)); |
806 rtp_sender_->SetStorePacketsStatus(true, 10); | 750 rtp_sender_->SetStorePacketsStatus(true, 10); |
807 | 751 |
808 EXPECT_CALL(send_packet_observer_, | 752 EXPECT_CALL(send_packet_observer_, |
809 OnSendPacket(kTransportSequenceNumber, _, _)) | 753 OnSendPacket(kTransportSequenceNumber, _, _)) |
810 .Times(1); | 754 .Times(1); |
811 EXPECT_CALL(seq_num_allocator_, AllocateSequenceNumber()) | 755 EXPECT_CALL(seq_num_allocator_, AllocateSequenceNumber()) |
812 .WillOnce(testing::Return(kTransportSequenceNumber)); | 756 .WillOnce(testing::Return(kTransportSequenceNumber)); |
813 EXPECT_CALL(mock_paced_sender_, InsertPacket(_, _, _, _, _, _)).Times(1); | 757 EXPECT_CALL(mock_paced_sender_, InsertPacket(_, _, _, _, _, _)).Times(1); |
814 | 758 |
815 SendGenericPayload(); // Packet passed to pacer. | 759 SendGenericPayload(); // Packet passed to pacer. |
816 const bool kIsRetransmit = false; | 760 const bool kIsRetransmit = false; |
817 rtp_sender_->TimeToSendPacket(kSeqNum, fake_clock_.TimeInMilliseconds(), | 761 rtp_sender_->TimeToSendPacket(kSeqNum, fake_clock_.TimeInMilliseconds(), |
818 kIsRetransmit, PacketInfo::kNotAProbe); | 762 kIsRetransmit, PacketInfo::kNotAProbe); |
819 EXPECT_EQ(1, transport_.packets_sent_); | 763 EXPECT_EQ(1, transport_.packets_sent()); |
820 } | 764 } |
821 | 765 |
822 TEST_F(RtpSenderTest, OnSendPacketNotUpdatedForRetransmits) { | 766 TEST_F(RtpSenderTest, OnSendPacketNotUpdatedForRetransmits) { |
823 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( | 767 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( |
824 kRtpExtensionTransportSequenceNumber, | 768 kRtpExtensionTransportSequenceNumber, |
825 kTransportSequenceNumberExtensionId)); | 769 kTransportSequenceNumberExtensionId)); |
826 rtp_sender_->SetStorePacketsStatus(true, 10); | 770 rtp_sender_->SetStorePacketsStatus(true, 10); |
827 | 771 |
828 EXPECT_CALL(send_packet_observer_, OnSendPacket(_, _, _)).Times(0); | 772 EXPECT_CALL(send_packet_observer_, OnSendPacket(_, _, _)).Times(0); |
829 EXPECT_CALL(seq_num_allocator_, AllocateSequenceNumber()) | 773 EXPECT_CALL(seq_num_allocator_, AllocateSequenceNumber()) |
830 .WillOnce(testing::Return(kTransportSequenceNumber)); | 774 .WillOnce(testing::Return(kTransportSequenceNumber)); |
831 EXPECT_CALL(mock_paced_sender_, InsertPacket(_, _, _, _, _, _)).Times(1); | 775 EXPECT_CALL(mock_paced_sender_, InsertPacket(_, _, _, _, _, _)).Times(1); |
832 | 776 |
833 SendGenericPayload(); // Packet passed to pacer. | 777 SendGenericPayload(); // Packet passed to pacer. |
834 const bool kIsRetransmit = true; | 778 const bool kIsRetransmit = true; |
835 rtp_sender_->TimeToSendPacket(kSeqNum, fake_clock_.TimeInMilliseconds(), | 779 rtp_sender_->TimeToSendPacket(kSeqNum, fake_clock_.TimeInMilliseconds(), |
836 kIsRetransmit, PacketInfo::kNotAProbe); | 780 kIsRetransmit, PacketInfo::kNotAProbe); |
837 EXPECT_EQ(1, transport_.packets_sent_); | 781 EXPECT_EQ(1, transport_.packets_sent()); |
838 } | 782 } |
839 | 783 |
840 TEST_F(RtpSenderTest, OnSendPacketNotUpdatedWithoutSeqNumAllocator) { | 784 TEST_F(RtpSenderTest, OnSendPacketNotUpdatedWithoutSeqNumAllocator) { |
841 rtp_sender_.reset(new RTPSender( | 785 rtp_sender_.reset(new RTPSender( |
842 false, &fake_clock_, &transport_, &mock_paced_sender_, | 786 false, &fake_clock_, &transport_, &mock_paced_sender_, |
843 nullptr /* TransportSequenceNumberAllocator */, nullptr, nullptr, nullptr, | 787 nullptr /* TransportSequenceNumberAllocator */, nullptr, nullptr, nullptr, |
844 nullptr, nullptr, &send_packet_observer_, &retransmission_rate_limiter_)); | 788 nullptr, nullptr, &send_packet_observer_, &retransmission_rate_limiter_)); |
845 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( | 789 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( |
846 kRtpExtensionTransportSequenceNumber, | 790 kRtpExtensionTransportSequenceNumber, |
847 kTransportSequenceNumberExtensionId)); | 791 kTransportSequenceNumberExtensionId)); |
848 rtp_sender_->SetSequenceNumber(kSeqNum); | 792 rtp_sender_->SetSequenceNumber(kSeqNum); |
849 rtp_sender_->SetStorePacketsStatus(true, 10); | 793 rtp_sender_->SetStorePacketsStatus(true, 10); |
850 | 794 |
851 EXPECT_CALL(send_packet_observer_, OnSendPacket(_, _, _)).Times(0); | 795 EXPECT_CALL(send_packet_observer_, OnSendPacket(_, _, _)).Times(0); |
852 EXPECT_CALL(mock_paced_sender_, InsertPacket(_, _, _, _, _, _)).Times(1); | 796 EXPECT_CALL(mock_paced_sender_, InsertPacket(_, _, _, _, _, _)).Times(1); |
853 | 797 |
854 SendGenericPayload(); // Packet passed to pacer. | 798 SendGenericPayload(); // Packet passed to pacer. |
855 const bool kIsRetransmit = false; | 799 const bool kIsRetransmit = false; |
856 rtp_sender_->TimeToSendPacket(kSeqNum, fake_clock_.TimeInMilliseconds(), | 800 rtp_sender_->TimeToSendPacket(kSeqNum, fake_clock_.TimeInMilliseconds(), |
857 kIsRetransmit, PacketInfo::kNotAProbe); | 801 kIsRetransmit, PacketInfo::kNotAProbe); |
858 EXPECT_EQ(1, transport_.packets_sent_); | 802 EXPECT_EQ(1, transport_.packets_sent()); |
859 } | 803 } |
860 | 804 |
861 TEST_F(RtpSenderTest, SendRedundantPayloads) { | 805 TEST_F(RtpSenderTest, SendRedundantPayloads) { |
862 MockTransport transport; | 806 MockTransport transport; |
863 rtp_sender_.reset(new RTPSender( | 807 rtp_sender_.reset(new RTPSender( |
864 false, &fake_clock_, &transport, &mock_paced_sender_, nullptr, nullptr, | 808 false, &fake_clock_, &transport, &mock_paced_sender_, nullptr, nullptr, |
865 nullptr, nullptr, nullptr, &mock_rtc_event_log_, nullptr, | 809 nullptr, nullptr, nullptr, &mock_rtc_event_log_, nullptr, |
866 &retransmission_rate_limiter_)); | 810 &retransmission_rate_limiter_)); |
867 | 811 |
868 rtp_sender_->SetSequenceNumber(kSeqNum); | 812 rtp_sender_->SetSequenceNumber(kSeqNum); |
869 rtp_sender_->SetRtxPayloadType(kRtxPayload, kPayload); | 813 rtp_sender_->SetRtxPayloadType(kRtxPayload, kPayload); |
870 | 814 |
871 uint16_t seq_num = kSeqNum; | 815 uint16_t seq_num = kSeqNum; |
872 rtp_sender_->SetStorePacketsStatus(true, 10); | 816 rtp_sender_->SetStorePacketsStatus(true, 10); |
873 int32_t rtp_header_len = kRtpHeaderSize; | 817 int32_t rtp_header_len = kRtpHeaderSize; |
874 EXPECT_EQ( | 818 EXPECT_EQ( |
875 0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime, | 819 0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime, |
876 kAbsoluteSendTimeExtensionId)); | 820 kAbsoluteSendTimeExtensionId)); |
877 rtp_header_len += 4; // 4 bytes extension. | 821 rtp_header_len += 4; // 4 bytes extension. |
878 rtp_header_len += 4; // 4 extra bytes common to all extension headers. | 822 rtp_header_len += 4; // 4 extra bytes common to all extension headers. |
879 | 823 |
880 rtp_sender_->SetRtxStatus(kRtxRetransmitted | kRtxRedundantPayloads); | 824 rtp_sender_->SetRtxStatus(kRtxRetransmitted | kRtxRedundantPayloads); |
881 rtp_sender_->SetRtxSsrc(1234); | 825 rtp_sender_->SetRtxSsrc(1234); |
882 | 826 |
883 // Create and set up parser. | |
884 std::unique_ptr<webrtc::RtpHeaderParser> rtp_parser( | |
885 webrtc::RtpHeaderParser::Create()); | |
886 ASSERT_TRUE(rtp_parser.get() != nullptr); | |
887 rtp_parser->RegisterRtpHeaderExtension(kRtpExtensionTransmissionTimeOffset, | |
888 kTransmissionTimeOffsetExtensionId); | |
889 rtp_parser->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime, | |
890 kAbsoluteSendTimeExtensionId); | |
891 const size_t kNumPayloadSizes = 10; | 827 const size_t kNumPayloadSizes = 10; |
892 const size_t kPayloadSizes[kNumPayloadSizes] = {500, 550, 600, 650, 700, | 828 const size_t kPayloadSizes[kNumPayloadSizes] = {500, 550, 600, 650, 700, |
893 750, 800, 850, 900, 950}; | 829 750, 800, 850, 900, 950}; |
894 // Expect all packets go through the pacer. | 830 // Expect all packets go through the pacer. |
895 EXPECT_CALL(mock_paced_sender_, | 831 EXPECT_CALL(mock_paced_sender_, |
896 InsertPacket(RtpPacketSender::kNormalPriority, _, _, _, _, _)) | 832 InsertPacket(RtpPacketSender::kNormalPriority, _, _, _, _, _)) |
897 .Times(kNumPayloadSizes); | 833 .Times(kNumPayloadSizes); |
898 EXPECT_CALL(mock_rtc_event_log_, | 834 EXPECT_CALL(mock_rtc_event_log_, |
899 LogRtpHeader(PacketDirection::kOutgoingPacket, _, _, _)) | 835 LogRtpHeader(PacketDirection::kOutgoingPacket, _, _, _)) |
900 .Times(kNumPayloadSizes); | 836 .Times(kNumPayloadSizes); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
940 const uint8_t payload_type = 127; | 876 const uint8_t payload_type = 127; |
941 ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 90000, | 877 ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 90000, |
942 0, 1500)); | 878 0, 1500)); |
943 uint8_t payload[] = {47, 11, 32, 93, 89}; | 879 uint8_t payload[] = {47, 11, 32, 93, 89}; |
944 | 880 |
945 // Send keyframe | 881 // Send keyframe |
946 ASSERT_TRUE(rtp_sender_->SendOutgoingData(kVideoFrameKey, payload_type, 1234, | 882 ASSERT_TRUE(rtp_sender_->SendOutgoingData(kVideoFrameKey, payload_type, 1234, |
947 4321, payload, sizeof(payload), | 883 4321, payload, sizeof(payload), |
948 nullptr, nullptr, nullptr)); | 884 nullptr, nullptr, nullptr)); |
949 | 885 |
950 RtpUtility::RtpHeaderParser rtp_parser(transport_.last_sent_packet_, | 886 const uint8_t* payload_data = transport_.last_sent_packet().payload(); |
951 transport_.last_sent_packet_len_); | |
952 webrtc::RTPHeader rtp_header; | |
953 ASSERT_TRUE(rtp_parser.Parse(&rtp_header)); | |
954 | |
955 const uint8_t* payload_data = | |
956 GetPayloadData(rtp_header, transport_.last_sent_packet_); | |
957 uint8_t generic_header = *payload_data++; | 887 uint8_t generic_header = *payload_data++; |
958 | 888 |
959 ASSERT_EQ(sizeof(payload) + sizeof(generic_header), | 889 ASSERT_EQ(sizeof(payload) + sizeof(generic_header), |
960 GetPayloadDataLength(rtp_header, transport_.last_sent_packet_len_)); | 890 transport_.last_sent_packet().payload_size()); |
961 | 891 |
962 EXPECT_TRUE(generic_header & RtpFormatVideoGeneric::kKeyFrameBit); | 892 EXPECT_TRUE(generic_header & RtpFormatVideoGeneric::kKeyFrameBit); |
963 EXPECT_TRUE(generic_header & RtpFormatVideoGeneric::kFirstPacketBit); | 893 EXPECT_TRUE(generic_header & RtpFormatVideoGeneric::kFirstPacketBit); |
964 | 894 |
965 EXPECT_EQ(0, memcmp(payload, payload_data, sizeof(payload))); | 895 EXPECT_EQ(0, memcmp(payload, payload_data, sizeof(payload))); |
966 | 896 |
967 // Send delta frame | 897 // Send delta frame |
968 payload[0] = 13; | 898 payload[0] = 13; |
969 payload[1] = 42; | 899 payload[1] = 42; |
970 payload[4] = 13; | 900 payload[4] = 13; |
971 | 901 |
972 ASSERT_TRUE(rtp_sender_->SendOutgoingData( | 902 ASSERT_TRUE(rtp_sender_->SendOutgoingData( |
973 kVideoFrameDelta, payload_type, 1234, 4321, payload, sizeof(payload), | 903 kVideoFrameDelta, payload_type, 1234, 4321, payload, sizeof(payload), |
974 nullptr, nullptr, nullptr)); | 904 nullptr, nullptr, nullptr)); |
975 | 905 |
976 RtpUtility::RtpHeaderParser rtp_parser2(transport_.last_sent_packet_, | 906 payload_data = transport_.last_sent_packet().payload(); |
977 transport_.last_sent_packet_len_); | |
978 ASSERT_TRUE(rtp_parser.Parse(&rtp_header)); | |
979 | |
980 payload_data = GetPayloadData(rtp_header, transport_.last_sent_packet_); | |
981 generic_header = *payload_data++; | 907 generic_header = *payload_data++; |
982 | 908 |
983 EXPECT_FALSE(generic_header & RtpFormatVideoGeneric::kKeyFrameBit); | 909 EXPECT_FALSE(generic_header & RtpFormatVideoGeneric::kKeyFrameBit); |
984 EXPECT_TRUE(generic_header & RtpFormatVideoGeneric::kFirstPacketBit); | 910 EXPECT_TRUE(generic_header & RtpFormatVideoGeneric::kFirstPacketBit); |
985 | 911 |
986 ASSERT_EQ(sizeof(payload) + sizeof(generic_header), | 912 ASSERT_EQ(sizeof(payload) + sizeof(generic_header), |
987 GetPayloadDataLength(rtp_header, transport_.last_sent_packet_len_)); | 913 transport_.last_sent_packet().payload_size()); |
988 | 914 |
989 EXPECT_EQ(0, memcmp(payload, payload_data, sizeof(payload))); | 915 EXPECT_EQ(0, memcmp(payload, payload_data, sizeof(payload))); |
990 } | 916 } |
991 | 917 |
992 TEST_F(RtpSenderTest, FrameCountCallbacks) { | 918 TEST_F(RtpSenderTest, FrameCountCallbacks) { |
993 class TestCallback : public FrameCountObserver { | 919 class TestCallback : public FrameCountObserver { |
994 public: | 920 public: |
995 TestCallback() : FrameCountObserver(), num_calls_(0), ssrc_(0) {} | 921 TestCallback() : FrameCountObserver(), num_calls_(0), ssrc_(0) {} |
996 virtual ~TestCallback() {} | 922 virtual ~TestCallback() {} |
997 | 923 |
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1235 char payload_name[RTP_PAYLOAD_NAME_SIZE] = "PAYLOAD_NAME"; | 1161 char payload_name[RTP_PAYLOAD_NAME_SIZE] = "PAYLOAD_NAME"; |
1236 const uint8_t payload_type = 127; | 1162 const uint8_t payload_type = 127; |
1237 ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 48000, | 1163 ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 48000, |
1238 0, 1500)); | 1164 0, 1500)); |
1239 uint8_t payload[] = {47, 11, 32, 93, 89}; | 1165 uint8_t payload[] = {47, 11, 32, 93, 89}; |
1240 | 1166 |
1241 ASSERT_TRUE(rtp_sender_->SendOutgoingData( | 1167 ASSERT_TRUE(rtp_sender_->SendOutgoingData( |
1242 kAudioFrameCN, payload_type, 1234, 4321, payload, | 1168 kAudioFrameCN, payload_type, 1234, 4321, payload, |
1243 sizeof(payload), nullptr, nullptr, nullptr)); | 1169 sizeof(payload), nullptr, nullptr, nullptr)); |
1244 | 1170 |
1245 RtpUtility::RtpHeaderParser rtp_parser(transport_.last_sent_packet_, | 1171 const uint8_t* payload_data = transport_.last_sent_packet().payload(); |
1246 transport_.last_sent_packet_len_); | |
1247 webrtc::RTPHeader rtp_header; | |
1248 ASSERT_TRUE(rtp_parser.Parse(&rtp_header)); | |
1249 | 1172 |
1250 const uint8_t* payload_data = | 1173 ASSERT_EQ(sizeof(payload), transport_.last_sent_packet().payload_size()); |
1251 GetPayloadData(rtp_header, transport_.last_sent_packet_); | |
1252 | |
1253 ASSERT_EQ(sizeof(payload), | |
1254 GetPayloadDataLength(rtp_header, transport_.last_sent_packet_len_)); | |
1255 | |
1256 EXPECT_EQ(0, memcmp(payload, payload_data, sizeof(payload))); | 1174 EXPECT_EQ(0, memcmp(payload, payload_data, sizeof(payload))); |
1257 } | 1175 } |
1258 | 1176 |
1259 TEST_F(RtpSenderAudioTest, SendAudioWithAudioLevelExtension) { | 1177 TEST_F(RtpSenderAudioTest, SendAudioWithAudioLevelExtension) { |
1260 EXPECT_EQ(0, rtp_sender_->SetAudioLevel(kAudioLevel)); | 1178 EXPECT_EQ(0, rtp_sender_->SetAudioLevel(kAudioLevel)); |
1261 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAudioLevel, | 1179 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAudioLevel, |
1262 kAudioLevelExtensionId)); | 1180 kAudioLevelExtensionId)); |
1263 | 1181 |
1264 char payload_name[RTP_PAYLOAD_NAME_SIZE] = "PAYLOAD_NAME"; | 1182 char payload_name[RTP_PAYLOAD_NAME_SIZE] = "PAYLOAD_NAME"; |
1265 const uint8_t payload_type = 127; | 1183 const uint8_t payload_type = 127; |
1266 ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 48000, | 1184 ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 48000, |
1267 0, 1500)); | 1185 0, 1500)); |
1268 uint8_t payload[] = {47, 11, 32, 93, 89}; | 1186 uint8_t payload[] = {47, 11, 32, 93, 89}; |
1269 | 1187 |
1270 ASSERT_TRUE(rtp_sender_->SendOutgoingData( | 1188 ASSERT_TRUE(rtp_sender_->SendOutgoingData( |
1271 kAudioFrameCN, payload_type, 1234, 4321, payload, | 1189 kAudioFrameCN, payload_type, 1234, 4321, payload, |
1272 sizeof(payload), nullptr, nullptr, nullptr)); | 1190 sizeof(payload), nullptr, nullptr, nullptr)); |
1273 | 1191 |
1274 RtpUtility::RtpHeaderParser rtp_parser(transport_.last_sent_packet_, | 1192 const uint8_t* payload_data = transport_.last_sent_packet().payload(); |
1275 transport_.last_sent_packet_len_); | |
1276 webrtc::RTPHeader rtp_header; | |
1277 ASSERT_TRUE(rtp_parser.Parse(&rtp_header)); | |
1278 | 1193 |
1279 const uint8_t* payload_data = | 1194 ASSERT_EQ(sizeof(payload), transport_.last_sent_packet().payload_size()); |
1280 GetPayloadData(rtp_header, transport_.last_sent_packet_); | |
1281 | |
1282 ASSERT_EQ(sizeof(payload), | |
1283 GetPayloadDataLength(rtp_header, transport_.last_sent_packet_len_)); | |
1284 | |
1285 EXPECT_EQ(0, memcmp(payload, payload_data, sizeof(payload))); | 1195 EXPECT_EQ(0, memcmp(payload, payload_data, sizeof(payload))); |
1286 | 1196 // Verify AudioLevel extension. |
1287 uint8_t extension[] = { | 1197 bool voice_activity; |
1288 0xbe, 0xde, 0x00, 0x01, | 1198 uint8_t audio_level; |
1289 (kAudioLevelExtensionId << 4) + 0, // ID + length. | 1199 EXPECT_TRUE(transport_.last_sent_packet().GetExtension<AudioLevel>( |
1290 kAudioLevel, // Data. | 1200 &voice_activity, &audio_level)); |
1291 0x00, 0x00 // Padding. | 1201 EXPECT_EQ(kAudioLevel, audio_level); |
1292 }; | 1202 EXPECT_FALSE(voice_activity); |
1293 | |
1294 EXPECT_EQ(0, memcmp(extension, payload_data - sizeof(extension), | |
1295 sizeof(extension))); | |
1296 } | 1203 } |
1297 | 1204 |
1298 // As RFC4733, named telephone events are carried as part of the audio stream | 1205 // As RFC4733, named telephone events are carried as part of the audio stream |
1299 // and must use the same sequence number and timestamp base as the regular | 1206 // and must use the same sequence number and timestamp base as the regular |
1300 // audio channel. | 1207 // audio channel. |
1301 // This test checks the marker bit for the first packet and the consequent | 1208 // This test checks the marker bit for the first packet and the consequent |
1302 // packets of the same telephone event. Since it is specifically for DTMF | 1209 // packets of the same telephone event. Since it is specifically for DTMF |
1303 // events, ignoring audio packets and sending kEmptyFrame instead of those. | 1210 // events, ignoring audio packets and sending kEmptyFrame instead of those. |
1304 TEST_F(RtpSenderAudioTest, CheckMarkerBitForTelephoneEvents) { | 1211 TEST_F(RtpSenderAudioTest, CheckMarkerBitForTelephoneEvents) { |
1305 char payload_name[RTP_PAYLOAD_NAME_SIZE] = "telephone-event"; | 1212 char payload_name[RTP_PAYLOAD_NAME_SIZE] = "telephone-event"; |
(...skipping 14 matching lines...) Expand all Loading... |
1320 // timestamp. So for first call it will skip since the duration is zero. | 1227 // timestamp. So for first call it will skip since the duration is zero. |
1321 ASSERT_TRUE(rtp_sender_->SendOutgoingData(kEmptyFrame, payload_type, | 1228 ASSERT_TRUE(rtp_sender_->SendOutgoingData(kEmptyFrame, payload_type, |
1322 capture_time_ms, 0, nullptr, 0, | 1229 capture_time_ms, 0, nullptr, 0, |
1323 nullptr, nullptr, nullptr)); | 1230 nullptr, nullptr, nullptr)); |
1324 // DTMF Sample Length is (Frequency/1000) * Duration. | 1231 // DTMF Sample Length is (Frequency/1000) * Duration. |
1325 // So in this case, it is (8000/1000) * 500 = 4000. | 1232 // So in this case, it is (8000/1000) * 500 = 4000. |
1326 // Sending it as two packets. | 1233 // Sending it as two packets. |
1327 ASSERT_TRUE(rtp_sender_->SendOutgoingData( | 1234 ASSERT_TRUE(rtp_sender_->SendOutgoingData( |
1328 kEmptyFrame, payload_type, capture_time_ms + 2000, 0, | 1235 kEmptyFrame, payload_type, capture_time_ms + 2000, 0, |
1329 nullptr, 0, nullptr, nullptr, nullptr)); | 1236 nullptr, 0, nullptr, nullptr, nullptr)); |
1330 std::unique_ptr<webrtc::RtpHeaderParser> rtp_parser( | 1237 |
1331 webrtc::RtpHeaderParser::Create()); | |
1332 ASSERT_TRUE(rtp_parser.get() != nullptr); | |
1333 webrtc::RTPHeader rtp_header; | |
1334 ASSERT_TRUE(rtp_parser->Parse(transport_.last_sent_packet_, | |
1335 transport_.last_sent_packet_len_, &rtp_header)); | |
1336 // Marker Bit should be set to 1 for first packet. | 1238 // Marker Bit should be set to 1 for first packet. |
1337 EXPECT_TRUE(rtp_header.markerBit); | 1239 EXPECT_TRUE(transport_.last_sent_packet().Marker()); |
1338 | 1240 |
1339 ASSERT_TRUE(rtp_sender_->SendOutgoingData( | 1241 ASSERT_TRUE(rtp_sender_->SendOutgoingData( |
1340 kEmptyFrame, payload_type, capture_time_ms + 4000, 0, | 1242 kEmptyFrame, payload_type, capture_time_ms + 4000, 0, |
1341 nullptr, 0, nullptr, nullptr, nullptr)); | 1243 nullptr, 0, nullptr, nullptr, nullptr)); |
1342 ASSERT_TRUE(rtp_parser->Parse(transport_.last_sent_packet_, | |
1343 transport_.last_sent_packet_len_, &rtp_header)); | |
1344 // Marker Bit should be set to 0 for rest of the packets. | 1244 // Marker Bit should be set to 0 for rest of the packets. |
1345 EXPECT_FALSE(rtp_header.markerBit); | 1245 EXPECT_FALSE(transport_.last_sent_packet().Marker()); |
1346 } | 1246 } |
1347 | 1247 |
1348 TEST_F(RtpSenderTestWithoutPacer, BytesReportedCorrectly) { | 1248 TEST_F(RtpSenderTestWithoutPacer, BytesReportedCorrectly) { |
1349 const char* kPayloadName = "GENERIC"; | 1249 const char* kPayloadName = "GENERIC"; |
1350 const uint8_t kPayloadType = 127; | 1250 const uint8_t kPayloadType = 127; |
1351 rtp_sender_->SetSSRC(1234); | 1251 rtp_sender_->SetSSRC(1234); |
1352 rtp_sender_->SetRtxSsrc(4321); | 1252 rtp_sender_->SetRtxSsrc(4321); |
1353 rtp_sender_->SetRtxPayloadType(kPayloadType - 1, kPayloadType); | 1253 rtp_sender_->SetRtxPayloadType(kPayloadType - 1, kPayloadType); |
1354 rtp_sender_->SetRtxStatus(kRtxRetransmitted | kRtxRedundantPayloads); | 1254 rtp_sender_->SetRtxStatus(kRtxRetransmitted | kRtxRedundantPayloads); |
1355 | 1255 |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1399 retransmission_rate_limiter_.SetMaxRate(kPacketSize * kNumPackets * 8); | 1299 retransmission_rate_limiter_.SetMaxRate(kPacketSize * kNumPackets * 8); |
1400 | 1300 |
1401 rtp_sender_->SetStorePacketsStatus(true, kNumPackets); | 1301 rtp_sender_->SetStorePacketsStatus(true, kNumPackets); |
1402 const uint16_t kStartSequenceNumber = rtp_sender_->SequenceNumber(); | 1302 const uint16_t kStartSequenceNumber = rtp_sender_->SequenceNumber(); |
1403 std::vector<uint16_t> sequence_numbers; | 1303 std::vector<uint16_t> sequence_numbers; |
1404 for (int32_t i = 0; i < kNumPackets; ++i) { | 1304 for (int32_t i = 0; i < kNumPackets; ++i) { |
1405 sequence_numbers.push_back(kStartSequenceNumber + i); | 1305 sequence_numbers.push_back(kStartSequenceNumber + i); |
1406 fake_clock_.AdvanceTimeMilliseconds(1); | 1306 fake_clock_.AdvanceTimeMilliseconds(1); |
1407 SendPacket(fake_clock_.TimeInMilliseconds(), kPacketSize); | 1307 SendPacket(fake_clock_.TimeInMilliseconds(), kPacketSize); |
1408 } | 1308 } |
1409 EXPECT_EQ(kNumPackets, transport_.packets_sent_); | 1309 EXPECT_EQ(kNumPackets, transport_.packets_sent()); |
1410 | 1310 |
1411 fake_clock_.AdvanceTimeMilliseconds(1000 - kNumPackets); | 1311 fake_clock_.AdvanceTimeMilliseconds(1000 - kNumPackets); |
1412 | 1312 |
1413 // Resending should work - brings the bandwidth up to the limit. | 1313 // Resending should work - brings the bandwidth up to the limit. |
1414 // NACK bitrate is capped to the same bitrate as the encoder, since the max | 1314 // NACK bitrate is capped to the same bitrate as the encoder, since the max |
1415 // protection overhead is 50% (see MediaOptimization::SetTargetRates). | 1315 // protection overhead is 50% (see MediaOptimization::SetTargetRates). |
1416 rtp_sender_->OnReceivedNack(sequence_numbers, 0); | 1316 rtp_sender_->OnReceivedNack(sequence_numbers, 0); |
1417 EXPECT_EQ(kNumPackets * 2, transport_.packets_sent_); | 1317 EXPECT_EQ(kNumPackets * 2, transport_.packets_sent()); |
1418 | 1318 |
1419 // Must be at least 5ms in between retransmission attempts. | 1319 // Must be at least 5ms in between retransmission attempts. |
1420 fake_clock_.AdvanceTimeMilliseconds(5); | 1320 fake_clock_.AdvanceTimeMilliseconds(5); |
1421 | 1321 |
1422 // Resending should not work, bandwidth exceeded. | 1322 // Resending should not work, bandwidth exceeded. |
1423 rtp_sender_->OnReceivedNack(sequence_numbers, 0); | 1323 rtp_sender_->OnReceivedNack(sequence_numbers, 0); |
1424 EXPECT_EQ(kNumPackets * 2, transport_.packets_sent_); | 1324 EXPECT_EQ(kNumPackets * 2, transport_.packets_sent()); |
1425 } | 1325 } |
1426 | 1326 |
1427 // Verify that all packets of a frame have CVO byte set. | 1327 // Verify that all packets of a frame have CVO byte set. |
1428 TEST_F(RtpSenderVideoTest, SendVideoWithCVO) { | 1328 TEST_F(RtpSenderVideoTest, SendVideoWithCVO) { |
1429 uint8_t kFrame[kMaxPacketLength]; | 1329 uint8_t kFrame[kMaxPacketLength]; |
1430 RTPVideoHeader hdr = {0}; | 1330 RTPVideoHeader hdr = {0}; |
1431 hdr.rotation = kVideoRotation_90; | 1331 hdr.rotation = kVideoRotation_90; |
1432 | 1332 |
1433 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( | 1333 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( |
1434 kRtpExtensionVideoRotation, kVideoRotationExtensionId)); | 1334 kRtpExtensionVideoRotation, kVideoRotationExtensionId)); |
1435 EXPECT_EQ( | 1335 EXPECT_EQ( |
1436 RtpUtility::Word32Align(kRtpOneByteHeaderLength + kVideoRotationLength), | 1336 RtpUtility::Word32Align(kRtpOneByteHeaderLength + kVideoRotationLength), |
1437 rtp_sender_->RtpHeaderExtensionLength()); | 1337 rtp_sender_->RtpHeaderExtensionLength()); |
1438 | 1338 |
1439 rtp_sender_video_->SendVideo(kRtpVideoGeneric, kVideoFrameKey, kPayload, | 1339 rtp_sender_video_->SendVideo(kRtpVideoGeneric, kVideoFrameKey, kPayload, |
1440 kTimestamp, 0, kFrame, sizeof(kFrame), nullptr, | 1340 kTimestamp, 0, kFrame, sizeof(kFrame), nullptr, |
1441 &hdr); | 1341 &hdr); |
1442 | 1342 |
1443 RtpHeaderExtensionMap map; | 1343 // Verify that this packet does have CVO byte. |
1444 map.Register(kRtpExtensionVideoRotation, kVideoRotationExtensionId); | 1344 VerifyCVOPacket(transport_.sent_packets_[0], true, kSeqNum, hdr.rotation); |
1445 | 1345 |
1446 // Verify that this packet does have CVO byte. | 1346 // Verify that this packet does have CVO byte. |
1447 VerifyCVOPacket( | 1347 VerifyCVOPacket(transport_.sent_packets_[1], true, kSeqNum + 1, hdr.rotation); |
1448 reinterpret_cast<uint8_t*>(transport_.sent_packets_[0]->data()), | |
1449 transport_.sent_packets_[0]->size(), true, &map, kSeqNum, hdr.rotation); | |
1450 | |
1451 // Verify that this packet does have CVO byte. | |
1452 VerifyCVOPacket( | |
1453 reinterpret_cast<uint8_t*>(transport_.sent_packets_[1]->data()), | |
1454 transport_.sent_packets_[1]->size(), true, &map, kSeqNum + 1, | |
1455 hdr.rotation); | |
1456 } | 1348 } |
1457 | 1349 |
1458 // Make sure rotation is parsed correctly when the Camera (C) and Flip (F) bits | 1350 // Make sure rotation is parsed correctly when the Camera (C) and Flip (F) bits |
1459 // are set in the CVO byte. | 1351 // are set in the CVO byte. |
1460 TEST_F(RtpSenderVideoTest, SendVideoWithCameraAndFlipCVO) { | 1352 TEST_F(RtpSenderVideoTest, SendVideoWithCameraAndFlipCVO) { |
1461 // Test extracting rotation when Camera (C) and Flip (F) bits are zero. | 1353 // Test extracting rotation when Camera (C) and Flip (F) bits are zero. |
1462 EXPECT_EQ(kVideoRotation_0, ConvertCVOByteToVideoRotation(0)); | 1354 EXPECT_EQ(kVideoRotation_0, ConvertCVOByteToVideoRotation(0)); |
1463 EXPECT_EQ(kVideoRotation_90, ConvertCVOByteToVideoRotation(1)); | 1355 EXPECT_EQ(kVideoRotation_90, ConvertCVOByteToVideoRotation(1)); |
1464 EXPECT_EQ(kVideoRotation_180, ConvertCVOByteToVideoRotation(2)); | 1356 EXPECT_EQ(kVideoRotation_180, ConvertCVOByteToVideoRotation(2)); |
1465 EXPECT_EQ(kVideoRotation_270, ConvertCVOByteToVideoRotation(3)); | 1357 EXPECT_EQ(kVideoRotation_270, ConvertCVOByteToVideoRotation(3)); |
1466 // Test extracting rotation when Camera (C) and Flip (F) bits are set. | 1358 // Test extracting rotation when Camera (C) and Flip (F) bits are set. |
1467 const int flip_bit = 1 << 2; | 1359 const int flip_bit = 1 << 2; |
1468 const int camera_bit = 1 << 3; | 1360 const int camera_bit = 1 << 3; |
1469 EXPECT_EQ(kVideoRotation_0, | 1361 EXPECT_EQ(kVideoRotation_0, |
1470 ConvertCVOByteToVideoRotation(flip_bit | camera_bit | 0)); | 1362 ConvertCVOByteToVideoRotation(flip_bit | camera_bit | 0)); |
1471 EXPECT_EQ(kVideoRotation_90, | 1363 EXPECT_EQ(kVideoRotation_90, |
1472 ConvertCVOByteToVideoRotation(flip_bit | camera_bit | 1)); | 1364 ConvertCVOByteToVideoRotation(flip_bit | camera_bit | 1)); |
1473 EXPECT_EQ(kVideoRotation_180, | 1365 EXPECT_EQ(kVideoRotation_180, |
1474 ConvertCVOByteToVideoRotation(flip_bit | camera_bit | 2)); | 1366 ConvertCVOByteToVideoRotation(flip_bit | camera_bit | 2)); |
1475 EXPECT_EQ(kVideoRotation_270, | 1367 EXPECT_EQ(kVideoRotation_270, |
1476 ConvertCVOByteToVideoRotation(flip_bit | camera_bit | 3)); | 1368 ConvertCVOByteToVideoRotation(flip_bit | camera_bit | 3)); |
1477 } | 1369 } |
1478 | 1370 |
1479 } // namespace webrtc | 1371 } // namespace webrtc |
OLD | NEW |