1 /*
2 * Copyright (c) 2019 The WebRTC project authors. All Rights Reserved.
3 *
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
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11 #include "modules/pacing/pacing_controller.h"
12
13 #include <algorithm>
14 #include <list>
15 #include <memory>
16 #include <string>
17 #include <utility>
18 #include <vector>
19
20 #include "api/transport/network_types.h"
21 #include "api/units/data_rate.h"
22 #include "api/units/time_delta.h"
23 #include "modules/pacing/packet_router.h"
24 #include "system_wrappers/include/clock.h"
25 #include "test/explicit_key_value_config.h"
26 #include "test/gmock.h"
27 #include "test/gtest.h"
28
29 using ::testing::_;
30 using ::testing::AnyNumber;
31 using ::testing::Field;
32 using ::testing::Pointee;
33 using ::testing::Property;
34 using ::testing::Return;
35 using ::testing::WithoutArgs;
36
37 using ::webrtc::test::ExplicitKeyValueConfig;
38
39 namespace webrtc {
40 namespace {
41 constexpr DataRate kFirstClusterRate = DataRate::KilobitsPerSec(900);
42 constexpr DataRate kSecondClusterRate = DataRate::KilobitsPerSec(1800);
43
44 // The error stems from truncating the time interval of probe packets to integer
45 // values. This results in probing slightly higher than the target bitrate.
46 // For 1.8 Mbps, this comes to be about 120 kbps with 1200 probe packets.
47 constexpr DataRate kProbingErrorMargin = DataRate::KilobitsPerSec(150);
48
49 const float kPaceMultiplier = 2.5f;
50
51 constexpr uint32_t kAudioSsrc = 12345;
52 constexpr uint32_t kVideoSsrc = 234565;
53
54 constexpr DataRate kTargetRate = DataRate::KilobitsPerSec(800);
55
BuildPacket(RtpPacketMediaType type,uint32_t ssrc,uint16_t sequence_number,int64_t capture_time_ms,size_t size)56 std::unique_ptr<RtpPacketToSend> BuildPacket(RtpPacketMediaType type,
57 uint32_t ssrc,
58 uint16_t sequence_number,
59 int64_t capture_time_ms,
60 size_t size) {
61 auto packet = std::make_unique<RtpPacketToSend>(nullptr);
62 packet->set_packet_type(type);
63 packet->SetSsrc(ssrc);
64 packet->SetSequenceNumber(sequence_number);
65 packet->set_capture_time(Timestamp::Millis(capture_time_ms));
66 packet->SetPayloadSize(size);
67 return packet;
68 }
69
70 class MediaStream {
71 public:
MediaStream(SimulatedClock & clock,RtpPacketMediaType type,uint32_t ssrc,size_t packet_size)72 MediaStream(SimulatedClock& clock,
73 RtpPacketMediaType type,
74 uint32_t ssrc,
75 size_t packet_size)
76 : clock_(clock), type_(type), ssrc_(ssrc), packet_size_(packet_size) {}
77
BuildNextPacket()78 std::unique_ptr<RtpPacketToSend> BuildNextPacket() {
79 return BuildPacket(type_, ssrc_, seq_num_++, clock_.TimeInMilliseconds(),
80 packet_size_);
81 }
BuildNextPacket(size_t size)82 std::unique_ptr<RtpPacketToSend> BuildNextPacket(size_t size) {
83 return BuildPacket(type_, ssrc_, seq_num_++, clock_.TimeInMilliseconds(),
84 size);
85 }
86
87 private:
88 SimulatedClock& clock_;
89 const RtpPacketMediaType type_;
90 const uint32_t ssrc_;
91 const size_t packet_size_;
92 uint16_t seq_num_ = 1000;
93 };
94
95 // Mock callback proxy, where both new and old api redirects to common mock
96 // methods that focus on core aspects.
97 class MockPacingControllerCallback : public PacingController::PacketSender {
98 public:
SendPacket(std::unique_ptr<RtpPacketToSend> packet,const PacedPacketInfo & cluster_info)99 void SendPacket(std::unique_ptr<RtpPacketToSend> packet,
100 const PacedPacketInfo& cluster_info) override {
101 SendPacket(packet->Ssrc(), packet->SequenceNumber(),
102 packet->capture_time().ms(),
103 packet->packet_type() == RtpPacketMediaType::kRetransmission,
104 packet->packet_type() == RtpPacketMediaType::kPadding);
105 }
106
GeneratePadding(DataSize target_size)107 std::vector<std::unique_ptr<RtpPacketToSend>> GeneratePadding(
108 DataSize target_size) override {
109 std::vector<std::unique_ptr<RtpPacketToSend>> ret;
110 size_t padding_size = SendPadding(target_size.bytes());
111 if (padding_size > 0) {
112 auto packet = std::make_unique<RtpPacketToSend>(nullptr);
113 packet->SetPayloadSize(padding_size);
114 packet->set_packet_type(RtpPacketMediaType::kPadding);
115 ret.emplace_back(std::move(packet));
116 }
117 return ret;
118 }
119
120 MOCK_METHOD(void,
121 SendPacket,
122 (uint32_t ssrc,
123 uint16_t sequence_number,
124 int64_t capture_timestamp,
125 bool retransmission,
126 bool padding));
127 MOCK_METHOD(std::vector<std::unique_ptr<RtpPacketToSend>>,
128 FetchFec,
129 (),
130 (override));
131 MOCK_METHOD(size_t, SendPadding, (size_t target_size));
132 MOCK_METHOD(void,
133 OnAbortedRetransmissions,
134 (uint32_t, rtc::ArrayView<const uint16_t>),
135 (override));
136 MOCK_METHOD(absl::optional<uint32_t>,
137 GetRtxSsrcForMedia,
138 (uint32_t),
139 (const, override));
140 };
141
142 // Mock callback implementing the raw api.
143 class MockPacketSender : public PacingController::PacketSender {
144 public:
145 MOCK_METHOD(void,
146 SendPacket,
147 (std::unique_ptr<RtpPacketToSend> packet,
148 const PacedPacketInfo& cluster_info),
149 (override));
150 MOCK_METHOD(std::vector<std::unique_ptr<RtpPacketToSend>>,
151 FetchFec,
152 (),
153 (override));
154
155 MOCK_METHOD(std::vector<std::unique_ptr<RtpPacketToSend>>,
156 GeneratePadding,
157 (DataSize target_size),
158 (override));
159 MOCK_METHOD(void,
160 OnAbortedRetransmissions,
161 (uint32_t, rtc::ArrayView<const uint16_t>),
162 (override));
163 MOCK_METHOD(absl::optional<uint32_t>,
164 GetRtxSsrcForMedia,
165 (uint32_t),
166 (const, override));
167 };
168
169 class PacingControllerPadding : public PacingController::PacketSender {
170 public:
171 static const size_t kPaddingPacketSize = 224;
172
PacingControllerPadding()173 PacingControllerPadding() : padding_sent_(0), total_bytes_sent_(0) {}
174
SendPacket(std::unique_ptr<RtpPacketToSend> packet,const PacedPacketInfo & pacing_info)175 void SendPacket(std::unique_ptr<RtpPacketToSend> packet,
176 const PacedPacketInfo& pacing_info) override {
177 total_bytes_sent_ += packet->payload_size();
178 }
179
FetchFec()180 std::vector<std::unique_ptr<RtpPacketToSend>> FetchFec() override {
181 return {};
182 }
183
GeneratePadding(DataSize target_size)184 std::vector<std::unique_ptr<RtpPacketToSend>> GeneratePadding(
185 DataSize target_size) override {
186 size_t num_packets =
187 (target_size.bytes() + kPaddingPacketSize - 1) / kPaddingPacketSize;
188 std::vector<std::unique_ptr<RtpPacketToSend>> packets;
189 for (size_t i = 0; i < num_packets; ++i) {
190 packets.emplace_back(std::make_unique<RtpPacketToSend>(nullptr));
191 packets.back()->SetPadding(kPaddingPacketSize);
192 packets.back()->set_packet_type(RtpPacketMediaType::kPadding);
193 padding_sent_ += kPaddingPacketSize;
194 }
195 return packets;
196 }
197
OnAbortedRetransmissions(uint32_t,rtc::ArrayView<const uint16_t>)198 void OnAbortedRetransmissions(uint32_t,
199 rtc::ArrayView<const uint16_t>) override {}
GetRtxSsrcForMedia(uint32_t) const200 absl::optional<uint32_t> GetRtxSsrcForMedia(uint32_t) const override {
201 return absl::nullopt;
202 }
203
padding_sent()204 size_t padding_sent() { return padding_sent_; }
total_bytes_sent()205 size_t total_bytes_sent() { return total_bytes_sent_; }
206
207 private:
208 size_t padding_sent_;
209 size_t total_bytes_sent_;
210 };
211
212 class PacingControllerProbing : public PacingController::PacketSender {
213 public:
PacingControllerProbing()214 PacingControllerProbing() : packets_sent_(0), padding_sent_(0) {}
215
SendPacket(std::unique_ptr<RtpPacketToSend> packet,const PacedPacketInfo & pacing_info)216 void SendPacket(std::unique_ptr<RtpPacketToSend> packet,
217 const PacedPacketInfo& pacing_info) override {
218 if (packet->packet_type() != RtpPacketMediaType::kPadding) {
219 ++packets_sent_;
220 }
221 last_pacing_info_ = pacing_info;
222 }
223
FetchFec()224 std::vector<std::unique_ptr<RtpPacketToSend>> FetchFec() override {
225 return {};
226 }
227
GeneratePadding(DataSize target_size)228 std::vector<std::unique_ptr<RtpPacketToSend>> GeneratePadding(
229 DataSize target_size) override {
230 // From RTPSender:
231 // Max in the RFC 3550 is 255 bytes, we limit it to be modulus 32 for SRTP.
232 const DataSize kMaxPadding = DataSize::Bytes(224);
233
234 std::vector<std::unique_ptr<RtpPacketToSend>> packets;
235 while (target_size > DataSize::Zero()) {
236 DataSize padding_size = std::min(kMaxPadding, target_size);
237 packets.emplace_back(std::make_unique<RtpPacketToSend>(nullptr));
238 packets.back()->SetPadding(padding_size.bytes());
239 packets.back()->set_packet_type(RtpPacketMediaType::kPadding);
240 padding_sent_ += padding_size.bytes();
241 target_size -= padding_size;
242 }
243 return packets;
244 }
245
OnAbortedRetransmissions(uint32_t,rtc::ArrayView<const uint16_t>)246 void OnAbortedRetransmissions(uint32_t,
247 rtc::ArrayView<const uint16_t>) override {}
GetRtxSsrcForMedia(uint32_t) const248 absl::optional<uint32_t> GetRtxSsrcForMedia(uint32_t) const override {
249 return absl::nullopt;
250 }
251
packets_sent() const252 int packets_sent() const { return packets_sent_; }
padding_sent() const253 int padding_sent() const { return padding_sent_; }
total_packets_sent() const254 int total_packets_sent() const { return packets_sent_ + padding_sent_; }
last_pacing_info() const255 PacedPacketInfo last_pacing_info() const { return last_pacing_info_; }
256
257 private:
258 int packets_sent_;
259 int padding_sent_;
260 PacedPacketInfo last_pacing_info_;
261 };
262
263 class PacingControllerTest : public ::testing::Test {
264 protected:
PacingControllerTest()265 PacingControllerTest() : clock_(123456), trials_("") {}
266
SendAndExpectPacket(PacingController * pacer,RtpPacketMediaType type,uint32_t ssrc,uint16_t sequence_number,int64_t capture_time_ms,size_t size)267 void SendAndExpectPacket(PacingController* pacer,
268 RtpPacketMediaType type,
269 uint32_t ssrc,
270 uint16_t sequence_number,
271 int64_t capture_time_ms,
272 size_t size) {
273 pacer->EnqueuePacket(
274 BuildPacket(type, ssrc, sequence_number, capture_time_ms, size));
275
276 EXPECT_CALL(callback_,
277 SendPacket(ssrc, sequence_number, capture_time_ms,
278 type == RtpPacketMediaType::kRetransmission, false));
279 }
280
AdvanceTimeUntil(webrtc::Timestamp time)281 void AdvanceTimeUntil(webrtc::Timestamp time) {
282 Timestamp now = clock_.CurrentTime();
283 clock_.AdvanceTime(std::max(TimeDelta::Zero(), time - now));
284 }
285
ConsumeInitialBudget(PacingController * pacer)286 void ConsumeInitialBudget(PacingController* pacer) {
287 const uint32_t kSsrc = 54321;
288 uint16_t sequence_number = 1234;
289 int64_t capture_time_ms = clock_.TimeInMilliseconds();
290 const size_t kPacketSize = 250;
291
292 EXPECT_TRUE(pacer->OldestPacketEnqueueTime().IsInfinite());
293
294 // Due to the multiplicative factor we can send 5 packets during a send
295 // interval. (network capacity * multiplier / (8 bits per byte *
296 // (packet size * #send intervals per second)
297 const size_t packets_to_send_per_interval =
298 kTargetRate.bps() * kPaceMultiplier / (8 * kPacketSize * 200);
299 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
300 SendAndExpectPacket(pacer, RtpPacketMediaType::kVideo, kSsrc,
301 sequence_number++, capture_time_ms, kPacketSize);
302 }
303
304 while (pacer->QueueSizePackets() > 0) {
305 AdvanceTimeUntil(pacer->NextSendTime());
306 pacer->ProcessPackets();
307 }
308 }
309
310 SimulatedClock clock_;
311
312 MediaStream audio_ = MediaStream(clock_,
313 /*type*/ RtpPacketMediaType::kAudio,
314 /*ssrc*/ kAudioSsrc,
315 /*packet_size*/ 100);
316 MediaStream video_ = MediaStream(clock_,
317 /*type*/ RtpPacketMediaType::kVideo,
318 /*ssrc*/ kVideoSsrc,
319 /*packet_size*/ 1000);
320
321 ::testing::NiceMock<MockPacingControllerCallback> callback_;
322 ExplicitKeyValueConfig trials_;
323 };
324
TEST_F(PacingControllerTest,DefaultNoPaddingInSilence)325 TEST_F(PacingControllerTest, DefaultNoPaddingInSilence) {
326 const test::ExplicitKeyValueConfig trials("");
327 PacingController pacer(&clock_, &callback_, trials);
328 pacer.SetPacingRates(kTargetRate, DataRate::Zero());
329 // Video packet to reset last send time and provide padding data.
330 pacer.EnqueuePacket(video_.BuildNextPacket());
331 EXPECT_CALL(callback_, SendPacket).Times(1);
332 clock_.AdvanceTimeMilliseconds(5);
333 pacer.ProcessPackets();
334 EXPECT_CALL(callback_, SendPadding).Times(0);
335 // Waiting 500 ms should not trigger sending of padding.
336 clock_.AdvanceTimeMilliseconds(500);
337 pacer.ProcessPackets();
338 }
339
TEST_F(PacingControllerTest,PaddingInSilenceWithTrial)340 TEST_F(PacingControllerTest, PaddingInSilenceWithTrial) {
341 const test::ExplicitKeyValueConfig trials(
342 "WebRTC-Pacer-PadInSilence/Enabled/");
343 PacingController pacer(&clock_, &callback_, trials);
344 pacer.SetPacingRates(kTargetRate, DataRate::Zero());
345 // Video packet to reset last send time and provide padding data.
346 pacer.EnqueuePacket(video_.BuildNextPacket());
347 EXPECT_CALL(callback_, SendPacket).Times(2);
348 clock_.AdvanceTimeMilliseconds(5);
349 pacer.ProcessPackets();
350 EXPECT_CALL(callback_, SendPadding).WillOnce(Return(1000));
351 // Waiting 500 ms should trigger sending of padding.
352 clock_.AdvanceTimeMilliseconds(500);
353 pacer.ProcessPackets();
354 }
355
TEST_F(PacingControllerTest,CongestionWindowAffectsAudioInTrial)356 TEST_F(PacingControllerTest, CongestionWindowAffectsAudioInTrial) {
357 const test::ExplicitKeyValueConfig trials("WebRTC-Pacer-BlockAudio/Enabled/");
358 EXPECT_CALL(callback_, SendPadding).Times(0);
359 PacingController pacer(&clock_, &callback_, trials);
360 pacer.SetPacingRates(DataRate::KilobitsPerSec(10000), DataRate::Zero());
361 // Video packet fills congestion window.
362 pacer.EnqueuePacket(video_.BuildNextPacket());
363 EXPECT_CALL(callback_, SendPacket).Times(1);
364 AdvanceTimeUntil(pacer.NextSendTime());
365 pacer.ProcessPackets();
366 pacer.SetCongested(true);
367 // Audio packet blocked due to congestion.
368 pacer.EnqueuePacket(audio_.BuildNextPacket());
369 EXPECT_CALL(callback_, SendPacket).Times(0);
370 // Forward time to where we send keep-alive.
371 EXPECT_CALL(callback_, SendPadding(1)).Times(2);
372 AdvanceTimeUntil(pacer.NextSendTime());
373 pacer.ProcessPackets();
374 AdvanceTimeUntil(pacer.NextSendTime());
375 pacer.ProcessPackets();
376 // Audio packet unblocked when congestion window clear.
377 ::testing::Mock::VerifyAndClearExpectations(&callback_);
378 pacer.SetCongested(false);
379 EXPECT_CALL(callback_, SendPacket).Times(1);
380 AdvanceTimeUntil(pacer.NextSendTime());
381 pacer.ProcessPackets();
382 }
383
TEST_F(PacingControllerTest,DefaultCongestionWindowDoesNotAffectAudio)384 TEST_F(PacingControllerTest, DefaultCongestionWindowDoesNotAffectAudio) {
385 EXPECT_CALL(callback_, SendPadding).Times(0);
386 const test::ExplicitKeyValueConfig trials("");
387 PacingController pacer(&clock_, &callback_, trials);
388 pacer.SetPacingRates(DataRate::BitsPerSec(10000000), DataRate::Zero());
389 // Video packet fills congestion window.
390 pacer.EnqueuePacket(video_.BuildNextPacket());
391 EXPECT_CALL(callback_, SendPacket).Times(1);
392 AdvanceTimeUntil(pacer.NextSendTime());
393 pacer.ProcessPackets();
394 pacer.SetCongested(true);
395 // Audio not blocked due to congestion.
396 pacer.EnqueuePacket(audio_.BuildNextPacket());
397 EXPECT_CALL(callback_, SendPacket).Times(1);
398 AdvanceTimeUntil(pacer.NextSendTime());
399 pacer.ProcessPackets();
400 }
401
TEST_F(PacingControllerTest,BudgetAffectsAudioInTrial)402 TEST_F(PacingControllerTest, BudgetAffectsAudioInTrial) {
403 ExplicitKeyValueConfig trials("WebRTC-Pacer-BlockAudio/Enabled/");
404 PacingController pacer(&clock_, &callback_, trials);
405 const size_t kPacketSize = 1000;
406 const int kProcessIntervalsPerSecond = 1000 / 5;
407 DataRate pacing_rate =
408 DataRate::BitsPerSec(kPacketSize / 3 * 8 * kProcessIntervalsPerSecond);
409 pacer.SetPacingRates(pacing_rate, DataRate::Zero());
410 // Video fills budget for following process periods.
411 pacer.EnqueuePacket(video_.BuildNextPacket(kPacketSize));
412 EXPECT_CALL(callback_, SendPacket).Times(1);
413 AdvanceTimeUntil(pacer.NextSendTime());
414 pacer.ProcessPackets();
415 // Audio packet blocked due to budget limit.
416 pacer.EnqueuePacket(audio_.BuildNextPacket());
417 Timestamp wait_start_time = clock_.CurrentTime();
418 Timestamp wait_end_time = Timestamp::MinusInfinity();
419 EXPECT_CALL(callback_, SendPacket).WillOnce(WithoutArgs([&]() {
420 wait_end_time = clock_.CurrentTime();
421 }));
422 while (!wait_end_time.IsFinite()) {
423 AdvanceTimeUntil(pacer.NextSendTime());
424 pacer.ProcessPackets();
425 }
426 const TimeDelta expected_wait_time =
427 DataSize::Bytes(kPacketSize) / pacing_rate;
428 // Verify delay is near expectation, within timing margin.
429 EXPECT_LT(((wait_end_time - wait_start_time) - expected_wait_time).Abs(),
430 PacingController::kMinSleepTime);
431 }
432
TEST_F(PacingControllerTest,DefaultBudgetDoesNotAffectAudio)433 TEST_F(PacingControllerTest, DefaultBudgetDoesNotAffectAudio) {
434 const size_t kPacketSize = 1000;
435 EXPECT_CALL(callback_, SendPadding).Times(0);
436 const test::ExplicitKeyValueConfig trials("");
437 PacingController pacer(&clock_, &callback_, trials);
438 const int kProcessIntervalsPerSecond = 1000 / 5;
439 pacer.SetPacingRates(
440 DataRate::BitsPerSec(kPacketSize / 3 * 8 * kProcessIntervalsPerSecond),
441 DataRate::Zero());
442 // Video fills budget for following process periods.
443 pacer.EnqueuePacket(video_.BuildNextPacket(kPacketSize));
444 EXPECT_CALL(callback_, SendPacket).Times(1);
445 AdvanceTimeUntil(pacer.NextSendTime());
446 pacer.ProcessPackets();
447 // Audio packet not blocked due to budget limit.
448 EXPECT_CALL(callback_, SendPacket).Times(1);
449 pacer.EnqueuePacket(audio_.BuildNextPacket());
450 AdvanceTimeUntil(pacer.NextSendTime());
451 pacer.ProcessPackets();
452 }
453
TEST_F(PacingControllerTest,FirstSentPacketTimeIsSet)454 TEST_F(PacingControllerTest, FirstSentPacketTimeIsSet) {
455 const Timestamp kStartTime = clock_.CurrentTime();
456 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
457 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
458
459 // No packet sent.
460 EXPECT_FALSE(pacer->FirstSentPacketTime().has_value());
461 pacer->EnqueuePacket(video_.BuildNextPacket());
462 AdvanceTimeUntil(pacer->NextSendTime());
463 pacer->ProcessPackets();
464 EXPECT_EQ(kStartTime, pacer->FirstSentPacketTime());
465 }
466
TEST_F(PacingControllerTest,QueueAndPacePackets)467 TEST_F(PacingControllerTest, QueueAndPacePackets) {
468 const uint32_t kSsrc = 12345;
469 uint16_t sequence_number = 1234;
470 const DataSize kPackeSize = DataSize::Bytes(250);
471 const TimeDelta kSendInterval = TimeDelta::Millis(5);
472
473 // Due to the multiplicative factor we can send 5 packets during a 5ms send
474 // interval. (send interval * network capacity * multiplier / packet size)
475 const size_t kPacketsToSend = (kSendInterval * kTargetRate).bytes() *
476 kPaceMultiplier / kPackeSize.bytes();
477 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
478 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
479
480 for (size_t i = 0; i < kPacketsToSend; ++i) {
481 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, kSsrc,
482 sequence_number++, clock_.TimeInMilliseconds(),
483 kPackeSize.bytes());
484 }
485 EXPECT_CALL(callback_, SendPadding).Times(0);
486
487 // Enqueue one extra packet.
488 int64_t queued_packet_timestamp = clock_.TimeInMilliseconds();
489 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, kSsrc,
490 sequence_number, queued_packet_timestamp,
491 kPackeSize.bytes()));
492 EXPECT_EQ(kPacketsToSend + 1, pacer->QueueSizePackets());
493
494 // Send packets until the initial kPacketsToSend packets are done.
495 Timestamp start_time = clock_.CurrentTime();
496 while (pacer->QueueSizePackets() > 1) {
497 AdvanceTimeUntil(pacer->NextSendTime());
498 pacer->ProcessPackets();
499 }
500 EXPECT_LT(clock_.CurrentTime() - start_time, kSendInterval);
501
502 // Proceed till last packet can be sent.
503 EXPECT_CALL(callback_, SendPacket(kSsrc, sequence_number,
504 queued_packet_timestamp, false, false))
505 .Times(1);
506 AdvanceTimeUntil(pacer->NextSendTime());
507 pacer->ProcessPackets();
508 EXPECT_GE(clock_.CurrentTime() - start_time, kSendInterval);
509 EXPECT_EQ(pacer->QueueSizePackets(), 0u);
510 }
511
TEST_F(PacingControllerTest,PaceQueuedPackets)512 TEST_F(PacingControllerTest, PaceQueuedPackets) {
513 uint32_t ssrc = 12345;
514 uint16_t sequence_number = 1234;
515 const size_t kPacketSize = 250;
516 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
517 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
518
519 // Due to the multiplicative factor we can send 5 packets during a send
520 // interval. (network capacity * multiplier / (8 bits per byte *
521 // (packet size * #send intervals per second)
522 const size_t packets_to_send_per_interval =
523 kTargetRate.bps() * kPaceMultiplier / (8 * kPacketSize * 200);
524 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
525 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc,
526 sequence_number++, clock_.TimeInMilliseconds(),
527 kPacketSize);
528 }
529
530 for (size_t j = 0; j < packets_to_send_per_interval * 10; ++j) {
531 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, ssrc,
532 sequence_number++,
533 clock_.TimeInMilliseconds(), kPacketSize));
534 }
535 EXPECT_EQ(packets_to_send_per_interval + packets_to_send_per_interval * 10,
536 pacer->QueueSizePackets());
537
538 while (pacer->QueueSizePackets() > packets_to_send_per_interval * 10) {
539 AdvanceTimeUntil(pacer->NextSendTime());
540 pacer->ProcessPackets();
541 }
542 EXPECT_EQ(pacer->QueueSizePackets(), packets_to_send_per_interval * 10);
543 EXPECT_CALL(callback_, SendPadding).Times(0);
544
545 EXPECT_CALL(callback_, SendPacket(ssrc, _, _, false, false))
546 .Times(pacer->QueueSizePackets());
547 const TimeDelta expected_pace_time =
548 DataSize::Bytes(pacer->QueueSizePackets() * kPacketSize) /
549 (kPaceMultiplier * kTargetRate);
550 Timestamp start_time = clock_.CurrentTime();
551 while (pacer->QueueSizePackets() > 0) {
552 AdvanceTimeUntil(pacer->NextSendTime());
553 pacer->ProcessPackets();
554 }
555 const TimeDelta actual_pace_time = clock_.CurrentTime() - start_time;
556 EXPECT_LT((actual_pace_time - expected_pace_time).Abs(),
557 PacingController::kMinSleepTime);
558
559 EXPECT_EQ(0u, pacer->QueueSizePackets());
560 AdvanceTimeUntil(pacer->NextSendTime());
561 EXPECT_EQ(0u, pacer->QueueSizePackets());
562 pacer->ProcessPackets();
563
564 // Send some more packet, just show that we can..?
565 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
566 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc,
567 sequence_number++, clock_.TimeInMilliseconds(), 250);
568 }
569 EXPECT_EQ(packets_to_send_per_interval, pacer->QueueSizePackets());
570 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
571 AdvanceTimeUntil(pacer->NextSendTime());
572 pacer->ProcessPackets();
573 }
574 EXPECT_EQ(0u, pacer->QueueSizePackets());
575 }
576
TEST_F(PacingControllerTest,RepeatedRetransmissionsAllowed)577 TEST_F(PacingControllerTest, RepeatedRetransmissionsAllowed) {
578 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
579 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
580
581 // Send one packet, then two retransmissions of that packet.
582 for (size_t i = 0; i < 3; i++) {
583 constexpr uint32_t ssrc = 333;
584 constexpr uint16_t sequence_number = 444;
585 constexpr size_t bytes = 250;
586 bool is_retransmission = (i != 0); // Original followed by retransmissions.
587 SendAndExpectPacket(pacer.get(),
588 is_retransmission ? RtpPacketMediaType::kRetransmission
589 : RtpPacketMediaType::kVideo,
590 ssrc, sequence_number, clock_.TimeInMilliseconds(),
591 bytes);
592 clock_.AdvanceTimeMilliseconds(5);
593 }
594 while (pacer->QueueSizePackets() > 0) {
595 AdvanceTimeUntil(pacer->NextSendTime());
596 pacer->ProcessPackets();
597 }
598 }
599
TEST_F(PacingControllerTest,CanQueuePacketsWithSameSequenceNumberOnDifferentSsrcs)600 TEST_F(PacingControllerTest,
601 CanQueuePacketsWithSameSequenceNumberOnDifferentSsrcs) {
602 uint32_t ssrc = 12345;
603 uint16_t sequence_number = 1234;
604 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
605 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
606
607 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc,
608 sequence_number, clock_.TimeInMilliseconds(), 250);
609
610 // Expect packet on second ssrc to be queued and sent as well.
611 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc + 1,
612 sequence_number, clock_.TimeInMilliseconds(), 250);
613
614 clock_.AdvanceTimeMilliseconds(1000);
615 while (pacer->QueueSizePackets() > 0) {
616 AdvanceTimeUntil(pacer->NextSendTime());
617 pacer->ProcessPackets();
618 }
619 }
620
TEST_F(PacingControllerTest,Padding)621 TEST_F(PacingControllerTest, Padding) {
622 uint32_t ssrc = 12345;
623 uint16_t sequence_number = 1234;
624 const size_t kPacketSize = 250;
625 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
626 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
627
628 const size_t kPacketsToSend = 20;
629 for (size_t i = 0; i < kPacketsToSend; ++i) {
630 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc,
631 sequence_number++, clock_.TimeInMilliseconds(),
632 kPacketSize);
633 }
634 const TimeDelta expected_pace_time =
635 DataSize::Bytes(pacer->QueueSizePackets() * kPacketSize) /
636 (kPaceMultiplier * kTargetRate);
637 EXPECT_CALL(callback_, SendPadding).Times(0);
638 // Only the media packets should be sent.
639 Timestamp start_time = clock_.CurrentTime();
640 while (pacer->QueueSizePackets() > 0) {
641 AdvanceTimeUntil(pacer->NextSendTime());
642 pacer->ProcessPackets();
643 }
644 const TimeDelta actual_pace_time = clock_.CurrentTime() - start_time;
645 EXPECT_LE((actual_pace_time - expected_pace_time).Abs(),
646 PacingController::kMinSleepTime);
647
648 // Pacing media happens at 2.5x, but padding was configured with 1.0x
649 // factor. We have to wait until the padding debt is gone before we start
650 // sending padding.
651 const TimeDelta time_to_padding_debt_free =
652 (expected_pace_time * kPaceMultiplier) - actual_pace_time;
653 clock_.AdvanceTime(time_to_padding_debt_free -
654 PacingController::kMinSleepTime);
655 pacer->ProcessPackets();
656
657 // Send 10 padding packets.
658 const size_t kPaddingPacketsToSend = 10;
659 DataSize padding_sent = DataSize::Zero();
660 size_t packets_sent = 0;
661 Timestamp first_send_time = Timestamp::MinusInfinity();
662 Timestamp last_send_time = Timestamp::MinusInfinity();
663
664 EXPECT_CALL(callback_, SendPadding)
665 .Times(kPaddingPacketsToSend)
666 .WillRepeatedly([&](size_t target_size) {
667 ++packets_sent;
668 if (packets_sent < kPaddingPacketsToSend) {
669 // Don't count bytes of last packet, instead just
670 // use this as the time the last packet finished
671 // sending.
672 padding_sent += DataSize::Bytes(target_size);
673 }
674 if (first_send_time.IsInfinite()) {
675 first_send_time = clock_.CurrentTime();
676 } else {
677 last_send_time = clock_.CurrentTime();
678 }
679 return target_size;
680 });
681 EXPECT_CALL(callback_, SendPacket(_, _, _, false, true))
682 .Times(kPaddingPacketsToSend);
683
684 while (packets_sent < kPaddingPacketsToSend) {
685 AdvanceTimeUntil(pacer->NextSendTime());
686 pacer->ProcessPackets();
687 }
688
689 // Verify rate of sent padding.
690 TimeDelta padding_duration = last_send_time - first_send_time;
691 DataRate padding_rate = padding_sent / padding_duration;
692 EXPECT_EQ(padding_rate, kTargetRate);
693 }
694
TEST_F(PacingControllerTest,NoPaddingBeforeNormalPacket)695 TEST_F(PacingControllerTest, NoPaddingBeforeNormalPacket) {
696 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
697 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
698
699 EXPECT_CALL(callback_, SendPadding).Times(0);
700
701 pacer->ProcessPackets();
702 AdvanceTimeUntil(pacer->NextSendTime());
703
704 pacer->ProcessPackets();
705 AdvanceTimeUntil(pacer->NextSendTime());
706
707 uint32_t ssrc = 12345;
708 uint16_t sequence_number = 1234;
709 int64_t capture_time_ms = 56789;
710
711 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc,
712 sequence_number++, capture_time_ms, 250);
713 bool padding_sent = false;
714 EXPECT_CALL(callback_, SendPadding).WillOnce([&](size_t padding) {
715 padding_sent = true;
716 return padding;
717 });
718 EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
719 while (!padding_sent) {
720 AdvanceTimeUntil(pacer->NextSendTime());
721 pacer->ProcessPackets();
722 }
723 }
724
TEST_F(PacingControllerTest,VerifyAverageBitrateVaryingMediaPayload)725 TEST_F(PacingControllerTest, VerifyAverageBitrateVaryingMediaPayload) {
726 uint32_t ssrc = 12345;
727 uint16_t sequence_number = 1234;
728 int64_t capture_time_ms = 56789;
729 const TimeDelta kAveragingWindowLength = TimeDelta::Seconds(10);
730 PacingControllerPadding callback;
731 auto pacer = std::make_unique<PacingController>(&clock_, &callback, trials_);
732 pacer->SetProbingEnabled(false);
733 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
734
735 Timestamp start_time = clock_.CurrentTime();
736 size_t media_bytes = 0;
737 while (clock_.CurrentTime() - start_time < kAveragingWindowLength) {
738 // Maybe add some new media packets corresponding to expected send rate.
739 int rand_value = rand(); // NOLINT (rand_r instead of rand)
740 while (
741 media_bytes <
742 (kTargetRate * (clock_.CurrentTime() - start_time)).bytes<size_t>()) {
743 size_t media_payload = rand_value % 400 + 800; // [400, 1200] bytes.
744 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, ssrc,
745 sequence_number++, capture_time_ms,
746 media_payload));
747 media_bytes += media_payload;
748 }
749
750 AdvanceTimeUntil(pacer->NextSendTime());
751 pacer->ProcessPackets();
752 }
753
754 EXPECT_NEAR(
755 kTargetRate.bps(),
756 (DataSize::Bytes(callback.total_bytes_sent()) / kAveragingWindowLength)
757 .bps(),
758 (kTargetRate * 0.01 /* 1% error marging */).bps());
759 }
760
TEST_F(PacingControllerTest,Priority)761 TEST_F(PacingControllerTest, Priority) {
762 uint32_t ssrc_low_priority = 12345;
763 uint32_t ssrc = 12346;
764 uint16_t sequence_number = 1234;
765 int64_t capture_time_ms = 56789;
766 int64_t capture_time_ms_low_priority = 1234567;
767 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
768 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
769
770 ConsumeInitialBudget(pacer.get());
771
772 // Expect normal and low priority to be queued and high to pass through.
773 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo,
774 ssrc_low_priority, sequence_number++,
775 capture_time_ms_low_priority, 250));
776
777 const size_t packets_to_send_per_interval =
778 kTargetRate.bps() * kPaceMultiplier / (8 * 250 * 200);
779 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
780 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kRetransmission, ssrc,
781 sequence_number++, capture_time_ms, 250));
782 }
783 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kAudio, ssrc,
784 sequence_number++, capture_time_ms, 250));
785
786 // Expect all high and normal priority to be sent out first.
787 EXPECT_CALL(callback_, SendPadding).Times(0);
788 EXPECT_CALL(callback_, SendPacket(ssrc, _, capture_time_ms, _, _))
789 .Times(packets_to_send_per_interval + 1);
790
791 while (pacer->QueueSizePackets() > 1) {
792 AdvanceTimeUntil(pacer->NextSendTime());
793 pacer->ProcessPackets();
794 }
795
796 EXPECT_EQ(1u, pacer->QueueSizePackets());
797
798 EXPECT_CALL(callback_, SendPacket(ssrc_low_priority, _,
799 capture_time_ms_low_priority, _, _));
800 AdvanceTimeUntil(pacer->NextSendTime());
801 pacer->ProcessPackets();
802 }
803
TEST_F(PacingControllerTest,RetransmissionPriority)804 TEST_F(PacingControllerTest, RetransmissionPriority) {
805 uint32_t ssrc = 12345;
806 uint16_t sequence_number = 1234;
807 int64_t capture_time_ms = 45678;
808 int64_t capture_time_ms_retransmission = 56789;
809 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
810 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
811
812 // Due to the multiplicative factor we can send 5 packets during a send
813 // interval. (network capacity * multiplier / (8 bits per byte *
814 // (packet size * #send intervals per second)
815 const size_t packets_to_send_per_interval =
816 kTargetRate.bps() * kPaceMultiplier / (8 * 250 * 200);
817 pacer->ProcessPackets();
818 EXPECT_EQ(0u, pacer->QueueSizePackets());
819
820 // Alternate retransmissions and normal packets.
821 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
822 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, ssrc,
823 sequence_number++, capture_time_ms, 250));
824 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kRetransmission, ssrc,
825 sequence_number++,
826 capture_time_ms_retransmission, 250));
827 }
828 EXPECT_EQ(2 * packets_to_send_per_interval, pacer->QueueSizePackets());
829
830 // Expect all retransmissions to be sent out first despite having a later
831 // capture time.
832 EXPECT_CALL(callback_, SendPadding).Times(0);
833 EXPECT_CALL(callback_, SendPacket(_, _, _, false, _)).Times(0);
834 EXPECT_CALL(callback_,
835 SendPacket(ssrc, _, capture_time_ms_retransmission, true, _))
836 .Times(packets_to_send_per_interval);
837
838 while (pacer->QueueSizePackets() > packets_to_send_per_interval) {
839 AdvanceTimeUntil(pacer->NextSendTime());
840 pacer->ProcessPackets();
841 }
842 EXPECT_EQ(packets_to_send_per_interval, pacer->QueueSizePackets());
843
844 // Expect the remaining (non-retransmission) packets to be sent.
845 EXPECT_CALL(callback_, SendPadding).Times(0);
846 EXPECT_CALL(callback_, SendPacket(_, _, _, true, _)).Times(0);
847 EXPECT_CALL(callback_, SendPacket(ssrc, _, capture_time_ms, false, _))
848 .Times(packets_to_send_per_interval);
849
850 while (pacer->QueueSizePackets() > 0) {
851 AdvanceTimeUntil(pacer->NextSendTime());
852 pacer->ProcessPackets();
853 }
854 EXPECT_EQ(0u, pacer->QueueSizePackets());
855 }
856
TEST_F(PacingControllerTest,HighPrioDoesntAffectBudget)857 TEST_F(PacingControllerTest, HighPrioDoesntAffectBudget) {
858 const size_t kPacketSize = 250;
859 uint32_t ssrc = 12346;
860 uint16_t sequence_number = 1234;
861 int64_t capture_time_ms = 56789;
862 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
863 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
864
865 // As high prio packets doesn't affect the budget, we should be able to send
866 // a high number of them at once.
867 const size_t kNumAudioPackets = 25;
868 for (size_t i = 0; i < kNumAudioPackets; ++i) {
869 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kAudio, ssrc,
870 sequence_number++, capture_time_ms, kPacketSize);
871 }
872 pacer->ProcessPackets();
873 // Low prio packets does affect the budget.
874 // Due to the multiplicative factor we can send 5 packets during a send
875 // interval. (network capacity * multiplier / (8 bits per byte *
876 // (packet size * #send intervals per second)
877 const size_t kPacketsToSendPerInterval =
878 kTargetRate.bps() * kPaceMultiplier / (8 * kPacketSize * 200);
879 for (size_t i = 0; i < kPacketsToSendPerInterval; ++i) {
880 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc,
881 sequence_number++, clock_.TimeInMilliseconds(),
882 kPacketSize);
883 }
884
885 // Send all packets and measure pace time.
886 Timestamp start_time = clock_.CurrentTime();
887 while (pacer->QueueSizePackets() > 0) {
888 AdvanceTimeUntil(pacer->NextSendTime());
889 pacer->ProcessPackets();
890 }
891
892 // Measure pacing time. Expect only low-prio packets to affect this.
893 TimeDelta pacing_time = clock_.CurrentTime() - start_time;
894 TimeDelta expected_pacing_time =
895 DataSize::Bytes(kPacketsToSendPerInterval * kPacketSize) /
896 (kTargetRate * kPaceMultiplier);
897 EXPECT_NEAR(pacing_time.us<double>(), expected_pacing_time.us<double>(),
898 PacingController::kMinSleepTime.us<double>());
899 }
900
TEST_F(PacingControllerTest,SendsOnlyPaddingWhenCongested)901 TEST_F(PacingControllerTest, SendsOnlyPaddingWhenCongested) {
902 uint32_t ssrc = 202020;
903 uint16_t sequence_number = 1000;
904 int kPacketSize = 250;
905 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
906 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
907
908 // Send an initial packet so we have a last send time.
909 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc,
910 sequence_number++, clock_.TimeInMilliseconds(),
911 kPacketSize);
912 AdvanceTimeUntil(pacer->NextSendTime());
913 pacer->ProcessPackets();
914 ::testing::Mock::VerifyAndClearExpectations(&callback_);
915
916 // Set congested state, we should not send anything until the 500ms since
917 // last send time limit for keep-alives is triggered.
918 EXPECT_CALL(callback_, SendPacket).Times(0);
919 EXPECT_CALL(callback_, SendPadding).Times(0);
920 pacer->SetCongested(true);
921 size_t blocked_packets = 0;
922 int64_t expected_time_until_padding = 500;
923 while (expected_time_until_padding > 5) {
924 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, ssrc,
925 sequence_number++,
926 clock_.TimeInMilliseconds(), kPacketSize));
927 blocked_packets++;
928 clock_.AdvanceTimeMilliseconds(5);
929 pacer->ProcessPackets();
930 expected_time_until_padding -= 5;
931 }
932
933 ::testing::Mock::VerifyAndClearExpectations(&callback_);
934 EXPECT_CALL(callback_, SendPadding(1)).WillOnce(Return(1));
935 EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
936 clock_.AdvanceTimeMilliseconds(5);
937 pacer->ProcessPackets();
938 EXPECT_EQ(blocked_packets, pacer->QueueSizePackets());
939 }
940
TEST_F(PacingControllerTest,DoesNotAllowOveruseAfterCongestion)941 TEST_F(PacingControllerTest, DoesNotAllowOveruseAfterCongestion) {
942 uint32_t ssrc = 202020;
943 uint16_t seq_num = 1000;
944 int size = 1000;
945 auto now_ms = [this] { return clock_.TimeInMilliseconds(); };
946 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
947 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
948 EXPECT_CALL(callback_, SendPadding).Times(0);
949 // The pacing rate is low enough that the budget should not allow two packets
950 // to be sent in a row.
951 pacer->SetPacingRates(DataRate::BitsPerSec(400 * 8 * 1000 / 5),
952 DataRate::Zero());
953 // Not yet budget limited or congested, packet is sent.
954 pacer->EnqueuePacket(
955 BuildPacket(RtpPacketMediaType::kVideo, ssrc, seq_num++, now_ms(), size));
956 EXPECT_CALL(callback_, SendPacket).Times(1);
957 clock_.AdvanceTimeMilliseconds(5);
958 pacer->ProcessPackets();
959 // Packet blocked due to congestion.
960 pacer->SetCongested(true);
961 pacer->EnqueuePacket(
962 BuildPacket(RtpPacketMediaType::kVideo, ssrc, seq_num++, now_ms(), size));
963 EXPECT_CALL(callback_, SendPacket).Times(0);
964 clock_.AdvanceTimeMilliseconds(5);
965 pacer->ProcessPackets();
966 // Packet blocked due to congestion.
967 pacer->EnqueuePacket(
968 BuildPacket(RtpPacketMediaType::kVideo, ssrc, seq_num++, now_ms(), size));
969 EXPECT_CALL(callback_, SendPacket).Times(0);
970 clock_.AdvanceTimeMilliseconds(5);
971 pacer->ProcessPackets();
972 // Congestion removed and budget has recovered, packet is sent.
973 pacer->EnqueuePacket(
974 BuildPacket(RtpPacketMediaType::kVideo, ssrc, seq_num++, now_ms(), size));
975 EXPECT_CALL(callback_, SendPacket).Times(1);
976 clock_.AdvanceTimeMilliseconds(5);
977 pacer->SetCongested(false);
978 pacer->ProcessPackets();
979 // Should be blocked due to budget limitation as congestion has be removed.
980 pacer->EnqueuePacket(
981 BuildPacket(RtpPacketMediaType::kVideo, ssrc, seq_num++, now_ms(), size));
982 EXPECT_CALL(callback_, SendPacket).Times(0);
983 clock_.AdvanceTimeMilliseconds(5);
984 pacer->ProcessPackets();
985 }
986
TEST_F(PacingControllerTest,Pause)987 TEST_F(PacingControllerTest, Pause) {
988 uint32_t ssrc_low_priority = 12345;
989 uint32_t ssrc = 12346;
990 uint32_t ssrc_high_priority = 12347;
991 uint16_t sequence_number = 1234;
992 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
993 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
994
995 EXPECT_TRUE(pacer->OldestPacketEnqueueTime().IsInfinite());
996
997 ConsumeInitialBudget(pacer.get());
998
999 pacer->Pause();
1000
1001 int64_t capture_time_ms = clock_.TimeInMilliseconds();
1002 const size_t packets_to_send_per_interval =
1003 kTargetRate.bps() * kPaceMultiplier / (8 * 250 * 200);
1004 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
1005 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo,
1006 ssrc_low_priority, sequence_number++,
1007 capture_time_ms, 250));
1008 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kRetransmission, ssrc,
1009 sequence_number++, capture_time_ms, 250));
1010 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kAudio,
1011 ssrc_high_priority, sequence_number++,
1012 capture_time_ms, 250));
1013 }
1014 clock_.AdvanceTimeMilliseconds(10000);
1015 int64_t second_capture_time_ms = clock_.TimeInMilliseconds();
1016 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
1017 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo,
1018 ssrc_low_priority, sequence_number++,
1019 second_capture_time_ms, 250));
1020 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kRetransmission, ssrc,
1021 sequence_number++, second_capture_time_ms,
1022 250));
1023 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kAudio,
1024 ssrc_high_priority, sequence_number++,
1025 second_capture_time_ms, 250));
1026 }
1027
1028 // Expect everything to be queued.
1029 EXPECT_EQ(capture_time_ms, pacer->OldestPacketEnqueueTime().ms());
1030
1031 // Process triggers keep-alive packet.
1032 EXPECT_CALL(callback_, SendPadding).WillOnce([](size_t padding) {
1033 return padding;
1034 });
1035 EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
1036 pacer->ProcessPackets();
1037
1038 // Verify no packets sent for the rest of the paused process interval.
1039 const TimeDelta kProcessInterval = TimeDelta::Millis(5);
1040 TimeDelta expected_time_until_send = PacingController::kPausedProcessInterval;
1041 EXPECT_CALL(callback_, SendPadding).Times(0);
1042 while (expected_time_until_send >= kProcessInterval) {
1043 pacer->ProcessPackets();
1044 clock_.AdvanceTime(kProcessInterval);
1045 expected_time_until_send -= kProcessInterval;
1046 }
1047
1048 // New keep-alive packet.
1049 ::testing::Mock::VerifyAndClearExpectations(&callback_);
1050 EXPECT_CALL(callback_, SendPadding).WillOnce([](size_t padding) {
1051 return padding;
1052 });
1053 EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
1054 clock_.AdvanceTime(kProcessInterval);
1055 pacer->ProcessPackets();
1056 ::testing::Mock::VerifyAndClearExpectations(&callback_);
1057
1058 // Expect high prio packets to come out first followed by normal
1059 // prio packets and low prio packets (all in capture order).
1060 {
1061 ::testing::InSequence sequence;
1062 EXPECT_CALL(callback_,
1063 SendPacket(ssrc_high_priority, _, capture_time_ms, _, _))
1064 .Times(packets_to_send_per_interval);
1065 EXPECT_CALL(callback_,
1066 SendPacket(ssrc_high_priority, _, second_capture_time_ms, _, _))
1067 .Times(packets_to_send_per_interval);
1068
1069 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
1070 EXPECT_CALL(callback_, SendPacket(ssrc, _, capture_time_ms, _, _))
1071 .Times(1);
1072 }
1073 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
1074 EXPECT_CALL(callback_, SendPacket(ssrc, _, second_capture_time_ms, _, _))
1075 .Times(1);
1076 }
1077 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
1078 EXPECT_CALL(callback_,
1079 SendPacket(ssrc_low_priority, _, capture_time_ms, _, _))
1080 .Times(1);
1081 }
1082 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
1083 EXPECT_CALL(callback_, SendPacket(ssrc_low_priority, _,
1084 second_capture_time_ms, _, _))
1085 .Times(1);
1086 }
1087 }
1088 pacer->Resume();
1089 while (pacer->QueueSizePackets() > 0) {
1090 AdvanceTimeUntil(pacer->NextSendTime());
1091 pacer->ProcessPackets();
1092 }
1093
1094 EXPECT_TRUE(pacer->OldestPacketEnqueueTime().IsInfinite());
1095 }
1096
TEST_F(PacingControllerTest,InactiveFromStart)1097 TEST_F(PacingControllerTest, InactiveFromStart) {
1098 // Recreate the pacer without the inital time forwarding.
1099 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
1100 pacer->SetProbingEnabled(false);
1101 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
1102
1103 // No packets sent, there should be no keep-alives sent either.
1104 EXPECT_CALL(callback_, SendPadding).Times(0);
1105 EXPECT_CALL(callback_, SendPacket).Times(0);
1106 pacer->ProcessPackets();
1107
1108 const Timestamp start_time = clock_.CurrentTime();
1109
1110 // Determine the margin need so we can advance to the last possible moment
1111 // that will not cause a process event.
1112 const TimeDelta time_margin =
1113 PacingController::kMinSleepTime + TimeDelta::Micros(1);
1114
1115 EXPECT_EQ(pacer->NextSendTime() - start_time,
1116 PacingController::kPausedProcessInterval);
1117 clock_.AdvanceTime(PacingController::kPausedProcessInterval - time_margin);
1118 pacer->ProcessPackets();
1119 EXPECT_EQ(pacer->NextSendTime() - start_time,
1120 PacingController::kPausedProcessInterval);
1121
1122 clock_.AdvanceTime(time_margin);
1123 pacer->ProcessPackets();
1124 EXPECT_EQ(pacer->NextSendTime() - start_time,
1125 2 * PacingController::kPausedProcessInterval);
1126 }
1127
TEST_F(PacingControllerTest,QueueTimeGrowsOverTime)1128 TEST_F(PacingControllerTest, QueueTimeGrowsOverTime) {
1129 uint32_t ssrc = 12346;
1130 uint16_t sequence_number = 1234;
1131 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
1132 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
1133 EXPECT_TRUE(pacer->OldestPacketEnqueueTime().IsInfinite());
1134
1135 pacer->SetPacingRates(DataRate::BitsPerSec(30000 * kPaceMultiplier),
1136 DataRate::Zero());
1137 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc,
1138 sequence_number, clock_.TimeInMilliseconds(), 1200);
1139
1140 clock_.AdvanceTimeMilliseconds(500);
1141 EXPECT_EQ(clock_.TimeInMilliseconds() - 500,
1142 pacer->OldestPacketEnqueueTime().ms());
1143 pacer->ProcessPackets();
1144 EXPECT_TRUE(pacer->OldestPacketEnqueueTime().IsInfinite());
1145 }
1146
TEST_F(PacingControllerTest,ProbingWithInsertedPackets)1147 TEST_F(PacingControllerTest, ProbingWithInsertedPackets) {
1148 const size_t kPacketSize = 1200;
1149 const int kInitialBitrateBps = 300000;
1150 uint32_t ssrc = 12346;
1151 uint16_t sequence_number = 1234;
1152
1153 PacingControllerProbing packet_sender;
1154 auto pacer =
1155 std::make_unique<PacingController>(&clock_, &packet_sender, trials_);
1156 std::vector<ProbeClusterConfig> probe_clusters = {
1157 {.at_time = clock_.CurrentTime(),
1158 .target_data_rate = kFirstClusterRate,
1159 .target_duration = TimeDelta::Millis(15),
1160 .target_probe_count = 5,
1161 .id = 0},
1162 {.at_time = clock_.CurrentTime(),
1163 .target_data_rate = kSecondClusterRate,
1164 .target_duration = TimeDelta::Millis(15),
1165 .target_probe_count = 5,
1166 .id = 1}};
1167 pacer->CreateProbeClusters(probe_clusters);
1168 pacer->SetPacingRates(
1169 DataRate::BitsPerSec(kInitialBitrateBps * kPaceMultiplier),
1170 DataRate::Zero());
1171
1172 for (int i = 0; i < 10; ++i) {
1173 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, ssrc,
1174 sequence_number++,
1175 clock_.TimeInMilliseconds(), kPacketSize));
1176 }
1177
1178 int64_t start = clock_.TimeInMilliseconds();
1179 while (packet_sender.packets_sent() < 5) {
1180 AdvanceTimeUntil(pacer->NextSendTime());
1181 pacer->ProcessPackets();
1182 }
1183 int packets_sent = packet_sender.packets_sent();
1184 // Validate first cluster bitrate. Note that we have to account for number
1185 // of intervals and hence (packets_sent - 1) on the first cluster.
1186 EXPECT_NEAR((packets_sent - 1) * kPacketSize * 8000 /
1187 (clock_.TimeInMilliseconds() - start),
1188 kFirstClusterRate.bps(), kProbingErrorMargin.bps());
1189 // Probing always starts with a small padding packet.
1190 EXPECT_EQ(1, packet_sender.padding_sent());
1191
1192 AdvanceTimeUntil(pacer->NextSendTime());
1193 start = clock_.TimeInMilliseconds();
1194 while (packet_sender.packets_sent() < 10) {
1195 AdvanceTimeUntil(pacer->NextSendTime());
1196 pacer->ProcessPackets();
1197 }
1198 packets_sent = packet_sender.packets_sent() - packets_sent;
1199 // Validate second cluster bitrate.
1200 EXPECT_NEAR((packets_sent - 1) * kPacketSize * 8000 /
1201 (clock_.TimeInMilliseconds() - start),
1202 kSecondClusterRate.bps(), kProbingErrorMargin.bps());
1203 }
1204
TEST_F(PacingControllerTest,SkipsProbesWhenProcessIntervalTooLarge)1205 TEST_F(PacingControllerTest, SkipsProbesWhenProcessIntervalTooLarge) {
1206 const size_t kPacketSize = 1200;
1207 const int kInitialBitrateBps = 300000;
1208 const uint32_t ssrc = 12346;
1209 const int kProbeClusterId = 3;
1210
1211 uint16_t sequence_number = 1234;
1212
1213 PacingControllerProbing packet_sender;
1214
1215 const test::ExplicitKeyValueConfig trials(
1216 "WebRTC-Bwe-ProbingBehavior/max_probe_delay:2ms/");
1217 auto pacer =
1218 std::make_unique<PacingController>(&clock_, &packet_sender, trials);
1219 pacer->SetPacingRates(
1220 DataRate::BitsPerSec(kInitialBitrateBps * kPaceMultiplier),
1221 DataRate::BitsPerSec(kInitialBitrateBps));
1222
1223 for (int i = 0; i < 10; ++i) {
1224 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, ssrc,
1225 sequence_number++,
1226 clock_.TimeInMilliseconds(), kPacketSize));
1227 }
1228 while (pacer->QueueSizePackets() > 0) {
1229 AdvanceTimeUntil(pacer->NextSendTime());
1230 pacer->ProcessPackets();
1231 }
1232
1233 // Probe at a very high rate.
1234 std::vector<ProbeClusterConfig> probe_clusters = {
1235 {.at_time = clock_.CurrentTime(),
1236 .target_data_rate = DataRate::KilobitsPerSec(10000), // 10 Mbps,
1237 .target_duration = TimeDelta::Millis(15),
1238 .target_probe_count = 5,
1239 .id = kProbeClusterId}};
1240 pacer->CreateProbeClusters(probe_clusters);
1241
1242 // We need one packet to start the probe.
1243 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, ssrc,
1244 sequence_number++,
1245 clock_.TimeInMilliseconds(), kPacketSize));
1246 const int packets_sent_before_probe = packet_sender.packets_sent();
1247 AdvanceTimeUntil(pacer->NextSendTime());
1248 pacer->ProcessPackets();
1249 EXPECT_EQ(packet_sender.packets_sent(), packets_sent_before_probe + 1);
1250
1251 // Figure out how long between probe packets.
1252 Timestamp start_time = clock_.CurrentTime();
1253 AdvanceTimeUntil(pacer->NextSendTime());
1254 TimeDelta time_between_probes = clock_.CurrentTime() - start_time;
1255 // Advance that distance again + 1ms.
1256 clock_.AdvanceTime(time_between_probes);
1257
1258 // Send second probe packet.
1259 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, ssrc,
1260 sequence_number++,
1261 clock_.TimeInMilliseconds(), kPacketSize));
1262 pacer->ProcessPackets();
1263 EXPECT_EQ(packet_sender.packets_sent(), packets_sent_before_probe + 2);
1264 PacedPacketInfo last_pacing_info = packet_sender.last_pacing_info();
1265 EXPECT_EQ(last_pacing_info.probe_cluster_id, kProbeClusterId);
1266
1267 // We're exactly where we should be for the next probe.
1268 const Timestamp probe_time = clock_.CurrentTime();
1269 EXPECT_EQ(pacer->NextSendTime(), clock_.CurrentTime());
1270
1271 BitrateProberConfig probing_config(&trials);
1272 EXPECT_GT(probing_config.max_probe_delay.Get(), TimeDelta::Zero());
1273 // Advance to within max probe delay, should still return same target.
1274 clock_.AdvanceTime(probing_config.max_probe_delay.Get());
1275 EXPECT_EQ(pacer->NextSendTime(), probe_time);
1276
1277 // Too high probe delay, drop it!
1278 clock_.AdvanceTime(TimeDelta::Micros(1));
1279
1280 int packets_sent_before_timeout = packet_sender.total_packets_sent();
1281 // Expected next process time is unchanged, but calling should not
1282 // generate new packets.
1283 EXPECT_EQ(pacer->NextSendTime(), probe_time);
1284 pacer->ProcessPackets();
1285 EXPECT_EQ(packet_sender.total_packets_sent(), packets_sent_before_timeout);
1286
1287 // Next packet sent is not part of probe.
1288 AdvanceTimeUntil(pacer->NextSendTime());
1289 pacer->ProcessPackets();
1290 const int expected_probe_id = PacedPacketInfo::kNotAProbe;
1291 EXPECT_EQ(packet_sender.last_pacing_info().probe_cluster_id,
1292 expected_probe_id);
1293 }
1294
TEST_F(PacingControllerTest,ProbingWithPaddingSupport)1295 TEST_F(PacingControllerTest, ProbingWithPaddingSupport) {
1296 const size_t kPacketSize = 1200;
1297 const int kInitialBitrateBps = 300000;
1298 uint32_t ssrc = 12346;
1299 uint16_t sequence_number = 1234;
1300
1301 PacingControllerProbing packet_sender;
1302 auto pacer =
1303 std::make_unique<PacingController>(&clock_, &packet_sender, trials_);
1304 std::vector<ProbeClusterConfig> probe_clusters = {
1305 {.at_time = clock_.CurrentTime(),
1306 .target_data_rate = kFirstClusterRate,
1307 .target_duration = TimeDelta::Millis(15),
1308 .target_probe_count = 5,
1309 .id = 0}};
1310 pacer->CreateProbeClusters(probe_clusters);
1311
1312 pacer->SetPacingRates(
1313 DataRate::BitsPerSec(kInitialBitrateBps * kPaceMultiplier),
1314 DataRate::Zero());
1315
1316 for (int i = 0; i < 3; ++i) {
1317 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, ssrc,
1318 sequence_number++,
1319 clock_.TimeInMilliseconds(), kPacketSize));
1320 }
1321
1322 int64_t start = clock_.TimeInMilliseconds();
1323 int process_count = 0;
1324 while (process_count < 5) {
1325 AdvanceTimeUntil(pacer->NextSendTime());
1326 pacer->ProcessPackets();
1327 ++process_count;
1328 }
1329 int packets_sent = packet_sender.packets_sent();
1330 int padding_sent = packet_sender.padding_sent();
1331 EXPECT_GT(packets_sent, 0);
1332 EXPECT_GT(padding_sent, 0);
1333 // Note that the number of intervals here for kPacketSize is
1334 // packets_sent due to padding in the same cluster.
1335 EXPECT_NEAR((packets_sent * kPacketSize * 8000 + padding_sent) /
1336 (clock_.TimeInMilliseconds() - start),
1337 kFirstClusterRate.bps(), kProbingErrorMargin.bps());
1338 }
1339
TEST_F(PacingControllerTest,PaddingOveruse)1340 TEST_F(PacingControllerTest, PaddingOveruse) {
1341 uint32_t ssrc = 12346;
1342 uint16_t sequence_number = 1234;
1343 const size_t kPacketSize = 1200;
1344 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
1345 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
1346
1347 // Initially no padding rate.
1348 pacer->ProcessPackets();
1349 pacer->SetPacingRates(DataRate::BitsPerSec(60000 * kPaceMultiplier),
1350 DataRate::Zero());
1351
1352 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc,
1353 sequence_number++, clock_.TimeInMilliseconds(),
1354 kPacketSize);
1355 pacer->ProcessPackets();
1356
1357 // Add 30kbit padding. When increasing budget, media budget will increase from
1358 // negative (overuse) while padding budget will increase from 0.
1359 clock_.AdvanceTimeMilliseconds(5);
1360 pacer->SetPacingRates(DataRate::BitsPerSec(60000 * kPaceMultiplier),
1361 DataRate::BitsPerSec(30000));
1362
1363 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc,
1364 sequence_number++, clock_.TimeInMilliseconds(),
1365 kPacketSize);
1366 EXPECT_LT(TimeDelta::Millis(5), pacer->ExpectedQueueTime());
1367 // Don't send padding if queue is non-empty, even if padding budget > 0.
1368 EXPECT_CALL(callback_, SendPadding).Times(0);
1369 AdvanceTimeUntil(pacer->NextSendTime());
1370 pacer->ProcessPackets();
1371 }
1372
TEST_F(PacingControllerTest,ProbeClusterId)1373 TEST_F(PacingControllerTest, ProbeClusterId) {
1374 MockPacketSender callback;
1375 uint32_t ssrc = 12346;
1376 uint16_t sequence_number = 1234;
1377 const size_t kPacketSize = 1200;
1378
1379 auto pacer = std::make_unique<PacingController>(&clock_, &callback, trials_);
1380 pacer->CreateProbeClusters(std::vector<ProbeClusterConfig>(
1381 {{.at_time = clock_.CurrentTime(),
1382 .target_data_rate = kFirstClusterRate,
1383 .target_duration = TimeDelta::Millis(15),
1384 .target_probe_count = 5,
1385 .id = 0},
1386 {.at_time = clock_.CurrentTime(),
1387 .target_data_rate = kSecondClusterRate,
1388 .target_duration = TimeDelta::Millis(15),
1389 .target_probe_count = 5,
1390 .id = 1}}));
1391 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
1392 pacer->SetProbingEnabled(true);
1393 for (int i = 0; i < 10; ++i) {
1394 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, ssrc,
1395 sequence_number++,
1396 clock_.TimeInMilliseconds(), kPacketSize));
1397 }
1398
1399 // First probing cluster.
1400 EXPECT_CALL(callback,
1401 SendPacket(_, Field(&PacedPacketInfo::probe_cluster_id, 0)))
1402 .Times(5);
1403
1404 for (int i = 0; i < 5; ++i) {
1405 AdvanceTimeUntil(pacer->NextSendTime());
1406 pacer->ProcessPackets();
1407 }
1408
1409 // Second probing cluster.
1410 EXPECT_CALL(callback,
1411 SendPacket(_, Field(&PacedPacketInfo::probe_cluster_id, 1)))
1412 .Times(5);
1413
1414 for (int i = 0; i < 5; ++i) {
1415 AdvanceTimeUntil(pacer->NextSendTime());
1416 pacer->ProcessPackets();
1417 }
1418
1419 // Needed for the Field comparer below.
1420 const int kNotAProbe = PacedPacketInfo::kNotAProbe;
1421 // No more probing packets.
1422 EXPECT_CALL(callback, GeneratePadding).WillOnce([&](DataSize padding_size) {
1423 std::vector<std::unique_ptr<RtpPacketToSend>> padding_packets;
1424 padding_packets.emplace_back(
1425 BuildPacket(RtpPacketMediaType::kPadding, ssrc, sequence_number++,
1426 clock_.TimeInMilliseconds(), padding_size.bytes()));
1427 return padding_packets;
1428 });
1429 bool non_probe_packet_seen = false;
1430 EXPECT_CALL(callback, SendPacket)
1431 .WillOnce([&](std::unique_ptr<RtpPacketToSend> packet,
1432 const PacedPacketInfo& cluster_info) {
1433 EXPECT_EQ(cluster_info.probe_cluster_id, kNotAProbe);
1434 non_probe_packet_seen = true;
1435 });
1436 while (!non_probe_packet_seen) {
1437 AdvanceTimeUntil(pacer->NextSendTime());
1438 pacer->ProcessPackets();
1439 }
1440 }
1441
TEST_F(PacingControllerTest,OwnedPacketPrioritizedOnType)1442 TEST_F(PacingControllerTest, OwnedPacketPrioritizedOnType) {
1443 MockPacketSender callback;
1444 uint32_t ssrc = 123;
1445
1446 auto pacer = std::make_unique<PacingController>(&clock_, &callback, trials_);
1447 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
1448
1449 // Insert a packet of each type, from low to high priority. Since priority
1450 // is weighted higher than insert order, these should come out of the pacer
1451 // in backwards order with the exception of FEC and Video.
1452
1453 for (RtpPacketMediaType type :
1454 {RtpPacketMediaType::kPadding,
1455 RtpPacketMediaType::kForwardErrorCorrection, RtpPacketMediaType::kVideo,
1456 RtpPacketMediaType::kRetransmission, RtpPacketMediaType::kAudio}) {
1457 pacer->EnqueuePacket(BuildPacket(type, ++ssrc, /*sequence_number=*/123,
1458 clock_.TimeInMilliseconds(),
1459 /*size=*/150));
1460 }
1461
1462 ::testing::InSequence seq;
1463 EXPECT_CALL(callback,
1464 SendPacket(Pointee(Property(&RtpPacketToSend::packet_type,
1465 RtpPacketMediaType::kAudio)),
1466 _));
1467 EXPECT_CALL(callback,
1468 SendPacket(Pointee(Property(&RtpPacketToSend::packet_type,
1469 RtpPacketMediaType::kRetransmission)),
1470 _));
1471
1472 // FEC and video actually have the same priority, so will come out in
1473 // insertion order.
1474 EXPECT_CALL(
1475 callback,
1476 SendPacket(Pointee(Property(&RtpPacketToSend::packet_type,
1477 RtpPacketMediaType::kForwardErrorCorrection)),
1478 _));
1479 EXPECT_CALL(callback,
1480 SendPacket(Pointee(Property(&RtpPacketToSend::packet_type,
1481 RtpPacketMediaType::kVideo)),
1482 _));
1483
1484 EXPECT_CALL(callback,
1485 SendPacket(Pointee(Property(&RtpPacketToSend::packet_type,
1486 RtpPacketMediaType::kPadding)),
1487 _));
1488
1489 while (pacer->QueueSizePackets() > 0) {
1490 AdvanceTimeUntil(pacer->NextSendTime());
1491 pacer->ProcessPackets();
1492 }
1493 }
1494
TEST_F(PacingControllerTest,SmallFirstProbePacket)1495 TEST_F(PacingControllerTest, SmallFirstProbePacket) {
1496 MockPacketSender callback;
1497 auto pacer = std::make_unique<PacingController>(&clock_, &callback, trials_);
1498 std::vector<ProbeClusterConfig> probe_clusters = {
1499 {.at_time = clock_.CurrentTime(),
1500 .target_data_rate = kFirstClusterRate,
1501 .target_duration = TimeDelta::Millis(15),
1502 .target_probe_count = 5,
1503 .id = 0}};
1504 pacer->CreateProbeClusters(probe_clusters);
1505
1506 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
1507
1508 // Add high prio media.
1509 pacer->EnqueuePacket(audio_.BuildNextPacket(234));
1510
1511 // Expect small padding packet to be requested.
1512 EXPECT_CALL(callback, GeneratePadding(DataSize::Bytes(1)))
1513 .WillOnce([&](DataSize padding_size) {
1514 std::vector<std::unique_ptr<RtpPacketToSend>> padding_packets;
1515 padding_packets.emplace_back(
1516 BuildPacket(RtpPacketMediaType::kPadding, kAudioSsrc, 1,
1517 clock_.TimeInMilliseconds(), 1));
1518 return padding_packets;
1519 });
1520
1521 size_t packets_sent = 0;
1522 bool media_seen = false;
1523 EXPECT_CALL(callback, SendPacket)
1524 .Times(AnyNumber())
1525 .WillRepeatedly([&](std::unique_ptr<RtpPacketToSend> packet,
1526 const PacedPacketInfo& cluster_info) {
1527 if (packets_sent == 0) {
1528 EXPECT_EQ(packet->packet_type(), RtpPacketMediaType::kPadding);
1529 } else {
1530 if (packet->packet_type() == RtpPacketMediaType::kAudio) {
1531 media_seen = true;
1532 }
1533 }
1534 packets_sent++;
1535 });
1536 while (!media_seen) {
1537 pacer->ProcessPackets();
1538 clock_.AdvanceTimeMilliseconds(5);
1539 }
1540 }
1541
TEST_F(PacingControllerTest,TaskLate)1542 TEST_F(PacingControllerTest, TaskLate) {
1543 // Set a low send rate to more easily test timing issues.
1544 DataRate kSendRate = DataRate::KilobitsPerSec(30);
1545 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
1546 pacer->SetPacingRates(kSendRate, DataRate::Zero());
1547
1548 // Add four packets of equal size and priority.
1549 pacer->EnqueuePacket(video_.BuildNextPacket(1000));
1550 pacer->EnqueuePacket(video_.BuildNextPacket(1000));
1551 pacer->EnqueuePacket(video_.BuildNextPacket(1000));
1552 pacer->EnqueuePacket(video_.BuildNextPacket(1000));
1553
1554 // Process packets, only first should be sent.
1555 EXPECT_CALL(callback_, SendPacket).Times(1);
1556 pacer->ProcessPackets();
1557
1558 Timestamp next_send_time = pacer->NextSendTime();
1559 // Determine time between packets (ca 62ms)
1560 const TimeDelta time_between_packets = next_send_time - clock_.CurrentTime();
1561
1562 // Simulate a late process call, executed just before we allow sending the
1563 // fourth packet.
1564 const TimeDelta kOffset = TimeDelta::Millis(1);
1565 clock_.AdvanceTime((time_between_packets * 3) - kOffset);
1566
1567 EXPECT_CALL(callback_, SendPacket).Times(2);
1568 pacer->ProcessPackets();
1569
1570 // Check that next scheduled send time is in ca 1ms.
1571 next_send_time = pacer->NextSendTime();
1572 const TimeDelta time_left = next_send_time - clock_.CurrentTime();
1573 EXPECT_EQ(time_left.RoundTo(TimeDelta::Millis(1)), kOffset);
1574
1575 clock_.AdvanceTime(time_left);
1576 EXPECT_CALL(callback_, SendPacket);
1577 pacer->ProcessPackets();
1578 }
1579
TEST_F(PacingControllerTest,NoProbingWhilePaused)1580 TEST_F(PacingControllerTest, NoProbingWhilePaused) {
1581 uint32_t ssrc = 12345;
1582 uint16_t sequence_number = 1234;
1583 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
1584 pacer->SetProbingEnabled(true);
1585 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
1586 pacer->CreateProbeClusters(std::vector<ProbeClusterConfig>(
1587 {{.at_time = clock_.CurrentTime(),
1588 .target_data_rate = kFirstClusterRate,
1589 .target_duration = TimeDelta::Millis(15),
1590 .target_probe_count = 5,
1591 .id = 0},
1592 {.at_time = clock_.CurrentTime(),
1593 .target_data_rate = kSecondClusterRate,
1594 .target_duration = TimeDelta::Millis(15),
1595 .target_probe_count = 5,
1596 .id = 1}}));
1597
1598 // Send at least one packet so probing can initate.
1599 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc,
1600 sequence_number, clock_.TimeInMilliseconds(), 250);
1601 while (pacer->QueueSizePackets() > 0) {
1602 AdvanceTimeUntil(pacer->NextSendTime());
1603 pacer->ProcessPackets();
1604 }
1605
1606 // Trigger probing.
1607 std::vector<ProbeClusterConfig> probe_clusters = {
1608 {.at_time = clock_.CurrentTime(),
1609 .target_data_rate = DataRate::KilobitsPerSec(10000), // 10 Mbps.
1610 .target_duration = TimeDelta::Millis(15),
1611 .target_probe_count = 5,
1612 .id = 3}};
1613 pacer->CreateProbeClusters(probe_clusters);
1614
1615 // Time to next send time should be small.
1616 EXPECT_LT(pacer->NextSendTime() - clock_.CurrentTime(),
1617 PacingController::kPausedProcessInterval);
1618
1619 // Pause pacer, time to next send time should now be the pause process
1620 // interval.
1621 pacer->Pause();
1622
1623 EXPECT_EQ(pacer->NextSendTime() - clock_.CurrentTime(),
1624 PacingController::kPausedProcessInterval);
1625 }
1626
TEST_F(PacingControllerTest,AudioNotPacedEvenWhenAccountedFor)1627 TEST_F(PacingControllerTest, AudioNotPacedEvenWhenAccountedFor) {
1628 const uint32_t kSsrc = 12345;
1629 uint16_t sequence_number = 1234;
1630 const size_t kPacketSize = 123;
1631 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
1632
1633 // Account for audio - so that audio packets can cause pushback on other
1634 // types such as video. Audio packet should still be immediated passed
1635 // through though ("WebRTC-Pacer-BlockAudio" needs to be enabled in order
1636 // to pace audio packets).
1637 pacer->SetAccountForAudioPackets(true);
1638
1639 // Set pacing rate to 1 packet/s, no padding.
1640 pacer->SetPacingRates(DataSize::Bytes(kPacketSize) / TimeDelta::Seconds(1),
1641 DataRate::Zero());
1642
1643 // Add and send an audio packet.
1644 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kAudio, kSsrc,
1645 sequence_number++, clock_.TimeInMilliseconds(),
1646 kPacketSize);
1647 pacer->ProcessPackets();
1648
1649 // Advance time, add another audio packet and process. It should be sent
1650 // immediately.
1651 clock_.AdvanceTimeMilliseconds(5);
1652 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kAudio, kSsrc,
1653 sequence_number++, clock_.TimeInMilliseconds(),
1654 kPacketSize);
1655 pacer->ProcessPackets();
1656 }
1657
TEST_F(PacingControllerTest,PaddingResumesAfterSaturationEvenWithConcurrentAudio)1658 TEST_F(PacingControllerTest,
1659 PaddingResumesAfterSaturationEvenWithConcurrentAudio) {
1660 const uint32_t kSsrc = 12345;
1661 const DataRate kPacingDataRate = DataRate::KilobitsPerSec(125);
1662 const DataRate kPaddingDataRate = DataRate::KilobitsPerSec(100);
1663 const TimeDelta kMaxBufferInTime = TimeDelta::Millis(500);
1664 const DataSize kPacketSize = DataSize::Bytes(130);
1665 const TimeDelta kAudioPacketInterval = TimeDelta::Millis(20);
1666
1667 // In this test, we fist send a burst of video in order to saturate the
1668 // padding debt level.
1669 // We then proceed to send audio at a bitrate that is slightly lower than
1670 // the padding rate, meaning there will be a period with audio but no
1671 // padding sent while the debt is draining, then audio and padding will
1672 // be interlieved.
1673
1674 // Verify both with and without accounting for audio.
1675 for (bool account_for_audio : {false, true}) {
1676 uint16_t sequence_number = 1234;
1677 MockPacketSender callback;
1678 EXPECT_CALL(callback, SendPacket).Times(AnyNumber());
1679 auto pacer =
1680 std::make_unique<PacingController>(&clock_, &callback, trials_);
1681 pacer->SetAccountForAudioPackets(account_for_audio);
1682
1683 // First, saturate the padding budget.
1684 pacer->SetPacingRates(kPacingDataRate, kPaddingDataRate);
1685
1686 const TimeDelta kPaddingSaturationTime =
1687 kMaxBufferInTime * kPaddingDataRate /
1688 (kPacingDataRate - kPaddingDataRate);
1689 const DataSize kVideoToSend = kPaddingSaturationTime * kPacingDataRate;
1690 const DataSize kVideoPacketSize = DataSize::Bytes(1200);
1691 DataSize video_sent = DataSize::Zero();
1692 while (video_sent < kVideoToSend) {
1693 pacer->EnqueuePacket(
1694 BuildPacket(RtpPacketMediaType::kVideo, kSsrc, sequence_number++,
1695 clock_.TimeInMilliseconds(), kVideoPacketSize.bytes()));
1696 video_sent += kVideoPacketSize;
1697 }
1698 while (pacer->QueueSizePackets() > 0) {
1699 AdvanceTimeUntil(pacer->NextSendTime());
1700 pacer->ProcessPackets();
1701 }
1702
1703 // Add a stream of audio packets at a rate slightly lower than the padding
1704 // rate, once the padding debt is paid off we expect padding to be
1705 // generated.
1706 pacer->SetPacingRates(kPacingDataRate, kPaddingDataRate);
1707 bool padding_seen = false;
1708 EXPECT_CALL(callback, GeneratePadding).WillOnce([&](DataSize padding_size) {
1709 padding_seen = true;
1710 std::vector<std::unique_ptr<RtpPacketToSend>> padding_packets;
1711 padding_packets.emplace_back(
1712 BuildPacket(RtpPacketMediaType::kPadding, kSsrc, sequence_number++,
1713 clock_.TimeInMilliseconds(), padding_size.bytes()));
1714 return padding_packets;
1715 });
1716
1717 Timestamp start_time = clock_.CurrentTime();
1718 Timestamp last_audio_time = start_time;
1719 while (!padding_seen) {
1720 Timestamp now = clock_.CurrentTime();
1721 Timestamp next_send_time = pacer->NextSendTime();
1722 TimeDelta sleep_time =
1723 std::min(next_send_time, last_audio_time + kAudioPacketInterval) -
1724 now;
1725 clock_.AdvanceTime(sleep_time);
1726 while (clock_.CurrentTime() >= last_audio_time + kAudioPacketInterval) {
1727 pacer->EnqueuePacket(
1728 BuildPacket(RtpPacketMediaType::kAudio, kSsrc, sequence_number++,
1729 clock_.TimeInMilliseconds(), kPacketSize.bytes()));
1730 last_audio_time += kAudioPacketInterval;
1731 }
1732 pacer->ProcessPackets();
1733 }
1734
1735 // Verify how long it took to drain the padding debt. Allow 2% error margin.
1736 const DataRate kAudioDataRate = kPacketSize / kAudioPacketInterval;
1737 const TimeDelta expected_drain_time =
1738 account_for_audio ? (kMaxBufferInTime * kPaddingDataRate /
1739 (kPaddingDataRate - kAudioDataRate))
1740 : kMaxBufferInTime;
1741 const TimeDelta actual_drain_time = clock_.CurrentTime() - start_time;
1742 EXPECT_NEAR(actual_drain_time.ms(), expected_drain_time.ms(),
1743 expected_drain_time.ms() * 0.02)
1744 << " where account_for_audio = "
1745 << (account_for_audio ? "true" : "false");
1746 }
1747 }
1748
TEST_F(PacingControllerTest,AccountsForAudioEnqueueTime)1749 TEST_F(PacingControllerTest, AccountsForAudioEnqueueTime) {
1750 const uint32_t kSsrc = 12345;
1751 const DataRate kPacingDataRate = DataRate::KilobitsPerSec(125);
1752 const DataRate kPaddingDataRate = DataRate::Zero();
1753 const DataSize kPacketSize = DataSize::Bytes(130);
1754 const TimeDelta kPacketPacingTime = kPacketSize / kPacingDataRate;
1755 uint32_t sequnce_number = 1;
1756 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
1757 // Audio not paced, but still accounted for in budget.
1758 pacer->SetAccountForAudioPackets(true);
1759 pacer->SetPacingRates(kPacingDataRate, kPaddingDataRate);
1760
1761 // Enqueue two audio packets, advance clock to where one packet
1762 // should have drained the buffer already, has they been sent
1763 // immediately.
1764 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kAudio, kSsrc,
1765 sequnce_number++, clock_.TimeInMilliseconds(),
1766 kPacketSize.bytes());
1767 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kAudio, kSsrc,
1768 sequnce_number++, clock_.TimeInMilliseconds(),
1769 kPacketSize.bytes());
1770 clock_.AdvanceTime(kPacketPacingTime);
1771 // Now process and make sure both packets were sent.
1772 pacer->ProcessPackets();
1773 ::testing::Mock::VerifyAndClearExpectations(&callback_);
1774
1775 // Add a video packet. I can't be sent until debt from audio
1776 // packets have been drained.
1777 pacer->EnqueuePacket(
1778 BuildPacket(RtpPacketMediaType::kVideo, kSsrc + 1, sequnce_number++,
1779 clock_.TimeInMilliseconds(), kPacketSize.bytes()));
1780 EXPECT_EQ(pacer->NextSendTime() - clock_.CurrentTime(), kPacketPacingTime);
1781 }
1782
TEST_F(PacingControllerTest,NextSendTimeAccountsForPadding)1783 TEST_F(PacingControllerTest, NextSendTimeAccountsForPadding) {
1784 const uint32_t kSsrc = 12345;
1785 const DataRate kPacingDataRate = DataRate::KilobitsPerSec(125);
1786 const DataSize kPacketSize = DataSize::Bytes(130);
1787 const TimeDelta kPacketPacingTime = kPacketSize / kPacingDataRate;
1788 uint32_t sequnce_number = 1;
1789 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
1790
1791 // Start with no padding.
1792 pacer->SetPacingRates(kPacingDataRate, DataRate::Zero());
1793
1794 // Send a single packet.
1795 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, kSsrc,
1796 sequnce_number++, clock_.TimeInMilliseconds(),
1797 kPacketSize.bytes());
1798 pacer->ProcessPackets();
1799 ::testing::Mock::VerifyAndClearExpectations(&callback_);
1800
1801 // With current conditions, no need to wake until next keep-alive.
1802 EXPECT_EQ(pacer->NextSendTime() - clock_.CurrentTime(),
1803 PacingController::kPausedProcessInterval);
1804
1805 // Enqueue a new packet, that can't be sent until previous buffer has
1806 // drained.
1807 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, kSsrc,
1808 sequnce_number++, clock_.TimeInMilliseconds(),
1809 kPacketSize.bytes());
1810 EXPECT_EQ(pacer->NextSendTime() - clock_.CurrentTime(), kPacketPacingTime);
1811 clock_.AdvanceTime(kPacketPacingTime);
1812 pacer->ProcessPackets();
1813 ::testing::Mock::VerifyAndClearExpectations(&callback_);
1814
1815 // With current conditions, again no need to wake until next keep-alive.
1816 EXPECT_EQ(pacer->NextSendTime() - clock_.CurrentTime(),
1817 PacingController::kPausedProcessInterval);
1818
1819 // Set a non-zero padding rate. Padding also can't be sent until
1820 // previous debt has cleared. Since padding was disabled before, there
1821 // currently is no padding debt.
1822 pacer->SetPacingRates(kPacingDataRate, kPacingDataRate / 2);
1823 EXPECT_EQ(pacer->NextSendTime() - clock_.CurrentTime(), kPacketPacingTime);
1824
1825 // Advance time, expect padding.
1826 EXPECT_CALL(callback_, SendPadding).WillOnce(Return(kPacketSize.bytes()));
1827 clock_.AdvanceTime(kPacketPacingTime);
1828 pacer->ProcessPackets();
1829 ::testing::Mock::VerifyAndClearExpectations(&callback_);
1830
1831 // Since padding rate is half of pacing rate, next time we can send
1832 // padding is double the packet pacing time.
1833 EXPECT_EQ(pacer->NextSendTime() - clock_.CurrentTime(),
1834 kPacketPacingTime * 2);
1835
1836 // Insert a packet to be sent, this take precedence again.
1837 pacer->EnqueuePacket(
1838 BuildPacket(RtpPacketMediaType::kVideo, kSsrc, sequnce_number++,
1839 clock_.TimeInMilliseconds(), kPacketSize.bytes()));
1840 EXPECT_EQ(pacer->NextSendTime() - clock_.CurrentTime(), kPacketPacingTime);
1841 }
1842
TEST_F(PacingControllerTest,PaddingTargetAccountsForPaddingRate)1843 TEST_F(PacingControllerTest, PaddingTargetAccountsForPaddingRate) {
1844 // Target size for a padding packet is 5ms * padding rate.
1845 const TimeDelta kPaddingTarget = TimeDelta::Millis(5);
1846 srand(0);
1847 // Need to initialize PacingController after we initialize clock.
1848 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
1849
1850 const uint32_t kSsrc = 12345;
1851 const DataRate kPacingDataRate = DataRate::KilobitsPerSec(125);
1852 const DataSize kPacketSize = DataSize::Bytes(130);
1853
1854 uint32_t sequnce_number = 1;
1855
1856 // Start with pacing and padding rate equal.
1857 pacer->SetPacingRates(kPacingDataRate, kPacingDataRate);
1858
1859 // Send a single packet.
1860 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, kSsrc,
1861 sequnce_number++, clock_.TimeInMilliseconds(),
1862 kPacketSize.bytes());
1863 AdvanceTimeUntil(pacer->NextSendTime());
1864 pacer->ProcessPackets();
1865 ::testing::Mock::VerifyAndClearExpectations(&callback_);
1866
1867 size_t expected_padding_target_bytes =
1868 (kPaddingTarget * kPacingDataRate).bytes();
1869 EXPECT_CALL(callback_, SendPadding(expected_padding_target_bytes))
1870 .WillOnce(Return(expected_padding_target_bytes));
1871 AdvanceTimeUntil(pacer->NextSendTime());
1872 pacer->ProcessPackets();
1873
1874 // Half the padding rate - expect half the padding target.
1875 pacer->SetPacingRates(kPacingDataRate, kPacingDataRate / 2);
1876 EXPECT_CALL(callback_, SendPadding(expected_padding_target_bytes / 2))
1877 .WillOnce(Return(expected_padding_target_bytes / 2));
1878 AdvanceTimeUntil(pacer->NextSendTime());
1879 pacer->ProcessPackets();
1880 }
1881
TEST_F(PacingControllerTest,SendsFecPackets)1882 TEST_F(PacingControllerTest, SendsFecPackets) {
1883 const uint32_t kSsrc = 12345;
1884 const uint32_t kFlexSsrc = 54321;
1885 uint16_t sequence_number = 1234;
1886 uint16_t flexfec_sequence_number = 4321;
1887 const size_t kPacketSize = 123;
1888 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
1889
1890 // Set pacing rate to 1000 packet/s, no padding.
1891 pacer->SetPacingRates(
1892 DataSize::Bytes(1000 * kPacketSize) / TimeDelta::Seconds(1),
1893 DataRate::Zero());
1894
1895 int64_t now = clock_.TimeInMilliseconds();
1896 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, kSsrc,
1897 sequence_number, now, kPacketSize));
1898 EXPECT_CALL(callback_, SendPacket(kSsrc, sequence_number, now, false, false));
1899 EXPECT_CALL(callback_, FetchFec).WillOnce([&]() {
1900 EXPECT_CALL(callback_, SendPacket(kFlexSsrc, flexfec_sequence_number, now,
1901 false, false));
1902 EXPECT_CALL(callback_, FetchFec);
1903 std::vector<std::unique_ptr<RtpPacketToSend>> fec_packets;
1904 fec_packets.push_back(
1905 BuildPacket(RtpPacketMediaType::kForwardErrorCorrection, kFlexSsrc,
1906 flexfec_sequence_number, now, kPacketSize));
1907 return fec_packets;
1908 });
1909 AdvanceTimeUntil(pacer->NextSendTime());
1910 pacer->ProcessPackets();
1911 AdvanceTimeUntil(pacer->NextSendTime());
1912 pacer->ProcessPackets();
1913 }
1914
TEST_F(PacingControllerTest,GapInPacingDoesntAccumulateBudget)1915 TEST_F(PacingControllerTest, GapInPacingDoesntAccumulateBudget) {
1916 const uint32_t kSsrc = 12345;
1917 uint16_t sequence_number = 1234;
1918 const DataSize kPackeSize = DataSize::Bytes(250);
1919 const TimeDelta kPacketSendTime = TimeDelta::Millis(15);
1920 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
1921
1922 pacer->SetPacingRates(kPackeSize / kPacketSendTime,
1923 /*padding_rate=*/DataRate::Zero());
1924
1925 // Send an initial packet.
1926 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, kSsrc,
1927 sequence_number++, clock_.TimeInMilliseconds(),
1928 kPackeSize.bytes());
1929 pacer->ProcessPackets();
1930 ::testing::Mock::VerifyAndClearExpectations(&callback_);
1931
1932 // Advance time kPacketSendTime past where the media debt should be 0.
1933 clock_.AdvanceTime(2 * kPacketSendTime);
1934
1935 // Enqueue two new packets. Expect only one to be sent one ProcessPackets().
1936 pacer->EnqueuePacket(
1937 BuildPacket(RtpPacketMediaType::kVideo, kSsrc, sequence_number + 1,
1938 clock_.TimeInMilliseconds(), kPackeSize.bytes()));
1939 pacer->EnqueuePacket(
1940 BuildPacket(RtpPacketMediaType::kVideo, kSsrc, sequence_number + 2,
1941 clock_.TimeInMilliseconds(), kPackeSize.bytes()));
1942 EXPECT_CALL(callback_, SendPacket(kSsrc, sequence_number + 1,
1943 clock_.TimeInMilliseconds(), false, false));
1944 pacer->ProcessPackets();
1945 }
1946
TEST_F(PacingControllerTest,HandlesSubMicrosecondSendIntervals)1947 TEST_F(PacingControllerTest, HandlesSubMicrosecondSendIntervals) {
1948 static constexpr DataSize kPacketSize = DataSize::Bytes(1);
1949 static constexpr TimeDelta kPacketSendTime = TimeDelta::Micros(1);
1950 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
1951
1952 // Set pacing rate such that a packet is sent in 0.5us.
1953 pacer->SetPacingRates(/*pacing_rate=*/2 * kPacketSize / kPacketSendTime,
1954 /*padding_rate=*/DataRate::Zero());
1955
1956 // Enqueue three packets, the first two should be sent immediately - the third
1957 // should cause a non-zero delta to the next process time.
1958 EXPECT_CALL(callback_, SendPacket).Times(2);
1959 for (int i = 0; i < 3; ++i) {
1960 pacer->EnqueuePacket(BuildPacket(
1961 RtpPacketMediaType::kVideo, /*ssrc=*/12345, /*sequence_number=*/i,
1962 clock_.TimeInMilliseconds(), kPacketSize.bytes()));
1963 }
1964 pacer->ProcessPackets();
1965
1966 EXPECT_GT(pacer->NextSendTime(), clock_.CurrentTime());
1967 }
1968
TEST_F(PacingControllerTest,HandlesSubMicrosecondPaddingInterval)1969 TEST_F(PacingControllerTest, HandlesSubMicrosecondPaddingInterval) {
1970 static constexpr DataSize kPacketSize = DataSize::Bytes(1);
1971 static constexpr TimeDelta kPacketSendTime = TimeDelta::Micros(1);
1972 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
1973
1974 // Set both pacing and padding rates to 1 byte per 0.5us.
1975 pacer->SetPacingRates(/*pacing_rate=*/2 * kPacketSize / kPacketSendTime,
1976 /*padding_rate=*/2 * kPacketSize / kPacketSendTime);
1977
1978 // Enqueue and send one packet.
1979 EXPECT_CALL(callback_, SendPacket);
1980 pacer->EnqueuePacket(BuildPacket(
1981 RtpPacketMediaType::kVideo, /*ssrc=*/12345, /*sequence_number=*/1234,
1982 clock_.TimeInMilliseconds(), kPacketSize.bytes()));
1983 pacer->ProcessPackets();
1984
1985 // The padding debt is now 1 byte, and the pacing time for that is lower than
1986 // the precision of a TimeStamp tick. Make sure the pacer still indicates a
1987 // non-zero sleep time is needed until the next process.
1988 EXPECT_GT(pacer->NextSendTime(), clock_.CurrentTime());
1989 }
1990
TEST_F(PacingControllerTest,SendsPacketsInBurstImmediately)1991 TEST_F(PacingControllerTest, SendsPacketsInBurstImmediately) {
1992 constexpr TimeDelta kMaxDelay = TimeDelta::Millis(20);
1993 PacingController pacer(&clock_, &callback_, trials_);
1994 pacer.SetSendBurstInterval(kMaxDelay);
1995 pacer.SetPacingRates(DataRate::BytesPerSec(10000), DataRate::Zero());
1996
1997 // Max allowed send burst size is 100000*20/1000) = 200byte
1998 pacer.EnqueuePacket(video_.BuildNextPacket(100));
1999 pacer.EnqueuePacket(video_.BuildNextPacket(100));
2000 pacer.EnqueuePacket(video_.BuildNextPacket(100));
2001 pacer.ProcessPackets();
2002 EXPECT_EQ(pacer.QueueSizePackets(), 1u);
2003 EXPECT_EQ(pacer.NextSendTime(), clock_.CurrentTime() + kMaxDelay);
2004
2005 AdvanceTimeUntil(pacer.NextSendTime());
2006 pacer.ProcessPackets();
2007 EXPECT_EQ(pacer.QueueSizePackets(), 0u);
2008 }
2009
TEST_F(PacingControllerTest,SendsPacketsInBurstEvenIfNotEnqueedAtSameTime)2010 TEST_F(PacingControllerTest, SendsPacketsInBurstEvenIfNotEnqueedAtSameTime) {
2011 constexpr TimeDelta kMaxDelay = TimeDelta::Millis(20);
2012 PacingController pacer(&clock_, &callback_, trials_);
2013 pacer.SetSendBurstInterval(kMaxDelay);
2014 pacer.SetPacingRates(DataRate::BytesPerSec(10000), DataRate::Zero());
2015 pacer.EnqueuePacket(video_.BuildNextPacket(200));
2016 EXPECT_EQ(pacer.NextSendTime(), clock_.CurrentTime());
2017 pacer.ProcessPackets();
2018 clock_.AdvanceTime(TimeDelta::Millis(1));
2019 pacer.EnqueuePacket(video_.BuildNextPacket(200));
2020 EXPECT_EQ(pacer.NextSendTime(), clock_.CurrentTime());
2021 pacer.ProcessPackets();
2022 EXPECT_EQ(pacer.QueueSizePackets(), 0u);
2023 }
2024
TEST_F(PacingControllerTest,RespectsTargetRateWhenSendingPacketsInBursts)2025 TEST_F(PacingControllerTest, RespectsTargetRateWhenSendingPacketsInBursts) {
2026 PacingController pacer(&clock_, &callback_, trials_);
2027 pacer.SetSendBurstInterval(TimeDelta::Millis(20));
2028 pacer.SetAccountForAudioPackets(true);
2029 pacer.SetPacingRates(DataRate::KilobitsPerSec(1000), DataRate::Zero());
2030 Timestamp start_time = clock_.CurrentTime();
2031 // Inject 100 packets, with size 1000bytes over 100ms.
2032 // Expect only 1Mbps / (8*1000) / 10 = 12 packets to be sent.
2033 // Packets are sent in burst. Each burst is then 3 packets * 1000bytes at
2034 // 1Mbits = 24ms long. Thus, expect 4 bursts.
2035 EXPECT_CALL(callback_, SendPacket).Times(12);
2036 int number_of_bursts = 0;
2037 while (clock_.CurrentTime() < start_time + TimeDelta::Millis(100)) {
2038 pacer.EnqueuePacket(video_.BuildNextPacket(1000));
2039 pacer.EnqueuePacket(video_.BuildNextPacket(1000));
2040 pacer.EnqueuePacket(video_.BuildNextPacket(1000));
2041 pacer.EnqueuePacket(video_.BuildNextPacket(1000));
2042 pacer.EnqueuePacket(video_.BuildNextPacket(1000));
2043 if (pacer.NextSendTime() <= clock_.CurrentTime()) {
2044 pacer.ProcessPackets();
2045 ++number_of_bursts;
2046 }
2047 clock_.AdvanceTime(TimeDelta::Millis(5));
2048 }
2049 EXPECT_EQ(pacer.QueueSizePackets(), 88u);
2050 EXPECT_EQ(number_of_bursts, 4);
2051 }
2052
TEST_F(PacingControllerTest,RespectsQueueTimeLimit)2053 TEST_F(PacingControllerTest, RespectsQueueTimeLimit) {
2054 static constexpr DataSize kPacketSize = DataSize::Bytes(100);
2055 static constexpr DataRate kNominalPacingRate = DataRate::KilobitsPerSec(200);
2056 static constexpr TimeDelta kPacketPacingTime =
2057 kPacketSize / kNominalPacingRate;
2058 static constexpr TimeDelta kQueueTimeLimit = TimeDelta::Millis(1000);
2059
2060 PacingController pacer(&clock_, &callback_, trials_);
2061 pacer.SetPacingRates(kNominalPacingRate, /*padding_rate=*/DataRate::Zero());
2062 pacer.SetQueueTimeLimit(kQueueTimeLimit);
2063
2064 // Fill pacer up to queue time limit.
2065 static constexpr int kNumPackets = kQueueTimeLimit / kPacketPacingTime;
2066 for (int i = 0; i < kNumPackets; ++i) {
2067 pacer.EnqueuePacket(video_.BuildNextPacket(kPacketSize.bytes()));
2068 }
2069 EXPECT_EQ(pacer.ExpectedQueueTime(), kQueueTimeLimit);
2070 EXPECT_EQ(pacer.pacing_rate(), kNominalPacingRate);
2071
2072 // Double the amount of packets in the queue, the queue time limit should
2073 // effectively double the pacing rate in response.
2074 for (int i = 0; i < kNumPackets; ++i) {
2075 pacer.EnqueuePacket(video_.BuildNextPacket(kPacketSize.bytes()));
2076 }
2077 EXPECT_EQ(pacer.ExpectedQueueTime(), kQueueTimeLimit);
2078 EXPECT_EQ(pacer.pacing_rate(), 2 * kNominalPacingRate);
2079
2080 // Send all the packets, should take as long as the queue time limit.
2081 Timestamp start_time = clock_.CurrentTime();
2082 while (pacer.QueueSizePackets() > 0) {
2083 AdvanceTimeUntil(pacer.NextSendTime());
2084 pacer.ProcessPackets();
2085 }
2086 EXPECT_EQ(clock_.CurrentTime() - start_time, kQueueTimeLimit);
2087
2088 // We're back in a normal state - pacing rate should be back to previous
2089 // levels.
2090 EXPECT_EQ(pacer.pacing_rate(), kNominalPacingRate);
2091 }
2092
TEST_F(PacingControllerTest,BudgetDoesNotAffectRetransmissionInsTrial)2093 TEST_F(PacingControllerTest, BudgetDoesNotAffectRetransmissionInsTrial) {
2094 const DataSize kPacketSize = DataSize::Bytes(1000);
2095
2096 EXPECT_CALL(callback_, SendPadding).Times(0);
2097 const test::ExplicitKeyValueConfig trials(
2098 "WebRTC-Pacer-FastRetransmissions/Enabled/");
2099 PacingController pacer(&clock_, &callback_, trials);
2100 pacer.SetPacingRates(kTargetRate, /*padding_rate=*/DataRate::Zero());
2101
2102 // Send a video packet so that we have a bit debt.
2103 pacer.EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, kVideoSsrc,
2104 /*sequence_number=*/1,
2105 /*capture_time=*/1, kPacketSize.bytes()));
2106 EXPECT_CALL(callback_, SendPacket);
2107 pacer.ProcessPackets();
2108 EXPECT_GT(pacer.NextSendTime(), clock_.CurrentTime());
2109
2110 // A retransmission packet should still be immediately processed.
2111 EXPECT_CALL(callback_, SendPacket);
2112 pacer.EnqueuePacket(BuildPacket(RtpPacketMediaType::kRetransmission,
2113 kVideoSsrc,
2114 /*sequence_number=*/1,
2115 /*capture_time=*/1, kPacketSize.bytes()));
2116 pacer.ProcessPackets();
2117 }
2118
TEST_F(PacingControllerTest,AbortsAfterReachingCircuitBreakLimit)2119 TEST_F(PacingControllerTest, AbortsAfterReachingCircuitBreakLimit) {
2120 const DataSize kPacketSize = DataSize::Bytes(1000);
2121
2122 EXPECT_CALL(callback_, SendPadding).Times(0);
2123 PacingController pacer(&clock_, &callback_, trials_);
2124 pacer.SetPacingRates(kTargetRate, /*padding_rate=*/DataRate::Zero());
2125
2126 // Set the circuit breaker to abort after one iteration of the main
2127 // sending loop.
2128 pacer.SetCircuitBreakerThreshold(1);
2129 EXPECT_CALL(callback_, SendPacket).Times(1);
2130
2131 // Send two packets.
2132 pacer.EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, kVideoSsrc,
2133 /*sequence_number=*/1,
2134 /*capture_time=*/1, kPacketSize.bytes()));
2135 pacer.EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, kVideoSsrc,
2136 /*sequence_number=*/2,
2137 /*capture_time=*/2, kPacketSize.bytes()));
2138
2139 // Advance time to way past where both should be eligible for sending.
2140 clock_.AdvanceTime(TimeDelta::Seconds(1));
2141
2142 pacer.ProcessPackets();
2143 }
2144
TEST_F(PacingControllerTest,DoesNotPadIfProcessThreadIsBorked)2145 TEST_F(PacingControllerTest, DoesNotPadIfProcessThreadIsBorked) {
2146 PacingControllerPadding callback;
2147 PacingController pacer(&clock_, &callback, trials_);
2148
2149 // Set both pacing and padding rate to be non-zero.
2150 pacer.SetPacingRates(kTargetRate, /*padding_rate=*/kTargetRate);
2151
2152 // Add one packet to the queue, but do not send it yet.
2153 pacer.EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, kVideoSsrc,
2154 /*sequence_number=*/1,
2155 /*capture_time=*/1,
2156 /*size=*/1000));
2157
2158 // Advance time to waaay after the packet should have been sent.
2159 clock_.AdvanceTime(TimeDelta::Seconds(42));
2160
2161 // `ProcessPackets()` should send the delayed packet, followed by a small
2162 // amount of missed padding.
2163 pacer.ProcessPackets();
2164
2165 // The max padding window is the max replay duration + the target padding
2166 // duration.
2167 const DataSize kMaxPadding = (PacingController::kMaxPaddingReplayDuration +
2168 PacingController::kTargetPaddingDuration) *
2169 kTargetRate;
2170
2171 EXPECT_LE(callback.padding_sent(), kMaxPadding.bytes<size_t>());
2172 }
2173
2174 } // namespace
2175 } // namespace webrtc
2176