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 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
71 public: | 71 public: |
72 LoopbackTransportTest() | 72 LoopbackTransportTest() |
73 : packets_sent_(0), | 73 : packets_sent_(0), |
74 last_sent_packet_len_(0), | 74 last_sent_packet_len_(0), |
75 total_bytes_sent_(0), | 75 total_bytes_sent_(0), |
76 last_sent_packet_(nullptr) {} | 76 last_sent_packet_(nullptr) {} |
77 | 77 |
78 ~LoopbackTransportTest() { | 78 ~LoopbackTransportTest() { |
79 STLDeleteContainerPointers(sent_packets_.begin(), sent_packets_.end()); | 79 STLDeleteContainerPointers(sent_packets_.begin(), sent_packets_.end()); |
80 } | 80 } |
81 int SendPacket(int channel, const void *data, size_t len) override { | 81 int SendPacket(const void *data, size_t len) override { |
82 packets_sent_++; | 82 packets_sent_++; |
83 rtc::Buffer* buffer = | 83 rtc::Buffer* buffer = |
84 new rtc::Buffer(reinterpret_cast<const uint8_t*>(data), len); | 84 new rtc::Buffer(reinterpret_cast<const uint8_t*>(data), len); |
85 last_sent_packet_ = buffer->data(); | 85 last_sent_packet_ = buffer->data(); |
86 last_sent_packet_len_ = len; | 86 last_sent_packet_len_ = len; |
87 total_bytes_sent_ += len; | 87 total_bytes_sent_ += len; |
88 sent_packets_.push_back(buffer); | 88 sent_packets_.push_back(buffer); |
89 return static_cast<int>(len); | 89 return static_cast<int>(len); |
90 } | 90 } |
91 int SendRTCPPacket(int channel, const void* data, size_t len) override { | 91 int SendRTCPPacket(const void* data, size_t len) override { |
92 return -1; | 92 return -1; |
93 } | 93 } |
94 int packets_sent_; | 94 int packets_sent_; |
95 size_t last_sent_packet_len_; | 95 size_t last_sent_packet_len_; |
96 size_t total_bytes_sent_; | 96 size_t total_bytes_sent_; |
97 uint8_t* last_sent_packet_; | 97 uint8_t* last_sent_packet_; |
98 std::vector<rtc::Buffer*> sent_packets_; | 98 std::vector<rtc::Buffer*> sent_packets_; |
99 }; | 99 }; |
100 | 100 |
101 } // namespace | 101 } // namespace |
102 | 102 |
103 class RtpSenderTest : public ::testing::Test { | 103 class RtpSenderTest : public ::testing::Test { |
104 protected: | 104 protected: |
105 RtpSenderTest() | 105 RtpSenderTest() |
106 : fake_clock_(kStartTime), | 106 : fake_clock_(kStartTime), |
107 mock_paced_sender_(), | 107 mock_paced_sender_(), |
108 rtp_sender_(), | 108 rtp_sender_(), |
109 payload_(kPayload), | 109 payload_(kPayload), |
110 transport_(), | 110 transport_(), |
111 kMarkerBit(true) { | 111 kMarkerBit(true) { |
112 EXPECT_CALL(mock_paced_sender_, | 112 EXPECT_CALL(mock_paced_sender_, |
113 SendPacket(_, _, _, _, _, _)).WillRepeatedly(testing::Return(true)); | 113 SendPacket(_, _, _, _, _, _)).WillRepeatedly(testing::Return(true)); |
114 } | 114 } |
115 | 115 |
116 void SetUp() override { | 116 void SetUp() override { |
117 rtp_sender_.reset(new RTPSender(0, false, &fake_clock_, &transport_, | 117 rtp_sender_.reset(new RTPSender(false, &fake_clock_, &transport_, nullptr, |
118 nullptr, &mock_paced_sender_, nullptr, | 118 &mock_paced_sender_, nullptr, nullptr, |
119 nullptr, nullptr, nullptr, nullptr)); | 119 nullptr, nullptr, nullptr)); |
120 rtp_sender_->SetSequenceNumber(kSeqNum); | 120 rtp_sender_->SetSequenceNumber(kSeqNum); |
121 } | 121 } |
122 | 122 |
123 SimulatedClock fake_clock_; | 123 SimulatedClock fake_clock_; |
124 MockPacedSender mock_paced_sender_; | 124 MockPacedSender mock_paced_sender_; |
125 rtc::scoped_ptr<RTPSender> rtp_sender_; | 125 rtc::scoped_ptr<RTPSender> rtp_sender_; |
126 int payload_; | 126 int payload_; |
127 LoopbackTransportTest transport_; | 127 LoopbackTransportTest transport_; |
128 const bool kMarkerBit; | 128 const bool kMarkerBit; |
129 uint8_t packet_[kMaxPacketLength]; | 129 uint8_t packet_[kMaxPacketLength]; |
(...skipping 689 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
819 EXPECT_EQ(timestamp, rtp_header.timestamp); | 819 EXPECT_EQ(timestamp, rtp_header.timestamp); |
820 // Verify transmission time offset. This packet is sent without delay. | 820 // Verify transmission time offset. This packet is sent without delay. |
821 EXPECT_EQ(0, rtp_header.extension.transmissionTimeOffset); | 821 EXPECT_EQ(0, rtp_header.extension.transmissionTimeOffset); |
822 uint64_t expected_send_time = | 822 uint64_t expected_send_time = |
823 ConvertMsToAbsSendTime(fake_clock_.TimeInMilliseconds()); | 823 ConvertMsToAbsSendTime(fake_clock_.TimeInMilliseconds()); |
824 EXPECT_EQ(expected_send_time, rtp_header.extension.absoluteSendTime); | 824 EXPECT_EQ(expected_send_time, rtp_header.extension.absoluteSendTime); |
825 } | 825 } |
826 | 826 |
827 TEST_F(RtpSenderTest, SendRedundantPayloads) { | 827 TEST_F(RtpSenderTest, SendRedundantPayloads) { |
828 MockTransport transport; | 828 MockTransport transport; |
829 rtp_sender_.reset(new RTPSender(0, false, &fake_clock_, &transport, nullptr, | 829 rtp_sender_.reset(new RTPSender(false, &fake_clock_, &transport, nullptr, |
830 &mock_paced_sender_, nullptr, nullptr, | 830 &mock_paced_sender_, nullptr, nullptr, |
831 nullptr, nullptr, nullptr)); | 831 nullptr, nullptr, nullptr)); |
832 rtp_sender_->SetSequenceNumber(kSeqNum); | 832 rtp_sender_->SetSequenceNumber(kSeqNum); |
833 rtp_sender_->SetRtxPayloadType(kRtxPayload, kPayload); | 833 rtp_sender_->SetRtxPayloadType(kRtxPayload, kPayload); |
834 // Make all packets go through the pacer. | 834 // Make all packets go through the pacer. |
835 EXPECT_CALL(mock_paced_sender_, | 835 EXPECT_CALL(mock_paced_sender_, |
836 SendPacket(PacedSender::kNormalPriority, _, _, _, _, _)). | 836 SendPacket(PacedSender::kNormalPriority, _, _, _, _, _)). |
837 WillRepeatedly(testing::Return(false)); | 837 WillRepeatedly(testing::Return(false)); |
838 | 838 |
839 uint16_t seq_num = kSeqNum; | 839 uint16_t seq_num = kSeqNum; |
(...skipping 15 matching lines...) Expand all Loading... |
855 kTransmissionTimeOffsetExtensionId); | 855 kTransmissionTimeOffsetExtensionId); |
856 rtp_parser->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime, | 856 rtp_parser->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime, |
857 kAbsoluteSendTimeExtensionId); | 857 kAbsoluteSendTimeExtensionId); |
858 rtp_sender_->SetTargetBitrate(300000); | 858 rtp_sender_->SetTargetBitrate(300000); |
859 const size_t kNumPayloadSizes = 10; | 859 const size_t kNumPayloadSizes = 10; |
860 const size_t kPayloadSizes[kNumPayloadSizes] = {500, 550, 600, 650, 700, 750, | 860 const size_t kPayloadSizes[kNumPayloadSizes] = {500, 550, 600, 650, 700, 750, |
861 800, 850, 900, 950}; | 861 800, 850, 900, 950}; |
862 // Send 10 packets of increasing size. | 862 // Send 10 packets of increasing size. |
863 for (size_t i = 0; i < kNumPayloadSizes; ++i) { | 863 for (size_t i = 0; i < kNumPayloadSizes; ++i) { |
864 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds(); | 864 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds(); |
865 EXPECT_CALL(transport, SendPacket(_, _, _)) | 865 EXPECT_CALL(transport, SendPacket(_, _)).WillOnce(testing::ReturnArg<1>()); |
866 .WillOnce(testing::ReturnArg<2>()); | |
867 SendPacket(capture_time_ms, kPayloadSizes[i]); | 866 SendPacket(capture_time_ms, kPayloadSizes[i]); |
868 rtp_sender_->TimeToSendPacket(seq_num++, capture_time_ms, false); | 867 rtp_sender_->TimeToSendPacket(seq_num++, capture_time_ms, false); |
869 fake_clock_.AdvanceTimeMilliseconds(33); | 868 fake_clock_.AdvanceTimeMilliseconds(33); |
870 } | 869 } |
871 // The amount of padding to send it too small to send a payload packet. | 870 // The amount of padding to send it too small to send a payload packet. |
872 EXPECT_CALL(transport, | 871 EXPECT_CALL(transport, SendPacket(_, kMaxPaddingSize + rtp_header_len)) |
873 SendPacket(_, _, kMaxPaddingSize + rtp_header_len)) | 872 .WillOnce(testing::ReturnArg<1>()); |
874 .WillOnce(testing::ReturnArg<2>()); | |
875 EXPECT_EQ(kMaxPaddingSize, rtp_sender_->TimeToSendPadding(49)); | 873 EXPECT_EQ(kMaxPaddingSize, rtp_sender_->TimeToSendPadding(49)); |
876 | 874 |
877 EXPECT_CALL(transport, SendPacket(_, _, kPayloadSizes[0] + | 875 EXPECT_CALL(transport, |
878 rtp_header_len + kRtxHeaderSize)) | 876 SendPacket(_, kPayloadSizes[0] + rtp_header_len + kRtxHeaderSize)) |
879 .WillOnce(testing::ReturnArg<2>()); | 877 .WillOnce(testing::ReturnArg<1>()); |
880 EXPECT_EQ(kPayloadSizes[0], rtp_sender_->TimeToSendPadding(500)); | 878 EXPECT_EQ(kPayloadSizes[0], rtp_sender_->TimeToSendPadding(500)); |
881 | 879 |
882 EXPECT_CALL(transport, SendPacket(_, _, kPayloadSizes[kNumPayloadSizes - 1] + | 880 EXPECT_CALL(transport, SendPacket(_, kPayloadSizes[kNumPayloadSizes - 1] + |
883 rtp_header_len + kRtxHeaderSize)) | 881 rtp_header_len + kRtxHeaderSize)) |
884 .WillOnce(testing::ReturnArg<2>()); | 882 .WillOnce(testing::ReturnArg<1>()); |
885 EXPECT_CALL(transport, SendPacket(_, _, kMaxPaddingSize + rtp_header_len)) | 883 EXPECT_CALL(transport, SendPacket(_, kMaxPaddingSize + rtp_header_len)) |
886 .WillOnce(testing::ReturnArg<2>()); | 884 .WillOnce(testing::ReturnArg<1>()); |
887 EXPECT_EQ(kPayloadSizes[kNumPayloadSizes - 1] + kMaxPaddingSize, | 885 EXPECT_EQ(kPayloadSizes[kNumPayloadSizes - 1] + kMaxPaddingSize, |
888 rtp_sender_->TimeToSendPadding(999)); | 886 rtp_sender_->TimeToSendPadding(999)); |
889 } | 887 } |
890 | 888 |
891 TEST_F(RtpSenderTest, SendGenericVideo) { | 889 TEST_F(RtpSenderTest, SendGenericVideo) { |
892 char payload_name[RTP_PAYLOAD_NAME_SIZE] = "GENERIC"; | 890 char payload_name[RTP_PAYLOAD_NAME_SIZE] = "GENERIC"; |
893 const uint8_t payload_type = 127; | 891 const uint8_t payload_type = 127; |
894 ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 90000, | 892 ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 90000, |
895 0, 1500)); | 893 0, 1500)); |
896 uint8_t payload[] = {47, 11, 32, 93, 89}; | 894 uint8_t payload[] = {47, 11, 32, 93, 89}; |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
953 ++num_calls_; | 951 ++num_calls_; |
954 ssrc_ = ssrc; | 952 ssrc_ = ssrc; |
955 frame_counts_ = frame_counts; | 953 frame_counts_ = frame_counts; |
956 } | 954 } |
957 | 955 |
958 uint32_t num_calls_; | 956 uint32_t num_calls_; |
959 uint32_t ssrc_; | 957 uint32_t ssrc_; |
960 FrameCounts frame_counts_; | 958 FrameCounts frame_counts_; |
961 } callback; | 959 } callback; |
962 | 960 |
963 rtp_sender_.reset(new RTPSender(0, false, &fake_clock_, &transport_, nullptr, | 961 rtp_sender_.reset(new RTPSender(false, &fake_clock_, &transport_, nullptr, |
964 &mock_paced_sender_, nullptr, nullptr, | 962 &mock_paced_sender_, nullptr, nullptr, |
965 nullptr, &callback, nullptr)); | 963 nullptr, &callback, nullptr)); |
966 | 964 |
967 char payload_name[RTP_PAYLOAD_NAME_SIZE] = "GENERIC"; | 965 char payload_name[RTP_PAYLOAD_NAME_SIZE] = "GENERIC"; |
968 const uint8_t payload_type = 127; | 966 const uint8_t payload_type = 127; |
969 ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 90000, | 967 ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 90000, |
970 0, 1500)); | 968 0, 1500)); |
971 uint8_t payload[] = {47, 11, 32, 93, 89}; | 969 uint8_t payload[] = {47, 11, 32, 93, 89}; |
972 rtp_sender_->SetStorePacketsStatus(true, 1); | 970 rtp_sender_->SetStorePacketsStatus(true, 1); |
973 uint32_t ssrc = rtp_sender_->SSRC(); | 971 uint32_t ssrc = rtp_sender_->SSRC(); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1006 ssrc_ = ssrc; | 1004 ssrc_ = ssrc; |
1007 total_stats_ = total_stats; | 1005 total_stats_ = total_stats; |
1008 retransmit_stats_ = retransmit_stats; | 1006 retransmit_stats_ = retransmit_stats; |
1009 } | 1007 } |
1010 | 1008 |
1011 uint32_t num_calls_; | 1009 uint32_t num_calls_; |
1012 uint32_t ssrc_; | 1010 uint32_t ssrc_; |
1013 BitrateStatistics total_stats_; | 1011 BitrateStatistics total_stats_; |
1014 BitrateStatistics retransmit_stats_; | 1012 BitrateStatistics retransmit_stats_; |
1015 } callback; | 1013 } callback; |
1016 rtp_sender_.reset(new RTPSender(0, false, &fake_clock_, &transport_, nullptr, | 1014 rtp_sender_.reset(new RTPSender(false, &fake_clock_, &transport_, nullptr, |
1017 &mock_paced_sender_, nullptr, nullptr, | 1015 &mock_paced_sender_, nullptr, nullptr, |
1018 &callback, nullptr, nullptr)); | 1016 &callback, nullptr, nullptr)); |
1019 | 1017 |
1020 // Simulate kNumPackets sent with kPacketInterval ms intervals. | 1018 // Simulate kNumPackets sent with kPacketInterval ms intervals. |
1021 const uint32_t kNumPackets = 15; | 1019 const uint32_t kNumPackets = 15; |
1022 const uint32_t kPacketInterval = 20; | 1020 const uint32_t kPacketInterval = 20; |
1023 // Overhead = 12 bytes RTP header + 1 byte generic header. | 1021 // Overhead = 12 bytes RTP header + 1 byte generic header. |
1024 const uint32_t kPacketOverhead = 13; | 1022 const uint32_t kPacketOverhead = 13; |
1025 | 1023 |
1026 char payload_name[RTP_PAYLOAD_NAME_SIZE] = "GENERIC"; | 1024 char payload_name[RTP_PAYLOAD_NAME_SIZE] = "GENERIC"; |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1065 | 1063 |
1066 rtp_sender_.reset(); | 1064 rtp_sender_.reset(); |
1067 } | 1065 } |
1068 | 1066 |
1069 class RtpSenderAudioTest : public RtpSenderTest { | 1067 class RtpSenderAudioTest : public RtpSenderTest { |
1070 protected: | 1068 protected: |
1071 RtpSenderAudioTest() {} | 1069 RtpSenderAudioTest() {} |
1072 | 1070 |
1073 void SetUp() override { | 1071 void SetUp() override { |
1074 payload_ = kAudioPayload; | 1072 payload_ = kAudioPayload; |
1075 rtp_sender_.reset(new RTPSender(0, true, &fake_clock_, &transport_, nullptr, | 1073 rtp_sender_.reset(new RTPSender(true, &fake_clock_, &transport_, nullptr, |
1076 &mock_paced_sender_, nullptr, nullptr, | 1074 &mock_paced_sender_, nullptr, nullptr, |
1077 nullptr, nullptr, nullptr)); | 1075 nullptr, nullptr, nullptr)); |
1078 rtp_sender_->SetSequenceNumber(kSeqNum); | 1076 rtp_sender_->SetSequenceNumber(kSeqNum); |
1079 } | 1077 } |
1080 }; | 1078 }; |
1081 | 1079 |
1082 TEST_F(RtpSenderTest, StreamDataCountersCallbacks) { | 1080 TEST_F(RtpSenderTest, StreamDataCountersCallbacks) { |
1083 class TestCallback : public StreamDataCountersCallback { | 1081 class TestCallback : public StreamDataCountersCallback { |
1084 public: | 1082 public: |
1085 TestCallback() | 1083 TestCallback() |
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1373 reinterpret_cast<uint8_t*>(transport_.sent_packets_[0]->data()), | 1371 reinterpret_cast<uint8_t*>(transport_.sent_packets_[0]->data()), |
1374 transport_.sent_packets_[0]->size(), true, &map, kSeqNum, hdr.rotation); | 1372 transport_.sent_packets_[0]->size(), true, &map, kSeqNum, hdr.rotation); |
1375 | 1373 |
1376 // Verify that this packet does have CVO byte. | 1374 // Verify that this packet does have CVO byte. |
1377 VerifyCVOPacket( | 1375 VerifyCVOPacket( |
1378 reinterpret_cast<uint8_t*>(transport_.sent_packets_[1]->data()), | 1376 reinterpret_cast<uint8_t*>(transport_.sent_packets_[1]->data()), |
1379 transport_.sent_packets_[1]->size(), true, &map, kSeqNum + 1, | 1377 transport_.sent_packets_[1]->size(), true, &map, kSeqNum + 1, |
1380 hdr.rotation); | 1378 hdr.rotation); |
1381 } | 1379 } |
1382 } // namespace webrtc | 1380 } // namespace webrtc |
OLD | NEW |