Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(21)

Side by Side Diff: webrtc/modules/rtp_rtcp/source/rtp_sender_unittest.cc

Issue 2061423003: Refactor NACK bitrate allocation (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Moved rate limiter and addressed comments Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698