blob: 0248f93ae19ad12edbefa069f56f0195965336f9 [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
Per Kjellander88af2032022-05-16 19:58:40 +020020#include "api/transport/network_types.h"
Erik Språngd05edec2019-08-14 10:43:47 +020021#include "api/units/data_rate.h"
Per Kjellander88af2032022-05-16 19:58:40 +020022#include "api/units/time_delta.h"
Erik Språngd05edec2019-08-14 10:43:47 +020023#include "modules/pacing/packet_router.h"
24#include "system_wrappers/include/clock.h"
Erik Språngb9d38092020-07-17 12:06:12 +020025#include "test/explicit_key_value_config.h"
Erik Språngd05edec2019-08-14 10:43:47 +020026#include "test/gmock.h"
27#include "test/gtest.h"
28
29using ::testing::_;
30using ::testing::Field;
31using ::testing::Pointee;
32using ::testing::Property;
33using ::testing::Return;
Erik Språng1a080962022-03-17 15:16:59 +010034using ::testing::WithoutArgs;
Erik Språngd05edec2019-08-14 10:43:47 +020035
Per Kjellanderbfd30652022-05-27 13:15:17 +020036using ::webrtc::test::ExplicitKeyValueConfig;
37
Erik Språngd05edec2019-08-14 10:43:47 +020038namespace webrtc {
Erik Språngd05edec2019-08-14 10:43:47 +020039namespace {
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +010040constexpr DataRate kFirstClusterRate = DataRate::KilobitsPerSec(900);
41constexpr DataRate kSecondClusterRate = DataRate::KilobitsPerSec(1800);
Erik Språngd05edec2019-08-14 10:43:47 +020042
43// The error stems from truncating the time interval of probe packets to integer
44// values. This results in probing slightly higher than the target bitrate.
45// For 1.8 Mbps, this comes to be about 120 kbps with 1200 probe packets.
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +010046constexpr DataRate kProbingErrorMargin = DataRate::KilobitsPerSec(150);
Erik Språngd05edec2019-08-14 10:43:47 +020047
48const float kPaceMultiplier = 2.5f;
49
50constexpr uint32_t kAudioSsrc = 12345;
51constexpr uint32_t kVideoSsrc = 234565;
Erik Språngd05edec2019-08-14 10:43:47 +020052
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +010053constexpr DataRate kTargetRate = DataRate::KilobitsPerSec(800);
Erik Språngd05edec2019-08-14 10:43:47 +020054
Björn Terelius31d0f7c2020-02-06 16:35:46 +010055std::unique_ptr<RtpPacketToSend> BuildPacket(RtpPacketMediaType type,
Erik Språngd05edec2019-08-14 10:43:47 +020056 uint32_t ssrc,
57 uint16_t sequence_number,
58 int64_t capture_time_ms,
59 size_t size) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +020060 auto packet = std::make_unique<RtpPacketToSend>(nullptr);
Erik Språngd05edec2019-08-14 10:43:47 +020061 packet->set_packet_type(type);
62 packet->SetSsrc(ssrc);
63 packet->SetSequenceNumber(sequence_number);
Danil Chapovalov9af4aa72022-02-27 21:10:55 +000064 packet->set_capture_time(Timestamp::Millis(capture_time_ms));
Erik Språngd05edec2019-08-14 10:43:47 +020065 packet->SetPayloadSize(size);
66 return packet;
67}
Per Kjellanderbfd30652022-05-27 13:15:17 +020068
69class MediaStream {
70 public:
71 MediaStream(SimulatedClock& clock,
72 RtpPacketMediaType type,
73 uint32_t ssrc,
74 size_t packet_size)
75 : clock_(clock), type_(type), ssrc_(ssrc), packet_size_(packet_size) {}
76
77 std::unique_ptr<RtpPacketToSend> BuildNextPacket() {
78 return BuildPacket(type_, ssrc_, seq_num_++, clock_.TimeInMilliseconds(),
79 packet_size_);
80 }
81 std::unique_ptr<RtpPacketToSend> BuildNextPacket(size_t size) {
82 return BuildPacket(type_, ssrc_, seq_num_++, clock_.TimeInMilliseconds(),
83 size);
84 }
85
86 private:
87 SimulatedClock& clock_;
88 const RtpPacketMediaType type_;
89 const uint32_t ssrc_;
90 const size_t packet_size_;
91 uint16_t seq_num_ = 1000;
92};
Erik Språngd05edec2019-08-14 10:43:47 +020093
94// Mock callback proxy, where both new and old api redirects to common mock
95// methods that focus on core aspects.
96class MockPacingControllerCallback : public PacingController::PacketSender {
97 public:
Erik Språnged1fb192020-06-30 11:53:37 +000098 void SendPacket(std::unique_ptr<RtpPacketToSend> packet,
99 const PacedPacketInfo& cluster_info) override {
Erik Språngd05edec2019-08-14 10:43:47 +0200100 SendPacket(packet->Ssrc(), packet->SequenceNumber(),
Danil Chapovalov9af4aa72022-02-27 21:10:55 +0000101 packet->capture_time().ms(),
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100102 packet->packet_type() == RtpPacketMediaType::kRetransmission,
103 packet->packet_type() == RtpPacketMediaType::kPadding);
Erik Språngd05edec2019-08-14 10:43:47 +0200104 }
105
Erik Språngd05edec2019-08-14 10:43:47 +0200106 std::vector<std::unique_ptr<RtpPacketToSend>> GeneratePadding(
107 DataSize target_size) override {
108 std::vector<std::unique_ptr<RtpPacketToSend>> ret;
109 size_t padding_size = SendPadding(target_size.bytes());
110 if (padding_size > 0) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200111 auto packet = std::make_unique<RtpPacketToSend>(nullptr);
Erik Språngd05edec2019-08-14 10:43:47 +0200112 packet->SetPayloadSize(padding_size);
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100113 packet->set_packet_type(RtpPacketMediaType::kPadding);
Erik Språngd05edec2019-08-14 10:43:47 +0200114 ret.emplace_back(std::move(packet));
115 }
116 return ret;
117 }
118
Danil Chapovalov014197b2020-05-26 19:18:17 +0200119 MOCK_METHOD(void,
120 SendPacket,
121 (uint32_t ssrc,
122 uint16_t sequence_number,
123 int64_t capture_timestamp,
124 bool retransmission,
125 bool padding));
Erik Språng1d50cb62020-07-02 17:41:32 +0200126 MOCK_METHOD(std::vector<std::unique_ptr<RtpPacketToSend>>,
127 FetchFec,
128 (),
129 (override));
Danil Chapovalov014197b2020-05-26 19:18:17 +0200130 MOCK_METHOD(size_t, SendPadding, (size_t target_size));
Erik Språngd05edec2019-08-14 10:43:47 +0200131};
132
133// Mock callback implementing the raw api.
134class MockPacketSender : public PacingController::PacketSender {
135 public:
Danil Chapovalov014197b2020-05-26 19:18:17 +0200136 MOCK_METHOD(void,
Erik Språnged1fb192020-06-30 11:53:37 +0000137 SendPacket,
Danil Chapovalov014197b2020-05-26 19:18:17 +0200138 (std::unique_ptr<RtpPacketToSend> packet,
139 const PacedPacketInfo& cluster_info),
140 (override));
141 MOCK_METHOD(std::vector<std::unique_ptr<RtpPacketToSend>>,
Erik Språng1d50cb62020-07-02 17:41:32 +0200142 FetchFec,
143 (),
144 (override));
145
146 MOCK_METHOD(std::vector<std::unique_ptr<RtpPacketToSend>>,
Danil Chapovalov014197b2020-05-26 19:18:17 +0200147 GeneratePadding,
148 (DataSize target_size),
149 (override));
Erik Språngd05edec2019-08-14 10:43:47 +0200150};
151
152class PacingControllerPadding : public PacingController::PacketSender {
153 public:
154 static const size_t kPaddingPacketSize = 224;
155
Erik Språngeb487992019-11-14 14:15:15 +0100156 PacingControllerPadding() : padding_sent_(0), total_bytes_sent_(0) {}
Erik Språngd05edec2019-08-14 10:43:47 +0200157
Erik Språnged1fb192020-06-30 11:53:37 +0000158 void SendPacket(std::unique_ptr<RtpPacketToSend> packet,
159 const PacedPacketInfo& pacing_info) override {
Erik Språngeb487992019-11-14 14:15:15 +0100160 total_bytes_sent_ += packet->payload_size();
161 }
Erik Språngd05edec2019-08-14 10:43:47 +0200162
Erik Språng1d50cb62020-07-02 17:41:32 +0200163 std::vector<std::unique_ptr<RtpPacketToSend>> FetchFec() override {
164 return {};
165 }
166
Erik Språngd05edec2019-08-14 10:43:47 +0200167 std::vector<std::unique_ptr<RtpPacketToSend>> GeneratePadding(
168 DataSize target_size) override {
169 size_t num_packets =
170 (target_size.bytes() + kPaddingPacketSize - 1) / kPaddingPacketSize;
171 std::vector<std::unique_ptr<RtpPacketToSend>> packets;
172 for (size_t i = 0; i < num_packets; ++i) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200173 packets.emplace_back(std::make_unique<RtpPacketToSend>(nullptr));
Erik Språngd05edec2019-08-14 10:43:47 +0200174 packets.back()->SetPadding(kPaddingPacketSize);
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100175 packets.back()->set_packet_type(RtpPacketMediaType::kPadding);
Erik Språngd05edec2019-08-14 10:43:47 +0200176 padding_sent_ += kPaddingPacketSize;
177 }
178 return packets;
179 }
180
181 size_t padding_sent() { return padding_sent_; }
Erik Språngeb487992019-11-14 14:15:15 +0100182 size_t total_bytes_sent() { return total_bytes_sent_; }
Erik Språngd05edec2019-08-14 10:43:47 +0200183
184 private:
185 size_t padding_sent_;
Erik Språngeb487992019-11-14 14:15:15 +0100186 size_t total_bytes_sent_;
Erik Språngd05edec2019-08-14 10:43:47 +0200187};
188
189class PacingControllerProbing : public PacingController::PacketSender {
190 public:
191 PacingControllerProbing() : packets_sent_(0), padding_sent_(0) {}
192
Erik Språnged1fb192020-06-30 11:53:37 +0000193 void SendPacket(std::unique_ptr<RtpPacketToSend> packet,
194 const PacedPacketInfo& pacing_info) override {
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100195 if (packet->packet_type() != RtpPacketMediaType::kPadding) {
Erik Språngd05edec2019-08-14 10:43:47 +0200196 ++packets_sent_;
197 }
Erik Språngb9d38092020-07-17 12:06:12 +0200198 last_pacing_info_ = pacing_info;
Erik Språngd05edec2019-08-14 10:43:47 +0200199 }
200
Erik Språng1d50cb62020-07-02 17:41:32 +0200201 std::vector<std::unique_ptr<RtpPacketToSend>> FetchFec() override {
202 return {};
203 }
204
Erik Språngd05edec2019-08-14 10:43:47 +0200205 std::vector<std::unique_ptr<RtpPacketToSend>> GeneratePadding(
206 DataSize target_size) override {
Erik Språngb210eeb2019-11-05 11:21:48 +0100207 // From RTPSender:
208 // Max in the RFC 3550 is 255 bytes, we limit it to be modulus 32 for SRTP.
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +0100209 const DataSize kMaxPadding = DataSize::Bytes(224);
Erik Språngb210eeb2019-11-05 11:21:48 +0100210
Erik Språngd05edec2019-08-14 10:43:47 +0200211 std::vector<std::unique_ptr<RtpPacketToSend>> packets;
Erik Språngb210eeb2019-11-05 11:21:48 +0100212 while (target_size > DataSize::Zero()) {
213 DataSize padding_size = std::min(kMaxPadding, target_size);
214 packets.emplace_back(std::make_unique<RtpPacketToSend>(nullptr));
215 packets.back()->SetPadding(padding_size.bytes());
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100216 packets.back()->set_packet_type(RtpPacketMediaType::kPadding);
Erik Språngb210eeb2019-11-05 11:21:48 +0100217 padding_sent_ += padding_size.bytes();
218 target_size -= padding_size;
219 }
Erik Språngd05edec2019-08-14 10:43:47 +0200220 return packets;
221 }
222
223 int packets_sent() const { return packets_sent_; }
Erik Språngd05edec2019-08-14 10:43:47 +0200224 int padding_sent() const { return padding_sent_; }
Erik Språngb9d38092020-07-17 12:06:12 +0200225 int total_packets_sent() const { return packets_sent_ + padding_sent_; }
226 PacedPacketInfo last_pacing_info() const { return last_pacing_info_; }
Erik Språngd05edec2019-08-14 10:43:47 +0200227
228 private:
229 int packets_sent_;
230 int padding_sent_;
Erik Språngb9d38092020-07-17 12:06:12 +0200231 PacedPacketInfo last_pacing_info_;
Erik Språngd05edec2019-08-14 10:43:47 +0200232};
233
Erik Språng6aa5cea2022-05-16 13:20:36 +0200234class PacingControllerTest : public ::testing::Test {
Erik Språngd05edec2019-08-14 10:43:47 +0200235 protected:
Erik Språnge486a7b2022-03-15 15:13:25 +0100236 PacingControllerTest() : clock_(123456), trials_("") {}
Erik Språng9acc18d2020-04-16 19:41:07 +0200237
Per Kjellanderbfd30652022-05-27 13:15:17 +0200238 void SendAndExpectPacket(PacingController* pacer,
239 RtpPacketMediaType type,
Erik Språngd05edec2019-08-14 10:43:47 +0200240 uint32_t ssrc,
241 uint16_t sequence_number,
242 int64_t capture_time_ms,
243 size_t size) {
Per Kjellanderbfd30652022-05-27 13:15:17 +0200244 pacer->EnqueuePacket(
245 BuildPacket(type, ssrc, sequence_number, capture_time_ms, size));
246
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100247 EXPECT_CALL(callback_,
248 SendPacket(ssrc, sequence_number, capture_time_ms,
Erik Språng41bbc3d2021-10-05 10:17:39 +0200249 type == RtpPacketMediaType::kRetransmission, false));
Erik Språngd05edec2019-08-14 10:43:47 +0200250 }
251
Per Kjellanderbfd30652022-05-27 13:15:17 +0200252 void AdvanceTimeUntil(webrtc::Timestamp time) {
Erik Språngeb487992019-11-14 14:15:15 +0100253 Timestamp now = clock_.CurrentTime();
Per Kjellanderbfd30652022-05-27 13:15:17 +0200254 clock_.AdvanceTime(std::max(TimeDelta::Zero(), time - now));
Erik Språngeb487992019-11-14 14:15:15 +0100255 }
Erik Språngd05edec2019-08-14 10:43:47 +0200256
Per Kjellanderbfd30652022-05-27 13:15:17 +0200257 void ConsumeInitialBudget(PacingController* pacer) {
Erik Språngeb487992019-11-14 14:15:15 +0100258 const uint32_t kSsrc = 54321;
259 uint16_t sequence_number = 1234;
260 int64_t capture_time_ms = clock_.TimeInMilliseconds();
261 const size_t kPacketSize = 250;
262
Per Kjellanderbfd30652022-05-27 13:15:17 +0200263 EXPECT_TRUE(pacer->OldestPacketEnqueueTime().IsInfinite());
Erik Språngeb487992019-11-14 14:15:15 +0100264
265 // Due to the multiplicative factor we can send 5 packets during a send
266 // interval. (network capacity * multiplier / (8 bits per byte *
267 // (packet size * #send intervals per second)
268 const size_t packets_to_send_per_interval =
269 kTargetRate.bps() * kPaceMultiplier / (8 * kPacketSize * 200);
270 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
Per Kjellanderbfd30652022-05-27 13:15:17 +0200271 SendAndExpectPacket(pacer, RtpPacketMediaType::kVideo, kSsrc,
272 sequence_number++, capture_time_ms, kPacketSize);
Erik Språngd05edec2019-08-14 10:43:47 +0200273 }
274
Per Kjellanderbfd30652022-05-27 13:15:17 +0200275 while (pacer->QueueSizePackets() > 0) {
276 AdvanceTimeUntil(pacer->NextSendTime());
277 pacer->ProcessPackets();
278 }
Erik Språngd05edec2019-08-14 10:43:47 +0200279 }
280
281 SimulatedClock clock_;
Per Kjellanderbfd30652022-05-27 13:15:17 +0200282
283 MediaStream audio_ = MediaStream(clock_,
284 /*type*/ RtpPacketMediaType::kAudio,
285 /*ssrc*/ kAudioSsrc,
286 /*packet_size*/ 100);
287 MediaStream video_ = MediaStream(clock_,
288 /*type*/ RtpPacketMediaType::kVideo,
289 /*ssrc*/ kVideoSsrc,
290 /*packet_size*/ 1000);
291
Erik Språng1d50cb62020-07-02 17:41:32 +0200292 ::testing::NiceMock<MockPacingControllerCallback> callback_;
Erik Språnge486a7b2022-03-15 15:13:25 +0100293 ExplicitKeyValueConfig trials_;
Erik Språngd05edec2019-08-14 10:43:47 +0200294};
295
Per Kjellanderbfd30652022-05-27 13:15:17 +0200296TEST_F(PacingControllerTest, DefaultNoPaddingInSilence) {
Erik Språnge486a7b2022-03-15 15:13:25 +0100297 const test::ExplicitKeyValueConfig trials("");
Erik Språng6aa5cea2022-05-16 13:20:36 +0200298 PacingController pacer(&clock_, &callback_, trials);
Erik Språngd05edec2019-08-14 10:43:47 +0200299 pacer.SetPacingRates(kTargetRate, DataRate::Zero());
300 // Video packet to reset last send time and provide padding data.
Per Kjellanderbfd30652022-05-27 13:15:17 +0200301 pacer.EnqueuePacket(video_.BuildNextPacket());
Erik Språngd05edec2019-08-14 10:43:47 +0200302 EXPECT_CALL(callback_, SendPacket).Times(1);
303 clock_.AdvanceTimeMilliseconds(5);
304 pacer.ProcessPackets();
305 EXPECT_CALL(callback_, SendPadding).Times(0);
306 // Waiting 500 ms should not trigger sending of padding.
307 clock_.AdvanceTimeMilliseconds(500);
308 pacer.ProcessPackets();
309}
310
Per Kjellanderbfd30652022-05-27 13:15:17 +0200311TEST_F(PacingControllerTest, PaddingInSilenceWithTrial) {
Erik Språnge486a7b2022-03-15 15:13:25 +0100312 const test::ExplicitKeyValueConfig trials(
313 "WebRTC-Pacer-PadInSilence/Enabled/");
Erik Språng6aa5cea2022-05-16 13:20:36 +0200314 PacingController pacer(&clock_, &callback_, trials);
Erik Språngd05edec2019-08-14 10:43:47 +0200315 pacer.SetPacingRates(kTargetRate, DataRate::Zero());
316 // Video packet to reset last send time and provide padding data.
Per Kjellanderbfd30652022-05-27 13:15:17 +0200317 pacer.EnqueuePacket(video_.BuildNextPacket());
Erik Språngf5815fa2019-08-21 14:27:31 +0200318 EXPECT_CALL(callback_, SendPacket).Times(2);
Erik Språngd05edec2019-08-14 10:43:47 +0200319 clock_.AdvanceTimeMilliseconds(5);
320 pacer.ProcessPackets();
321 EXPECT_CALL(callback_, SendPadding).WillOnce(Return(1000));
322 // Waiting 500 ms should trigger sending of padding.
323 clock_.AdvanceTimeMilliseconds(500);
324 pacer.ProcessPackets();
325}
326
Per Kjellanderbfd30652022-05-27 13:15:17 +0200327TEST_F(PacingControllerTest, CongestionWindowAffectsAudioInTrial) {
Erik Språnge486a7b2022-03-15 15:13:25 +0100328 const test::ExplicitKeyValueConfig trials("WebRTC-Pacer-BlockAudio/Enabled/");
Erik Språngd05edec2019-08-14 10:43:47 +0200329 EXPECT_CALL(callback_, SendPadding).Times(0);
Erik Språng6aa5cea2022-05-16 13:20:36 +0200330 PacingController pacer(&clock_, &callback_, trials);
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +0100331 pacer.SetPacingRates(DataRate::KilobitsPerSec(10000), DataRate::Zero());
Erik Språngd05edec2019-08-14 10:43:47 +0200332 // Video packet fills congestion window.
Per Kjellanderbfd30652022-05-27 13:15:17 +0200333 pacer.EnqueuePacket(video_.BuildNextPacket());
Erik Språngd05edec2019-08-14 10:43:47 +0200334 EXPECT_CALL(callback_, SendPacket).Times(1);
Per Kjellanderbfd30652022-05-27 13:15:17 +0200335 AdvanceTimeUntil(pacer.NextSendTime());
336 pacer.ProcessPackets();
Erik Språng66734372022-03-16 14:20:49 +0100337 pacer.SetCongested(true);
Erik Språngd05edec2019-08-14 10:43:47 +0200338 // Audio packet blocked due to congestion.
Per Kjellanderbfd30652022-05-27 13:15:17 +0200339 pacer.EnqueuePacket(audio_.BuildNextPacket());
Erik Språngd05edec2019-08-14 10:43:47 +0200340 EXPECT_CALL(callback_, SendPacket).Times(0);
Erik Språng6aa5cea2022-05-16 13:20:36 +0200341 // Forward time to where we send keep-alive.
342 EXPECT_CALL(callback_, SendPadding(1)).Times(2);
Per Kjellanderbfd30652022-05-27 13:15:17 +0200343 AdvanceTimeUntil(pacer.NextSendTime());
344 pacer.ProcessPackets();
345 AdvanceTimeUntil(pacer.NextSendTime());
346 pacer.ProcessPackets();
Erik Språngd05edec2019-08-14 10:43:47 +0200347 // Audio packet unblocked when congestion window clear.
348 ::testing::Mock::VerifyAndClearExpectations(&callback_);
Erik Språng66734372022-03-16 14:20:49 +0100349 pacer.SetCongested(false);
Erik Språngd05edec2019-08-14 10:43:47 +0200350 EXPECT_CALL(callback_, SendPacket).Times(1);
Per Kjellanderbfd30652022-05-27 13:15:17 +0200351 AdvanceTimeUntil(pacer.NextSendTime());
352 pacer.ProcessPackets();
Erik Språngd05edec2019-08-14 10:43:47 +0200353}
354
Per Kjellanderbfd30652022-05-27 13:15:17 +0200355TEST_F(PacingControllerTest, DefaultCongestionWindowDoesNotAffectAudio) {
Erik Språngd05edec2019-08-14 10:43:47 +0200356 EXPECT_CALL(callback_, SendPadding).Times(0);
Erik Språnge486a7b2022-03-15 15:13:25 +0100357 const test::ExplicitKeyValueConfig trials("");
Erik Språng6aa5cea2022-05-16 13:20:36 +0200358 PacingController pacer(&clock_, &callback_, trials);
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +0100359 pacer.SetPacingRates(DataRate::BitsPerSec(10000000), DataRate::Zero());
Erik Språngd05edec2019-08-14 10:43:47 +0200360 // Video packet fills congestion window.
Per Kjellanderbfd30652022-05-27 13:15:17 +0200361 pacer.EnqueuePacket(video_.BuildNextPacket());
Erik Språngd05edec2019-08-14 10:43:47 +0200362 EXPECT_CALL(callback_, SendPacket).Times(1);
Per Kjellanderbfd30652022-05-27 13:15:17 +0200363 AdvanceTimeUntil(pacer.NextSendTime());
364 pacer.ProcessPackets();
Erik Språng66734372022-03-16 14:20:49 +0100365 pacer.SetCongested(true);
Erik Språngd05edec2019-08-14 10:43:47 +0200366 // Audio not blocked due to congestion.
Per Kjellanderbfd30652022-05-27 13:15:17 +0200367 pacer.EnqueuePacket(audio_.BuildNextPacket());
Erik Språngd05edec2019-08-14 10:43:47 +0200368 EXPECT_CALL(callback_, SendPacket).Times(1);
Per Kjellanderbfd30652022-05-27 13:15:17 +0200369 AdvanceTimeUntil(pacer.NextSendTime());
370 pacer.ProcessPackets();
Erik Språngd05edec2019-08-14 10:43:47 +0200371}
372
Per Kjellanderbfd30652022-05-27 13:15:17 +0200373TEST_F(PacingControllerTest, BudgetAffectsAudioInTrial) {
Erik Språnge486a7b2022-03-15 15:13:25 +0100374 ExplicitKeyValueConfig trials("WebRTC-Pacer-BlockAudio/Enabled/");
Erik Språng6aa5cea2022-05-16 13:20:36 +0200375 PacingController pacer(&clock_, &callback_, trials);
Per Kjellanderbfd30652022-05-27 13:15:17 +0200376 const size_t kPacketSize = 1000;
377 const int kProcessIntervalsPerSecond = 1000 / 5;
378 DataRate pacing_rate =
379 DataRate::BitsPerSec(kPacketSize / 3 * 8 * kProcessIntervalsPerSecond);
Erik Språngeb487992019-11-14 14:15:15 +0100380 pacer.SetPacingRates(pacing_rate, DataRate::Zero());
Erik Språngd05edec2019-08-14 10:43:47 +0200381 // Video fills budget for following process periods.
Per Kjellanderbfd30652022-05-27 13:15:17 +0200382 pacer.EnqueuePacket(video_.BuildNextPacket(kPacketSize));
Erik Språngd05edec2019-08-14 10:43:47 +0200383 EXPECT_CALL(callback_, SendPacket).Times(1);
Per Kjellanderbfd30652022-05-27 13:15:17 +0200384 AdvanceTimeUntil(pacer.NextSendTime());
385 pacer.ProcessPackets();
Erik Språngd05edec2019-08-14 10:43:47 +0200386 // Audio packet blocked due to budget limit.
Per Kjellanderbfd30652022-05-27 13:15:17 +0200387 pacer.EnqueuePacket(audio_.BuildNextPacket());
Erik Språngeb487992019-11-14 14:15:15 +0100388 Timestamp wait_start_time = clock_.CurrentTime();
389 Timestamp wait_end_time = Timestamp::MinusInfinity();
Erik Språng1a080962022-03-17 15:16:59 +0100390 EXPECT_CALL(callback_, SendPacket).WillOnce(WithoutArgs([&]() {
391 wait_end_time = clock_.CurrentTime();
392 }));
Erik Språngeb487992019-11-14 14:15:15 +0100393 while (!wait_end_time.IsFinite()) {
Per Kjellanderbfd30652022-05-27 13:15:17 +0200394 AdvanceTimeUntil(pacer.NextSendTime());
395 pacer.ProcessPackets();
Erik Språngeb487992019-11-14 14:15:15 +0100396 }
397 const TimeDelta expected_wait_time =
Per Kjellanderbfd30652022-05-27 13:15:17 +0200398 DataSize::Bytes(kPacketSize) / pacing_rate;
Erik Språngeb487992019-11-14 14:15:15 +0100399 // Verify delay is near expectation, within timing margin.
400 EXPECT_LT(((wait_end_time - wait_start_time) - expected_wait_time).Abs(),
Erik Språng6aa5cea2022-05-16 13:20:36 +0200401 PacingController::kMinSleepTime);
Erik Språngd05edec2019-08-14 10:43:47 +0200402}
403
Per Kjellanderbfd30652022-05-27 13:15:17 +0200404TEST_F(PacingControllerTest, DefaultBudgetDoesNotAffectAudio) {
405 const size_t kPacketSize = 1000;
Erik Språngd05edec2019-08-14 10:43:47 +0200406 EXPECT_CALL(callback_, SendPadding).Times(0);
Erik Språnge486a7b2022-03-15 15:13:25 +0100407 const test::ExplicitKeyValueConfig trials("");
Erik Språng6aa5cea2022-05-16 13:20:36 +0200408 PacingController pacer(&clock_, &callback_, trials);
Per Kjellanderbfd30652022-05-27 13:15:17 +0200409 const int kProcessIntervalsPerSecond = 1000 / 5;
410 pacer.SetPacingRates(
411 DataRate::BitsPerSec(kPacketSize / 3 * 8 * kProcessIntervalsPerSecond),
412 DataRate::Zero());
Erik Språngd05edec2019-08-14 10:43:47 +0200413 // Video fills budget for following process periods.
Per Kjellanderbfd30652022-05-27 13:15:17 +0200414 pacer.EnqueuePacket(video_.BuildNextPacket(kPacketSize));
Erik Språngd05edec2019-08-14 10:43:47 +0200415 EXPECT_CALL(callback_, SendPacket).Times(1);
Per Kjellanderbfd30652022-05-27 13:15:17 +0200416 AdvanceTimeUntil(pacer.NextSendTime());
417 pacer.ProcessPackets();
Erik Språngd05edec2019-08-14 10:43:47 +0200418 // Audio packet not blocked due to budget limit.
419 EXPECT_CALL(callback_, SendPacket).Times(1);
Per Kjellanderbfd30652022-05-27 13:15:17 +0200420 pacer.EnqueuePacket(audio_.BuildNextPacket());
421 AdvanceTimeUntil(pacer.NextSendTime());
422 pacer.ProcessPackets();
Erik Språngd05edec2019-08-14 10:43:47 +0200423}
424
Erik Språng6aa5cea2022-05-16 13:20:36 +0200425TEST_F(PacingControllerTest, FirstSentPacketTimeIsSet) {
Erik Språngd05edec2019-08-14 10:43:47 +0200426 const Timestamp kStartTime = clock_.CurrentTime();
Per Kjellanderbfd30652022-05-27 13:15:17 +0200427 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
428 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
Erik Språngd05edec2019-08-14 10:43:47 +0200429
430 // No packet sent.
Per Kjellanderbfd30652022-05-27 13:15:17 +0200431 EXPECT_FALSE(pacer->FirstSentPacketTime().has_value());
432 pacer->EnqueuePacket(video_.BuildNextPacket());
433 AdvanceTimeUntil(pacer->NextSendTime());
434 pacer->ProcessPackets();
435 EXPECT_EQ(kStartTime, pacer->FirstSentPacketTime());
Erik Språngd05edec2019-08-14 10:43:47 +0200436}
437
Erik Språng6aa5cea2022-05-16 13:20:36 +0200438TEST_F(PacingControllerTest, QueueAndPacePackets) {
Erik Språngeb487992019-11-14 14:15:15 +0100439 const uint32_t kSsrc = 12345;
440 uint16_t sequence_number = 1234;
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +0100441 const DataSize kPackeSize = DataSize::Bytes(250);
Danil Chapovalov55284022020-02-07 14:53:52 +0100442 const TimeDelta kSendInterval = TimeDelta::Millis(5);
Erik Språngeb487992019-11-14 14:15:15 +0100443
444 // Due to the multiplicative factor we can send 5 packets during a 5ms send
445 // interval. (send interval * network capacity * multiplier / packet size)
446 const size_t kPacketsToSend = (kSendInterval * kTargetRate).bytes() *
447 kPaceMultiplier / kPackeSize.bytes();
Per Kjellanderbfd30652022-05-27 13:15:17 +0200448 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
449 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
Erik Språngeb487992019-11-14 14:15:15 +0100450
451 for (size_t i = 0; i < kPacketsToSend; ++i) {
Per Kjellanderbfd30652022-05-27 13:15:17 +0200452 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, kSsrc,
453 sequence_number++, clock_.TimeInMilliseconds(),
454 kPackeSize.bytes());
Erik Språngeb487992019-11-14 14:15:15 +0100455 }
456 EXPECT_CALL(callback_, SendPadding).Times(0);
457
458 // Enqueue one extra packet.
459 int64_t queued_packet_timestamp = clock_.TimeInMilliseconds();
Per Kjellanderbfd30652022-05-27 13:15:17 +0200460 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, kSsrc,
461 sequence_number, queued_packet_timestamp,
462 kPackeSize.bytes()));
463 EXPECT_EQ(kPacketsToSend + 1, pacer->QueueSizePackets());
Erik Språngeb487992019-11-14 14:15:15 +0100464
465 // Send packets until the initial kPacketsToSend packets are done.
466 Timestamp start_time = clock_.CurrentTime();
Per Kjellanderbfd30652022-05-27 13:15:17 +0200467 while (pacer->QueueSizePackets() > 1) {
468 AdvanceTimeUntil(pacer->NextSendTime());
469 pacer->ProcessPackets();
Erik Språngeb487992019-11-14 14:15:15 +0100470 }
471 EXPECT_LT(clock_.CurrentTime() - start_time, kSendInterval);
472
473 // Proceed till last packet can be sent.
474 EXPECT_CALL(callback_, SendPacket(kSsrc, sequence_number,
475 queued_packet_timestamp, false, false))
476 .Times(1);
Per Kjellanderbfd30652022-05-27 13:15:17 +0200477 AdvanceTimeUntil(pacer->NextSendTime());
478 pacer->ProcessPackets();
Erik Språngeb487992019-11-14 14:15:15 +0100479 EXPECT_GE(clock_.CurrentTime() - start_time, kSendInterval);
Per Kjellanderbfd30652022-05-27 13:15:17 +0200480 EXPECT_EQ(pacer->QueueSizePackets(), 0u);
Erik Språngeb487992019-11-14 14:15:15 +0100481}
482
Erik Språng6aa5cea2022-05-16 13:20:36 +0200483TEST_F(PacingControllerTest, PaceQueuedPackets) {
Erik Språngd05edec2019-08-14 10:43:47 +0200484 uint32_t ssrc = 12345;
485 uint16_t sequence_number = 1234;
Erik Språngeb487992019-11-14 14:15:15 +0100486 const size_t kPacketSize = 250;
Per Kjellanderbfd30652022-05-27 13:15:17 +0200487 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
488 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
Erik Språngd05edec2019-08-14 10:43:47 +0200489
490 // Due to the multiplicative factor we can send 5 packets during a send
491 // interval. (network capacity * multiplier / (8 bits per byte *
492 // (packet size * #send intervals per second)
493 const size_t packets_to_send_per_interval =
Erik Språngeb487992019-11-14 14:15:15 +0100494 kTargetRate.bps() * kPaceMultiplier / (8 * kPacketSize * 200);
Erik Språngd05edec2019-08-14 10:43:47 +0200495 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
Per Kjellanderbfd30652022-05-27 13:15:17 +0200496 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc,
497 sequence_number++, clock_.TimeInMilliseconds(),
498 kPacketSize);
Erik Språngd05edec2019-08-14 10:43:47 +0200499 }
500
501 for (size_t j = 0; j < packets_to_send_per_interval * 10; ++j) {
Per Kjellanderbfd30652022-05-27 13:15:17 +0200502 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, ssrc,
503 sequence_number++,
504 clock_.TimeInMilliseconds(), kPacketSize));
Erik Språngd05edec2019-08-14 10:43:47 +0200505 }
506 EXPECT_EQ(packets_to_send_per_interval + packets_to_send_per_interval * 10,
Per Kjellanderbfd30652022-05-27 13:15:17 +0200507 pacer->QueueSizePackets());
Erik Språng6aa5cea2022-05-16 13:20:36 +0200508
Per Kjellanderbfd30652022-05-27 13:15:17 +0200509 while (pacer->QueueSizePackets() > packets_to_send_per_interval * 10) {
510 AdvanceTimeUntil(pacer->NextSendTime());
511 pacer->ProcessPackets();
512 }
513 EXPECT_EQ(pacer->QueueSizePackets(), packets_to_send_per_interval * 10);
Erik Språngeb487992019-11-14 14:15:15 +0100514 EXPECT_CALL(callback_, SendPadding).Times(0);
515
516 EXPECT_CALL(callback_, SendPacket(ssrc, _, _, false, false))
Per Kjellanderbfd30652022-05-27 13:15:17 +0200517 .Times(pacer->QueueSizePackets());
Erik Språngeb487992019-11-14 14:15:15 +0100518 const TimeDelta expected_pace_time =
Per Kjellanderbfd30652022-05-27 13:15:17 +0200519 DataSize::Bytes(pacer->QueueSizePackets() * kPacketSize) /
Erik Språngeb487992019-11-14 14:15:15 +0100520 (kPaceMultiplier * kTargetRate);
521 Timestamp start_time = clock_.CurrentTime();
Per Kjellanderbfd30652022-05-27 13:15:17 +0200522 while (pacer->QueueSizePackets() > 0) {
523 AdvanceTimeUntil(pacer->NextSendTime());
524 pacer->ProcessPackets();
Erik Språngeb487992019-11-14 14:15:15 +0100525 }
526 const TimeDelta actual_pace_time = clock_.CurrentTime() - start_time;
Danil Chapovalov55284022020-02-07 14:53:52 +0100527 EXPECT_LT((actual_pace_time - expected_pace_time).Abs(),
Erik Språng6aa5cea2022-05-16 13:20:36 +0200528 PacingController::kMinSleepTime);
Erik Språngeb487992019-11-14 14:15:15 +0100529
Per Kjellanderbfd30652022-05-27 13:15:17 +0200530 EXPECT_EQ(0u, pacer->QueueSizePackets());
531 AdvanceTimeUntil(pacer->NextSendTime());
532 EXPECT_EQ(0u, pacer->QueueSizePackets());
533 pacer->ProcessPackets();
Erik Språngd05edec2019-08-14 10:43:47 +0200534
Erik Språngeb487992019-11-14 14:15:15 +0100535 // Send some more packet, just show that we can..?
Erik Språngd05edec2019-08-14 10:43:47 +0200536 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
Per Kjellanderbfd30652022-05-27 13:15:17 +0200537 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc,
538 sequence_number++, clock_.TimeInMilliseconds(), 250);
Erik Språngd05edec2019-08-14 10:43:47 +0200539 }
Per Kjellanderbfd30652022-05-27 13:15:17 +0200540 EXPECT_EQ(packets_to_send_per_interval, pacer->QueueSizePackets());
Erik Språng6aa5cea2022-05-16 13:20:36 +0200541 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
Per Kjellanderbfd30652022-05-27 13:15:17 +0200542 AdvanceTimeUntil(pacer->NextSendTime());
543 pacer->ProcessPackets();
Erik Språngeb487992019-11-14 14:15:15 +0100544 }
Per Kjellanderbfd30652022-05-27 13:15:17 +0200545 EXPECT_EQ(0u, pacer->QueueSizePackets());
Erik Språngd05edec2019-08-14 10:43:47 +0200546}
547
Erik Språng6aa5cea2022-05-16 13:20:36 +0200548TEST_F(PacingControllerTest, RepeatedRetransmissionsAllowed) {
Per Kjellanderbfd30652022-05-27 13:15:17 +0200549 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
550 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
551
Erik Språngd05edec2019-08-14 10:43:47 +0200552 // Send one packet, then two retransmissions of that packet.
553 for (size_t i = 0; i < 3; i++) {
554 constexpr uint32_t ssrc = 333;
555 constexpr uint16_t sequence_number = 444;
556 constexpr size_t bytes = 250;
557 bool is_retransmission = (i != 0); // Original followed by retransmissions.
Per Kjellanderbfd30652022-05-27 13:15:17 +0200558 SendAndExpectPacket(pacer.get(),
559 is_retransmission ? RtpPacketMediaType::kRetransmission
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100560 : RtpPacketMediaType::kVideo,
561 ssrc, sequence_number, clock_.TimeInMilliseconds(),
562 bytes);
Erik Språngd05edec2019-08-14 10:43:47 +0200563 clock_.AdvanceTimeMilliseconds(5);
564 }
Per Kjellanderbfd30652022-05-27 13:15:17 +0200565 while (pacer->QueueSizePackets() > 0) {
566 AdvanceTimeUntil(pacer->NextSendTime());
567 pacer->ProcessPackets();
568 }
Erik Språngd05edec2019-08-14 10:43:47 +0200569}
570
Erik Språng6aa5cea2022-05-16 13:20:36 +0200571TEST_F(PacingControllerTest,
Erik Språngd05edec2019-08-14 10:43:47 +0200572 CanQueuePacketsWithSameSequenceNumberOnDifferentSsrcs) {
573 uint32_t ssrc = 12345;
574 uint16_t sequence_number = 1234;
Per Kjellanderbfd30652022-05-27 13:15:17 +0200575 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
576 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
Erik Språngd05edec2019-08-14 10:43:47 +0200577
Per Kjellanderbfd30652022-05-27 13:15:17 +0200578 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc,
579 sequence_number, clock_.TimeInMilliseconds(), 250);
Erik Språngd05edec2019-08-14 10:43:47 +0200580
581 // Expect packet on second ssrc to be queued and sent as well.
Per Kjellanderbfd30652022-05-27 13:15:17 +0200582 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc + 1,
583 sequence_number, clock_.TimeInMilliseconds(), 250);
Erik Språngd05edec2019-08-14 10:43:47 +0200584
585 clock_.AdvanceTimeMilliseconds(1000);
Per Kjellanderbfd30652022-05-27 13:15:17 +0200586 while (pacer->QueueSizePackets() > 0) {
587 AdvanceTimeUntil(pacer->NextSendTime());
588 pacer->ProcessPackets();
589 }
Erik Språngd05edec2019-08-14 10:43:47 +0200590}
591
Erik Språng6aa5cea2022-05-16 13:20:36 +0200592TEST_F(PacingControllerTest, Padding) {
Erik Språngd05edec2019-08-14 10:43:47 +0200593 uint32_t ssrc = 12345;
594 uint16_t sequence_number = 1234;
Erik Språngeb487992019-11-14 14:15:15 +0100595 const size_t kPacketSize = 250;
Per Kjellanderbfd30652022-05-27 13:15:17 +0200596 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
597 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
Erik Språngd05edec2019-08-14 10:43:47 +0200598
Per Kjellanderbfd30652022-05-27 13:15:17 +0200599 const size_t kPacketsToSend = 20;
600 for (size_t i = 0; i < kPacketsToSend; ++i) {
601 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc,
602 sequence_number++, clock_.TimeInMilliseconds(),
603 kPacketSize);
604 }
605 const TimeDelta expected_pace_time =
606 DataSize::Bytes(pacer->QueueSizePackets() * kPacketSize) /
607 (kPaceMultiplier * kTargetRate);
608 EXPECT_CALL(callback_, SendPadding).Times(0);
609 // Only the media packets should be sent.
610 Timestamp start_time = clock_.CurrentTime();
611 while (pacer->QueueSizePackets() > 0) {
612 AdvanceTimeUntil(pacer->NextSendTime());
613 pacer->ProcessPackets();
614 }
Erik Språngeb487992019-11-14 14:15:15 +0100615 const TimeDelta actual_pace_time = clock_.CurrentTime() - start_time;
616 EXPECT_LE((actual_pace_time - expected_pace_time).Abs(),
617 PacingController::kMinSleepTime);
618
Erik Språngb1ccae22019-11-25 18:22:09 +0100619 // Pacing media happens at 2.5x, but padding was configured with 1.0x
Erik Språngeb487992019-11-14 14:15:15 +0100620 // factor. We have to wait until the padding debt is gone before we start
621 // sending padding.
622 const TimeDelta time_to_padding_debt_free =
623 (expected_pace_time * kPaceMultiplier) - actual_pace_time;
Erik Språngb1ccae22019-11-25 18:22:09 +0100624 clock_.AdvanceTime(time_to_padding_debt_free -
625 PacingController::kMinSleepTime);
Per Kjellanderbfd30652022-05-27 13:15:17 +0200626 pacer->ProcessPackets();
Erik Språngeb487992019-11-14 14:15:15 +0100627
628 // Send 10 padding packets.
629 const size_t kPaddingPacketsToSend = 10;
630 DataSize padding_sent = DataSize::Zero();
Erik Språngb1ccae22019-11-25 18:22:09 +0100631 size_t packets_sent = 0;
632 Timestamp first_send_time = Timestamp::MinusInfinity();
633 Timestamp last_send_time = Timestamp::MinusInfinity();
634
Erik Språngeb487992019-11-14 14:15:15 +0100635 EXPECT_CALL(callback_, SendPadding)
636 .Times(kPaddingPacketsToSend)
637 .WillRepeatedly([&](size_t target_size) {
Erik Språngb1ccae22019-11-25 18:22:09 +0100638 ++packets_sent;
639 if (packets_sent < kPaddingPacketsToSend) {
640 // Don't count bytes of last packet, instead just
641 // use this as the time the last packet finished
642 // sending.
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +0100643 padding_sent += DataSize::Bytes(target_size);
Erik Språngb1ccae22019-11-25 18:22:09 +0100644 }
645 if (first_send_time.IsInfinite()) {
646 first_send_time = clock_.CurrentTime();
647 } else {
648 last_send_time = clock_.CurrentTime();
649 }
Erik Språngeb487992019-11-14 14:15:15 +0100650 return target_size;
651 });
652 EXPECT_CALL(callback_, SendPacket(_, _, _, false, true))
653 .Times(kPaddingPacketsToSend);
Erik Språngb1ccae22019-11-25 18:22:09 +0100654
655 while (packets_sent < kPaddingPacketsToSend) {
Per Kjellanderbfd30652022-05-27 13:15:17 +0200656 AdvanceTimeUntil(pacer->NextSendTime());
657 pacer->ProcessPackets();
Erik Språngeb487992019-11-14 14:15:15 +0100658 }
659
660 // Verify rate of sent padding.
Erik Språngb1ccae22019-11-25 18:22:09 +0100661 TimeDelta padding_duration = last_send_time - first_send_time;
Erik Språngeb487992019-11-14 14:15:15 +0100662 DataRate padding_rate = padding_sent / padding_duration;
663 EXPECT_EQ(padding_rate, kTargetRate);
Erik Språngd05edec2019-08-14 10:43:47 +0200664}
665
Erik Språng6aa5cea2022-05-16 13:20:36 +0200666TEST_F(PacingControllerTest, NoPaddingBeforeNormalPacket) {
Per Kjellanderbfd30652022-05-27 13:15:17 +0200667 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
668 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
Erik Språngd05edec2019-08-14 10:43:47 +0200669
670 EXPECT_CALL(callback_, SendPadding).Times(0);
Erik Språngeb487992019-11-14 14:15:15 +0100671
Per Kjellanderbfd30652022-05-27 13:15:17 +0200672 pacer->ProcessPackets();
673 AdvanceTimeUntil(pacer->NextSendTime());
Erik Språngd05edec2019-08-14 10:43:47 +0200674
Per Kjellanderbfd30652022-05-27 13:15:17 +0200675 pacer->ProcessPackets();
676 AdvanceTimeUntil(pacer->NextSendTime());
Erik Språngd05edec2019-08-14 10:43:47 +0200677
678 uint32_t ssrc = 12345;
679 uint16_t sequence_number = 1234;
680 int64_t capture_time_ms = 56789;
681
Per Kjellanderbfd30652022-05-27 13:15:17 +0200682 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc,
683 sequence_number++, capture_time_ms, 250);
Erik Språngb1ccae22019-11-25 18:22:09 +0100684 bool padding_sent = false;
685 EXPECT_CALL(callback_, SendPadding).WillOnce([&](size_t padding) {
686 padding_sent = true;
Erik Språngeb487992019-11-14 14:15:15 +0100687 return padding;
688 });
Erik Språngf5815fa2019-08-21 14:27:31 +0200689 EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
Erik Språng6aa5cea2022-05-16 13:20:36 +0200690 while (!padding_sent) {
Per Kjellanderbfd30652022-05-27 13:15:17 +0200691 AdvanceTimeUntil(pacer->NextSendTime());
692 pacer->ProcessPackets();
Erik Språngeb487992019-11-14 14:15:15 +0100693 }
Erik Språngd05edec2019-08-14 10:43:47 +0200694}
695
Erik Språng6aa5cea2022-05-16 13:20:36 +0200696TEST_F(PacingControllerTest, VerifyAverageBitrateVaryingMediaPayload) {
Erik Språngd05edec2019-08-14 10:43:47 +0200697 uint32_t ssrc = 12345;
698 uint16_t sequence_number = 1234;
699 int64_t capture_time_ms = 56789;
Danil Chapovalov55284022020-02-07 14:53:52 +0100700 const TimeDelta kAveragingWindowLength = TimeDelta::Seconds(10);
Erik Språngd05edec2019-08-14 10:43:47 +0200701 PacingControllerPadding callback;
Per Kjellanderbfd30652022-05-27 13:15:17 +0200702 auto pacer = std::make_unique<PacingController>(&clock_, &callback, trials_);
703 pacer->SetProbingEnabled(false);
704 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
Erik Språngd05edec2019-08-14 10:43:47 +0200705
Erik Språngeb487992019-11-14 14:15:15 +0100706 Timestamp start_time = clock_.CurrentTime();
Erik Språngd05edec2019-08-14 10:43:47 +0200707 size_t media_bytes = 0;
Erik Språngeb487992019-11-14 14:15:15 +0100708 while (clock_.CurrentTime() - start_time < kAveragingWindowLength) {
709 // Maybe add some new media packets corresponding to expected send rate.
Erik Språngd05edec2019-08-14 10:43:47 +0200710 int rand_value = rand(); // NOLINT (rand_r instead of rand)
Erik Språngeb487992019-11-14 14:15:15 +0100711 while (
712 media_bytes <
713 (kTargetRate * (clock_.CurrentTime() - start_time)).bytes<size_t>()) {
714 size_t media_payload = rand_value % 400 + 800; // [400, 1200] bytes.
Per Kjellanderbfd30652022-05-27 13:15:17 +0200715 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, ssrc,
716 sequence_number++, capture_time_ms,
717 media_payload));
Erik Språngeb487992019-11-14 14:15:15 +0100718 media_bytes += media_payload;
719 }
720
Per Kjellanderbfd30652022-05-27 13:15:17 +0200721 AdvanceTimeUntil(pacer->NextSendTime());
722 pacer->ProcessPackets();
Erik Språngd05edec2019-08-14 10:43:47 +0200723 }
Erik Språngeb487992019-11-14 14:15:15 +0100724
725 EXPECT_NEAR(
726 kTargetRate.bps(),
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +0100727 (DataSize::Bytes(callback.total_bytes_sent()) / kAveragingWindowLength)
Erik Språngeb487992019-11-14 14:15:15 +0100728 .bps(),
729 (kTargetRate * 0.01 /* 1% error marging */).bps());
Erik Språngd05edec2019-08-14 10:43:47 +0200730}
731
Erik Språng6aa5cea2022-05-16 13:20:36 +0200732TEST_F(PacingControllerTest, Priority) {
Erik Språngd05edec2019-08-14 10:43:47 +0200733 uint32_t ssrc_low_priority = 12345;
734 uint32_t ssrc = 12346;
735 uint16_t sequence_number = 1234;
736 int64_t capture_time_ms = 56789;
737 int64_t capture_time_ms_low_priority = 1234567;
Per Kjellanderbfd30652022-05-27 13:15:17 +0200738 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
739 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
Erik Språngd05edec2019-08-14 10:43:47 +0200740
Per Kjellanderbfd30652022-05-27 13:15:17 +0200741 ConsumeInitialBudget(pacer.get());
Erik Språngd05edec2019-08-14 10:43:47 +0200742
743 // Expect normal and low priority to be queued and high to pass through.
Per Kjellanderbfd30652022-05-27 13:15:17 +0200744 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo,
745 ssrc_low_priority, sequence_number++,
746 capture_time_ms_low_priority, 250));
Erik Språngd05edec2019-08-14 10:43:47 +0200747
Erik Språngeb487992019-11-14 14:15:15 +0100748 const size_t packets_to_send_per_interval =
749 kTargetRate.bps() * kPaceMultiplier / (8 * 250 * 200);
Erik Språngd05edec2019-08-14 10:43:47 +0200750 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
Per Kjellanderbfd30652022-05-27 13:15:17 +0200751 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kRetransmission, ssrc,
752 sequence_number++, capture_time_ms, 250));
Erik Språngd05edec2019-08-14 10:43:47 +0200753 }
Per Kjellanderbfd30652022-05-27 13:15:17 +0200754 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kAudio, ssrc,
755 sequence_number++, capture_time_ms, 250));
Erik Språngd05edec2019-08-14 10:43:47 +0200756
757 // Expect all high and normal priority to be sent out first.
758 EXPECT_CALL(callback_, SendPadding).Times(0);
759 EXPECT_CALL(callback_, SendPacket(ssrc, _, capture_time_ms, _, _))
760 .Times(packets_to_send_per_interval + 1);
761
Per Kjellanderbfd30652022-05-27 13:15:17 +0200762 while (pacer->QueueSizePackets() > 1) {
763 AdvanceTimeUntil(pacer->NextSendTime());
764 pacer->ProcessPackets();
765 }
Erik Språngeb487992019-11-14 14:15:15 +0100766
Per Kjellanderbfd30652022-05-27 13:15:17 +0200767 EXPECT_EQ(1u, pacer->QueueSizePackets());
Erik Språngd05edec2019-08-14 10:43:47 +0200768
769 EXPECT_CALL(callback_, SendPacket(ssrc_low_priority, _,
Erik Språng6aa5cea2022-05-16 13:20:36 +0200770 capture_time_ms_low_priority, _, _));
Per Kjellanderbfd30652022-05-27 13:15:17 +0200771 AdvanceTimeUntil(pacer->NextSendTime());
772 pacer->ProcessPackets();
Erik Språngd05edec2019-08-14 10:43:47 +0200773}
774
Erik Språng6aa5cea2022-05-16 13:20:36 +0200775TEST_F(PacingControllerTest, RetransmissionPriority) {
Erik Språngd05edec2019-08-14 10:43:47 +0200776 uint32_t ssrc = 12345;
777 uint16_t sequence_number = 1234;
778 int64_t capture_time_ms = 45678;
779 int64_t capture_time_ms_retransmission = 56789;
Per Kjellanderbfd30652022-05-27 13:15:17 +0200780 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
781 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
Erik Språngd05edec2019-08-14 10:43:47 +0200782
783 // Due to the multiplicative factor we can send 5 packets during a send
784 // interval. (network capacity * multiplier / (8 bits per byte *
785 // (packet size * #send intervals per second)
786 const size_t packets_to_send_per_interval =
787 kTargetRate.bps() * kPaceMultiplier / (8 * 250 * 200);
Per Kjellanderbfd30652022-05-27 13:15:17 +0200788 pacer->ProcessPackets();
789 EXPECT_EQ(0u, pacer->QueueSizePackets());
Erik Språngd05edec2019-08-14 10:43:47 +0200790
791 // Alternate retransmissions and normal packets.
792 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
Per Kjellanderbfd30652022-05-27 13:15:17 +0200793 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, ssrc,
794 sequence_number++, capture_time_ms, 250));
795 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kRetransmission, ssrc,
796 sequence_number++,
797 capture_time_ms_retransmission, 250));
Erik Språngd05edec2019-08-14 10:43:47 +0200798 }
Per Kjellanderbfd30652022-05-27 13:15:17 +0200799 EXPECT_EQ(2 * packets_to_send_per_interval, pacer->QueueSizePackets());
Erik Språngd05edec2019-08-14 10:43:47 +0200800
801 // Expect all retransmissions to be sent out first despite having a later
802 // capture time.
803 EXPECT_CALL(callback_, SendPadding).Times(0);
804 EXPECT_CALL(callback_, SendPacket(_, _, _, false, _)).Times(0);
805 EXPECT_CALL(callback_,
806 SendPacket(ssrc, _, capture_time_ms_retransmission, true, _))
807 .Times(packets_to_send_per_interval);
808
Per Kjellanderbfd30652022-05-27 13:15:17 +0200809 while (pacer->QueueSizePackets() > packets_to_send_per_interval) {
810 AdvanceTimeUntil(pacer->NextSendTime());
811 pacer->ProcessPackets();
812 }
813 EXPECT_EQ(packets_to_send_per_interval, pacer->QueueSizePackets());
Erik Språngd05edec2019-08-14 10:43:47 +0200814
815 // Expect the remaining (non-retransmission) packets to be sent.
816 EXPECT_CALL(callback_, SendPadding).Times(0);
817 EXPECT_CALL(callback_, SendPacket(_, _, _, true, _)).Times(0);
818 EXPECT_CALL(callback_, SendPacket(ssrc, _, capture_time_ms, false, _))
819 .Times(packets_to_send_per_interval);
820
Per Kjellanderbfd30652022-05-27 13:15:17 +0200821 while (pacer->QueueSizePackets() > 0) {
822 AdvanceTimeUntil(pacer->NextSendTime());
823 pacer->ProcessPackets();
824 }
825 EXPECT_EQ(0u, pacer->QueueSizePackets());
Erik Språngd05edec2019-08-14 10:43:47 +0200826}
827
Erik Språng6aa5cea2022-05-16 13:20:36 +0200828TEST_F(PacingControllerTest, HighPrioDoesntAffectBudget) {
Erik Språngeb487992019-11-14 14:15:15 +0100829 const size_t kPacketSize = 250;
Erik Språngd05edec2019-08-14 10:43:47 +0200830 uint32_t ssrc = 12346;
831 uint16_t sequence_number = 1234;
832 int64_t capture_time_ms = 56789;
Per Kjellanderbfd30652022-05-27 13:15:17 +0200833 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
834 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
Erik Språngd05edec2019-08-14 10:43:47 +0200835
836 // As high prio packets doesn't affect the budget, we should be able to send
837 // a high number of them at once.
Erik Språngeb487992019-11-14 14:15:15 +0100838 const size_t kNumAudioPackets = 25;
839 for (size_t i = 0; i < kNumAudioPackets; ++i) {
Per Kjellanderbfd30652022-05-27 13:15:17 +0200840 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kAudio, ssrc,
841 sequence_number++, capture_time_ms, kPacketSize);
Erik Språngd05edec2019-08-14 10:43:47 +0200842 }
Per Kjellanderbfd30652022-05-27 13:15:17 +0200843 pacer->ProcessPackets();
Erik Språngd05edec2019-08-14 10:43:47 +0200844 // Low prio packets does affect the budget.
845 // Due to the multiplicative factor we can send 5 packets during a send
846 // interval. (network capacity * multiplier / (8 bits per byte *
847 // (packet size * #send intervals per second)
Erik Språngeb487992019-11-14 14:15:15 +0100848 const size_t kPacketsToSendPerInterval =
849 kTargetRate.bps() * kPaceMultiplier / (8 * kPacketSize * 200);
850 for (size_t i = 0; i < kPacketsToSendPerInterval; ++i) {
Per Kjellanderbfd30652022-05-27 13:15:17 +0200851 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc,
852 sequence_number++, clock_.TimeInMilliseconds(),
853 kPacketSize);
Erik Språngd05edec2019-08-14 10:43:47 +0200854 }
Erik Språngeb487992019-11-14 14:15:15 +0100855
856 // Send all packets and measure pace time.
857 Timestamp start_time = clock_.CurrentTime();
Per Kjellanderbfd30652022-05-27 13:15:17 +0200858 while (pacer->QueueSizePackets() > 0) {
859 AdvanceTimeUntil(pacer->NextSendTime());
860 pacer->ProcessPackets();
861 }
Erik Språngeb487992019-11-14 14:15:15 +0100862
863 // Measure pacing time. Expect only low-prio packets to affect this.
864 TimeDelta pacing_time = clock_.CurrentTime() - start_time;
865 TimeDelta expected_pacing_time =
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +0100866 DataSize::Bytes(kPacketsToSendPerInterval * kPacketSize) /
Erik Språngeb487992019-11-14 14:15:15 +0100867 (kTargetRate * kPaceMultiplier);
868 EXPECT_NEAR(pacing_time.us<double>(), expected_pacing_time.us<double>(),
Erik Språng6aa5cea2022-05-16 13:20:36 +0200869 PacingController::kMinSleepTime.us<double>());
Erik Språngd05edec2019-08-14 10:43:47 +0200870}
871
Erik Språng6aa5cea2022-05-16 13:20:36 +0200872TEST_F(PacingControllerTest, SendsOnlyPaddingWhenCongested) {
Erik Språngd05edec2019-08-14 10:43:47 +0200873 uint32_t ssrc = 202020;
874 uint16_t sequence_number = 1000;
875 int kPacketSize = 250;
Per Kjellanderbfd30652022-05-27 13:15:17 +0200876 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
877 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
Erik Språngd05edec2019-08-14 10:43:47 +0200878
Erik Språng66734372022-03-16 14:20:49 +0100879 // Send an initial packet so we have a last send time.
Per Kjellanderbfd30652022-05-27 13:15:17 +0200880 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc,
881 sequence_number++, clock_.TimeInMilliseconds(),
882 kPacketSize);
883 AdvanceTimeUntil(pacer->NextSendTime());
884 pacer->ProcessPackets();
Erik Språngd05edec2019-08-14 10:43:47 +0200885 ::testing::Mock::VerifyAndClearExpectations(&callback_);
Erik Språng66734372022-03-16 14:20:49 +0100886
887 // Set congested state, we should not send anything until the 500ms since
888 // last send time limit for keep-alives is triggered.
Erik Språngd05edec2019-08-14 10:43:47 +0200889 EXPECT_CALL(callback_, SendPacket).Times(0);
890 EXPECT_CALL(callback_, SendPadding).Times(0);
Per Kjellanderbfd30652022-05-27 13:15:17 +0200891 pacer->SetCongested(true);
Erik Språngd05edec2019-08-14 10:43:47 +0200892 size_t blocked_packets = 0;
893 int64_t expected_time_until_padding = 500;
894 while (expected_time_until_padding > 5) {
Per Kjellanderbfd30652022-05-27 13:15:17 +0200895 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, ssrc,
896 sequence_number++,
897 clock_.TimeInMilliseconds(), kPacketSize));
Erik Språngd05edec2019-08-14 10:43:47 +0200898 blocked_packets++;
899 clock_.AdvanceTimeMilliseconds(5);
Per Kjellanderbfd30652022-05-27 13:15:17 +0200900 pacer->ProcessPackets();
Erik Språngd05edec2019-08-14 10:43:47 +0200901 expected_time_until_padding -= 5;
902 }
Erik Språng66734372022-03-16 14:20:49 +0100903
Erik Språngd05edec2019-08-14 10:43:47 +0200904 ::testing::Mock::VerifyAndClearExpectations(&callback_);
905 EXPECT_CALL(callback_, SendPadding(1)).WillOnce(Return(1));
Erik Språngf5815fa2019-08-21 14:27:31 +0200906 EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
Erik Språngd05edec2019-08-14 10:43:47 +0200907 clock_.AdvanceTimeMilliseconds(5);
Per Kjellanderbfd30652022-05-27 13:15:17 +0200908 pacer->ProcessPackets();
909 EXPECT_EQ(blocked_packets, pacer->QueueSizePackets());
Erik Språngd05edec2019-08-14 10:43:47 +0200910}
911
Erik Språng6aa5cea2022-05-16 13:20:36 +0200912TEST_F(PacingControllerTest, DoesNotAllowOveruseAfterCongestion) {
Erik Språngd05edec2019-08-14 10:43:47 +0200913 uint32_t ssrc = 202020;
914 uint16_t seq_num = 1000;
915 int size = 1000;
916 auto now_ms = [this] { return clock_.TimeInMilliseconds(); };
Per Kjellanderbfd30652022-05-27 13:15:17 +0200917 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
918 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
Erik Språngd05edec2019-08-14 10:43:47 +0200919 EXPECT_CALL(callback_, SendPadding).Times(0);
920 // The pacing rate is low enough that the budget should not allow two packets
921 // to be sent in a row.
Per Kjellanderbfd30652022-05-27 13:15:17 +0200922 pacer->SetPacingRates(DataRate::BitsPerSec(400 * 8 * 1000 / 5),
923 DataRate::Zero());
Erik Språngd05edec2019-08-14 10:43:47 +0200924 // Not yet budget limited or congested, packet is sent.
Per Kjellanderbfd30652022-05-27 13:15:17 +0200925 pacer->EnqueuePacket(
926 BuildPacket(RtpPacketMediaType::kVideo, ssrc, seq_num++, now_ms(), size));
Erik Språngd05edec2019-08-14 10:43:47 +0200927 EXPECT_CALL(callback_, SendPacket).Times(1);
928 clock_.AdvanceTimeMilliseconds(5);
Per Kjellanderbfd30652022-05-27 13:15:17 +0200929 pacer->ProcessPackets();
Erik Språngd05edec2019-08-14 10:43:47 +0200930 // Packet blocked due to congestion.
Per Kjellanderbfd30652022-05-27 13:15:17 +0200931 pacer->SetCongested(true);
932 pacer->EnqueuePacket(
933 BuildPacket(RtpPacketMediaType::kVideo, ssrc, seq_num++, now_ms(), size));
Erik Språngd05edec2019-08-14 10:43:47 +0200934 EXPECT_CALL(callback_, SendPacket).Times(0);
935 clock_.AdvanceTimeMilliseconds(5);
Per Kjellanderbfd30652022-05-27 13:15:17 +0200936 pacer->ProcessPackets();
Erik Språngd05edec2019-08-14 10:43:47 +0200937 // Packet blocked due to congestion.
Per Kjellanderbfd30652022-05-27 13:15:17 +0200938 pacer->EnqueuePacket(
939 BuildPacket(RtpPacketMediaType::kVideo, ssrc, seq_num++, now_ms(), size));
Erik Språngd05edec2019-08-14 10:43:47 +0200940 EXPECT_CALL(callback_, SendPacket).Times(0);
941 clock_.AdvanceTimeMilliseconds(5);
Per Kjellanderbfd30652022-05-27 13:15:17 +0200942 pacer->ProcessPackets();
Erik Språngd05edec2019-08-14 10:43:47 +0200943 // Congestion removed and budget has recovered, packet is sent.
Per Kjellanderbfd30652022-05-27 13:15:17 +0200944 pacer->EnqueuePacket(
945 BuildPacket(RtpPacketMediaType::kVideo, ssrc, seq_num++, now_ms(), size));
Erik Språngd05edec2019-08-14 10:43:47 +0200946 EXPECT_CALL(callback_, SendPacket).Times(1);
947 clock_.AdvanceTimeMilliseconds(5);
Per Kjellanderbfd30652022-05-27 13:15:17 +0200948 pacer->SetCongested(false);
949 pacer->ProcessPackets();
Erik Språngd05edec2019-08-14 10:43:47 +0200950 // Should be blocked due to budget limitation as congestion has be removed.
Per Kjellanderbfd30652022-05-27 13:15:17 +0200951 pacer->EnqueuePacket(
952 BuildPacket(RtpPacketMediaType::kVideo, ssrc, seq_num++, now_ms(), size));
Erik Språngd05edec2019-08-14 10:43:47 +0200953 EXPECT_CALL(callback_, SendPacket).Times(0);
954 clock_.AdvanceTimeMilliseconds(5);
Per Kjellanderbfd30652022-05-27 13:15:17 +0200955 pacer->ProcessPackets();
Erik Språngd05edec2019-08-14 10:43:47 +0200956}
957
Erik Språng6aa5cea2022-05-16 13:20:36 +0200958TEST_F(PacingControllerTest, Pause) {
Erik Språngd05edec2019-08-14 10:43:47 +0200959 uint32_t ssrc_low_priority = 12345;
960 uint32_t ssrc = 12346;
961 uint32_t ssrc_high_priority = 12347;
962 uint16_t sequence_number = 1234;
Per Kjellanderbfd30652022-05-27 13:15:17 +0200963 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
964 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
Erik Språngd05edec2019-08-14 10:43:47 +0200965
Per Kjellanderbfd30652022-05-27 13:15:17 +0200966 EXPECT_TRUE(pacer->OldestPacketEnqueueTime().IsInfinite());
Erik Språngd05edec2019-08-14 10:43:47 +0200967
Per Kjellanderbfd30652022-05-27 13:15:17 +0200968 ConsumeInitialBudget(pacer.get());
Erik Språngd05edec2019-08-14 10:43:47 +0200969
Per Kjellanderbfd30652022-05-27 13:15:17 +0200970 pacer->Pause();
Erik Språngd05edec2019-08-14 10:43:47 +0200971
Erik Språngeb487992019-11-14 14:15:15 +0100972 int64_t capture_time_ms = clock_.TimeInMilliseconds();
973 const size_t packets_to_send_per_interval =
974 kTargetRate.bps() * kPaceMultiplier / (8 * 250 * 200);
Erik Språngd05edec2019-08-14 10:43:47 +0200975 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
Per Kjellanderbfd30652022-05-27 13:15:17 +0200976 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo,
977 ssrc_low_priority, sequence_number++,
978 capture_time_ms, 250));
979 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kRetransmission, ssrc,
980 sequence_number++, capture_time_ms, 250));
981 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kAudio,
982 ssrc_high_priority, sequence_number++,
983 capture_time_ms, 250));
Erik Språngd05edec2019-08-14 10:43:47 +0200984 }
985 clock_.AdvanceTimeMilliseconds(10000);
986 int64_t second_capture_time_ms = clock_.TimeInMilliseconds();
987 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
Per Kjellanderbfd30652022-05-27 13:15:17 +0200988 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo,
989 ssrc_low_priority, sequence_number++,
990 second_capture_time_ms, 250));
991 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kRetransmission, ssrc,
992 sequence_number++, second_capture_time_ms,
993 250));
994 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kAudio,
995 ssrc_high_priority, sequence_number++,
996 second_capture_time_ms, 250));
Erik Språngd05edec2019-08-14 10:43:47 +0200997 }
998
999 // Expect everything to be queued.
Per Kjellanderbfd30652022-05-27 13:15:17 +02001000 EXPECT_EQ(capture_time_ms, pacer->OldestPacketEnqueueTime().ms());
Erik Språngd05edec2019-08-14 10:43:47 +02001001
Erik Språngeb487992019-11-14 14:15:15 +01001002 // Process triggers keep-alive packet.
1003 EXPECT_CALL(callback_, SendPadding).WillOnce([](size_t padding) {
1004 return padding;
1005 });
Erik Språngf5815fa2019-08-21 14:27:31 +02001006 EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
Per Kjellanderbfd30652022-05-27 13:15:17 +02001007 pacer->ProcessPackets();
Erik Språngd05edec2019-08-14 10:43:47 +02001008
Erik Språngeb487992019-11-14 14:15:15 +01001009 // Verify no packets sent for the rest of the paused process interval.
Danil Chapovalov55284022020-02-07 14:53:52 +01001010 const TimeDelta kProcessInterval = TimeDelta::Millis(5);
Erik Språngeb487992019-11-14 14:15:15 +01001011 TimeDelta expected_time_until_send = PacingController::kPausedProcessInterval;
Erik Språngd05edec2019-08-14 10:43:47 +02001012 EXPECT_CALL(callback_, SendPadding).Times(0);
Erik Språngeb487992019-11-14 14:15:15 +01001013 while (expected_time_until_send >= kProcessInterval) {
Per Kjellanderbfd30652022-05-27 13:15:17 +02001014 pacer->ProcessPackets();
Erik Språngeb487992019-11-14 14:15:15 +01001015 clock_.AdvanceTime(kProcessInterval);
1016 expected_time_until_send -= kProcessInterval;
Erik Språngd05edec2019-08-14 10:43:47 +02001017 }
1018
Erik Språngeb487992019-11-14 14:15:15 +01001019 // New keep-alive packet.
Erik Språngd05edec2019-08-14 10:43:47 +02001020 ::testing::Mock::VerifyAndClearExpectations(&callback_);
Erik Språngeb487992019-11-14 14:15:15 +01001021 EXPECT_CALL(callback_, SendPadding).WillOnce([](size_t padding) {
1022 return padding;
1023 });
Erik Språngf5815fa2019-08-21 14:27:31 +02001024 EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
Erik Språngeb487992019-11-14 14:15:15 +01001025 clock_.AdvanceTime(kProcessInterval);
Per Kjellanderbfd30652022-05-27 13:15:17 +02001026 pacer->ProcessPackets();
Erik Språngd05edec2019-08-14 10:43:47 +02001027 ::testing::Mock::VerifyAndClearExpectations(&callback_);
1028
1029 // Expect high prio packets to come out first followed by normal
1030 // prio packets and low prio packets (all in capture order).
1031 {
1032 ::testing::InSequence sequence;
1033 EXPECT_CALL(callback_,
1034 SendPacket(ssrc_high_priority, _, capture_time_ms, _, _))
1035 .Times(packets_to_send_per_interval);
1036 EXPECT_CALL(callback_,
1037 SendPacket(ssrc_high_priority, _, second_capture_time_ms, _, _))
1038 .Times(packets_to_send_per_interval);
1039
1040 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
1041 EXPECT_CALL(callback_, SendPacket(ssrc, _, capture_time_ms, _, _))
1042 .Times(1);
1043 }
1044 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
1045 EXPECT_CALL(callback_, SendPacket(ssrc, _, second_capture_time_ms, _, _))
1046 .Times(1);
1047 }
1048 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
1049 EXPECT_CALL(callback_,
1050 SendPacket(ssrc_low_priority, _, capture_time_ms, _, _))
1051 .Times(1);
1052 }
1053 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
1054 EXPECT_CALL(callback_, SendPacket(ssrc_low_priority, _,
1055 second_capture_time_ms, _, _))
1056 .Times(1);
1057 }
1058 }
Per Kjellanderbfd30652022-05-27 13:15:17 +02001059 pacer->Resume();
1060 while (pacer->QueueSizePackets() > 0) {
1061 AdvanceTimeUntil(pacer->NextSendTime());
1062 pacer->ProcessPackets();
1063 }
Erik Språngd05edec2019-08-14 10:43:47 +02001064
Per Kjellanderbfd30652022-05-27 13:15:17 +02001065 EXPECT_TRUE(pacer->OldestPacketEnqueueTime().IsInfinite());
Erik Språngd05edec2019-08-14 10:43:47 +02001066}
1067
Erik Språng6aa5cea2022-05-16 13:20:36 +02001068TEST_F(PacingControllerTest, InactiveFromStart) {
Erik Språngeb487992019-11-14 14:15:15 +01001069 // Recreate the pacer without the inital time forwarding.
Per Kjellanderbfd30652022-05-27 13:15:17 +02001070 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
1071 pacer->SetProbingEnabled(false);
1072 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
Erik Språngeb487992019-11-14 14:15:15 +01001073
Erik Språngeb487992019-11-14 14:15:15 +01001074 // No packets sent, there should be no keep-alives sent either.
1075 EXPECT_CALL(callback_, SendPadding).Times(0);
1076 EXPECT_CALL(callback_, SendPacket).Times(0);
Per Kjellanderbfd30652022-05-27 13:15:17 +02001077 pacer->ProcessPackets();
Erik Språngeb487992019-11-14 14:15:15 +01001078
1079 const Timestamp start_time = clock_.CurrentTime();
1080
1081 // Determine the margin need so we can advance to the last possible moment
1082 // that will not cause a process event.
1083 const TimeDelta time_margin =
Erik Språng6aa5cea2022-05-16 13:20:36 +02001084 PacingController::kMinSleepTime + TimeDelta::Micros(1);
Erik Språngeb487992019-11-14 14:15:15 +01001085
Per Kjellanderbfd30652022-05-27 13:15:17 +02001086 EXPECT_EQ(pacer->NextSendTime() - start_time,
Erik Språngeb487992019-11-14 14:15:15 +01001087 PacingController::kPausedProcessInterval);
1088 clock_.AdvanceTime(PacingController::kPausedProcessInterval - time_margin);
Per Kjellanderbfd30652022-05-27 13:15:17 +02001089 pacer->ProcessPackets();
1090 EXPECT_EQ(pacer->NextSendTime() - start_time,
Erik Språngeb487992019-11-14 14:15:15 +01001091 PacingController::kPausedProcessInterval);
1092
1093 clock_.AdvanceTime(time_margin);
Per Kjellanderbfd30652022-05-27 13:15:17 +02001094 pacer->ProcessPackets();
1095 EXPECT_EQ(pacer->NextSendTime() - start_time,
Erik Språngeb487992019-11-14 14:15:15 +01001096 2 * PacingController::kPausedProcessInterval);
1097}
1098
Erik Språng6aa5cea2022-05-16 13:20:36 +02001099TEST_F(PacingControllerTest, QueueTimeGrowsOverTime) {
Erik Språngd05edec2019-08-14 10:43:47 +02001100 uint32_t ssrc = 12346;
1101 uint16_t sequence_number = 1234;
Per Kjellanderbfd30652022-05-27 13:15:17 +02001102 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
1103 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
1104 EXPECT_TRUE(pacer->OldestPacketEnqueueTime().IsInfinite());
Erik Språngd05edec2019-08-14 10:43:47 +02001105
Per Kjellanderbfd30652022-05-27 13:15:17 +02001106 pacer->SetPacingRates(DataRate::BitsPerSec(30000 * kPaceMultiplier),
1107 DataRate::Zero());
1108 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc,
1109 sequence_number, clock_.TimeInMilliseconds(), 1200);
Erik Språngd05edec2019-08-14 10:43:47 +02001110
1111 clock_.AdvanceTimeMilliseconds(500);
Jianhui Dai94457792021-12-07 19:34:36 +08001112 EXPECT_EQ(clock_.TimeInMilliseconds() - 500,
Per Kjellanderbfd30652022-05-27 13:15:17 +02001113 pacer->OldestPacketEnqueueTime().ms());
1114 pacer->ProcessPackets();
1115 EXPECT_TRUE(pacer->OldestPacketEnqueueTime().IsInfinite());
Erik Språngd05edec2019-08-14 10:43:47 +02001116}
1117
Erik Språng6aa5cea2022-05-16 13:20:36 +02001118TEST_F(PacingControllerTest, ProbingWithInsertedPackets) {
Erik Språngd05edec2019-08-14 10:43:47 +02001119 const size_t kPacketSize = 1200;
1120 const int kInitialBitrateBps = 300000;
1121 uint32_t ssrc = 12346;
1122 uint16_t sequence_number = 1234;
1123
1124 PacingControllerProbing packet_sender;
Per Kjellanderbfd30652022-05-27 13:15:17 +02001125 auto pacer =
1126 std::make_unique<PacingController>(&clock_, &packet_sender, trials_);
Per Kjellander88af2032022-05-16 19:58:40 +02001127 std::vector<ProbeClusterConfig> probe_clusters = {
1128 {.at_time = clock_.CurrentTime(),
1129 .target_data_rate = kFirstClusterRate,
1130 .target_duration = TimeDelta::Millis(15),
1131 .target_probe_count = 5,
1132 .id = 0},
1133 {.at_time = clock_.CurrentTime(),
1134 .target_data_rate = kSecondClusterRate,
1135 .target_duration = TimeDelta::Millis(15),
1136 .target_probe_count = 5,
1137 .id = 1}};
Per Kjellanderbfd30652022-05-27 13:15:17 +02001138 pacer->CreateProbeClusters(probe_clusters);
1139 pacer->SetPacingRates(
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +01001140 DataRate::BitsPerSec(kInitialBitrateBps * kPaceMultiplier),
1141 DataRate::Zero());
Erik Språngd05edec2019-08-14 10:43:47 +02001142
1143 for (int i = 0; i < 10; ++i) {
Per Kjellanderbfd30652022-05-27 13:15:17 +02001144 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, ssrc,
1145 sequence_number++,
1146 clock_.TimeInMilliseconds(), kPacketSize));
Erik Språngd05edec2019-08-14 10:43:47 +02001147 }
1148
1149 int64_t start = clock_.TimeInMilliseconds();
1150 while (packet_sender.packets_sent() < 5) {
Per Kjellanderbfd30652022-05-27 13:15:17 +02001151 AdvanceTimeUntil(pacer->NextSendTime());
1152 pacer->ProcessPackets();
Erik Språngd05edec2019-08-14 10:43:47 +02001153 }
1154 int packets_sent = packet_sender.packets_sent();
1155 // Validate first cluster bitrate. Note that we have to account for number
1156 // of intervals and hence (packets_sent - 1) on the first cluster.
1157 EXPECT_NEAR((packets_sent - 1) * kPacketSize * 8000 /
1158 (clock_.TimeInMilliseconds() - start),
1159 kFirstClusterRate.bps(), kProbingErrorMargin.bps());
Erik Språng279f3702020-10-13 21:55:07 +02001160 // Probing always starts with a small padding packet.
1161 EXPECT_EQ(1, packet_sender.padding_sent());
Erik Språngd05edec2019-08-14 10:43:47 +02001162
Per Kjellanderbfd30652022-05-27 13:15:17 +02001163 AdvanceTimeUntil(pacer->NextSendTime());
Erik Språngd05edec2019-08-14 10:43:47 +02001164 start = clock_.TimeInMilliseconds();
1165 while (packet_sender.packets_sent() < 10) {
Per Kjellanderbfd30652022-05-27 13:15:17 +02001166 AdvanceTimeUntil(pacer->NextSendTime());
1167 pacer->ProcessPackets();
Erik Språngd05edec2019-08-14 10:43:47 +02001168 }
1169 packets_sent = packet_sender.packets_sent() - packets_sent;
1170 // Validate second cluster bitrate.
1171 EXPECT_NEAR((packets_sent - 1) * kPacketSize * 8000 /
1172 (clock_.TimeInMilliseconds() - start),
1173 kSecondClusterRate.bps(), kProbingErrorMargin.bps());
1174}
1175
Erik Språng6aa5cea2022-05-16 13:20:36 +02001176TEST_F(PacingControllerTest, SkipsProbesWhenProcessIntervalTooLarge) {
Erik Språngb210eeb2019-11-05 11:21:48 +01001177 const size_t kPacketSize = 1200;
1178 const int kInitialBitrateBps = 300000;
Erik Språngb9d38092020-07-17 12:06:12 +02001179 const uint32_t ssrc = 12346;
1180 const int kProbeClusterId = 3;
Erik Språngb210eeb2019-11-05 11:21:48 +01001181
Per Kjellanderbfd30652022-05-27 13:15:17 +02001182 uint16_t sequence_number = 1234;
Erik Språngb210eeb2019-11-05 11:21:48 +01001183
Per Kjellanderbfd30652022-05-27 13:15:17 +02001184 PacingControllerProbing packet_sender;
Erik Språngb9d38092020-07-17 12:06:12 +02001185
Per Kjellanderbfd30652022-05-27 13:15:17 +02001186 const test::ExplicitKeyValueConfig trials(
1187 "WebRTC-Bwe-ProbingBehavior/max_probe_delay:2ms/");
1188 auto pacer =
1189 std::make_unique<PacingController>(&clock_, &packet_sender, trials);
1190 pacer->SetPacingRates(
1191 DataRate::BitsPerSec(kInitialBitrateBps * kPaceMultiplier),
1192 DataRate::BitsPerSec(kInitialBitrateBps));
Erik Språngb9d38092020-07-17 12:06:12 +02001193
Per Kjellanderbfd30652022-05-27 13:15:17 +02001194 for (int i = 0; i < 10; ++i) {
1195 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, ssrc,
1196 sequence_number++,
1197 clock_.TimeInMilliseconds(), kPacketSize));
1198 }
1199 while (pacer->QueueSizePackets() > 0) {
1200 AdvanceTimeUntil(pacer->NextSendTime());
1201 pacer->ProcessPackets();
1202 }
Erik Språngb9d38092020-07-17 12:06:12 +02001203
1204 // Probe at a very high rate.
Per Kjellander88af2032022-05-16 19:58:40 +02001205 std::vector<ProbeClusterConfig> probe_clusters = {
1206 {.at_time = clock_.CurrentTime(),
1207 .target_data_rate = DataRate::KilobitsPerSec(10000), // 10 Mbps,
1208 .target_duration = TimeDelta::Millis(15),
1209 .target_probe_count = 5,
1210 .id = kProbeClusterId}};
Per Kjellanderbfd30652022-05-27 13:15:17 +02001211 pacer->CreateProbeClusters(probe_clusters);
Per Kjellander88af2032022-05-16 19:58:40 +02001212
Erik Språngb9d38092020-07-17 12:06:12 +02001213 // We need one packet to start the probe.
Per Kjellanderbfd30652022-05-27 13:15:17 +02001214 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, ssrc,
1215 sequence_number++,
1216 clock_.TimeInMilliseconds(), kPacketSize));
Erik Språngb9d38092020-07-17 12:06:12 +02001217 const int packets_sent_before_probe = packet_sender.packets_sent();
Per Kjellanderbfd30652022-05-27 13:15:17 +02001218 AdvanceTimeUntil(pacer->NextSendTime());
1219 pacer->ProcessPackets();
Erik Språngb9d38092020-07-17 12:06:12 +02001220 EXPECT_EQ(packet_sender.packets_sent(), packets_sent_before_probe + 1);
1221
1222 // Figure out how long between probe packets.
1223 Timestamp start_time = clock_.CurrentTime();
Per Kjellanderbfd30652022-05-27 13:15:17 +02001224 AdvanceTimeUntil(pacer->NextSendTime());
Erik Språngb9d38092020-07-17 12:06:12 +02001225 TimeDelta time_between_probes = clock_.CurrentTime() - start_time;
1226 // Advance that distance again + 1ms.
1227 clock_.AdvanceTime(time_between_probes);
1228
1229 // Send second probe packet.
Per Kjellanderbfd30652022-05-27 13:15:17 +02001230 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, ssrc,
1231 sequence_number++,
1232 clock_.TimeInMilliseconds(), kPacketSize));
1233 pacer->ProcessPackets();
Erik Språngb9d38092020-07-17 12:06:12 +02001234 EXPECT_EQ(packet_sender.packets_sent(), packets_sent_before_probe + 2);
1235 PacedPacketInfo last_pacing_info = packet_sender.last_pacing_info();
1236 EXPECT_EQ(last_pacing_info.probe_cluster_id, kProbeClusterId);
1237
1238 // We're exactly where we should be for the next probe.
1239 const Timestamp probe_time = clock_.CurrentTime();
Per Kjellanderbfd30652022-05-27 13:15:17 +02001240 EXPECT_EQ(pacer->NextSendTime(), clock_.CurrentTime());
Erik Språngb9d38092020-07-17 12:06:12 +02001241
1242 BitrateProberConfig probing_config(&trials);
1243 EXPECT_GT(probing_config.max_probe_delay.Get(), TimeDelta::Zero());
1244 // Advance to within max probe delay, should still return same target.
1245 clock_.AdvanceTime(probing_config.max_probe_delay.Get());
Per Kjellanderbfd30652022-05-27 13:15:17 +02001246 EXPECT_EQ(pacer->NextSendTime(), probe_time);
Erik Språngb9d38092020-07-17 12:06:12 +02001247
1248 // Too high probe delay, drop it!
1249 clock_.AdvanceTime(TimeDelta::Micros(1));
1250
1251 int packets_sent_before_timeout = packet_sender.total_packets_sent();
Per Kjellander88af2032022-05-16 19:58:40 +02001252 // Expected next process time is unchanged, but calling should not
1253 // generate new packets.
Per Kjellanderbfd30652022-05-27 13:15:17 +02001254 EXPECT_EQ(pacer->NextSendTime(), probe_time);
1255 pacer->ProcessPackets();
Per Kjellander88af2032022-05-16 19:58:40 +02001256 EXPECT_EQ(packet_sender.total_packets_sent(), packets_sent_before_timeout);
Erik Språngb9d38092020-07-17 12:06:12 +02001257
Per Kjellander88af2032022-05-16 19:58:40 +02001258 // Next packet sent is not part of probe.
Per Kjellanderbfd30652022-05-27 13:15:17 +02001259 AdvanceTimeUntil(pacer->NextSendTime());
1260 pacer->ProcessPackets();
Per Kjellander88af2032022-05-16 19:58:40 +02001261 const int expected_probe_id = PacedPacketInfo::kNotAProbe;
1262 EXPECT_EQ(packet_sender.last_pacing_info().probe_cluster_id,
1263 expected_probe_id);
Erik Språngb210eeb2019-11-05 11:21:48 +01001264}
1265
Erik Språng6aa5cea2022-05-16 13:20:36 +02001266TEST_F(PacingControllerTest, ProbingWithPaddingSupport) {
Erik Språngd05edec2019-08-14 10:43:47 +02001267 const size_t kPacketSize = 1200;
1268 const int kInitialBitrateBps = 300000;
1269 uint32_t ssrc = 12346;
1270 uint16_t sequence_number = 1234;
1271
1272 PacingControllerProbing packet_sender;
Per Kjellanderbfd30652022-05-27 13:15:17 +02001273 auto pacer =
1274 std::make_unique<PacingController>(&clock_, &packet_sender, trials_);
Per Kjellander88af2032022-05-16 19:58:40 +02001275 std::vector<ProbeClusterConfig> probe_clusters = {
1276 {.at_time = clock_.CurrentTime(),
1277 .target_data_rate = kFirstClusterRate,
1278 .target_duration = TimeDelta::Millis(15),
1279 .target_probe_count = 5,
1280 .id = 0}};
Per Kjellanderbfd30652022-05-27 13:15:17 +02001281 pacer->CreateProbeClusters(probe_clusters);
Per Kjellander88af2032022-05-16 19:58:40 +02001282
Per Kjellanderbfd30652022-05-27 13:15:17 +02001283 pacer->SetPacingRates(
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +01001284 DataRate::BitsPerSec(kInitialBitrateBps * kPaceMultiplier),
1285 DataRate::Zero());
Erik Språngd05edec2019-08-14 10:43:47 +02001286
1287 for (int i = 0; i < 3; ++i) {
Per Kjellanderbfd30652022-05-27 13:15:17 +02001288 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, ssrc,
1289 sequence_number++,
1290 clock_.TimeInMilliseconds(), kPacketSize));
Erik Språngd05edec2019-08-14 10:43:47 +02001291 }
1292
1293 int64_t start = clock_.TimeInMilliseconds();
1294 int process_count = 0;
1295 while (process_count < 5) {
Per Kjellanderbfd30652022-05-27 13:15:17 +02001296 AdvanceTimeUntil(pacer->NextSendTime());
1297 pacer->ProcessPackets();
Erik Språngd05edec2019-08-14 10:43:47 +02001298 ++process_count;
1299 }
1300 int packets_sent = packet_sender.packets_sent();
1301 int padding_sent = packet_sender.padding_sent();
1302 EXPECT_GT(packets_sent, 0);
1303 EXPECT_GT(padding_sent, 0);
1304 // Note that the number of intervals here for kPacketSize is
1305 // packets_sent due to padding in the same cluster.
1306 EXPECT_NEAR((packets_sent * kPacketSize * 8000 + padding_sent) /
1307 (clock_.TimeInMilliseconds() - start),
1308 kFirstClusterRate.bps(), kProbingErrorMargin.bps());
1309}
1310
Erik Språng6aa5cea2022-05-16 13:20:36 +02001311TEST_F(PacingControllerTest, PaddingOveruse) {
Erik Språngd05edec2019-08-14 10:43:47 +02001312 uint32_t ssrc = 12346;
1313 uint16_t sequence_number = 1234;
1314 const size_t kPacketSize = 1200;
Per Kjellanderbfd30652022-05-27 13:15:17 +02001315 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
1316 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
Erik Språngd05edec2019-08-14 10:43:47 +02001317
Erik Språngeb487992019-11-14 14:15:15 +01001318 // Initially no padding rate.
Per Kjellanderbfd30652022-05-27 13:15:17 +02001319 pacer->ProcessPackets();
1320 pacer->SetPacingRates(DataRate::BitsPerSec(60000 * kPaceMultiplier),
1321 DataRate::Zero());
Erik Språngd05edec2019-08-14 10:43:47 +02001322
Per Kjellanderbfd30652022-05-27 13:15:17 +02001323 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc,
1324 sequence_number++, clock_.TimeInMilliseconds(),
1325 kPacketSize);
1326 pacer->ProcessPackets();
Erik Språngd05edec2019-08-14 10:43:47 +02001327
1328 // Add 30kbit padding. When increasing budget, media budget will increase from
1329 // negative (overuse) while padding budget will increase from 0.
1330 clock_.AdvanceTimeMilliseconds(5);
Per Kjellanderbfd30652022-05-27 13:15:17 +02001331 pacer->SetPacingRates(DataRate::BitsPerSec(60000 * kPaceMultiplier),
1332 DataRate::BitsPerSec(30000));
Erik Språngd05edec2019-08-14 10:43:47 +02001333
Per Kjellanderbfd30652022-05-27 13:15:17 +02001334 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc,
1335 sequence_number++, clock_.TimeInMilliseconds(),
1336 kPacketSize);
1337 EXPECT_LT(TimeDelta::Millis(5), pacer->ExpectedQueueTime());
Erik Språngd05edec2019-08-14 10:43:47 +02001338 // Don't send padding if queue is non-empty, even if padding budget > 0.
1339 EXPECT_CALL(callback_, SendPadding).Times(0);
Per Kjellanderbfd30652022-05-27 13:15:17 +02001340 AdvanceTimeUntil(pacer->NextSendTime());
1341 pacer->ProcessPackets();
Erik Språngd05edec2019-08-14 10:43:47 +02001342}
1343
Erik Språng6aa5cea2022-05-16 13:20:36 +02001344TEST_F(PacingControllerTest, ProbeClusterId) {
Erik Språngd05edec2019-08-14 10:43:47 +02001345 MockPacketSender callback;
Erik Språngd05edec2019-08-14 10:43:47 +02001346 uint32_t ssrc = 12346;
1347 uint16_t sequence_number = 1234;
1348 const size_t kPacketSize = 1200;
1349
Per Kjellanderbfd30652022-05-27 13:15:17 +02001350 auto pacer = std::make_unique<PacingController>(&clock_, &callback, trials_);
1351 pacer->CreateProbeClusters(std::vector<ProbeClusterConfig>(
1352 {{.at_time = clock_.CurrentTime(),
1353 .target_data_rate = kFirstClusterRate,
1354 .target_duration = TimeDelta::Millis(15),
1355 .target_probe_count = 5,
1356 .id = 0},
1357 {.at_time = clock_.CurrentTime(),
1358 .target_data_rate = kSecondClusterRate,
1359 .target_duration = TimeDelta::Millis(15),
1360 .target_probe_count = 5,
1361 .id = 1}}));
1362 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
1363 pacer->SetProbingEnabled(true);
Erik Språngd05edec2019-08-14 10:43:47 +02001364 for (int i = 0; i < 10; ++i) {
Per Kjellanderbfd30652022-05-27 13:15:17 +02001365 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, ssrc,
1366 sequence_number++,
1367 clock_.TimeInMilliseconds(), kPacketSize));
Erik Språngd05edec2019-08-14 10:43:47 +02001368 }
1369
1370 // First probing cluster.
Erik Språngf5815fa2019-08-21 14:27:31 +02001371 EXPECT_CALL(callback,
Erik Språnged1fb192020-06-30 11:53:37 +00001372 SendPacket(_, Field(&PacedPacketInfo::probe_cluster_id, 0)))
Erik Språngf5815fa2019-08-21 14:27:31 +02001373 .Times(5);
Erik Språngd05edec2019-08-14 10:43:47 +02001374
1375 for (int i = 0; i < 5; ++i) {
Per Kjellanderbfd30652022-05-27 13:15:17 +02001376 AdvanceTimeUntil(pacer->NextSendTime());
1377 pacer->ProcessPackets();
Erik Språngd05edec2019-08-14 10:43:47 +02001378 }
1379
1380 // Second probing cluster.
Erik Språngf5815fa2019-08-21 14:27:31 +02001381 EXPECT_CALL(callback,
Erik Språnged1fb192020-06-30 11:53:37 +00001382 SendPacket(_, Field(&PacedPacketInfo::probe_cluster_id, 1)))
Erik Språngf5815fa2019-08-21 14:27:31 +02001383 .Times(5);
Erik Språngd05edec2019-08-14 10:43:47 +02001384
1385 for (int i = 0; i < 5; ++i) {
Per Kjellanderbfd30652022-05-27 13:15:17 +02001386 AdvanceTimeUntil(pacer->NextSendTime());
1387 pacer->ProcessPackets();
Erik Språngd05edec2019-08-14 10:43:47 +02001388 }
1389
1390 // Needed for the Field comparer below.
1391 const int kNotAProbe = PacedPacketInfo::kNotAProbe;
1392 // No more probing packets.
Erik Språngf5815fa2019-08-21 14:27:31 +02001393 EXPECT_CALL(callback, GeneratePadding).WillOnce([&](DataSize padding_size) {
1394 std::vector<std::unique_ptr<RtpPacketToSend>> padding_packets;
1395 padding_packets.emplace_back(
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001396 BuildPacket(RtpPacketMediaType::kPadding, ssrc, sequence_number++,
Erik Språngf5815fa2019-08-21 14:27:31 +02001397 clock_.TimeInMilliseconds(), padding_size.bytes()));
1398 return padding_packets;
1399 });
Erik Språngeb487992019-11-14 14:15:15 +01001400 bool non_probe_packet_seen = false;
Erik Språnged1fb192020-06-30 11:53:37 +00001401 EXPECT_CALL(callback, SendPacket)
Erik Språngeb487992019-11-14 14:15:15 +01001402 .WillOnce([&](std::unique_ptr<RtpPacketToSend> packet,
1403 const PacedPacketInfo& cluster_info) {
1404 EXPECT_EQ(cluster_info.probe_cluster_id, kNotAProbe);
1405 non_probe_packet_seen = true;
1406 });
1407 while (!non_probe_packet_seen) {
Per Kjellanderbfd30652022-05-27 13:15:17 +02001408 AdvanceTimeUntil(pacer->NextSendTime());
1409 pacer->ProcessPackets();
Erik Språngeb487992019-11-14 14:15:15 +01001410 }
Erik Språngd05edec2019-08-14 10:43:47 +02001411}
1412
Erik Språng6aa5cea2022-05-16 13:20:36 +02001413TEST_F(PacingControllerTest, OwnedPacketPrioritizedOnType) {
Erik Språngd05edec2019-08-14 10:43:47 +02001414 MockPacketSender callback;
Per Kjellanderbfd30652022-05-27 13:15:17 +02001415 uint32_t ssrc = 123;
1416
1417 auto pacer = std::make_unique<PacingController>(&clock_, &callback, trials_);
1418 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
Erik Språngd05edec2019-08-14 10:43:47 +02001419
1420 // Insert a packet of each type, from low to high priority. Since priority
1421 // is weighted higher than insert order, these should come out of the pacer
1422 // in backwards order with the exception of FEC and Video.
Per Kjellanderbfd30652022-05-27 13:15:17 +02001423
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001424 for (RtpPacketMediaType type :
1425 {RtpPacketMediaType::kPadding,
1426 RtpPacketMediaType::kForwardErrorCorrection, RtpPacketMediaType::kVideo,
1427 RtpPacketMediaType::kRetransmission, RtpPacketMediaType::kAudio}) {
Per Kjellanderbfd30652022-05-27 13:15:17 +02001428 pacer->EnqueuePacket(BuildPacket(type, ++ssrc, /*sequence_number=*/123,
1429 clock_.TimeInMilliseconds(),
1430 /*size=*/150));
Erik Språngd05edec2019-08-14 10:43:47 +02001431 }
1432
1433 ::testing::InSequence seq;
Per Kjellanderbfd30652022-05-27 13:15:17 +02001434 EXPECT_CALL(callback,
1435 SendPacket(Pointee(Property(&RtpPacketToSend::packet_type,
1436 RtpPacketMediaType::kAudio)),
1437 _));
1438 EXPECT_CALL(callback,
1439 SendPacket(Pointee(Property(&RtpPacketToSend::packet_type,
1440 RtpPacketMediaType::kRetransmission)),
1441 _));
Erik Språngd05edec2019-08-14 10:43:47 +02001442
1443 // FEC and video actually have the same priority, so will come out in
1444 // insertion order.
Erik Språngd05edec2019-08-14 10:43:47 +02001445 EXPECT_CALL(
1446 callback,
Per Kjellanderbfd30652022-05-27 13:15:17 +02001447 SendPacket(Pointee(Property(&RtpPacketToSend::packet_type,
1448 RtpPacketMediaType::kForwardErrorCorrection)),
1449 _));
1450 EXPECT_CALL(callback,
1451 SendPacket(Pointee(Property(&RtpPacketToSend::packet_type,
1452 RtpPacketMediaType::kVideo)),
1453 _));
Erik Språngd05edec2019-08-14 10:43:47 +02001454
Per Kjellanderbfd30652022-05-27 13:15:17 +02001455 EXPECT_CALL(callback,
1456 SendPacket(Pointee(Property(&RtpPacketToSend::packet_type,
1457 RtpPacketMediaType::kPadding)),
1458 _));
Erik Språngd05edec2019-08-14 10:43:47 +02001459
Per Kjellanderbfd30652022-05-27 13:15:17 +02001460 while (pacer->QueueSizePackets() > 0) {
1461 AdvanceTimeUntil(pacer->NextSendTime());
1462 pacer->ProcessPackets();
1463 }
Erik Språngd05edec2019-08-14 10:43:47 +02001464}
Erik Språng78c82a42019-10-03 18:46:04 +02001465
Erik Språng6aa5cea2022-05-16 13:20:36 +02001466TEST_F(PacingControllerTest, SmallFirstProbePacket) {
Erik Språng78c82a42019-10-03 18:46:04 +02001467 MockPacketSender callback;
Per Kjellanderbfd30652022-05-27 13:15:17 +02001468 auto pacer = std::make_unique<PacingController>(&clock_, &callback, trials_);
Per Kjellander88af2032022-05-16 19:58:40 +02001469 std::vector<ProbeClusterConfig> probe_clusters = {
1470 {.at_time = clock_.CurrentTime(),
1471 .target_data_rate = kFirstClusterRate,
1472 .target_duration = TimeDelta::Millis(15),
1473 .target_probe_count = 5,
1474 .id = 0}};
Per Kjellanderbfd30652022-05-27 13:15:17 +02001475 pacer->CreateProbeClusters(probe_clusters);
Per Kjellander88af2032022-05-16 19:58:40 +02001476
Per Kjellanderbfd30652022-05-27 13:15:17 +02001477 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
Erik Språng78c82a42019-10-03 18:46:04 +02001478
1479 // Add high prio media.
Per Kjellanderbfd30652022-05-27 13:15:17 +02001480 pacer->EnqueuePacket(audio_.BuildNextPacket(234));
Erik Språng78c82a42019-10-03 18:46:04 +02001481
1482 // Expect small padding packet to be requested.
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +01001483 EXPECT_CALL(callback, GeneratePadding(DataSize::Bytes(1)))
Erik Språng78c82a42019-10-03 18:46:04 +02001484 .WillOnce([&](DataSize padding_size) {
1485 std::vector<std::unique_ptr<RtpPacketToSend>> padding_packets;
1486 padding_packets.emplace_back(
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001487 BuildPacket(RtpPacketMediaType::kPadding, kAudioSsrc, 1,
Erik Språng78c82a42019-10-03 18:46:04 +02001488 clock_.TimeInMilliseconds(), 1));
1489 return padding_packets;
1490 });
1491
1492 size_t packets_sent = 0;
1493 bool media_seen = false;
Erik Språnged1fb192020-06-30 11:53:37 +00001494 EXPECT_CALL(callback, SendPacket)
Erik Språng78c82a42019-10-03 18:46:04 +02001495 .Times(::testing::AnyNumber())
1496 .WillRepeatedly([&](std::unique_ptr<RtpPacketToSend> packet,
1497 const PacedPacketInfo& cluster_info) {
1498 if (packets_sent == 0) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001499 EXPECT_EQ(packet->packet_type(), RtpPacketMediaType::kPadding);
Erik Språng78c82a42019-10-03 18:46:04 +02001500 } else {
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001501 if (packet->packet_type() == RtpPacketMediaType::kAudio) {
Erik Språng78c82a42019-10-03 18:46:04 +02001502 media_seen = true;
1503 }
1504 }
1505 packets_sent++;
1506 });
1507 while (!media_seen) {
Per Kjellanderbfd30652022-05-27 13:15:17 +02001508 pacer->ProcessPackets();
Erik Språng78c82a42019-10-03 18:46:04 +02001509 clock_.AdvanceTimeMilliseconds(5);
1510 }
1511}
Erik Språngeb487992019-11-14 14:15:15 +01001512
Erik Språng6aa5cea2022-05-16 13:20:36 +02001513TEST_F(PacingControllerTest, TaskLate) {
Erik Språngeb487992019-11-14 14:15:15 +01001514 // Set a low send rate to more easily test timing issues.
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +01001515 DataRate kSendRate = DataRate::KilobitsPerSec(30);
Per Kjellanderbfd30652022-05-27 13:15:17 +02001516 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
1517 pacer->SetPacingRates(kSendRate, DataRate::Zero());
Erik Språngeb487992019-11-14 14:15:15 +01001518
1519 // Add four packets of equal size and priority.
Per Kjellanderbfd30652022-05-27 13:15:17 +02001520 pacer->EnqueuePacket(video_.BuildNextPacket(1000));
1521 pacer->EnqueuePacket(video_.BuildNextPacket(1000));
1522 pacer->EnqueuePacket(video_.BuildNextPacket(1000));
1523 pacer->EnqueuePacket(video_.BuildNextPacket(1000));
Erik Språngeb487992019-11-14 14:15:15 +01001524
1525 // Process packets, only first should be sent.
1526 EXPECT_CALL(callback_, SendPacket).Times(1);
Per Kjellanderbfd30652022-05-27 13:15:17 +02001527 pacer->ProcessPackets();
Erik Språngeb487992019-11-14 14:15:15 +01001528
Per Kjellanderbfd30652022-05-27 13:15:17 +02001529 Timestamp next_send_time = pacer->NextSendTime();
Erik Språngb571ff42020-04-04 17:20:37 +02001530 // Determine time between packets (ca 62ms)
Erik Språngeb487992019-11-14 14:15:15 +01001531 const TimeDelta time_between_packets = next_send_time - clock_.CurrentTime();
1532
1533 // Simulate a late process call, executed just before we allow sending the
1534 // fourth packet.
Erik Språngb571ff42020-04-04 17:20:37 +02001535 const TimeDelta kOffset = TimeDelta::Millis(1);
1536 clock_.AdvanceTime((time_between_packets * 3) - kOffset);
Erik Språngeb487992019-11-14 14:15:15 +01001537
1538 EXPECT_CALL(callback_, SendPacket).Times(2);
Per Kjellanderbfd30652022-05-27 13:15:17 +02001539 pacer->ProcessPackets();
Erik Språngeb487992019-11-14 14:15:15 +01001540
Erik Språngb571ff42020-04-04 17:20:37 +02001541 // Check that next scheduled send time is in ca 1ms.
Per Kjellanderbfd30652022-05-27 13:15:17 +02001542 next_send_time = pacer->NextSendTime();
Erik Språngb571ff42020-04-04 17:20:37 +02001543 const TimeDelta time_left = next_send_time - clock_.CurrentTime();
1544 EXPECT_EQ(time_left.RoundTo(TimeDelta::Millis(1)), kOffset);
Erik Språngeb487992019-11-14 14:15:15 +01001545
Erik Språngb571ff42020-04-04 17:20:37 +02001546 clock_.AdvanceTime(time_left);
1547 EXPECT_CALL(callback_, SendPacket);
Per Kjellanderbfd30652022-05-27 13:15:17 +02001548 pacer->ProcessPackets();
Erik Språngeb487992019-11-14 14:15:15 +01001549}
1550
Erik Språng6aa5cea2022-05-16 13:20:36 +02001551TEST_F(PacingControllerTest, NoProbingWhilePaused) {
Erik Språngae100292019-12-17 17:49:49 +01001552 uint32_t ssrc = 12345;
1553 uint16_t sequence_number = 1234;
Per Kjellanderbfd30652022-05-27 13:15:17 +02001554 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
1555 pacer->SetProbingEnabled(true);
1556 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
1557 pacer->CreateProbeClusters(std::vector<ProbeClusterConfig>(
1558 {{.at_time = clock_.CurrentTime(),
1559 .target_data_rate = kFirstClusterRate,
1560 .target_duration = TimeDelta::Millis(15),
1561 .target_probe_count = 5,
1562 .id = 0},
1563 {.at_time = clock_.CurrentTime(),
1564 .target_data_rate = kSecondClusterRate,
1565 .target_duration = TimeDelta::Millis(15),
1566 .target_probe_count = 5,
1567 .id = 1}}));
Erik Språngae100292019-12-17 17:49:49 +01001568
1569 // Send at least one packet so probing can initate.
Per Kjellanderbfd30652022-05-27 13:15:17 +02001570 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc,
1571 sequence_number, clock_.TimeInMilliseconds(), 250);
1572 while (pacer->QueueSizePackets() > 0) {
1573 AdvanceTimeUntil(pacer->NextSendTime());
1574 pacer->ProcessPackets();
1575 }
Erik Språngae100292019-12-17 17:49:49 +01001576
1577 // Trigger probing.
Per Kjellander88af2032022-05-16 19:58:40 +02001578 std::vector<ProbeClusterConfig> probe_clusters = {
1579 {.at_time = clock_.CurrentTime(),
1580 .target_data_rate = DataRate::KilobitsPerSec(10000), // 10 Mbps.
1581 .target_duration = TimeDelta::Millis(15),
1582 .target_probe_count = 5,
1583 .id = 3}};
Per Kjellanderbfd30652022-05-27 13:15:17 +02001584 pacer->CreateProbeClusters(probe_clusters);
Erik Språngae100292019-12-17 17:49:49 +01001585
1586 // Time to next send time should be small.
Per Kjellanderbfd30652022-05-27 13:15:17 +02001587 EXPECT_LT(pacer->NextSendTime() - clock_.CurrentTime(),
Erik Språngae100292019-12-17 17:49:49 +01001588 PacingController::kPausedProcessInterval);
1589
1590 // Pause pacer, time to next send time should now be the pause process
1591 // interval.
Per Kjellanderbfd30652022-05-27 13:15:17 +02001592 pacer->Pause();
Erik Språngae100292019-12-17 17:49:49 +01001593
Per Kjellanderbfd30652022-05-27 13:15:17 +02001594 EXPECT_EQ(pacer->NextSendTime() - clock_.CurrentTime(),
Erik Språngae100292019-12-17 17:49:49 +01001595 PacingController::kPausedProcessInterval);
1596}
1597
Erik Språng6aa5cea2022-05-16 13:20:36 +02001598TEST_F(PacingControllerTest, AudioNotPacedEvenWhenAccountedFor) {
Erik Språng9cb58d52020-03-28 17:15:54 +01001599 const uint32_t kSsrc = 12345;
1600 uint16_t sequence_number = 1234;
1601 const size_t kPacketSize = 123;
Per Kjellanderbfd30652022-05-27 13:15:17 +02001602 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
Erik Språng9cb58d52020-03-28 17:15:54 +01001603
1604 // Account for audio - so that audio packets can cause pushback on other
1605 // types such as video. Audio packet should still be immediated passed
1606 // through though ("WebRTC-Pacer-BlockAudio" needs to be enabled in order
1607 // to pace audio packets).
Per Kjellanderbfd30652022-05-27 13:15:17 +02001608 pacer->SetAccountForAudioPackets(true);
Erik Språng9cb58d52020-03-28 17:15:54 +01001609
1610 // Set pacing rate to 1 packet/s, no padding.
Per Kjellanderbfd30652022-05-27 13:15:17 +02001611 pacer->SetPacingRates(DataSize::Bytes(kPacketSize) / TimeDelta::Seconds(1),
1612 DataRate::Zero());
Erik Språng9cb58d52020-03-28 17:15:54 +01001613
1614 // Add and send an audio packet.
Per Kjellanderbfd30652022-05-27 13:15:17 +02001615 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kAudio, kSsrc,
1616 sequence_number++, clock_.TimeInMilliseconds(),
1617 kPacketSize);
1618 pacer->ProcessPackets();
Erik Språng9cb58d52020-03-28 17:15:54 +01001619
1620 // Advance time, add another audio packet and process. It should be sent
1621 // immediately.
1622 clock_.AdvanceTimeMilliseconds(5);
Per Kjellanderbfd30652022-05-27 13:15:17 +02001623 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kAudio, kSsrc,
1624 sequence_number++, clock_.TimeInMilliseconds(),
1625 kPacketSize);
1626 pacer->ProcessPackets();
Erik Språng9cb58d52020-03-28 17:15:54 +01001627}
1628
Erik Språng6aa5cea2022-05-16 13:20:36 +02001629TEST_F(PacingControllerTest,
Erik Språngb571ff42020-04-04 17:20:37 +02001630 PaddingResumesAfterSaturationEvenWithConcurrentAudio) {
Erik Språng0920d5d2020-03-30 17:14:08 +02001631 const uint32_t kSsrc = 12345;
1632 const DataRate kPacingDataRate = DataRate::KilobitsPerSec(125);
1633 const DataRate kPaddingDataRate = DataRate::KilobitsPerSec(100);
1634 const TimeDelta kMaxBufferInTime = TimeDelta::Millis(500);
1635 const DataSize kPacketSize = DataSize::Bytes(130);
1636 const TimeDelta kAudioPacketInterval = TimeDelta::Millis(20);
1637
1638 // In this test, we fist send a burst of video in order to saturate the
1639 // padding debt level.
1640 // We then proceed to send audio at a bitrate that is slightly lower than
1641 // the padding rate, meaning there will be a period with audio but no
1642 // padding sent while the debt is draining, then audio and padding will
1643 // be interlieved.
1644
1645 // Verify both with and without accounting for audio.
1646 for (bool account_for_audio : {false, true}) {
1647 uint16_t sequence_number = 1234;
1648 MockPacketSender callback;
Erik Språnged1fb192020-06-30 11:53:37 +00001649 EXPECT_CALL(callback, SendPacket).Times(::testing::AnyNumber());
Per Kjellanderbfd30652022-05-27 13:15:17 +02001650 auto pacer =
1651 std::make_unique<PacingController>(&clock_, &callback, trials_);
1652 pacer->SetAccountForAudioPackets(account_for_audio);
Erik Språng0920d5d2020-03-30 17:14:08 +02001653
1654 // First, saturate the padding budget.
Per Kjellanderbfd30652022-05-27 13:15:17 +02001655 pacer->SetPacingRates(kPacingDataRate, kPaddingDataRate);
Erik Språng0920d5d2020-03-30 17:14:08 +02001656
1657 const TimeDelta kPaddingSaturationTime =
1658 kMaxBufferInTime * kPaddingDataRate /
1659 (kPacingDataRate - kPaddingDataRate);
1660 const DataSize kVideoToSend = kPaddingSaturationTime * kPacingDataRate;
1661 const DataSize kVideoPacketSize = DataSize::Bytes(1200);
1662 DataSize video_sent = DataSize::Zero();
1663 while (video_sent < kVideoToSend) {
Per Kjellanderbfd30652022-05-27 13:15:17 +02001664 pacer->EnqueuePacket(
Erik Språng0920d5d2020-03-30 17:14:08 +02001665 BuildPacket(RtpPacketMediaType::kVideo, kSsrc, sequence_number++,
1666 clock_.TimeInMilliseconds(), kVideoPacketSize.bytes()));
1667 video_sent += kVideoPacketSize;
1668 }
Per Kjellanderbfd30652022-05-27 13:15:17 +02001669 while (pacer->QueueSizePackets() > 0) {
1670 AdvanceTimeUntil(pacer->NextSendTime());
1671 pacer->ProcessPackets();
1672 }
Erik Språng0920d5d2020-03-30 17:14:08 +02001673
1674 // Add a stream of audio packets at a rate slightly lower than the padding
1675 // rate, once the padding debt is paid off we expect padding to be
1676 // generated.
Per Kjellanderbfd30652022-05-27 13:15:17 +02001677 pacer->SetPacingRates(kPacingDataRate, kPaddingDataRate);
Erik Språng0920d5d2020-03-30 17:14:08 +02001678 bool padding_seen = false;
1679 EXPECT_CALL(callback, GeneratePadding).WillOnce([&](DataSize padding_size) {
1680 padding_seen = true;
1681 std::vector<std::unique_ptr<RtpPacketToSend>> padding_packets;
1682 padding_packets.emplace_back(
1683 BuildPacket(RtpPacketMediaType::kPadding, kSsrc, sequence_number++,
1684 clock_.TimeInMilliseconds(), padding_size.bytes()));
1685 return padding_packets;
1686 });
1687
1688 Timestamp start_time = clock_.CurrentTime();
1689 Timestamp last_audio_time = start_time;
1690 while (!padding_seen) {
1691 Timestamp now = clock_.CurrentTime();
Per Kjellanderbfd30652022-05-27 13:15:17 +02001692 Timestamp next_send_time = pacer->NextSendTime();
Erik Språng0920d5d2020-03-30 17:14:08 +02001693 TimeDelta sleep_time =
1694 std::min(next_send_time, last_audio_time + kAudioPacketInterval) -
1695 now;
1696 clock_.AdvanceTime(sleep_time);
1697 while (clock_.CurrentTime() >= last_audio_time + kAudioPacketInterval) {
Per Kjellanderbfd30652022-05-27 13:15:17 +02001698 pacer->EnqueuePacket(
Erik Språng0920d5d2020-03-30 17:14:08 +02001699 BuildPacket(RtpPacketMediaType::kAudio, kSsrc, sequence_number++,
1700 clock_.TimeInMilliseconds(), kPacketSize.bytes()));
1701 last_audio_time += kAudioPacketInterval;
1702 }
Per Kjellanderbfd30652022-05-27 13:15:17 +02001703 pacer->ProcessPackets();
Erik Språng0920d5d2020-03-30 17:14:08 +02001704 }
1705
1706 // Verify how long it took to drain the padding debt. Allow 2% error margin.
1707 const DataRate kAudioDataRate = kPacketSize / kAudioPacketInterval;
1708 const TimeDelta expected_drain_time =
1709 account_for_audio ? (kMaxBufferInTime * kPaddingDataRate /
1710 (kPaddingDataRate - kAudioDataRate))
1711 : kMaxBufferInTime;
1712 const TimeDelta actual_drain_time = clock_.CurrentTime() - start_time;
1713 EXPECT_NEAR(actual_drain_time.ms(), expected_drain_time.ms(),
1714 expected_drain_time.ms() * 0.02)
1715 << " where account_for_audio = "
1716 << (account_for_audio ? "true" : "false");
1717 }
1718}
1719
Erik Språngdf9e51a2022-06-10 11:42:15 +02001720TEST_F(PacingControllerTest, AccountsForAudioEnqueueTime) {
Erik Språngb571ff42020-04-04 17:20:37 +02001721 const uint32_t kSsrc = 12345;
1722 const DataRate kPacingDataRate = DataRate::KilobitsPerSec(125);
1723 const DataRate kPaddingDataRate = DataRate::Zero();
1724 const DataSize kPacketSize = DataSize::Bytes(130);
1725 const TimeDelta kPacketPacingTime = kPacketSize / kPacingDataRate;
Erik Språngb571ff42020-04-04 17:20:37 +02001726 uint32_t sequnce_number = 1;
Per Kjellanderbfd30652022-05-27 13:15:17 +02001727 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
Erik Språngb571ff42020-04-04 17:20:37 +02001728 // Audio not paced, but still accounted for in budget.
Per Kjellanderbfd30652022-05-27 13:15:17 +02001729 pacer->SetAccountForAudioPackets(true);
1730 pacer->SetPacingRates(kPacingDataRate, kPaddingDataRate);
Erik Språngb571ff42020-04-04 17:20:37 +02001731
1732 // Enqueue two audio packets, advance clock to where one packet
1733 // should have drained the buffer already, has they been sent
1734 // immediately.
Per Kjellanderbfd30652022-05-27 13:15:17 +02001735 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kAudio, kSsrc,
1736 sequnce_number++, clock_.TimeInMilliseconds(),
1737 kPacketSize.bytes());
1738 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kAudio, kSsrc,
1739 sequnce_number++, clock_.TimeInMilliseconds(),
1740 kPacketSize.bytes());
Erik Språngb571ff42020-04-04 17:20:37 +02001741 clock_.AdvanceTime(kPacketPacingTime);
1742 // Now process and make sure both packets were sent.
Per Kjellanderbfd30652022-05-27 13:15:17 +02001743 pacer->ProcessPackets();
Erik Språngb571ff42020-04-04 17:20:37 +02001744 ::testing::Mock::VerifyAndClearExpectations(&callback_);
1745
1746 // Add a video packet. I can't be sent until debt from audio
1747 // packets have been drained.
Per Kjellanderbfd30652022-05-27 13:15:17 +02001748 pacer->EnqueuePacket(
1749 BuildPacket(RtpPacketMediaType::kVideo, kSsrc + 1, sequnce_number++,
1750 clock_.TimeInMilliseconds(), kPacketSize.bytes()));
1751 EXPECT_EQ(pacer->NextSendTime() - clock_.CurrentTime(), kPacketPacingTime);
Erik Språngb571ff42020-04-04 17:20:37 +02001752}
1753
Erik Språng6aa5cea2022-05-16 13:20:36 +02001754TEST_F(PacingControllerTest, NextSendTimeAccountsForPadding) {
Erik Språngbe152f52020-04-06 16:30:23 +02001755 const uint32_t kSsrc = 12345;
1756 const DataRate kPacingDataRate = DataRate::KilobitsPerSec(125);
1757 const DataSize kPacketSize = DataSize::Bytes(130);
1758 const TimeDelta kPacketPacingTime = kPacketSize / kPacingDataRate;
Erik Språngbe152f52020-04-06 16:30:23 +02001759 uint32_t sequnce_number = 1;
Per Kjellanderbfd30652022-05-27 13:15:17 +02001760 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
Erik Språngbe152f52020-04-06 16:30:23 +02001761
1762 // Start with no padding.
Per Kjellanderbfd30652022-05-27 13:15:17 +02001763 pacer->SetPacingRates(kPacingDataRate, DataRate::Zero());
Erik Språngbe152f52020-04-06 16:30:23 +02001764
1765 // Send a single packet.
Per Kjellanderbfd30652022-05-27 13:15:17 +02001766 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, kSsrc,
1767 sequnce_number++, clock_.TimeInMilliseconds(),
1768 kPacketSize.bytes());
1769 pacer->ProcessPackets();
Erik Språngbe152f52020-04-06 16:30:23 +02001770 ::testing::Mock::VerifyAndClearExpectations(&callback_);
1771
1772 // With current conditions, no need to wake until next keep-alive.
Per Kjellanderbfd30652022-05-27 13:15:17 +02001773 EXPECT_EQ(pacer->NextSendTime() - clock_.CurrentTime(),
Erik Språngbe152f52020-04-06 16:30:23 +02001774 PacingController::kPausedProcessInterval);
1775
1776 // Enqueue a new packet, that can't be sent until previous buffer has
1777 // drained.
Per Kjellanderbfd30652022-05-27 13:15:17 +02001778 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, kSsrc,
1779 sequnce_number++, clock_.TimeInMilliseconds(),
1780 kPacketSize.bytes());
1781 EXPECT_EQ(pacer->NextSendTime() - clock_.CurrentTime(), kPacketPacingTime);
Erik Språngbe152f52020-04-06 16:30:23 +02001782 clock_.AdvanceTime(kPacketPacingTime);
Per Kjellanderbfd30652022-05-27 13:15:17 +02001783 pacer->ProcessPackets();
Erik Språngbe152f52020-04-06 16:30:23 +02001784 ::testing::Mock::VerifyAndClearExpectations(&callback_);
1785
1786 // With current conditions, again no need to wake until next keep-alive.
Per Kjellanderbfd30652022-05-27 13:15:17 +02001787 EXPECT_EQ(pacer->NextSendTime() - clock_.CurrentTime(),
Erik Språngbe152f52020-04-06 16:30:23 +02001788 PacingController::kPausedProcessInterval);
1789
1790 // Set a non-zero padding rate. Padding also can't be sent until
1791 // previous debt has cleared. Since padding was disabled before, there
1792 // currently is no padding debt.
Per Kjellanderbfd30652022-05-27 13:15:17 +02001793 pacer->SetPacingRates(kPacingDataRate, kPacingDataRate / 2);
1794 EXPECT_EQ(pacer->NextSendTime() - clock_.CurrentTime(), kPacketPacingTime);
Erik Språngbe152f52020-04-06 16:30:23 +02001795
1796 // Advance time, expect padding.
1797 EXPECT_CALL(callback_, SendPadding).WillOnce(Return(kPacketSize.bytes()));
1798 clock_.AdvanceTime(kPacketPacingTime);
Per Kjellanderbfd30652022-05-27 13:15:17 +02001799 pacer->ProcessPackets();
Erik Språngbe152f52020-04-06 16:30:23 +02001800 ::testing::Mock::VerifyAndClearExpectations(&callback_);
1801
1802 // Since padding rate is half of pacing rate, next time we can send
1803 // padding is double the packet pacing time.
Per Kjellanderbfd30652022-05-27 13:15:17 +02001804 EXPECT_EQ(pacer->NextSendTime() - clock_.CurrentTime(),
Erik Språngbe152f52020-04-06 16:30:23 +02001805 kPacketPacingTime * 2);
1806
1807 // Insert a packet to be sent, this take precedence again.
Per Kjellanderbfd30652022-05-27 13:15:17 +02001808 pacer->EnqueuePacket(
1809 BuildPacket(RtpPacketMediaType::kVideo, kSsrc, sequnce_number++,
1810 clock_.TimeInMilliseconds(), kPacketSize.bytes()));
1811 EXPECT_EQ(pacer->NextSendTime() - clock_.CurrentTime(), kPacketPacingTime);
Erik Språngbe152f52020-04-06 16:30:23 +02001812}
1813
Erik Språng6aa5cea2022-05-16 13:20:36 +02001814TEST_F(PacingControllerTest, PaddingTargetAccountsForPaddingRate) {
Erik Språngc52e6272022-07-07 12:41:57 +02001815 // Target size for a padding packet is 5ms * padding rate.
1816 const TimeDelta kPaddingTarget = TimeDelta::Millis(5);
Erik Språnge486a7b2022-03-15 15:13:25 +01001817 srand(0);
1818 // Need to initialize PacingController after we initialize clock.
Erik Språngc52e6272022-07-07 12:41:57 +02001819 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
Erik Språng9acc18d2020-04-16 19:41:07 +02001820
1821 const uint32_t kSsrc = 12345;
1822 const DataRate kPacingDataRate = DataRate::KilobitsPerSec(125);
1823 const DataSize kPacketSize = DataSize::Bytes(130);
1824
1825 uint32_t sequnce_number = 1;
1826
1827 // Start with pacing and padding rate equal.
Per Kjellanderbfd30652022-05-27 13:15:17 +02001828 pacer->SetPacingRates(kPacingDataRate, kPacingDataRate);
Erik Språng9acc18d2020-04-16 19:41:07 +02001829
1830 // Send a single packet.
Per Kjellanderbfd30652022-05-27 13:15:17 +02001831 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, kSsrc,
1832 sequnce_number++, clock_.TimeInMilliseconds(),
1833 kPacketSize.bytes());
1834 AdvanceTimeUntil(pacer->NextSendTime());
1835 pacer->ProcessPackets();
Erik Språng9acc18d2020-04-16 19:41:07 +02001836 ::testing::Mock::VerifyAndClearExpectations(&callback_);
1837
1838 size_t expected_padding_target_bytes =
1839 (kPaddingTarget * kPacingDataRate).bytes();
1840 EXPECT_CALL(callback_, SendPadding(expected_padding_target_bytes))
1841 .WillOnce(Return(expected_padding_target_bytes));
Per Kjellanderbfd30652022-05-27 13:15:17 +02001842 AdvanceTimeUntil(pacer->NextSendTime());
1843 pacer->ProcessPackets();
Erik Språng9acc18d2020-04-16 19:41:07 +02001844
1845 // Half the padding rate - expect half the padding target.
Per Kjellanderbfd30652022-05-27 13:15:17 +02001846 pacer->SetPacingRates(kPacingDataRate, kPacingDataRate / 2);
Erik Språng9acc18d2020-04-16 19:41:07 +02001847 EXPECT_CALL(callback_, SendPadding(expected_padding_target_bytes / 2))
1848 .WillOnce(Return(expected_padding_target_bytes / 2));
Per Kjellanderbfd30652022-05-27 13:15:17 +02001849 AdvanceTimeUntil(pacer->NextSendTime());
1850 pacer->ProcessPackets();
Erik Språng9acc18d2020-04-16 19:41:07 +02001851}
1852
Erik Språng6aa5cea2022-05-16 13:20:36 +02001853TEST_F(PacingControllerTest, SendsFecPackets) {
Erik Språng1d50cb62020-07-02 17:41:32 +02001854 const uint32_t kSsrc = 12345;
1855 const uint32_t kFlexSsrc = 54321;
1856 uint16_t sequence_number = 1234;
1857 uint16_t flexfec_sequence_number = 4321;
1858 const size_t kPacketSize = 123;
Per Kjellanderbfd30652022-05-27 13:15:17 +02001859 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
Erik Språng1d50cb62020-07-02 17:41:32 +02001860
1861 // Set pacing rate to 1000 packet/s, no padding.
Per Kjellanderbfd30652022-05-27 13:15:17 +02001862 pacer->SetPacingRates(
Erik Språng1d50cb62020-07-02 17:41:32 +02001863 DataSize::Bytes(1000 * kPacketSize) / TimeDelta::Seconds(1),
1864 DataRate::Zero());
1865
1866 int64_t now = clock_.TimeInMilliseconds();
Per Kjellanderbfd30652022-05-27 13:15:17 +02001867 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, kSsrc,
1868 sequence_number, now, kPacketSize));
Erik Språng1d50cb62020-07-02 17:41:32 +02001869 EXPECT_CALL(callback_, SendPacket(kSsrc, sequence_number, now, false, false));
1870 EXPECT_CALL(callback_, FetchFec).WillOnce([&]() {
1871 EXPECT_CALL(callback_, SendPacket(kFlexSsrc, flexfec_sequence_number, now,
1872 false, false));
1873 EXPECT_CALL(callback_, FetchFec);
1874 std::vector<std::unique_ptr<RtpPacketToSend>> fec_packets;
1875 fec_packets.push_back(
1876 BuildPacket(RtpPacketMediaType::kForwardErrorCorrection, kFlexSsrc,
1877 flexfec_sequence_number, now, kPacketSize));
1878 return fec_packets;
1879 });
Per Kjellanderbfd30652022-05-27 13:15:17 +02001880 AdvanceTimeUntil(pacer->NextSendTime());
1881 pacer->ProcessPackets();
1882 AdvanceTimeUntil(pacer->NextSendTime());
1883 pacer->ProcessPackets();
Erik Språng1d50cb62020-07-02 17:41:32 +02001884}
1885
Erik Språng6aa5cea2022-05-16 13:20:36 +02001886TEST_F(PacingControllerTest, GapInPacingDoesntAccumulateBudget) {
Erik Språng41bbc3d2021-10-05 10:17:39 +02001887 const uint32_t kSsrc = 12345;
1888 uint16_t sequence_number = 1234;
1889 const DataSize kPackeSize = DataSize::Bytes(250);
1890 const TimeDelta kPacketSendTime = TimeDelta::Millis(15);
Per Kjellanderbfd30652022-05-27 13:15:17 +02001891 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
Erik Språng41bbc3d2021-10-05 10:17:39 +02001892
Per Kjellanderbfd30652022-05-27 13:15:17 +02001893 pacer->SetPacingRates(kPackeSize / kPacketSendTime,
1894 /*padding_rate=*/DataRate::Zero());
Erik Språng41bbc3d2021-10-05 10:17:39 +02001895
1896 // Send an initial packet.
Per Kjellanderbfd30652022-05-27 13:15:17 +02001897 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, kSsrc,
1898 sequence_number++, clock_.TimeInMilliseconds(),
1899 kPackeSize.bytes());
1900 pacer->ProcessPackets();
Erik Språng41bbc3d2021-10-05 10:17:39 +02001901 ::testing::Mock::VerifyAndClearExpectations(&callback_);
1902
1903 // Advance time kPacketSendTime past where the media debt should be 0.
1904 clock_.AdvanceTime(2 * kPacketSendTime);
1905
1906 // Enqueue two new packets. Expect only one to be sent one ProcessPackets().
Per Kjellanderbfd30652022-05-27 13:15:17 +02001907 pacer->EnqueuePacket(
1908 BuildPacket(RtpPacketMediaType::kVideo, kSsrc, sequence_number + 1,
1909 clock_.TimeInMilliseconds(), kPackeSize.bytes()));
1910 pacer->EnqueuePacket(
1911 BuildPacket(RtpPacketMediaType::kVideo, kSsrc, sequence_number + 2,
1912 clock_.TimeInMilliseconds(), kPackeSize.bytes()));
Erik Språng41bbc3d2021-10-05 10:17:39 +02001913 EXPECT_CALL(callback_, SendPacket(kSsrc, sequence_number + 1,
1914 clock_.TimeInMilliseconds(), false, false));
Per Kjellanderbfd30652022-05-27 13:15:17 +02001915 pacer->ProcessPackets();
Erik Språng41bbc3d2021-10-05 10:17:39 +02001916}
1917
Erik Språng6aa5cea2022-05-16 13:20:36 +02001918TEST_F(PacingControllerTest, HandlesSubMicrosecondSendIntervals) {
Erik Språngb844dd82022-04-22 12:18:17 +02001919 static constexpr DataSize kPacketSize = DataSize::Bytes(1);
1920 static constexpr TimeDelta kPacketSendTime = TimeDelta::Micros(1);
Per Kjellanderbfd30652022-05-27 13:15:17 +02001921 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
Erik Språngb844dd82022-04-22 12:18:17 +02001922
1923 // Set pacing rate such that a packet is sent in 0.5us.
Per Kjellanderbfd30652022-05-27 13:15:17 +02001924 pacer->SetPacingRates(/*pacing_rate=*/2 * kPacketSize / kPacketSendTime,
1925 /*padding_rate=*/DataRate::Zero());
Erik Språngb844dd82022-04-22 12:18:17 +02001926
1927 // Enqueue three packets, the first two should be sent immediately - the third
1928 // should cause a non-zero delta to the next process time.
1929 EXPECT_CALL(callback_, SendPacket).Times(2);
1930 for (int i = 0; i < 3; ++i) {
Per Kjellanderbfd30652022-05-27 13:15:17 +02001931 pacer->EnqueuePacket(BuildPacket(
1932 RtpPacketMediaType::kVideo, /*ssrc=*/12345, /*sequence_number=*/i,
1933 clock_.TimeInMilliseconds(), kPacketSize.bytes()));
Erik Språngb844dd82022-04-22 12:18:17 +02001934 }
Per Kjellanderbfd30652022-05-27 13:15:17 +02001935 pacer->ProcessPackets();
Erik Språngb844dd82022-04-22 12:18:17 +02001936
Per Kjellanderbfd30652022-05-27 13:15:17 +02001937 EXPECT_GT(pacer->NextSendTime(), clock_.CurrentTime());
Erik Språngb844dd82022-04-22 12:18:17 +02001938}
1939
Erik Språng6aa5cea2022-05-16 13:20:36 +02001940TEST_F(PacingControllerTest, HandlesSubMicrosecondPaddingInterval) {
Erik Språngb844dd82022-04-22 12:18:17 +02001941 static constexpr DataSize kPacketSize = DataSize::Bytes(1);
1942 static constexpr TimeDelta kPacketSendTime = TimeDelta::Micros(1);
Per Kjellanderbfd30652022-05-27 13:15:17 +02001943 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
Erik Språngb844dd82022-04-22 12:18:17 +02001944
1945 // Set both pacing and padding rates to 1 byte per 0.5us.
Per Kjellanderbfd30652022-05-27 13:15:17 +02001946 pacer->SetPacingRates(/*pacing_rate=*/2 * kPacketSize / kPacketSendTime,
1947 /*padding_rate=*/2 * kPacketSize / kPacketSendTime);
Erik Språngb844dd82022-04-22 12:18:17 +02001948
1949 // Enqueue and send one packet.
1950 EXPECT_CALL(callback_, SendPacket);
Per Kjellanderbfd30652022-05-27 13:15:17 +02001951 pacer->EnqueuePacket(BuildPacket(
1952 RtpPacketMediaType::kVideo, /*ssrc=*/12345, /*sequence_number=*/1234,
1953 clock_.TimeInMilliseconds(), kPacketSize.bytes()));
1954 pacer->ProcessPackets();
Erik Språngb844dd82022-04-22 12:18:17 +02001955
1956 // The padding debt is now 1 byte, and the pacing time for that is lower than
1957 // the precision of a TimeStamp tick. Make sure the pacer still indicates a
1958 // non-zero sleep time is needed until the next process.
Per Kjellanderbfd30652022-05-27 13:15:17 +02001959 EXPECT_GT(pacer->NextSendTime(), clock_.CurrentTime());
Erik Språngb844dd82022-04-22 12:18:17 +02001960}
1961
Per Kjellander8d847f02022-06-01 20:21:58 +02001962TEST_F(PacingControllerTest, SendsPacketsInBurstImmediately) {
1963 constexpr TimeDelta kMaxDelay = TimeDelta::Millis(20);
1964 PacingController pacer(&clock_, &callback_, trials_);
1965 pacer.SetSendBurstInterval(kMaxDelay);
1966 pacer.SetPacingRates(DataRate::BytesPerSec(10000), DataRate::Zero());
1967
1968 // Max allowed send burst size is 100000*20/1000) = 200byte
1969 pacer.EnqueuePacket(video_.BuildNextPacket(100));
1970 pacer.EnqueuePacket(video_.BuildNextPacket(100));
1971 pacer.EnqueuePacket(video_.BuildNextPacket(100));
1972 pacer.ProcessPackets();
1973 EXPECT_EQ(pacer.QueueSizePackets(), 1u);
1974 EXPECT_EQ(pacer.NextSendTime(), clock_.CurrentTime() + kMaxDelay);
1975
1976 AdvanceTimeUntil(pacer.NextSendTime());
1977 pacer.ProcessPackets();
1978 EXPECT_EQ(pacer.QueueSizePackets(), 0u);
1979}
1980
1981TEST_F(PacingControllerTest, SendsPacketsInBurstEvenIfNotEnqueedAtSameTime) {
1982 constexpr TimeDelta kMaxDelay = TimeDelta::Millis(20);
1983 PacingController pacer(&clock_, &callback_, trials_);
1984 pacer.SetSendBurstInterval(kMaxDelay);
1985 pacer.SetPacingRates(DataRate::BytesPerSec(10000), DataRate::Zero());
1986 pacer.EnqueuePacket(video_.BuildNextPacket(200));
1987 EXPECT_EQ(pacer.NextSendTime(), clock_.CurrentTime());
1988 pacer.ProcessPackets();
1989 clock_.AdvanceTime(TimeDelta::Millis(1));
1990 pacer.EnqueuePacket(video_.BuildNextPacket(200));
1991 EXPECT_EQ(pacer.NextSendTime(), clock_.CurrentTime());
1992 pacer.ProcessPackets();
1993 EXPECT_EQ(pacer.QueueSizePackets(), 0u);
1994}
1995
1996TEST_F(PacingControllerTest, RespectsTargetRateWhenSendingPacketsInBursts) {
1997 PacingController pacer(&clock_, &callback_, trials_);
1998 pacer.SetSendBurstInterval(TimeDelta::Millis(20));
1999 pacer.SetAccountForAudioPackets(true);
2000 pacer.SetPacingRates(DataRate::KilobitsPerSec(1000), DataRate::Zero());
2001 Timestamp start_time = clock_.CurrentTime();
2002 // Inject 100 packets, with size 1000bytes over 100ms.
2003 // Expect only 1Mbps / (8*1000) / 10 = 12 packets to be sent.
2004 // Packets are sent in burst. Each burst is then 3 packets * 1000bytes at
2005 // 1Mbits = 24ms long. Thus, expect 4 bursts.
2006 EXPECT_CALL(callback_, SendPacket).Times(12);
2007 int number_of_bursts = 0;
2008 while (clock_.CurrentTime() < start_time + TimeDelta::Millis(100)) {
2009 pacer.EnqueuePacket(video_.BuildNextPacket(1000));
2010 pacer.EnqueuePacket(video_.BuildNextPacket(1000));
2011 pacer.EnqueuePacket(video_.BuildNextPacket(1000));
2012 pacer.EnqueuePacket(video_.BuildNextPacket(1000));
2013 pacer.EnqueuePacket(video_.BuildNextPacket(1000));
2014 if (pacer.NextSendTime() <= clock_.CurrentTime()) {
2015 pacer.ProcessPackets();
2016 ++number_of_bursts;
2017 }
2018 clock_.AdvanceTime(TimeDelta::Millis(5));
2019 }
2020 EXPECT_EQ(pacer.QueueSizePackets(), 88u);
2021 EXPECT_EQ(number_of_bursts, 4);
2022}
2023
Erik Språngdf9e51a2022-06-10 11:42:15 +02002024TEST_F(PacingControllerTest, RespectsQueueTimeLimit) {
2025 static constexpr DataSize kPacketSize = DataSize::Bytes(100);
2026 static constexpr DataRate kNominalPacingRate = DataRate::KilobitsPerSec(200);
2027 static constexpr TimeDelta kPacketPacingTime =
2028 kPacketSize / kNominalPacingRate;
2029 static constexpr TimeDelta kQueueTimeLimit = TimeDelta::Millis(1000);
2030
2031 PacingController pacer(&clock_, &callback_, trials_);
2032 pacer.SetPacingRates(kNominalPacingRate, /*padding_rate=*/DataRate::Zero());
2033 pacer.SetQueueTimeLimit(kQueueTimeLimit);
2034
2035 // Fill pacer up to queue time limit.
2036 static constexpr int kNumPackets = kQueueTimeLimit / kPacketPacingTime;
2037 for (int i = 0; i < kNumPackets; ++i) {
2038 pacer.EnqueuePacket(video_.BuildNextPacket(kPacketSize.bytes()));
2039 }
2040 EXPECT_EQ(pacer.ExpectedQueueTime(), kQueueTimeLimit);
2041 EXPECT_EQ(pacer.pacing_rate(), kNominalPacingRate);
2042
2043 // Double the amount of packets in the queue, the queue time limit should
2044 // effectively double the pacing rate in response.
2045 for (int i = 0; i < kNumPackets; ++i) {
2046 pacer.EnqueuePacket(video_.BuildNextPacket(kPacketSize.bytes()));
2047 }
2048 EXPECT_EQ(pacer.ExpectedQueueTime(), kQueueTimeLimit);
2049 EXPECT_EQ(pacer.pacing_rate(), 2 * kNominalPacingRate);
2050
2051 // Send all the packets, should take as long as the queue time limit.
2052 Timestamp start_time = clock_.CurrentTime();
2053 while (pacer.QueueSizePackets() > 0) {
2054 AdvanceTimeUntil(pacer.NextSendTime());
2055 pacer.ProcessPackets();
2056 }
2057 EXPECT_EQ(clock_.CurrentTime() - start_time, kQueueTimeLimit);
2058
2059 // We're back in a normal state - pacing rate should be back to previous
2060 // levels.
2061 EXPECT_EQ(pacer.pacing_rate(), kNominalPacingRate);
2062}
2063
Per Kjellanderbfd30652022-05-27 13:15:17 +02002064} // namespace
Erik Språngd05edec2019-08-14 10:43:47 +02002065} // namespace webrtc