blob: e07e8c85ab27361d7273f56bc9da8165cabae1f3 [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
Erik Språngd05edec2019-08-14 10:43:47 +020054std::unique_ptr<RtpPacketToSend> BuildPacket(RtpPacketToSend::Type type,
55 uint32_t ssrc,
56 uint16_t sequence_number,
57 int64_t capture_time_ms,
58 size_t size) {
59 auto packet = absl::make_unique<RtpPacketToSend>(nullptr);
60 packet->set_packet_type(type);
61 packet->SetSsrc(ssrc);
62 packet->SetSequenceNumber(sequence_number);
63 packet->set_capture_time_ms(capture_time_ms);
64 packet->SetPayloadSize(size);
65 return packet;
66}
67} // namespace
68
69// Mock callback proxy, where both new and old api redirects to common mock
70// methods that focus on core aspects.
71class MockPacingControllerCallback : public PacingController::PacketSender {
72 public:
Erik Språngd05edec2019-08-14 10:43:47 +020073 void SendRtpPacket(std::unique_ptr<RtpPacketToSend> packet,
74 const PacedPacketInfo& cluster_info) override {
75 SendPacket(packet->Ssrc(), packet->SequenceNumber(),
76 packet->capture_time_ms(),
77 packet->packet_type() == RtpPacketToSend::Type::kRetransmission,
78 packet->packet_type() == RtpPacketToSend::Type::kPadding);
79 }
80
Erik Språngd05edec2019-08-14 10:43:47 +020081 std::vector<std::unique_ptr<RtpPacketToSend>> GeneratePadding(
82 DataSize target_size) override {
83 std::vector<std::unique_ptr<RtpPacketToSend>> ret;
84 size_t padding_size = SendPadding(target_size.bytes());
85 if (padding_size > 0) {
86 auto packet = absl::make_unique<RtpPacketToSend>(nullptr);
87 packet->SetPayloadSize(padding_size);
88 packet->set_packet_type(RtpPacketToSend::Type::kPadding);
89 ret.emplace_back(std::move(packet));
90 }
91 return ret;
92 }
93
94 MOCK_METHOD5(SendPacket,
95 void(uint32_t ssrc,
96 uint16_t sequence_number,
97 int64_t capture_timestamp,
98 bool retransmission,
99 bool padding));
100 MOCK_METHOD1(SendPadding, size_t(size_t target_size));
101};
102
103// Mock callback implementing the raw api.
104class MockPacketSender : public PacingController::PacketSender {
105 public:
Erik Språngd05edec2019-08-14 10:43:47 +0200106 MOCK_METHOD2(SendRtpPacket,
107 void(std::unique_ptr<RtpPacketToSend> packet,
108 const PacedPacketInfo& cluster_info));
109 MOCK_METHOD1(
110 GeneratePadding,
111 std::vector<std::unique_ptr<RtpPacketToSend>>(DataSize target_size));
112};
113
114class PacingControllerPadding : public PacingController::PacketSender {
115 public:
116 static const size_t kPaddingPacketSize = 224;
117
118 PacingControllerPadding() : padding_sent_(0) {}
119
Erik Språngd05edec2019-08-14 10:43:47 +0200120 void SendRtpPacket(std::unique_ptr<RtpPacketToSend> packet,
121 const PacedPacketInfo& pacing_info) override {}
122
Erik Språngd05edec2019-08-14 10:43:47 +0200123 std::vector<std::unique_ptr<RtpPacketToSend>> GeneratePadding(
124 DataSize target_size) override {
125 size_t num_packets =
126 (target_size.bytes() + kPaddingPacketSize - 1) / kPaddingPacketSize;
127 std::vector<std::unique_ptr<RtpPacketToSend>> packets;
128 for (size_t i = 0; i < num_packets; ++i) {
129 packets.emplace_back(absl::make_unique<RtpPacketToSend>(nullptr));
130 packets.back()->SetPadding(kPaddingPacketSize);
131 packets.back()->set_packet_type(RtpPacketToSend::Type::kPadding);
132 padding_sent_ += kPaddingPacketSize;
133 }
134 return packets;
135 }
136
137 size_t padding_sent() { return padding_sent_; }
138
139 private:
140 size_t padding_sent_;
141};
142
143class PacingControllerProbing : public PacingController::PacketSender {
144 public:
145 PacingControllerProbing() : packets_sent_(0), padding_sent_(0) {}
146
Erik Språngd05edec2019-08-14 10:43:47 +0200147 void SendRtpPacket(std::unique_ptr<RtpPacketToSend> packet,
148 const PacedPacketInfo& pacing_info) override {
149 if (packet->packet_type() != RtpPacketToSend::Type::kPadding) {
150 ++packets_sent_;
151 }
152 }
153
Erik Språngd05edec2019-08-14 10:43:47 +0200154 std::vector<std::unique_ptr<RtpPacketToSend>> GeneratePadding(
155 DataSize target_size) override {
156 std::vector<std::unique_ptr<RtpPacketToSend>> packets;
157 packets.emplace_back(absl::make_unique<RtpPacketToSend>(nullptr));
158 packets.back()->SetPadding(target_size.bytes());
159 packets.back()->set_packet_type(RtpPacketToSend::Type::kPadding);
160 padding_sent_ += target_size.bytes();
161 return packets;
162 }
163
164 int packets_sent() const { return packets_sent_; }
165
166 int padding_sent() const { return padding_sent_; }
167
168 private:
169 int packets_sent_;
170 int padding_sent_;
171};
172
Erik Språngf5815fa2019-08-21 14:27:31 +0200173class PacingControllerTest : public ::testing::Test {
Erik Språngd05edec2019-08-14 10:43:47 +0200174 protected:
Erik Språngf5815fa2019-08-21 14:27:31 +0200175 PacingControllerTest() : clock_(123456) {
Erik Språngd05edec2019-08-14 10:43:47 +0200176 srand(0);
177 // Need to initialize PacingController after we initialize clock.
178 pacer_ = absl::make_unique<PacingController>(&clock_, &callback_, nullptr,
179 nullptr);
180 Init();
181 }
182
183 void Init() {
184 pacer_->CreateProbeCluster(kFirstClusterRate, /*cluster_id=*/0);
185 pacer_->CreateProbeCluster(kSecondClusterRate, /*cluster_id=*/1);
186 // Default to bitrate probing disabled for testing purposes. Probing tests
187 // have to enable probing, either by creating a new PacingController
188 // instance or by calling SetProbingEnabled(true).
189 pacer_->SetProbingEnabled(false);
190 pacer_->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
191
192 clock_.AdvanceTime(TimeUntilNextProcess());
193 }
194
195 void Send(RtpPacketToSend::Type type,
196 uint32_t ssrc,
197 uint16_t sequence_number,
198 int64_t capture_time_ms,
199 size_t size) {
Erik Språngf5815fa2019-08-21 14:27:31 +0200200 pacer_->EnqueuePacket(
201 BuildPacket(type, ssrc, sequence_number, capture_time_ms, size));
Erik Språngd05edec2019-08-14 10:43:47 +0200202 }
203
204 void SendAndExpectPacket(RtpPacketToSend::Type type,
205 uint32_t ssrc,
206 uint16_t sequence_number,
207 int64_t capture_time_ms,
208 size_t size) {
209 Send(type, ssrc, sequence_number, capture_time_ms, size);
210 EXPECT_CALL(
211 callback_,
212 SendPacket(ssrc, sequence_number, capture_time_ms,
213 type == RtpPacketToSend::Type::kRetransmission, false))
214 .Times(1);
215 }
216
Erik Språngd05edec2019-08-14 10:43:47 +0200217 std::unique_ptr<RtpPacketToSend> BuildRtpPacket(RtpPacketToSend::Type type) {
218 auto packet = absl::make_unique<RtpPacketToSend>(nullptr);
219 packet->set_packet_type(type);
220 switch (type) {
221 case RtpPacketToSend::Type::kAudio:
222 packet->SetSsrc(kAudioSsrc);
223 break;
224 case RtpPacketToSend::Type::kVideo:
225 packet->SetSsrc(kVideoSsrc);
226 break;
227 case RtpPacketToSend::Type::kRetransmission:
228 case RtpPacketToSend::Type::kPadding:
229 packet->SetSsrc(kVideoRtxSsrc);
230 break;
231 case RtpPacketToSend::Type::kForwardErrorCorrection:
232 packet->SetSsrc(kFlexFecSsrc);
233 break;
234 }
235
236 packet->SetPayloadSize(234);
237 return packet;
238 }
239
240 TimeDelta TimeUntilNextProcess() {
241 // TODO(bugs.webrtc.org/10809): Replace this with TimeUntilAvailableBudget()
242 // once ported from WIP code. For now, emulate PacedSender method.
243
244 TimeDelta elapsed_time = pacer_->TimeElapsedSinceLastProcess();
245 if (pacer_->IsPaused()) {
246 return std::max(PacingController::kPausedProcessInterval - elapsed_time,
247 TimeDelta::Zero());
248 }
249
250 auto next_probe = pacer_->TimeUntilNextProbe();
251 if (next_probe) {
252 return *next_probe;
253 }
254
255 const TimeDelta min_packet_limit = TimeDelta::ms(5);
256 return std::max(min_packet_limit - elapsed_time, TimeDelta::Zero());
257 }
258
259 SimulatedClock clock_;
Erik Språngd05edec2019-08-14 10:43:47 +0200260 MockPacingControllerCallback callback_;
261 std::unique_ptr<PacingController> pacer_;
262};
263
Erik Språngf5815fa2019-08-21 14:27:31 +0200264class PacingControllerFieldTrialTest : public ::testing::Test {
Erik Språngd05edec2019-08-14 10:43:47 +0200265 protected:
266 struct MediaStream {
267 const RtpPacketToSend::Type type;
268 const uint32_t ssrc;
269 const size_t packet_size;
270 uint16_t seq_num;
271 };
272
273 const int kProcessIntervalsPerSecond = 1000 / 5;
274
275 PacingControllerFieldTrialTest() : clock_(123456) {}
276 void InsertPacket(PacingController* pacer, MediaStream* stream) {
Erik Språngf5815fa2019-08-21 14:27:31 +0200277 pacer->EnqueuePacket(
278 BuildPacket(stream->type, stream->ssrc, stream->seq_num++,
279 clock_.TimeInMilliseconds(), stream->packet_size));
Erik Språngd05edec2019-08-14 10:43:47 +0200280 }
281 void ProcessNext(PacingController* pacer) {
282 clock_.AdvanceTimeMilliseconds(5);
283 pacer->ProcessPackets();
284 }
285 MediaStream audio{/*type*/ RtpPacketToSend::Type::kAudio,
286 /*ssrc*/ 3333, /*packet_size*/ 100, /*seq_num*/ 1000};
287 MediaStream video{/*type*/ RtpPacketToSend::Type::kVideo,
288 /*ssrc*/ 4444, /*packet_size*/ 1000, /*seq_num*/ 1000};
289 SimulatedClock clock_;
290 MockPacingControllerCallback callback_;
291};
292
Erik Språngf5815fa2019-08-21 14:27:31 +0200293TEST_F(PacingControllerFieldTrialTest, DefaultNoPaddingInSilence) {
Erik Språngd05edec2019-08-14 10:43:47 +0200294 PacingController pacer(&clock_, &callback_, nullptr, nullptr);
295 pacer.SetPacingRates(kTargetRate, DataRate::Zero());
296 // Video packet to reset last send time and provide padding data.
297 InsertPacket(&pacer, &video);
298 EXPECT_CALL(callback_, SendPacket).Times(1);
299 clock_.AdvanceTimeMilliseconds(5);
300 pacer.ProcessPackets();
301 EXPECT_CALL(callback_, SendPadding).Times(0);
302 // Waiting 500 ms should not trigger sending of padding.
303 clock_.AdvanceTimeMilliseconds(500);
304 pacer.ProcessPackets();
305}
306
Erik Språngf5815fa2019-08-21 14:27:31 +0200307TEST_F(PacingControllerFieldTrialTest, PaddingInSilenceWithTrial) {
308 ScopedFieldTrials trial("WebRTC-Pacer-PadInSilence/Enabled/");
Erik Språngd05edec2019-08-14 10:43:47 +0200309 PacingController pacer(&clock_, &callback_, nullptr, nullptr);
310 pacer.SetPacingRates(kTargetRate, DataRate::Zero());
311 // Video packet to reset last send time and provide padding data.
312 InsertPacket(&pacer, &video);
Erik Språngf5815fa2019-08-21 14:27:31 +0200313 EXPECT_CALL(callback_, SendPacket).Times(2);
Erik Språngd05edec2019-08-14 10:43:47 +0200314 clock_.AdvanceTimeMilliseconds(5);
315 pacer.ProcessPackets();
316 EXPECT_CALL(callback_, SendPadding).WillOnce(Return(1000));
317 // Waiting 500 ms should trigger sending of padding.
318 clock_.AdvanceTimeMilliseconds(500);
319 pacer.ProcessPackets();
320}
321
Erik Språngf5815fa2019-08-21 14:27:31 +0200322TEST_F(PacingControllerFieldTrialTest, DefaultCongestionWindowAffectsAudio) {
Erik Språngd05edec2019-08-14 10:43:47 +0200323 EXPECT_CALL(callback_, SendPadding).Times(0);
324 PacingController pacer(&clock_, &callback_, nullptr, nullptr);
325 pacer.SetPacingRates(DataRate::bps(10000000), DataRate::Zero());
326 pacer.SetCongestionWindow(DataSize::bytes(800));
327 pacer.UpdateOutstandingData(DataSize::Zero());
328 // Video packet fills congestion window.
329 InsertPacket(&pacer, &video);
330 EXPECT_CALL(callback_, SendPacket).Times(1);
331 ProcessNext(&pacer);
332 // Audio packet blocked due to congestion.
333 InsertPacket(&pacer, &audio);
334 EXPECT_CALL(callback_, SendPacket).Times(0);
335 ProcessNext(&pacer);
336 ProcessNext(&pacer);
337 // Audio packet unblocked when congestion window clear.
338 ::testing::Mock::VerifyAndClearExpectations(&callback_);
339 pacer.UpdateOutstandingData(DataSize::Zero());
340 EXPECT_CALL(callback_, SendPacket).Times(1);
341 ProcessNext(&pacer);
342}
343
Erik Språngf5815fa2019-08-21 14:27:31 +0200344TEST_F(PacingControllerFieldTrialTest,
Erik Språngd05edec2019-08-14 10:43:47 +0200345 CongestionWindowDoesNotAffectAudioInTrial) {
Erik Språngf5815fa2019-08-21 14:27:31 +0200346 ScopedFieldTrials trial("WebRTC-Pacer-BlockAudio/Disabled/");
Erik Språngd05edec2019-08-14 10:43:47 +0200347 EXPECT_CALL(callback_, SendPadding).Times(0);
348 PacingController pacer(&clock_, &callback_, nullptr, nullptr);
349 pacer.SetPacingRates(DataRate::bps(10000000), DataRate::Zero());
350 pacer.SetCongestionWindow(DataSize::bytes(800));
351 pacer.UpdateOutstandingData(DataSize::Zero());
352 // Video packet fills congestion window.
353 InsertPacket(&pacer, &video);
354 EXPECT_CALL(callback_, SendPacket).Times(1);
355 ProcessNext(&pacer);
356 // Audio not blocked due to congestion.
357 InsertPacket(&pacer, &audio);
358 EXPECT_CALL(callback_, SendPacket).Times(1);
359 ProcessNext(&pacer);
360}
361
Erik Språngf5815fa2019-08-21 14:27:31 +0200362TEST_F(PacingControllerFieldTrialTest, DefaultBudgetAffectsAudio) {
Erik Språngd05edec2019-08-14 10:43:47 +0200363 PacingController pacer(&clock_, &callback_, nullptr, nullptr);
364 pacer.SetPacingRates(
365 DataRate::bps(video.packet_size / 3 * 8 * kProcessIntervalsPerSecond),
366 DataRate::Zero());
367 // Video fills budget for following process periods.
368 InsertPacket(&pacer, &video);
369 EXPECT_CALL(callback_, SendPacket).Times(1);
370 ProcessNext(&pacer);
371 // Audio packet blocked due to budget limit.
372 EXPECT_CALL(callback_, SendPacket).Times(0);
373 InsertPacket(&pacer, &audio);
374 ProcessNext(&pacer);
375 ProcessNext(&pacer);
376 ::testing::Mock::VerifyAndClearExpectations(&callback_);
377 // Audio packet unblocked when the budget has recovered.
378 EXPECT_CALL(callback_, SendPacket).Times(1);
379 ProcessNext(&pacer);
380 ProcessNext(&pacer);
381}
382
Erik Språngf5815fa2019-08-21 14:27:31 +0200383TEST_F(PacingControllerFieldTrialTest, BudgetDoesNotAffectAudioInTrial) {
384 ScopedFieldTrials trial("WebRTC-Pacer-BlockAudio/Disabled/");
Erik Språngd05edec2019-08-14 10:43:47 +0200385 EXPECT_CALL(callback_, SendPadding).Times(0);
386 PacingController pacer(&clock_, &callback_, nullptr, nullptr);
387 pacer.SetPacingRates(
388 DataRate::bps(video.packet_size / 3 * 8 * kProcessIntervalsPerSecond),
389 DataRate::Zero());
390 // Video fills budget for following process periods.
391 InsertPacket(&pacer, &video);
392 EXPECT_CALL(callback_, SendPacket).Times(1);
393 ProcessNext(&pacer);
394 // Audio packet not blocked due to budget limit.
395 EXPECT_CALL(callback_, SendPacket).Times(1);
396 InsertPacket(&pacer, &audio);
397 ProcessNext(&pacer);
398}
399
Erik Språngf5815fa2019-08-21 14:27:31 +0200400TEST_F(PacingControllerTest, FirstSentPacketTimeIsSet) {
Erik Språngd05edec2019-08-14 10:43:47 +0200401 uint16_t sequence_number = 1234;
402 const uint32_t kSsrc = 12345;
403 const size_t kSizeBytes = 250;
404 const size_t kPacketToSend = 3;
405 const Timestamp kStartTime = clock_.CurrentTime();
406
407 // No packet sent.
408 EXPECT_FALSE(pacer_->FirstSentPacketTime().has_value());
409
410 for (size_t i = 0; i < kPacketToSend; ++i) {
411 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, kSsrc, sequence_number++,
412 clock_.TimeInMilliseconds(), kSizeBytes);
413 pacer_->ProcessPackets();
414 clock_.AdvanceTime(TimeUntilNextProcess());
415 }
416 EXPECT_EQ(kStartTime, pacer_->FirstSentPacketTime());
417}
418
Erik Språngf5815fa2019-08-21 14:27:31 +0200419TEST_F(PacingControllerTest, QueuePacket) {
Erik Språngd05edec2019-08-14 10:43:47 +0200420 uint32_t ssrc = 12345;
421 uint16_t sequence_number = 1234;
422 // Due to the multiplicative factor we can send 5 packets during a send
423 // interval. (network capacity * multiplier / (8 bits per byte *
424 // (packet size * #send intervals per second)
425 const size_t packets_to_send =
426 kTargetRate.bps() * kPaceMultiplier / (8 * 250 * 200);
427 for (size_t i = 0; i < packets_to_send; ++i) {
428 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
429 clock_.TimeInMilliseconds(), 250);
430 }
431
432 int64_t queued_packet_timestamp = clock_.TimeInMilliseconds();
433 Send(RtpPacketToSend::Type::kVideo, ssrc, sequence_number,
434 queued_packet_timestamp, 250);
435 EXPECT_EQ(packets_to_send + 1, pacer_->QueueSizePackets());
436 pacer_->ProcessPackets();
437 EXPECT_CALL(callback_, SendPadding).Times(0);
438 clock_.AdvanceTimeMilliseconds(5);
439 EXPECT_EQ(1u, pacer_->QueueSizePackets());
440 EXPECT_CALL(callback_, SendPacket(ssrc, sequence_number++,
441 queued_packet_timestamp, false, false))
442 .Times(1);
443 pacer_->ProcessPackets();
444 sequence_number++;
445 EXPECT_EQ(0u, pacer_->QueueSizePackets());
446
447 // We can send packets_to_send -1 packets of size 250 during the current
448 // interval since one packet has already been sent.
449 for (size_t i = 0; i < packets_to_send - 1; ++i) {
450 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
451 clock_.TimeInMilliseconds(), 250);
452 }
453 Send(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
454 clock_.TimeInMilliseconds(), 250);
455 EXPECT_EQ(packets_to_send, pacer_->QueueSizePackets());
456 pacer_->ProcessPackets();
457 EXPECT_EQ(1u, pacer_->QueueSizePackets());
458}
459
Erik Språngf5815fa2019-08-21 14:27:31 +0200460TEST_F(PacingControllerTest, PaceQueuedPackets) {
Erik Språngd05edec2019-08-14 10:43:47 +0200461 uint32_t ssrc = 12345;
462 uint16_t sequence_number = 1234;
463
464 // Due to the multiplicative factor we can send 5 packets during a send
465 // interval. (network capacity * multiplier / (8 bits per byte *
466 // (packet size * #send intervals per second)
467 const size_t packets_to_send_per_interval =
468 kTargetRate.bps() * kPaceMultiplier / (8 * 250 * 200);
469 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
470 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
471 clock_.TimeInMilliseconds(), 250);
472 }
473
474 for (size_t j = 0; j < packets_to_send_per_interval * 10; ++j) {
475 Send(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
476 clock_.TimeInMilliseconds(), 250);
477 }
478 EXPECT_EQ(packets_to_send_per_interval + packets_to_send_per_interval * 10,
479 pacer_->QueueSizePackets());
480 pacer_->ProcessPackets();
481 EXPECT_EQ(packets_to_send_per_interval * 10, pacer_->QueueSizePackets());
482 EXPECT_CALL(callback_, SendPadding).Times(0);
483 for (int k = 0; k < 10; ++k) {
484 clock_.AdvanceTime(TimeUntilNextProcess());
485 EXPECT_CALL(callback_, SendPacket(ssrc, _, _, false, false))
486 .Times(packets_to_send_per_interval);
487 pacer_->ProcessPackets();
488 }
489 EXPECT_EQ(0u, pacer_->QueueSizePackets());
490 clock_.AdvanceTime(TimeUntilNextProcess());
491 EXPECT_EQ(0u, pacer_->QueueSizePackets());
492 pacer_->ProcessPackets();
493
494 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
495 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
496 clock_.TimeInMilliseconds(), 250);
497 }
498 Send(RtpPacketToSend::Type::kVideo, ssrc, sequence_number,
499 clock_.TimeInMilliseconds(), 250);
500 pacer_->ProcessPackets();
501 EXPECT_EQ(1u, pacer_->QueueSizePackets());
502}
503
Erik Språngf5815fa2019-08-21 14:27:31 +0200504TEST_F(PacingControllerTest, RepeatedRetransmissionsAllowed) {
Erik Språngd05edec2019-08-14 10:43:47 +0200505 // Send one packet, then two retransmissions of that packet.
506 for (size_t i = 0; i < 3; i++) {
507 constexpr uint32_t ssrc = 333;
508 constexpr uint16_t sequence_number = 444;
509 constexpr size_t bytes = 250;
510 bool is_retransmission = (i != 0); // Original followed by retransmissions.
511 SendAndExpectPacket(
512 is_retransmission ? RtpPacketToSend::Type::kRetransmission
513 : RtpPacketToSend::Type::kVideo,
514 ssrc, sequence_number, clock_.TimeInMilliseconds(), bytes);
515 clock_.AdvanceTimeMilliseconds(5);
516 }
517 pacer_->ProcessPackets();
518}
519
Erik Språngf5815fa2019-08-21 14:27:31 +0200520TEST_F(PacingControllerTest,
Erik Språngd05edec2019-08-14 10:43:47 +0200521 CanQueuePacketsWithSameSequenceNumberOnDifferentSsrcs) {
522 uint32_t ssrc = 12345;
523 uint16_t sequence_number = 1234;
524
525 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number,
526 clock_.TimeInMilliseconds(), 250);
527
528 // Expect packet on second ssrc to be queued and sent as well.
529 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc + 1, sequence_number,
530 clock_.TimeInMilliseconds(), 250);
531
532 clock_.AdvanceTimeMilliseconds(1000);
533 pacer_->ProcessPackets();
534}
535
Erik Språngf5815fa2019-08-21 14:27:31 +0200536TEST_F(PacingControllerTest, Padding) {
Erik Språngd05edec2019-08-14 10:43:47 +0200537 uint32_t ssrc = 12345;
538 uint16_t sequence_number = 1234;
539
540 pacer_->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
541
542 // Due to the multiplicative factor we can send 5 packets during a send
543 // interval. (network capacity * multiplier / (8 bits per byte *
544 // (packet size * #send intervals per second)
545 const size_t packets_to_send_per_interval =
546 kTargetRate.bps() * kPaceMultiplier / (8 * 250 * 200);
547 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
548 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
549 clock_.TimeInMilliseconds(), 250);
550 }
551 // No padding is expected since we have sent too much already.
552 EXPECT_CALL(callback_, SendPadding).Times(0);
553 pacer_->ProcessPackets();
554 EXPECT_EQ(0u, pacer_->QueueSizePackets());
555
556 // 5 milliseconds later should not send padding since we filled the buffers
557 // initially.
558 EXPECT_CALL(callback_, SendPadding(250)).Times(0);
559 clock_.AdvanceTime(TimeUntilNextProcess());
560 pacer_->ProcessPackets();
561
562 // 5 milliseconds later we have enough budget to send some padding.
563 EXPECT_CALL(callback_, SendPadding(250)).WillOnce(Return(250));
Erik Språngf5815fa2019-08-21 14:27:31 +0200564 EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
Erik Språngd05edec2019-08-14 10:43:47 +0200565 clock_.AdvanceTime(TimeUntilNextProcess());
566 pacer_->ProcessPackets();
567}
568
Erik Språngf5815fa2019-08-21 14:27:31 +0200569TEST_F(PacingControllerTest, NoPaddingBeforeNormalPacket) {
Erik Språngd05edec2019-08-14 10:43:47 +0200570 pacer_->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
571
572 EXPECT_CALL(callback_, SendPadding).Times(0);
573 pacer_->ProcessPackets();
574 clock_.AdvanceTime(TimeUntilNextProcess());
575
576 pacer_->ProcessPackets();
577 clock_.AdvanceTime(TimeUntilNextProcess());
578
579 uint32_t ssrc = 12345;
580 uint16_t sequence_number = 1234;
581 int64_t capture_time_ms = 56789;
582
583 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
584 capture_time_ms, 250);
585 EXPECT_CALL(callback_, SendPadding(250)).WillOnce(Return(250));
Erik Språngf5815fa2019-08-21 14:27:31 +0200586 EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
Erik Språngd05edec2019-08-14 10:43:47 +0200587 pacer_->ProcessPackets();
588}
589
Erik Språngf5815fa2019-08-21 14:27:31 +0200590TEST_F(PacingControllerTest, VerifyPaddingUpToBitrate) {
Erik Språngd05edec2019-08-14 10:43:47 +0200591 uint32_t ssrc = 12345;
592 uint16_t sequence_number = 1234;
593 int64_t capture_time_ms = 56789;
594 const int kTimeStep = 5;
595 const int64_t kBitrateWindow = 100;
596 pacer_->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
597
598 int64_t start_time = clock_.TimeInMilliseconds();
599 while (clock_.TimeInMilliseconds() - start_time < kBitrateWindow) {
600 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
601 capture_time_ms, 250);
602 EXPECT_CALL(callback_, SendPadding(250)).WillOnce(Return(250));
Erik Språngf5815fa2019-08-21 14:27:31 +0200603 EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
Erik Språngd05edec2019-08-14 10:43:47 +0200604 pacer_->ProcessPackets();
605 clock_.AdvanceTimeMilliseconds(kTimeStep);
606 }
607}
608
Erik Språngf5815fa2019-08-21 14:27:31 +0200609TEST_F(PacingControllerTest, VerifyAverageBitrateVaryingMediaPayload) {
Erik Språngd05edec2019-08-14 10:43:47 +0200610 uint32_t ssrc = 12345;
611 uint16_t sequence_number = 1234;
612 int64_t capture_time_ms = 56789;
613 const int kTimeStep = 5;
614 const int64_t kBitrateWindow = 10000;
615 PacingControllerPadding callback;
616 pacer_ =
617 absl::make_unique<PacingController>(&clock_, &callback, nullptr, nullptr);
618 pacer_->SetProbingEnabled(false);
619 pacer_->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
620
621 int64_t start_time = clock_.TimeInMilliseconds();
622 size_t media_bytes = 0;
623 while (clock_.TimeInMilliseconds() - start_time < kBitrateWindow) {
624 int rand_value = rand(); // NOLINT (rand_r instead of rand)
625 size_t media_payload = rand_value % 100 + 200; // [200, 300] bytes.
626 Send(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
627 capture_time_ms, media_payload);
628 media_bytes += media_payload;
629 clock_.AdvanceTimeMilliseconds(kTimeStep);
630 pacer_->ProcessPackets();
631 }
632 EXPECT_NEAR(kTargetRate.kbps(),
633 static_cast<int>(8 * (media_bytes + callback.padding_sent()) /
634 kBitrateWindow),
635 1);
636}
637
Erik Språngf5815fa2019-08-21 14:27:31 +0200638TEST_F(PacingControllerTest, Priority) {
Erik Språngd05edec2019-08-14 10:43:47 +0200639 uint32_t ssrc_low_priority = 12345;
640 uint32_t ssrc = 12346;
641 uint16_t sequence_number = 1234;
642 int64_t capture_time_ms = 56789;
643 int64_t capture_time_ms_low_priority = 1234567;
644
645 // Due to the multiplicative factor we can send 5 packets during a send
646 // interval. (network capacity * multiplier / (8 bits per byte *
647 // (packet size * #send intervals per second)
648 const size_t packets_to_send_per_interval =
649 kTargetRate.bps() * kPaceMultiplier / (8 * 250 * 200);
650 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
651 SendAndExpectPacket(RtpPacketToSend::Type::kRetransmission, ssrc,
652 sequence_number++, clock_.TimeInMilliseconds(), 250);
653 }
654 pacer_->ProcessPackets();
655 EXPECT_EQ(0u, pacer_->QueueSizePackets());
656
657 // Expect normal and low priority to be queued and high to pass through.
658 Send(RtpPacketToSend::Type::kVideo, ssrc_low_priority, sequence_number++,
659 capture_time_ms_low_priority, 250);
660
661 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
662 Send(RtpPacketToSend::Type::kRetransmission, ssrc, sequence_number++,
663 capture_time_ms, 250);
664 }
665 Send(RtpPacketToSend::Type::kAudio, ssrc, sequence_number++, capture_time_ms,
666 250);
667
668 // Expect all high and normal priority to be sent out first.
669 EXPECT_CALL(callback_, SendPadding).Times(0);
670 EXPECT_CALL(callback_, SendPacket(ssrc, _, capture_time_ms, _, _))
671 .Times(packets_to_send_per_interval + 1);
672
673 clock_.AdvanceTime(TimeUntilNextProcess());
674 pacer_->ProcessPackets();
675 EXPECT_EQ(1u, pacer_->QueueSizePackets());
676
677 EXPECT_CALL(callback_, SendPacket(ssrc_low_priority, _,
678 capture_time_ms_low_priority, _, _))
679 .Times(1);
680
681 clock_.AdvanceTime(TimeUntilNextProcess());
682 pacer_->ProcessPackets();
683}
684
Erik Språngf5815fa2019-08-21 14:27:31 +0200685TEST_F(PacingControllerTest, RetransmissionPriority) {
Erik Språngd05edec2019-08-14 10:43:47 +0200686 uint32_t ssrc = 12345;
687 uint16_t sequence_number = 1234;
688 int64_t capture_time_ms = 45678;
689 int64_t capture_time_ms_retransmission = 56789;
690
691 // Due to the multiplicative factor we can send 5 packets during a send
692 // interval. (network capacity * multiplier / (8 bits per byte *
693 // (packet size * #send intervals per second)
694 const size_t packets_to_send_per_interval =
695 kTargetRate.bps() * kPaceMultiplier / (8 * 250 * 200);
696 pacer_->ProcessPackets();
697 EXPECT_EQ(0u, pacer_->QueueSizePackets());
698
699 // Alternate retransmissions and normal packets.
700 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
701 Send(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
702 capture_time_ms, 250);
703 Send(RtpPacketToSend::Type::kRetransmission, ssrc, sequence_number++,
704 capture_time_ms_retransmission, 250);
705 }
706 EXPECT_EQ(2 * packets_to_send_per_interval, pacer_->QueueSizePackets());
707
708 // Expect all retransmissions to be sent out first despite having a later
709 // capture time.
710 EXPECT_CALL(callback_, SendPadding).Times(0);
711 EXPECT_CALL(callback_, SendPacket(_, _, _, false, _)).Times(0);
712 EXPECT_CALL(callback_,
713 SendPacket(ssrc, _, capture_time_ms_retransmission, true, _))
714 .Times(packets_to_send_per_interval);
715
716 clock_.AdvanceTime(TimeUntilNextProcess());
717 pacer_->ProcessPackets();
718 EXPECT_EQ(packets_to_send_per_interval, pacer_->QueueSizePackets());
719
720 // Expect the remaining (non-retransmission) packets to be sent.
721 EXPECT_CALL(callback_, SendPadding).Times(0);
722 EXPECT_CALL(callback_, SendPacket(_, _, _, true, _)).Times(0);
723 EXPECT_CALL(callback_, SendPacket(ssrc, _, capture_time_ms, false, _))
724 .Times(packets_to_send_per_interval);
725
726 clock_.AdvanceTime(TimeUntilNextProcess());
727 pacer_->ProcessPackets();
728
729 EXPECT_EQ(0u, pacer_->QueueSizePackets());
730}
731
Erik Språngf5815fa2019-08-21 14:27:31 +0200732TEST_F(PacingControllerTest, HighPrioDoesntAffectBudget) {
Erik Språngd05edec2019-08-14 10:43:47 +0200733 uint32_t ssrc = 12346;
734 uint16_t sequence_number = 1234;
735 int64_t capture_time_ms = 56789;
736
737 // As high prio packets doesn't affect the budget, we should be able to send
738 // a high number of them at once.
739 for (int i = 0; i < 25; ++i) {
740 SendAndExpectPacket(RtpPacketToSend::Type::kAudio, ssrc, sequence_number++,
741 capture_time_ms, 250);
742 }
743 pacer_->ProcessPackets();
744 // Low prio packets does affect the budget.
745 // Due to the multiplicative factor we can send 5 packets during a send
746 // interval. (network capacity * multiplier / (8 bits per byte *
747 // (packet size * #send intervals per second)
748 const size_t packets_to_send_per_interval =
749 kTargetRate.bps() * kPaceMultiplier / (8 * 250 * 200);
750 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
751 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
752 clock_.TimeInMilliseconds(), 250);
753 }
754 Send(RtpPacketToSend::Type::kVideo, ssrc, sequence_number, capture_time_ms,
755 250);
756 clock_.AdvanceTime(TimeUntilNextProcess());
757 pacer_->ProcessPackets();
758 EXPECT_EQ(1u, pacer_->QueueSizePackets());
759 EXPECT_CALL(callback_,
760 SendPacket(ssrc, sequence_number++, capture_time_ms, false, _))
761 .Times(1);
762 clock_.AdvanceTime(TimeUntilNextProcess());
763 pacer_->ProcessPackets();
764 EXPECT_EQ(0u, pacer_->QueueSizePackets());
765}
766
Erik Språngf5815fa2019-08-21 14:27:31 +0200767TEST_F(PacingControllerTest, SendsOnlyPaddingWhenCongested) {
Erik Språngd05edec2019-08-14 10:43:47 +0200768 uint32_t ssrc = 202020;
769 uint16_t sequence_number = 1000;
770 int kPacketSize = 250;
771 int kCongestionWindow = kPacketSize * 10;
772
773 pacer_->UpdateOutstandingData(DataSize::Zero());
774 pacer_->SetCongestionWindow(DataSize::bytes(kCongestionWindow));
775 int sent_data = 0;
776 while (sent_data < kCongestionWindow) {
777 sent_data += kPacketSize;
778 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
779 clock_.TimeInMilliseconds(), kPacketSize);
780 clock_.AdvanceTimeMilliseconds(5);
781 pacer_->ProcessPackets();
782 }
783 ::testing::Mock::VerifyAndClearExpectations(&callback_);
784 EXPECT_CALL(callback_, SendPacket).Times(0);
785 EXPECT_CALL(callback_, SendPadding).Times(0);
786
787 size_t blocked_packets = 0;
788 int64_t expected_time_until_padding = 500;
789 while (expected_time_until_padding > 5) {
790 Send(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
791 clock_.TimeInMilliseconds(), kPacketSize);
792 blocked_packets++;
793 clock_.AdvanceTimeMilliseconds(5);
794 pacer_->ProcessPackets();
795 expected_time_until_padding -= 5;
796 }
797 ::testing::Mock::VerifyAndClearExpectations(&callback_);
798 EXPECT_CALL(callback_, SendPadding(1)).WillOnce(Return(1));
Erik Språngf5815fa2019-08-21 14:27:31 +0200799 EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
Erik Språngd05edec2019-08-14 10:43:47 +0200800 clock_.AdvanceTimeMilliseconds(5);
801 pacer_->ProcessPackets();
802 EXPECT_EQ(blocked_packets, pacer_->QueueSizePackets());
803}
804
Erik Språngf5815fa2019-08-21 14:27:31 +0200805TEST_F(PacingControllerTest, DoesNotAllowOveruseAfterCongestion) {
Erik Språngd05edec2019-08-14 10:43:47 +0200806 uint32_t ssrc = 202020;
807 uint16_t seq_num = 1000;
808 int size = 1000;
809 auto now_ms = [this] { return clock_.TimeInMilliseconds(); };
810 EXPECT_CALL(callback_, SendPadding).Times(0);
811 // The pacing rate is low enough that the budget should not allow two packets
812 // to be sent in a row.
813 pacer_->SetPacingRates(DataRate::bps(400 * 8 * 1000 / 5), DataRate::Zero());
814 // The congestion window is small enough to only let one packet through.
815 pacer_->SetCongestionWindow(DataSize::bytes(800));
816 pacer_->UpdateOutstandingData(DataSize::Zero());
817 // Not yet budget limited or congested, packet is sent.
818 Send(RtpPacketToSend::Type::kVideo, ssrc, seq_num++, now_ms(), size);
819 EXPECT_CALL(callback_, SendPacket).Times(1);
820 clock_.AdvanceTimeMilliseconds(5);
821 pacer_->ProcessPackets();
822 // Packet blocked due to congestion.
823 Send(RtpPacketToSend::Type::kVideo, ssrc, seq_num++, now_ms(), size);
824 EXPECT_CALL(callback_, SendPacket).Times(0);
825 clock_.AdvanceTimeMilliseconds(5);
826 pacer_->ProcessPackets();
827 // Packet blocked due to congestion.
828 Send(RtpPacketToSend::Type::kVideo, ssrc, seq_num++, now_ms(), size);
829 EXPECT_CALL(callback_, SendPacket).Times(0);
830 clock_.AdvanceTimeMilliseconds(5);
831 pacer_->ProcessPackets();
832 pacer_->UpdateOutstandingData(DataSize::Zero());
833 // Congestion removed and budget has recovered, packet is sent.
834 Send(RtpPacketToSend::Type::kVideo, ssrc, seq_num++, now_ms(), size);
835 EXPECT_CALL(callback_, SendPacket).Times(1);
836 clock_.AdvanceTimeMilliseconds(5);
837 pacer_->ProcessPackets();
838 pacer_->UpdateOutstandingData(DataSize::Zero());
839 // Should be blocked due to budget limitation as congestion has be removed.
840 Send(RtpPacketToSend::Type::kVideo, ssrc, seq_num++, now_ms(), size);
841 EXPECT_CALL(callback_, SendPacket).Times(0);
842 clock_.AdvanceTimeMilliseconds(5);
843 pacer_->ProcessPackets();
844}
845
Erik Språngf5815fa2019-08-21 14:27:31 +0200846TEST_F(PacingControllerTest, ResumesSendingWhenCongestionEnds) {
Erik Språngd05edec2019-08-14 10:43:47 +0200847 uint32_t ssrc = 202020;
848 uint16_t sequence_number = 1000;
849 int64_t kPacketSize = 250;
850 int64_t kCongestionCount = 10;
851 int64_t kCongestionWindow = kPacketSize * kCongestionCount;
852 int64_t kCongestionTimeMs = 1000;
853
854 pacer_->UpdateOutstandingData(DataSize::Zero());
855 pacer_->SetCongestionWindow(DataSize::bytes(kCongestionWindow));
856 int sent_data = 0;
857 while (sent_data < kCongestionWindow) {
858 sent_data += kPacketSize;
859 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
860 clock_.TimeInMilliseconds(), kPacketSize);
861 clock_.AdvanceTimeMilliseconds(5);
862 pacer_->ProcessPackets();
863 }
864 ::testing::Mock::VerifyAndClearExpectations(&callback_);
865 EXPECT_CALL(callback_, SendPacket).Times(0);
866 int unacked_packets = 0;
867 for (int duration = 0; duration < kCongestionTimeMs; duration += 5) {
868 Send(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
869 clock_.TimeInMilliseconds(), kPacketSize);
870 unacked_packets++;
871 clock_.AdvanceTimeMilliseconds(5);
872 pacer_->ProcessPackets();
873 }
874 ::testing::Mock::VerifyAndClearExpectations(&callback_);
875
876 // First mark half of the congested packets as cleared and make sure that just
877 // as many are sent
878 int ack_count = kCongestionCount / 2;
879 EXPECT_CALL(callback_, SendPacket(ssrc, _, _, false, _)).Times(ack_count);
880 pacer_->UpdateOutstandingData(
881 DataSize::bytes(kCongestionWindow - kPacketSize * ack_count));
882
883 for (int duration = 0; duration < kCongestionTimeMs; duration += 5) {
884 clock_.AdvanceTimeMilliseconds(5);
885 pacer_->ProcessPackets();
886 }
887 unacked_packets -= ack_count;
888 ::testing::Mock::VerifyAndClearExpectations(&callback_);
889
890 // Second make sure all packets are sent if sent packets are continuously
891 // marked as acked.
892 EXPECT_CALL(callback_, SendPacket(ssrc, _, _, false, _))
893 .Times(unacked_packets);
894 for (int duration = 0; duration < kCongestionTimeMs; duration += 5) {
895 pacer_->UpdateOutstandingData(DataSize::Zero());
896 clock_.AdvanceTimeMilliseconds(5);
897 pacer_->ProcessPackets();
898 }
899}
900
Erik Språngf5815fa2019-08-21 14:27:31 +0200901TEST_F(PacingControllerTest, Pause) {
Erik Språngd05edec2019-08-14 10:43:47 +0200902 uint32_t ssrc_low_priority = 12345;
903 uint32_t ssrc = 12346;
904 uint32_t ssrc_high_priority = 12347;
905 uint16_t sequence_number = 1234;
906 int64_t capture_time_ms = clock_.TimeInMilliseconds();
907
908 EXPECT_EQ(TimeDelta::Zero(), pacer_->OldestPacketWaitTime());
909
910 // Due to the multiplicative factor we can send 5 packets during a send
911 // interval. (network capacity * multiplier / (8 bits per byte *
912 // (packet size * #send intervals per second)
913 const size_t packets_to_send_per_interval =
914 kTargetRate.bps() * kPaceMultiplier / (8 * 250 * 200);
915 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
916 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
917 clock_.TimeInMilliseconds(), 250);
918 }
919
920 pacer_->ProcessPackets();
921
922 pacer_->Pause();
923
924 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
925 Send(RtpPacketToSend::Type::kVideo, ssrc_low_priority, sequence_number++,
926 capture_time_ms, 250);
927 Send(RtpPacketToSend::Type::kRetransmission, ssrc, sequence_number++,
928 capture_time_ms, 250);
929 Send(RtpPacketToSend::Type::kAudio, ssrc_high_priority, sequence_number++,
930 capture_time_ms, 250);
931 }
932 clock_.AdvanceTimeMilliseconds(10000);
933 int64_t second_capture_time_ms = clock_.TimeInMilliseconds();
934 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
935 Send(RtpPacketToSend::Type::kVideo, ssrc_low_priority, sequence_number++,
936 second_capture_time_ms, 250);
937 Send(RtpPacketToSend::Type::kRetransmission, ssrc, sequence_number++,
938 second_capture_time_ms, 250);
939 Send(RtpPacketToSend::Type::kAudio, ssrc_high_priority, sequence_number++,
940 second_capture_time_ms, 250);
941 }
942
943 // Expect everything to be queued.
944 EXPECT_EQ(TimeDelta::ms(second_capture_time_ms - capture_time_ms),
945 pacer_->OldestPacketWaitTime());
946
947 EXPECT_CALL(callback_, SendPadding(1)).WillOnce(Return(1));
Erik Språngf5815fa2019-08-21 14:27:31 +0200948 EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
Erik Språngd05edec2019-08-14 10:43:47 +0200949 pacer_->ProcessPackets();
950
951 int64_t expected_time_until_send = 500;
952 EXPECT_CALL(callback_, SendPadding).Times(0);
953 while (expected_time_until_send >= 5) {
954 pacer_->ProcessPackets();
955 clock_.AdvanceTimeMilliseconds(5);
956 expected_time_until_send -= 5;
957 }
958
959 ::testing::Mock::VerifyAndClearExpectations(&callback_);
960 EXPECT_CALL(callback_, SendPadding(1)).WillOnce(Return(1));
Erik Språngf5815fa2019-08-21 14:27:31 +0200961 EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
Erik Språngd05edec2019-08-14 10:43:47 +0200962 clock_.AdvanceTimeMilliseconds(5);
963 pacer_->ProcessPackets();
964 ::testing::Mock::VerifyAndClearExpectations(&callback_);
965
966 // Expect high prio packets to come out first followed by normal
967 // prio packets and low prio packets (all in capture order).
968 {
969 ::testing::InSequence sequence;
970 EXPECT_CALL(callback_,
971 SendPacket(ssrc_high_priority, _, capture_time_ms, _, _))
972 .Times(packets_to_send_per_interval);
973 EXPECT_CALL(callback_,
974 SendPacket(ssrc_high_priority, _, second_capture_time_ms, _, _))
975 .Times(packets_to_send_per_interval);
976
977 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
978 EXPECT_CALL(callback_, SendPacket(ssrc, _, capture_time_ms, _, _))
979 .Times(1);
980 }
981 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
982 EXPECT_CALL(callback_, SendPacket(ssrc, _, second_capture_time_ms, _, _))
983 .Times(1);
984 }
985 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
986 EXPECT_CALL(callback_,
987 SendPacket(ssrc_low_priority, _, capture_time_ms, _, _))
988 .Times(1);
989 }
990 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
991 EXPECT_CALL(callback_, SendPacket(ssrc_low_priority, _,
992 second_capture_time_ms, _, _))
993 .Times(1);
994 }
995 }
996 pacer_->Resume();
997
998 // The pacer was resumed directly after the previous process call finished. It
999 // will therefore wait 5 ms until next process.
1000 clock_.AdvanceTime(TimeUntilNextProcess());
1001
1002 for (size_t i = 0; i < 4; i++) {
1003 pacer_->ProcessPackets();
1004 clock_.AdvanceTime(TimeUntilNextProcess());
1005 }
1006
1007 EXPECT_EQ(TimeDelta::Zero(), pacer_->OldestPacketWaitTime());
1008}
1009
Erik Språngf5815fa2019-08-21 14:27:31 +02001010TEST_F(PacingControllerTest, ExpectedQueueTimeMs) {
Erik Språngd05edec2019-08-14 10:43:47 +02001011 uint32_t ssrc = 12346;
1012 uint16_t sequence_number = 1234;
1013 const size_t kNumPackets = 60;
1014 const size_t kPacketSize = 1200;
1015 const int32_t kMaxBitrate = kPaceMultiplier * 30000;
1016 EXPECT_EQ(TimeDelta::Zero(), pacer_->OldestPacketWaitTime());
1017
1018 pacer_->SetPacingRates(DataRate::bps(30000 * kPaceMultiplier),
1019 DataRate::Zero());
1020 for (size_t i = 0; i < kNumPackets; ++i) {
1021 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
1022 clock_.TimeInMilliseconds(), kPacketSize);
1023 }
1024
1025 // Queue in ms = 1000 * (bytes in queue) *8 / (bits per second)
1026 TimeDelta queue_time =
1027 TimeDelta::ms(1000 * kNumPackets * kPacketSize * 8 / kMaxBitrate);
1028 EXPECT_EQ(queue_time, pacer_->ExpectedQueueTime());
1029
1030 const Timestamp time_start = clock_.CurrentTime();
1031 while (pacer_->QueueSizePackets() > 0) {
1032 clock_.AdvanceTime(TimeUntilNextProcess());
1033 pacer_->ProcessPackets();
1034 }
1035 TimeDelta duration = clock_.CurrentTime() - time_start;
1036
1037 EXPECT_EQ(TimeDelta::Zero(), pacer_->ExpectedQueueTime());
1038
1039 // Allow for aliasing, duration should be within one pack of max time limit.
1040 const TimeDelta deviation =
1041 duration - PacingController::kMaxExpectedQueueLength;
1042 EXPECT_LT(deviation.Abs(),
1043 TimeDelta::ms(1000 * kPacketSize * 8 / kMaxBitrate));
1044}
1045
Erik Språngf5815fa2019-08-21 14:27:31 +02001046TEST_F(PacingControllerTest, QueueTimeGrowsOverTime) {
Erik Språngd05edec2019-08-14 10:43:47 +02001047 uint32_t ssrc = 12346;
1048 uint16_t sequence_number = 1234;
1049 EXPECT_EQ(TimeDelta::Zero(), pacer_->OldestPacketWaitTime());
1050
1051 pacer_->SetPacingRates(DataRate::bps(30000 * kPaceMultiplier),
1052 DataRate::Zero());
1053 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number,
1054 clock_.TimeInMilliseconds(), 1200);
1055
1056 clock_.AdvanceTimeMilliseconds(500);
1057 EXPECT_EQ(TimeDelta::ms(500), pacer_->OldestPacketWaitTime());
1058 pacer_->ProcessPackets();
1059 EXPECT_EQ(TimeDelta::Zero(), pacer_->OldestPacketWaitTime());
1060}
1061
Erik Språngf5815fa2019-08-21 14:27:31 +02001062TEST_F(PacingControllerTest, ProbingWithInsertedPackets) {
Erik Språngd05edec2019-08-14 10:43:47 +02001063 const size_t kPacketSize = 1200;
1064 const int kInitialBitrateBps = 300000;
1065 uint32_t ssrc = 12346;
1066 uint16_t sequence_number = 1234;
1067
1068 PacingControllerProbing packet_sender;
1069 pacer_ = absl::make_unique<PacingController>(&clock_, &packet_sender, nullptr,
1070 nullptr);
1071 pacer_->CreateProbeCluster(kFirstClusterRate,
1072 /*cluster_id=*/0);
1073 pacer_->CreateProbeCluster(kSecondClusterRate,
1074 /*cluster_id=*/1);
1075 pacer_->SetPacingRates(DataRate::bps(kInitialBitrateBps * kPaceMultiplier),
1076 DataRate::Zero());
1077
1078 for (int i = 0; i < 10; ++i) {
1079 Send(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
1080 clock_.TimeInMilliseconds(), kPacketSize);
1081 }
1082
1083 int64_t start = clock_.TimeInMilliseconds();
1084 while (packet_sender.packets_sent() < 5) {
1085 clock_.AdvanceTime(TimeUntilNextProcess());
1086 pacer_->ProcessPackets();
1087 }
1088 int packets_sent = packet_sender.packets_sent();
1089 // Validate first cluster bitrate. Note that we have to account for number
1090 // of intervals and hence (packets_sent - 1) on the first cluster.
1091 EXPECT_NEAR((packets_sent - 1) * kPacketSize * 8000 /
1092 (clock_.TimeInMilliseconds() - start),
1093 kFirstClusterRate.bps(), kProbingErrorMargin.bps());
1094 EXPECT_EQ(0, packet_sender.padding_sent());
1095
1096 clock_.AdvanceTime(TimeUntilNextProcess());
1097 start = clock_.TimeInMilliseconds();
1098 while (packet_sender.packets_sent() < 10) {
1099 clock_.AdvanceTime(TimeUntilNextProcess());
1100 pacer_->ProcessPackets();
1101 }
1102 packets_sent = packet_sender.packets_sent() - packets_sent;
1103 // Validate second cluster bitrate.
1104 EXPECT_NEAR((packets_sent - 1) * kPacketSize * 8000 /
1105 (clock_.TimeInMilliseconds() - start),
1106 kSecondClusterRate.bps(), kProbingErrorMargin.bps());
1107}
1108
Erik Språngf5815fa2019-08-21 14:27:31 +02001109TEST_F(PacingControllerTest, ProbingWithPaddingSupport) {
Erik Språngd05edec2019-08-14 10:43:47 +02001110 const size_t kPacketSize = 1200;
1111 const int kInitialBitrateBps = 300000;
1112 uint32_t ssrc = 12346;
1113 uint16_t sequence_number = 1234;
1114
1115 PacingControllerProbing packet_sender;
1116 pacer_ = absl::make_unique<PacingController>(&clock_, &packet_sender, nullptr,
1117 nullptr);
1118 pacer_->CreateProbeCluster(kFirstClusterRate,
1119 /*cluster_id=*/0);
1120 pacer_->SetPacingRates(DataRate::bps(kInitialBitrateBps * kPaceMultiplier),
1121 DataRate::Zero());
1122
1123 for (int i = 0; i < 3; ++i) {
1124 Send(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
1125 clock_.TimeInMilliseconds(), kPacketSize);
1126 }
1127
1128 int64_t start = clock_.TimeInMilliseconds();
1129 int process_count = 0;
1130 while (process_count < 5) {
1131 clock_.AdvanceTime(TimeUntilNextProcess());
1132 pacer_->ProcessPackets();
1133 ++process_count;
1134 }
1135 int packets_sent = packet_sender.packets_sent();
1136 int padding_sent = packet_sender.padding_sent();
1137 EXPECT_GT(packets_sent, 0);
1138 EXPECT_GT(padding_sent, 0);
1139 // Note that the number of intervals here for kPacketSize is
1140 // packets_sent due to padding in the same cluster.
1141 EXPECT_NEAR((packets_sent * kPacketSize * 8000 + padding_sent) /
1142 (clock_.TimeInMilliseconds() - start),
1143 kFirstClusterRate.bps(), kProbingErrorMargin.bps());
1144}
1145
Erik Språngf5815fa2019-08-21 14:27:31 +02001146TEST_F(PacingControllerTest, PaddingOveruse) {
Erik Språngd05edec2019-08-14 10:43:47 +02001147 uint32_t ssrc = 12346;
1148 uint16_t sequence_number = 1234;
1149 const size_t kPacketSize = 1200;
1150
1151 pacer_->ProcessPackets();
1152 pacer_->SetPacingRates(DataRate::bps(60000 * kPaceMultiplier),
1153 DataRate::Zero());
1154
1155 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
1156 clock_.TimeInMilliseconds(), kPacketSize);
1157 pacer_->ProcessPackets();
1158
1159 // Add 30kbit padding. When increasing budget, media budget will increase from
1160 // negative (overuse) while padding budget will increase from 0.
1161 clock_.AdvanceTimeMilliseconds(5);
1162 pacer_->SetPacingRates(DataRate::bps(60000 * kPaceMultiplier),
1163 DataRate::bps(30000));
1164
1165 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
1166 clock_.TimeInMilliseconds(), kPacketSize);
1167 EXPECT_LT(TimeDelta::ms(5), pacer_->ExpectedQueueTime());
1168 // Don't send padding if queue is non-empty, even if padding budget > 0.
1169 EXPECT_CALL(callback_, SendPadding).Times(0);
1170 pacer_->ProcessPackets();
1171}
1172
Erik Språngf5815fa2019-08-21 14:27:31 +02001173TEST_F(PacingControllerTest, ProbeClusterId) {
Erik Språngd05edec2019-08-14 10:43:47 +02001174 MockPacketSender callback;
1175
1176 pacer_ =
1177 absl::make_unique<PacingController>(&clock_, &callback, nullptr, nullptr);
1178 Init();
1179
1180 uint32_t ssrc = 12346;
1181 uint16_t sequence_number = 1234;
1182 const size_t kPacketSize = 1200;
1183
1184 pacer_->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
1185 pacer_->SetProbingEnabled(true);
1186 for (int i = 0; i < 10; ++i) {
1187 Send(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
1188 clock_.TimeInMilliseconds(), kPacketSize);
1189 }
1190
1191 // First probing cluster.
Erik Språngf5815fa2019-08-21 14:27:31 +02001192 EXPECT_CALL(callback,
1193 SendRtpPacket(_, Field(&PacedPacketInfo::probe_cluster_id, 0)))
1194 .Times(5);
Erik Språngd05edec2019-08-14 10:43:47 +02001195
1196 for (int i = 0; i < 5; ++i) {
1197 clock_.AdvanceTimeMilliseconds(20);
1198 pacer_->ProcessPackets();
1199 }
1200
1201 // Second probing cluster.
Erik Språngf5815fa2019-08-21 14:27:31 +02001202 EXPECT_CALL(callback,
1203 SendRtpPacket(_, Field(&PacedPacketInfo::probe_cluster_id, 1)))
1204 .Times(5);
Erik Språngd05edec2019-08-14 10:43:47 +02001205
1206 for (int i = 0; i < 5; ++i) {
1207 clock_.AdvanceTimeMilliseconds(20);
1208 pacer_->ProcessPackets();
1209 }
1210
1211 // Needed for the Field comparer below.
1212 const int kNotAProbe = PacedPacketInfo::kNotAProbe;
1213 // No more probing packets.
Erik Språngf5815fa2019-08-21 14:27:31 +02001214 EXPECT_CALL(callback, GeneratePadding).WillOnce([&](DataSize padding_size) {
1215 std::vector<std::unique_ptr<RtpPacketToSend>> padding_packets;
1216 padding_packets.emplace_back(
1217 BuildPacket(RtpPacketToSend::Type::kPadding, ssrc, sequence_number++,
1218 clock_.TimeInMilliseconds(), padding_size.bytes()));
1219 return padding_packets;
1220 });
1221 EXPECT_CALL(
1222 callback,
1223 SendRtpPacket(_, Field(&PacedPacketInfo::probe_cluster_id, kNotAProbe)))
1224 .Times(1);
Erik Språngd05edec2019-08-14 10:43:47 +02001225 pacer_->ProcessPackets();
1226}
1227
Erik Språngf5815fa2019-08-21 14:27:31 +02001228TEST_F(PacingControllerTest, OwnedPacketPrioritizedOnType) {
Erik Språngd05edec2019-08-14 10:43:47 +02001229 MockPacketSender callback;
1230 pacer_ =
1231 absl::make_unique<PacingController>(&clock_, &callback, nullptr, nullptr);
1232 Init();
1233
1234 // Insert a packet of each type, from low to high priority. Since priority
1235 // is weighted higher than insert order, these should come out of the pacer
1236 // in backwards order with the exception of FEC and Video.
1237 for (RtpPacketToSend::Type type :
1238 {RtpPacketToSend::Type::kPadding,
1239 RtpPacketToSend::Type::kForwardErrorCorrection,
1240 RtpPacketToSend::Type::kVideo, RtpPacketToSend::Type::kRetransmission,
1241 RtpPacketToSend::Type::kAudio}) {
1242 pacer_->EnqueuePacket(BuildRtpPacket(type));
1243 }
1244
1245 ::testing::InSequence seq;
1246 EXPECT_CALL(
1247 callback,
1248 SendRtpPacket(Pointee(Property(&RtpPacketToSend::Ssrc, kAudioSsrc)), _));
1249 EXPECT_CALL(callback,
1250 SendRtpPacket(
1251 Pointee(Property(&RtpPacketToSend::Ssrc, kVideoRtxSsrc)), _));
1252
1253 // FEC and video actually have the same priority, so will come out in
1254 // insertion order.
1255 EXPECT_CALL(callback,
1256 SendRtpPacket(
1257 Pointee(Property(&RtpPacketToSend::Ssrc, kFlexFecSsrc)), _));
1258 EXPECT_CALL(
1259 callback,
1260 SendRtpPacket(Pointee(Property(&RtpPacketToSend::Ssrc, kVideoSsrc)), _));
1261
1262 EXPECT_CALL(callback,
1263 SendRtpPacket(
1264 Pointee(Property(&RtpPacketToSend::Ssrc, kVideoRtxSsrc)), _));
1265
1266 clock_.AdvanceTimeMilliseconds(200);
1267 pacer_->ProcessPackets();
1268}
Erik Språngd05edec2019-08-14 10:43:47 +02001269} // namespace test
1270} // namespace webrtc