OLD | NEW |
---|---|
1 /* | 1 /* |
danilchap
2016/06/28 14:26:18
May be add a test with non-null (Nack/Retransmissi
sprang_webrtc
2016/07/04 09:33:04
I fixed the nack rate test already here, so it act
| |
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> |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
138 transport_(), | 138 transport_(), |
139 kMarkerBit(true) { | 139 kMarkerBit(true) { |
140 } | 140 } |
141 | 141 |
142 void SetUp() override { SetUpRtpSender(true); } | 142 void SetUp() override { SetUpRtpSender(true); } |
143 | 143 |
144 void SetUpRtpSender(bool pacer) { | 144 void SetUpRtpSender(bool pacer) { |
145 rtp_sender_.reset(new RTPSender( | 145 rtp_sender_.reset(new RTPSender( |
146 false, &fake_clock_, &transport_, pacer ? &mock_paced_sender_ : nullptr, | 146 false, &fake_clock_, &transport_, pacer ? &mock_paced_sender_ : nullptr, |
147 &seq_num_allocator_, nullptr, nullptr, nullptr, nullptr, | 147 &seq_num_allocator_, nullptr, nullptr, nullptr, nullptr, |
148 &mock_rtc_event_log_, &send_packet_observer_)); | 148 &mock_rtc_event_log_, &send_packet_observer_, nullptr)); |
149 rtp_sender_->SetSequenceNumber(kSeqNum); | 149 rtp_sender_->SetSequenceNumber(kSeqNum); |
150 } | 150 } |
151 | 151 |
152 SimulatedClock fake_clock_; | 152 SimulatedClock fake_clock_; |
153 MockRtcEventLog mock_rtc_event_log_; | 153 MockRtcEventLog mock_rtc_event_log_; |
154 MockRtpPacketSender mock_paced_sender_; | 154 MockRtpPacketSender mock_paced_sender_; |
155 MockTransportSequenceNumberAllocator seq_num_allocator_; | 155 MockTransportSequenceNumberAllocator seq_num_allocator_; |
156 MockSendPacketObserver send_packet_observer_; | 156 MockSendPacketObserver send_packet_observer_; |
157 std::unique_ptr<RTPSender> rtp_sender_; | 157 std::unique_ptr<RTPSender> rtp_sender_; |
158 int payload_; | 158 int payload_; |
(...skipping 845 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_)); | 1014 nullptr, nullptr, &send_packet_observer_, nullptr)); |
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)); | 1032 nullptr, nullptr, nullptr, &mock_rtc_event_log_, nullptr, 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)); |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1169 frame_counts_ = frame_counts; | 1169 frame_counts_ = frame_counts; |
1170 } | 1170 } |
1171 | 1171 |
1172 uint32_t num_calls_; | 1172 uint32_t num_calls_; |
1173 uint32_t ssrc_; | 1173 uint32_t ssrc_; |
1174 FrameCounts frame_counts_; | 1174 FrameCounts frame_counts_; |
1175 } callback; | 1175 } callback; |
1176 | 1176 |
1177 rtp_sender_.reset(new RTPSender( | 1177 rtp_sender_.reset(new RTPSender( |
1178 false, &fake_clock_, &transport_, &mock_paced_sender_, nullptr, nullptr, | 1178 false, &fake_clock_, &transport_, &mock_paced_sender_, nullptr, nullptr, |
1179 nullptr, &callback, nullptr, nullptr, nullptr)); | 1179 nullptr, &callback, nullptr, nullptr, nullptr, nullptr)); |
1180 | 1180 |
1181 char payload_name[RTP_PAYLOAD_NAME_SIZE] = "GENERIC"; | 1181 char payload_name[RTP_PAYLOAD_NAME_SIZE] = "GENERIC"; |
1182 const uint8_t payload_type = 127; | 1182 const uint8_t payload_type = 127; |
1183 ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 90000, | 1183 ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 90000, |
1184 0, 1500)); | 1184 0, 1500)); |
1185 uint8_t payload[] = {47, 11, 32, 93, 89}; | 1185 uint8_t payload[] = {47, 11, 32, 93, 89}; |
1186 rtp_sender_->SetStorePacketsStatus(true, 1); | 1186 rtp_sender_->SetStorePacketsStatus(true, 1); |
1187 uint32_t ssrc = rtp_sender_->SSRC(); | 1187 uint32_t ssrc = rtp_sender_->SSRC(); |
1188 | 1188 |
1189 EXPECT_CALL(mock_paced_sender_, InsertPacket(_, _, _, _, _, _)) | 1189 EXPECT_CALL(mock_paced_sender_, InsertPacket(_, _, _, _, _, _)) |
(...skipping 16 matching lines...) Expand all Loading... | |
1206 EXPECT_EQ(ssrc, callback.ssrc_); | 1206 EXPECT_EQ(ssrc, callback.ssrc_); |
1207 EXPECT_EQ(1, callback.frame_counts_.key_frames); | 1207 EXPECT_EQ(1, callback.frame_counts_.key_frames); |
1208 EXPECT_EQ(1, callback.frame_counts_.delta_frames); | 1208 EXPECT_EQ(1, callback.frame_counts_.delta_frames); |
1209 | 1209 |
1210 rtp_sender_.reset(); | 1210 rtp_sender_.reset(); |
1211 } | 1211 } |
1212 | 1212 |
1213 TEST_F(RtpSenderTest, BitrateCallbacks) { | 1213 TEST_F(RtpSenderTest, BitrateCallbacks) { |
1214 class TestCallback : public BitrateStatisticsObserver { | 1214 class TestCallback : public BitrateStatisticsObserver { |
1215 public: | 1215 public: |
1216 TestCallback() : BitrateStatisticsObserver(), num_calls_(0), ssrc_(0) {} | 1216 TestCallback() |
1217 : BitrateStatisticsObserver(), | |
1218 num_calls_(0), | |
1219 ssrc_(0), | |
1220 total_bitrate_(0), | |
1221 retransmit_bitrate_(0) {} | |
1217 virtual ~TestCallback() {} | 1222 virtual ~TestCallback() {} |
1218 | 1223 |
1219 void Notify(const BitrateStatistics& total_stats, | 1224 void Notify(uint32_t total_bitrate, |
1220 const BitrateStatistics& retransmit_stats, | 1225 uint32_t retransmit_bitrate, |
1221 uint32_t ssrc) override { | 1226 uint32_t ssrc) override { |
1222 ++num_calls_; | 1227 ++num_calls_; |
1223 ssrc_ = ssrc; | 1228 ssrc_ = ssrc; |
1224 total_stats_ = total_stats; | 1229 total_bitrate_ = total_bitrate; |
1225 retransmit_stats_ = retransmit_stats; | 1230 retransmit_bitrate_ = retransmit_bitrate; |
1226 } | 1231 } |
1227 | 1232 |
1228 uint32_t num_calls_; | 1233 uint32_t num_calls_; |
1229 uint32_t ssrc_; | 1234 uint32_t ssrc_; |
1230 BitrateStatistics total_stats_; | 1235 uint32_t total_bitrate_; |
1231 BitrateStatistics retransmit_stats_; | 1236 uint32_t retransmit_bitrate_; |
1232 } callback; | 1237 } callback; |
1233 rtp_sender_.reset(new RTPSender(false, &fake_clock_, &transport_, nullptr, | 1238 rtp_sender_.reset(new RTPSender(false, &fake_clock_, &transport_, nullptr, |
1234 nullptr, nullptr, &callback, nullptr, nullptr, | 1239 nullptr, nullptr, &callback, nullptr, nullptr, |
1235 nullptr, nullptr)); | 1240 nullptr, nullptr, nullptr)); |
1236 | 1241 |
1237 // Simulate kNumPackets sent with kPacketInterval ms intervals. | 1242 // Simulate kNumPackets sent with kPacketInterval ms intervals, with the |
1238 const uint32_t kNumPackets = 15; | 1243 // number of packets selected so that we fill (but don't overflow) the one |
1244 // second averaging window. | |
1245 const uint32_t kWindowSizeMs = 1000; | |
1239 const uint32_t kPacketInterval = 20; | 1246 const uint32_t kPacketInterval = 20; |
1247 const uint32_t kNumPackets = | |
1248 (kWindowSizeMs - kPacketInterval) / kPacketInterval; | |
1240 // Overhead = 12 bytes RTP header + 1 byte generic header. | 1249 // Overhead = 12 bytes RTP header + 1 byte generic header. |
1241 const uint32_t kPacketOverhead = 13; | 1250 const uint32_t kPacketOverhead = 13; |
1242 | 1251 |
1243 char payload_name[RTP_PAYLOAD_NAME_SIZE] = "GENERIC"; | 1252 char payload_name[RTP_PAYLOAD_NAME_SIZE] = "GENERIC"; |
1244 const uint8_t payload_type = 127; | 1253 const uint8_t payload_type = 127; |
1245 ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 90000, | 1254 ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 90000, |
1246 0, 1500)); | 1255 0, 1500)); |
1247 uint8_t payload[] = {47, 11, 32, 93, 89}; | 1256 uint8_t payload[] = {47, 11, 32, 93, 89}; |
1248 rtp_sender_->SetStorePacketsStatus(true, 1); | 1257 rtp_sender_->SetStorePacketsStatus(true, 1); |
1249 uint32_t ssrc = rtp_sender_->SSRC(); | 1258 uint32_t ssrc = rtp_sender_->SSRC(); |
1250 | 1259 |
1251 // Initial process call so we get a new time window. | 1260 // Initial process call so we get a new time window. |
1252 rtp_sender_->ProcessBitrate(); | 1261 rtp_sender_->ProcessBitrate(); |
1253 uint64_t start_time = fake_clock_.CurrentNtpInMilliseconds(); | |
1254 | 1262 |
1255 // Send a few frames. | 1263 // Send a few frames. |
1256 for (uint32_t i = 0; i < kNumPackets; ++i) { | 1264 for (uint32_t i = 0; i < kNumPackets; ++i) { |
1257 ASSERT_EQ(0, | 1265 ASSERT_EQ(0, |
1258 rtp_sender_->SendOutgoingData(kVideoFrameKey, payload_type, 1234, | 1266 rtp_sender_->SendOutgoingData(kVideoFrameKey, payload_type, 1234, |
1259 4321, payload, sizeof(payload), 0)); | 1267 4321, payload, sizeof(payload), 0)); |
1260 fake_clock_.AdvanceTimeMilliseconds(kPacketInterval); | 1268 fake_clock_.AdvanceTimeMilliseconds(kPacketInterval); |
1261 } | 1269 } |
1262 | 1270 |
1263 rtp_sender_->ProcessBitrate(); | 1271 rtp_sender_->ProcessBitrate(); |
1264 | 1272 |
1265 const uint32_t expected_packet_rate = 1000 / kPacketInterval; | |
1266 | |
1267 // We get one call for every stats updated, thus two calls since both the | 1273 // We get one call for every stats updated, thus two calls since both the |
1268 // stream stats and the retransmit stats are updated once. | 1274 // stream stats and the retransmit stats are updated once. |
1269 EXPECT_EQ(2u, callback.num_calls_); | 1275 EXPECT_EQ(2u, callback.num_calls_); |
1270 EXPECT_EQ(ssrc, callback.ssrc_); | 1276 EXPECT_EQ(ssrc, callback.ssrc_); |
1271 EXPECT_EQ(start_time + (kNumPackets * kPacketInterval), | 1277 const uint32_t kTotalPacketSize = kPacketOverhead + sizeof(payload); |
1272 callback.total_stats_.timestamp_ms); | 1278 // Bitrate measured over delta between last and first timestamp, plus one. |
1273 EXPECT_EQ(expected_packet_rate, callback.total_stats_.packet_rate); | 1279 const uint32_t kExpectedWindowMs = kNumPackets * kPacketInterval + 1; |
1274 EXPECT_EQ((kPacketOverhead + sizeof(payload)) * 8 * expected_packet_rate, | 1280 const uint32_t kExpectedBitsAccumulated = kTotalPacketSize * kNumPackets * 8; |
1275 callback.total_stats_.bitrate_bps); | 1281 const uint32_t KexpectedRateBps = |
1282 (kExpectedBitsAccumulated * 1000 + (kExpectedWindowMs / 2)) / | |
1283 kExpectedWindowMs; | |
1284 EXPECT_EQ(KexpectedRateBps, callback.total_bitrate_); | |
1276 | 1285 |
1277 rtp_sender_.reset(); | 1286 rtp_sender_.reset(); |
1278 } | 1287 } |
1279 | 1288 |
1280 class RtpSenderAudioTest : public RtpSenderTest { | 1289 class RtpSenderAudioTest : public RtpSenderTest { |
1281 protected: | 1290 protected: |
1282 RtpSenderAudioTest() {} | 1291 RtpSenderAudioTest() {} |
1283 | 1292 |
1284 void SetUp() override { | 1293 void SetUp() override { |
1285 payload_ = kAudioPayload; | 1294 payload_ = kAudioPayload; |
1286 rtp_sender_.reset(new RTPSender(true, &fake_clock_, &transport_, nullptr, | 1295 rtp_sender_.reset(new RTPSender(true, &fake_clock_, &transport_, nullptr, |
1287 nullptr, nullptr, nullptr, nullptr, nullptr, | 1296 nullptr, nullptr, nullptr, nullptr, nullptr, |
1288 nullptr, nullptr)); | 1297 nullptr, nullptr, nullptr)); |
1289 rtp_sender_->SetSequenceNumber(kSeqNum); | 1298 rtp_sender_->SetSequenceNumber(kSeqNum); |
1290 } | 1299 } |
1291 }; | 1300 }; |
1292 | 1301 |
1293 TEST_F(RtpSenderTestWithoutPacer, StreamDataCountersCallbacks) { | 1302 TEST_F(RtpSenderTestWithoutPacer, StreamDataCountersCallbacks) { |
1294 class TestCallback : public StreamDataCountersCallback { | 1303 class TestCallback : public StreamDataCountersCallback { |
1295 public: | 1304 public: |
1296 TestCallback() : StreamDataCountersCallback(), ssrc_(0), counters_() {} | 1305 TestCallback() : StreamDataCountersCallback(), ssrc_(0), counters_() {} |
1297 virtual ~TestCallback() {} | 1306 virtual ~TestCallback() {} |
1298 | 1307 |
(...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1603 reinterpret_cast<uint8_t*>(transport_.sent_packets_[0]->data()), | 1612 reinterpret_cast<uint8_t*>(transport_.sent_packets_[0]->data()), |
1604 transport_.sent_packets_[0]->size(), true, &map, kSeqNum, hdr.rotation); | 1613 transport_.sent_packets_[0]->size(), true, &map, kSeqNum, hdr.rotation); |
1605 | 1614 |
1606 // Verify that this packet does have CVO byte. | 1615 // Verify that this packet does have CVO byte. |
1607 VerifyCVOPacket( | 1616 VerifyCVOPacket( |
1608 reinterpret_cast<uint8_t*>(transport_.sent_packets_[1]->data()), | 1617 reinterpret_cast<uint8_t*>(transport_.sent_packets_[1]->data()), |
1609 transport_.sent_packets_[1]->size(), true, &map, kSeqNum + 1, | 1618 transport_.sent_packets_[1]->size(), true, &map, kSeqNum + 1, |
1610 hdr.rotation); | 1619 hdr.rotation); |
1611 } | 1620 } |
1612 } // namespace webrtc | 1621 } // namespace webrtc |
OLD | NEW |