blob: af2ce548e037c8b8ef7c75e070b7e3fd153f21c0 [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"
Erik Språngb9d38092020-07-17 12:06:12 +020023#include "test/explicit_key_value_config.h"
Erik Språngd05edec2019-08-14 10:43:47 +020024#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);
Danil Chapovalov9af4aa72022-02-27 21:10:55 +000062 packet->set_capture_time(Timestamp::Millis(capture_time_ms));
Erik Språngd05edec2019-08-14 10:43:47 +020063 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ånged1fb192020-06-30 11:53:37 +000072 void SendPacket(std::unique_ptr<RtpPacketToSend> packet,
73 const PacedPacketInfo& cluster_info) override {
Erik Språngd05edec2019-08-14 10:43:47 +020074 SendPacket(packet->Ssrc(), packet->SequenceNumber(),
Danil Chapovalov9af4aa72022-02-27 21:10:55 +000075 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
Danil Chapovalov014197b2020-05-26 19:18:17 +020093 MOCK_METHOD(void,
94 SendPacket,
95 (uint32_t ssrc,
96 uint16_t sequence_number,
97 int64_t capture_timestamp,
98 bool retransmission,
99 bool padding));
Erik Språng1d50cb62020-07-02 17:41:32 +0200100 MOCK_METHOD(std::vector<std::unique_ptr<RtpPacketToSend>>,
101 FetchFec,
102 (),
103 (override));
Danil Chapovalov014197b2020-05-26 19:18:17 +0200104 MOCK_METHOD(size_t, SendPadding, (size_t target_size));
Erik Språngd05edec2019-08-14 10:43:47 +0200105};
106
107// Mock callback implementing the raw api.
108class MockPacketSender : public PacingController::PacketSender {
109 public:
Danil Chapovalov014197b2020-05-26 19:18:17 +0200110 MOCK_METHOD(void,
Erik Språnged1fb192020-06-30 11:53:37 +0000111 SendPacket,
Danil Chapovalov014197b2020-05-26 19:18:17 +0200112 (std::unique_ptr<RtpPacketToSend> packet,
113 const PacedPacketInfo& cluster_info),
114 (override));
115 MOCK_METHOD(std::vector<std::unique_ptr<RtpPacketToSend>>,
Erik Språng1d50cb62020-07-02 17:41:32 +0200116 FetchFec,
117 (),
118 (override));
119
120 MOCK_METHOD(std::vector<std::unique_ptr<RtpPacketToSend>>,
Danil Chapovalov014197b2020-05-26 19:18:17 +0200121 GeneratePadding,
122 (DataSize target_size),
123 (override));
Erik Språngd05edec2019-08-14 10:43:47 +0200124};
125
126class PacingControllerPadding : public PacingController::PacketSender {
127 public:
128 static const size_t kPaddingPacketSize = 224;
129
Erik Språngeb487992019-11-14 14:15:15 +0100130 PacingControllerPadding() : padding_sent_(0), total_bytes_sent_(0) {}
Erik Språngd05edec2019-08-14 10:43:47 +0200131
Erik Språnged1fb192020-06-30 11:53:37 +0000132 void SendPacket(std::unique_ptr<RtpPacketToSend> packet,
133 const PacedPacketInfo& pacing_info) override {
Erik Språngeb487992019-11-14 14:15:15 +0100134 total_bytes_sent_ += packet->payload_size();
135 }
Erik Språngd05edec2019-08-14 10:43:47 +0200136
Erik Språng1d50cb62020-07-02 17:41:32 +0200137 std::vector<std::unique_ptr<RtpPacketToSend>> FetchFec() override {
138 return {};
139 }
140
Erik Språngd05edec2019-08-14 10:43:47 +0200141 std::vector<std::unique_ptr<RtpPacketToSend>> GeneratePadding(
142 DataSize target_size) override {
143 size_t num_packets =
144 (target_size.bytes() + kPaddingPacketSize - 1) / kPaddingPacketSize;
145 std::vector<std::unique_ptr<RtpPacketToSend>> packets;
146 for (size_t i = 0; i < num_packets; ++i) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200147 packets.emplace_back(std::make_unique<RtpPacketToSend>(nullptr));
Erik Språngd05edec2019-08-14 10:43:47 +0200148 packets.back()->SetPadding(kPaddingPacketSize);
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100149 packets.back()->set_packet_type(RtpPacketMediaType::kPadding);
Erik Språngd05edec2019-08-14 10:43:47 +0200150 padding_sent_ += kPaddingPacketSize;
151 }
152 return packets;
153 }
154
155 size_t padding_sent() { return padding_sent_; }
Erik Språngeb487992019-11-14 14:15:15 +0100156 size_t total_bytes_sent() { return total_bytes_sent_; }
Erik Språngd05edec2019-08-14 10:43:47 +0200157
158 private:
159 size_t padding_sent_;
Erik Språngeb487992019-11-14 14:15:15 +0100160 size_t total_bytes_sent_;
Erik Språngd05edec2019-08-14 10:43:47 +0200161};
162
163class PacingControllerProbing : public PacingController::PacketSender {
164 public:
165 PacingControllerProbing() : packets_sent_(0), padding_sent_(0) {}
166
Erik Språnged1fb192020-06-30 11:53:37 +0000167 void SendPacket(std::unique_ptr<RtpPacketToSend> packet,
168 const PacedPacketInfo& pacing_info) override {
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100169 if (packet->packet_type() != RtpPacketMediaType::kPadding) {
Erik Språngd05edec2019-08-14 10:43:47 +0200170 ++packets_sent_;
171 }
Erik Språngb9d38092020-07-17 12:06:12 +0200172 last_pacing_info_ = pacing_info;
Erik Språngd05edec2019-08-14 10:43:47 +0200173 }
174
Erik Språng1d50cb62020-07-02 17:41:32 +0200175 std::vector<std::unique_ptr<RtpPacketToSend>> FetchFec() override {
176 return {};
177 }
178
Erik Språngd05edec2019-08-14 10:43:47 +0200179 std::vector<std::unique_ptr<RtpPacketToSend>> GeneratePadding(
180 DataSize target_size) override {
Erik Språngb210eeb2019-11-05 11:21:48 +0100181 // From RTPSender:
182 // Max in the RFC 3550 is 255 bytes, we limit it to be modulus 32 for SRTP.
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +0100183 const DataSize kMaxPadding = DataSize::Bytes(224);
Erik Språngb210eeb2019-11-05 11:21:48 +0100184
Erik Språngd05edec2019-08-14 10:43:47 +0200185 std::vector<std::unique_ptr<RtpPacketToSend>> packets;
Erik Språngb210eeb2019-11-05 11:21:48 +0100186 while (target_size > DataSize::Zero()) {
187 DataSize padding_size = std::min(kMaxPadding, target_size);
188 packets.emplace_back(std::make_unique<RtpPacketToSend>(nullptr));
189 packets.back()->SetPadding(padding_size.bytes());
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100190 packets.back()->set_packet_type(RtpPacketMediaType::kPadding);
Erik Språngb210eeb2019-11-05 11:21:48 +0100191 padding_sent_ += padding_size.bytes();
192 target_size -= padding_size;
193 }
Erik Språngd05edec2019-08-14 10:43:47 +0200194 return packets;
195 }
196
197 int packets_sent() const { return packets_sent_; }
Erik Språngd05edec2019-08-14 10:43:47 +0200198 int padding_sent() const { return padding_sent_; }
Erik Språngb9d38092020-07-17 12:06:12 +0200199 int total_packets_sent() const { return packets_sent_ + padding_sent_; }
200 PacedPacketInfo last_pacing_info() const { return last_pacing_info_; }
Erik Språngd05edec2019-08-14 10:43:47 +0200201
202 private:
203 int packets_sent_;
204 int padding_sent_;
Erik Språngb9d38092020-07-17 12:06:12 +0200205 PacedPacketInfo last_pacing_info_;
Erik Språngd05edec2019-08-14 10:43:47 +0200206};
207
Erik Språngeb487992019-11-14 14:15:15 +0100208class PacingControllerTest
209 : public ::testing::TestWithParam<PacingController::ProcessMode> {
Erik Språngd05edec2019-08-14 10:43:47 +0200210 protected:
Erik Språnge486a7b2022-03-15 15:13:25 +0100211 PacingControllerTest() : clock_(123456), trials_("") {}
Erik Språng9acc18d2020-04-16 19:41:07 +0200212
213 void SetUp() override {
Erik Språngd05edec2019-08-14 10:43:47 +0200214 srand(0);
215 // Need to initialize PacingController after we initialize clock.
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200216 pacer_ = std::make_unique<PacingController>(&clock_, &callback_, nullptr,
Erik Språnge486a7b2022-03-15 15:13:25 +0100217 trials_, GetParam());
Erik Språngd05edec2019-08-14 10:43:47 +0200218 Init();
219 }
220
Erik Språngeb487992019-11-14 14:15:15 +0100221 bool PeriodicProcess() const {
222 return GetParam() == PacingController::ProcessMode::kPeriodic;
223 }
224
Erik Språngd05edec2019-08-14 10:43:47 +0200225 void Init() {
226 pacer_->CreateProbeCluster(kFirstClusterRate, /*cluster_id=*/0);
227 pacer_->CreateProbeCluster(kSecondClusterRate, /*cluster_id=*/1);
228 // Default to bitrate probing disabled for testing purposes. Probing tests
229 // have to enable probing, either by creating a new PacingController
230 // instance or by calling SetProbingEnabled(true).
231 pacer_->SetProbingEnabled(false);
232 pacer_->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
233
234 clock_.AdvanceTime(TimeUntilNextProcess());
235 }
236
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100237 void Send(RtpPacketMediaType type,
Erik Språngd05edec2019-08-14 10:43:47 +0200238 uint32_t ssrc,
239 uint16_t sequence_number,
240 int64_t capture_time_ms,
241 size_t size) {
Erik Språngf5815fa2019-08-21 14:27:31 +0200242 pacer_->EnqueuePacket(
243 BuildPacket(type, ssrc, sequence_number, capture_time_ms, size));
Erik Språngd05edec2019-08-14 10:43:47 +0200244 }
245
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100246 void SendAndExpectPacket(RtpPacketMediaType type,
Erik Språngd05edec2019-08-14 10:43:47 +0200247 uint32_t ssrc,
248 uint16_t sequence_number,
249 int64_t capture_time_ms,
250 size_t size) {
251 Send(type, ssrc, sequence_number, capture_time_ms, size);
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100252 EXPECT_CALL(callback_,
253 SendPacket(ssrc, sequence_number, capture_time_ms,
Erik Språng41bbc3d2021-10-05 10:17:39 +0200254 type == RtpPacketMediaType::kRetransmission, false));
Erik Språngd05edec2019-08-14 10:43:47 +0200255 }
256
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100257 std::unique_ptr<RtpPacketToSend> BuildRtpPacket(RtpPacketMediaType type) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200258 auto packet = std::make_unique<RtpPacketToSend>(nullptr);
Erik Språngd05edec2019-08-14 10:43:47 +0200259 packet->set_packet_type(type);
260 switch (type) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100261 case RtpPacketMediaType::kAudio:
Erik Språngd05edec2019-08-14 10:43:47 +0200262 packet->SetSsrc(kAudioSsrc);
263 break;
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100264 case RtpPacketMediaType::kVideo:
Erik Språngd05edec2019-08-14 10:43:47 +0200265 packet->SetSsrc(kVideoSsrc);
266 break;
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100267 case RtpPacketMediaType::kRetransmission:
268 case RtpPacketMediaType::kPadding:
Erik Språngd05edec2019-08-14 10:43:47 +0200269 packet->SetSsrc(kVideoRtxSsrc);
270 break;
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100271 case RtpPacketMediaType::kForwardErrorCorrection:
Erik Språngd05edec2019-08-14 10:43:47 +0200272 packet->SetSsrc(kFlexFecSsrc);
273 break;
274 }
275
276 packet->SetPayloadSize(234);
277 return packet;
278 }
279
280 TimeDelta TimeUntilNextProcess() {
Erik Språngeb487992019-11-14 14:15:15 +0100281 Timestamp now = clock_.CurrentTime();
282 return std::max(pacer_->NextSendTime() - now, TimeDelta::Zero());
283 }
Erik Språngd05edec2019-08-14 10:43:47 +0200284
Erik Språngeb487992019-11-14 14:15:15 +0100285 void AdvanceTimeAndProcess() {
286 Timestamp now = clock_.CurrentTime();
287 Timestamp next_send_time = pacer_->NextSendTime();
288 clock_.AdvanceTime(std::max(TimeDelta::Zero(), next_send_time - now));
289 pacer_->ProcessPackets();
290 }
291
292 void ConsumeInitialBudget() {
293 const uint32_t kSsrc = 54321;
294 uint16_t sequence_number = 1234;
295 int64_t capture_time_ms = clock_.TimeInMilliseconds();
296 const size_t kPacketSize = 250;
297
Jianhui Dai94457792021-12-07 19:34:36 +0800298 EXPECT_TRUE(pacer_->OldestPacketEnqueueTime().IsInfinite());
Erik Språngeb487992019-11-14 14:15:15 +0100299
300 // Due to the multiplicative factor we can send 5 packets during a send
301 // interval. (network capacity * multiplier / (8 bits per byte *
302 // (packet size * #send intervals per second)
303 const size_t packets_to_send_per_interval =
304 kTargetRate.bps() * kPaceMultiplier / (8 * kPacketSize * 200);
305 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100306 SendAndExpectPacket(RtpPacketMediaType::kVideo, kSsrc, sequence_number++,
307 capture_time_ms, kPacketSize);
Erik Språngd05edec2019-08-14 10:43:47 +0200308 }
309
Erik Språngeb487992019-11-14 14:15:15 +0100310 while (pacer_->QueueSizePackets() > 0) {
311 if (PeriodicProcess()) {
312 clock_.AdvanceTime(TimeUntilNextProcess());
313 pacer_->ProcessPackets();
314 } else {
315 AdvanceTimeAndProcess();
316 }
Erik Språngd05edec2019-08-14 10:43:47 +0200317 }
Erik Språngd05edec2019-08-14 10:43:47 +0200318 }
319
320 SimulatedClock clock_;
Erik Språng1d50cb62020-07-02 17:41:32 +0200321 ::testing::NiceMock<MockPacingControllerCallback> callback_;
Erik Språnge486a7b2022-03-15 15:13:25 +0100322 ExplicitKeyValueConfig trials_;
Erik Språngd05edec2019-08-14 10:43:47 +0200323 std::unique_ptr<PacingController> pacer_;
324};
325
Erik Språngeb487992019-11-14 14:15:15 +0100326class PacingControllerFieldTrialTest
327 : public ::testing::TestWithParam<PacingController::ProcessMode> {
Erik Språngd05edec2019-08-14 10:43:47 +0200328 protected:
329 struct MediaStream {
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100330 const RtpPacketMediaType type;
Erik Språngd05edec2019-08-14 10:43:47 +0200331 const uint32_t ssrc;
332 const size_t packet_size;
333 uint16_t seq_num;
334 };
335
336 const int kProcessIntervalsPerSecond = 1000 / 5;
337
338 PacingControllerFieldTrialTest() : clock_(123456) {}
339 void InsertPacket(PacingController* pacer, MediaStream* stream) {
Erik Språngf5815fa2019-08-21 14:27:31 +0200340 pacer->EnqueuePacket(
341 BuildPacket(stream->type, stream->ssrc, stream->seq_num++,
342 clock_.TimeInMilliseconds(), stream->packet_size));
Erik Språngd05edec2019-08-14 10:43:47 +0200343 }
344 void ProcessNext(PacingController* pacer) {
Erik Språngeb487992019-11-14 14:15:15 +0100345 if (GetParam() == PacingController::ProcessMode::kPeriodic) {
Danil Chapovalov55284022020-02-07 14:53:52 +0100346 TimeDelta process_interval = TimeDelta::Millis(5);
Erik Språngeb487992019-11-14 14:15:15 +0100347 clock_.AdvanceTime(process_interval);
348 pacer->ProcessPackets();
349 return;
350 }
351
352 Timestamp now = clock_.CurrentTime();
353 Timestamp next_send_time = pacer->NextSendTime();
354 TimeDelta wait_time = std::max(TimeDelta::Zero(), next_send_time - now);
355 clock_.AdvanceTime(wait_time);
Erik Språngd05edec2019-08-14 10:43:47 +0200356 pacer->ProcessPackets();
357 }
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100358 MediaStream audio{/*type*/ RtpPacketMediaType::kAudio,
Erik Språngd05edec2019-08-14 10:43:47 +0200359 /*ssrc*/ 3333, /*packet_size*/ 100, /*seq_num*/ 1000};
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100360 MediaStream video{/*type*/ RtpPacketMediaType::kVideo,
Erik Språngd05edec2019-08-14 10:43:47 +0200361 /*ssrc*/ 4444, /*packet_size*/ 1000, /*seq_num*/ 1000};
362 SimulatedClock clock_;
363 MockPacingControllerCallback callback_;
364};
365
Erik Språngeb487992019-11-14 14:15:15 +0100366TEST_P(PacingControllerFieldTrialTest, DefaultNoPaddingInSilence) {
Erik Språnge486a7b2022-03-15 15:13:25 +0100367 const test::ExplicitKeyValueConfig trials("");
368 PacingController pacer(&clock_, &callback_, nullptr, trials, GetParam());
Erik Språngd05edec2019-08-14 10:43:47 +0200369 pacer.SetPacingRates(kTargetRate, DataRate::Zero());
370 // Video packet to reset last send time and provide padding data.
371 InsertPacket(&pacer, &video);
372 EXPECT_CALL(callback_, SendPacket).Times(1);
373 clock_.AdvanceTimeMilliseconds(5);
374 pacer.ProcessPackets();
375 EXPECT_CALL(callback_, SendPadding).Times(0);
376 // Waiting 500 ms should not trigger sending of padding.
377 clock_.AdvanceTimeMilliseconds(500);
378 pacer.ProcessPackets();
379}
380
Erik Språngeb487992019-11-14 14:15:15 +0100381TEST_P(PacingControllerFieldTrialTest, PaddingInSilenceWithTrial) {
Erik Språnge486a7b2022-03-15 15:13:25 +0100382 const test::ExplicitKeyValueConfig trials(
383 "WebRTC-Pacer-PadInSilence/Enabled/");
384 PacingController pacer(&clock_, &callback_, nullptr, trials, GetParam());
Erik Språngd05edec2019-08-14 10:43:47 +0200385 pacer.SetPacingRates(kTargetRate, DataRate::Zero());
386 // Video packet to reset last send time and provide padding data.
387 InsertPacket(&pacer, &video);
Erik Språngf5815fa2019-08-21 14:27:31 +0200388 EXPECT_CALL(callback_, SendPacket).Times(2);
Erik Språngd05edec2019-08-14 10:43:47 +0200389 clock_.AdvanceTimeMilliseconds(5);
390 pacer.ProcessPackets();
391 EXPECT_CALL(callback_, SendPadding).WillOnce(Return(1000));
392 // Waiting 500 ms should trigger sending of padding.
393 clock_.AdvanceTimeMilliseconds(500);
394 pacer.ProcessPackets();
395}
396
Evan Shrubsole6ef59d12020-01-08 16:45:08 +0100397TEST_P(PacingControllerFieldTrialTest, CongestionWindowAffectsAudioInTrial) {
Erik Språnge486a7b2022-03-15 15:13:25 +0100398 const test::ExplicitKeyValueConfig trials("WebRTC-Pacer-BlockAudio/Enabled/");
Erik Språngd05edec2019-08-14 10:43:47 +0200399 EXPECT_CALL(callback_, SendPadding).Times(0);
Erik Språnge486a7b2022-03-15 15:13:25 +0100400 PacingController pacer(&clock_, &callback_, nullptr, trials, GetParam());
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +0100401 pacer.SetPacingRates(DataRate::KilobitsPerSec(10000), DataRate::Zero());
402 pacer.SetCongestionWindow(DataSize::Bytes(video.packet_size - 100));
Erik Språngd05edec2019-08-14 10:43:47 +0200403 pacer.UpdateOutstandingData(DataSize::Zero());
404 // Video packet fills congestion window.
405 InsertPacket(&pacer, &video);
406 EXPECT_CALL(callback_, SendPacket).Times(1);
407 ProcessNext(&pacer);
408 // Audio packet blocked due to congestion.
409 InsertPacket(&pacer, &audio);
410 EXPECT_CALL(callback_, SendPacket).Times(0);
Erik Språngeb487992019-11-14 14:15:15 +0100411 if (GetParam() == PacingController::ProcessMode::kDynamic) {
412 // Without interval budget we'll forward time to where we send keep-alive.
413 EXPECT_CALL(callback_, SendPadding(1)).Times(2);
414 }
Erik Språngd05edec2019-08-14 10:43:47 +0200415 ProcessNext(&pacer);
416 ProcessNext(&pacer);
417 // Audio packet unblocked when congestion window clear.
418 ::testing::Mock::VerifyAndClearExpectations(&callback_);
419 pacer.UpdateOutstandingData(DataSize::Zero());
420 EXPECT_CALL(callback_, SendPacket).Times(1);
421 ProcessNext(&pacer);
422}
423
Erik Språngeb487992019-11-14 14:15:15 +0100424TEST_P(PacingControllerFieldTrialTest,
Evan Shrubsole6ef59d12020-01-08 16:45:08 +0100425 DefaultCongestionWindowDoesNotAffectAudio) {
Erik Språngd05edec2019-08-14 10:43:47 +0200426 EXPECT_CALL(callback_, SendPadding).Times(0);
Erik Språnge486a7b2022-03-15 15:13:25 +0100427 const test::ExplicitKeyValueConfig trials("");
428 PacingController pacer(&clock_, &callback_, nullptr, trials, GetParam());
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +0100429 pacer.SetPacingRates(DataRate::BitsPerSec(10000000), DataRate::Zero());
430 pacer.SetCongestionWindow(DataSize::Bytes(800));
Erik Språngd05edec2019-08-14 10:43:47 +0200431 pacer.UpdateOutstandingData(DataSize::Zero());
432 // Video packet fills congestion window.
433 InsertPacket(&pacer, &video);
434 EXPECT_CALL(callback_, SendPacket).Times(1);
435 ProcessNext(&pacer);
436 // Audio not blocked due to congestion.
437 InsertPacket(&pacer, &audio);
438 EXPECT_CALL(callback_, SendPacket).Times(1);
439 ProcessNext(&pacer);
440}
441
Evan Shrubsole6ef59d12020-01-08 16:45:08 +0100442TEST_P(PacingControllerFieldTrialTest, BudgetAffectsAudioInTrial) {
Erik Språnge486a7b2022-03-15 15:13:25 +0100443 ExplicitKeyValueConfig trials("WebRTC-Pacer-BlockAudio/Enabled/");
444 PacingController pacer(&clock_, &callback_, nullptr, trials, GetParam());
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +0100445 DataRate pacing_rate = DataRate::BitsPerSec(video.packet_size / 3 * 8 *
446 kProcessIntervalsPerSecond);
Erik Språngeb487992019-11-14 14:15:15 +0100447 pacer.SetPacingRates(pacing_rate, DataRate::Zero());
Erik Språngd05edec2019-08-14 10:43:47 +0200448 // Video fills budget for following process periods.
449 InsertPacket(&pacer, &video);
450 EXPECT_CALL(callback_, SendPacket).Times(1);
451 ProcessNext(&pacer);
452 // Audio packet blocked due to budget limit.
Erik Språngd05edec2019-08-14 10:43:47 +0200453 InsertPacket(&pacer, &audio);
Erik Språngeb487992019-11-14 14:15:15 +0100454 Timestamp wait_start_time = clock_.CurrentTime();
455 Timestamp wait_end_time = Timestamp::MinusInfinity();
456 EXPECT_CALL(callback_, SendPacket)
457 .WillOnce([&](uint32_t ssrc, uint16_t sequence_number,
458 int64_t capture_timestamp, bool retransmission,
459 bool padding) { wait_end_time = clock_.CurrentTime(); });
460 while (!wait_end_time.IsFinite()) {
461 ProcessNext(&pacer);
462 }
463 const TimeDelta expected_wait_time =
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +0100464 DataSize::Bytes(video.packet_size) / pacing_rate;
Erik Språngeb487992019-11-14 14:15:15 +0100465 // Verify delay is near expectation, within timing margin.
466 EXPECT_LT(((wait_end_time - wait_start_time) - expected_wait_time).Abs(),
467 GetParam() == PacingController::ProcessMode::kPeriodic
Danil Chapovalov55284022020-02-07 14:53:52 +0100468 ? TimeDelta::Millis(5)
Erik Språngeb487992019-11-14 14:15:15 +0100469 : PacingController::kMinSleepTime);
Erik Språngd05edec2019-08-14 10:43:47 +0200470}
471
Evan Shrubsole6ef59d12020-01-08 16:45:08 +0100472TEST_P(PacingControllerFieldTrialTest, DefaultBudgetDoesNotAffectAudio) {
Erik Språngd05edec2019-08-14 10:43:47 +0200473 EXPECT_CALL(callback_, SendPadding).Times(0);
Erik Språnge486a7b2022-03-15 15:13:25 +0100474 const test::ExplicitKeyValueConfig trials("");
475 PacingController pacer(&clock_, &callback_, nullptr, trials, GetParam());
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +0100476 pacer.SetPacingRates(DataRate::BitsPerSec(video.packet_size / 3 * 8 *
477 kProcessIntervalsPerSecond),
478 DataRate::Zero());
Erik Språngd05edec2019-08-14 10:43:47 +0200479 // Video fills budget for following process periods.
480 InsertPacket(&pacer, &video);
481 EXPECT_CALL(callback_, SendPacket).Times(1);
482 ProcessNext(&pacer);
483 // Audio packet not blocked due to budget limit.
484 EXPECT_CALL(callback_, SendPacket).Times(1);
485 InsertPacket(&pacer, &audio);
486 ProcessNext(&pacer);
487}
488
Erik Språngeb487992019-11-14 14:15:15 +0100489INSTANTIATE_TEST_SUITE_P(WithAndWithoutIntervalBudget,
490 PacingControllerFieldTrialTest,
491 ::testing::Values(false, true));
492
493TEST_P(PacingControllerTest, FirstSentPacketTimeIsSet) {
Erik Språngd05edec2019-08-14 10:43:47 +0200494 uint16_t sequence_number = 1234;
495 const uint32_t kSsrc = 12345;
496 const size_t kSizeBytes = 250;
497 const size_t kPacketToSend = 3;
498 const Timestamp kStartTime = clock_.CurrentTime();
499
500 // No packet sent.
501 EXPECT_FALSE(pacer_->FirstSentPacketTime().has_value());
502
503 for (size_t i = 0; i < kPacketToSend; ++i) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100504 SendAndExpectPacket(RtpPacketMediaType::kVideo, kSsrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +0200505 clock_.TimeInMilliseconds(), kSizeBytes);
Erik Språngd05edec2019-08-14 10:43:47 +0200506 clock_.AdvanceTime(TimeUntilNextProcess());
Erik Språngeb487992019-11-14 14:15:15 +0100507 pacer_->ProcessPackets();
Erik Språngd05edec2019-08-14 10:43:47 +0200508 }
509 EXPECT_EQ(kStartTime, pacer_->FirstSentPacketTime());
510}
511
Erik Språngeb487992019-11-14 14:15:15 +0100512TEST_P(PacingControllerTest, QueuePacket) {
513 if (!PeriodicProcess()) {
514 // This test checks behavior applicable only when using interval budget.
515 return;
516 }
517
Erik Språngd05edec2019-08-14 10:43:47 +0200518 uint32_t ssrc = 12345;
519 uint16_t sequence_number = 1234;
Erik Språngeb487992019-11-14 14:15:15 +0100520 // Due to the multiplicative factor we can send 5 packets during a 5ms send
Erik Språngd05edec2019-08-14 10:43:47 +0200521 // interval. (network capacity * multiplier / (8 bits per byte *
522 // (packet size * #send intervals per second)
Erik Språngeb487992019-11-14 14:15:15 +0100523 const size_t kPacketsToSend =
Erik Språngd05edec2019-08-14 10:43:47 +0200524 kTargetRate.bps() * kPaceMultiplier / (8 * 250 * 200);
Erik Språngeb487992019-11-14 14:15:15 +0100525 for (size_t i = 0; i < kPacketsToSend; ++i) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100526 SendAndExpectPacket(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +0200527 clock_.TimeInMilliseconds(), 250);
528 }
Erik Språngeb487992019-11-14 14:15:15 +0100529 EXPECT_CALL(callback_, SendPadding).Times(0);
Erik Språngd05edec2019-08-14 10:43:47 +0200530
Erik Språngeb487992019-11-14 14:15:15 +0100531 // Enqueue one extra packet.
Erik Språngd05edec2019-08-14 10:43:47 +0200532 int64_t queued_packet_timestamp = clock_.TimeInMilliseconds();
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100533 Send(RtpPacketMediaType::kVideo, ssrc, sequence_number,
Erik Språngd05edec2019-08-14 10:43:47 +0200534 queued_packet_timestamp, 250);
Erik Språngeb487992019-11-14 14:15:15 +0100535 EXPECT_EQ(kPacketsToSend + 1, pacer_->QueueSizePackets());
536
537 // The first kPacketsToSend packets will be sent with budget from the
538 // initial 5ms interval.
Erik Språngd05edec2019-08-14 10:43:47 +0200539 pacer_->ProcessPackets();
Erik Språngd05edec2019-08-14 10:43:47 +0200540 EXPECT_EQ(1u, pacer_->QueueSizePackets());
Erik Språngeb487992019-11-14 14:15:15 +0100541
542 // Advance time to next interval, make sure the last packet is sent.
543 clock_.AdvanceTimeMilliseconds(5);
Erik Språngd05edec2019-08-14 10:43:47 +0200544 EXPECT_CALL(callback_, SendPacket(ssrc, sequence_number++,
545 queued_packet_timestamp, false, false))
546 .Times(1);
547 pacer_->ProcessPackets();
548 sequence_number++;
549 EXPECT_EQ(0u, pacer_->QueueSizePackets());
550
551 // We can send packets_to_send -1 packets of size 250 during the current
552 // interval since one packet has already been sent.
Erik Språngeb487992019-11-14 14:15:15 +0100553 for (size_t i = 0; i < kPacketsToSend - 1; ++i) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100554 SendAndExpectPacket(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +0200555 clock_.TimeInMilliseconds(), 250);
556 }
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100557 Send(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +0200558 clock_.TimeInMilliseconds(), 250);
Erik Språngeb487992019-11-14 14:15:15 +0100559 EXPECT_EQ(kPacketsToSend, pacer_->QueueSizePackets());
Erik Språngd05edec2019-08-14 10:43:47 +0200560 pacer_->ProcessPackets();
561 EXPECT_EQ(1u, pacer_->QueueSizePackets());
562}
563
Erik Språngeb487992019-11-14 14:15:15 +0100564TEST_P(PacingControllerTest, QueueAndPacePackets) {
565 if (PeriodicProcess()) {
566 // This test checks behavior when not using interval budget.
567 return;
568 }
569
570 const uint32_t kSsrc = 12345;
571 uint16_t sequence_number = 1234;
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +0100572 const DataSize kPackeSize = DataSize::Bytes(250);
Danil Chapovalov55284022020-02-07 14:53:52 +0100573 const TimeDelta kSendInterval = TimeDelta::Millis(5);
Erik Språngeb487992019-11-14 14:15:15 +0100574
575 // Due to the multiplicative factor we can send 5 packets during a 5ms send
576 // interval. (send interval * network capacity * multiplier / packet size)
577 const size_t kPacketsToSend = (kSendInterval * kTargetRate).bytes() *
578 kPaceMultiplier / kPackeSize.bytes();
579
580 for (size_t i = 0; i < kPacketsToSend; ++i) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100581 SendAndExpectPacket(RtpPacketMediaType::kVideo, kSsrc, sequence_number++,
Erik Språngeb487992019-11-14 14:15:15 +0100582 clock_.TimeInMilliseconds(), kPackeSize.bytes());
583 }
584 EXPECT_CALL(callback_, SendPadding).Times(0);
585
586 // Enqueue one extra packet.
587 int64_t queued_packet_timestamp = clock_.TimeInMilliseconds();
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100588 Send(RtpPacketMediaType::kVideo, kSsrc, sequence_number,
Erik Språngeb487992019-11-14 14:15:15 +0100589 queued_packet_timestamp, kPackeSize.bytes());
590 EXPECT_EQ(kPacketsToSend + 1, pacer_->QueueSizePackets());
591
592 // Send packets until the initial kPacketsToSend packets are done.
593 Timestamp start_time = clock_.CurrentTime();
594 while (pacer_->QueueSizePackets() > 1) {
595 AdvanceTimeAndProcess();
596 }
597 EXPECT_LT(clock_.CurrentTime() - start_time, kSendInterval);
598
599 // Proceed till last packet can be sent.
600 EXPECT_CALL(callback_, SendPacket(kSsrc, sequence_number,
601 queued_packet_timestamp, false, false))
602 .Times(1);
603 AdvanceTimeAndProcess();
604 EXPECT_GE(clock_.CurrentTime() - start_time, kSendInterval);
605 EXPECT_EQ(pacer_->QueueSizePackets(), 0u);
606}
607
608TEST_P(PacingControllerTest, PaceQueuedPackets) {
Erik Språngd05edec2019-08-14 10:43:47 +0200609 uint32_t ssrc = 12345;
610 uint16_t sequence_number = 1234;
Erik Språngeb487992019-11-14 14:15:15 +0100611 const size_t kPacketSize = 250;
Erik Språngd05edec2019-08-14 10:43:47 +0200612
613 // Due to the multiplicative factor we can send 5 packets during a send
614 // interval. (network capacity * multiplier / (8 bits per byte *
615 // (packet size * #send intervals per second)
616 const size_t packets_to_send_per_interval =
Erik Språngeb487992019-11-14 14:15:15 +0100617 kTargetRate.bps() * kPaceMultiplier / (8 * kPacketSize * 200);
Erik Språngd05edec2019-08-14 10:43:47 +0200618 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100619 SendAndExpectPacket(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngeb487992019-11-14 14:15:15 +0100620 clock_.TimeInMilliseconds(), kPacketSize);
Erik Språngd05edec2019-08-14 10:43:47 +0200621 }
622
623 for (size_t j = 0; j < packets_to_send_per_interval * 10; ++j) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100624 Send(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngeb487992019-11-14 14:15:15 +0100625 clock_.TimeInMilliseconds(), kPacketSize);
Erik Språngd05edec2019-08-14 10:43:47 +0200626 }
627 EXPECT_EQ(packets_to_send_per_interval + packets_to_send_per_interval * 10,
628 pacer_->QueueSizePackets());
Erik Språngeb487992019-11-14 14:15:15 +0100629 if (PeriodicProcess()) {
Erik Språngd05edec2019-08-14 10:43:47 +0200630 pacer_->ProcessPackets();
Erik Språngeb487992019-11-14 14:15:15 +0100631 } else {
632 while (pacer_->QueueSizePackets() > packets_to_send_per_interval * 10) {
633 AdvanceTimeAndProcess();
634 }
Erik Språngd05edec2019-08-14 10:43:47 +0200635 }
Erik Språngeb487992019-11-14 14:15:15 +0100636 EXPECT_EQ(pacer_->QueueSizePackets(), packets_to_send_per_interval * 10);
637 EXPECT_CALL(callback_, SendPadding).Times(0);
638
639 EXPECT_CALL(callback_, SendPacket(ssrc, _, _, false, false))
640 .Times(pacer_->QueueSizePackets());
641 const TimeDelta expected_pace_time =
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +0100642 DataSize::Bytes(pacer_->QueueSizePackets() * kPacketSize) /
Erik Språngeb487992019-11-14 14:15:15 +0100643 (kPaceMultiplier * kTargetRate);
644 Timestamp start_time = clock_.CurrentTime();
645 while (pacer_->QueueSizePackets() > 0) {
646 if (PeriodicProcess()) {
647 clock_.AdvanceTime(TimeUntilNextProcess());
648 pacer_->ProcessPackets();
649 } else {
650 AdvanceTimeAndProcess();
651 }
652 }
653 const TimeDelta actual_pace_time = clock_.CurrentTime() - start_time;
Danil Chapovalov55284022020-02-07 14:53:52 +0100654 EXPECT_LT((actual_pace_time - expected_pace_time).Abs(),
655 PeriodicProcess() ? TimeDelta::Millis(5)
656 : PacingController::kMinSleepTime);
Erik Språngeb487992019-11-14 14:15:15 +0100657
Erik Språngd05edec2019-08-14 10:43:47 +0200658 EXPECT_EQ(0u, pacer_->QueueSizePackets());
659 clock_.AdvanceTime(TimeUntilNextProcess());
660 EXPECT_EQ(0u, pacer_->QueueSizePackets());
661 pacer_->ProcessPackets();
662
Erik Språngeb487992019-11-14 14:15:15 +0100663 // Send some more packet, just show that we can..?
Erik Språngd05edec2019-08-14 10:43:47 +0200664 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100665 SendAndExpectPacket(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +0200666 clock_.TimeInMilliseconds(), 250);
667 }
Erik Språngeb487992019-11-14 14:15:15 +0100668 EXPECT_EQ(packets_to_send_per_interval, pacer_->QueueSizePackets());
669 if (PeriodicProcess()) {
670 pacer_->ProcessPackets();
671 } else {
672 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
673 AdvanceTimeAndProcess();
674 }
675 }
676 EXPECT_EQ(0u, pacer_->QueueSizePackets());
Erik Språngd05edec2019-08-14 10:43:47 +0200677}
678
Erik Språngeb487992019-11-14 14:15:15 +0100679TEST_P(PacingControllerTest, RepeatedRetransmissionsAllowed) {
Erik Språngd05edec2019-08-14 10:43:47 +0200680 // Send one packet, then two retransmissions of that packet.
681 for (size_t i = 0; i < 3; i++) {
682 constexpr uint32_t ssrc = 333;
683 constexpr uint16_t sequence_number = 444;
684 constexpr size_t bytes = 250;
685 bool is_retransmission = (i != 0); // Original followed by retransmissions.
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100686 SendAndExpectPacket(is_retransmission ? RtpPacketMediaType::kRetransmission
687 : RtpPacketMediaType::kVideo,
688 ssrc, sequence_number, clock_.TimeInMilliseconds(),
689 bytes);
Erik Språngd05edec2019-08-14 10:43:47 +0200690 clock_.AdvanceTimeMilliseconds(5);
691 }
Erik Språngeb487992019-11-14 14:15:15 +0100692 if (PeriodicProcess()) {
693 pacer_->ProcessPackets();
694 } else {
695 while (pacer_->QueueSizePackets() > 0) {
696 AdvanceTimeAndProcess();
697 }
698 }
Erik Språngd05edec2019-08-14 10:43:47 +0200699}
700
Erik Språngeb487992019-11-14 14:15:15 +0100701TEST_P(PacingControllerTest,
Erik Språngd05edec2019-08-14 10:43:47 +0200702 CanQueuePacketsWithSameSequenceNumberOnDifferentSsrcs) {
703 uint32_t ssrc = 12345;
704 uint16_t sequence_number = 1234;
705
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100706 SendAndExpectPacket(RtpPacketMediaType::kVideo, ssrc, sequence_number,
Erik Språngd05edec2019-08-14 10:43:47 +0200707 clock_.TimeInMilliseconds(), 250);
708
709 // Expect packet on second ssrc to be queued and sent as well.
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100710 SendAndExpectPacket(RtpPacketMediaType::kVideo, ssrc + 1, sequence_number,
Erik Språngd05edec2019-08-14 10:43:47 +0200711 clock_.TimeInMilliseconds(), 250);
712
713 clock_.AdvanceTimeMilliseconds(1000);
Erik Språngeb487992019-11-14 14:15:15 +0100714 if (PeriodicProcess()) {
715 pacer_->ProcessPackets();
716 } else {
717 while (pacer_->QueueSizePackets() > 0) {
718 AdvanceTimeAndProcess();
719 }
720 }
Erik Språngd05edec2019-08-14 10:43:47 +0200721}
722
Erik Språngeb487992019-11-14 14:15:15 +0100723TEST_P(PacingControllerTest, Padding) {
Erik Språngd05edec2019-08-14 10:43:47 +0200724 uint32_t ssrc = 12345;
725 uint16_t sequence_number = 1234;
Erik Språngeb487992019-11-14 14:15:15 +0100726 const size_t kPacketSize = 250;
Erik Språngd05edec2019-08-14 10:43:47 +0200727
728 pacer_->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
729
Erik Språngeb487992019-11-14 14:15:15 +0100730 if (PeriodicProcess()) {
731 ConsumeInitialBudget();
732
733 // 5 milliseconds later should not send padding since we filled the buffers
734 // initially.
735 EXPECT_CALL(callback_, SendPadding(kPacketSize)).Times(0);
736 clock_.AdvanceTime(TimeUntilNextProcess());
737 pacer_->ProcessPackets();
738
739 // 5 milliseconds later we have enough budget to send some padding.
740 EXPECT_CALL(callback_, SendPadding(250)).WillOnce(Return(kPacketSize));
741 EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
742 clock_.AdvanceTime(TimeUntilNextProcess());
743 pacer_->ProcessPackets();
744 } else {
745 const size_t kPacketsToSend = 20;
746 for (size_t i = 0; i < kPacketsToSend; ++i) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100747 SendAndExpectPacket(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
748 clock_.TimeInMilliseconds(), kPacketSize);
Erik Språngeb487992019-11-14 14:15:15 +0100749 }
750 const TimeDelta expected_pace_time =
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +0100751 DataSize::Bytes(pacer_->QueueSizePackets() * kPacketSize) /
Erik Språngeb487992019-11-14 14:15:15 +0100752 (kPaceMultiplier * kTargetRate);
753 EXPECT_CALL(callback_, SendPadding).Times(0);
754 // Only the media packets should be sent.
755 Timestamp start_time = clock_.CurrentTime();
756 while (pacer_->QueueSizePackets() > 0) {
757 AdvanceTimeAndProcess();
758 }
759 const TimeDelta actual_pace_time = clock_.CurrentTime() - start_time;
760 EXPECT_LE((actual_pace_time - expected_pace_time).Abs(),
761 PacingController::kMinSleepTime);
762
Erik Språngb1ccae22019-11-25 18:22:09 +0100763 // Pacing media happens at 2.5x, but padding was configured with 1.0x
Erik Språngeb487992019-11-14 14:15:15 +0100764 // factor. We have to wait until the padding debt is gone before we start
765 // sending padding.
766 const TimeDelta time_to_padding_debt_free =
767 (expected_pace_time * kPaceMultiplier) - actual_pace_time;
Erik Språngb1ccae22019-11-25 18:22:09 +0100768 clock_.AdvanceTime(time_to_padding_debt_free -
769 PacingController::kMinSleepTime);
770 pacer_->ProcessPackets();
Erik Språngeb487992019-11-14 14:15:15 +0100771
772 // Send 10 padding packets.
773 const size_t kPaddingPacketsToSend = 10;
774 DataSize padding_sent = DataSize::Zero();
Erik Språngb1ccae22019-11-25 18:22:09 +0100775 size_t packets_sent = 0;
776 Timestamp first_send_time = Timestamp::MinusInfinity();
777 Timestamp last_send_time = Timestamp::MinusInfinity();
778
Erik Språngeb487992019-11-14 14:15:15 +0100779 EXPECT_CALL(callback_, SendPadding)
780 .Times(kPaddingPacketsToSend)
781 .WillRepeatedly([&](size_t target_size) {
Erik Språngb1ccae22019-11-25 18:22:09 +0100782 ++packets_sent;
783 if (packets_sent < kPaddingPacketsToSend) {
784 // Don't count bytes of last packet, instead just
785 // use this as the time the last packet finished
786 // sending.
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +0100787 padding_sent += DataSize::Bytes(target_size);
Erik Språngb1ccae22019-11-25 18:22:09 +0100788 }
789 if (first_send_time.IsInfinite()) {
790 first_send_time = clock_.CurrentTime();
791 } else {
792 last_send_time = clock_.CurrentTime();
793 }
Erik Språngeb487992019-11-14 14:15:15 +0100794 return target_size;
795 });
796 EXPECT_CALL(callback_, SendPacket(_, _, _, false, true))
797 .Times(kPaddingPacketsToSend);
Erik Språngb1ccae22019-11-25 18:22:09 +0100798
799 while (packets_sent < kPaddingPacketsToSend) {
Erik Språngeb487992019-11-14 14:15:15 +0100800 AdvanceTimeAndProcess();
801 }
802
803 // Verify rate of sent padding.
Erik Språngb1ccae22019-11-25 18:22:09 +0100804 TimeDelta padding_duration = last_send_time - first_send_time;
Erik Språngeb487992019-11-14 14:15:15 +0100805 DataRate padding_rate = padding_sent / padding_duration;
806 EXPECT_EQ(padding_rate, kTargetRate);
Erik Språngd05edec2019-08-14 10:43:47 +0200807 }
Erik Språngd05edec2019-08-14 10:43:47 +0200808}
809
Erik Språngeb487992019-11-14 14:15:15 +0100810TEST_P(PacingControllerTest, NoPaddingBeforeNormalPacket) {
Erik Språngd05edec2019-08-14 10:43:47 +0200811 pacer_->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
812
813 EXPECT_CALL(callback_, SendPadding).Times(0);
Erik Språngeb487992019-11-14 14:15:15 +0100814
Erik Språngd05edec2019-08-14 10:43:47 +0200815 pacer_->ProcessPackets();
816 clock_.AdvanceTime(TimeUntilNextProcess());
817
818 pacer_->ProcessPackets();
819 clock_.AdvanceTime(TimeUntilNextProcess());
820
821 uint32_t ssrc = 12345;
822 uint16_t sequence_number = 1234;
823 int64_t capture_time_ms = 56789;
824
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100825 SendAndExpectPacket(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +0200826 capture_time_ms, 250);
Erik Språngb1ccae22019-11-25 18:22:09 +0100827 bool padding_sent = false;
828 EXPECT_CALL(callback_, SendPadding).WillOnce([&](size_t padding) {
829 padding_sent = true;
Erik Språngeb487992019-11-14 14:15:15 +0100830 return padding;
831 });
Erik Språngf5815fa2019-08-21 14:27:31 +0200832 EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
Erik Språngeb487992019-11-14 14:15:15 +0100833 if (PeriodicProcess()) {
834 pacer_->ProcessPackets();
835 } else {
Erik Språngb1ccae22019-11-25 18:22:09 +0100836 while (!padding_sent) {
837 AdvanceTimeAndProcess();
838 }
Erik Språngeb487992019-11-14 14:15:15 +0100839 }
Erik Språngd05edec2019-08-14 10:43:47 +0200840}
841
Erik Språngeb487992019-11-14 14:15:15 +0100842TEST_P(PacingControllerTest, VerifyPaddingUpToBitrate) {
843 if (!PeriodicProcess()) {
844 // Already tested in PacingControllerTest.Padding.
845 return;
846 }
847
Erik Språngd05edec2019-08-14 10:43:47 +0200848 uint32_t ssrc = 12345;
849 uint16_t sequence_number = 1234;
850 int64_t capture_time_ms = 56789;
851 const int kTimeStep = 5;
852 const int64_t kBitrateWindow = 100;
853 pacer_->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
854
855 int64_t start_time = clock_.TimeInMilliseconds();
856 while (clock_.TimeInMilliseconds() - start_time < kBitrateWindow) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100857 SendAndExpectPacket(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +0200858 capture_time_ms, 250);
859 EXPECT_CALL(callback_, SendPadding(250)).WillOnce(Return(250));
Erik Språngf5815fa2019-08-21 14:27:31 +0200860 EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
Erik Språngd05edec2019-08-14 10:43:47 +0200861 pacer_->ProcessPackets();
862 clock_.AdvanceTimeMilliseconds(kTimeStep);
863 }
864}
865
Erik Språngeb487992019-11-14 14:15:15 +0100866TEST_P(PacingControllerTest, VerifyAverageBitrateVaryingMediaPayload) {
Erik Språngd05edec2019-08-14 10:43:47 +0200867 uint32_t ssrc = 12345;
868 uint16_t sequence_number = 1234;
869 int64_t capture_time_ms = 56789;
870 const int kTimeStep = 5;
Danil Chapovalov55284022020-02-07 14:53:52 +0100871 const TimeDelta kAveragingWindowLength = TimeDelta::Seconds(10);
Erik Språngd05edec2019-08-14 10:43:47 +0200872 PacingControllerPadding callback;
Erik Språngeb487992019-11-14 14:15:15 +0100873 pacer_ = std::make_unique<PacingController>(&clock_, &callback, nullptr,
Erik Språnge486a7b2022-03-15 15:13:25 +0100874 trials_, GetParam());
Erik Språngd05edec2019-08-14 10:43:47 +0200875 pacer_->SetProbingEnabled(false);
876 pacer_->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
877
Erik Språngeb487992019-11-14 14:15:15 +0100878 Timestamp start_time = clock_.CurrentTime();
Erik Språngd05edec2019-08-14 10:43:47 +0200879 size_t media_bytes = 0;
Erik Språngeb487992019-11-14 14:15:15 +0100880 while (clock_.CurrentTime() - start_time < kAveragingWindowLength) {
881 // Maybe add some new media packets corresponding to expected send rate.
Erik Språngd05edec2019-08-14 10:43:47 +0200882 int rand_value = rand(); // NOLINT (rand_r instead of rand)
Erik Språngeb487992019-11-14 14:15:15 +0100883 while (
884 media_bytes <
885 (kTargetRate * (clock_.CurrentTime() - start_time)).bytes<size_t>()) {
886 size_t media_payload = rand_value % 400 + 800; // [400, 1200] bytes.
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100887 Send(RtpPacketMediaType::kVideo, ssrc, sequence_number++, capture_time_ms,
888 media_payload);
Erik Språngeb487992019-11-14 14:15:15 +0100889 media_bytes += media_payload;
890 }
891
892 if (PeriodicProcess()) {
893 clock_.AdvanceTimeMilliseconds(kTimeStep);
894 pacer_->ProcessPackets();
895 } else {
896 AdvanceTimeAndProcess();
897 }
Erik Språngd05edec2019-08-14 10:43:47 +0200898 }
Erik Språngeb487992019-11-14 14:15:15 +0100899
900 EXPECT_NEAR(
901 kTargetRate.bps(),
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +0100902 (DataSize::Bytes(callback.total_bytes_sent()) / kAveragingWindowLength)
Erik Språngeb487992019-11-14 14:15:15 +0100903 .bps(),
904 (kTargetRate * 0.01 /* 1% error marging */).bps());
Erik Språngd05edec2019-08-14 10:43:47 +0200905}
906
Erik Språngeb487992019-11-14 14:15:15 +0100907TEST_P(PacingControllerTest, Priority) {
Erik Språngd05edec2019-08-14 10:43:47 +0200908 uint32_t ssrc_low_priority = 12345;
909 uint32_t ssrc = 12346;
910 uint16_t sequence_number = 1234;
911 int64_t capture_time_ms = 56789;
912 int64_t capture_time_ms_low_priority = 1234567;
913
Erik Språngeb487992019-11-14 14:15:15 +0100914 ConsumeInitialBudget();
Erik Språngd05edec2019-08-14 10:43:47 +0200915
916 // Expect normal and low priority to be queued and high to pass through.
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100917 Send(RtpPacketMediaType::kVideo, ssrc_low_priority, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +0200918 capture_time_ms_low_priority, 250);
919
Erik Språngeb487992019-11-14 14:15:15 +0100920 const size_t packets_to_send_per_interval =
921 kTargetRate.bps() * kPaceMultiplier / (8 * 250 * 200);
Erik Språngd05edec2019-08-14 10:43:47 +0200922 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100923 Send(RtpPacketMediaType::kRetransmission, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +0200924 capture_time_ms, 250);
925 }
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100926 Send(RtpPacketMediaType::kAudio, ssrc, sequence_number++, capture_time_ms,
Erik Språngd05edec2019-08-14 10:43:47 +0200927 250);
928
929 // Expect all high and normal priority to be sent out first.
930 EXPECT_CALL(callback_, SendPadding).Times(0);
931 EXPECT_CALL(callback_, SendPacket(ssrc, _, capture_time_ms, _, _))
932 .Times(packets_to_send_per_interval + 1);
933
Erik Språngeb487992019-11-14 14:15:15 +0100934 if (PeriodicProcess()) {
935 clock_.AdvanceTime(TimeUntilNextProcess());
936 pacer_->ProcessPackets();
937 } else {
938 while (pacer_->QueueSizePackets() > 1) {
939 AdvanceTimeAndProcess();
940 }
941 }
942
Erik Språngd05edec2019-08-14 10:43:47 +0200943 EXPECT_EQ(1u, pacer_->QueueSizePackets());
944
945 EXPECT_CALL(callback_, SendPacket(ssrc_low_priority, _,
946 capture_time_ms_low_priority, _, _))
947 .Times(1);
Erik Språngeb487992019-11-14 14:15:15 +0100948 if (PeriodicProcess()) {
949 clock_.AdvanceTime(TimeUntilNextProcess());
950 pacer_->ProcessPackets();
951 } else {
952 AdvanceTimeAndProcess();
953 }
Erik Språngd05edec2019-08-14 10:43:47 +0200954}
955
Erik Språngeb487992019-11-14 14:15:15 +0100956TEST_P(PacingControllerTest, RetransmissionPriority) {
Erik Språngd05edec2019-08-14 10:43:47 +0200957 uint32_t ssrc = 12345;
958 uint16_t sequence_number = 1234;
959 int64_t capture_time_ms = 45678;
960 int64_t capture_time_ms_retransmission = 56789;
961
962 // Due to the multiplicative factor we can send 5 packets during a send
963 // interval. (network capacity * multiplier / (8 bits per byte *
964 // (packet size * #send intervals per second)
965 const size_t packets_to_send_per_interval =
966 kTargetRate.bps() * kPaceMultiplier / (8 * 250 * 200);
967 pacer_->ProcessPackets();
968 EXPECT_EQ(0u, pacer_->QueueSizePackets());
969
970 // Alternate retransmissions and normal packets.
971 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100972 Send(RtpPacketMediaType::kVideo, ssrc, sequence_number++, capture_time_ms,
973 250);
974 Send(RtpPacketMediaType::kRetransmission, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +0200975 capture_time_ms_retransmission, 250);
976 }
977 EXPECT_EQ(2 * packets_to_send_per_interval, pacer_->QueueSizePackets());
978
979 // Expect all retransmissions to be sent out first despite having a later
980 // capture time.
981 EXPECT_CALL(callback_, SendPadding).Times(0);
982 EXPECT_CALL(callback_, SendPacket(_, _, _, false, _)).Times(0);
983 EXPECT_CALL(callback_,
984 SendPacket(ssrc, _, capture_time_ms_retransmission, true, _))
985 .Times(packets_to_send_per_interval);
986
Erik Språngeb487992019-11-14 14:15:15 +0100987 if (PeriodicProcess()) {
988 clock_.AdvanceTime(TimeUntilNextProcess());
989 pacer_->ProcessPackets();
990 } else {
991 while (pacer_->QueueSizePackets() > packets_to_send_per_interval) {
992 AdvanceTimeAndProcess();
993 }
994 }
Erik Språngd05edec2019-08-14 10:43:47 +0200995 EXPECT_EQ(packets_to_send_per_interval, pacer_->QueueSizePackets());
996
997 // Expect the remaining (non-retransmission) packets to be sent.
998 EXPECT_CALL(callback_, SendPadding).Times(0);
999 EXPECT_CALL(callback_, SendPacket(_, _, _, true, _)).Times(0);
1000 EXPECT_CALL(callback_, SendPacket(ssrc, _, capture_time_ms, false, _))
1001 .Times(packets_to_send_per_interval);
1002
Erik Språngeb487992019-11-14 14:15:15 +01001003 if (PeriodicProcess()) {
1004 clock_.AdvanceTime(TimeUntilNextProcess());
1005 pacer_->ProcessPackets();
1006 } else {
1007 while (pacer_->QueueSizePackets() > 0) {
1008 AdvanceTimeAndProcess();
1009 }
1010 }
Erik Språngd05edec2019-08-14 10:43:47 +02001011
1012 EXPECT_EQ(0u, pacer_->QueueSizePackets());
1013}
1014
Erik Språngeb487992019-11-14 14:15:15 +01001015TEST_P(PacingControllerTest, HighPrioDoesntAffectBudget) {
1016 const size_t kPacketSize = 250;
Erik Språngd05edec2019-08-14 10:43:47 +02001017 uint32_t ssrc = 12346;
1018 uint16_t sequence_number = 1234;
1019 int64_t capture_time_ms = 56789;
1020
1021 // As high prio packets doesn't affect the budget, we should be able to send
1022 // a high number of them at once.
Erik Språngeb487992019-11-14 14:15:15 +01001023 const size_t kNumAudioPackets = 25;
1024 for (size_t i = 0; i < kNumAudioPackets; ++i) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001025 SendAndExpectPacket(RtpPacketMediaType::kAudio, ssrc, sequence_number++,
Erik Språngeb487992019-11-14 14:15:15 +01001026 capture_time_ms, kPacketSize);
Erik Språngd05edec2019-08-14 10:43:47 +02001027 }
1028 pacer_->ProcessPackets();
1029 // Low prio packets does affect the budget.
1030 // Due to the multiplicative factor we can send 5 packets during a send
1031 // interval. (network capacity * multiplier / (8 bits per byte *
1032 // (packet size * #send intervals per second)
Erik Språngeb487992019-11-14 14:15:15 +01001033 const size_t kPacketsToSendPerInterval =
1034 kTargetRate.bps() * kPaceMultiplier / (8 * kPacketSize * 200);
1035 for (size_t i = 0; i < kPacketsToSendPerInterval; ++i) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001036 SendAndExpectPacket(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngeb487992019-11-14 14:15:15 +01001037 clock_.TimeInMilliseconds(), kPacketSize);
Erik Språngd05edec2019-08-14 10:43:47 +02001038 }
Erik Språngeb487992019-11-14 14:15:15 +01001039
1040 // Send all packets and measure pace time.
1041 Timestamp start_time = clock_.CurrentTime();
1042 while (pacer_->QueueSizePackets() > 0) {
1043 if (PeriodicProcess()) {
1044 clock_.AdvanceTime(TimeUntilNextProcess());
1045 pacer_->ProcessPackets();
1046 } else {
1047 AdvanceTimeAndProcess();
1048 }
1049 }
1050
1051 // Measure pacing time. Expect only low-prio packets to affect this.
1052 TimeDelta pacing_time = clock_.CurrentTime() - start_time;
1053 TimeDelta expected_pacing_time =
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +01001054 DataSize::Bytes(kPacketsToSendPerInterval * kPacketSize) /
Erik Språngeb487992019-11-14 14:15:15 +01001055 (kTargetRate * kPaceMultiplier);
1056 EXPECT_NEAR(pacing_time.us<double>(), expected_pacing_time.us<double>(),
1057 PeriodicProcess() ? 5000.0
1058 : PacingController::kMinSleepTime.us<double>());
Erik Språngd05edec2019-08-14 10:43:47 +02001059}
1060
Erik Språngeb487992019-11-14 14:15:15 +01001061TEST_P(PacingControllerTest, SendsOnlyPaddingWhenCongested) {
Erik Språngd05edec2019-08-14 10:43:47 +02001062 uint32_t ssrc = 202020;
1063 uint16_t sequence_number = 1000;
1064 int kPacketSize = 250;
1065 int kCongestionWindow = kPacketSize * 10;
1066
1067 pacer_->UpdateOutstandingData(DataSize::Zero());
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +01001068 pacer_->SetCongestionWindow(DataSize::Bytes(kCongestionWindow));
Erik Språngd05edec2019-08-14 10:43:47 +02001069 int sent_data = 0;
1070 while (sent_data < kCongestionWindow) {
1071 sent_data += kPacketSize;
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001072 SendAndExpectPacket(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +02001073 clock_.TimeInMilliseconds(), kPacketSize);
Erik Språngeb487992019-11-14 14:15:15 +01001074 AdvanceTimeAndProcess();
Erik Språngd05edec2019-08-14 10:43:47 +02001075 }
1076 ::testing::Mock::VerifyAndClearExpectations(&callback_);
1077 EXPECT_CALL(callback_, SendPacket).Times(0);
1078 EXPECT_CALL(callback_, SendPadding).Times(0);
1079
1080 size_t blocked_packets = 0;
1081 int64_t expected_time_until_padding = 500;
1082 while (expected_time_until_padding > 5) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001083 Send(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +02001084 clock_.TimeInMilliseconds(), kPacketSize);
1085 blocked_packets++;
1086 clock_.AdvanceTimeMilliseconds(5);
1087 pacer_->ProcessPackets();
1088 expected_time_until_padding -= 5;
1089 }
1090 ::testing::Mock::VerifyAndClearExpectations(&callback_);
1091 EXPECT_CALL(callback_, SendPadding(1)).WillOnce(Return(1));
Erik Språngf5815fa2019-08-21 14:27:31 +02001092 EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
Erik Språngd05edec2019-08-14 10:43:47 +02001093 clock_.AdvanceTimeMilliseconds(5);
1094 pacer_->ProcessPackets();
1095 EXPECT_EQ(blocked_packets, pacer_->QueueSizePackets());
1096}
1097
Erik Språngeb487992019-11-14 14:15:15 +01001098TEST_P(PacingControllerTest, DoesNotAllowOveruseAfterCongestion) {
Erik Språngd05edec2019-08-14 10:43:47 +02001099 uint32_t ssrc = 202020;
1100 uint16_t seq_num = 1000;
1101 int size = 1000;
1102 auto now_ms = [this] { return clock_.TimeInMilliseconds(); };
1103 EXPECT_CALL(callback_, SendPadding).Times(0);
1104 // The pacing rate is low enough that the budget should not allow two packets
1105 // to be sent in a row.
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +01001106 pacer_->SetPacingRates(DataRate::BitsPerSec(400 * 8 * 1000 / 5),
1107 DataRate::Zero());
Erik Språngd05edec2019-08-14 10:43:47 +02001108 // The congestion window is small enough to only let one packet through.
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +01001109 pacer_->SetCongestionWindow(DataSize::Bytes(800));
Erik Språngd05edec2019-08-14 10:43:47 +02001110 pacer_->UpdateOutstandingData(DataSize::Zero());
1111 // Not yet budget limited or congested, packet is sent.
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001112 Send(RtpPacketMediaType::kVideo, ssrc, seq_num++, now_ms(), size);
Erik Språngd05edec2019-08-14 10:43:47 +02001113 EXPECT_CALL(callback_, SendPacket).Times(1);
1114 clock_.AdvanceTimeMilliseconds(5);
1115 pacer_->ProcessPackets();
1116 // Packet blocked due to congestion.
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001117 Send(RtpPacketMediaType::kVideo, ssrc, seq_num++, now_ms(), size);
Erik Språngd05edec2019-08-14 10:43:47 +02001118 EXPECT_CALL(callback_, SendPacket).Times(0);
1119 clock_.AdvanceTimeMilliseconds(5);
1120 pacer_->ProcessPackets();
1121 // Packet blocked due to congestion.
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001122 Send(RtpPacketMediaType::kVideo, ssrc, seq_num++, now_ms(), size);
Erik Språngd05edec2019-08-14 10:43:47 +02001123 EXPECT_CALL(callback_, SendPacket).Times(0);
1124 clock_.AdvanceTimeMilliseconds(5);
1125 pacer_->ProcessPackets();
Erik Språngd05edec2019-08-14 10:43:47 +02001126 // Congestion removed and budget has recovered, packet is sent.
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001127 Send(RtpPacketMediaType::kVideo, ssrc, seq_num++, now_ms(), size);
Erik Språngd05edec2019-08-14 10:43:47 +02001128 EXPECT_CALL(callback_, SendPacket).Times(1);
1129 clock_.AdvanceTimeMilliseconds(5);
Erik Språngd05edec2019-08-14 10:43:47 +02001130 pacer_->UpdateOutstandingData(DataSize::Zero());
Erik Språngeb487992019-11-14 14:15:15 +01001131 pacer_->ProcessPackets();
Erik Språngd05edec2019-08-14 10:43:47 +02001132 // Should be blocked due to budget limitation as congestion has be removed.
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001133 Send(RtpPacketMediaType::kVideo, ssrc, seq_num++, now_ms(), size);
Erik Språngd05edec2019-08-14 10:43:47 +02001134 EXPECT_CALL(callback_, SendPacket).Times(0);
1135 clock_.AdvanceTimeMilliseconds(5);
1136 pacer_->ProcessPackets();
1137}
1138
Erik Språngeb487992019-11-14 14:15:15 +01001139TEST_P(PacingControllerTest, ResumesSendingWhenCongestionEnds) {
Erik Språngd05edec2019-08-14 10:43:47 +02001140 uint32_t ssrc = 202020;
1141 uint16_t sequence_number = 1000;
1142 int64_t kPacketSize = 250;
1143 int64_t kCongestionCount = 10;
1144 int64_t kCongestionWindow = kPacketSize * kCongestionCount;
1145 int64_t kCongestionTimeMs = 1000;
1146
1147 pacer_->UpdateOutstandingData(DataSize::Zero());
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +01001148 pacer_->SetCongestionWindow(DataSize::Bytes(kCongestionWindow));
Erik Språngd05edec2019-08-14 10:43:47 +02001149 int sent_data = 0;
1150 while (sent_data < kCongestionWindow) {
1151 sent_data += kPacketSize;
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001152 SendAndExpectPacket(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +02001153 clock_.TimeInMilliseconds(), kPacketSize);
1154 clock_.AdvanceTimeMilliseconds(5);
1155 pacer_->ProcessPackets();
1156 }
1157 ::testing::Mock::VerifyAndClearExpectations(&callback_);
1158 EXPECT_CALL(callback_, SendPacket).Times(0);
1159 int unacked_packets = 0;
1160 for (int duration = 0; duration < kCongestionTimeMs; duration += 5) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001161 Send(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +02001162 clock_.TimeInMilliseconds(), kPacketSize);
1163 unacked_packets++;
1164 clock_.AdvanceTimeMilliseconds(5);
1165 pacer_->ProcessPackets();
1166 }
1167 ::testing::Mock::VerifyAndClearExpectations(&callback_);
1168
1169 // First mark half of the congested packets as cleared and make sure that just
1170 // as many are sent
1171 int ack_count = kCongestionCount / 2;
1172 EXPECT_CALL(callback_, SendPacket(ssrc, _, _, false, _)).Times(ack_count);
1173 pacer_->UpdateOutstandingData(
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +01001174 DataSize::Bytes(kCongestionWindow - kPacketSize * ack_count));
Erik Språngd05edec2019-08-14 10:43:47 +02001175
1176 for (int duration = 0; duration < kCongestionTimeMs; duration += 5) {
1177 clock_.AdvanceTimeMilliseconds(5);
1178 pacer_->ProcessPackets();
1179 }
1180 unacked_packets -= ack_count;
1181 ::testing::Mock::VerifyAndClearExpectations(&callback_);
1182
1183 // Second make sure all packets are sent if sent packets are continuously
1184 // marked as acked.
1185 EXPECT_CALL(callback_, SendPacket(ssrc, _, _, false, _))
1186 .Times(unacked_packets);
1187 for (int duration = 0; duration < kCongestionTimeMs; duration += 5) {
1188 pacer_->UpdateOutstandingData(DataSize::Zero());
1189 clock_.AdvanceTimeMilliseconds(5);
1190 pacer_->ProcessPackets();
1191 }
1192}
1193
Erik Språngeb487992019-11-14 14:15:15 +01001194TEST_P(PacingControllerTest, Pause) {
Erik Språngd05edec2019-08-14 10:43:47 +02001195 uint32_t ssrc_low_priority = 12345;
1196 uint32_t ssrc = 12346;
1197 uint32_t ssrc_high_priority = 12347;
1198 uint16_t sequence_number = 1234;
Erik Språngd05edec2019-08-14 10:43:47 +02001199
Jianhui Dai94457792021-12-07 19:34:36 +08001200 EXPECT_TRUE(pacer_->OldestPacketEnqueueTime().IsInfinite());
Erik Språngd05edec2019-08-14 10:43:47 +02001201
Erik Språngeb487992019-11-14 14:15:15 +01001202 ConsumeInitialBudget();
Erik Språngd05edec2019-08-14 10:43:47 +02001203
1204 pacer_->Pause();
1205
Erik Språngeb487992019-11-14 14:15:15 +01001206 int64_t capture_time_ms = clock_.TimeInMilliseconds();
1207 const size_t packets_to_send_per_interval =
1208 kTargetRate.bps() * kPaceMultiplier / (8 * 250 * 200);
Erik Språngd05edec2019-08-14 10:43:47 +02001209 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001210 Send(RtpPacketMediaType::kVideo, ssrc_low_priority, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +02001211 capture_time_ms, 250);
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001212 Send(RtpPacketMediaType::kRetransmission, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +02001213 capture_time_ms, 250);
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001214 Send(RtpPacketMediaType::kAudio, ssrc_high_priority, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +02001215 capture_time_ms, 250);
1216 }
1217 clock_.AdvanceTimeMilliseconds(10000);
1218 int64_t second_capture_time_ms = clock_.TimeInMilliseconds();
1219 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001220 Send(RtpPacketMediaType::kVideo, ssrc_low_priority, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +02001221 second_capture_time_ms, 250);
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001222 Send(RtpPacketMediaType::kRetransmission, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +02001223 second_capture_time_ms, 250);
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001224 Send(RtpPacketMediaType::kAudio, ssrc_high_priority, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +02001225 second_capture_time_ms, 250);
1226 }
1227
1228 // Expect everything to be queued.
Jianhui Dai94457792021-12-07 19:34:36 +08001229 EXPECT_EQ(capture_time_ms, pacer_->OldestPacketEnqueueTime().ms());
Erik Språngd05edec2019-08-14 10:43:47 +02001230
Erik Språngeb487992019-11-14 14:15:15 +01001231 // Process triggers keep-alive packet.
1232 EXPECT_CALL(callback_, SendPadding).WillOnce([](size_t padding) {
1233 return padding;
1234 });
Erik Språngf5815fa2019-08-21 14:27:31 +02001235 EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
Erik Språngd05edec2019-08-14 10:43:47 +02001236 pacer_->ProcessPackets();
1237
Erik Språngeb487992019-11-14 14:15:15 +01001238 // Verify no packets sent for the rest of the paused process interval.
Danil Chapovalov55284022020-02-07 14:53:52 +01001239 const TimeDelta kProcessInterval = TimeDelta::Millis(5);
Erik Språngeb487992019-11-14 14:15:15 +01001240 TimeDelta expected_time_until_send = PacingController::kPausedProcessInterval;
Erik Språngd05edec2019-08-14 10:43:47 +02001241 EXPECT_CALL(callback_, SendPadding).Times(0);
Erik Språngeb487992019-11-14 14:15:15 +01001242 while (expected_time_until_send >= kProcessInterval) {
Erik Språngd05edec2019-08-14 10:43:47 +02001243 pacer_->ProcessPackets();
Erik Språngeb487992019-11-14 14:15:15 +01001244 clock_.AdvanceTime(kProcessInterval);
1245 expected_time_until_send -= kProcessInterval;
Erik Språngd05edec2019-08-14 10:43:47 +02001246 }
1247
Erik Språngeb487992019-11-14 14:15:15 +01001248 // New keep-alive packet.
Erik Språngd05edec2019-08-14 10:43:47 +02001249 ::testing::Mock::VerifyAndClearExpectations(&callback_);
Erik Språngeb487992019-11-14 14:15:15 +01001250 EXPECT_CALL(callback_, SendPadding).WillOnce([](size_t padding) {
1251 return padding;
1252 });
Erik Språngf5815fa2019-08-21 14:27:31 +02001253 EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
Erik Språngeb487992019-11-14 14:15:15 +01001254 clock_.AdvanceTime(kProcessInterval);
Erik Språngd05edec2019-08-14 10:43:47 +02001255 pacer_->ProcessPackets();
1256 ::testing::Mock::VerifyAndClearExpectations(&callback_);
1257
1258 // Expect high prio packets to come out first followed by normal
1259 // prio packets and low prio packets (all in capture order).
1260 {
1261 ::testing::InSequence sequence;
1262 EXPECT_CALL(callback_,
1263 SendPacket(ssrc_high_priority, _, capture_time_ms, _, _))
1264 .Times(packets_to_send_per_interval);
1265 EXPECT_CALL(callback_,
1266 SendPacket(ssrc_high_priority, _, second_capture_time_ms, _, _))
1267 .Times(packets_to_send_per_interval);
1268
1269 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
1270 EXPECT_CALL(callback_, SendPacket(ssrc, _, capture_time_ms, _, _))
1271 .Times(1);
1272 }
1273 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
1274 EXPECT_CALL(callback_, SendPacket(ssrc, _, second_capture_time_ms, _, _))
1275 .Times(1);
1276 }
1277 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
1278 EXPECT_CALL(callback_,
1279 SendPacket(ssrc_low_priority, _, capture_time_ms, _, _))
1280 .Times(1);
1281 }
1282 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
1283 EXPECT_CALL(callback_, SendPacket(ssrc_low_priority, _,
1284 second_capture_time_ms, _, _))
1285 .Times(1);
1286 }
1287 }
1288 pacer_->Resume();
1289
Erik Språngeb487992019-11-14 14:15:15 +01001290 if (PeriodicProcess()) {
1291 // The pacer was resumed directly after the previous process call finished.
1292 // It will therefore wait 5 ms until next process.
Erik Språngd05edec2019-08-14 10:43:47 +02001293 clock_.AdvanceTime(TimeUntilNextProcess());
Erik Språngeb487992019-11-14 14:15:15 +01001294
1295 for (size_t i = 0; i < 4; i++) {
1296 pacer_->ProcessPackets();
1297 clock_.AdvanceTime(TimeUntilNextProcess());
1298 }
1299 } else {
1300 while (pacer_->QueueSizePackets() > 0) {
1301 AdvanceTimeAndProcess();
1302 }
Erik Språngd05edec2019-08-14 10:43:47 +02001303 }
1304
Jianhui Dai94457792021-12-07 19:34:36 +08001305 EXPECT_TRUE(pacer_->OldestPacketEnqueueTime().IsInfinite());
Erik Språngd05edec2019-08-14 10:43:47 +02001306}
1307
Erik Språngeb487992019-11-14 14:15:15 +01001308TEST_P(PacingControllerTest, InactiveFromStart) {
1309 // Recreate the pacer without the inital time forwarding.
1310 pacer_ = std::make_unique<PacingController>(&clock_, &callback_, nullptr,
Erik Språnge486a7b2022-03-15 15:13:25 +01001311 trials_, GetParam());
Erik Språngeb487992019-11-14 14:15:15 +01001312 pacer_->SetProbingEnabled(false);
1313 pacer_->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
1314
1315 if (PeriodicProcess()) {
1316 // In period mode, pause the pacer to check the same idle behavior as
1317 // dynamic.
1318 pacer_->Pause();
1319 }
1320
1321 // No packets sent, there should be no keep-alives sent either.
1322 EXPECT_CALL(callback_, SendPadding).Times(0);
1323 EXPECT_CALL(callback_, SendPacket).Times(0);
1324 pacer_->ProcessPackets();
1325
1326 const Timestamp start_time = clock_.CurrentTime();
1327
1328 // Determine the margin need so we can advance to the last possible moment
1329 // that will not cause a process event.
1330 const TimeDelta time_margin =
1331 (GetParam() == PacingController::ProcessMode::kDynamic
1332 ? PacingController::kMinSleepTime
1333 : TimeDelta::Zero()) +
Danil Chapovalov55284022020-02-07 14:53:52 +01001334 TimeDelta::Micros(1);
Erik Språngeb487992019-11-14 14:15:15 +01001335
1336 EXPECT_EQ(pacer_->NextSendTime() - start_time,
1337 PacingController::kPausedProcessInterval);
1338 clock_.AdvanceTime(PacingController::kPausedProcessInterval - time_margin);
1339 pacer_->ProcessPackets();
1340 EXPECT_EQ(pacer_->NextSendTime() - start_time,
1341 PacingController::kPausedProcessInterval);
1342
1343 clock_.AdvanceTime(time_margin);
1344 pacer_->ProcessPackets();
1345 EXPECT_EQ(pacer_->NextSendTime() - start_time,
1346 2 * PacingController::kPausedProcessInterval);
1347}
1348
1349TEST_P(PacingControllerTest, ExpectedQueueTimeMs) {
Erik Språngd05edec2019-08-14 10:43:47 +02001350 uint32_t ssrc = 12346;
1351 uint16_t sequence_number = 1234;
1352 const size_t kNumPackets = 60;
1353 const size_t kPacketSize = 1200;
1354 const int32_t kMaxBitrate = kPaceMultiplier * 30000;
Jianhui Dai94457792021-12-07 19:34:36 +08001355 EXPECT_TRUE(pacer_->OldestPacketEnqueueTime().IsInfinite());
Erik Språngd05edec2019-08-14 10:43:47 +02001356
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +01001357 pacer_->SetPacingRates(DataRate::BitsPerSec(30000 * kPaceMultiplier),
Erik Språngd05edec2019-08-14 10:43:47 +02001358 DataRate::Zero());
1359 for (size_t i = 0; i < kNumPackets; ++i) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001360 SendAndExpectPacket(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +02001361 clock_.TimeInMilliseconds(), kPacketSize);
1362 }
1363
1364 // Queue in ms = 1000 * (bytes in queue) *8 / (bits per second)
1365 TimeDelta queue_time =
Danil Chapovalov55284022020-02-07 14:53:52 +01001366 TimeDelta::Millis(1000 * kNumPackets * kPacketSize * 8 / kMaxBitrate);
Erik Språngd05edec2019-08-14 10:43:47 +02001367 EXPECT_EQ(queue_time, pacer_->ExpectedQueueTime());
1368
1369 const Timestamp time_start = clock_.CurrentTime();
1370 while (pacer_->QueueSizePackets() > 0) {
1371 clock_.AdvanceTime(TimeUntilNextProcess());
1372 pacer_->ProcessPackets();
1373 }
1374 TimeDelta duration = clock_.CurrentTime() - time_start;
1375
1376 EXPECT_EQ(TimeDelta::Zero(), pacer_->ExpectedQueueTime());
1377
1378 // Allow for aliasing, duration should be within one pack of max time limit.
1379 const TimeDelta deviation =
1380 duration - PacingController::kMaxExpectedQueueLength;
1381 EXPECT_LT(deviation.Abs(),
Danil Chapovalov55284022020-02-07 14:53:52 +01001382 TimeDelta::Millis(1000 * kPacketSize * 8 / kMaxBitrate));
Erik Språngd05edec2019-08-14 10:43:47 +02001383}
1384
Erik Språngeb487992019-11-14 14:15:15 +01001385TEST_P(PacingControllerTest, QueueTimeGrowsOverTime) {
Erik Språngd05edec2019-08-14 10:43:47 +02001386 uint32_t ssrc = 12346;
1387 uint16_t sequence_number = 1234;
Jianhui Dai94457792021-12-07 19:34:36 +08001388 EXPECT_TRUE(pacer_->OldestPacketEnqueueTime().IsInfinite());
Erik Språngd05edec2019-08-14 10:43:47 +02001389
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +01001390 pacer_->SetPacingRates(DataRate::BitsPerSec(30000 * kPaceMultiplier),
Erik Språngd05edec2019-08-14 10:43:47 +02001391 DataRate::Zero());
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001392 SendAndExpectPacket(RtpPacketMediaType::kVideo, ssrc, sequence_number,
Erik Språngd05edec2019-08-14 10:43:47 +02001393 clock_.TimeInMilliseconds(), 1200);
1394
1395 clock_.AdvanceTimeMilliseconds(500);
Jianhui Dai94457792021-12-07 19:34:36 +08001396 EXPECT_EQ(clock_.TimeInMilliseconds() - 500,
1397 pacer_->OldestPacketEnqueueTime().ms());
Erik Språngd05edec2019-08-14 10:43:47 +02001398 pacer_->ProcessPackets();
Jianhui Dai94457792021-12-07 19:34:36 +08001399 EXPECT_TRUE(pacer_->OldestPacketEnqueueTime().IsInfinite());
Erik Språngd05edec2019-08-14 10:43:47 +02001400}
1401
Erik Språngeb487992019-11-14 14:15:15 +01001402TEST_P(PacingControllerTest, ProbingWithInsertedPackets) {
Erik Språngd05edec2019-08-14 10:43:47 +02001403 const size_t kPacketSize = 1200;
1404 const int kInitialBitrateBps = 300000;
1405 uint32_t ssrc = 12346;
1406 uint16_t sequence_number = 1234;
1407
1408 PacingControllerProbing packet_sender;
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001409 pacer_ = std::make_unique<PacingController>(&clock_, &packet_sender, nullptr,
Erik Språnge486a7b2022-03-15 15:13:25 +01001410 trials_, GetParam());
Erik Språngd05edec2019-08-14 10:43:47 +02001411 pacer_->CreateProbeCluster(kFirstClusterRate,
1412 /*cluster_id=*/0);
1413 pacer_->CreateProbeCluster(kSecondClusterRate,
1414 /*cluster_id=*/1);
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +01001415 pacer_->SetPacingRates(
1416 DataRate::BitsPerSec(kInitialBitrateBps * kPaceMultiplier),
1417 DataRate::Zero());
Erik Språngd05edec2019-08-14 10:43:47 +02001418
1419 for (int i = 0; i < 10; ++i) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001420 Send(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +02001421 clock_.TimeInMilliseconds(), kPacketSize);
1422 }
1423
1424 int64_t start = clock_.TimeInMilliseconds();
1425 while (packet_sender.packets_sent() < 5) {
1426 clock_.AdvanceTime(TimeUntilNextProcess());
1427 pacer_->ProcessPackets();
1428 }
1429 int packets_sent = packet_sender.packets_sent();
1430 // Validate first cluster bitrate. Note that we have to account for number
1431 // of intervals and hence (packets_sent - 1) on the first cluster.
1432 EXPECT_NEAR((packets_sent - 1) * kPacketSize * 8000 /
1433 (clock_.TimeInMilliseconds() - start),
1434 kFirstClusterRate.bps(), kProbingErrorMargin.bps());
Erik Språng279f3702020-10-13 21:55:07 +02001435 // Probing always starts with a small padding packet.
1436 EXPECT_EQ(1, packet_sender.padding_sent());
Erik Språngd05edec2019-08-14 10:43:47 +02001437
1438 clock_.AdvanceTime(TimeUntilNextProcess());
1439 start = clock_.TimeInMilliseconds();
1440 while (packet_sender.packets_sent() < 10) {
1441 clock_.AdvanceTime(TimeUntilNextProcess());
1442 pacer_->ProcessPackets();
1443 }
1444 packets_sent = packet_sender.packets_sent() - packets_sent;
1445 // Validate second cluster bitrate.
1446 EXPECT_NEAR((packets_sent - 1) * kPacketSize * 8000 /
1447 (clock_.TimeInMilliseconds() - start),
1448 kSecondClusterRate.bps(), kProbingErrorMargin.bps());
1449}
1450
Erik Språngeb487992019-11-14 14:15:15 +01001451TEST_P(PacingControllerTest, SkipsProbesWhenProcessIntervalTooLarge) {
Erik Språngb210eeb2019-11-05 11:21:48 +01001452 const size_t kPacketSize = 1200;
1453 const int kInitialBitrateBps = 300000;
Erik Språngb9d38092020-07-17 12:06:12 +02001454 const uint32_t ssrc = 12346;
1455 const int kProbeClusterId = 3;
Erik Språngb210eeb2019-11-05 11:21:48 +01001456
Erik Språngb9d38092020-07-17 12:06:12 +02001457 // Test with both legacy and new probe discard modes.
1458 // TODO(bugs.webrtc.org/11780): Clean up when legacy is gone.
1459 for (bool abort_delayed_probes : {false, true}) {
1460 uint16_t sequence_number = 1234;
Erik Språngb210eeb2019-11-05 11:21:48 +01001461
Erik Språngb9d38092020-07-17 12:06:12 +02001462 PacingControllerProbing packet_sender;
1463
1464 const test::ExplicitKeyValueConfig trials(
1465 abort_delayed_probes ? "WebRTC-Bwe-ProbingBehavior/"
1466 "abort_delayed_probes:1,max_probe_delay:2ms/"
1467 : "WebRTC-Bwe-ProbingBehavior/"
1468 "abort_delayed_probes:0,max_probe_delay:2ms/");
1469 pacer_ = std::make_unique<PacingController>(&clock_, &packet_sender,
Erik Språnge486a7b2022-03-15 15:13:25 +01001470 nullptr, trials, GetParam());
Erik Språngb9d38092020-07-17 12:06:12 +02001471 pacer_->SetPacingRates(
1472 DataRate::BitsPerSec(kInitialBitrateBps * kPaceMultiplier),
1473 DataRate::BitsPerSec(kInitialBitrateBps));
1474
1475 for (int i = 0; i < 10; ++i) {
1476 Send(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
1477 clock_.TimeInMilliseconds(), kPacketSize);
1478 }
1479 while (pacer_->QueueSizePackets() > 0) {
1480 clock_.AdvanceTime(TimeUntilNextProcess());
1481 pacer_->ProcessPackets();
1482 }
1483
1484 // Probe at a very high rate.
1485 pacer_->CreateProbeCluster(DataRate::KilobitsPerSec(10000), // 10 Mbps.
1486 /*cluster_id=*/kProbeClusterId);
1487 // We need one packet to start the probe.
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001488 Send(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngb210eeb2019-11-05 11:21:48 +01001489 clock_.TimeInMilliseconds(), kPacketSize);
Erik Språngb9d38092020-07-17 12:06:12 +02001490 const int packets_sent_before_probe = packet_sender.packets_sent();
Erik Språngb210eeb2019-11-05 11:21:48 +01001491 clock_.AdvanceTime(TimeUntilNextProcess());
1492 pacer_->ProcessPackets();
Erik Språngb9d38092020-07-17 12:06:12 +02001493 EXPECT_EQ(packet_sender.packets_sent(), packets_sent_before_probe + 1);
1494
1495 // Figure out how long between probe packets.
1496 Timestamp start_time = clock_.CurrentTime();
1497 clock_.AdvanceTime(TimeUntilNextProcess());
1498 TimeDelta time_between_probes = clock_.CurrentTime() - start_time;
1499 // Advance that distance again + 1ms.
1500 clock_.AdvanceTime(time_between_probes);
1501
1502 // Send second probe packet.
1503 Send(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
1504 clock_.TimeInMilliseconds(), kPacketSize);
1505 pacer_->ProcessPackets();
1506 EXPECT_EQ(packet_sender.packets_sent(), packets_sent_before_probe + 2);
1507 PacedPacketInfo last_pacing_info = packet_sender.last_pacing_info();
1508 EXPECT_EQ(last_pacing_info.probe_cluster_id, kProbeClusterId);
1509
1510 // We're exactly where we should be for the next probe.
1511 const Timestamp probe_time = clock_.CurrentTime();
1512 EXPECT_EQ(pacer_->NextSendTime(), clock_.CurrentTime());
1513
1514 BitrateProberConfig probing_config(&trials);
1515 EXPECT_GT(probing_config.max_probe_delay.Get(), TimeDelta::Zero());
1516 // Advance to within max probe delay, should still return same target.
1517 clock_.AdvanceTime(probing_config.max_probe_delay.Get());
1518 EXPECT_EQ(pacer_->NextSendTime(), probe_time);
1519
1520 // Too high probe delay, drop it!
1521 clock_.AdvanceTime(TimeDelta::Micros(1));
1522
1523 int packets_sent_before_timeout = packet_sender.total_packets_sent();
1524 if (abort_delayed_probes) {
1525 // Expected next process time is unchanged, but calling should not
1526 // generate new packets.
1527 EXPECT_EQ(pacer_->NextSendTime(), probe_time);
1528 pacer_->ProcessPackets();
1529 EXPECT_EQ(packet_sender.total_packets_sent(),
1530 packets_sent_before_timeout);
1531
1532 // Next packet sent is not part of probe.
1533 if (PeriodicProcess()) {
1534 do {
1535 AdvanceTimeAndProcess();
1536 } while (packet_sender.total_packets_sent() ==
1537 packets_sent_before_timeout);
1538 } else {
1539 AdvanceTimeAndProcess();
1540 }
1541 const int expected_probe_id = PacedPacketInfo::kNotAProbe;
1542 EXPECT_EQ(packet_sender.last_pacing_info().probe_cluster_id,
1543 expected_probe_id);
1544 } else {
1545 // Legacy behaviour, probe "aborted" so send time moved back. Next call to
1546 // ProcessPackets() still results in packets being marked as part of probe
1547 // cluster.
1548 EXPECT_GT(pacer_->NextSendTime(), probe_time);
1549 AdvanceTimeAndProcess();
1550 EXPECT_GT(packet_sender.total_packets_sent(),
1551 packets_sent_before_timeout);
1552 const int expected_probe_id = last_pacing_info.probe_cluster_id;
1553 EXPECT_EQ(packet_sender.last_pacing_info().probe_cluster_id,
1554 expected_probe_id);
1555
1556 // Time between sent packets keeps being too large, but we still mark the
1557 // packets as being part of the cluster.
1558 Timestamp a = clock_.CurrentTime();
1559 AdvanceTimeAndProcess();
1560 EXPECT_GT(packet_sender.total_packets_sent(),
1561 packets_sent_before_timeout);
1562 EXPECT_EQ(packet_sender.last_pacing_info().probe_cluster_id,
1563 expected_probe_id);
1564 EXPECT_GT(clock_.CurrentTime() - a, time_between_probes);
1565 }
Erik Språngb210eeb2019-11-05 11:21:48 +01001566 }
Erik Språngb210eeb2019-11-05 11:21:48 +01001567}
1568
Erik Språngeb487992019-11-14 14:15:15 +01001569TEST_P(PacingControllerTest, ProbingWithPaddingSupport) {
Erik Språngd05edec2019-08-14 10:43:47 +02001570 const size_t kPacketSize = 1200;
1571 const int kInitialBitrateBps = 300000;
1572 uint32_t ssrc = 12346;
1573 uint16_t sequence_number = 1234;
1574
1575 PacingControllerProbing packet_sender;
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001576 pacer_ = std::make_unique<PacingController>(&clock_, &packet_sender, nullptr,
Erik Språnge486a7b2022-03-15 15:13:25 +01001577 trials_, GetParam());
Erik Språngd05edec2019-08-14 10:43:47 +02001578 pacer_->CreateProbeCluster(kFirstClusterRate,
1579 /*cluster_id=*/0);
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +01001580 pacer_->SetPacingRates(
1581 DataRate::BitsPerSec(kInitialBitrateBps * kPaceMultiplier),
1582 DataRate::Zero());
Erik Språngd05edec2019-08-14 10:43:47 +02001583
1584 for (int i = 0; i < 3; ++i) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001585 Send(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +02001586 clock_.TimeInMilliseconds(), kPacketSize);
1587 }
1588
1589 int64_t start = clock_.TimeInMilliseconds();
1590 int process_count = 0;
1591 while (process_count < 5) {
1592 clock_.AdvanceTime(TimeUntilNextProcess());
1593 pacer_->ProcessPackets();
1594 ++process_count;
1595 }
1596 int packets_sent = packet_sender.packets_sent();
1597 int padding_sent = packet_sender.padding_sent();
1598 EXPECT_GT(packets_sent, 0);
1599 EXPECT_GT(padding_sent, 0);
1600 // Note that the number of intervals here for kPacketSize is
1601 // packets_sent due to padding in the same cluster.
1602 EXPECT_NEAR((packets_sent * kPacketSize * 8000 + padding_sent) /
1603 (clock_.TimeInMilliseconds() - start),
1604 kFirstClusterRate.bps(), kProbingErrorMargin.bps());
1605}
1606
Erik Språngeb487992019-11-14 14:15:15 +01001607TEST_P(PacingControllerTest, PaddingOveruse) {
Erik Språngd05edec2019-08-14 10:43:47 +02001608 uint32_t ssrc = 12346;
1609 uint16_t sequence_number = 1234;
1610 const size_t kPacketSize = 1200;
1611
Erik Språngeb487992019-11-14 14:15:15 +01001612 // Initially no padding rate.
Erik Språngd05edec2019-08-14 10:43:47 +02001613 pacer_->ProcessPackets();
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +01001614 pacer_->SetPacingRates(DataRate::BitsPerSec(60000 * kPaceMultiplier),
Erik Språngd05edec2019-08-14 10:43:47 +02001615 DataRate::Zero());
1616
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001617 SendAndExpectPacket(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +02001618 clock_.TimeInMilliseconds(), kPacketSize);
1619 pacer_->ProcessPackets();
1620
1621 // Add 30kbit padding. When increasing budget, media budget will increase from
1622 // negative (overuse) while padding budget will increase from 0.
1623 clock_.AdvanceTimeMilliseconds(5);
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +01001624 pacer_->SetPacingRates(DataRate::BitsPerSec(60000 * kPaceMultiplier),
1625 DataRate::BitsPerSec(30000));
Erik Språngd05edec2019-08-14 10:43:47 +02001626
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001627 SendAndExpectPacket(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +02001628 clock_.TimeInMilliseconds(), kPacketSize);
Danil Chapovalov55284022020-02-07 14:53:52 +01001629 EXPECT_LT(TimeDelta::Millis(5), pacer_->ExpectedQueueTime());
Erik Språngd05edec2019-08-14 10:43:47 +02001630 // Don't send padding if queue is non-empty, even if padding budget > 0.
1631 EXPECT_CALL(callback_, SendPadding).Times(0);
Erik Språngeb487992019-11-14 14:15:15 +01001632 if (PeriodicProcess()) {
1633 pacer_->ProcessPackets();
1634 } else {
1635 AdvanceTimeAndProcess();
1636 }
Erik Språngd05edec2019-08-14 10:43:47 +02001637}
1638
Erik Språngeb487992019-11-14 14:15:15 +01001639TEST_P(PacingControllerTest, ProbeClusterId) {
Erik Språngd05edec2019-08-14 10:43:47 +02001640 MockPacketSender callback;
1641
Erik Språngeb487992019-11-14 14:15:15 +01001642 pacer_ = std::make_unique<PacingController>(&clock_, &callback, nullptr,
Erik Språnge486a7b2022-03-15 15:13:25 +01001643 trials_, GetParam());
Erik Språngd05edec2019-08-14 10:43:47 +02001644 Init();
1645
1646 uint32_t ssrc = 12346;
1647 uint16_t sequence_number = 1234;
1648 const size_t kPacketSize = 1200;
1649
1650 pacer_->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
1651 pacer_->SetProbingEnabled(true);
1652 for (int i = 0; i < 10; ++i) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001653 Send(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +02001654 clock_.TimeInMilliseconds(), kPacketSize);
1655 }
1656
1657 // First probing cluster.
Erik Språngf5815fa2019-08-21 14:27:31 +02001658 EXPECT_CALL(callback,
Erik Språnged1fb192020-06-30 11:53:37 +00001659 SendPacket(_, Field(&PacedPacketInfo::probe_cluster_id, 0)))
Erik Språngf5815fa2019-08-21 14:27:31 +02001660 .Times(5);
Erik Språngd05edec2019-08-14 10:43:47 +02001661
1662 for (int i = 0; i < 5; ++i) {
Erik Språngeb487992019-11-14 14:15:15 +01001663 AdvanceTimeAndProcess();
Erik Språngd05edec2019-08-14 10:43:47 +02001664 }
1665
1666 // Second probing cluster.
Erik Språngf5815fa2019-08-21 14:27:31 +02001667 EXPECT_CALL(callback,
Erik Språnged1fb192020-06-30 11:53:37 +00001668 SendPacket(_, Field(&PacedPacketInfo::probe_cluster_id, 1)))
Erik Språngf5815fa2019-08-21 14:27:31 +02001669 .Times(5);
Erik Språngd05edec2019-08-14 10:43:47 +02001670
1671 for (int i = 0; i < 5; ++i) {
Erik Språngeb487992019-11-14 14:15:15 +01001672 AdvanceTimeAndProcess();
Erik Språngd05edec2019-08-14 10:43:47 +02001673 }
1674
1675 // Needed for the Field comparer below.
1676 const int kNotAProbe = PacedPacketInfo::kNotAProbe;
1677 // No more probing packets.
Erik Språngf5815fa2019-08-21 14:27:31 +02001678 EXPECT_CALL(callback, GeneratePadding).WillOnce([&](DataSize padding_size) {
1679 std::vector<std::unique_ptr<RtpPacketToSend>> padding_packets;
1680 padding_packets.emplace_back(
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001681 BuildPacket(RtpPacketMediaType::kPadding, ssrc, sequence_number++,
Erik Språngf5815fa2019-08-21 14:27:31 +02001682 clock_.TimeInMilliseconds(), padding_size.bytes()));
1683 return padding_packets;
1684 });
Erik Språngeb487992019-11-14 14:15:15 +01001685 bool non_probe_packet_seen = false;
Erik Språnged1fb192020-06-30 11:53:37 +00001686 EXPECT_CALL(callback, SendPacket)
Erik Språngeb487992019-11-14 14:15:15 +01001687 .WillOnce([&](std::unique_ptr<RtpPacketToSend> packet,
1688 const PacedPacketInfo& cluster_info) {
1689 EXPECT_EQ(cluster_info.probe_cluster_id, kNotAProbe);
1690 non_probe_packet_seen = true;
1691 });
1692 while (!non_probe_packet_seen) {
1693 AdvanceTimeAndProcess();
1694 }
Erik Språngd05edec2019-08-14 10:43:47 +02001695}
1696
Erik Språngeb487992019-11-14 14:15:15 +01001697TEST_P(PacingControllerTest, OwnedPacketPrioritizedOnType) {
Erik Språngd05edec2019-08-14 10:43:47 +02001698 MockPacketSender callback;
Erik Språngeb487992019-11-14 14:15:15 +01001699 pacer_ = std::make_unique<PacingController>(&clock_, &callback, nullptr,
Erik Språnge486a7b2022-03-15 15:13:25 +01001700 trials_, GetParam());
Erik Språngd05edec2019-08-14 10:43:47 +02001701 Init();
1702
1703 // Insert a packet of each type, from low to high priority. Since priority
1704 // is weighted higher than insert order, these should come out of the pacer
1705 // in backwards order with the exception of FEC and Video.
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001706 for (RtpPacketMediaType type :
1707 {RtpPacketMediaType::kPadding,
1708 RtpPacketMediaType::kForwardErrorCorrection, RtpPacketMediaType::kVideo,
1709 RtpPacketMediaType::kRetransmission, RtpPacketMediaType::kAudio}) {
Erik Språngd05edec2019-08-14 10:43:47 +02001710 pacer_->EnqueuePacket(BuildRtpPacket(type));
1711 }
1712
1713 ::testing::InSequence seq;
1714 EXPECT_CALL(
1715 callback,
Erik Språnged1fb192020-06-30 11:53:37 +00001716 SendPacket(Pointee(Property(&RtpPacketToSend::Ssrc, kAudioSsrc)), _));
1717 EXPECT_CALL(
1718 callback,
1719 SendPacket(Pointee(Property(&RtpPacketToSend::Ssrc, kVideoRtxSsrc)), _));
Erik Språngd05edec2019-08-14 10:43:47 +02001720
1721 // FEC and video actually have the same priority, so will come out in
1722 // insertion order.
Erik Språngd05edec2019-08-14 10:43:47 +02001723 EXPECT_CALL(
1724 callback,
Erik Språnged1fb192020-06-30 11:53:37 +00001725 SendPacket(Pointee(Property(&RtpPacketToSend::Ssrc, kFlexFecSsrc)), _));
1726 EXPECT_CALL(
1727 callback,
1728 SendPacket(Pointee(Property(&RtpPacketToSend::Ssrc, kVideoSsrc)), _));
Erik Språngd05edec2019-08-14 10:43:47 +02001729
Erik Språnged1fb192020-06-30 11:53:37 +00001730 EXPECT_CALL(
1731 callback,
1732 SendPacket(Pointee(Property(&RtpPacketToSend::Ssrc, kVideoRtxSsrc)), _));
Erik Språngd05edec2019-08-14 10:43:47 +02001733
Erik Språngeb487992019-11-14 14:15:15 +01001734 while (pacer_->QueueSizePackets() > 0) {
1735 if (PeriodicProcess()) {
1736 clock_.AdvanceTimeMilliseconds(5);
1737 pacer_->ProcessPackets();
1738 } else {
1739 AdvanceTimeAndProcess();
1740 }
1741 }
Erik Språngd05edec2019-08-14 10:43:47 +02001742}
Erik Språng78c82a42019-10-03 18:46:04 +02001743
Erik Språngeb487992019-11-14 14:15:15 +01001744TEST_P(PacingControllerTest, SmallFirstProbePacket) {
Erik Språng78c82a42019-10-03 18:46:04 +02001745 MockPacketSender callback;
Erik Språngeb487992019-11-14 14:15:15 +01001746 pacer_ = std::make_unique<PacingController>(&clock_, &callback, nullptr,
Erik Språnge486a7b2022-03-15 15:13:25 +01001747 trials_, GetParam());
Erik Språng78c82a42019-10-03 18:46:04 +02001748 pacer_->CreateProbeCluster(kFirstClusterRate, /*cluster_id=*/0);
1749 pacer_->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
1750
1751 // Add high prio media.
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001752 pacer_->EnqueuePacket(BuildRtpPacket(RtpPacketMediaType::kAudio));
Erik Språng78c82a42019-10-03 18:46:04 +02001753
1754 // Expect small padding packet to be requested.
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +01001755 EXPECT_CALL(callback, GeneratePadding(DataSize::Bytes(1)))
Erik Språng78c82a42019-10-03 18:46:04 +02001756 .WillOnce([&](DataSize padding_size) {
1757 std::vector<std::unique_ptr<RtpPacketToSend>> padding_packets;
1758 padding_packets.emplace_back(
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001759 BuildPacket(RtpPacketMediaType::kPadding, kAudioSsrc, 1,
Erik Språng78c82a42019-10-03 18:46:04 +02001760 clock_.TimeInMilliseconds(), 1));
1761 return padding_packets;
1762 });
1763
1764 size_t packets_sent = 0;
1765 bool media_seen = false;
Erik Språnged1fb192020-06-30 11:53:37 +00001766 EXPECT_CALL(callback, SendPacket)
Erik Språng78c82a42019-10-03 18:46:04 +02001767 .Times(::testing::AnyNumber())
1768 .WillRepeatedly([&](std::unique_ptr<RtpPacketToSend> packet,
1769 const PacedPacketInfo& cluster_info) {
1770 if (packets_sent == 0) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001771 EXPECT_EQ(packet->packet_type(), RtpPacketMediaType::kPadding);
Erik Språng78c82a42019-10-03 18:46:04 +02001772 } else {
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001773 if (packet->packet_type() == RtpPacketMediaType::kAudio) {
Erik Språng78c82a42019-10-03 18:46:04 +02001774 media_seen = true;
1775 }
1776 }
1777 packets_sent++;
1778 });
1779 while (!media_seen) {
1780 pacer_->ProcessPackets();
1781 clock_.AdvanceTimeMilliseconds(5);
1782 }
1783}
Erik Språngeb487992019-11-14 14:15:15 +01001784
Erik Språngeb487992019-11-14 14:15:15 +01001785TEST_P(PacingControllerTest, TaskLate) {
1786 if (PeriodicProcess()) {
1787 // This test applies only when NOT using interval budget.
1788 return;
1789 }
1790
1791 // Set a low send rate to more easily test timing issues.
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +01001792 DataRate kSendRate = DataRate::KilobitsPerSec(30);
Erik Språngeb487992019-11-14 14:15:15 +01001793 pacer_->SetPacingRates(kSendRate, DataRate::Zero());
1794
1795 // Add four packets of equal size and priority.
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001796 pacer_->EnqueuePacket(BuildRtpPacket(RtpPacketMediaType::kVideo));
1797 pacer_->EnqueuePacket(BuildRtpPacket(RtpPacketMediaType::kVideo));
1798 pacer_->EnqueuePacket(BuildRtpPacket(RtpPacketMediaType::kVideo));
1799 pacer_->EnqueuePacket(BuildRtpPacket(RtpPacketMediaType::kVideo));
Erik Språngeb487992019-11-14 14:15:15 +01001800
1801 // Process packets, only first should be sent.
1802 EXPECT_CALL(callback_, SendPacket).Times(1);
1803 pacer_->ProcessPackets();
1804
1805 Timestamp next_send_time = pacer_->NextSendTime();
Erik Språngb571ff42020-04-04 17:20:37 +02001806 // Determine time between packets (ca 62ms)
Erik Språngeb487992019-11-14 14:15:15 +01001807 const TimeDelta time_between_packets = next_send_time - clock_.CurrentTime();
1808
1809 // Simulate a late process call, executed just before we allow sending the
1810 // fourth packet.
Erik Språngb571ff42020-04-04 17:20:37 +02001811 const TimeDelta kOffset = TimeDelta::Millis(1);
1812 clock_.AdvanceTime((time_between_packets * 3) - kOffset);
Erik Språngeb487992019-11-14 14:15:15 +01001813
1814 EXPECT_CALL(callback_, SendPacket).Times(2);
1815 pacer_->ProcessPackets();
1816
Erik Språngb571ff42020-04-04 17:20:37 +02001817 // Check that next scheduled send time is in ca 1ms.
Erik Språngeb487992019-11-14 14:15:15 +01001818 next_send_time = pacer_->NextSendTime();
Erik Språngb571ff42020-04-04 17:20:37 +02001819 const TimeDelta time_left = next_send_time - clock_.CurrentTime();
1820 EXPECT_EQ(time_left.RoundTo(TimeDelta::Millis(1)), kOffset);
Erik Språngeb487992019-11-14 14:15:15 +01001821
Erik Språngb571ff42020-04-04 17:20:37 +02001822 clock_.AdvanceTime(time_left);
1823 EXPECT_CALL(callback_, SendPacket);
Erik Språngeb487992019-11-14 14:15:15 +01001824 pacer_->ProcessPackets();
1825}
1826
Erik Språngae100292019-12-17 17:49:49 +01001827TEST_P(PacingControllerTest, NoProbingWhilePaused) {
1828 uint32_t ssrc = 12345;
1829 uint16_t sequence_number = 1234;
1830
1831 pacer_->SetProbingEnabled(true);
1832
1833 // Send at least one packet so probing can initate.
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001834 SendAndExpectPacket(RtpPacketMediaType::kVideo, ssrc, sequence_number,
Erik Språngae100292019-12-17 17:49:49 +01001835 clock_.TimeInMilliseconds(), 250);
1836 while (pacer_->QueueSizePackets() > 0) {
1837 AdvanceTimeAndProcess();
1838 }
1839
1840 // Trigger probing.
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +01001841 pacer_->CreateProbeCluster(DataRate::KilobitsPerSec(10000), // 10 Mbps.
Erik Språngae100292019-12-17 17:49:49 +01001842 /*cluster_id=*/3);
1843
1844 // Time to next send time should be small.
1845 EXPECT_LT(pacer_->NextSendTime() - clock_.CurrentTime(),
1846 PacingController::kPausedProcessInterval);
1847
1848 // Pause pacer, time to next send time should now be the pause process
1849 // interval.
1850 pacer_->Pause();
1851
1852 EXPECT_EQ(pacer_->NextSendTime() - clock_.CurrentTime(),
1853 PacingController::kPausedProcessInterval);
1854}
1855
Erik Språng9cb58d52020-03-28 17:15:54 +01001856TEST_P(PacingControllerTest, AudioNotPacedEvenWhenAccountedFor) {
1857 const uint32_t kSsrc = 12345;
1858 uint16_t sequence_number = 1234;
1859 const size_t kPacketSize = 123;
1860
1861 // Account for audio - so that audio packets can cause pushback on other
1862 // types such as video. Audio packet should still be immediated passed
1863 // through though ("WebRTC-Pacer-BlockAudio" needs to be enabled in order
1864 // to pace audio packets).
1865 pacer_->SetAccountForAudioPackets(true);
1866
1867 // Set pacing rate to 1 packet/s, no padding.
1868 pacer_->SetPacingRates(DataSize::Bytes(kPacketSize) / TimeDelta::Seconds(1),
1869 DataRate::Zero());
1870
1871 // Add and send an audio packet.
1872 SendAndExpectPacket(RtpPacketMediaType::kAudio, kSsrc, sequence_number++,
1873 clock_.TimeInMilliseconds(), kPacketSize);
1874 pacer_->ProcessPackets();
1875
1876 // Advance time, add another audio packet and process. It should be sent
1877 // immediately.
1878 clock_.AdvanceTimeMilliseconds(5);
1879 SendAndExpectPacket(RtpPacketMediaType::kAudio, kSsrc, sequence_number++,
1880 clock_.TimeInMilliseconds(), kPacketSize);
1881 pacer_->ProcessPackets();
1882}
1883
Erik Språngb571ff42020-04-04 17:20:37 +02001884TEST_P(PacingControllerTest,
1885 PaddingResumesAfterSaturationEvenWithConcurrentAudio) {
Erik Språng0920d5d2020-03-30 17:14:08 +02001886 const uint32_t kSsrc = 12345;
1887 const DataRate kPacingDataRate = DataRate::KilobitsPerSec(125);
1888 const DataRate kPaddingDataRate = DataRate::KilobitsPerSec(100);
1889 const TimeDelta kMaxBufferInTime = TimeDelta::Millis(500);
1890 const DataSize kPacketSize = DataSize::Bytes(130);
1891 const TimeDelta kAudioPacketInterval = TimeDelta::Millis(20);
1892
1893 // In this test, we fist send a burst of video in order to saturate the
1894 // padding debt level.
1895 // We then proceed to send audio at a bitrate that is slightly lower than
1896 // the padding rate, meaning there will be a period with audio but no
1897 // padding sent while the debt is draining, then audio and padding will
1898 // be interlieved.
1899
1900 // Verify both with and without accounting for audio.
1901 for (bool account_for_audio : {false, true}) {
1902 uint16_t sequence_number = 1234;
1903 MockPacketSender callback;
Erik Språnged1fb192020-06-30 11:53:37 +00001904 EXPECT_CALL(callback, SendPacket).Times(::testing::AnyNumber());
Erik Språng0920d5d2020-03-30 17:14:08 +02001905 pacer_ = std::make_unique<PacingController>(&clock_, &callback, nullptr,
Erik Språnge486a7b2022-03-15 15:13:25 +01001906 trials_, GetParam());
Erik Språng0920d5d2020-03-30 17:14:08 +02001907 pacer_->SetAccountForAudioPackets(account_for_audio);
1908
1909 // First, saturate the padding budget.
1910 pacer_->SetPacingRates(kPacingDataRate, kPaddingDataRate);
1911
1912 const TimeDelta kPaddingSaturationTime =
1913 kMaxBufferInTime * kPaddingDataRate /
1914 (kPacingDataRate - kPaddingDataRate);
1915 const DataSize kVideoToSend = kPaddingSaturationTime * kPacingDataRate;
1916 const DataSize kVideoPacketSize = DataSize::Bytes(1200);
1917 DataSize video_sent = DataSize::Zero();
1918 while (video_sent < kVideoToSend) {
1919 pacer_->EnqueuePacket(
1920 BuildPacket(RtpPacketMediaType::kVideo, kSsrc, sequence_number++,
1921 clock_.TimeInMilliseconds(), kVideoPacketSize.bytes()));
1922 video_sent += kVideoPacketSize;
1923 }
1924 while (pacer_->QueueSizePackets() > 0) {
1925 AdvanceTimeAndProcess();
1926 }
1927
1928 // Add a stream of audio packets at a rate slightly lower than the padding
1929 // rate, once the padding debt is paid off we expect padding to be
1930 // generated.
1931 pacer_->SetPacingRates(kPacingDataRate, kPaddingDataRate);
1932 bool padding_seen = false;
1933 EXPECT_CALL(callback, GeneratePadding).WillOnce([&](DataSize padding_size) {
1934 padding_seen = true;
1935 std::vector<std::unique_ptr<RtpPacketToSend>> padding_packets;
1936 padding_packets.emplace_back(
1937 BuildPacket(RtpPacketMediaType::kPadding, kSsrc, sequence_number++,
1938 clock_.TimeInMilliseconds(), padding_size.bytes()));
1939 return padding_packets;
1940 });
1941
1942 Timestamp start_time = clock_.CurrentTime();
1943 Timestamp last_audio_time = start_time;
1944 while (!padding_seen) {
1945 Timestamp now = clock_.CurrentTime();
1946 Timestamp next_send_time = pacer_->NextSendTime();
1947 TimeDelta sleep_time =
1948 std::min(next_send_time, last_audio_time + kAudioPacketInterval) -
1949 now;
1950 clock_.AdvanceTime(sleep_time);
1951 while (clock_.CurrentTime() >= last_audio_time + kAudioPacketInterval) {
1952 pacer_->EnqueuePacket(
1953 BuildPacket(RtpPacketMediaType::kAudio, kSsrc, sequence_number++,
1954 clock_.TimeInMilliseconds(), kPacketSize.bytes()));
1955 last_audio_time += kAudioPacketInterval;
1956 }
1957 pacer_->ProcessPackets();
1958 }
1959
1960 // Verify how long it took to drain the padding debt. Allow 2% error margin.
1961 const DataRate kAudioDataRate = kPacketSize / kAudioPacketInterval;
1962 const TimeDelta expected_drain_time =
1963 account_for_audio ? (kMaxBufferInTime * kPaddingDataRate /
1964 (kPaddingDataRate - kAudioDataRate))
1965 : kMaxBufferInTime;
1966 const TimeDelta actual_drain_time = clock_.CurrentTime() - start_time;
1967 EXPECT_NEAR(actual_drain_time.ms(), expected_drain_time.ms(),
1968 expected_drain_time.ms() * 0.02)
1969 << " where account_for_audio = "
1970 << (account_for_audio ? "true" : "false");
1971 }
1972}
1973
Erik Språngb571ff42020-04-04 17:20:37 +02001974TEST_P(PacingControllerTest, AccountsForAudioEnqueuTime) {
1975 if (PeriodicProcess()) {
1976 // This test applies only when NOT using interval budget.
1977 return;
1978 }
1979
1980 const uint32_t kSsrc = 12345;
1981 const DataRate kPacingDataRate = DataRate::KilobitsPerSec(125);
1982 const DataRate kPaddingDataRate = DataRate::Zero();
1983 const DataSize kPacketSize = DataSize::Bytes(130);
1984 const TimeDelta kPacketPacingTime = kPacketSize / kPacingDataRate;
1985
1986 uint32_t sequnce_number = 1;
1987 // Audio not paced, but still accounted for in budget.
1988 pacer_->SetAccountForAudioPackets(true);
1989 pacer_->SetPacingRates(kPacingDataRate, kPaddingDataRate);
1990
1991 // Enqueue two audio packets, advance clock to where one packet
1992 // should have drained the buffer already, has they been sent
1993 // immediately.
1994 SendAndExpectPacket(RtpPacketMediaType::kAudio, kSsrc, sequnce_number++,
1995 clock_.TimeInMilliseconds(), kPacketSize.bytes());
1996 SendAndExpectPacket(RtpPacketMediaType::kAudio, kSsrc, sequnce_number++,
1997 clock_.TimeInMilliseconds(), kPacketSize.bytes());
1998 clock_.AdvanceTime(kPacketPacingTime);
1999 // Now process and make sure both packets were sent.
2000 pacer_->ProcessPackets();
2001 ::testing::Mock::VerifyAndClearExpectations(&callback_);
2002
2003 // Add a video packet. I can't be sent until debt from audio
2004 // packets have been drained.
2005 Send(RtpPacketMediaType::kVideo, kSsrc + 1, sequnce_number++,
2006 clock_.TimeInMilliseconds(), kPacketSize.bytes());
2007 EXPECT_EQ(pacer_->NextSendTime() - clock_.CurrentTime(), kPacketPacingTime);
2008}
2009
Erik Språngbe152f52020-04-06 16:30:23 +02002010TEST_P(PacingControllerTest, NextSendTimeAccountsForPadding) {
2011 if (PeriodicProcess()) {
2012 // This test applies only when NOT using interval budget.
2013 return;
2014 }
2015
2016 const uint32_t kSsrc = 12345;
2017 const DataRate kPacingDataRate = DataRate::KilobitsPerSec(125);
2018 const DataSize kPacketSize = DataSize::Bytes(130);
2019 const TimeDelta kPacketPacingTime = kPacketSize / kPacingDataRate;
2020
2021 uint32_t sequnce_number = 1;
2022
2023 // Start with no padding.
2024 pacer_->SetPacingRates(kPacingDataRate, DataRate::Zero());
2025
2026 // Send a single packet.
2027 SendAndExpectPacket(RtpPacketMediaType::kVideo, kSsrc, sequnce_number++,
2028 clock_.TimeInMilliseconds(), kPacketSize.bytes());
2029 pacer_->ProcessPackets();
2030 ::testing::Mock::VerifyAndClearExpectations(&callback_);
2031
2032 // With current conditions, no need to wake until next keep-alive.
2033 EXPECT_EQ(pacer_->NextSendTime() - clock_.CurrentTime(),
2034 PacingController::kPausedProcessInterval);
2035
2036 // Enqueue a new packet, that can't be sent until previous buffer has
2037 // drained.
2038 SendAndExpectPacket(RtpPacketMediaType::kVideo, kSsrc, sequnce_number++,
2039 clock_.TimeInMilliseconds(), kPacketSize.bytes());
2040 EXPECT_EQ(pacer_->NextSendTime() - clock_.CurrentTime(), kPacketPacingTime);
2041 clock_.AdvanceTime(kPacketPacingTime);
2042 pacer_->ProcessPackets();
2043 ::testing::Mock::VerifyAndClearExpectations(&callback_);
2044
2045 // With current conditions, again no need to wake until next keep-alive.
2046 EXPECT_EQ(pacer_->NextSendTime() - clock_.CurrentTime(),
2047 PacingController::kPausedProcessInterval);
2048
2049 // Set a non-zero padding rate. Padding also can't be sent until
2050 // previous debt has cleared. Since padding was disabled before, there
2051 // currently is no padding debt.
2052 pacer_->SetPacingRates(kPacingDataRate, kPacingDataRate / 2);
2053 EXPECT_EQ(pacer_->NextSendTime() - clock_.CurrentTime(), kPacketPacingTime);
2054
2055 // Advance time, expect padding.
2056 EXPECT_CALL(callback_, SendPadding).WillOnce(Return(kPacketSize.bytes()));
2057 clock_.AdvanceTime(kPacketPacingTime);
2058 pacer_->ProcessPackets();
2059 ::testing::Mock::VerifyAndClearExpectations(&callback_);
2060
2061 // Since padding rate is half of pacing rate, next time we can send
2062 // padding is double the packet pacing time.
2063 EXPECT_EQ(pacer_->NextSendTime() - clock_.CurrentTime(),
2064 kPacketPacingTime * 2);
2065
2066 // Insert a packet to be sent, this take precedence again.
2067 Send(RtpPacketMediaType::kVideo, kSsrc, sequnce_number++,
2068 clock_.TimeInMilliseconds(), kPacketSize.bytes());
2069 EXPECT_EQ(pacer_->NextSendTime() - clock_.CurrentTime(), kPacketPacingTime);
2070}
2071
Erik Språng9acc18d2020-04-16 19:41:07 +02002072TEST_P(PacingControllerTest, PaddingTargetAccountsForPaddingRate) {
2073 if (PeriodicProcess()) {
2074 // This test applies only when NOT using interval budget.
2075 return;
2076 }
2077
2078 // Re-init pacer with an explicitly set padding target of 10ms;
2079 const TimeDelta kPaddingTarget = TimeDelta::Millis(10);
Erik Språnge486a7b2022-03-15 15:13:25 +01002080 ExplicitKeyValueConfig field_trials(
Erik Språng9acc18d2020-04-16 19:41:07 +02002081 "WebRTC-Pacer-DynamicPaddingTarget/timedelta:10ms/");
Erik Språnge486a7b2022-03-15 15:13:25 +01002082 srand(0);
2083 // Need to initialize PacingController after we initialize clock.
2084 pacer_ = std::make_unique<PacingController>(&clock_, &callback_, nullptr,
2085 field_trials, GetParam());
2086 Init();
Erik Språng9acc18d2020-04-16 19:41:07 +02002087
2088 const uint32_t kSsrc = 12345;
2089 const DataRate kPacingDataRate = DataRate::KilobitsPerSec(125);
2090 const DataSize kPacketSize = DataSize::Bytes(130);
2091
2092 uint32_t sequnce_number = 1;
2093
2094 // Start with pacing and padding rate equal.
2095 pacer_->SetPacingRates(kPacingDataRate, kPacingDataRate);
2096
2097 // Send a single packet.
2098 SendAndExpectPacket(RtpPacketMediaType::kVideo, kSsrc, sequnce_number++,
2099 clock_.TimeInMilliseconds(), kPacketSize.bytes());
2100 AdvanceTimeAndProcess();
2101 ::testing::Mock::VerifyAndClearExpectations(&callback_);
2102
2103 size_t expected_padding_target_bytes =
2104 (kPaddingTarget * kPacingDataRate).bytes();
2105 EXPECT_CALL(callback_, SendPadding(expected_padding_target_bytes))
2106 .WillOnce(Return(expected_padding_target_bytes));
2107 AdvanceTimeAndProcess();
2108
2109 // Half the padding rate - expect half the padding target.
2110 pacer_->SetPacingRates(kPacingDataRate, kPacingDataRate / 2);
2111 EXPECT_CALL(callback_, SendPadding(expected_padding_target_bytes / 2))
2112 .WillOnce(Return(expected_padding_target_bytes / 2));
2113 AdvanceTimeAndProcess();
2114}
2115
Erik Språngb6477852020-10-05 14:20:51 +02002116TEST_P(PacingControllerTest, SendsFecPackets) {
Erik Språng1d50cb62020-07-02 17:41:32 +02002117 const uint32_t kSsrc = 12345;
2118 const uint32_t kFlexSsrc = 54321;
2119 uint16_t sequence_number = 1234;
2120 uint16_t flexfec_sequence_number = 4321;
2121 const size_t kPacketSize = 123;
2122
2123 // Set pacing rate to 1000 packet/s, no padding.
2124 pacer_->SetPacingRates(
2125 DataSize::Bytes(1000 * kPacketSize) / TimeDelta::Seconds(1),
2126 DataRate::Zero());
2127
2128 int64_t now = clock_.TimeInMilliseconds();
2129 Send(RtpPacketMediaType::kVideo, kSsrc, sequence_number, now, kPacketSize);
2130 EXPECT_CALL(callback_, SendPacket(kSsrc, sequence_number, now, false, false));
2131 EXPECT_CALL(callback_, FetchFec).WillOnce([&]() {
2132 EXPECT_CALL(callback_, SendPacket(kFlexSsrc, flexfec_sequence_number, now,
2133 false, false));
2134 EXPECT_CALL(callback_, FetchFec);
2135 std::vector<std::unique_ptr<RtpPacketToSend>> fec_packets;
2136 fec_packets.push_back(
2137 BuildPacket(RtpPacketMediaType::kForwardErrorCorrection, kFlexSsrc,
2138 flexfec_sequence_number, now, kPacketSize));
2139 return fec_packets;
2140 });
2141 AdvanceTimeAndProcess();
2142 AdvanceTimeAndProcess();
2143}
2144
Erik Språng41bbc3d2021-10-05 10:17:39 +02002145TEST_P(PacingControllerTest, GapInPacingDoesntAccumulateBudget) {
2146 if (PeriodicProcess()) {
2147 // This test checks behavior when not using interval budget.
2148 return;
2149 }
2150
2151 const uint32_t kSsrc = 12345;
2152 uint16_t sequence_number = 1234;
2153 const DataSize kPackeSize = DataSize::Bytes(250);
2154 const TimeDelta kPacketSendTime = TimeDelta::Millis(15);
2155
2156 pacer_->SetPacingRates(kPackeSize / kPacketSendTime,
2157 /*padding_rate=*/DataRate::Zero());
2158
2159 // Send an initial packet.
2160 SendAndExpectPacket(RtpPacketMediaType::kVideo, kSsrc, sequence_number++,
2161 clock_.TimeInMilliseconds(), kPackeSize.bytes());
2162 pacer_->ProcessPackets();
2163 ::testing::Mock::VerifyAndClearExpectations(&callback_);
2164
2165 // Advance time kPacketSendTime past where the media debt should be 0.
2166 clock_.AdvanceTime(2 * kPacketSendTime);
2167
2168 // Enqueue two new packets. Expect only one to be sent one ProcessPackets().
2169 Send(RtpPacketMediaType::kVideo, kSsrc, sequence_number + 1,
2170 clock_.TimeInMilliseconds(), kPackeSize.bytes());
2171 Send(RtpPacketMediaType::kVideo, kSsrc, sequence_number + 2,
2172 clock_.TimeInMilliseconds(), kPackeSize.bytes());
2173 EXPECT_CALL(callback_, SendPacket(kSsrc, sequence_number + 1,
2174 clock_.TimeInMilliseconds(), false, false));
2175 pacer_->ProcessPackets();
2176}
2177
Erik Språngeb487992019-11-14 14:15:15 +01002178INSTANTIATE_TEST_SUITE_P(
2179 WithAndWithoutIntervalBudget,
2180 PacingControllerTest,
2181 ::testing::Values(PacingController::ProcessMode::kPeriodic,
2182 PacingController::ProcessMode::kDynamic));
2183
Erik Språngd05edec2019-08-14 10:43:47 +02002184} // namespace test
2185} // namespace webrtc