blob: 64ae00ec9f50de05a7a1e1eedfff2a0bc3ab4346 [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 {
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +010036constexpr DataRate kFirstClusterRate = DataRate::KilobitsPerSec(900);
37constexpr DataRate kSecondClusterRate = DataRate::KilobitsPerSec(1800);
Erik Språngd05edec2019-08-14 10:43:47 +020038
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.
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +010042constexpr DataRate kProbingErrorMargin = DataRate::KilobitsPerSec(150);
Erik Språngd05edec2019-08-14 10:43:47 +020043
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
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +010051constexpr DataRate kTargetRate = DataRate::KilobitsPerSec(800);
Erik Språngd05edec2019-08-14 10:43:47 +020052
Björn Terelius31d0f7c2020-02-06 16:35:46 +010053std::unique_ptr<RtpPacketToSend> BuildPacket(RtpPacketMediaType type,
Erik Språngd05edec2019-08-14 10:43:47 +020054 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(),
Björn Terelius31d0f7c2020-02-06 16:35:46 +010076 packet->packet_type() == RtpPacketMediaType::kRetransmission,
77 packet->packet_type() == RtpPacketMediaType::kPadding);
Erik Språngd05edec2019-08-14 10:43:47 +020078 }
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);
Björn Terelius31d0f7c2020-02-06 16:35:46 +010087 packet->set_packet_type(RtpPacketMediaType::kPadding);
Erik Språngd05edec2019-08-14 10:43:47 +020088 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
Erik Språngeb487992019-11-14 14:15:15 +0100117 PacingControllerPadding() : padding_sent_(0), total_bytes_sent_(0) {}
Erik Språngd05edec2019-08-14 10:43:47 +0200118
Erik Språngd05edec2019-08-14 10:43:47 +0200119 void SendRtpPacket(std::unique_ptr<RtpPacketToSend> packet,
Erik Språngeb487992019-11-14 14:15:15 +0100120 const PacedPacketInfo& pacing_info) override {
121 total_bytes_sent_ += packet->payload_size();
122 }
Erik Språngd05edec2019-08-14 10:43:47 +0200123
Erik Språngd05edec2019-08-14 10:43:47 +0200124 std::vector<std::unique_ptr<RtpPacketToSend>> GeneratePadding(
125 DataSize target_size) override {
126 size_t num_packets =
127 (target_size.bytes() + kPaddingPacketSize - 1) / kPaddingPacketSize;
128 std::vector<std::unique_ptr<RtpPacketToSend>> packets;
129 for (size_t i = 0; i < num_packets; ++i) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200130 packets.emplace_back(std::make_unique<RtpPacketToSend>(nullptr));
Erik Språngd05edec2019-08-14 10:43:47 +0200131 packets.back()->SetPadding(kPaddingPacketSize);
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100132 packets.back()->set_packet_type(RtpPacketMediaType::kPadding);
Erik Språngd05edec2019-08-14 10:43:47 +0200133 padding_sent_ += kPaddingPacketSize;
134 }
135 return packets;
136 }
137
138 size_t padding_sent() { return padding_sent_; }
Erik Språngeb487992019-11-14 14:15:15 +0100139 size_t total_bytes_sent() { return total_bytes_sent_; }
Erik Språngd05edec2019-08-14 10:43:47 +0200140
141 private:
142 size_t padding_sent_;
Erik Språngeb487992019-11-14 14:15:15 +0100143 size_t total_bytes_sent_;
Erik Språngd05edec2019-08-14 10:43:47 +0200144};
145
146class PacingControllerProbing : public PacingController::PacketSender {
147 public:
148 PacingControllerProbing() : packets_sent_(0), padding_sent_(0) {}
149
Erik Språngd05edec2019-08-14 10:43:47 +0200150 void SendRtpPacket(std::unique_ptr<RtpPacketToSend> packet,
151 const PacedPacketInfo& pacing_info) override {
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100152 if (packet->packet_type() != RtpPacketMediaType::kPadding) {
Erik Språngd05edec2019-08-14 10:43:47 +0200153 ++packets_sent_;
154 }
155 }
156
Erik Språngd05edec2019-08-14 10:43:47 +0200157 std::vector<std::unique_ptr<RtpPacketToSend>> GeneratePadding(
158 DataSize target_size) override {
Erik Språngb210eeb2019-11-05 11:21:48 +0100159 // From RTPSender:
160 // Max in the RFC 3550 is 255 bytes, we limit it to be modulus 32 for SRTP.
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +0100161 const DataSize kMaxPadding = DataSize::Bytes(224);
Erik Språngb210eeb2019-11-05 11:21:48 +0100162
Erik Språngd05edec2019-08-14 10:43:47 +0200163 std::vector<std::unique_ptr<RtpPacketToSend>> packets;
Erik Språngb210eeb2019-11-05 11:21:48 +0100164 while (target_size > DataSize::Zero()) {
165 DataSize padding_size = std::min(kMaxPadding, target_size);
166 packets.emplace_back(std::make_unique<RtpPacketToSend>(nullptr));
167 packets.back()->SetPadding(padding_size.bytes());
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100168 packets.back()->set_packet_type(RtpPacketMediaType::kPadding);
Erik Språngb210eeb2019-11-05 11:21:48 +0100169 padding_sent_ += padding_size.bytes();
170 target_size -= padding_size;
171 }
Erik Språngd05edec2019-08-14 10:43:47 +0200172 return packets;
173 }
174
175 int packets_sent() const { return packets_sent_; }
176
177 int padding_sent() const { return padding_sent_; }
178
179 private:
180 int packets_sent_;
181 int padding_sent_;
182};
183
Erik Språngeb487992019-11-14 14:15:15 +0100184class PacingControllerTest
185 : public ::testing::TestWithParam<PacingController::ProcessMode> {
Erik Språngd05edec2019-08-14 10:43:47 +0200186 protected:
Erik Språngf5815fa2019-08-21 14:27:31 +0200187 PacingControllerTest() : clock_(123456) {
Erik Språngd05edec2019-08-14 10:43:47 +0200188 srand(0);
189 // Need to initialize PacingController after we initialize clock.
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200190 pacer_ = std::make_unique<PacingController>(&clock_, &callback_, nullptr,
Erik Språngeb487992019-11-14 14:15:15 +0100191 nullptr, GetParam());
Erik Språngd05edec2019-08-14 10:43:47 +0200192 Init();
193 }
194
Erik Språngeb487992019-11-14 14:15:15 +0100195 bool PeriodicProcess() const {
196 return GetParam() == PacingController::ProcessMode::kPeriodic;
197 }
198
Erik Språngd05edec2019-08-14 10:43:47 +0200199 void Init() {
200 pacer_->CreateProbeCluster(kFirstClusterRate, /*cluster_id=*/0);
201 pacer_->CreateProbeCluster(kSecondClusterRate, /*cluster_id=*/1);
202 // Default to bitrate probing disabled for testing purposes. Probing tests
203 // have to enable probing, either by creating a new PacingController
204 // instance or by calling SetProbingEnabled(true).
205 pacer_->SetProbingEnabled(false);
206 pacer_->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
207
208 clock_.AdvanceTime(TimeUntilNextProcess());
209 }
210
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100211 void Send(RtpPacketMediaType type,
Erik Språngd05edec2019-08-14 10:43:47 +0200212 uint32_t ssrc,
213 uint16_t sequence_number,
214 int64_t capture_time_ms,
215 size_t size) {
Erik Språngf5815fa2019-08-21 14:27:31 +0200216 pacer_->EnqueuePacket(
217 BuildPacket(type, ssrc, sequence_number, capture_time_ms, size));
Erik Språngd05edec2019-08-14 10:43:47 +0200218 }
219
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100220 void SendAndExpectPacket(RtpPacketMediaType type,
Erik Språngd05edec2019-08-14 10:43:47 +0200221 uint32_t ssrc,
222 uint16_t sequence_number,
223 int64_t capture_time_ms,
224 size_t size) {
225 Send(type, ssrc, sequence_number, capture_time_ms, size);
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100226 EXPECT_CALL(callback_,
227 SendPacket(ssrc, sequence_number, capture_time_ms,
228 type == RtpPacketMediaType::kRetransmission, false))
Erik Språngd05edec2019-08-14 10:43:47 +0200229 .Times(1);
230 }
231
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100232 std::unique_ptr<RtpPacketToSend> BuildRtpPacket(RtpPacketMediaType type) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200233 auto packet = std::make_unique<RtpPacketToSend>(nullptr);
Erik Språngd05edec2019-08-14 10:43:47 +0200234 packet->set_packet_type(type);
235 switch (type) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100236 case RtpPacketMediaType::kAudio:
Erik Språngd05edec2019-08-14 10:43:47 +0200237 packet->SetSsrc(kAudioSsrc);
238 break;
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100239 case RtpPacketMediaType::kVideo:
Erik Språngd05edec2019-08-14 10:43:47 +0200240 packet->SetSsrc(kVideoSsrc);
241 break;
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100242 case RtpPacketMediaType::kRetransmission:
243 case RtpPacketMediaType::kPadding:
Erik Språngd05edec2019-08-14 10:43:47 +0200244 packet->SetSsrc(kVideoRtxSsrc);
245 break;
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100246 case RtpPacketMediaType::kForwardErrorCorrection:
Erik Språngd05edec2019-08-14 10:43:47 +0200247 packet->SetSsrc(kFlexFecSsrc);
248 break;
249 }
250
251 packet->SetPayloadSize(234);
252 return packet;
253 }
254
255 TimeDelta TimeUntilNextProcess() {
Erik Språngeb487992019-11-14 14:15:15 +0100256 Timestamp now = clock_.CurrentTime();
257 return std::max(pacer_->NextSendTime() - now, TimeDelta::Zero());
258 }
Erik Språngd05edec2019-08-14 10:43:47 +0200259
Erik Språngeb487992019-11-14 14:15:15 +0100260 void AdvanceTimeAndProcess() {
261 Timestamp now = clock_.CurrentTime();
262 Timestamp next_send_time = pacer_->NextSendTime();
263 clock_.AdvanceTime(std::max(TimeDelta::Zero(), next_send_time - now));
264 pacer_->ProcessPackets();
265 }
266
267 void ConsumeInitialBudget() {
268 const uint32_t kSsrc = 54321;
269 uint16_t sequence_number = 1234;
270 int64_t capture_time_ms = clock_.TimeInMilliseconds();
271 const size_t kPacketSize = 250;
272
273 EXPECT_EQ(TimeDelta::Zero(), pacer_->OldestPacketWaitTime());
274
275 // Due to the multiplicative factor we can send 5 packets during a send
276 // interval. (network capacity * multiplier / (8 bits per byte *
277 // (packet size * #send intervals per second)
278 const size_t packets_to_send_per_interval =
279 kTargetRate.bps() * kPaceMultiplier / (8 * kPacketSize * 200);
280 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100281 SendAndExpectPacket(RtpPacketMediaType::kVideo, kSsrc, sequence_number++,
282 capture_time_ms, kPacketSize);
Erik Språngd05edec2019-08-14 10:43:47 +0200283 }
284
Erik Språngeb487992019-11-14 14:15:15 +0100285 while (pacer_->QueueSizePackets() > 0) {
286 if (PeriodicProcess()) {
287 clock_.AdvanceTime(TimeUntilNextProcess());
288 pacer_->ProcessPackets();
289 } else {
290 AdvanceTimeAndProcess();
291 }
Erik Språngd05edec2019-08-14 10:43:47 +0200292 }
Erik Språngd05edec2019-08-14 10:43:47 +0200293 }
294
295 SimulatedClock clock_;
Erik Språngd05edec2019-08-14 10:43:47 +0200296 MockPacingControllerCallback callback_;
297 std::unique_ptr<PacingController> pacer_;
298};
299
Erik Språngeb487992019-11-14 14:15:15 +0100300class PacingControllerFieldTrialTest
301 : public ::testing::TestWithParam<PacingController::ProcessMode> {
Erik Språngd05edec2019-08-14 10:43:47 +0200302 protected:
303 struct MediaStream {
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100304 const RtpPacketMediaType type;
Erik Språngd05edec2019-08-14 10:43:47 +0200305 const uint32_t ssrc;
306 const size_t packet_size;
307 uint16_t seq_num;
308 };
309
310 const int kProcessIntervalsPerSecond = 1000 / 5;
311
312 PacingControllerFieldTrialTest() : clock_(123456) {}
313 void InsertPacket(PacingController* pacer, MediaStream* stream) {
Erik Språngf5815fa2019-08-21 14:27:31 +0200314 pacer->EnqueuePacket(
315 BuildPacket(stream->type, stream->ssrc, stream->seq_num++,
316 clock_.TimeInMilliseconds(), stream->packet_size));
Erik Språngd05edec2019-08-14 10:43:47 +0200317 }
318 void ProcessNext(PacingController* pacer) {
Erik Språngeb487992019-11-14 14:15:15 +0100319 if (GetParam() == PacingController::ProcessMode::kPeriodic) {
Danil Chapovalov55284022020-02-07 14:53:52 +0100320 TimeDelta process_interval = TimeDelta::Millis(5);
Erik Språngeb487992019-11-14 14:15:15 +0100321 clock_.AdvanceTime(process_interval);
322 pacer->ProcessPackets();
323 return;
324 }
325
326 Timestamp now = clock_.CurrentTime();
327 Timestamp next_send_time = pacer->NextSendTime();
328 TimeDelta wait_time = std::max(TimeDelta::Zero(), next_send_time - now);
329 clock_.AdvanceTime(wait_time);
Erik Språngd05edec2019-08-14 10:43:47 +0200330 pacer->ProcessPackets();
331 }
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100332 MediaStream audio{/*type*/ RtpPacketMediaType::kAudio,
Erik Språngd05edec2019-08-14 10:43:47 +0200333 /*ssrc*/ 3333, /*packet_size*/ 100, /*seq_num*/ 1000};
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100334 MediaStream video{/*type*/ RtpPacketMediaType::kVideo,
Erik Språngd05edec2019-08-14 10:43:47 +0200335 /*ssrc*/ 4444, /*packet_size*/ 1000, /*seq_num*/ 1000};
336 SimulatedClock clock_;
337 MockPacingControllerCallback callback_;
338};
339
Erik Språngeb487992019-11-14 14:15:15 +0100340TEST_P(PacingControllerFieldTrialTest, DefaultNoPaddingInSilence) {
341 PacingController pacer(&clock_, &callback_, nullptr, nullptr, GetParam());
Erik Språngd05edec2019-08-14 10:43:47 +0200342 pacer.SetPacingRates(kTargetRate, DataRate::Zero());
343 // Video packet to reset last send time and provide padding data.
344 InsertPacket(&pacer, &video);
345 EXPECT_CALL(callback_, SendPacket).Times(1);
346 clock_.AdvanceTimeMilliseconds(5);
347 pacer.ProcessPackets();
348 EXPECT_CALL(callback_, SendPadding).Times(0);
349 // Waiting 500 ms should not trigger sending of padding.
350 clock_.AdvanceTimeMilliseconds(500);
351 pacer.ProcessPackets();
352}
353
Erik Språngeb487992019-11-14 14:15:15 +0100354TEST_P(PacingControllerFieldTrialTest, PaddingInSilenceWithTrial) {
Erik Språngf5815fa2019-08-21 14:27:31 +0200355 ScopedFieldTrials trial("WebRTC-Pacer-PadInSilence/Enabled/");
Erik Språngeb487992019-11-14 14:15:15 +0100356 PacingController pacer(&clock_, &callback_, nullptr, nullptr, GetParam());
Erik Språngd05edec2019-08-14 10:43:47 +0200357 pacer.SetPacingRates(kTargetRate, DataRate::Zero());
358 // Video packet to reset last send time and provide padding data.
359 InsertPacket(&pacer, &video);
Erik Språngf5815fa2019-08-21 14:27:31 +0200360 EXPECT_CALL(callback_, SendPacket).Times(2);
Erik Språngd05edec2019-08-14 10:43:47 +0200361 clock_.AdvanceTimeMilliseconds(5);
362 pacer.ProcessPackets();
363 EXPECT_CALL(callback_, SendPadding).WillOnce(Return(1000));
364 // Waiting 500 ms should trigger sending of padding.
365 clock_.AdvanceTimeMilliseconds(500);
366 pacer.ProcessPackets();
367}
368
Evan Shrubsole6ef59d12020-01-08 16:45:08 +0100369TEST_P(PacingControllerFieldTrialTest, CongestionWindowAffectsAudioInTrial) {
370 ScopedFieldTrials trial("WebRTC-Pacer-BlockAudio/Enabled/");
Erik Språngd05edec2019-08-14 10:43:47 +0200371 EXPECT_CALL(callback_, SendPadding).Times(0);
Erik Språngeb487992019-11-14 14:15:15 +0100372 PacingController pacer(&clock_, &callback_, nullptr, nullptr, GetParam());
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +0100373 pacer.SetPacingRates(DataRate::KilobitsPerSec(10000), DataRate::Zero());
374 pacer.SetCongestionWindow(DataSize::Bytes(video.packet_size - 100));
Erik Språngd05edec2019-08-14 10:43:47 +0200375 pacer.UpdateOutstandingData(DataSize::Zero());
376 // Video packet fills congestion window.
377 InsertPacket(&pacer, &video);
378 EXPECT_CALL(callback_, SendPacket).Times(1);
379 ProcessNext(&pacer);
380 // Audio packet blocked due to congestion.
381 InsertPacket(&pacer, &audio);
382 EXPECT_CALL(callback_, SendPacket).Times(0);
Erik Språngeb487992019-11-14 14:15:15 +0100383 if (GetParam() == PacingController::ProcessMode::kDynamic) {
384 // Without interval budget we'll forward time to where we send keep-alive.
385 EXPECT_CALL(callback_, SendPadding(1)).Times(2);
386 }
Erik Språngd05edec2019-08-14 10:43:47 +0200387 ProcessNext(&pacer);
388 ProcessNext(&pacer);
389 // Audio packet unblocked when congestion window clear.
390 ::testing::Mock::VerifyAndClearExpectations(&callback_);
391 pacer.UpdateOutstandingData(DataSize::Zero());
392 EXPECT_CALL(callback_, SendPacket).Times(1);
393 ProcessNext(&pacer);
394}
395
Erik Språngeb487992019-11-14 14:15:15 +0100396TEST_P(PacingControllerFieldTrialTest,
Evan Shrubsole6ef59d12020-01-08 16:45:08 +0100397 DefaultCongestionWindowDoesNotAffectAudio) {
Erik Språngd05edec2019-08-14 10:43:47 +0200398 EXPECT_CALL(callback_, SendPadding).Times(0);
Erik Språngeb487992019-11-14 14:15:15 +0100399 PacingController pacer(&clock_, &callback_, nullptr, nullptr, GetParam());
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +0100400 pacer.SetPacingRates(DataRate::BitsPerSec(10000000), DataRate::Zero());
401 pacer.SetCongestionWindow(DataSize::Bytes(800));
Erik Språngd05edec2019-08-14 10:43:47 +0200402 pacer.UpdateOutstandingData(DataSize::Zero());
403 // Video packet fills congestion window.
404 InsertPacket(&pacer, &video);
405 EXPECT_CALL(callback_, SendPacket).Times(1);
406 ProcessNext(&pacer);
407 // Audio not blocked due to congestion.
408 InsertPacket(&pacer, &audio);
409 EXPECT_CALL(callback_, SendPacket).Times(1);
410 ProcessNext(&pacer);
411}
412
Evan Shrubsole6ef59d12020-01-08 16:45:08 +0100413TEST_P(PacingControllerFieldTrialTest, BudgetAffectsAudioInTrial) {
414 ScopedFieldTrials trial("WebRTC-Pacer-BlockAudio/Enabled/");
Erik Språngeb487992019-11-14 14:15:15 +0100415 PacingController pacer(&clock_, &callback_, nullptr, nullptr, GetParam());
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +0100416 DataRate pacing_rate = DataRate::BitsPerSec(video.packet_size / 3 * 8 *
417 kProcessIntervalsPerSecond);
Erik Språngeb487992019-11-14 14:15:15 +0100418 pacer.SetPacingRates(pacing_rate, DataRate::Zero());
Erik Språngd05edec2019-08-14 10:43:47 +0200419 // Video fills budget for following process periods.
420 InsertPacket(&pacer, &video);
421 EXPECT_CALL(callback_, SendPacket).Times(1);
422 ProcessNext(&pacer);
423 // Audio packet blocked due to budget limit.
Erik Språngd05edec2019-08-14 10:43:47 +0200424 InsertPacket(&pacer, &audio);
Erik Språngeb487992019-11-14 14:15:15 +0100425 Timestamp wait_start_time = clock_.CurrentTime();
426 Timestamp wait_end_time = Timestamp::MinusInfinity();
427 EXPECT_CALL(callback_, SendPacket)
428 .WillOnce([&](uint32_t ssrc, uint16_t sequence_number,
429 int64_t capture_timestamp, bool retransmission,
430 bool padding) { wait_end_time = clock_.CurrentTime(); });
431 while (!wait_end_time.IsFinite()) {
432 ProcessNext(&pacer);
433 }
434 const TimeDelta expected_wait_time =
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +0100435 DataSize::Bytes(video.packet_size) / pacing_rate;
Erik Språngeb487992019-11-14 14:15:15 +0100436 // Verify delay is near expectation, within timing margin.
437 EXPECT_LT(((wait_end_time - wait_start_time) - expected_wait_time).Abs(),
438 GetParam() == PacingController::ProcessMode::kPeriodic
Danil Chapovalov55284022020-02-07 14:53:52 +0100439 ? TimeDelta::Millis(5)
Erik Språngeb487992019-11-14 14:15:15 +0100440 : PacingController::kMinSleepTime);
Erik Språngd05edec2019-08-14 10:43:47 +0200441}
442
Evan Shrubsole6ef59d12020-01-08 16:45:08 +0100443TEST_P(PacingControllerFieldTrialTest, DefaultBudgetDoesNotAffectAudio) {
Erik Språngd05edec2019-08-14 10:43:47 +0200444 EXPECT_CALL(callback_, SendPadding).Times(0);
Erik Språngeb487992019-11-14 14:15:15 +0100445 PacingController pacer(&clock_, &callback_, nullptr, nullptr, GetParam());
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +0100446 pacer.SetPacingRates(DataRate::BitsPerSec(video.packet_size / 3 * 8 *
447 kProcessIntervalsPerSecond),
448 DataRate::Zero());
Erik Språngd05edec2019-08-14 10:43:47 +0200449 // Video fills budget for following process periods.
450 InsertPacket(&pacer, &video);
451 EXPECT_CALL(callback_, SendPacket).Times(1);
452 ProcessNext(&pacer);
453 // Audio packet not blocked due to budget limit.
454 EXPECT_CALL(callback_, SendPacket).Times(1);
455 InsertPacket(&pacer, &audio);
456 ProcessNext(&pacer);
457}
458
Erik Språngeb487992019-11-14 14:15:15 +0100459INSTANTIATE_TEST_SUITE_P(WithAndWithoutIntervalBudget,
460 PacingControllerFieldTrialTest,
461 ::testing::Values(false, true));
462
463TEST_P(PacingControllerTest, FirstSentPacketTimeIsSet) {
Erik Språngd05edec2019-08-14 10:43:47 +0200464 uint16_t sequence_number = 1234;
465 const uint32_t kSsrc = 12345;
466 const size_t kSizeBytes = 250;
467 const size_t kPacketToSend = 3;
468 const Timestamp kStartTime = clock_.CurrentTime();
469
470 // No packet sent.
471 EXPECT_FALSE(pacer_->FirstSentPacketTime().has_value());
472
473 for (size_t i = 0; i < kPacketToSend; ++i) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100474 SendAndExpectPacket(RtpPacketMediaType::kVideo, kSsrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +0200475 clock_.TimeInMilliseconds(), kSizeBytes);
Erik Språngd05edec2019-08-14 10:43:47 +0200476 clock_.AdvanceTime(TimeUntilNextProcess());
Erik Språngeb487992019-11-14 14:15:15 +0100477 pacer_->ProcessPackets();
Erik Språngd05edec2019-08-14 10:43:47 +0200478 }
479 EXPECT_EQ(kStartTime, pacer_->FirstSentPacketTime());
480}
481
Erik Språngeb487992019-11-14 14:15:15 +0100482TEST_P(PacingControllerTest, QueuePacket) {
483 if (!PeriodicProcess()) {
484 // This test checks behavior applicable only when using interval budget.
485 return;
486 }
487
Erik Språngd05edec2019-08-14 10:43:47 +0200488 uint32_t ssrc = 12345;
489 uint16_t sequence_number = 1234;
Erik Språngeb487992019-11-14 14:15:15 +0100490 // Due to the multiplicative factor we can send 5 packets during a 5ms send
Erik Språngd05edec2019-08-14 10:43:47 +0200491 // interval. (network capacity * multiplier / (8 bits per byte *
492 // (packet size * #send intervals per second)
Erik Språngeb487992019-11-14 14:15:15 +0100493 const size_t kPacketsToSend =
Erik Språngd05edec2019-08-14 10:43:47 +0200494 kTargetRate.bps() * kPaceMultiplier / (8 * 250 * 200);
Erik Språngeb487992019-11-14 14:15:15 +0100495 for (size_t i = 0; i < kPacketsToSend; ++i) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100496 SendAndExpectPacket(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +0200497 clock_.TimeInMilliseconds(), 250);
498 }
Erik Språngeb487992019-11-14 14:15:15 +0100499 EXPECT_CALL(callback_, SendPadding).Times(0);
Erik Språngd05edec2019-08-14 10:43:47 +0200500
Erik Språngeb487992019-11-14 14:15:15 +0100501 // Enqueue one extra packet.
Erik Språngd05edec2019-08-14 10:43:47 +0200502 int64_t queued_packet_timestamp = clock_.TimeInMilliseconds();
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100503 Send(RtpPacketMediaType::kVideo, ssrc, sequence_number,
Erik Språngd05edec2019-08-14 10:43:47 +0200504 queued_packet_timestamp, 250);
Erik Språngeb487992019-11-14 14:15:15 +0100505 EXPECT_EQ(kPacketsToSend + 1, pacer_->QueueSizePackets());
506
507 // The first kPacketsToSend packets will be sent with budget from the
508 // initial 5ms interval.
Erik Språngd05edec2019-08-14 10:43:47 +0200509 pacer_->ProcessPackets();
Erik Språngd05edec2019-08-14 10:43:47 +0200510 EXPECT_EQ(1u, pacer_->QueueSizePackets());
Erik Språngeb487992019-11-14 14:15:15 +0100511
512 // Advance time to next interval, make sure the last packet is sent.
513 clock_.AdvanceTimeMilliseconds(5);
Erik Språngd05edec2019-08-14 10:43:47 +0200514 EXPECT_CALL(callback_, SendPacket(ssrc, sequence_number++,
515 queued_packet_timestamp, false, false))
516 .Times(1);
517 pacer_->ProcessPackets();
518 sequence_number++;
519 EXPECT_EQ(0u, pacer_->QueueSizePackets());
520
521 // We can send packets_to_send -1 packets of size 250 during the current
522 // interval since one packet has already been sent.
Erik Språngeb487992019-11-14 14:15:15 +0100523 for (size_t i = 0; i < kPacketsToSend - 1; ++i) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100524 SendAndExpectPacket(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +0200525 clock_.TimeInMilliseconds(), 250);
526 }
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100527 Send(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +0200528 clock_.TimeInMilliseconds(), 250);
Erik Språngeb487992019-11-14 14:15:15 +0100529 EXPECT_EQ(kPacketsToSend, pacer_->QueueSizePackets());
Erik Språngd05edec2019-08-14 10:43:47 +0200530 pacer_->ProcessPackets();
531 EXPECT_EQ(1u, pacer_->QueueSizePackets());
532}
533
Erik Språngeb487992019-11-14 14:15:15 +0100534TEST_P(PacingControllerTest, QueueAndPacePackets) {
535 if (PeriodicProcess()) {
536 // This test checks behavior when not using interval budget.
537 return;
538 }
539
540 const uint32_t kSsrc = 12345;
541 uint16_t sequence_number = 1234;
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +0100542 const DataSize kPackeSize = DataSize::Bytes(250);
Danil Chapovalov55284022020-02-07 14:53:52 +0100543 const TimeDelta kSendInterval = TimeDelta::Millis(5);
Erik Språngeb487992019-11-14 14:15:15 +0100544
545 // Due to the multiplicative factor we can send 5 packets during a 5ms send
546 // interval. (send interval * network capacity * multiplier / packet size)
547 const size_t kPacketsToSend = (kSendInterval * kTargetRate).bytes() *
548 kPaceMultiplier / kPackeSize.bytes();
549
550 for (size_t i = 0; i < kPacketsToSend; ++i) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100551 SendAndExpectPacket(RtpPacketMediaType::kVideo, kSsrc, sequence_number++,
Erik Språngeb487992019-11-14 14:15:15 +0100552 clock_.TimeInMilliseconds(), kPackeSize.bytes());
553 }
554 EXPECT_CALL(callback_, SendPadding).Times(0);
555
556 // Enqueue one extra packet.
557 int64_t queued_packet_timestamp = clock_.TimeInMilliseconds();
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100558 Send(RtpPacketMediaType::kVideo, kSsrc, sequence_number,
Erik Språngeb487992019-11-14 14:15:15 +0100559 queued_packet_timestamp, kPackeSize.bytes());
560 EXPECT_EQ(kPacketsToSend + 1, pacer_->QueueSizePackets());
561
562 // Send packets until the initial kPacketsToSend packets are done.
563 Timestamp start_time = clock_.CurrentTime();
564 while (pacer_->QueueSizePackets() > 1) {
565 AdvanceTimeAndProcess();
566 }
567 EXPECT_LT(clock_.CurrentTime() - start_time, kSendInterval);
568
569 // Proceed till last packet can be sent.
570 EXPECT_CALL(callback_, SendPacket(kSsrc, sequence_number,
571 queued_packet_timestamp, false, false))
572 .Times(1);
573 AdvanceTimeAndProcess();
574 EXPECT_GE(clock_.CurrentTime() - start_time, kSendInterval);
575 EXPECT_EQ(pacer_->QueueSizePackets(), 0u);
576}
577
578TEST_P(PacingControllerTest, PaceQueuedPackets) {
Erik Språngd05edec2019-08-14 10:43:47 +0200579 uint32_t ssrc = 12345;
580 uint16_t sequence_number = 1234;
Erik Språngeb487992019-11-14 14:15:15 +0100581 const size_t kPacketSize = 250;
Erik Språngd05edec2019-08-14 10:43:47 +0200582
583 // Due to the multiplicative factor we can send 5 packets during a send
584 // interval. (network capacity * multiplier / (8 bits per byte *
585 // (packet size * #send intervals per second)
586 const size_t packets_to_send_per_interval =
Erik Språngeb487992019-11-14 14:15:15 +0100587 kTargetRate.bps() * kPaceMultiplier / (8 * kPacketSize * 200);
Erik Språngd05edec2019-08-14 10:43:47 +0200588 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100589 SendAndExpectPacket(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngeb487992019-11-14 14:15:15 +0100590 clock_.TimeInMilliseconds(), kPacketSize);
Erik Språngd05edec2019-08-14 10:43:47 +0200591 }
592
593 for (size_t j = 0; j < packets_to_send_per_interval * 10; ++j) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100594 Send(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngeb487992019-11-14 14:15:15 +0100595 clock_.TimeInMilliseconds(), kPacketSize);
Erik Språngd05edec2019-08-14 10:43:47 +0200596 }
597 EXPECT_EQ(packets_to_send_per_interval + packets_to_send_per_interval * 10,
598 pacer_->QueueSizePackets());
Erik Språngeb487992019-11-14 14:15:15 +0100599 if (PeriodicProcess()) {
Erik Språngd05edec2019-08-14 10:43:47 +0200600 pacer_->ProcessPackets();
Erik Språngeb487992019-11-14 14:15:15 +0100601 } else {
602 while (pacer_->QueueSizePackets() > packets_to_send_per_interval * 10) {
603 AdvanceTimeAndProcess();
604 }
Erik Språngd05edec2019-08-14 10:43:47 +0200605 }
Erik Språngeb487992019-11-14 14:15:15 +0100606 EXPECT_EQ(pacer_->QueueSizePackets(), packets_to_send_per_interval * 10);
607 EXPECT_CALL(callback_, SendPadding).Times(0);
608
609 EXPECT_CALL(callback_, SendPacket(ssrc, _, _, false, false))
610 .Times(pacer_->QueueSizePackets());
611 const TimeDelta expected_pace_time =
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +0100612 DataSize::Bytes(pacer_->QueueSizePackets() * kPacketSize) /
Erik Språngeb487992019-11-14 14:15:15 +0100613 (kPaceMultiplier * kTargetRate);
614 Timestamp start_time = clock_.CurrentTime();
615 while (pacer_->QueueSizePackets() > 0) {
616 if (PeriodicProcess()) {
617 clock_.AdvanceTime(TimeUntilNextProcess());
618 pacer_->ProcessPackets();
619 } else {
620 AdvanceTimeAndProcess();
621 }
622 }
623 const TimeDelta actual_pace_time = clock_.CurrentTime() - start_time;
Danil Chapovalov55284022020-02-07 14:53:52 +0100624 EXPECT_LT((actual_pace_time - expected_pace_time).Abs(),
625 PeriodicProcess() ? TimeDelta::Millis(5)
626 : PacingController::kMinSleepTime);
Erik Språngeb487992019-11-14 14:15:15 +0100627
Erik Språngd05edec2019-08-14 10:43:47 +0200628 EXPECT_EQ(0u, pacer_->QueueSizePackets());
629 clock_.AdvanceTime(TimeUntilNextProcess());
630 EXPECT_EQ(0u, pacer_->QueueSizePackets());
631 pacer_->ProcessPackets();
632
Erik Språngeb487992019-11-14 14:15:15 +0100633 // Send some more packet, just show that we can..?
Erik Språngd05edec2019-08-14 10:43:47 +0200634 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100635 SendAndExpectPacket(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +0200636 clock_.TimeInMilliseconds(), 250);
637 }
Erik Språngeb487992019-11-14 14:15:15 +0100638 EXPECT_EQ(packets_to_send_per_interval, pacer_->QueueSizePackets());
639 if (PeriodicProcess()) {
640 pacer_->ProcessPackets();
641 } else {
642 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
643 AdvanceTimeAndProcess();
644 }
645 }
646 EXPECT_EQ(0u, pacer_->QueueSizePackets());
Erik Språngd05edec2019-08-14 10:43:47 +0200647}
648
Erik Språngeb487992019-11-14 14:15:15 +0100649TEST_P(PacingControllerTest, RepeatedRetransmissionsAllowed) {
Erik Språngd05edec2019-08-14 10:43:47 +0200650 // Send one packet, then two retransmissions of that packet.
651 for (size_t i = 0; i < 3; i++) {
652 constexpr uint32_t ssrc = 333;
653 constexpr uint16_t sequence_number = 444;
654 constexpr size_t bytes = 250;
655 bool is_retransmission = (i != 0); // Original followed by retransmissions.
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100656 SendAndExpectPacket(is_retransmission ? RtpPacketMediaType::kRetransmission
657 : RtpPacketMediaType::kVideo,
658 ssrc, sequence_number, clock_.TimeInMilliseconds(),
659 bytes);
Erik Språngd05edec2019-08-14 10:43:47 +0200660 clock_.AdvanceTimeMilliseconds(5);
661 }
Erik Språngeb487992019-11-14 14:15:15 +0100662 if (PeriodicProcess()) {
663 pacer_->ProcessPackets();
664 } else {
665 while (pacer_->QueueSizePackets() > 0) {
666 AdvanceTimeAndProcess();
667 }
668 }
Erik Språngd05edec2019-08-14 10:43:47 +0200669}
670
Erik Språngeb487992019-11-14 14:15:15 +0100671TEST_P(PacingControllerTest,
Erik Språngd05edec2019-08-14 10:43:47 +0200672 CanQueuePacketsWithSameSequenceNumberOnDifferentSsrcs) {
673 uint32_t ssrc = 12345;
674 uint16_t sequence_number = 1234;
675
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100676 SendAndExpectPacket(RtpPacketMediaType::kVideo, ssrc, sequence_number,
Erik Språngd05edec2019-08-14 10:43:47 +0200677 clock_.TimeInMilliseconds(), 250);
678
679 // Expect packet on second ssrc to be queued and sent as well.
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100680 SendAndExpectPacket(RtpPacketMediaType::kVideo, ssrc + 1, sequence_number,
Erik Språngd05edec2019-08-14 10:43:47 +0200681 clock_.TimeInMilliseconds(), 250);
682
683 clock_.AdvanceTimeMilliseconds(1000);
Erik Språngeb487992019-11-14 14:15:15 +0100684 if (PeriodicProcess()) {
685 pacer_->ProcessPackets();
686 } else {
687 while (pacer_->QueueSizePackets() > 0) {
688 AdvanceTimeAndProcess();
689 }
690 }
Erik Språngd05edec2019-08-14 10:43:47 +0200691}
692
Erik Språngeb487992019-11-14 14:15:15 +0100693TEST_P(PacingControllerTest, Padding) {
Erik Språngd05edec2019-08-14 10:43:47 +0200694 uint32_t ssrc = 12345;
695 uint16_t sequence_number = 1234;
Erik Språngeb487992019-11-14 14:15:15 +0100696 const size_t kPacketSize = 250;
Erik Språngd05edec2019-08-14 10:43:47 +0200697
698 pacer_->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
699
Erik Språngeb487992019-11-14 14:15:15 +0100700 if (PeriodicProcess()) {
701 ConsumeInitialBudget();
702
703 // 5 milliseconds later should not send padding since we filled the buffers
704 // initially.
705 EXPECT_CALL(callback_, SendPadding(kPacketSize)).Times(0);
706 clock_.AdvanceTime(TimeUntilNextProcess());
707 pacer_->ProcessPackets();
708
709 // 5 milliseconds later we have enough budget to send some padding.
710 EXPECT_CALL(callback_, SendPadding(250)).WillOnce(Return(kPacketSize));
711 EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
712 clock_.AdvanceTime(TimeUntilNextProcess());
713 pacer_->ProcessPackets();
714 } else {
715 const size_t kPacketsToSend = 20;
716 for (size_t i = 0; i < kPacketsToSend; ++i) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100717 SendAndExpectPacket(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
718 clock_.TimeInMilliseconds(), kPacketSize);
Erik Språngeb487992019-11-14 14:15:15 +0100719 }
720 const TimeDelta expected_pace_time =
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +0100721 DataSize::Bytes(pacer_->QueueSizePackets() * kPacketSize) /
Erik Språngeb487992019-11-14 14:15:15 +0100722 (kPaceMultiplier * kTargetRate);
723 EXPECT_CALL(callback_, SendPadding).Times(0);
724 // Only the media packets should be sent.
725 Timestamp start_time = clock_.CurrentTime();
726 while (pacer_->QueueSizePackets() > 0) {
727 AdvanceTimeAndProcess();
728 }
729 const TimeDelta actual_pace_time = clock_.CurrentTime() - start_time;
730 EXPECT_LE((actual_pace_time - expected_pace_time).Abs(),
731 PacingController::kMinSleepTime);
732
Erik Språngb1ccae22019-11-25 18:22:09 +0100733 // Pacing media happens at 2.5x, but padding was configured with 1.0x
Erik Språngeb487992019-11-14 14:15:15 +0100734 // factor. We have to wait until the padding debt is gone before we start
735 // sending padding.
736 const TimeDelta time_to_padding_debt_free =
737 (expected_pace_time * kPaceMultiplier) - actual_pace_time;
Erik Språngb1ccae22019-11-25 18:22:09 +0100738 clock_.AdvanceTime(time_to_padding_debt_free -
739 PacingController::kMinSleepTime);
740 pacer_->ProcessPackets();
Erik Språngeb487992019-11-14 14:15:15 +0100741
742 // Send 10 padding packets.
743 const size_t kPaddingPacketsToSend = 10;
744 DataSize padding_sent = DataSize::Zero();
Erik Språngb1ccae22019-11-25 18:22:09 +0100745 size_t packets_sent = 0;
746 Timestamp first_send_time = Timestamp::MinusInfinity();
747 Timestamp last_send_time = Timestamp::MinusInfinity();
748
Erik Språngeb487992019-11-14 14:15:15 +0100749 EXPECT_CALL(callback_, SendPadding)
750 .Times(kPaddingPacketsToSend)
751 .WillRepeatedly([&](size_t target_size) {
Erik Språngb1ccae22019-11-25 18:22:09 +0100752 ++packets_sent;
753 if (packets_sent < kPaddingPacketsToSend) {
754 // Don't count bytes of last packet, instead just
755 // use this as the time the last packet finished
756 // sending.
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +0100757 padding_sent += DataSize::Bytes(target_size);
Erik Språngb1ccae22019-11-25 18:22:09 +0100758 }
759 if (first_send_time.IsInfinite()) {
760 first_send_time = clock_.CurrentTime();
761 } else {
762 last_send_time = clock_.CurrentTime();
763 }
Erik Språngeb487992019-11-14 14:15:15 +0100764 return target_size;
765 });
766 EXPECT_CALL(callback_, SendPacket(_, _, _, false, true))
767 .Times(kPaddingPacketsToSend);
Erik Språngb1ccae22019-11-25 18:22:09 +0100768
769 while (packets_sent < kPaddingPacketsToSend) {
Erik Språngeb487992019-11-14 14:15:15 +0100770 AdvanceTimeAndProcess();
771 }
772
773 // Verify rate of sent padding.
Erik Språngb1ccae22019-11-25 18:22:09 +0100774 TimeDelta padding_duration = last_send_time - first_send_time;
Erik Språngeb487992019-11-14 14:15:15 +0100775 DataRate padding_rate = padding_sent / padding_duration;
776 EXPECT_EQ(padding_rate, kTargetRate);
Erik Språngd05edec2019-08-14 10:43:47 +0200777 }
Erik Språngd05edec2019-08-14 10:43:47 +0200778}
779
Erik Språngeb487992019-11-14 14:15:15 +0100780TEST_P(PacingControllerTest, NoPaddingBeforeNormalPacket) {
Erik Språngd05edec2019-08-14 10:43:47 +0200781 pacer_->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
782
783 EXPECT_CALL(callback_, SendPadding).Times(0);
Erik Språngeb487992019-11-14 14:15:15 +0100784
Erik Språngd05edec2019-08-14 10:43:47 +0200785 pacer_->ProcessPackets();
786 clock_.AdvanceTime(TimeUntilNextProcess());
787
788 pacer_->ProcessPackets();
789 clock_.AdvanceTime(TimeUntilNextProcess());
790
791 uint32_t ssrc = 12345;
792 uint16_t sequence_number = 1234;
793 int64_t capture_time_ms = 56789;
794
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100795 SendAndExpectPacket(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +0200796 capture_time_ms, 250);
Erik Språngb1ccae22019-11-25 18:22:09 +0100797 bool padding_sent = false;
798 EXPECT_CALL(callback_, SendPadding).WillOnce([&](size_t padding) {
799 padding_sent = true;
Erik Språngeb487992019-11-14 14:15:15 +0100800 return padding;
801 });
Erik Språngf5815fa2019-08-21 14:27:31 +0200802 EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
Erik Språngeb487992019-11-14 14:15:15 +0100803 if (PeriodicProcess()) {
804 pacer_->ProcessPackets();
805 } else {
Erik Språngb1ccae22019-11-25 18:22:09 +0100806 while (!padding_sent) {
807 AdvanceTimeAndProcess();
808 }
Erik Språngeb487992019-11-14 14:15:15 +0100809 }
Erik Språngd05edec2019-08-14 10:43:47 +0200810}
811
Erik Språngeb487992019-11-14 14:15:15 +0100812TEST_P(PacingControllerTest, VerifyPaddingUpToBitrate) {
813 if (!PeriodicProcess()) {
814 // Already tested in PacingControllerTest.Padding.
815 return;
816 }
817
Erik Språngd05edec2019-08-14 10:43:47 +0200818 uint32_t ssrc = 12345;
819 uint16_t sequence_number = 1234;
820 int64_t capture_time_ms = 56789;
821 const int kTimeStep = 5;
822 const int64_t kBitrateWindow = 100;
823 pacer_->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
824
825 int64_t start_time = clock_.TimeInMilliseconds();
826 while (clock_.TimeInMilliseconds() - start_time < kBitrateWindow) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100827 SendAndExpectPacket(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +0200828 capture_time_ms, 250);
829 EXPECT_CALL(callback_, SendPadding(250)).WillOnce(Return(250));
Erik Språngf5815fa2019-08-21 14:27:31 +0200830 EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
Erik Språngd05edec2019-08-14 10:43:47 +0200831 pacer_->ProcessPackets();
832 clock_.AdvanceTimeMilliseconds(kTimeStep);
833 }
834}
835
Erik Språngeb487992019-11-14 14:15:15 +0100836TEST_P(PacingControllerTest, VerifyAverageBitrateVaryingMediaPayload) {
Erik Språngd05edec2019-08-14 10:43:47 +0200837 uint32_t ssrc = 12345;
838 uint16_t sequence_number = 1234;
839 int64_t capture_time_ms = 56789;
840 const int kTimeStep = 5;
Danil Chapovalov55284022020-02-07 14:53:52 +0100841 const TimeDelta kAveragingWindowLength = TimeDelta::Seconds(10);
Erik Språngd05edec2019-08-14 10:43:47 +0200842 PacingControllerPadding callback;
Erik Språngeb487992019-11-14 14:15:15 +0100843 pacer_ = std::make_unique<PacingController>(&clock_, &callback, nullptr,
844 nullptr, GetParam());
Erik Språngd05edec2019-08-14 10:43:47 +0200845 pacer_->SetProbingEnabled(false);
846 pacer_->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
847
Erik Språngeb487992019-11-14 14:15:15 +0100848 Timestamp start_time = clock_.CurrentTime();
Erik Språngd05edec2019-08-14 10:43:47 +0200849 size_t media_bytes = 0;
Erik Språngeb487992019-11-14 14:15:15 +0100850 while (clock_.CurrentTime() - start_time < kAveragingWindowLength) {
851 // Maybe add some new media packets corresponding to expected send rate.
Erik Språngd05edec2019-08-14 10:43:47 +0200852 int rand_value = rand(); // NOLINT (rand_r instead of rand)
Erik Språngeb487992019-11-14 14:15:15 +0100853 while (
854 media_bytes <
855 (kTargetRate * (clock_.CurrentTime() - start_time)).bytes<size_t>()) {
856 size_t media_payload = rand_value % 400 + 800; // [400, 1200] bytes.
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100857 Send(RtpPacketMediaType::kVideo, ssrc, sequence_number++, capture_time_ms,
858 media_payload);
Erik Språngeb487992019-11-14 14:15:15 +0100859 media_bytes += media_payload;
860 }
861
862 if (PeriodicProcess()) {
863 clock_.AdvanceTimeMilliseconds(kTimeStep);
864 pacer_->ProcessPackets();
865 } else {
866 AdvanceTimeAndProcess();
867 }
Erik Språngd05edec2019-08-14 10:43:47 +0200868 }
Erik Språngeb487992019-11-14 14:15:15 +0100869
870 EXPECT_NEAR(
871 kTargetRate.bps(),
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +0100872 (DataSize::Bytes(callback.total_bytes_sent()) / kAveragingWindowLength)
Erik Språngeb487992019-11-14 14:15:15 +0100873 .bps(),
874 (kTargetRate * 0.01 /* 1% error marging */).bps());
Erik Språngd05edec2019-08-14 10:43:47 +0200875}
876
Erik Språngeb487992019-11-14 14:15:15 +0100877TEST_P(PacingControllerTest, Priority) {
Erik Språngd05edec2019-08-14 10:43:47 +0200878 uint32_t ssrc_low_priority = 12345;
879 uint32_t ssrc = 12346;
880 uint16_t sequence_number = 1234;
881 int64_t capture_time_ms = 56789;
882 int64_t capture_time_ms_low_priority = 1234567;
883
Erik Språngeb487992019-11-14 14:15:15 +0100884 ConsumeInitialBudget();
Erik Språngd05edec2019-08-14 10:43:47 +0200885
886 // Expect normal and low priority to be queued and high to pass through.
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100887 Send(RtpPacketMediaType::kVideo, ssrc_low_priority, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +0200888 capture_time_ms_low_priority, 250);
889
Erik Språngeb487992019-11-14 14:15:15 +0100890 const size_t packets_to_send_per_interval =
891 kTargetRate.bps() * kPaceMultiplier / (8 * 250 * 200);
Erik Språngd05edec2019-08-14 10:43:47 +0200892 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100893 Send(RtpPacketMediaType::kRetransmission, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +0200894 capture_time_ms, 250);
895 }
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100896 Send(RtpPacketMediaType::kAudio, ssrc, sequence_number++, capture_time_ms,
Erik Språngd05edec2019-08-14 10:43:47 +0200897 250);
898
899 // Expect all high and normal priority to be sent out first.
900 EXPECT_CALL(callback_, SendPadding).Times(0);
901 EXPECT_CALL(callback_, SendPacket(ssrc, _, capture_time_ms, _, _))
902 .Times(packets_to_send_per_interval + 1);
903
Erik Språngeb487992019-11-14 14:15:15 +0100904 if (PeriodicProcess()) {
905 clock_.AdvanceTime(TimeUntilNextProcess());
906 pacer_->ProcessPackets();
907 } else {
908 while (pacer_->QueueSizePackets() > 1) {
909 AdvanceTimeAndProcess();
910 }
911 }
912
Erik Språngd05edec2019-08-14 10:43:47 +0200913 EXPECT_EQ(1u, pacer_->QueueSizePackets());
914
915 EXPECT_CALL(callback_, SendPacket(ssrc_low_priority, _,
916 capture_time_ms_low_priority, _, _))
917 .Times(1);
Erik Språngeb487992019-11-14 14:15:15 +0100918 if (PeriodicProcess()) {
919 clock_.AdvanceTime(TimeUntilNextProcess());
920 pacer_->ProcessPackets();
921 } else {
922 AdvanceTimeAndProcess();
923 }
Erik Språngd05edec2019-08-14 10:43:47 +0200924}
925
Erik Språngeb487992019-11-14 14:15:15 +0100926TEST_P(PacingControllerTest, RetransmissionPriority) {
Erik Språngd05edec2019-08-14 10:43:47 +0200927 uint32_t ssrc = 12345;
928 uint16_t sequence_number = 1234;
929 int64_t capture_time_ms = 45678;
930 int64_t capture_time_ms_retransmission = 56789;
931
932 // Due to the multiplicative factor we can send 5 packets during a send
933 // interval. (network capacity * multiplier / (8 bits per byte *
934 // (packet size * #send intervals per second)
935 const size_t packets_to_send_per_interval =
936 kTargetRate.bps() * kPaceMultiplier / (8 * 250 * 200);
937 pacer_->ProcessPackets();
938 EXPECT_EQ(0u, pacer_->QueueSizePackets());
939
940 // Alternate retransmissions and normal packets.
941 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100942 Send(RtpPacketMediaType::kVideo, ssrc, sequence_number++, capture_time_ms,
943 250);
944 Send(RtpPacketMediaType::kRetransmission, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +0200945 capture_time_ms_retransmission, 250);
946 }
947 EXPECT_EQ(2 * packets_to_send_per_interval, pacer_->QueueSizePackets());
948
949 // Expect all retransmissions to be sent out first despite having a later
950 // capture time.
951 EXPECT_CALL(callback_, SendPadding).Times(0);
952 EXPECT_CALL(callback_, SendPacket(_, _, _, false, _)).Times(0);
953 EXPECT_CALL(callback_,
954 SendPacket(ssrc, _, capture_time_ms_retransmission, true, _))
955 .Times(packets_to_send_per_interval);
956
Erik Språngeb487992019-11-14 14:15:15 +0100957 if (PeriodicProcess()) {
958 clock_.AdvanceTime(TimeUntilNextProcess());
959 pacer_->ProcessPackets();
960 } else {
961 while (pacer_->QueueSizePackets() > packets_to_send_per_interval) {
962 AdvanceTimeAndProcess();
963 }
964 }
Erik Språngd05edec2019-08-14 10:43:47 +0200965 EXPECT_EQ(packets_to_send_per_interval, pacer_->QueueSizePackets());
966
967 // Expect the remaining (non-retransmission) packets to be sent.
968 EXPECT_CALL(callback_, SendPadding).Times(0);
969 EXPECT_CALL(callback_, SendPacket(_, _, _, true, _)).Times(0);
970 EXPECT_CALL(callback_, SendPacket(ssrc, _, capture_time_ms, false, _))
971 .Times(packets_to_send_per_interval);
972
Erik Språngeb487992019-11-14 14:15:15 +0100973 if (PeriodicProcess()) {
974 clock_.AdvanceTime(TimeUntilNextProcess());
975 pacer_->ProcessPackets();
976 } else {
977 while (pacer_->QueueSizePackets() > 0) {
978 AdvanceTimeAndProcess();
979 }
980 }
Erik Språngd05edec2019-08-14 10:43:47 +0200981
982 EXPECT_EQ(0u, pacer_->QueueSizePackets());
983}
984
Erik Språngeb487992019-11-14 14:15:15 +0100985TEST_P(PacingControllerTest, HighPrioDoesntAffectBudget) {
986 const size_t kPacketSize = 250;
Erik Språngd05edec2019-08-14 10:43:47 +0200987 uint32_t ssrc = 12346;
988 uint16_t sequence_number = 1234;
989 int64_t capture_time_ms = 56789;
990
991 // As high prio packets doesn't affect the budget, we should be able to send
992 // a high number of them at once.
Erik Språngeb487992019-11-14 14:15:15 +0100993 const size_t kNumAudioPackets = 25;
994 for (size_t i = 0; i < kNumAudioPackets; ++i) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100995 SendAndExpectPacket(RtpPacketMediaType::kAudio, ssrc, sequence_number++,
Erik Språngeb487992019-11-14 14:15:15 +0100996 capture_time_ms, kPacketSize);
Erik Språngd05edec2019-08-14 10:43:47 +0200997 }
998 pacer_->ProcessPackets();
999 // Low prio packets does affect the budget.
1000 // Due to the multiplicative factor we can send 5 packets during a send
1001 // interval. (network capacity * multiplier / (8 bits per byte *
1002 // (packet size * #send intervals per second)
Erik Språngeb487992019-11-14 14:15:15 +01001003 const size_t kPacketsToSendPerInterval =
1004 kTargetRate.bps() * kPaceMultiplier / (8 * kPacketSize * 200);
1005 for (size_t i = 0; i < kPacketsToSendPerInterval; ++i) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001006 SendAndExpectPacket(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngeb487992019-11-14 14:15:15 +01001007 clock_.TimeInMilliseconds(), kPacketSize);
Erik Språngd05edec2019-08-14 10:43:47 +02001008 }
Erik Språngeb487992019-11-14 14:15:15 +01001009
1010 // Send all packets and measure pace time.
1011 Timestamp start_time = clock_.CurrentTime();
1012 while (pacer_->QueueSizePackets() > 0) {
1013 if (PeriodicProcess()) {
1014 clock_.AdvanceTime(TimeUntilNextProcess());
1015 pacer_->ProcessPackets();
1016 } else {
1017 AdvanceTimeAndProcess();
1018 }
1019 }
1020
1021 // Measure pacing time. Expect only low-prio packets to affect this.
1022 TimeDelta pacing_time = clock_.CurrentTime() - start_time;
1023 TimeDelta expected_pacing_time =
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +01001024 DataSize::Bytes(kPacketsToSendPerInterval * kPacketSize) /
Erik Språngeb487992019-11-14 14:15:15 +01001025 (kTargetRate * kPaceMultiplier);
1026 EXPECT_NEAR(pacing_time.us<double>(), expected_pacing_time.us<double>(),
1027 PeriodicProcess() ? 5000.0
1028 : PacingController::kMinSleepTime.us<double>());
Erik Språngd05edec2019-08-14 10:43:47 +02001029}
1030
Erik Språngeb487992019-11-14 14:15:15 +01001031TEST_P(PacingControllerTest, SendsOnlyPaddingWhenCongested) {
Erik Språngd05edec2019-08-14 10:43:47 +02001032 uint32_t ssrc = 202020;
1033 uint16_t sequence_number = 1000;
1034 int kPacketSize = 250;
1035 int kCongestionWindow = kPacketSize * 10;
1036
1037 pacer_->UpdateOutstandingData(DataSize::Zero());
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +01001038 pacer_->SetCongestionWindow(DataSize::Bytes(kCongestionWindow));
Erik Språngd05edec2019-08-14 10:43:47 +02001039 int sent_data = 0;
1040 while (sent_data < kCongestionWindow) {
1041 sent_data += kPacketSize;
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001042 SendAndExpectPacket(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +02001043 clock_.TimeInMilliseconds(), kPacketSize);
Erik Språngeb487992019-11-14 14:15:15 +01001044 AdvanceTimeAndProcess();
Erik Språngd05edec2019-08-14 10:43:47 +02001045 }
1046 ::testing::Mock::VerifyAndClearExpectations(&callback_);
1047 EXPECT_CALL(callback_, SendPacket).Times(0);
1048 EXPECT_CALL(callback_, SendPadding).Times(0);
1049
1050 size_t blocked_packets = 0;
1051 int64_t expected_time_until_padding = 500;
1052 while (expected_time_until_padding > 5) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001053 Send(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +02001054 clock_.TimeInMilliseconds(), kPacketSize);
1055 blocked_packets++;
1056 clock_.AdvanceTimeMilliseconds(5);
1057 pacer_->ProcessPackets();
1058 expected_time_until_padding -= 5;
1059 }
1060 ::testing::Mock::VerifyAndClearExpectations(&callback_);
1061 EXPECT_CALL(callback_, SendPadding(1)).WillOnce(Return(1));
Erik Språngf5815fa2019-08-21 14:27:31 +02001062 EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
Erik Språngd05edec2019-08-14 10:43:47 +02001063 clock_.AdvanceTimeMilliseconds(5);
1064 pacer_->ProcessPackets();
1065 EXPECT_EQ(blocked_packets, pacer_->QueueSizePackets());
1066}
1067
Erik Språngeb487992019-11-14 14:15:15 +01001068TEST_P(PacingControllerTest, DoesNotAllowOveruseAfterCongestion) {
Erik Språngd05edec2019-08-14 10:43:47 +02001069 uint32_t ssrc = 202020;
1070 uint16_t seq_num = 1000;
1071 int size = 1000;
1072 auto now_ms = [this] { return clock_.TimeInMilliseconds(); };
1073 EXPECT_CALL(callback_, SendPadding).Times(0);
1074 // The pacing rate is low enough that the budget should not allow two packets
1075 // to be sent in a row.
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +01001076 pacer_->SetPacingRates(DataRate::BitsPerSec(400 * 8 * 1000 / 5),
1077 DataRate::Zero());
Erik Språngd05edec2019-08-14 10:43:47 +02001078 // The congestion window is small enough to only let one packet through.
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +01001079 pacer_->SetCongestionWindow(DataSize::Bytes(800));
Erik Språngd05edec2019-08-14 10:43:47 +02001080 pacer_->UpdateOutstandingData(DataSize::Zero());
1081 // Not yet budget limited or congested, packet is sent.
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001082 Send(RtpPacketMediaType::kVideo, ssrc, seq_num++, now_ms(), size);
Erik Språngd05edec2019-08-14 10:43:47 +02001083 EXPECT_CALL(callback_, SendPacket).Times(1);
1084 clock_.AdvanceTimeMilliseconds(5);
1085 pacer_->ProcessPackets();
1086 // Packet blocked due to congestion.
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001087 Send(RtpPacketMediaType::kVideo, ssrc, seq_num++, now_ms(), size);
Erik Språngd05edec2019-08-14 10:43:47 +02001088 EXPECT_CALL(callback_, SendPacket).Times(0);
1089 clock_.AdvanceTimeMilliseconds(5);
1090 pacer_->ProcessPackets();
1091 // Packet blocked due to congestion.
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001092 Send(RtpPacketMediaType::kVideo, ssrc, seq_num++, now_ms(), size);
Erik Språngd05edec2019-08-14 10:43:47 +02001093 EXPECT_CALL(callback_, SendPacket).Times(0);
1094 clock_.AdvanceTimeMilliseconds(5);
1095 pacer_->ProcessPackets();
Erik Språngd05edec2019-08-14 10:43:47 +02001096 // Congestion removed and budget has recovered, packet is sent.
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001097 Send(RtpPacketMediaType::kVideo, ssrc, seq_num++, now_ms(), size);
Erik Språngd05edec2019-08-14 10:43:47 +02001098 EXPECT_CALL(callback_, SendPacket).Times(1);
1099 clock_.AdvanceTimeMilliseconds(5);
Erik Språngd05edec2019-08-14 10:43:47 +02001100 pacer_->UpdateOutstandingData(DataSize::Zero());
Erik Språngeb487992019-11-14 14:15:15 +01001101 pacer_->ProcessPackets();
Erik Språngd05edec2019-08-14 10:43:47 +02001102 // Should be blocked due to budget limitation as congestion has be removed.
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001103 Send(RtpPacketMediaType::kVideo, ssrc, seq_num++, now_ms(), size);
Erik Språngd05edec2019-08-14 10:43:47 +02001104 EXPECT_CALL(callback_, SendPacket).Times(0);
1105 clock_.AdvanceTimeMilliseconds(5);
1106 pacer_->ProcessPackets();
1107}
1108
Erik Språngeb487992019-11-14 14:15:15 +01001109TEST_P(PacingControllerTest, ResumesSendingWhenCongestionEnds) {
Erik Språngd05edec2019-08-14 10:43:47 +02001110 uint32_t ssrc = 202020;
1111 uint16_t sequence_number = 1000;
1112 int64_t kPacketSize = 250;
1113 int64_t kCongestionCount = 10;
1114 int64_t kCongestionWindow = kPacketSize * kCongestionCount;
1115 int64_t kCongestionTimeMs = 1000;
1116
1117 pacer_->UpdateOutstandingData(DataSize::Zero());
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +01001118 pacer_->SetCongestionWindow(DataSize::Bytes(kCongestionWindow));
Erik Språngd05edec2019-08-14 10:43:47 +02001119 int sent_data = 0;
1120 while (sent_data < kCongestionWindow) {
1121 sent_data += kPacketSize;
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001122 SendAndExpectPacket(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +02001123 clock_.TimeInMilliseconds(), kPacketSize);
1124 clock_.AdvanceTimeMilliseconds(5);
1125 pacer_->ProcessPackets();
1126 }
1127 ::testing::Mock::VerifyAndClearExpectations(&callback_);
1128 EXPECT_CALL(callback_, SendPacket).Times(0);
1129 int unacked_packets = 0;
1130 for (int duration = 0; duration < kCongestionTimeMs; duration += 5) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001131 Send(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +02001132 clock_.TimeInMilliseconds(), kPacketSize);
1133 unacked_packets++;
1134 clock_.AdvanceTimeMilliseconds(5);
1135 pacer_->ProcessPackets();
1136 }
1137 ::testing::Mock::VerifyAndClearExpectations(&callback_);
1138
1139 // First mark half of the congested packets as cleared and make sure that just
1140 // as many are sent
1141 int ack_count = kCongestionCount / 2;
1142 EXPECT_CALL(callback_, SendPacket(ssrc, _, _, false, _)).Times(ack_count);
1143 pacer_->UpdateOutstandingData(
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +01001144 DataSize::Bytes(kCongestionWindow - kPacketSize * ack_count));
Erik Språngd05edec2019-08-14 10:43:47 +02001145
1146 for (int duration = 0; duration < kCongestionTimeMs; duration += 5) {
1147 clock_.AdvanceTimeMilliseconds(5);
1148 pacer_->ProcessPackets();
1149 }
1150 unacked_packets -= ack_count;
1151 ::testing::Mock::VerifyAndClearExpectations(&callback_);
1152
1153 // Second make sure all packets are sent if sent packets are continuously
1154 // marked as acked.
1155 EXPECT_CALL(callback_, SendPacket(ssrc, _, _, false, _))
1156 .Times(unacked_packets);
1157 for (int duration = 0; duration < kCongestionTimeMs; duration += 5) {
1158 pacer_->UpdateOutstandingData(DataSize::Zero());
1159 clock_.AdvanceTimeMilliseconds(5);
1160 pacer_->ProcessPackets();
1161 }
1162}
1163
Erik Språngeb487992019-11-14 14:15:15 +01001164TEST_P(PacingControllerTest, Pause) {
Erik Språngd05edec2019-08-14 10:43:47 +02001165 uint32_t ssrc_low_priority = 12345;
1166 uint32_t ssrc = 12346;
1167 uint32_t ssrc_high_priority = 12347;
1168 uint16_t sequence_number = 1234;
Erik Språngd05edec2019-08-14 10:43:47 +02001169
1170 EXPECT_EQ(TimeDelta::Zero(), pacer_->OldestPacketWaitTime());
1171
Erik Språngeb487992019-11-14 14:15:15 +01001172 ConsumeInitialBudget();
Erik Språngd05edec2019-08-14 10:43:47 +02001173
1174 pacer_->Pause();
1175
Erik Språngeb487992019-11-14 14:15:15 +01001176 int64_t capture_time_ms = clock_.TimeInMilliseconds();
1177 const size_t packets_to_send_per_interval =
1178 kTargetRate.bps() * kPaceMultiplier / (8 * 250 * 200);
Erik Språngd05edec2019-08-14 10:43:47 +02001179 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001180 Send(RtpPacketMediaType::kVideo, ssrc_low_priority, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +02001181 capture_time_ms, 250);
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001182 Send(RtpPacketMediaType::kRetransmission, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +02001183 capture_time_ms, 250);
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001184 Send(RtpPacketMediaType::kAudio, ssrc_high_priority, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +02001185 capture_time_ms, 250);
1186 }
1187 clock_.AdvanceTimeMilliseconds(10000);
1188 int64_t second_capture_time_ms = clock_.TimeInMilliseconds();
1189 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001190 Send(RtpPacketMediaType::kVideo, ssrc_low_priority, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +02001191 second_capture_time_ms, 250);
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001192 Send(RtpPacketMediaType::kRetransmission, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +02001193 second_capture_time_ms, 250);
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001194 Send(RtpPacketMediaType::kAudio, ssrc_high_priority, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +02001195 second_capture_time_ms, 250);
1196 }
1197
1198 // Expect everything to be queued.
Danil Chapovalov55284022020-02-07 14:53:52 +01001199 EXPECT_EQ(TimeDelta::Millis(second_capture_time_ms - capture_time_ms),
Erik Språngd05edec2019-08-14 10:43:47 +02001200 pacer_->OldestPacketWaitTime());
1201
Erik Språngeb487992019-11-14 14:15:15 +01001202 // Process triggers keep-alive packet.
1203 EXPECT_CALL(callback_, SendPadding).WillOnce([](size_t padding) {
1204 return padding;
1205 });
Erik Språngf5815fa2019-08-21 14:27:31 +02001206 EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
Erik Språngd05edec2019-08-14 10:43:47 +02001207 pacer_->ProcessPackets();
1208
Erik Språngeb487992019-11-14 14:15:15 +01001209 // Verify no packets sent for the rest of the paused process interval.
Danil Chapovalov55284022020-02-07 14:53:52 +01001210 const TimeDelta kProcessInterval = TimeDelta::Millis(5);
Erik Språngeb487992019-11-14 14:15:15 +01001211 TimeDelta expected_time_until_send = PacingController::kPausedProcessInterval;
Erik Språngd05edec2019-08-14 10:43:47 +02001212 EXPECT_CALL(callback_, SendPadding).Times(0);
Erik Språngeb487992019-11-14 14:15:15 +01001213 while (expected_time_until_send >= kProcessInterval) {
Erik Språngd05edec2019-08-14 10:43:47 +02001214 pacer_->ProcessPackets();
Erik Språngeb487992019-11-14 14:15:15 +01001215 clock_.AdvanceTime(kProcessInterval);
1216 expected_time_until_send -= kProcessInterval;
Erik Språngd05edec2019-08-14 10:43:47 +02001217 }
1218
Erik Språngeb487992019-11-14 14:15:15 +01001219 // New keep-alive packet.
Erik Språngd05edec2019-08-14 10:43:47 +02001220 ::testing::Mock::VerifyAndClearExpectations(&callback_);
Erik Språngeb487992019-11-14 14:15:15 +01001221 EXPECT_CALL(callback_, SendPadding).WillOnce([](size_t padding) {
1222 return padding;
1223 });
Erik Språngf5815fa2019-08-21 14:27:31 +02001224 EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
Erik Språngeb487992019-11-14 14:15:15 +01001225 clock_.AdvanceTime(kProcessInterval);
Erik Språngd05edec2019-08-14 10:43:47 +02001226 pacer_->ProcessPackets();
1227 ::testing::Mock::VerifyAndClearExpectations(&callback_);
1228
1229 // Expect high prio packets to come out first followed by normal
1230 // prio packets and low prio packets (all in capture order).
1231 {
1232 ::testing::InSequence sequence;
1233 EXPECT_CALL(callback_,
1234 SendPacket(ssrc_high_priority, _, capture_time_ms, _, _))
1235 .Times(packets_to_send_per_interval);
1236 EXPECT_CALL(callback_,
1237 SendPacket(ssrc_high_priority, _, second_capture_time_ms, _, _))
1238 .Times(packets_to_send_per_interval);
1239
1240 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
1241 EXPECT_CALL(callback_, SendPacket(ssrc, _, capture_time_ms, _, _))
1242 .Times(1);
1243 }
1244 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
1245 EXPECT_CALL(callback_, SendPacket(ssrc, _, second_capture_time_ms, _, _))
1246 .Times(1);
1247 }
1248 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
1249 EXPECT_CALL(callback_,
1250 SendPacket(ssrc_low_priority, _, capture_time_ms, _, _))
1251 .Times(1);
1252 }
1253 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
1254 EXPECT_CALL(callback_, SendPacket(ssrc_low_priority, _,
1255 second_capture_time_ms, _, _))
1256 .Times(1);
1257 }
1258 }
1259 pacer_->Resume();
1260
Erik Språngeb487992019-11-14 14:15:15 +01001261 if (PeriodicProcess()) {
1262 // The pacer was resumed directly after the previous process call finished.
1263 // It will therefore wait 5 ms until next process.
Erik Språngd05edec2019-08-14 10:43:47 +02001264 clock_.AdvanceTime(TimeUntilNextProcess());
Erik Språngeb487992019-11-14 14:15:15 +01001265
1266 for (size_t i = 0; i < 4; i++) {
1267 pacer_->ProcessPackets();
1268 clock_.AdvanceTime(TimeUntilNextProcess());
1269 }
1270 } else {
1271 while (pacer_->QueueSizePackets() > 0) {
1272 AdvanceTimeAndProcess();
1273 }
Erik Språngd05edec2019-08-14 10:43:47 +02001274 }
1275
1276 EXPECT_EQ(TimeDelta::Zero(), pacer_->OldestPacketWaitTime());
1277}
1278
Erik Språngeb487992019-11-14 14:15:15 +01001279TEST_P(PacingControllerTest, InactiveFromStart) {
1280 // Recreate the pacer without the inital time forwarding.
1281 pacer_ = std::make_unique<PacingController>(&clock_, &callback_, nullptr,
1282 nullptr, GetParam());
1283 pacer_->SetProbingEnabled(false);
1284 pacer_->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
1285
1286 if (PeriodicProcess()) {
1287 // In period mode, pause the pacer to check the same idle behavior as
1288 // dynamic.
1289 pacer_->Pause();
1290 }
1291
1292 // No packets sent, there should be no keep-alives sent either.
1293 EXPECT_CALL(callback_, SendPadding).Times(0);
1294 EXPECT_CALL(callback_, SendPacket).Times(0);
1295 pacer_->ProcessPackets();
1296
1297 const Timestamp start_time = clock_.CurrentTime();
1298
1299 // Determine the margin need so we can advance to the last possible moment
1300 // that will not cause a process event.
1301 const TimeDelta time_margin =
1302 (GetParam() == PacingController::ProcessMode::kDynamic
1303 ? PacingController::kMinSleepTime
1304 : TimeDelta::Zero()) +
Danil Chapovalov55284022020-02-07 14:53:52 +01001305 TimeDelta::Micros(1);
Erik Språngeb487992019-11-14 14:15:15 +01001306
1307 EXPECT_EQ(pacer_->NextSendTime() - start_time,
1308 PacingController::kPausedProcessInterval);
1309 clock_.AdvanceTime(PacingController::kPausedProcessInterval - time_margin);
1310 pacer_->ProcessPackets();
1311 EXPECT_EQ(pacer_->NextSendTime() - start_time,
1312 PacingController::kPausedProcessInterval);
1313
1314 clock_.AdvanceTime(time_margin);
1315 pacer_->ProcessPackets();
1316 EXPECT_EQ(pacer_->NextSendTime() - start_time,
1317 2 * PacingController::kPausedProcessInterval);
1318}
1319
1320TEST_P(PacingControllerTest, ExpectedQueueTimeMs) {
Erik Språngd05edec2019-08-14 10:43:47 +02001321 uint32_t ssrc = 12346;
1322 uint16_t sequence_number = 1234;
1323 const size_t kNumPackets = 60;
1324 const size_t kPacketSize = 1200;
1325 const int32_t kMaxBitrate = kPaceMultiplier * 30000;
1326 EXPECT_EQ(TimeDelta::Zero(), pacer_->OldestPacketWaitTime());
1327
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +01001328 pacer_->SetPacingRates(DataRate::BitsPerSec(30000 * kPaceMultiplier),
Erik Språngd05edec2019-08-14 10:43:47 +02001329 DataRate::Zero());
1330 for (size_t i = 0; i < kNumPackets; ++i) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001331 SendAndExpectPacket(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +02001332 clock_.TimeInMilliseconds(), kPacketSize);
1333 }
1334
1335 // Queue in ms = 1000 * (bytes in queue) *8 / (bits per second)
1336 TimeDelta queue_time =
Danil Chapovalov55284022020-02-07 14:53:52 +01001337 TimeDelta::Millis(1000 * kNumPackets * kPacketSize * 8 / kMaxBitrate);
Erik Språngd05edec2019-08-14 10:43:47 +02001338 EXPECT_EQ(queue_time, pacer_->ExpectedQueueTime());
1339
1340 const Timestamp time_start = clock_.CurrentTime();
1341 while (pacer_->QueueSizePackets() > 0) {
1342 clock_.AdvanceTime(TimeUntilNextProcess());
1343 pacer_->ProcessPackets();
1344 }
1345 TimeDelta duration = clock_.CurrentTime() - time_start;
1346
1347 EXPECT_EQ(TimeDelta::Zero(), pacer_->ExpectedQueueTime());
1348
1349 // Allow for aliasing, duration should be within one pack of max time limit.
1350 const TimeDelta deviation =
1351 duration - PacingController::kMaxExpectedQueueLength;
1352 EXPECT_LT(deviation.Abs(),
Danil Chapovalov55284022020-02-07 14:53:52 +01001353 TimeDelta::Millis(1000 * kPacketSize * 8 / kMaxBitrate));
Erik Språngd05edec2019-08-14 10:43:47 +02001354}
1355
Erik Språngeb487992019-11-14 14:15:15 +01001356TEST_P(PacingControllerTest, QueueTimeGrowsOverTime) {
Erik Språngd05edec2019-08-14 10:43:47 +02001357 uint32_t ssrc = 12346;
1358 uint16_t sequence_number = 1234;
1359 EXPECT_EQ(TimeDelta::Zero(), pacer_->OldestPacketWaitTime());
1360
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +01001361 pacer_->SetPacingRates(DataRate::BitsPerSec(30000 * kPaceMultiplier),
Erik Språngd05edec2019-08-14 10:43:47 +02001362 DataRate::Zero());
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001363 SendAndExpectPacket(RtpPacketMediaType::kVideo, ssrc, sequence_number,
Erik Språngd05edec2019-08-14 10:43:47 +02001364 clock_.TimeInMilliseconds(), 1200);
1365
1366 clock_.AdvanceTimeMilliseconds(500);
Danil Chapovalov55284022020-02-07 14:53:52 +01001367 EXPECT_EQ(TimeDelta::Millis(500), pacer_->OldestPacketWaitTime());
Erik Språngd05edec2019-08-14 10:43:47 +02001368 pacer_->ProcessPackets();
1369 EXPECT_EQ(TimeDelta::Zero(), pacer_->OldestPacketWaitTime());
1370}
1371
Erik Språngeb487992019-11-14 14:15:15 +01001372TEST_P(PacingControllerTest, ProbingWithInsertedPackets) {
Erik Språngd05edec2019-08-14 10:43:47 +02001373 const size_t kPacketSize = 1200;
1374 const int kInitialBitrateBps = 300000;
1375 uint32_t ssrc = 12346;
1376 uint16_t sequence_number = 1234;
1377
1378 PacingControllerProbing packet_sender;
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001379 pacer_ = std::make_unique<PacingController>(&clock_, &packet_sender, nullptr,
Erik Språngeb487992019-11-14 14:15:15 +01001380 nullptr, GetParam());
Erik Språngd05edec2019-08-14 10:43:47 +02001381 pacer_->CreateProbeCluster(kFirstClusterRate,
1382 /*cluster_id=*/0);
1383 pacer_->CreateProbeCluster(kSecondClusterRate,
1384 /*cluster_id=*/1);
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +01001385 pacer_->SetPacingRates(
1386 DataRate::BitsPerSec(kInitialBitrateBps * kPaceMultiplier),
1387 DataRate::Zero());
Erik Språngd05edec2019-08-14 10:43:47 +02001388
1389 for (int i = 0; i < 10; ++i) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001390 Send(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +02001391 clock_.TimeInMilliseconds(), kPacketSize);
1392 }
1393
1394 int64_t start = clock_.TimeInMilliseconds();
1395 while (packet_sender.packets_sent() < 5) {
1396 clock_.AdvanceTime(TimeUntilNextProcess());
1397 pacer_->ProcessPackets();
1398 }
1399 int packets_sent = packet_sender.packets_sent();
1400 // Validate first cluster bitrate. Note that we have to account for number
1401 // of intervals and hence (packets_sent - 1) on the first cluster.
1402 EXPECT_NEAR((packets_sent - 1) * kPacketSize * 8000 /
1403 (clock_.TimeInMilliseconds() - start),
1404 kFirstClusterRate.bps(), kProbingErrorMargin.bps());
1405 EXPECT_EQ(0, packet_sender.padding_sent());
1406
1407 clock_.AdvanceTime(TimeUntilNextProcess());
1408 start = clock_.TimeInMilliseconds();
1409 while (packet_sender.packets_sent() < 10) {
1410 clock_.AdvanceTime(TimeUntilNextProcess());
1411 pacer_->ProcessPackets();
1412 }
1413 packets_sent = packet_sender.packets_sent() - packets_sent;
1414 // Validate second cluster bitrate.
1415 EXPECT_NEAR((packets_sent - 1) * kPacketSize * 8000 /
1416 (clock_.TimeInMilliseconds() - start),
1417 kSecondClusterRate.bps(), kProbingErrorMargin.bps());
1418}
1419
Erik Språngeb487992019-11-14 14:15:15 +01001420TEST_P(PacingControllerTest, SkipsProbesWhenProcessIntervalTooLarge) {
Erik Språngb210eeb2019-11-05 11:21:48 +01001421 const size_t kPacketSize = 1200;
1422 const int kInitialBitrateBps = 300000;
1423 uint32_t ssrc = 12346;
1424 uint16_t sequence_number = 1234;
1425
1426 PacingControllerProbing packet_sender;
1427 pacer_ = std::make_unique<PacingController>(&clock_, &packet_sender, nullptr,
Erik Språngeb487992019-11-14 14:15:15 +01001428 nullptr, GetParam());
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +01001429 pacer_->SetPacingRates(
1430 DataRate::BitsPerSec(kInitialBitrateBps * kPaceMultiplier),
1431 DataRate::Zero());
Erik Språngb210eeb2019-11-05 11:21:48 +01001432
1433 for (int i = 0; i < 10; ++i) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001434 Send(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngb210eeb2019-11-05 11:21:48 +01001435 clock_.TimeInMilliseconds(), kPacketSize);
1436 }
1437 while (pacer_->QueueSizePackets() > 0) {
1438 clock_.AdvanceTime(TimeUntilNextProcess());
1439 pacer_->ProcessPackets();
1440 }
1441
1442 // Probe at a very high rate.
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +01001443 pacer_->CreateProbeCluster(DataRate::KilobitsPerSec(10000), // 10 Mbps.
Erik Språngb210eeb2019-11-05 11:21:48 +01001444 /*cluster_id=*/3);
1445 // We need one packet to start the probe.
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001446 Send(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngb210eeb2019-11-05 11:21:48 +01001447 clock_.TimeInMilliseconds(), kPacketSize);
1448 const int packets_sent_before_probe = packet_sender.packets_sent();
1449 clock_.AdvanceTime(TimeUntilNextProcess());
1450 pacer_->ProcessPackets();
1451 EXPECT_EQ(packet_sender.packets_sent(), packets_sent_before_probe + 1);
1452
1453 // Figure out how long between probe packets.
1454 Timestamp start_time = clock_.CurrentTime();
1455 clock_.AdvanceTime(TimeUntilNextProcess());
1456 TimeDelta time_between_probes = clock_.CurrentTime() - start_time;
1457 // Advance that distance again + 1ms.
1458 clock_.AdvanceTime(time_between_probes);
1459
1460 // Send second probe packet.
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001461 Send(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngb210eeb2019-11-05 11:21:48 +01001462 clock_.TimeInMilliseconds(), kPacketSize);
1463 pacer_->ProcessPackets();
1464 EXPECT_EQ(packet_sender.packets_sent(), packets_sent_before_probe + 2);
1465
1466 // We're exactly where we should be for the next probe.
Erik Språngeb487992019-11-14 14:15:15 +01001467 const Timestamp probe_time = clock_.CurrentTime();
1468 EXPECT_EQ(pacer_->NextSendTime(), clock_.CurrentTime());
Erik Språngb210eeb2019-11-05 11:21:48 +01001469
Erik Språng22fd5d72019-11-07 14:21:05 +01001470 FieldTrialBasedConfig field_trial_config;
1471 BitrateProberConfig probing_config(&field_trial_config);
1472 EXPECT_GT(probing_config.max_probe_delay.Get(), TimeDelta::Zero());
Erik Språngeb487992019-11-14 14:15:15 +01001473 // Advance to within max probe delay, should still return same target.
Erik Språng22fd5d72019-11-07 14:21:05 +01001474 clock_.AdvanceTime(probing_config.max_probe_delay.Get());
Erik Språngeb487992019-11-14 14:15:15 +01001475 EXPECT_EQ(pacer_->NextSendTime(), probe_time);
Erik Språngb210eeb2019-11-05 11:21:48 +01001476
Erik Språng22fd5d72019-11-07 14:21:05 +01001477 // Too high probe delay, drop it!
Danil Chapovalov55284022020-02-07 14:53:52 +01001478 clock_.AdvanceTime(TimeDelta::Micros(1));
Erik Språngeb487992019-11-14 14:15:15 +01001479 EXPECT_GT(pacer_->NextSendTime(), probe_time);
Erik Språngb210eeb2019-11-05 11:21:48 +01001480}
1481
Erik Språngeb487992019-11-14 14:15:15 +01001482TEST_P(PacingControllerTest, ProbingWithPaddingSupport) {
Erik Språngd05edec2019-08-14 10:43:47 +02001483 const size_t kPacketSize = 1200;
1484 const int kInitialBitrateBps = 300000;
1485 uint32_t ssrc = 12346;
1486 uint16_t sequence_number = 1234;
1487
1488 PacingControllerProbing packet_sender;
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001489 pacer_ = std::make_unique<PacingController>(&clock_, &packet_sender, nullptr,
Erik Språngeb487992019-11-14 14:15:15 +01001490 nullptr, GetParam());
Erik Språngd05edec2019-08-14 10:43:47 +02001491 pacer_->CreateProbeCluster(kFirstClusterRate,
1492 /*cluster_id=*/0);
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +01001493 pacer_->SetPacingRates(
1494 DataRate::BitsPerSec(kInitialBitrateBps * kPaceMultiplier),
1495 DataRate::Zero());
Erik Språngd05edec2019-08-14 10:43:47 +02001496
1497 for (int i = 0; i < 3; ++i) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001498 Send(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +02001499 clock_.TimeInMilliseconds(), kPacketSize);
1500 }
1501
1502 int64_t start = clock_.TimeInMilliseconds();
1503 int process_count = 0;
1504 while (process_count < 5) {
1505 clock_.AdvanceTime(TimeUntilNextProcess());
1506 pacer_->ProcessPackets();
1507 ++process_count;
1508 }
1509 int packets_sent = packet_sender.packets_sent();
1510 int padding_sent = packet_sender.padding_sent();
1511 EXPECT_GT(packets_sent, 0);
1512 EXPECT_GT(padding_sent, 0);
1513 // Note that the number of intervals here for kPacketSize is
1514 // packets_sent due to padding in the same cluster.
1515 EXPECT_NEAR((packets_sent * kPacketSize * 8000 + padding_sent) /
1516 (clock_.TimeInMilliseconds() - start),
1517 kFirstClusterRate.bps(), kProbingErrorMargin.bps());
1518}
1519
Erik Språngeb487992019-11-14 14:15:15 +01001520TEST_P(PacingControllerTest, PaddingOveruse) {
Erik Språngd05edec2019-08-14 10:43:47 +02001521 uint32_t ssrc = 12346;
1522 uint16_t sequence_number = 1234;
1523 const size_t kPacketSize = 1200;
1524
Erik Språngeb487992019-11-14 14:15:15 +01001525 // Initially no padding rate.
Erik Språngd05edec2019-08-14 10:43:47 +02001526 pacer_->ProcessPackets();
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +01001527 pacer_->SetPacingRates(DataRate::BitsPerSec(60000 * kPaceMultiplier),
Erik Språngd05edec2019-08-14 10:43:47 +02001528 DataRate::Zero());
1529
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001530 SendAndExpectPacket(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +02001531 clock_.TimeInMilliseconds(), kPacketSize);
1532 pacer_->ProcessPackets();
1533
1534 // Add 30kbit padding. When increasing budget, media budget will increase from
1535 // negative (overuse) while padding budget will increase from 0.
1536 clock_.AdvanceTimeMilliseconds(5);
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +01001537 pacer_->SetPacingRates(DataRate::BitsPerSec(60000 * kPaceMultiplier),
1538 DataRate::BitsPerSec(30000));
Erik Språngd05edec2019-08-14 10:43:47 +02001539
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001540 SendAndExpectPacket(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +02001541 clock_.TimeInMilliseconds(), kPacketSize);
Danil Chapovalov55284022020-02-07 14:53:52 +01001542 EXPECT_LT(TimeDelta::Millis(5), pacer_->ExpectedQueueTime());
Erik Språngd05edec2019-08-14 10:43:47 +02001543 // Don't send padding if queue is non-empty, even if padding budget > 0.
1544 EXPECT_CALL(callback_, SendPadding).Times(0);
Erik Språngeb487992019-11-14 14:15:15 +01001545 if (PeriodicProcess()) {
1546 pacer_->ProcessPackets();
1547 } else {
1548 AdvanceTimeAndProcess();
1549 }
Erik Språngd05edec2019-08-14 10:43:47 +02001550}
1551
Erik Språngeb487992019-11-14 14:15:15 +01001552TEST_P(PacingControllerTest, ProbeClusterId) {
Erik Språngd05edec2019-08-14 10:43:47 +02001553 MockPacketSender callback;
1554
Erik Språngeb487992019-11-14 14:15:15 +01001555 pacer_ = std::make_unique<PacingController>(&clock_, &callback, nullptr,
1556 nullptr, GetParam());
Erik Språngd05edec2019-08-14 10:43:47 +02001557 Init();
1558
1559 uint32_t ssrc = 12346;
1560 uint16_t sequence_number = 1234;
1561 const size_t kPacketSize = 1200;
1562
1563 pacer_->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
1564 pacer_->SetProbingEnabled(true);
1565 for (int i = 0; i < 10; ++i) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001566 Send(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +02001567 clock_.TimeInMilliseconds(), kPacketSize);
1568 }
1569
1570 // First probing cluster.
Erik Språngf5815fa2019-08-21 14:27:31 +02001571 EXPECT_CALL(callback,
1572 SendRtpPacket(_, Field(&PacedPacketInfo::probe_cluster_id, 0)))
1573 .Times(5);
Erik Språngd05edec2019-08-14 10:43:47 +02001574
1575 for (int i = 0; i < 5; ++i) {
Erik Språngeb487992019-11-14 14:15:15 +01001576 AdvanceTimeAndProcess();
Erik Språngd05edec2019-08-14 10:43:47 +02001577 }
1578
1579 // Second probing cluster.
Erik Språngf5815fa2019-08-21 14:27:31 +02001580 EXPECT_CALL(callback,
1581 SendRtpPacket(_, Field(&PacedPacketInfo::probe_cluster_id, 1)))
1582 .Times(5);
Erik Språngd05edec2019-08-14 10:43:47 +02001583
1584 for (int i = 0; i < 5; ++i) {
Erik Språngeb487992019-11-14 14:15:15 +01001585 AdvanceTimeAndProcess();
Erik Språngd05edec2019-08-14 10:43:47 +02001586 }
1587
1588 // Needed for the Field comparer below.
1589 const int kNotAProbe = PacedPacketInfo::kNotAProbe;
1590 // No more probing packets.
Erik Språngf5815fa2019-08-21 14:27:31 +02001591 EXPECT_CALL(callback, GeneratePadding).WillOnce([&](DataSize padding_size) {
1592 std::vector<std::unique_ptr<RtpPacketToSend>> padding_packets;
1593 padding_packets.emplace_back(
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001594 BuildPacket(RtpPacketMediaType::kPadding, ssrc, sequence_number++,
Erik Språngf5815fa2019-08-21 14:27:31 +02001595 clock_.TimeInMilliseconds(), padding_size.bytes()));
1596 return padding_packets;
1597 });
Erik Språngeb487992019-11-14 14:15:15 +01001598 bool non_probe_packet_seen = false;
1599 EXPECT_CALL(callback, SendRtpPacket)
1600 .WillOnce([&](std::unique_ptr<RtpPacketToSend> packet,
1601 const PacedPacketInfo& cluster_info) {
1602 EXPECT_EQ(cluster_info.probe_cluster_id, kNotAProbe);
1603 non_probe_packet_seen = true;
1604 });
1605 while (!non_probe_packet_seen) {
1606 AdvanceTimeAndProcess();
1607 }
Erik Språngd05edec2019-08-14 10:43:47 +02001608}
1609
Erik Språngeb487992019-11-14 14:15:15 +01001610TEST_P(PacingControllerTest, OwnedPacketPrioritizedOnType) {
Erik Språngd05edec2019-08-14 10:43:47 +02001611 MockPacketSender callback;
Erik Språngeb487992019-11-14 14:15:15 +01001612 pacer_ = std::make_unique<PacingController>(&clock_, &callback, nullptr,
1613 nullptr, GetParam());
Erik Språngd05edec2019-08-14 10:43:47 +02001614 Init();
1615
1616 // Insert a packet of each type, from low to high priority. Since priority
1617 // is weighted higher than insert order, these should come out of the pacer
1618 // in backwards order with the exception of FEC and Video.
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001619 for (RtpPacketMediaType type :
1620 {RtpPacketMediaType::kPadding,
1621 RtpPacketMediaType::kForwardErrorCorrection, RtpPacketMediaType::kVideo,
1622 RtpPacketMediaType::kRetransmission, RtpPacketMediaType::kAudio}) {
Erik Språngd05edec2019-08-14 10:43:47 +02001623 pacer_->EnqueuePacket(BuildRtpPacket(type));
1624 }
1625
1626 ::testing::InSequence seq;
1627 EXPECT_CALL(
1628 callback,
1629 SendRtpPacket(Pointee(Property(&RtpPacketToSend::Ssrc, kAudioSsrc)), _));
1630 EXPECT_CALL(callback,
1631 SendRtpPacket(
1632 Pointee(Property(&RtpPacketToSend::Ssrc, kVideoRtxSsrc)), _));
1633
1634 // FEC and video actually have the same priority, so will come out in
1635 // insertion order.
1636 EXPECT_CALL(callback,
1637 SendRtpPacket(
1638 Pointee(Property(&RtpPacketToSend::Ssrc, kFlexFecSsrc)), _));
1639 EXPECT_CALL(
1640 callback,
1641 SendRtpPacket(Pointee(Property(&RtpPacketToSend::Ssrc, kVideoSsrc)), _));
1642
1643 EXPECT_CALL(callback,
1644 SendRtpPacket(
1645 Pointee(Property(&RtpPacketToSend::Ssrc, kVideoRtxSsrc)), _));
1646
Erik Språngeb487992019-11-14 14:15:15 +01001647 while (pacer_->QueueSizePackets() > 0) {
1648 if (PeriodicProcess()) {
1649 clock_.AdvanceTimeMilliseconds(5);
1650 pacer_->ProcessPackets();
1651 } else {
1652 AdvanceTimeAndProcess();
1653 }
1654 }
Erik Språngd05edec2019-08-14 10:43:47 +02001655}
Erik Språng78c82a42019-10-03 18:46:04 +02001656
Erik Språngeb487992019-11-14 14:15:15 +01001657TEST_P(PacingControllerTest, SmallFirstProbePacket) {
Erik Språng78c82a42019-10-03 18:46:04 +02001658 ScopedFieldTrials trial("WebRTC-Pacer-SmallFirstProbePacket/Enabled/");
1659 MockPacketSender callback;
Erik Språngeb487992019-11-14 14:15:15 +01001660 pacer_ = std::make_unique<PacingController>(&clock_, &callback, nullptr,
1661 nullptr, GetParam());
Erik Språng78c82a42019-10-03 18:46:04 +02001662 pacer_->CreateProbeCluster(kFirstClusterRate, /*cluster_id=*/0);
1663 pacer_->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
1664
1665 // Add high prio media.
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001666 pacer_->EnqueuePacket(BuildRtpPacket(RtpPacketMediaType::kAudio));
Erik Språng78c82a42019-10-03 18:46:04 +02001667
1668 // Expect small padding packet to be requested.
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +01001669 EXPECT_CALL(callback, GeneratePadding(DataSize::Bytes(1)))
Erik Språng78c82a42019-10-03 18:46:04 +02001670 .WillOnce([&](DataSize padding_size) {
1671 std::vector<std::unique_ptr<RtpPacketToSend>> padding_packets;
1672 padding_packets.emplace_back(
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001673 BuildPacket(RtpPacketMediaType::kPadding, kAudioSsrc, 1,
Erik Språng78c82a42019-10-03 18:46:04 +02001674 clock_.TimeInMilliseconds(), 1));
1675 return padding_packets;
1676 });
1677
1678 size_t packets_sent = 0;
1679 bool media_seen = false;
1680 EXPECT_CALL(callback, SendRtpPacket)
1681 .Times(::testing::AnyNumber())
1682 .WillRepeatedly([&](std::unique_ptr<RtpPacketToSend> packet,
1683 const PacedPacketInfo& cluster_info) {
1684 if (packets_sent == 0) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001685 EXPECT_EQ(packet->packet_type(), RtpPacketMediaType::kPadding);
Erik Språng78c82a42019-10-03 18:46:04 +02001686 } else {
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001687 if (packet->packet_type() == RtpPacketMediaType::kAudio) {
Erik Språng78c82a42019-10-03 18:46:04 +02001688 media_seen = true;
1689 }
1690 }
1691 packets_sent++;
1692 });
1693 while (!media_seen) {
1694 pacer_->ProcessPackets();
1695 clock_.AdvanceTimeMilliseconds(5);
1696 }
1697}
Erik Språngeb487992019-11-14 14:15:15 +01001698
Erik Språngeb487992019-11-14 14:15:15 +01001699TEST_P(PacingControllerTest, TaskLate) {
1700 if (PeriodicProcess()) {
1701 // This test applies only when NOT using interval budget.
1702 return;
1703 }
1704
1705 // Set a low send rate to more easily test timing issues.
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +01001706 DataRate kSendRate = DataRate::KilobitsPerSec(30);
Erik Språngeb487992019-11-14 14:15:15 +01001707 pacer_->SetPacingRates(kSendRate, DataRate::Zero());
1708
1709 // Add four packets of equal size and priority.
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001710 pacer_->EnqueuePacket(BuildRtpPacket(RtpPacketMediaType::kVideo));
1711 pacer_->EnqueuePacket(BuildRtpPacket(RtpPacketMediaType::kVideo));
1712 pacer_->EnqueuePacket(BuildRtpPacket(RtpPacketMediaType::kVideo));
1713 pacer_->EnqueuePacket(BuildRtpPacket(RtpPacketMediaType::kVideo));
Erik Språngeb487992019-11-14 14:15:15 +01001714
1715 // Process packets, only first should be sent.
1716 EXPECT_CALL(callback_, SendPacket).Times(1);
1717 pacer_->ProcessPackets();
1718
1719 Timestamp next_send_time = pacer_->NextSendTime();
1720 const TimeDelta time_between_packets = next_send_time - clock_.CurrentTime();
1721
1722 // Simulate a late process call, executed just before we allow sending the
1723 // fourth packet.
1724 clock_.AdvanceTime((time_between_packets * 3) -
Danil Chapovalov55284022020-02-07 14:53:52 +01001725 (PacingController::kMinSleepTime + TimeDelta::Millis(1)));
Erik Språngeb487992019-11-14 14:15:15 +01001726
1727 EXPECT_CALL(callback_, SendPacket).Times(2);
1728 pacer_->ProcessPackets();
1729
1730 // Check that next scheduled send time is within sleep-time + 1ms.
1731 next_send_time = pacer_->NextSendTime();
1732 EXPECT_LE(next_send_time - clock_.CurrentTime(),
Danil Chapovalov55284022020-02-07 14:53:52 +01001733 PacingController::kMinSleepTime + TimeDelta::Millis(1));
Erik Språngeb487992019-11-14 14:15:15 +01001734
1735 // Advance to within error margin for execution.
Danil Chapovalov55284022020-02-07 14:53:52 +01001736 clock_.AdvanceTime(TimeDelta::Millis(1));
Erik Språngeb487992019-11-14 14:15:15 +01001737 EXPECT_CALL(callback_, SendPacket).Times(1);
1738 pacer_->ProcessPackets();
1739}
1740
Erik Språngae100292019-12-17 17:49:49 +01001741TEST_P(PacingControllerTest, NoProbingWhilePaused) {
1742 uint32_t ssrc = 12345;
1743 uint16_t sequence_number = 1234;
1744
1745 pacer_->SetProbingEnabled(true);
1746
1747 // Send at least one packet so probing can initate.
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001748 SendAndExpectPacket(RtpPacketMediaType::kVideo, ssrc, sequence_number,
Erik Språngae100292019-12-17 17:49:49 +01001749 clock_.TimeInMilliseconds(), 250);
1750 while (pacer_->QueueSizePackets() > 0) {
1751 AdvanceTimeAndProcess();
1752 }
1753
1754 // Trigger probing.
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +01001755 pacer_->CreateProbeCluster(DataRate::KilobitsPerSec(10000), // 10 Mbps.
Erik Språngae100292019-12-17 17:49:49 +01001756 /*cluster_id=*/3);
1757
1758 // Time to next send time should be small.
1759 EXPECT_LT(pacer_->NextSendTime() - clock_.CurrentTime(),
1760 PacingController::kPausedProcessInterval);
1761
1762 // Pause pacer, time to next send time should now be the pause process
1763 // interval.
1764 pacer_->Pause();
1765
1766 EXPECT_EQ(pacer_->NextSendTime() - clock_.CurrentTime(),
1767 PacingController::kPausedProcessInterval);
1768}
1769
Erik Språngeb487992019-11-14 14:15:15 +01001770INSTANTIATE_TEST_SUITE_P(
1771 WithAndWithoutIntervalBudget,
1772 PacingControllerTest,
1773 ::testing::Values(PacingController::ProcessMode::kPeriodic,
1774 PacingController::ProcessMode::kDynamic));
1775
Erik Språngd05edec2019-08-14 10:43:47 +02001776} // namespace test
1777} // namespace webrtc