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 <list> | 11 #include <list> |
12 #include <memory> | 12 #include <memory> |
13 #include <vector> | 13 #include <vector> |
14 | 14 |
15 #include "testing/gmock/include/gmock/gmock.h" | 15 #include "testing/gmock/include/gmock/gmock.h" |
16 #include "testing/gtest/include/gtest/gtest.h" | 16 #include "testing/gtest/include/gtest/gtest.h" |
17 #include "webrtc/base/buffer.h" | 17 #include "webrtc/base/buffer.h" |
18 #include "webrtc/base/rate_limiter.h" | |
19 #include "webrtc/call/mock/mock_rtc_event_log.h" | 18 #include "webrtc/call/mock/mock_rtc_event_log.h" |
20 #include "webrtc/modules/rtp_rtcp/include/rtp_cvo.h" | 19 #include "webrtc/modules/rtp_rtcp/include/rtp_cvo.h" |
21 #include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h" | 20 #include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h" |
22 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h" | 21 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h" |
23 #include "webrtc/modules/rtp_rtcp/source/rtp_format_video_generic.h" | 22 #include "webrtc/modules/rtp_rtcp/source/rtp_format_video_generic.h" |
24 #include "webrtc/modules/rtp_rtcp/source/rtp_header_extension.h" | 23 #include "webrtc/modules/rtp_rtcp/source/rtp_header_extension.h" |
25 #include "webrtc/modules/rtp_rtcp/source/rtp_sender.h" | 24 #include "webrtc/modules/rtp_rtcp/source/rtp_sender.h" |
26 #include "webrtc/modules/rtp_rtcp/source/rtp_sender_video.h" | 25 #include "webrtc/modules/rtp_rtcp/source/rtp_sender_video.h" |
27 #include "webrtc/modules/rtp_rtcp/source/rtp_utility.h" | 26 #include "webrtc/modules/rtp_rtcp/source/rtp_utility.h" |
28 #include "webrtc/system_wrappers/include/stl_util.h" | 27 #include "webrtc/system_wrappers/include/stl_util.h" |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
127 public: | 126 public: |
128 MOCK_METHOD3(OnSendPacket, void(uint16_t, int64_t, uint32_t)); | 127 MOCK_METHOD3(OnSendPacket, void(uint16_t, int64_t, uint32_t)); |
129 }; | 128 }; |
130 | 129 |
131 class RtpSenderTest : public ::testing::Test { | 130 class RtpSenderTest : public ::testing::Test { |
132 protected: | 131 protected: |
133 RtpSenderTest() | 132 RtpSenderTest() |
134 : fake_clock_(kStartTime), | 133 : fake_clock_(kStartTime), |
135 mock_rtc_event_log_(), | 134 mock_rtc_event_log_(), |
136 mock_paced_sender_(), | 135 mock_paced_sender_(), |
137 retransmission_rate_limiter_(&fake_clock_, 1000), | |
138 rtp_sender_(), | 136 rtp_sender_(), |
139 payload_(kPayload), | 137 payload_(kPayload), |
140 transport_(), | 138 transport_(), |
141 kMarkerBit(true) {} | 139 kMarkerBit(true) { |
| 140 } |
142 | 141 |
143 void SetUp() override { SetUpRtpSender(true); } | 142 void SetUp() override { SetUpRtpSender(true); } |
144 | 143 |
145 void SetUpRtpSender(bool pacer) { | 144 void SetUpRtpSender(bool pacer) { |
146 rtp_sender_.reset(new RTPSender( | 145 rtp_sender_.reset(new RTPSender( |
147 false, &fake_clock_, &transport_, pacer ? &mock_paced_sender_ : nullptr, | 146 false, &fake_clock_, &transport_, pacer ? &mock_paced_sender_ : nullptr, |
148 &seq_num_allocator_, nullptr, nullptr, nullptr, nullptr, | 147 &seq_num_allocator_, nullptr, nullptr, nullptr, nullptr, |
149 &mock_rtc_event_log_, &send_packet_observer_, | 148 &mock_rtc_event_log_, &send_packet_observer_)); |
150 &retransmission_rate_limiter_)); | |
151 rtp_sender_->SetSequenceNumber(kSeqNum); | 149 rtp_sender_->SetSequenceNumber(kSeqNum); |
152 } | 150 } |
153 | 151 |
154 SimulatedClock fake_clock_; | 152 SimulatedClock fake_clock_; |
155 MockRtcEventLog mock_rtc_event_log_; | 153 MockRtcEventLog mock_rtc_event_log_; |
156 MockRtpPacketSender mock_paced_sender_; | 154 MockRtpPacketSender mock_paced_sender_; |
157 MockTransportSequenceNumberAllocator seq_num_allocator_; | 155 MockTransportSequenceNumberAllocator seq_num_allocator_; |
158 MockSendPacketObserver send_packet_observer_; | 156 MockSendPacketObserver send_packet_observer_; |
159 RateLimiter retransmission_rate_limiter_; | |
160 std::unique_ptr<RTPSender> rtp_sender_; | 157 std::unique_ptr<RTPSender> rtp_sender_; |
161 int payload_; | 158 int payload_; |
162 LoopbackTransportTest transport_; | 159 LoopbackTransportTest transport_; |
163 const bool kMarkerBit; | 160 const bool kMarkerBit; |
164 uint8_t packet_[kMaxPacketLength]; | 161 uint8_t packet_[kMaxPacketLength]; |
165 | 162 |
166 void VerifyRTPHeaderCommon(const RTPHeader& rtp_header) { | 163 void VerifyRTPHeaderCommon(const RTPHeader& rtp_header) { |
167 VerifyRTPHeaderCommon(rtp_header, kMarkerBit, 0); | 164 VerifyRTPHeaderCommon(rtp_header, kMarkerBit, 0); |
168 } | 165 } |
169 | 166 |
(...skipping 569 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
739 EXPECT_CALL(mock_rtc_event_log_, | 736 EXPECT_CALL(mock_rtc_event_log_, |
740 LogRtpHeader(PacketDirection::kOutgoingPacket, _, _, _)); | 737 LogRtpHeader(PacketDirection::kOutgoingPacket, _, _, _)); |
741 | 738 |
742 rtp_sender_->SetStorePacketsStatus(true, 10); | 739 rtp_sender_->SetStorePacketsStatus(true, 10); |
743 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( | 740 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( |
744 kRtpExtensionTransmissionTimeOffset, | 741 kRtpExtensionTransmissionTimeOffset, |
745 kTransmissionTimeOffsetExtensionId)); | 742 kTransmissionTimeOffsetExtensionId)); |
746 EXPECT_EQ( | 743 EXPECT_EQ( |
747 0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime, | 744 0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime, |
748 kAbsoluteSendTimeExtensionId)); | 745 kAbsoluteSendTimeExtensionId)); |
| 746 rtp_sender_->SetTargetBitrate(300000); |
749 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds(); | 747 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds(); |
750 int rtp_length_int = rtp_sender_->BuildRTPheader( | 748 int rtp_length_int = rtp_sender_->BuildRTPheader( |
751 packet_, kPayload, kMarkerBit, kTimestamp, capture_time_ms); | 749 packet_, kPayload, kMarkerBit, kTimestamp, capture_time_ms); |
752 ASSERT_NE(-1, rtp_length_int); | 750 ASSERT_NE(-1, rtp_length_int); |
753 size_t rtp_length = static_cast<size_t>(rtp_length_int); | 751 size_t rtp_length = static_cast<size_t>(rtp_length_int); |
754 | 752 |
755 // Packet should be stored in a send bucket. | 753 // Packet should be stored in a send bucket. |
756 EXPECT_EQ(0, rtp_sender_->SendToNetwork(packet_, 0, rtp_length, | 754 EXPECT_EQ(0, rtp_sender_->SendToNetwork(packet_, 0, rtp_length, |
757 capture_time_ms, kAllowRetransmission, | 755 capture_time_ms, kAllowRetransmission, |
758 RtpPacketSender::kNormalPriority)); | 756 RtpPacketSender::kNormalPriority)); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
792 EXPECT_CALL(mock_rtc_event_log_, | 790 EXPECT_CALL(mock_rtc_event_log_, |
793 LogRtpHeader(PacketDirection::kOutgoingPacket, _, _, _)); | 791 LogRtpHeader(PacketDirection::kOutgoingPacket, _, _, _)); |
794 | 792 |
795 rtp_sender_->SetStorePacketsStatus(true, 10); | 793 rtp_sender_->SetStorePacketsStatus(true, 10); |
796 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( | 794 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( |
797 kRtpExtensionTransmissionTimeOffset, | 795 kRtpExtensionTransmissionTimeOffset, |
798 kTransmissionTimeOffsetExtensionId)); | 796 kTransmissionTimeOffsetExtensionId)); |
799 EXPECT_EQ( | 797 EXPECT_EQ( |
800 0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime, | 798 0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime, |
801 kAbsoluteSendTimeExtensionId)); | 799 kAbsoluteSendTimeExtensionId)); |
| 800 rtp_sender_->SetTargetBitrate(300000); |
802 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds(); | 801 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds(); |
803 int rtp_length_int = rtp_sender_->BuildRTPheader( | 802 int rtp_length_int = rtp_sender_->BuildRTPheader( |
804 packet_, kPayload, kMarkerBit, kTimestamp, capture_time_ms); | 803 packet_, kPayload, kMarkerBit, kTimestamp, capture_time_ms); |
805 ASSERT_NE(-1, rtp_length_int); | 804 ASSERT_NE(-1, rtp_length_int); |
806 size_t rtp_length = static_cast<size_t>(rtp_length_int); | 805 size_t rtp_length = static_cast<size_t>(rtp_length_int); |
807 | 806 |
808 // Packet should be stored in a send bucket. | 807 // Packet should be stored in a send bucket. |
809 EXPECT_EQ(0, rtp_sender_->SendToNetwork(packet_, 0, rtp_length, | 808 EXPECT_EQ(0, rtp_sender_->SendToNetwork(packet_, 0, rtp_length, |
810 capture_time_ms, kAllowRetransmission, | 809 capture_time_ms, kAllowRetransmission, |
811 RtpPacketSender::kNormalPriority)); | 810 RtpPacketSender::kNormalPriority)); |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
873 // Create and set up parser. | 872 // Create and set up parser. |
874 std::unique_ptr<webrtc::RtpHeaderParser> rtp_parser( | 873 std::unique_ptr<webrtc::RtpHeaderParser> rtp_parser( |
875 webrtc::RtpHeaderParser::Create()); | 874 webrtc::RtpHeaderParser::Create()); |
876 ASSERT_TRUE(rtp_parser.get() != nullptr); | 875 ASSERT_TRUE(rtp_parser.get() != nullptr); |
877 rtp_parser->RegisterRtpHeaderExtension(kRtpExtensionTransmissionTimeOffset, | 876 rtp_parser->RegisterRtpHeaderExtension(kRtpExtensionTransmissionTimeOffset, |
878 kTransmissionTimeOffsetExtensionId); | 877 kTransmissionTimeOffsetExtensionId); |
879 rtp_parser->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime, | 878 rtp_parser->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime, |
880 kAbsoluteSendTimeExtensionId); | 879 kAbsoluteSendTimeExtensionId); |
881 webrtc::RTPHeader rtp_header; | 880 webrtc::RTPHeader rtp_header; |
882 | 881 |
| 882 rtp_sender_->SetTargetBitrate(300000); |
883 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds(); | 883 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds(); |
884 int rtp_length_int = rtp_sender_->BuildRTPheader( | 884 int rtp_length_int = rtp_sender_->BuildRTPheader( |
885 packet_, kPayload, kMarkerBit, timestamp, capture_time_ms); | 885 packet_, kPayload, kMarkerBit, timestamp, capture_time_ms); |
886 const uint32_t media_packet_timestamp = timestamp; | 886 const uint32_t media_packet_timestamp = timestamp; |
887 ASSERT_NE(-1, rtp_length_int); | 887 ASSERT_NE(-1, rtp_length_int); |
888 size_t rtp_length = static_cast<size_t>(rtp_length_int); | 888 size_t rtp_length = static_cast<size_t>(rtp_length_int); |
889 | 889 |
890 // Packet should be stored in a send bucket. | 890 // Packet should be stored in a send bucket. |
891 EXPECT_EQ(0, rtp_sender_->SendToNetwork(packet_, 0, rtp_length, | 891 EXPECT_EQ(0, rtp_sender_->SendToNetwork(packet_, 0, rtp_length, |
892 capture_time_ms, kAllowRetransmission, | 892 capture_time_ms, kAllowRetransmission, |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1004 const bool kIsRetransmit = true; | 1004 const bool kIsRetransmit = true; |
1005 rtp_sender_->TimeToSendPacket(kSeqNum, fake_clock_.TimeInMilliseconds(), | 1005 rtp_sender_->TimeToSendPacket(kSeqNum, fake_clock_.TimeInMilliseconds(), |
1006 kIsRetransmit, PacketInfo::kNotAProbe); | 1006 kIsRetransmit, PacketInfo::kNotAProbe); |
1007 EXPECT_EQ(1, transport_.packets_sent_); | 1007 EXPECT_EQ(1, transport_.packets_sent_); |
1008 } | 1008 } |
1009 | 1009 |
1010 TEST_F(RtpSenderTest, OnSendPacketNotUpdatedWithoutSeqNumAllocator) { | 1010 TEST_F(RtpSenderTest, OnSendPacketNotUpdatedWithoutSeqNumAllocator) { |
1011 rtp_sender_.reset(new RTPSender( | 1011 rtp_sender_.reset(new RTPSender( |
1012 false, &fake_clock_, &transport_, &mock_paced_sender_, | 1012 false, &fake_clock_, &transport_, &mock_paced_sender_, |
1013 nullptr /* TransportSequenceNumberAllocator */, nullptr, nullptr, nullptr, | 1013 nullptr /* TransportSequenceNumberAllocator */, nullptr, nullptr, nullptr, |
1014 nullptr, nullptr, &send_packet_observer_, nullptr)); | 1014 nullptr, nullptr, &send_packet_observer_)); |
1015 rtp_sender_->SetSequenceNumber(kSeqNum); | 1015 rtp_sender_->SetSequenceNumber(kSeqNum); |
1016 rtp_sender_->SetStorePacketsStatus(true, 10); | 1016 rtp_sender_->SetStorePacketsStatus(true, 10); |
1017 | 1017 |
1018 EXPECT_CALL(send_packet_observer_, OnSendPacket(_, _, _)).Times(0); | 1018 EXPECT_CALL(send_packet_observer_, OnSendPacket(_, _, _)).Times(0); |
1019 EXPECT_CALL(mock_paced_sender_, InsertPacket(_, _, _, _, _, _)).Times(1); | 1019 EXPECT_CALL(mock_paced_sender_, InsertPacket(_, _, _, _, _, _)).Times(1); |
1020 | 1020 |
1021 SendGenericPayload(); // Packet passed to pacer. | 1021 SendGenericPayload(); // Packet passed to pacer. |
1022 const bool kIsRetransmit = false; | 1022 const bool kIsRetransmit = false; |
1023 rtp_sender_->TimeToSendPacket(kSeqNum, fake_clock_.TimeInMilliseconds(), | 1023 rtp_sender_->TimeToSendPacket(kSeqNum, fake_clock_.TimeInMilliseconds(), |
1024 kIsRetransmit, PacketInfo::kNotAProbe); | 1024 kIsRetransmit, PacketInfo::kNotAProbe); |
1025 EXPECT_EQ(1, transport_.packets_sent_); | 1025 EXPECT_EQ(1, transport_.packets_sent_); |
1026 } | 1026 } |
1027 | 1027 |
1028 TEST_F(RtpSenderTest, SendRedundantPayloads) { | 1028 TEST_F(RtpSenderTest, SendRedundantPayloads) { |
1029 MockTransport transport; | 1029 MockTransport transport; |
1030 rtp_sender_.reset(new RTPSender( | 1030 rtp_sender_.reset(new RTPSender( |
1031 false, &fake_clock_, &transport, &mock_paced_sender_, nullptr, nullptr, | 1031 false, &fake_clock_, &transport, &mock_paced_sender_, nullptr, nullptr, |
1032 nullptr, nullptr, nullptr, &mock_rtc_event_log_, nullptr, nullptr)); | 1032 nullptr, nullptr, nullptr, &mock_rtc_event_log_, nullptr)); |
1033 | 1033 |
1034 rtp_sender_->SetSequenceNumber(kSeqNum); | 1034 rtp_sender_->SetSequenceNumber(kSeqNum); |
1035 rtp_sender_->SetRtxPayloadType(kRtxPayload, kPayload); | 1035 rtp_sender_->SetRtxPayloadType(kRtxPayload, kPayload); |
1036 | 1036 |
1037 uint16_t seq_num = kSeqNum; | 1037 uint16_t seq_num = kSeqNum; |
1038 rtp_sender_->SetStorePacketsStatus(true, 10); | 1038 rtp_sender_->SetStorePacketsStatus(true, 10); |
1039 int32_t rtp_header_len = kRtpHeaderSize; | 1039 int32_t rtp_header_len = kRtpHeaderSize; |
1040 EXPECT_EQ( | 1040 EXPECT_EQ( |
1041 0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime, | 1041 0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime, |
1042 kAbsoluteSendTimeExtensionId)); | 1042 kAbsoluteSendTimeExtensionId)); |
1043 rtp_header_len += 4; // 4 bytes extension. | 1043 rtp_header_len += 4; // 4 bytes extension. |
1044 rtp_header_len += 4; // 4 extra bytes common to all extension headers. | 1044 rtp_header_len += 4; // 4 extra bytes common to all extension headers. |
1045 | 1045 |
1046 rtp_sender_->SetRtxStatus(kRtxRetransmitted | kRtxRedundantPayloads); | 1046 rtp_sender_->SetRtxStatus(kRtxRetransmitted | kRtxRedundantPayloads); |
1047 rtp_sender_->SetRtxSsrc(1234); | 1047 rtp_sender_->SetRtxSsrc(1234); |
1048 | 1048 |
1049 // Create and set up parser. | 1049 // Create and set up parser. |
1050 std::unique_ptr<webrtc::RtpHeaderParser> rtp_parser( | 1050 std::unique_ptr<webrtc::RtpHeaderParser> rtp_parser( |
1051 webrtc::RtpHeaderParser::Create()); | 1051 webrtc::RtpHeaderParser::Create()); |
1052 ASSERT_TRUE(rtp_parser.get() != nullptr); | 1052 ASSERT_TRUE(rtp_parser.get() != nullptr); |
1053 rtp_parser->RegisterRtpHeaderExtension(kRtpExtensionTransmissionTimeOffset, | 1053 rtp_parser->RegisterRtpHeaderExtension(kRtpExtensionTransmissionTimeOffset, |
1054 kTransmissionTimeOffsetExtensionId); | 1054 kTransmissionTimeOffsetExtensionId); |
1055 rtp_parser->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime, | 1055 rtp_parser->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime, |
1056 kAbsoluteSendTimeExtensionId); | 1056 kAbsoluteSendTimeExtensionId); |
| 1057 rtp_sender_->SetTargetBitrate(300000); |
1057 const size_t kNumPayloadSizes = 10; | 1058 const size_t kNumPayloadSizes = 10; |
1058 const size_t kPayloadSizes[kNumPayloadSizes] = {500, 550, 600, 650, 700, | 1059 const size_t kPayloadSizes[kNumPayloadSizes] = {500, 550, 600, 650, 700, |
1059 750, 800, 850, 900, 950}; | 1060 750, 800, 850, 900, 950}; |
1060 // Expect all packets go through the pacer. | 1061 // Expect all packets go through the pacer. |
1061 EXPECT_CALL(mock_paced_sender_, | 1062 EXPECT_CALL(mock_paced_sender_, |
1062 InsertPacket(RtpPacketSender::kNormalPriority, _, _, _, _, _)) | 1063 InsertPacket(RtpPacketSender::kNormalPriority, _, _, _, _, _)) |
1063 .Times(kNumPayloadSizes); | 1064 .Times(kNumPayloadSizes); |
1064 EXPECT_CALL(mock_rtc_event_log_, | 1065 EXPECT_CALL(mock_rtc_event_log_, |
1065 LogRtpHeader(PacketDirection::kOutgoingPacket, _, _, _)) | 1066 LogRtpHeader(PacketDirection::kOutgoingPacket, _, _, _)) |
1066 .Times(kNumPayloadSizes); | 1067 .Times(kNumPayloadSizes); |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1168 frame_counts_ = frame_counts; | 1169 frame_counts_ = frame_counts; |
1169 } | 1170 } |
1170 | 1171 |
1171 uint32_t num_calls_; | 1172 uint32_t num_calls_; |
1172 uint32_t ssrc_; | 1173 uint32_t ssrc_; |
1173 FrameCounts frame_counts_; | 1174 FrameCounts frame_counts_; |
1174 } callback; | 1175 } callback; |
1175 | 1176 |
1176 rtp_sender_.reset(new RTPSender( | 1177 rtp_sender_.reset(new RTPSender( |
1177 false, &fake_clock_, &transport_, &mock_paced_sender_, nullptr, nullptr, | 1178 false, &fake_clock_, &transport_, &mock_paced_sender_, nullptr, nullptr, |
1178 nullptr, &callback, nullptr, nullptr, nullptr, nullptr)); | 1179 nullptr, &callback, nullptr, nullptr, nullptr)); |
1179 | 1180 |
1180 char payload_name[RTP_PAYLOAD_NAME_SIZE] = "GENERIC"; | 1181 char payload_name[RTP_PAYLOAD_NAME_SIZE] = "GENERIC"; |
1181 const uint8_t payload_type = 127; | 1182 const uint8_t payload_type = 127; |
1182 ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 90000, | 1183 ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 90000, |
1183 0, 1500)); | 1184 0, 1500)); |
1184 uint8_t payload[] = {47, 11, 32, 93, 89}; | 1185 uint8_t payload[] = {47, 11, 32, 93, 89}; |
1185 rtp_sender_->SetStorePacketsStatus(true, 1); | 1186 rtp_sender_->SetStorePacketsStatus(true, 1); |
1186 uint32_t ssrc = rtp_sender_->SSRC(); | 1187 uint32_t ssrc = rtp_sender_->SSRC(); |
1187 | 1188 |
1188 EXPECT_CALL(mock_paced_sender_, InsertPacket(_, _, _, _, _, _)) | 1189 EXPECT_CALL(mock_paced_sender_, InsertPacket(_, _, _, _, _, _)) |
(...skipping 16 matching lines...) Expand all Loading... |
1205 EXPECT_EQ(ssrc, callback.ssrc_); | 1206 EXPECT_EQ(ssrc, callback.ssrc_); |
1206 EXPECT_EQ(1, callback.frame_counts_.key_frames); | 1207 EXPECT_EQ(1, callback.frame_counts_.key_frames); |
1207 EXPECT_EQ(1, callback.frame_counts_.delta_frames); | 1208 EXPECT_EQ(1, callback.frame_counts_.delta_frames); |
1208 | 1209 |
1209 rtp_sender_.reset(); | 1210 rtp_sender_.reset(); |
1210 } | 1211 } |
1211 | 1212 |
1212 TEST_F(RtpSenderTest, BitrateCallbacks) { | 1213 TEST_F(RtpSenderTest, BitrateCallbacks) { |
1213 class TestCallback : public BitrateStatisticsObserver { | 1214 class TestCallback : public BitrateStatisticsObserver { |
1214 public: | 1215 public: |
1215 TestCallback() | 1216 TestCallback() : BitrateStatisticsObserver(), num_calls_(0), ssrc_(0) {} |
1216 : BitrateStatisticsObserver(), | |
1217 num_calls_(0), | |
1218 ssrc_(0), | |
1219 total_bitrate_(0), | |
1220 retransmit_bitrate_(0) {} | |
1221 virtual ~TestCallback() {} | 1217 virtual ~TestCallback() {} |
1222 | 1218 |
1223 void Notify(uint32_t total_bitrate, | 1219 void Notify(const BitrateStatistics& total_stats, |
1224 uint32_t retransmit_bitrate, | 1220 const BitrateStatistics& retransmit_stats, |
1225 uint32_t ssrc) override { | 1221 uint32_t ssrc) override { |
1226 ++num_calls_; | 1222 ++num_calls_; |
1227 ssrc_ = ssrc; | 1223 ssrc_ = ssrc; |
1228 total_bitrate_ = total_bitrate; | 1224 total_stats_ = total_stats; |
1229 retransmit_bitrate_ = retransmit_bitrate; | 1225 retransmit_stats_ = retransmit_stats; |
1230 } | 1226 } |
1231 | 1227 |
1232 uint32_t num_calls_; | 1228 uint32_t num_calls_; |
1233 uint32_t ssrc_; | 1229 uint32_t ssrc_; |
1234 uint32_t total_bitrate_; | 1230 BitrateStatistics total_stats_; |
1235 uint32_t retransmit_bitrate_; | 1231 BitrateStatistics retransmit_stats_; |
1236 } callback; | 1232 } callback; |
1237 rtp_sender_.reset(new RTPSender(false, &fake_clock_, &transport_, nullptr, | 1233 rtp_sender_.reset(new RTPSender(false, &fake_clock_, &transport_, nullptr, |
1238 nullptr, nullptr, &callback, nullptr, nullptr, | 1234 nullptr, nullptr, &callback, nullptr, nullptr, |
1239 nullptr, nullptr, nullptr)); | 1235 nullptr, nullptr)); |
1240 | 1236 |
1241 // Simulate kNumPackets sent with kPacketInterval ms intervals, with the | 1237 // Simulate kNumPackets sent with kPacketInterval ms intervals. |
1242 // number of packets selected so that we fill (but don't overflow) the one | 1238 const uint32_t kNumPackets = 15; |
1243 // second averaging window. | |
1244 const uint32_t kWindowSizeMs = 1000; | |
1245 const uint32_t kPacketInterval = 20; | 1239 const uint32_t kPacketInterval = 20; |
1246 const uint32_t kNumPackets = | |
1247 (kWindowSizeMs - kPacketInterval) / kPacketInterval; | |
1248 // Overhead = 12 bytes RTP header + 1 byte generic header. | 1240 // Overhead = 12 bytes RTP header + 1 byte generic header. |
1249 const uint32_t kPacketOverhead = 13; | 1241 const uint32_t kPacketOverhead = 13; |
1250 | 1242 |
1251 char payload_name[RTP_PAYLOAD_NAME_SIZE] = "GENERIC"; | 1243 char payload_name[RTP_PAYLOAD_NAME_SIZE] = "GENERIC"; |
1252 const uint8_t payload_type = 127; | 1244 const uint8_t payload_type = 127; |
1253 ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 90000, | 1245 ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 90000, |
1254 0, 1500)); | 1246 0, 1500)); |
1255 uint8_t payload[] = {47, 11, 32, 93, 89}; | 1247 uint8_t payload[] = {47, 11, 32, 93, 89}; |
1256 rtp_sender_->SetStorePacketsStatus(true, 1); | 1248 rtp_sender_->SetStorePacketsStatus(true, 1); |
1257 uint32_t ssrc = rtp_sender_->SSRC(); | 1249 uint32_t ssrc = rtp_sender_->SSRC(); |
1258 | 1250 |
1259 // Initial process call so we get a new time window. | 1251 // Initial process call so we get a new time window. |
1260 rtp_sender_->ProcessBitrate(); | 1252 rtp_sender_->ProcessBitrate(); |
| 1253 uint64_t start_time = fake_clock_.CurrentNtpInMilliseconds(); |
1261 | 1254 |
1262 // Send a few frames. | 1255 // Send a few frames. |
1263 for (uint32_t i = 0; i < kNumPackets; ++i) { | 1256 for (uint32_t i = 0; i < kNumPackets; ++i) { |
1264 ASSERT_EQ(0, | 1257 ASSERT_EQ(0, |
1265 rtp_sender_->SendOutgoingData(kVideoFrameKey, payload_type, 1234, | 1258 rtp_sender_->SendOutgoingData(kVideoFrameKey, payload_type, 1234, |
1266 4321, payload, sizeof(payload), 0)); | 1259 4321, payload, sizeof(payload), 0)); |
1267 fake_clock_.AdvanceTimeMilliseconds(kPacketInterval); | 1260 fake_clock_.AdvanceTimeMilliseconds(kPacketInterval); |
1268 } | 1261 } |
1269 | 1262 |
1270 rtp_sender_->ProcessBitrate(); | 1263 rtp_sender_->ProcessBitrate(); |
1271 | 1264 |
| 1265 const uint32_t expected_packet_rate = 1000 / kPacketInterval; |
| 1266 |
1272 // We get one call for every stats updated, thus two calls since both the | 1267 // We get one call for every stats updated, thus two calls since both the |
1273 // stream stats and the retransmit stats are updated once. | 1268 // stream stats and the retransmit stats are updated once. |
1274 EXPECT_EQ(2u, callback.num_calls_); | 1269 EXPECT_EQ(2u, callback.num_calls_); |
1275 EXPECT_EQ(ssrc, callback.ssrc_); | 1270 EXPECT_EQ(ssrc, callback.ssrc_); |
1276 const uint32_t kTotalPacketSize = kPacketOverhead + sizeof(payload); | 1271 EXPECT_EQ(start_time + (kNumPackets * kPacketInterval), |
1277 // Bitrate measured over delta between last and first timestamp, plus one. | 1272 callback.total_stats_.timestamp_ms); |
1278 const uint32_t kExpectedWindowMs = kNumPackets * kPacketInterval + 1; | 1273 EXPECT_EQ(expected_packet_rate, callback.total_stats_.packet_rate); |
1279 const uint32_t kExpectedBitsAccumulated = kTotalPacketSize * kNumPackets * 8; | 1274 EXPECT_EQ((kPacketOverhead + sizeof(payload)) * 8 * expected_packet_rate, |
1280 const uint32_t kExpectedRateBps = | 1275 callback.total_stats_.bitrate_bps); |
1281 (kExpectedBitsAccumulated * 1000 + (kExpectedWindowMs / 2)) / | |
1282 kExpectedWindowMs; | |
1283 EXPECT_EQ(kExpectedRateBps, callback.total_bitrate_); | |
1284 | 1276 |
1285 rtp_sender_.reset(); | 1277 rtp_sender_.reset(); |
1286 } | 1278 } |
1287 | 1279 |
1288 class RtpSenderAudioTest : public RtpSenderTest { | 1280 class RtpSenderAudioTest : public RtpSenderTest { |
1289 protected: | 1281 protected: |
1290 RtpSenderAudioTest() {} | 1282 RtpSenderAudioTest() {} |
1291 | 1283 |
1292 void SetUp() override { | 1284 void SetUp() override { |
1293 payload_ = kAudioPayload; | 1285 payload_ = kAudioPayload; |
1294 rtp_sender_.reset(new RTPSender(true, &fake_clock_, &transport_, nullptr, | 1286 rtp_sender_.reset(new RTPSender(true, &fake_clock_, &transport_, nullptr, |
1295 nullptr, nullptr, nullptr, nullptr, nullptr, | 1287 nullptr, nullptr, nullptr, nullptr, nullptr, |
1296 nullptr, nullptr, nullptr)); | 1288 nullptr, nullptr)); |
1297 rtp_sender_->SetSequenceNumber(kSeqNum); | 1289 rtp_sender_->SetSequenceNumber(kSeqNum); |
1298 } | 1290 } |
1299 }; | 1291 }; |
1300 | 1292 |
1301 TEST_F(RtpSenderTestWithoutPacer, StreamDataCountersCallbacks) { | 1293 TEST_F(RtpSenderTestWithoutPacer, StreamDataCountersCallbacks) { |
1302 class TestCallback : public StreamDataCountersCallback { | 1294 class TestCallback : public StreamDataCountersCallback { |
1303 public: | 1295 public: |
1304 TestCallback() : StreamDataCountersCallback(), ssrc_(0), counters_() {} | 1296 TestCallback() : StreamDataCountersCallback(), ssrc_(0), counters_() {} |
1305 virtual ~TestCallback() {} | 1297 virtual ~TestCallback() {} |
1306 | 1298 |
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1554 | 1546 |
1555 EXPECT_EQ( | 1547 EXPECT_EQ( |
1556 transport_.total_bytes_sent_, | 1548 transport_.total_bytes_sent_, |
1557 rtp_stats.transmitted.TotalBytes() + rtx_stats.transmitted.TotalBytes()); | 1549 rtp_stats.transmitted.TotalBytes() + rtx_stats.transmitted.TotalBytes()); |
1558 } | 1550 } |
1559 | 1551 |
1560 TEST_F(RtpSenderTestWithoutPacer, RespectsNackBitrateLimit) { | 1552 TEST_F(RtpSenderTestWithoutPacer, RespectsNackBitrateLimit) { |
1561 const int32_t kPacketSize = 1400; | 1553 const int32_t kPacketSize = 1400; |
1562 const int32_t kNumPackets = 30; | 1554 const int32_t kNumPackets = 30; |
1563 | 1555 |
1564 retransmission_rate_limiter_.SetMaxRate(kPacketSize * kNumPackets * 8); | |
1565 | |
1566 rtp_sender_->SetStorePacketsStatus(true, kNumPackets); | 1556 rtp_sender_->SetStorePacketsStatus(true, kNumPackets); |
| 1557 // Set bitrate (in kbps) to fit kNumPackets รก kPacketSize bytes in one second. |
| 1558 rtp_sender_->SetTargetBitrate(kNumPackets * kPacketSize * 8); |
1567 const uint16_t kStartSequenceNumber = rtp_sender_->SequenceNumber(); | 1559 const uint16_t kStartSequenceNumber = rtp_sender_->SequenceNumber(); |
1568 std::list<uint16_t> sequence_numbers; | 1560 std::list<uint16_t> sequence_numbers; |
1569 for (int32_t i = 0; i < kNumPackets; ++i) { | 1561 for (int32_t i = 0; i < kNumPackets; ++i) { |
1570 sequence_numbers.push_back(kStartSequenceNumber + i); | 1562 sequence_numbers.push_back(kStartSequenceNumber + i); |
1571 fake_clock_.AdvanceTimeMilliseconds(1); | 1563 fake_clock_.AdvanceTimeMilliseconds(1); |
1572 SendPacket(fake_clock_.TimeInMilliseconds(), kPacketSize); | 1564 SendPacket(fake_clock_.TimeInMilliseconds(), kPacketSize); |
1573 } | 1565 } |
1574 EXPECT_EQ(kNumPackets, transport_.packets_sent_); | 1566 EXPECT_EQ(kNumPackets, transport_.packets_sent_); |
1575 | 1567 |
1576 fake_clock_.AdvanceTimeMilliseconds(1000 - kNumPackets); | 1568 fake_clock_.AdvanceTimeMilliseconds(1000 - kNumPackets); |
1577 | 1569 |
1578 // Resending should work - brings the bandwidth up to the limit. | 1570 // Resending should work - brings the bandwidth up to the limit. |
1579 // NACK bitrate is capped to the same bitrate as the encoder, since the max | 1571 // NACK bitrate is capped to the same bitrate as the encoder, since the max |
1580 // protection overhead is 50% (see MediaOptimization::SetTargetRates). | 1572 // protection overhead is 50% (see MediaOptimization::SetTargetRates). |
1581 rtp_sender_->OnReceivedNACK(sequence_numbers, 0); | 1573 rtp_sender_->OnReceivedNACK(sequence_numbers, 0); |
1582 EXPECT_EQ(kNumPackets * 2, transport_.packets_sent_); | 1574 EXPECT_EQ(kNumPackets * 2, transport_.packets_sent_); |
1583 | 1575 |
1584 // Must be at least 5ms in between retransmission attempts. | |
1585 fake_clock_.AdvanceTimeMilliseconds(5); | |
1586 | |
1587 // Resending should not work, bandwidth exceeded. | 1576 // Resending should not work, bandwidth exceeded. |
1588 rtp_sender_->OnReceivedNACK(sequence_numbers, 0); | 1577 rtp_sender_->OnReceivedNACK(sequence_numbers, 0); |
1589 EXPECT_EQ(kNumPackets * 2, transport_.packets_sent_); | 1578 EXPECT_EQ(kNumPackets * 2, transport_.packets_sent_); |
1590 } | 1579 } |
1591 | 1580 |
1592 // Verify that all packets of a frame have CVO byte set. | 1581 // Verify that all packets of a frame have CVO byte set. |
1593 TEST_F(RtpSenderVideoTest, SendVideoWithCVO) { | 1582 TEST_F(RtpSenderVideoTest, SendVideoWithCVO) { |
1594 RTPVideoHeader hdr = {0}; | 1583 RTPVideoHeader hdr = {0}; |
1595 hdr.rotation = kVideoRotation_90; | 1584 hdr.rotation = kVideoRotation_90; |
1596 | 1585 |
(...skipping 17 matching lines...) Expand all Loading... |
1614 reinterpret_cast<uint8_t*>(transport_.sent_packets_[0]->data()), | 1603 reinterpret_cast<uint8_t*>(transport_.sent_packets_[0]->data()), |
1615 transport_.sent_packets_[0]->size(), true, &map, kSeqNum, hdr.rotation); | 1604 transport_.sent_packets_[0]->size(), true, &map, kSeqNum, hdr.rotation); |
1616 | 1605 |
1617 // Verify that this packet does have CVO byte. | 1606 // Verify that this packet does have CVO byte. |
1618 VerifyCVOPacket( | 1607 VerifyCVOPacket( |
1619 reinterpret_cast<uint8_t*>(transport_.sent_packets_[1]->data()), | 1608 reinterpret_cast<uint8_t*>(transport_.sent_packets_[1]->data()), |
1620 transport_.sent_packets_[1]->size(), true, &map, kSeqNum + 1, | 1609 transport_.sent_packets_[1]->size(), true, &map, kSeqNum + 1, |
1621 hdr.rotation); | 1610 hdr.rotation); |
1622 } | 1611 } |
1623 } // namespace webrtc | 1612 } // namespace webrtc |
OLD | NEW |