blob: a092e01cf98392ca28516b246171e7022f5451ba [file] [log] [blame]
Erik Språngd05edec2019-08-14 10:43:47 +02001/*
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 "absl/memory/memory.h"
21#include "api/units/data_rate.h"
22#include "modules/pacing/packet_router.h"
23#include "system_wrappers/include/clock.h"
24#include "test/field_trial.h"
25#include "test/gmock.h"
26#include "test/gtest.h"
27
28using ::testing::_;
29using ::testing::Field;
30using ::testing::Pointee;
31using ::testing::Property;
32using ::testing::Return;
33
34namespace webrtc {
35namespace test {
36namespace {
37constexpr DataRate kFirstClusterRate = DataRate::KilobitsPerSec<900>();
38constexpr DataRate kSecondClusterRate = DataRate::KilobitsPerSec<1800>();
39
40// The error stems from truncating the time interval of probe packets to integer
41// values. This results in probing slightly higher than the target bitrate.
42// For 1.8 Mbps, this comes to be about 120 kbps with 1200 probe packets.
43constexpr DataRate kProbingErrorMargin = DataRate::KilobitsPerSec<150>();
44
45const float kPaceMultiplier = 2.5f;
46
47constexpr uint32_t kAudioSsrc = 12345;
48constexpr uint32_t kVideoSsrc = 234565;
49constexpr uint32_t kVideoRtxSsrc = 34567;
50constexpr uint32_t kFlexFecSsrc = 45678;
51
52constexpr DataRate kTargetRate = DataRate::KilobitsPerSec<800>();
53
54enum class PacerMode { kReferencePackets, kOwnPackets };
55std::string GetFieldTrialStirng(PacerMode mode) {
56 std::string field_trial = "WebRTC-Pacer-LegacyPacketReferencing/";
57 switch (mode) {
58 case PacerMode::kOwnPackets:
59 field_trial += "Disabled";
60 break;
61 case PacerMode::kReferencePackets:
62 field_trial += "Enabled";
63 break;
64 }
65 field_trial += "/";
66 return field_trial;
67}
68
69// TODO(bugs.webrtc.org/10633): Remove when packets are always owned by pacer.
70RtpPacketSender::Priority PacketTypeToPriority(RtpPacketToSend::Type type) {
71 switch (type) {
72 case RtpPacketToSend::Type::kAudio:
73 return RtpPacketSender::Priority::kHighPriority;
74 case RtpPacketToSend::Type::kVideo:
75 return RtpPacketSender::Priority::kLowPriority;
76 case RtpPacketToSend::Type::kRetransmission:
77 return RtpPacketSender::Priority::kNormalPriority;
78 case RtpPacketToSend::Type::kForwardErrorCorrection:
79 return RtpPacketSender::Priority::kLowPriority;
80 break;
81 case RtpPacketToSend::Type::kPadding:
82 RTC_NOTREACHED() << "Unexpected type for legacy path: kPadding";
83 break;
84 }
85 return RtpPacketSender::Priority::kLowPriority;
86}
87
88std::unique_ptr<RtpPacketToSend> BuildPacket(RtpPacketToSend::Type type,
89 uint32_t ssrc,
90 uint16_t sequence_number,
91 int64_t capture_time_ms,
92 size_t size) {
93 auto packet = absl::make_unique<RtpPacketToSend>(nullptr);
94 packet->set_packet_type(type);
95 packet->SetSsrc(ssrc);
96 packet->SetSequenceNumber(sequence_number);
97 packet->set_capture_time_ms(capture_time_ms);
98 packet->SetPayloadSize(size);
99 return packet;
100}
101} // namespace
102
103// Mock callback proxy, where both new and old api redirects to common mock
104// methods that focus on core aspects.
105class MockPacingControllerCallback : public PacingController::PacketSender {
106 public:
107 RtpPacketSendResult TimeToSendPacket(uint32_t ssrc,
108 uint16_t sequence_number,
109 int64_t capture_timestamp,
110 bool retransmission,
111 const PacedPacketInfo& packet_info) {
112 SendPacket(ssrc, sequence_number, capture_timestamp, retransmission, false);
113 return RtpPacketSendResult::kSuccess;
114 }
115
116 void SendRtpPacket(std::unique_ptr<RtpPacketToSend> packet,
117 const PacedPacketInfo& cluster_info) override {
118 SendPacket(packet->Ssrc(), packet->SequenceNumber(),
119 packet->capture_time_ms(),
120 packet->packet_type() == RtpPacketToSend::Type::kRetransmission,
121 packet->packet_type() == RtpPacketToSend::Type::kPadding);
122 }
123
124 DataSize TimeToSendPadding(DataSize size,
125 const PacedPacketInfo& packet_info) override {
126 return DataSize::bytes(SendPadding(size.bytes()));
127 }
128
129 std::vector<std::unique_ptr<RtpPacketToSend>> GeneratePadding(
130 DataSize target_size) override {
131 std::vector<std::unique_ptr<RtpPacketToSend>> ret;
132 size_t padding_size = SendPadding(target_size.bytes());
133 if (padding_size > 0) {
134 auto packet = absl::make_unique<RtpPacketToSend>(nullptr);
135 packet->SetPayloadSize(padding_size);
136 packet->set_packet_type(RtpPacketToSend::Type::kPadding);
137 ret.emplace_back(std::move(packet));
138 }
139 return ret;
140 }
141
142 MOCK_METHOD5(SendPacket,
143 void(uint32_t ssrc,
144 uint16_t sequence_number,
145 int64_t capture_timestamp,
146 bool retransmission,
147 bool padding));
148 MOCK_METHOD1(SendPadding, size_t(size_t target_size));
149};
150
151// Mock callback implementing the raw api.
152class MockPacketSender : public PacingController::PacketSender {
153 public:
154 MOCK_METHOD5(TimeToSendPacket,
155 RtpPacketSendResult(uint32_t ssrc,
156 uint16_t sequence_number,
157 int64_t capture_time_ms,
158 bool retransmission,
159 const PacedPacketInfo& pacing_info));
160 MOCK_METHOD2(TimeToSendPadding,
161 DataSize(DataSize size, const PacedPacketInfo& pacing_info));
162
163 MOCK_METHOD2(SendRtpPacket,
164 void(std::unique_ptr<RtpPacketToSend> packet,
165 const PacedPacketInfo& cluster_info));
166 MOCK_METHOD1(
167 GeneratePadding,
168 std::vector<std::unique_ptr<RtpPacketToSend>>(DataSize target_size));
169};
170
171class PacingControllerPadding : public PacingController::PacketSender {
172 public:
173 static const size_t kPaddingPacketSize = 224;
174
175 PacingControllerPadding() : padding_sent_(0) {}
176
177 RtpPacketSendResult TimeToSendPacket(
178 uint32_t ssrc,
179 uint16_t sequence_number,
180 int64_t capture_time_ms,
181 bool retransmission,
182 const PacedPacketInfo& pacing_info) override {
183 return RtpPacketSendResult::kSuccess;
184 }
185
186 void SendRtpPacket(std::unique_ptr<RtpPacketToSend> packet,
187 const PacedPacketInfo& pacing_info) override {}
188
189 DataSize TimeToSendPadding(DataSize size,
190 const PacedPacketInfo& pacing_info) override {
191 size_t num_packets =
192 (size.bytes() + kPaddingPacketSize - 1) / kPaddingPacketSize;
193 padding_sent_ += kPaddingPacketSize * num_packets;
194 return DataSize::bytes(kPaddingPacketSize * num_packets);
195 }
196
197 std::vector<std::unique_ptr<RtpPacketToSend>> GeneratePadding(
198 DataSize target_size) override {
199 size_t num_packets =
200 (target_size.bytes() + kPaddingPacketSize - 1) / kPaddingPacketSize;
201 std::vector<std::unique_ptr<RtpPacketToSend>> packets;
202 for (size_t i = 0; i < num_packets; ++i) {
203 packets.emplace_back(absl::make_unique<RtpPacketToSend>(nullptr));
204 packets.back()->SetPadding(kPaddingPacketSize);
205 packets.back()->set_packet_type(RtpPacketToSend::Type::kPadding);
206 padding_sent_ += kPaddingPacketSize;
207 }
208 return packets;
209 }
210
211 size_t padding_sent() { return padding_sent_; }
212
213 private:
214 size_t padding_sent_;
215};
216
217class PacingControllerProbing : public PacingController::PacketSender {
218 public:
219 PacingControllerProbing() : packets_sent_(0), padding_sent_(0) {}
220
221 RtpPacketSendResult TimeToSendPacket(
222 uint32_t ssrc,
223 uint16_t sequence_number,
224 int64_t capture_time_ms,
225 bool retransmission,
226 const PacedPacketInfo& pacing_info) override {
227 ++packets_sent_;
228 return RtpPacketSendResult::kSuccess;
229 }
230
231 void SendRtpPacket(std::unique_ptr<RtpPacketToSend> packet,
232 const PacedPacketInfo& pacing_info) override {
233 if (packet->packet_type() != RtpPacketToSend::Type::kPadding) {
234 ++packets_sent_;
235 }
236 }
237
238 DataSize TimeToSendPadding(DataSize size,
239 const PacedPacketInfo& pacing_info) override {
240 padding_sent_ += size.bytes();
241 return DataSize::bytes(padding_sent_);
242 }
243
244 std::vector<std::unique_ptr<RtpPacketToSend>> GeneratePadding(
245 DataSize target_size) override {
246 std::vector<std::unique_ptr<RtpPacketToSend>> packets;
247 packets.emplace_back(absl::make_unique<RtpPacketToSend>(nullptr));
248 packets.back()->SetPadding(target_size.bytes());
249 packets.back()->set_packet_type(RtpPacketToSend::Type::kPadding);
250 padding_sent_ += target_size.bytes();
251 return packets;
252 }
253
254 int packets_sent() const { return packets_sent_; }
255
256 int padding_sent() const { return padding_sent_; }
257
258 private:
259 int packets_sent_;
260 int padding_sent_;
261};
262
263class PacingControllerTest : public ::testing::TestWithParam<PacerMode> {
264 protected:
265 PacingControllerTest()
266 : clock_(123456), field_trial_(GetFieldTrialStirng(GetParam())) {
267 srand(0);
268 // Need to initialize PacingController after we initialize clock.
269 pacer_ = absl::make_unique<PacingController>(&clock_, &callback_, nullptr,
270 nullptr);
271 Init();
272 }
273
274 void Init() {
275 pacer_->CreateProbeCluster(kFirstClusterRate, /*cluster_id=*/0);
276 pacer_->CreateProbeCluster(kSecondClusterRate, /*cluster_id=*/1);
277 // Default to bitrate probing disabled for testing purposes. Probing tests
278 // have to enable probing, either by creating a new PacingController
279 // instance or by calling SetProbingEnabled(true).
280 pacer_->SetProbingEnabled(false);
281 pacer_->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
282
283 clock_.AdvanceTime(TimeUntilNextProcess());
284 }
285
286 void Send(RtpPacketToSend::Type type,
287 uint32_t ssrc,
288 uint16_t sequence_number,
289 int64_t capture_time_ms,
290 size_t size) {
291 if (GetParam() == PacerMode::kReferencePackets) {
292 pacer_->InsertPacket(PacketTypeToPriority(type), ssrc, sequence_number,
293 capture_time_ms, size,
294 type == RtpPacketToSend::Type::kRetransmission);
295 } else {
296 pacer_->EnqueuePacket(
297 BuildPacket(type, ssrc, sequence_number, capture_time_ms, size));
298 }
299 }
300
301 void SendAndExpectPacket(RtpPacketToSend::Type type,
302 uint32_t ssrc,
303 uint16_t sequence_number,
304 int64_t capture_time_ms,
305 size_t size) {
306 Send(type, ssrc, sequence_number, capture_time_ms, size);
307 EXPECT_CALL(
308 callback_,
309 SendPacket(ssrc, sequence_number, capture_time_ms,
310 type == RtpPacketToSend::Type::kRetransmission, false))
311 .Times(1);
312 }
313
314 void ExpectSendPadding() {
315 if (GetParam() == PacerMode::kOwnPackets) {
316 EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
317 }
318 }
319
320 std::unique_ptr<RtpPacketToSend> BuildRtpPacket(RtpPacketToSend::Type type) {
321 auto packet = absl::make_unique<RtpPacketToSend>(nullptr);
322 packet->set_packet_type(type);
323 switch (type) {
324 case RtpPacketToSend::Type::kAudio:
325 packet->SetSsrc(kAudioSsrc);
326 break;
327 case RtpPacketToSend::Type::kVideo:
328 packet->SetSsrc(kVideoSsrc);
329 break;
330 case RtpPacketToSend::Type::kRetransmission:
331 case RtpPacketToSend::Type::kPadding:
332 packet->SetSsrc(kVideoRtxSsrc);
333 break;
334 case RtpPacketToSend::Type::kForwardErrorCorrection:
335 packet->SetSsrc(kFlexFecSsrc);
336 break;
337 }
338
339 packet->SetPayloadSize(234);
340 return packet;
341 }
342
343 TimeDelta TimeUntilNextProcess() {
344 // TODO(bugs.webrtc.org/10809): Replace this with TimeUntilAvailableBudget()
345 // once ported from WIP code. For now, emulate PacedSender method.
346
347 TimeDelta elapsed_time = pacer_->TimeElapsedSinceLastProcess();
348 if (pacer_->IsPaused()) {
349 return std::max(PacingController::kPausedProcessInterval - elapsed_time,
350 TimeDelta::Zero());
351 }
352
353 auto next_probe = pacer_->TimeUntilNextProbe();
354 if (next_probe) {
355 return *next_probe;
356 }
357
358 const TimeDelta min_packet_limit = TimeDelta::ms(5);
359 return std::max(min_packet_limit - elapsed_time, TimeDelta::Zero());
360 }
361
362 SimulatedClock clock_;
363 ScopedFieldTrials field_trial_;
364 MockPacingControllerCallback callback_;
365 std::unique_ptr<PacingController> pacer_;
366};
367
368class PacingControllerFieldTrialTest
369 : public ::testing::TestWithParam<PacerMode> {
370 protected:
371 struct MediaStream {
372 const RtpPacketToSend::Type type;
373 const uint32_t ssrc;
374 const size_t packet_size;
375 uint16_t seq_num;
376 };
377
378 const int kProcessIntervalsPerSecond = 1000 / 5;
379
380 PacingControllerFieldTrialTest() : clock_(123456) {}
381 void InsertPacket(PacingController* pacer, MediaStream* stream) {
382 if (GetParam() == PacerMode::kReferencePackets) {
383 pacer->InsertPacket(PacketTypeToPriority(stream->type), stream->ssrc,
384 stream->seq_num++, clock_.TimeInMilliseconds(),
385 stream->packet_size, false);
386 } else {
387 pacer->EnqueuePacket(
388 BuildPacket(stream->type, stream->ssrc, stream->seq_num++,
389 clock_.TimeInMilliseconds(), stream->packet_size));
390 }
391 }
392 void ProcessNext(PacingController* pacer) {
393 clock_.AdvanceTimeMilliseconds(5);
394 pacer->ProcessPackets();
395 }
396 MediaStream audio{/*type*/ RtpPacketToSend::Type::kAudio,
397 /*ssrc*/ 3333, /*packet_size*/ 100, /*seq_num*/ 1000};
398 MediaStream video{/*type*/ RtpPacketToSend::Type::kVideo,
399 /*ssrc*/ 4444, /*packet_size*/ 1000, /*seq_num*/ 1000};
400 SimulatedClock clock_;
401 MockPacingControllerCallback callback_;
402};
403
404TEST_P(PacingControllerFieldTrialTest, DefaultNoPaddingInSilence) {
405 PacingController pacer(&clock_, &callback_, nullptr, nullptr);
406 pacer.SetPacingRates(kTargetRate, DataRate::Zero());
407 // Video packet to reset last send time and provide padding data.
408 InsertPacket(&pacer, &video);
409 EXPECT_CALL(callback_, SendPacket).Times(1);
410 clock_.AdvanceTimeMilliseconds(5);
411 pacer.ProcessPackets();
412 EXPECT_CALL(callback_, SendPadding).Times(0);
413 // Waiting 500 ms should not trigger sending of padding.
414 clock_.AdvanceTimeMilliseconds(500);
415 pacer.ProcessPackets();
416}
417
418TEST_P(PacingControllerFieldTrialTest, PaddingInSilenceWithTrial) {
419 ScopedFieldTrials trial(GetFieldTrialStirng(GetParam()) +
420 "WebRTC-Pacer-PadInSilence/Enabled/");
421 PacingController pacer(&clock_, &callback_, nullptr, nullptr);
422 pacer.SetPacingRates(kTargetRate, DataRate::Zero());
423 // Video packet to reset last send time and provide padding data.
424 InsertPacket(&pacer, &video);
425 if (GetParam() == PacerMode::kReferencePackets) {
426 // Only payload, not padding, sent by pacer in legacy mode.
427 EXPECT_CALL(callback_, SendPacket).Times(1);
428 } else {
429 EXPECT_CALL(callback_, SendPacket).Times(2);
430 }
431 clock_.AdvanceTimeMilliseconds(5);
432 pacer.ProcessPackets();
433 EXPECT_CALL(callback_, SendPadding).WillOnce(Return(1000));
434 // Waiting 500 ms should trigger sending of padding.
435 clock_.AdvanceTimeMilliseconds(500);
436 pacer.ProcessPackets();
437}
438
439TEST_P(PacingControllerFieldTrialTest, DefaultCongestionWindowAffectsAudio) {
440 EXPECT_CALL(callback_, SendPadding).Times(0);
441 PacingController pacer(&clock_, &callback_, nullptr, nullptr);
442 pacer.SetPacingRates(DataRate::bps(10000000), DataRate::Zero());
443 pacer.SetCongestionWindow(DataSize::bytes(800));
444 pacer.UpdateOutstandingData(DataSize::Zero());
445 // Video packet fills congestion window.
446 InsertPacket(&pacer, &video);
447 EXPECT_CALL(callback_, SendPacket).Times(1);
448 ProcessNext(&pacer);
449 // Audio packet blocked due to congestion.
450 InsertPacket(&pacer, &audio);
451 EXPECT_CALL(callback_, SendPacket).Times(0);
452 ProcessNext(&pacer);
453 ProcessNext(&pacer);
454 // Audio packet unblocked when congestion window clear.
455 ::testing::Mock::VerifyAndClearExpectations(&callback_);
456 pacer.UpdateOutstandingData(DataSize::Zero());
457 EXPECT_CALL(callback_, SendPacket).Times(1);
458 ProcessNext(&pacer);
459}
460
461TEST_P(PacingControllerFieldTrialTest,
462 CongestionWindowDoesNotAffectAudioInTrial) {
463 ScopedFieldTrials trial(GetFieldTrialStirng(GetParam()) +
464 "WebRTC-Pacer-BlockAudio/Disabled/");
465 EXPECT_CALL(callback_, SendPadding).Times(0);
466 PacingController pacer(&clock_, &callback_, nullptr, nullptr);
467 pacer.SetPacingRates(DataRate::bps(10000000), DataRate::Zero());
468 pacer.SetCongestionWindow(DataSize::bytes(800));
469 pacer.UpdateOutstandingData(DataSize::Zero());
470 // Video packet fills congestion window.
471 InsertPacket(&pacer, &video);
472 EXPECT_CALL(callback_, SendPacket).Times(1);
473 ProcessNext(&pacer);
474 // Audio not blocked due to congestion.
475 InsertPacket(&pacer, &audio);
476 EXPECT_CALL(callback_, SendPacket).Times(1);
477 ProcessNext(&pacer);
478}
479
480TEST_P(PacingControllerFieldTrialTest, DefaultBudgetAffectsAudio) {
481 PacingController pacer(&clock_, &callback_, nullptr, nullptr);
482 pacer.SetPacingRates(
483 DataRate::bps(video.packet_size / 3 * 8 * kProcessIntervalsPerSecond),
484 DataRate::Zero());
485 // Video fills budget for following process periods.
486 InsertPacket(&pacer, &video);
487 EXPECT_CALL(callback_, SendPacket).Times(1);
488 ProcessNext(&pacer);
489 // Audio packet blocked due to budget limit.
490 EXPECT_CALL(callback_, SendPacket).Times(0);
491 InsertPacket(&pacer, &audio);
492 ProcessNext(&pacer);
493 ProcessNext(&pacer);
494 ::testing::Mock::VerifyAndClearExpectations(&callback_);
495 // Audio packet unblocked when the budget has recovered.
496 EXPECT_CALL(callback_, SendPacket).Times(1);
497 ProcessNext(&pacer);
498 ProcessNext(&pacer);
499}
500
501TEST_P(PacingControllerFieldTrialTest, BudgetDoesNotAffectAudioInTrial) {
502 ScopedFieldTrials trial(GetFieldTrialStirng(GetParam()) +
503 "WebRTC-Pacer-BlockAudio/Disabled/");
504 EXPECT_CALL(callback_, SendPadding).Times(0);
505 PacingController pacer(&clock_, &callback_, nullptr, nullptr);
506 pacer.SetPacingRates(
507 DataRate::bps(video.packet_size / 3 * 8 * kProcessIntervalsPerSecond),
508 DataRate::Zero());
509 // Video fills budget for following process periods.
510 InsertPacket(&pacer, &video);
511 EXPECT_CALL(callback_, SendPacket).Times(1);
512 ProcessNext(&pacer);
513 // Audio packet not blocked due to budget limit.
514 EXPECT_CALL(callback_, SendPacket).Times(1);
515 InsertPacket(&pacer, &audio);
516 ProcessNext(&pacer);
517}
518
519INSTANTIATE_TEST_SUITE_P(ReferencingAndOwningPackets,
520 PacingControllerFieldTrialTest,
521 ::testing::Values(PacerMode::kReferencePackets,
522 PacerMode::kOwnPackets));
523
524TEST_P(PacingControllerTest, FirstSentPacketTimeIsSet) {
525 uint16_t sequence_number = 1234;
526 const uint32_t kSsrc = 12345;
527 const size_t kSizeBytes = 250;
528 const size_t kPacketToSend = 3;
529 const Timestamp kStartTime = clock_.CurrentTime();
530
531 // No packet sent.
532 EXPECT_FALSE(pacer_->FirstSentPacketTime().has_value());
533
534 for (size_t i = 0; i < kPacketToSend; ++i) {
535 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, kSsrc, sequence_number++,
536 clock_.TimeInMilliseconds(), kSizeBytes);
537 pacer_->ProcessPackets();
538 clock_.AdvanceTime(TimeUntilNextProcess());
539 }
540 EXPECT_EQ(kStartTime, pacer_->FirstSentPacketTime());
541}
542
543TEST_P(PacingControllerTest, QueuePacket) {
544 uint32_t ssrc = 12345;
545 uint16_t sequence_number = 1234;
546 // Due to the multiplicative factor we can send 5 packets during a send
547 // interval. (network capacity * multiplier / (8 bits per byte *
548 // (packet size * #send intervals per second)
549 const size_t packets_to_send =
550 kTargetRate.bps() * kPaceMultiplier / (8 * 250 * 200);
551 for (size_t i = 0; i < packets_to_send; ++i) {
552 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
553 clock_.TimeInMilliseconds(), 250);
554 }
555
556 int64_t queued_packet_timestamp = clock_.TimeInMilliseconds();
557 Send(RtpPacketToSend::Type::kVideo, ssrc, sequence_number,
558 queued_packet_timestamp, 250);
559 EXPECT_EQ(packets_to_send + 1, pacer_->QueueSizePackets());
560 pacer_->ProcessPackets();
561 EXPECT_CALL(callback_, SendPadding).Times(0);
562 clock_.AdvanceTimeMilliseconds(5);
563 EXPECT_EQ(1u, pacer_->QueueSizePackets());
564 EXPECT_CALL(callback_, SendPacket(ssrc, sequence_number++,
565 queued_packet_timestamp, false, false))
566 .Times(1);
567 pacer_->ProcessPackets();
568 sequence_number++;
569 EXPECT_EQ(0u, pacer_->QueueSizePackets());
570
571 // We can send packets_to_send -1 packets of size 250 during the current
572 // interval since one packet has already been sent.
573 for (size_t i = 0; i < packets_to_send - 1; ++i) {
574 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
575 clock_.TimeInMilliseconds(), 250);
576 }
577 Send(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
578 clock_.TimeInMilliseconds(), 250);
579 EXPECT_EQ(packets_to_send, pacer_->QueueSizePackets());
580 pacer_->ProcessPackets();
581 EXPECT_EQ(1u, pacer_->QueueSizePackets());
582}
583
584TEST_P(PacingControllerTest, PaceQueuedPackets) {
585 uint32_t ssrc = 12345;
586 uint16_t sequence_number = 1234;
587
588 // Due to the multiplicative factor we can send 5 packets during a send
589 // interval. (network capacity * multiplier / (8 bits per byte *
590 // (packet size * #send intervals per second)
591 const size_t packets_to_send_per_interval =
592 kTargetRate.bps() * kPaceMultiplier / (8 * 250 * 200);
593 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
594 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
595 clock_.TimeInMilliseconds(), 250);
596 }
597
598 for (size_t j = 0; j < packets_to_send_per_interval * 10; ++j) {
599 Send(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
600 clock_.TimeInMilliseconds(), 250);
601 }
602 EXPECT_EQ(packets_to_send_per_interval + packets_to_send_per_interval * 10,
603 pacer_->QueueSizePackets());
604 pacer_->ProcessPackets();
605 EXPECT_EQ(packets_to_send_per_interval * 10, pacer_->QueueSizePackets());
606 EXPECT_CALL(callback_, SendPadding).Times(0);
607 for (int k = 0; k < 10; ++k) {
608 clock_.AdvanceTime(TimeUntilNextProcess());
609 EXPECT_CALL(callback_, SendPacket(ssrc, _, _, false, false))
610 .Times(packets_to_send_per_interval);
611 pacer_->ProcessPackets();
612 }
613 EXPECT_EQ(0u, pacer_->QueueSizePackets());
614 clock_.AdvanceTime(TimeUntilNextProcess());
615 EXPECT_EQ(0u, pacer_->QueueSizePackets());
616 pacer_->ProcessPackets();
617
618 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
619 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
620 clock_.TimeInMilliseconds(), 250);
621 }
622 Send(RtpPacketToSend::Type::kVideo, ssrc, sequence_number,
623 clock_.TimeInMilliseconds(), 250);
624 pacer_->ProcessPackets();
625 EXPECT_EQ(1u, pacer_->QueueSizePackets());
626}
627
628TEST_P(PacingControllerTest, RepeatedRetransmissionsAllowed) {
629 // Send one packet, then two retransmissions of that packet.
630 for (size_t i = 0; i < 3; i++) {
631 constexpr uint32_t ssrc = 333;
632 constexpr uint16_t sequence_number = 444;
633 constexpr size_t bytes = 250;
634 bool is_retransmission = (i != 0); // Original followed by retransmissions.
635 SendAndExpectPacket(
636 is_retransmission ? RtpPacketToSend::Type::kRetransmission
637 : RtpPacketToSend::Type::kVideo,
638 ssrc, sequence_number, clock_.TimeInMilliseconds(), bytes);
639 clock_.AdvanceTimeMilliseconds(5);
640 }
641 pacer_->ProcessPackets();
642}
643
644TEST_P(PacingControllerTest,
645 CanQueuePacketsWithSameSequenceNumberOnDifferentSsrcs) {
646 uint32_t ssrc = 12345;
647 uint16_t sequence_number = 1234;
648
649 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number,
650 clock_.TimeInMilliseconds(), 250);
651
652 // Expect packet on second ssrc to be queued and sent as well.
653 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc + 1, sequence_number,
654 clock_.TimeInMilliseconds(), 250);
655
656 clock_.AdvanceTimeMilliseconds(1000);
657 pacer_->ProcessPackets();
658}
659
660TEST_P(PacingControllerTest, Padding) {
661 uint32_t ssrc = 12345;
662 uint16_t sequence_number = 1234;
663
664 pacer_->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
665
666 // Due to the multiplicative factor we can send 5 packets during a send
667 // interval. (network capacity * multiplier / (8 bits per byte *
668 // (packet size * #send intervals per second)
669 const size_t packets_to_send_per_interval =
670 kTargetRate.bps() * kPaceMultiplier / (8 * 250 * 200);
671 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
672 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
673 clock_.TimeInMilliseconds(), 250);
674 }
675 // No padding is expected since we have sent too much already.
676 EXPECT_CALL(callback_, SendPadding).Times(0);
677 pacer_->ProcessPackets();
678 EXPECT_EQ(0u, pacer_->QueueSizePackets());
679
680 // 5 milliseconds later should not send padding since we filled the buffers
681 // initially.
682 EXPECT_CALL(callback_, SendPadding(250)).Times(0);
683 clock_.AdvanceTime(TimeUntilNextProcess());
684 pacer_->ProcessPackets();
685
686 // 5 milliseconds later we have enough budget to send some padding.
687 EXPECT_CALL(callback_, SendPadding(250)).WillOnce(Return(250));
688 ExpectSendPadding();
689 clock_.AdvanceTime(TimeUntilNextProcess());
690 pacer_->ProcessPackets();
691}
692
693TEST_P(PacingControllerTest, NoPaddingBeforeNormalPacket) {
694 pacer_->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
695
696 EXPECT_CALL(callback_, SendPadding).Times(0);
697 pacer_->ProcessPackets();
698 clock_.AdvanceTime(TimeUntilNextProcess());
699
700 pacer_->ProcessPackets();
701 clock_.AdvanceTime(TimeUntilNextProcess());
702
703 uint32_t ssrc = 12345;
704 uint16_t sequence_number = 1234;
705 int64_t capture_time_ms = 56789;
706
707 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
708 capture_time_ms, 250);
709 EXPECT_CALL(callback_, SendPadding(250)).WillOnce(Return(250));
710 ExpectSendPadding();
711 pacer_->ProcessPackets();
712}
713
714TEST_P(PacingControllerTest, VerifyPaddingUpToBitrate) {
715 uint32_t ssrc = 12345;
716 uint16_t sequence_number = 1234;
717 int64_t capture_time_ms = 56789;
718 const int kTimeStep = 5;
719 const int64_t kBitrateWindow = 100;
720 pacer_->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
721
722 int64_t start_time = clock_.TimeInMilliseconds();
723 while (clock_.TimeInMilliseconds() - start_time < kBitrateWindow) {
724 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
725 capture_time_ms, 250);
726 EXPECT_CALL(callback_, SendPadding(250)).WillOnce(Return(250));
727 ExpectSendPadding();
728 pacer_->ProcessPackets();
729 clock_.AdvanceTimeMilliseconds(kTimeStep);
730 }
731}
732
733TEST_P(PacingControllerTest, VerifyAverageBitrateVaryingMediaPayload) {
734 uint32_t ssrc = 12345;
735 uint16_t sequence_number = 1234;
736 int64_t capture_time_ms = 56789;
737 const int kTimeStep = 5;
738 const int64_t kBitrateWindow = 10000;
739 PacingControllerPadding callback;
740 pacer_ =
741 absl::make_unique<PacingController>(&clock_, &callback, nullptr, nullptr);
742 pacer_->SetProbingEnabled(false);
743 pacer_->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
744
745 int64_t start_time = clock_.TimeInMilliseconds();
746 size_t media_bytes = 0;
747 while (clock_.TimeInMilliseconds() - start_time < kBitrateWindow) {
748 int rand_value = rand(); // NOLINT (rand_r instead of rand)
749 size_t media_payload = rand_value % 100 + 200; // [200, 300] bytes.
750 Send(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
751 capture_time_ms, media_payload);
752 media_bytes += media_payload;
753 clock_.AdvanceTimeMilliseconds(kTimeStep);
754 pacer_->ProcessPackets();
755 }
756 EXPECT_NEAR(kTargetRate.kbps(),
757 static_cast<int>(8 * (media_bytes + callback.padding_sent()) /
758 kBitrateWindow),
759 1);
760}
761
762TEST_P(PacingControllerTest, Priority) {
763 uint32_t ssrc_low_priority = 12345;
764 uint32_t ssrc = 12346;
765 uint16_t sequence_number = 1234;
766 int64_t capture_time_ms = 56789;
767 int64_t capture_time_ms_low_priority = 1234567;
768
769 // Due to the multiplicative factor we can send 5 packets during a send
770 // interval. (network capacity * multiplier / (8 bits per byte *
771 // (packet size * #send intervals per second)
772 const size_t packets_to_send_per_interval =
773 kTargetRate.bps() * kPaceMultiplier / (8 * 250 * 200);
774 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
775 SendAndExpectPacket(RtpPacketToSend::Type::kRetransmission, ssrc,
776 sequence_number++, clock_.TimeInMilliseconds(), 250);
777 }
778 pacer_->ProcessPackets();
779 EXPECT_EQ(0u, pacer_->QueueSizePackets());
780
781 // Expect normal and low priority to be queued and high to pass through.
782 Send(RtpPacketToSend::Type::kVideo, ssrc_low_priority, sequence_number++,
783 capture_time_ms_low_priority, 250);
784
785 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
786 Send(RtpPacketToSend::Type::kRetransmission, ssrc, sequence_number++,
787 capture_time_ms, 250);
788 }
789 Send(RtpPacketToSend::Type::kAudio, ssrc, sequence_number++, capture_time_ms,
790 250);
791
792 // Expect all high and normal priority to be sent out first.
793 EXPECT_CALL(callback_, SendPadding).Times(0);
794 EXPECT_CALL(callback_, SendPacket(ssrc, _, capture_time_ms, _, _))
795 .Times(packets_to_send_per_interval + 1);
796
797 clock_.AdvanceTime(TimeUntilNextProcess());
798 pacer_->ProcessPackets();
799 EXPECT_EQ(1u, pacer_->QueueSizePackets());
800
801 EXPECT_CALL(callback_, SendPacket(ssrc_low_priority, _,
802 capture_time_ms_low_priority, _, _))
803 .Times(1);
804
805 clock_.AdvanceTime(TimeUntilNextProcess());
806 pacer_->ProcessPackets();
807}
808
809TEST_P(PacingControllerTest, RetransmissionPriority) {
810 uint32_t ssrc = 12345;
811 uint16_t sequence_number = 1234;
812 int64_t capture_time_ms = 45678;
813 int64_t capture_time_ms_retransmission = 56789;
814
815 // Due to the multiplicative factor we can send 5 packets during a send
816 // interval. (network capacity * multiplier / (8 bits per byte *
817 // (packet size * #send intervals per second)
818 const size_t packets_to_send_per_interval =
819 kTargetRate.bps() * kPaceMultiplier / (8 * 250 * 200);
820 pacer_->ProcessPackets();
821 EXPECT_EQ(0u, pacer_->QueueSizePackets());
822
823 // Alternate retransmissions and normal packets.
824 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
825 Send(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
826 capture_time_ms, 250);
827 Send(RtpPacketToSend::Type::kRetransmission, ssrc, sequence_number++,
828 capture_time_ms_retransmission, 250);
829 }
830 EXPECT_EQ(2 * packets_to_send_per_interval, pacer_->QueueSizePackets());
831
832 // Expect all retransmissions to be sent out first despite having a later
833 // capture time.
834 EXPECT_CALL(callback_, SendPadding).Times(0);
835 EXPECT_CALL(callback_, SendPacket(_, _, _, false, _)).Times(0);
836 EXPECT_CALL(callback_,
837 SendPacket(ssrc, _, capture_time_ms_retransmission, true, _))
838 .Times(packets_to_send_per_interval);
839
840 clock_.AdvanceTime(TimeUntilNextProcess());
841 pacer_->ProcessPackets();
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 clock_.AdvanceTime(TimeUntilNextProcess());
851 pacer_->ProcessPackets();
852
853 EXPECT_EQ(0u, pacer_->QueueSizePackets());
854}
855
856TEST_P(PacingControllerTest, HighPrioDoesntAffectBudget) {
857 uint32_t ssrc = 12346;
858 uint16_t sequence_number = 1234;
859 int64_t capture_time_ms = 56789;
860
861 // As high prio packets doesn't affect the budget, we should be able to send
862 // a high number of them at once.
863 for (int i = 0; i < 25; ++i) {
864 SendAndExpectPacket(RtpPacketToSend::Type::kAudio, ssrc, sequence_number++,
865 capture_time_ms, 250);
866 }
867 pacer_->ProcessPackets();
868 // Low prio packets does affect the budget.
869 // Due to the multiplicative factor we can send 5 packets during a send
870 // interval. (network capacity * multiplier / (8 bits per byte *
871 // (packet size * #send intervals per second)
872 const size_t packets_to_send_per_interval =
873 kTargetRate.bps() * kPaceMultiplier / (8 * 250 * 200);
874 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
875 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
876 clock_.TimeInMilliseconds(), 250);
877 }
878 Send(RtpPacketToSend::Type::kVideo, ssrc, sequence_number, capture_time_ms,
879 250);
880 clock_.AdvanceTime(TimeUntilNextProcess());
881 pacer_->ProcessPackets();
882 EXPECT_EQ(1u, pacer_->QueueSizePackets());
883 EXPECT_CALL(callback_,
884 SendPacket(ssrc, sequence_number++, capture_time_ms, false, _))
885 .Times(1);
886 clock_.AdvanceTime(TimeUntilNextProcess());
887 pacer_->ProcessPackets();
888 EXPECT_EQ(0u, pacer_->QueueSizePackets());
889}
890
891TEST_P(PacingControllerTest, SendsOnlyPaddingWhenCongested) {
892 uint32_t ssrc = 202020;
893 uint16_t sequence_number = 1000;
894 int kPacketSize = 250;
895 int kCongestionWindow = kPacketSize * 10;
896
897 pacer_->UpdateOutstandingData(DataSize::Zero());
898 pacer_->SetCongestionWindow(DataSize::bytes(kCongestionWindow));
899 int sent_data = 0;
900 while (sent_data < kCongestionWindow) {
901 sent_data += kPacketSize;
902 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
903 clock_.TimeInMilliseconds(), kPacketSize);
904 clock_.AdvanceTimeMilliseconds(5);
905 pacer_->ProcessPackets();
906 }
907 ::testing::Mock::VerifyAndClearExpectations(&callback_);
908 EXPECT_CALL(callback_, SendPacket).Times(0);
909 EXPECT_CALL(callback_, SendPadding).Times(0);
910
911 size_t blocked_packets = 0;
912 int64_t expected_time_until_padding = 500;
913 while (expected_time_until_padding > 5) {
914 Send(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
915 clock_.TimeInMilliseconds(), kPacketSize);
916 blocked_packets++;
917 clock_.AdvanceTimeMilliseconds(5);
918 pacer_->ProcessPackets();
919 expected_time_until_padding -= 5;
920 }
921 ::testing::Mock::VerifyAndClearExpectations(&callback_);
922 EXPECT_CALL(callback_, SendPadding(1)).WillOnce(Return(1));
923 ExpectSendPadding();
924 clock_.AdvanceTimeMilliseconds(5);
925 pacer_->ProcessPackets();
926 EXPECT_EQ(blocked_packets, pacer_->QueueSizePackets());
927}
928
929TEST_P(PacingControllerTest, DoesNotAllowOveruseAfterCongestion) {
930 uint32_t ssrc = 202020;
931 uint16_t seq_num = 1000;
932 int size = 1000;
933 auto now_ms = [this] { return clock_.TimeInMilliseconds(); };
934 EXPECT_CALL(callback_, SendPadding).Times(0);
935 // The pacing rate is low enough that the budget should not allow two packets
936 // to be sent in a row.
937 pacer_->SetPacingRates(DataRate::bps(400 * 8 * 1000 / 5), DataRate::Zero());
938 // The congestion window is small enough to only let one packet through.
939 pacer_->SetCongestionWindow(DataSize::bytes(800));
940 pacer_->UpdateOutstandingData(DataSize::Zero());
941 // Not yet budget limited or congested, packet is sent.
942 Send(RtpPacketToSend::Type::kVideo, ssrc, seq_num++, now_ms(), size);
943 EXPECT_CALL(callback_, SendPacket).Times(1);
944 clock_.AdvanceTimeMilliseconds(5);
945 pacer_->ProcessPackets();
946 // Packet blocked due to congestion.
947 Send(RtpPacketToSend::Type::kVideo, ssrc, seq_num++, now_ms(), size);
948 EXPECT_CALL(callback_, SendPacket).Times(0);
949 clock_.AdvanceTimeMilliseconds(5);
950 pacer_->ProcessPackets();
951 // Packet blocked due to congestion.
952 Send(RtpPacketToSend::Type::kVideo, ssrc, seq_num++, now_ms(), size);
953 EXPECT_CALL(callback_, SendPacket).Times(0);
954 clock_.AdvanceTimeMilliseconds(5);
955 pacer_->ProcessPackets();
956 pacer_->UpdateOutstandingData(DataSize::Zero());
957 // Congestion removed and budget has recovered, packet is sent.
958 Send(RtpPacketToSend::Type::kVideo, ssrc, seq_num++, now_ms(), size);
959 EXPECT_CALL(callback_, SendPacket).Times(1);
960 clock_.AdvanceTimeMilliseconds(5);
961 pacer_->ProcessPackets();
962 pacer_->UpdateOutstandingData(DataSize::Zero());
963 // Should be blocked due to budget limitation as congestion has be removed.
964 Send(RtpPacketToSend::Type::kVideo, ssrc, seq_num++, now_ms(), size);
965 EXPECT_CALL(callback_, SendPacket).Times(0);
966 clock_.AdvanceTimeMilliseconds(5);
967 pacer_->ProcessPackets();
968}
969
970TEST_P(PacingControllerTest, ResumesSendingWhenCongestionEnds) {
971 uint32_t ssrc = 202020;
972 uint16_t sequence_number = 1000;
973 int64_t kPacketSize = 250;
974 int64_t kCongestionCount = 10;
975 int64_t kCongestionWindow = kPacketSize * kCongestionCount;
976 int64_t kCongestionTimeMs = 1000;
977
978 pacer_->UpdateOutstandingData(DataSize::Zero());
979 pacer_->SetCongestionWindow(DataSize::bytes(kCongestionWindow));
980 int sent_data = 0;
981 while (sent_data < kCongestionWindow) {
982 sent_data += kPacketSize;
983 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
984 clock_.TimeInMilliseconds(), kPacketSize);
985 clock_.AdvanceTimeMilliseconds(5);
986 pacer_->ProcessPackets();
987 }
988 ::testing::Mock::VerifyAndClearExpectations(&callback_);
989 EXPECT_CALL(callback_, SendPacket).Times(0);
990 int unacked_packets = 0;
991 for (int duration = 0; duration < kCongestionTimeMs; duration += 5) {
992 Send(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
993 clock_.TimeInMilliseconds(), kPacketSize);
994 unacked_packets++;
995 clock_.AdvanceTimeMilliseconds(5);
996 pacer_->ProcessPackets();
997 }
998 ::testing::Mock::VerifyAndClearExpectations(&callback_);
999
1000 // First mark half of the congested packets as cleared and make sure that just
1001 // as many are sent
1002 int ack_count = kCongestionCount / 2;
1003 EXPECT_CALL(callback_, SendPacket(ssrc, _, _, false, _)).Times(ack_count);
1004 pacer_->UpdateOutstandingData(
1005 DataSize::bytes(kCongestionWindow - kPacketSize * ack_count));
1006
1007 for (int duration = 0; duration < kCongestionTimeMs; duration += 5) {
1008 clock_.AdvanceTimeMilliseconds(5);
1009 pacer_->ProcessPackets();
1010 }
1011 unacked_packets -= ack_count;
1012 ::testing::Mock::VerifyAndClearExpectations(&callback_);
1013
1014 // Second make sure all packets are sent if sent packets are continuously
1015 // marked as acked.
1016 EXPECT_CALL(callback_, SendPacket(ssrc, _, _, false, _))
1017 .Times(unacked_packets);
1018 for (int duration = 0; duration < kCongestionTimeMs; duration += 5) {
1019 pacer_->UpdateOutstandingData(DataSize::Zero());
1020 clock_.AdvanceTimeMilliseconds(5);
1021 pacer_->ProcessPackets();
1022 }
1023}
1024
1025TEST_P(PacingControllerTest, Pause) {
1026 uint32_t ssrc_low_priority = 12345;
1027 uint32_t ssrc = 12346;
1028 uint32_t ssrc_high_priority = 12347;
1029 uint16_t sequence_number = 1234;
1030 int64_t capture_time_ms = clock_.TimeInMilliseconds();
1031
1032 EXPECT_EQ(TimeDelta::Zero(), pacer_->OldestPacketWaitTime());
1033
1034 // Due to the multiplicative factor we can send 5 packets during a send
1035 // interval. (network capacity * multiplier / (8 bits per byte *
1036 // (packet size * #send intervals per second)
1037 const size_t packets_to_send_per_interval =
1038 kTargetRate.bps() * kPaceMultiplier / (8 * 250 * 200);
1039 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
1040 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
1041 clock_.TimeInMilliseconds(), 250);
1042 }
1043
1044 pacer_->ProcessPackets();
1045
1046 pacer_->Pause();
1047
1048 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
1049 Send(RtpPacketToSend::Type::kVideo, ssrc_low_priority, sequence_number++,
1050 capture_time_ms, 250);
1051 Send(RtpPacketToSend::Type::kRetransmission, ssrc, sequence_number++,
1052 capture_time_ms, 250);
1053 Send(RtpPacketToSend::Type::kAudio, ssrc_high_priority, sequence_number++,
1054 capture_time_ms, 250);
1055 }
1056 clock_.AdvanceTimeMilliseconds(10000);
1057 int64_t second_capture_time_ms = clock_.TimeInMilliseconds();
1058 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
1059 Send(RtpPacketToSend::Type::kVideo, ssrc_low_priority, sequence_number++,
1060 second_capture_time_ms, 250);
1061 Send(RtpPacketToSend::Type::kRetransmission, ssrc, sequence_number++,
1062 second_capture_time_ms, 250);
1063 Send(RtpPacketToSend::Type::kAudio, ssrc_high_priority, sequence_number++,
1064 second_capture_time_ms, 250);
1065 }
1066
1067 // Expect everything to be queued.
1068 EXPECT_EQ(TimeDelta::ms(second_capture_time_ms - capture_time_ms),
1069 pacer_->OldestPacketWaitTime());
1070
1071 EXPECT_CALL(callback_, SendPadding(1)).WillOnce(Return(1));
1072 ExpectSendPadding();
1073 pacer_->ProcessPackets();
1074
1075 int64_t expected_time_until_send = 500;
1076 EXPECT_CALL(callback_, SendPadding).Times(0);
1077 while (expected_time_until_send >= 5) {
1078 pacer_->ProcessPackets();
1079 clock_.AdvanceTimeMilliseconds(5);
1080 expected_time_until_send -= 5;
1081 }
1082
1083 ::testing::Mock::VerifyAndClearExpectations(&callback_);
1084 EXPECT_CALL(callback_, SendPadding(1)).WillOnce(Return(1));
1085 ExpectSendPadding();
1086 clock_.AdvanceTimeMilliseconds(5);
1087 pacer_->ProcessPackets();
1088 ::testing::Mock::VerifyAndClearExpectations(&callback_);
1089
1090 // Expect high prio packets to come out first followed by normal
1091 // prio packets and low prio packets (all in capture order).
1092 {
1093 ::testing::InSequence sequence;
1094 EXPECT_CALL(callback_,
1095 SendPacket(ssrc_high_priority, _, capture_time_ms, _, _))
1096 .Times(packets_to_send_per_interval);
1097 EXPECT_CALL(callback_,
1098 SendPacket(ssrc_high_priority, _, second_capture_time_ms, _, _))
1099 .Times(packets_to_send_per_interval);
1100
1101 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
1102 EXPECT_CALL(callback_, SendPacket(ssrc, _, capture_time_ms, _, _))
1103 .Times(1);
1104 }
1105 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
1106 EXPECT_CALL(callback_, SendPacket(ssrc, _, second_capture_time_ms, _, _))
1107 .Times(1);
1108 }
1109 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
1110 EXPECT_CALL(callback_,
1111 SendPacket(ssrc_low_priority, _, capture_time_ms, _, _))
1112 .Times(1);
1113 }
1114 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
1115 EXPECT_CALL(callback_, SendPacket(ssrc_low_priority, _,
1116 second_capture_time_ms, _, _))
1117 .Times(1);
1118 }
1119 }
1120 pacer_->Resume();
1121
1122 // The pacer was resumed directly after the previous process call finished. It
1123 // will therefore wait 5 ms until next process.
1124 clock_.AdvanceTime(TimeUntilNextProcess());
1125
1126 for (size_t i = 0; i < 4; i++) {
1127 pacer_->ProcessPackets();
1128 clock_.AdvanceTime(TimeUntilNextProcess());
1129 }
1130
1131 EXPECT_EQ(TimeDelta::Zero(), pacer_->OldestPacketWaitTime());
1132}
1133
1134TEST_P(PacingControllerTest, ResendPacket) {
1135 if (GetParam() == PacerMode::kOwnPackets) {
1136 // This test only makes sense when re-sending is supported.
1137 return;
1138 }
1139
1140 MockPacketSender callback;
1141
1142 // Need to initialize PacedSender after we initialize clock.
1143 pacer_ =
1144 absl::make_unique<PacingController>(&clock_, &callback, nullptr, nullptr);
1145 Init();
1146
1147 uint32_t ssrc = 12346;
1148 uint16_t sequence_number = 1234;
1149 int64_t capture_time_ms = clock_.TimeInMilliseconds();
1150 EXPECT_EQ(TimeDelta::Zero(), pacer_->OldestPacketWaitTime());
1151
1152 pacer_->InsertPacket(RtpPacketSender::kNormalPriority, ssrc, sequence_number,
1153 capture_time_ms, 250, false);
1154 clock_.AdvanceTimeMilliseconds(1);
1155 pacer_->InsertPacket(RtpPacketSender::kNormalPriority, ssrc,
1156 sequence_number + 1, capture_time_ms + 1, 250, false);
1157 clock_.AdvanceTimeMilliseconds(9999);
1158 EXPECT_EQ(TimeDelta::ms(clock_.TimeInMilliseconds() - capture_time_ms),
1159 pacer_->OldestPacketWaitTime());
1160 // Fails to send first packet so only one call.
1161 EXPECT_CALL(callback, TimeToSendPacket(ssrc, sequence_number, capture_time_ms,
1162 false, _))
1163 .Times(1)
1164 .WillOnce(Return(RtpPacketSendResult::kTransportUnavailable));
1165 clock_.AdvanceTimeMilliseconds(10000);
1166 pacer_->ProcessPackets();
1167
1168 // Queue remains unchanged.
1169 EXPECT_EQ(TimeDelta::ms(clock_.TimeInMilliseconds() - capture_time_ms),
1170 pacer_->OldestPacketWaitTime());
1171
1172 // Fails to send second packet.
1173 EXPECT_CALL(callback, TimeToSendPacket(ssrc, sequence_number, capture_time_ms,
1174 false, _))
1175 .WillOnce(Return(RtpPacketSendResult::kSuccess));
1176 EXPECT_CALL(callback, TimeToSendPacket(ssrc, sequence_number + 1,
1177 capture_time_ms + 1, false, _))
1178 .WillOnce(Return(RtpPacketSendResult::kTransportUnavailable));
1179 clock_.AdvanceTimeMilliseconds(10000);
1180 pacer_->ProcessPackets();
1181
1182 // Queue is reduced by 1 packet.
1183 EXPECT_EQ(TimeDelta::ms(clock_.TimeInMilliseconds() - capture_time_ms - 1),
1184 pacer_->OldestPacketWaitTime());
1185
1186 // Send second packet and queue becomes empty.
1187 EXPECT_CALL(callback, TimeToSendPacket(ssrc, sequence_number + 1,
1188 capture_time_ms + 1, false, _))
1189 .WillOnce(Return(RtpPacketSendResult::kSuccess));
1190 clock_.AdvanceTimeMilliseconds(10000);
1191 pacer_->ProcessPackets();
1192 EXPECT_EQ(TimeDelta::Zero(), pacer_->OldestPacketWaitTime());
1193}
1194
1195TEST_P(PacingControllerTest, ExpectedQueueTimeMs) {
1196 uint32_t ssrc = 12346;
1197 uint16_t sequence_number = 1234;
1198 const size_t kNumPackets = 60;
1199 const size_t kPacketSize = 1200;
1200 const int32_t kMaxBitrate = kPaceMultiplier * 30000;
1201 EXPECT_EQ(TimeDelta::Zero(), pacer_->OldestPacketWaitTime());
1202
1203 pacer_->SetPacingRates(DataRate::bps(30000 * kPaceMultiplier),
1204 DataRate::Zero());
1205 for (size_t i = 0; i < kNumPackets; ++i) {
1206 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
1207 clock_.TimeInMilliseconds(), kPacketSize);
1208 }
1209
1210 // Queue in ms = 1000 * (bytes in queue) *8 / (bits per second)
1211 TimeDelta queue_time =
1212 TimeDelta::ms(1000 * kNumPackets * kPacketSize * 8 / kMaxBitrate);
1213 EXPECT_EQ(queue_time, pacer_->ExpectedQueueTime());
1214
1215 const Timestamp time_start = clock_.CurrentTime();
1216 while (pacer_->QueueSizePackets() > 0) {
1217 clock_.AdvanceTime(TimeUntilNextProcess());
1218 pacer_->ProcessPackets();
1219 }
1220 TimeDelta duration = clock_.CurrentTime() - time_start;
1221
1222 EXPECT_EQ(TimeDelta::Zero(), pacer_->ExpectedQueueTime());
1223
1224 // Allow for aliasing, duration should be within one pack of max time limit.
1225 const TimeDelta deviation =
1226 duration - PacingController::kMaxExpectedQueueLength;
1227 EXPECT_LT(deviation.Abs(),
1228 TimeDelta::ms(1000 * kPacketSize * 8 / kMaxBitrate));
1229}
1230
1231TEST_P(PacingControllerTest, QueueTimeGrowsOverTime) {
1232 uint32_t ssrc = 12346;
1233 uint16_t sequence_number = 1234;
1234 EXPECT_EQ(TimeDelta::Zero(), pacer_->OldestPacketWaitTime());
1235
1236 pacer_->SetPacingRates(DataRate::bps(30000 * kPaceMultiplier),
1237 DataRate::Zero());
1238 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number,
1239 clock_.TimeInMilliseconds(), 1200);
1240
1241 clock_.AdvanceTimeMilliseconds(500);
1242 EXPECT_EQ(TimeDelta::ms(500), pacer_->OldestPacketWaitTime());
1243 pacer_->ProcessPackets();
1244 EXPECT_EQ(TimeDelta::Zero(), pacer_->OldestPacketWaitTime());
1245}
1246
1247TEST_P(PacingControllerTest, ProbingWithInsertedPackets) {
1248 const size_t kPacketSize = 1200;
1249 const int kInitialBitrateBps = 300000;
1250 uint32_t ssrc = 12346;
1251 uint16_t sequence_number = 1234;
1252
1253 PacingControllerProbing packet_sender;
1254 pacer_ = absl::make_unique<PacingController>(&clock_, &packet_sender, nullptr,
1255 nullptr);
1256 pacer_->CreateProbeCluster(kFirstClusterRate,
1257 /*cluster_id=*/0);
1258 pacer_->CreateProbeCluster(kSecondClusterRate,
1259 /*cluster_id=*/1);
1260 pacer_->SetPacingRates(DataRate::bps(kInitialBitrateBps * kPaceMultiplier),
1261 DataRate::Zero());
1262
1263 for (int i = 0; i < 10; ++i) {
1264 Send(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
1265 clock_.TimeInMilliseconds(), kPacketSize);
1266 }
1267
1268 int64_t start = clock_.TimeInMilliseconds();
1269 while (packet_sender.packets_sent() < 5) {
1270 clock_.AdvanceTime(TimeUntilNextProcess());
1271 pacer_->ProcessPackets();
1272 }
1273 int packets_sent = packet_sender.packets_sent();
1274 // Validate first cluster bitrate. Note that we have to account for number
1275 // of intervals and hence (packets_sent - 1) on the first cluster.
1276 EXPECT_NEAR((packets_sent - 1) * kPacketSize * 8000 /
1277 (clock_.TimeInMilliseconds() - start),
1278 kFirstClusterRate.bps(), kProbingErrorMargin.bps());
1279 EXPECT_EQ(0, packet_sender.padding_sent());
1280
1281 clock_.AdvanceTime(TimeUntilNextProcess());
1282 start = clock_.TimeInMilliseconds();
1283 while (packet_sender.packets_sent() < 10) {
1284 clock_.AdvanceTime(TimeUntilNextProcess());
1285 pacer_->ProcessPackets();
1286 }
1287 packets_sent = packet_sender.packets_sent() - packets_sent;
1288 // Validate second cluster bitrate.
1289 EXPECT_NEAR((packets_sent - 1) * kPacketSize * 8000 /
1290 (clock_.TimeInMilliseconds() - start),
1291 kSecondClusterRate.bps(), kProbingErrorMargin.bps());
1292}
1293
1294TEST_P(PacingControllerTest, ProbingWithPaddingSupport) {
1295 const size_t kPacketSize = 1200;
1296 const int kInitialBitrateBps = 300000;
1297 uint32_t ssrc = 12346;
1298 uint16_t sequence_number = 1234;
1299
1300 PacingControllerProbing packet_sender;
1301 pacer_ = absl::make_unique<PacingController>(&clock_, &packet_sender, nullptr,
1302 nullptr);
1303 pacer_->CreateProbeCluster(kFirstClusterRate,
1304 /*cluster_id=*/0);
1305 pacer_->SetPacingRates(DataRate::bps(kInitialBitrateBps * kPaceMultiplier),
1306 DataRate::Zero());
1307
1308 for (int i = 0; i < 3; ++i) {
1309 Send(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
1310 clock_.TimeInMilliseconds(), kPacketSize);
1311 }
1312
1313 int64_t start = clock_.TimeInMilliseconds();
1314 int process_count = 0;
1315 while (process_count < 5) {
1316 clock_.AdvanceTime(TimeUntilNextProcess());
1317 pacer_->ProcessPackets();
1318 ++process_count;
1319 }
1320 int packets_sent = packet_sender.packets_sent();
1321 int padding_sent = packet_sender.padding_sent();
1322 EXPECT_GT(packets_sent, 0);
1323 EXPECT_GT(padding_sent, 0);
1324 // Note that the number of intervals here for kPacketSize is
1325 // packets_sent due to padding in the same cluster.
1326 EXPECT_NEAR((packets_sent * kPacketSize * 8000 + padding_sent) /
1327 (clock_.TimeInMilliseconds() - start),
1328 kFirstClusterRate.bps(), kProbingErrorMargin.bps());
1329}
1330
1331TEST_P(PacingControllerTest, PaddingOveruse) {
1332 uint32_t ssrc = 12346;
1333 uint16_t sequence_number = 1234;
1334 const size_t kPacketSize = 1200;
1335
1336 pacer_->ProcessPackets();
1337 pacer_->SetPacingRates(DataRate::bps(60000 * kPaceMultiplier),
1338 DataRate::Zero());
1339
1340 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
1341 clock_.TimeInMilliseconds(), kPacketSize);
1342 pacer_->ProcessPackets();
1343
1344 // Add 30kbit padding. When increasing budget, media budget will increase from
1345 // negative (overuse) while padding budget will increase from 0.
1346 clock_.AdvanceTimeMilliseconds(5);
1347 pacer_->SetPacingRates(DataRate::bps(60000 * kPaceMultiplier),
1348 DataRate::bps(30000));
1349
1350 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
1351 clock_.TimeInMilliseconds(), kPacketSize);
1352 EXPECT_LT(TimeDelta::ms(5), pacer_->ExpectedQueueTime());
1353 // Don't send padding if queue is non-empty, even if padding budget > 0.
1354 EXPECT_CALL(callback_, SendPadding).Times(0);
1355 pacer_->ProcessPackets();
1356}
1357
1358TEST_P(PacingControllerTest, ProbeClusterId) {
1359 MockPacketSender callback;
1360
1361 pacer_ =
1362 absl::make_unique<PacingController>(&clock_, &callback, nullptr, nullptr);
1363 Init();
1364
1365 uint32_t ssrc = 12346;
1366 uint16_t sequence_number = 1234;
1367 const size_t kPacketSize = 1200;
1368
1369 pacer_->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
1370 pacer_->SetProbingEnabled(true);
1371 for (int i = 0; i < 10; ++i) {
1372 Send(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
1373 clock_.TimeInMilliseconds(), kPacketSize);
1374 }
1375
1376 // First probing cluster.
1377 if (GetParam() == PacerMode::kReferencePackets) {
1378 EXPECT_CALL(callback,
1379 TimeToSendPacket(_, _, _, _,
1380 Field(&PacedPacketInfo::probe_cluster_id, 0)))
1381 .Times(5)
1382 .WillRepeatedly(Return(RtpPacketSendResult::kSuccess));
1383 } else {
1384 EXPECT_CALL(callback,
1385 SendRtpPacket(_, Field(&PacedPacketInfo::probe_cluster_id, 0)))
1386 .Times(5);
1387 }
1388
1389 for (int i = 0; i < 5; ++i) {
1390 clock_.AdvanceTimeMilliseconds(20);
1391 pacer_->ProcessPackets();
1392 }
1393
1394 // Second probing cluster.
1395 if (GetParam() == PacerMode::kReferencePackets) {
1396 EXPECT_CALL(callback,
1397 TimeToSendPacket(_, _, _, _,
1398 Field(&PacedPacketInfo::probe_cluster_id, 1)))
1399 .Times(5)
1400 .WillRepeatedly(Return(RtpPacketSendResult::kSuccess));
1401 EXPECT_CALL(callback, TimeToSendPadding).WillOnce(Return(DataSize::Zero()));
1402 } else {
1403 EXPECT_CALL(callback,
1404 SendRtpPacket(_, Field(&PacedPacketInfo::probe_cluster_id, 1)))
1405 .Times(5);
1406 }
1407
1408 for (int i = 0; i < 5; ++i) {
1409 clock_.AdvanceTimeMilliseconds(20);
1410 pacer_->ProcessPackets();
1411 }
1412
1413 // Needed for the Field comparer below.
1414 const int kNotAProbe = PacedPacketInfo::kNotAProbe;
1415 // No more probing packets.
1416 if (GetParam() == PacerMode::kReferencePackets) {
1417 EXPECT_CALL(callback,
1418 TimeToSendPadding(
1419 _, Field(&PacedPacketInfo::probe_cluster_id, kNotAProbe)))
1420 .WillOnce(Return(DataSize::bytes(500)));
1421 } else {
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(RtpPacketToSend::Type::kPadding, ssrc, sequence_number++,
1426 clock_.TimeInMilliseconds(), padding_size.bytes()));
1427 return padding_packets;
1428 });
1429 EXPECT_CALL(
1430 callback,
1431 SendRtpPacket(_, Field(&PacedPacketInfo::probe_cluster_id, kNotAProbe)))
1432 .Times(1);
1433 }
1434 pacer_->ProcessPackets();
1435}
1436
1437TEST_P(PacingControllerTest, OwnedPacketPrioritizedOnType) {
1438 if (GetParam() != PacerMode::kOwnPackets) {
1439 // This test only makes sense when using the new code path.
1440 return;
1441 }
1442
1443 MockPacketSender callback;
1444 pacer_ =
1445 absl::make_unique<PacingController>(&clock_, &callback, nullptr, nullptr);
1446 Init();
1447
1448 // Insert a packet of each type, from low to high priority. Since priority
1449 // is weighted higher than insert order, these should come out of the pacer
1450 // in backwards order with the exception of FEC and Video.
1451 for (RtpPacketToSend::Type type :
1452 {RtpPacketToSend::Type::kPadding,
1453 RtpPacketToSend::Type::kForwardErrorCorrection,
1454 RtpPacketToSend::Type::kVideo, RtpPacketToSend::Type::kRetransmission,
1455 RtpPacketToSend::Type::kAudio}) {
1456 pacer_->EnqueuePacket(BuildRtpPacket(type));
1457 }
1458
1459 ::testing::InSequence seq;
1460 EXPECT_CALL(
1461 callback,
1462 SendRtpPacket(Pointee(Property(&RtpPacketToSend::Ssrc, kAudioSsrc)), _));
1463 EXPECT_CALL(callback,
1464 SendRtpPacket(
1465 Pointee(Property(&RtpPacketToSend::Ssrc, kVideoRtxSsrc)), _));
1466
1467 // FEC and video actually have the same priority, so will come out in
1468 // insertion order.
1469 EXPECT_CALL(callback,
1470 SendRtpPacket(
1471 Pointee(Property(&RtpPacketToSend::Ssrc, kFlexFecSsrc)), _));
1472 EXPECT_CALL(
1473 callback,
1474 SendRtpPacket(Pointee(Property(&RtpPacketToSend::Ssrc, kVideoSsrc)), _));
1475
1476 EXPECT_CALL(callback,
1477 SendRtpPacket(
1478 Pointee(Property(&RtpPacketToSend::Ssrc, kVideoRtxSsrc)), _));
1479
1480 clock_.AdvanceTimeMilliseconds(200);
1481 pacer_->ProcessPackets();
1482}
1483
1484INSTANTIATE_TEST_SUITE_P(ReferencingAndOwningPackets,
1485 PacingControllerTest,
1486 ::testing::Values(PacerMode::kReferencePackets,
1487 PacerMode::kOwnPackets));
1488
1489} // namespace test
1490} // namespace webrtc