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