blob: ade71cd5f5f41e14053f94afba520bb84fa93079 [file] [log] [blame]
Erik Språngd05edec2019-08-14 08:43:471/*
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 17:58:4020#include "api/transport/network_types.h"
Erik Språngd05edec2019-08-14 08:43:4721#include "api/units/data_rate.h"
Per Kjellander88af2032022-05-16 17:58:4022#include "api/units/time_delta.h"
Per Kffdecdc2023-02-22 12:53:2723#include "api/units/timestamp.h"
Erik Språngd05edec2019-08-14 08:43:4724#include "modules/pacing/packet_router.h"
25#include "system_wrappers/include/clock.h"
Erik Språngb9d38092020-07-17 10:06:1226#include "test/explicit_key_value_config.h"
Erik Språngd05edec2019-08-14 08:43:4727#include "test/gmock.h"
28#include "test/gtest.h"
29
30using ::testing::_;
Erik Språnge03862b2022-11-29 08:44:5131using ::testing::AnyNumber;
Erik Språngd05edec2019-08-14 08:43:4732using ::testing::Field;
33using ::testing::Pointee;
34using ::testing::Property;
35using ::testing::Return;
Erik Språng1a080962022-03-17 14:16:5936using ::testing::WithoutArgs;
Erik Språngd05edec2019-08-14 08:43:4737
Per Kjellanderbfd30652022-05-27 11:15:1738using ::webrtc::test::ExplicitKeyValueConfig;
39
Erik Språngd05edec2019-08-14 08:43:4740namespace webrtc {
Erik Språngd05edec2019-08-14 08:43:4741namespace {
Danil Chapovalovcad3e0e2020-02-17 17:46:0742constexpr DataRate kFirstClusterRate = DataRate::KilobitsPerSec(900);
43constexpr DataRate kSecondClusterRate = DataRate::KilobitsPerSec(1800);
Erik Språngd05edec2019-08-14 08:43:4744
45// The error stems from truncating the time interval of probe packets to integer
46// values. This results in probing slightly higher than the target bitrate.
47// For 1.8 Mbps, this comes to be about 120 kbps with 1200 probe packets.
Danil Chapovalovcad3e0e2020-02-17 17:46:0748constexpr DataRate kProbingErrorMargin = DataRate::KilobitsPerSec(150);
Erik Språngd05edec2019-08-14 08:43:4749
50const float kPaceMultiplier = 2.5f;
51
52constexpr uint32_t kAudioSsrc = 12345;
53constexpr uint32_t kVideoSsrc = 234565;
Erik Språngd05edec2019-08-14 08:43:4754
Danil Chapovalovcad3e0e2020-02-17 17:46:0755constexpr DataRate kTargetRate = DataRate::KilobitsPerSec(800);
Erik Språngd05edec2019-08-14 08:43:4756
Björn Terelius31d0f7c2020-02-06 15:35:4657std::unique_ptr<RtpPacketToSend> BuildPacket(RtpPacketMediaType type,
Erik Språngd05edec2019-08-14 08:43:4758 uint32_t ssrc,
59 uint16_t sequence_number,
60 int64_t capture_time_ms,
61 size_t size) {
Mirko Bonadei317a1f02019-09-17 15:06:1862 auto packet = std::make_unique<RtpPacketToSend>(nullptr);
Erik Språngd05edec2019-08-14 08:43:4763 packet->set_packet_type(type);
64 packet->SetSsrc(ssrc);
65 packet->SetSequenceNumber(sequence_number);
Danil Chapovalov9af4aa72022-02-27 21:10:5566 packet->set_capture_time(Timestamp::Millis(capture_time_ms));
Erik Språngd05edec2019-08-14 08:43:4767 packet->SetPayloadSize(size);
68 return packet;
69}
Per Kjellanderbfd30652022-05-27 11:15:1770
71class MediaStream {
72 public:
73 MediaStream(SimulatedClock& clock,
74 RtpPacketMediaType type,
75 uint32_t ssrc,
76 size_t packet_size)
77 : clock_(clock), type_(type), ssrc_(ssrc), packet_size_(packet_size) {}
78
79 std::unique_ptr<RtpPacketToSend> BuildNextPacket() {
80 return BuildPacket(type_, ssrc_, seq_num_++, clock_.TimeInMilliseconds(),
81 packet_size_);
82 }
83 std::unique_ptr<RtpPacketToSend> BuildNextPacket(size_t size) {
84 return BuildPacket(type_, ssrc_, seq_num_++, clock_.TimeInMilliseconds(),
85 size);
86 }
87
88 private:
89 SimulatedClock& clock_;
90 const RtpPacketMediaType type_;
91 const uint32_t ssrc_;
92 const size_t packet_size_;
93 uint16_t seq_num_ = 1000;
94};
Erik Språngd05edec2019-08-14 08:43:4795
96// Mock callback proxy, where both new and old api redirects to common mock
97// methods that focus on core aspects.
98class MockPacingControllerCallback : public PacingController::PacketSender {
99 public:
Erik Språnged1fb192020-06-30 11:53:37100 void SendPacket(std::unique_ptr<RtpPacketToSend> packet,
101 const PacedPacketInfo& cluster_info) override {
Erik Språngd05edec2019-08-14 08:43:47102 SendPacket(packet->Ssrc(), packet->SequenceNumber(),
Danil Chapovalov9af4aa72022-02-27 21:10:55103 packet->capture_time().ms(),
Björn Terelius31d0f7c2020-02-06 15:35:46104 packet->packet_type() == RtpPacketMediaType::kRetransmission,
105 packet->packet_type() == RtpPacketMediaType::kPadding);
Erik Språngd05edec2019-08-14 08:43:47106 }
107
Erik Språngd05edec2019-08-14 08:43:47108 std::vector<std::unique_ptr<RtpPacketToSend>> GeneratePadding(
109 DataSize target_size) override {
110 std::vector<std::unique_ptr<RtpPacketToSend>> ret;
111 size_t padding_size = SendPadding(target_size.bytes());
112 if (padding_size > 0) {
Mirko Bonadei317a1f02019-09-17 15:06:18113 auto packet = std::make_unique<RtpPacketToSend>(nullptr);
Erik Språngd05edec2019-08-14 08:43:47114 packet->SetPayloadSize(padding_size);
Björn Terelius31d0f7c2020-02-06 15:35:46115 packet->set_packet_type(RtpPacketMediaType::kPadding);
Erik Språngd05edec2019-08-14 08:43:47116 ret.emplace_back(std::move(packet));
117 }
118 return ret;
119 }
120
Danil Chapovalov014197b2020-05-26 17:18:17121 MOCK_METHOD(void,
122 SendPacket,
123 (uint32_t ssrc,
124 uint16_t sequence_number,
125 int64_t capture_timestamp,
126 bool retransmission,
127 bool padding));
Erik Språng1d50cb62020-07-02 15:41:32128 MOCK_METHOD(std::vector<std::unique_ptr<RtpPacketToSend>>,
129 FetchFec,
130 (),
131 (override));
Danil Chapovalov014197b2020-05-26 17:18:17132 MOCK_METHOD(size_t, SendPadding, (size_t target_size));
Erik Språng767f5042022-09-09 13:06:51133 MOCK_METHOD(void,
134 OnAbortedRetransmissions,
135 (uint32_t, rtc::ArrayView<const uint16_t>),
136 (override));
137 MOCK_METHOD(absl::optional<uint32_t>,
138 GetRtxSsrcForMedia,
139 (uint32_t),
140 (const, override));
Markus Handellc8c4a282023-05-08 14:46:21141 MOCK_METHOD(void, OnBatchComplete, (), (override));
Erik Språngd05edec2019-08-14 08:43:47142};
143
144// Mock callback implementing the raw api.
145class MockPacketSender : public PacingController::PacketSender {
146 public:
Danil Chapovalov014197b2020-05-26 17:18:17147 MOCK_METHOD(void,
Erik Språnged1fb192020-06-30 11:53:37148 SendPacket,
Danil Chapovalov014197b2020-05-26 17:18:17149 (std::unique_ptr<RtpPacketToSend> packet,
150 const PacedPacketInfo& cluster_info),
151 (override));
152 MOCK_METHOD(std::vector<std::unique_ptr<RtpPacketToSend>>,
Erik Språng1d50cb62020-07-02 15:41:32153 FetchFec,
154 (),
155 (override));
156
157 MOCK_METHOD(std::vector<std::unique_ptr<RtpPacketToSend>>,
Danil Chapovalov014197b2020-05-26 17:18:17158 GeneratePadding,
159 (DataSize target_size),
160 (override));
Erik Språng767f5042022-09-09 13:06:51161 MOCK_METHOD(void,
162 OnAbortedRetransmissions,
163 (uint32_t, rtc::ArrayView<const uint16_t>),
164 (override));
165 MOCK_METHOD(absl::optional<uint32_t>,
166 GetRtxSsrcForMedia,
167 (uint32_t),
168 (const, override));
Markus Handellc8c4a282023-05-08 14:46:21169 MOCK_METHOD(void, OnBatchComplete, (), (override));
Erik Språngd05edec2019-08-14 08:43:47170};
171
172class PacingControllerPadding : public PacingController::PacketSender {
173 public:
174 static const size_t kPaddingPacketSize = 224;
175
Erik Språngeb487992019-11-14 13:15:15176 PacingControllerPadding() : padding_sent_(0), total_bytes_sent_(0) {}
Erik Språngd05edec2019-08-14 08:43:47177
Erik Språnged1fb192020-06-30 11:53:37178 void SendPacket(std::unique_ptr<RtpPacketToSend> packet,
179 const PacedPacketInfo& pacing_info) override {
Erik Språngeb487992019-11-14 13:15:15180 total_bytes_sent_ += packet->payload_size();
181 }
Erik Språngd05edec2019-08-14 08:43:47182
Erik Språng1d50cb62020-07-02 15:41:32183 std::vector<std::unique_ptr<RtpPacketToSend>> FetchFec() override {
184 return {};
185 }
186
Erik Språngd05edec2019-08-14 08:43:47187 std::vector<std::unique_ptr<RtpPacketToSend>> GeneratePadding(
188 DataSize target_size) override {
189 size_t num_packets =
190 (target_size.bytes() + kPaddingPacketSize - 1) / kPaddingPacketSize;
191 std::vector<std::unique_ptr<RtpPacketToSend>> packets;
192 for (size_t i = 0; i < num_packets; ++i) {
Mirko Bonadei317a1f02019-09-17 15:06:18193 packets.emplace_back(std::make_unique<RtpPacketToSend>(nullptr));
Erik Språngd05edec2019-08-14 08:43:47194 packets.back()->SetPadding(kPaddingPacketSize);
Björn Terelius31d0f7c2020-02-06 15:35:46195 packets.back()->set_packet_type(RtpPacketMediaType::kPadding);
Erik Språngd05edec2019-08-14 08:43:47196 padding_sent_ += kPaddingPacketSize;
197 }
198 return packets;
199 }
200
Erik Språng767f5042022-09-09 13:06:51201 void OnAbortedRetransmissions(uint32_t,
202 rtc::ArrayView<const uint16_t>) override {}
203 absl::optional<uint32_t> GetRtxSsrcForMedia(uint32_t) const override {
204 return absl::nullopt;
205 }
206
Markus Handellc8c4a282023-05-08 14:46:21207 void OnBatchComplete() override {}
208
Erik Språngd05edec2019-08-14 08:43:47209 size_t padding_sent() { return padding_sent_; }
Erik Språngeb487992019-11-14 13:15:15210 size_t total_bytes_sent() { return total_bytes_sent_; }
Erik Språngd05edec2019-08-14 08:43:47211
212 private:
213 size_t padding_sent_;
Erik Språngeb487992019-11-14 13:15:15214 size_t total_bytes_sent_;
Erik Språngd05edec2019-08-14 08:43:47215};
216
217class PacingControllerProbing : public PacingController::PacketSender {
218 public:
Per Kffdecdc2023-02-22 12:53:27219 PacingControllerProbing() = default;
220 // Controls if padding can be generated or not.
221 // In real implementation, padding can only be generated after a sent
222 // media packet, or if the sender support RTX.
223 void SetCanGeneratePadding(bool can_generate) {
224 can_generate_padding_ = can_generate;
225 }
Erik Språngd05edec2019-08-14 08:43:47226
Erik Språnged1fb192020-06-30 11:53:37227 void SendPacket(std::unique_ptr<RtpPacketToSend> packet,
228 const PacedPacketInfo& pacing_info) override {
Björn Terelius31d0f7c2020-02-06 15:35:46229 if (packet->packet_type() != RtpPacketMediaType::kPadding) {
Erik Språngd05edec2019-08-14 08:43:47230 ++packets_sent_;
Per Kffdecdc2023-02-22 12:53:27231 } else {
232 ++padding_packets_sent_;
Erik Språngd05edec2019-08-14 08:43:47233 }
Erik Språngb9d38092020-07-17 10:06:12234 last_pacing_info_ = pacing_info;
Erik Språngd05edec2019-08-14 08:43:47235 }
236
Erik Språng1d50cb62020-07-02 15:41:32237 std::vector<std::unique_ptr<RtpPacketToSend>> FetchFec() override {
238 return {};
239 }
240
Erik Språngd05edec2019-08-14 08:43:47241 std::vector<std::unique_ptr<RtpPacketToSend>> GeneratePadding(
242 DataSize target_size) override {
Per Kffdecdc2023-02-22 12:53:27243 if (!can_generate_padding_) {
244 return {};
245 }
Erik Språngb210eeb2019-11-05 10:21:48246 // From RTPSender:
247 // Max in the RFC 3550 is 255 bytes, we limit it to be modulus 32 for SRTP.
Danil Chapovalovcad3e0e2020-02-17 17:46:07248 const DataSize kMaxPadding = DataSize::Bytes(224);
Erik Språngb210eeb2019-11-05 10:21:48249
Erik Språngd05edec2019-08-14 08:43:47250 std::vector<std::unique_ptr<RtpPacketToSend>> packets;
Erik Språngb210eeb2019-11-05 10:21:48251 while (target_size > DataSize::Zero()) {
252 DataSize padding_size = std::min(kMaxPadding, target_size);
253 packets.emplace_back(std::make_unique<RtpPacketToSend>(nullptr));
254 packets.back()->SetPadding(padding_size.bytes());
Björn Terelius31d0f7c2020-02-06 15:35:46255 packets.back()->set_packet_type(RtpPacketMediaType::kPadding);
Erik Språngb210eeb2019-11-05 10:21:48256 padding_sent_ += padding_size.bytes();
257 target_size -= padding_size;
258 }
Erik Språngd05edec2019-08-14 08:43:47259 return packets;
260 }
261
Erik Språng767f5042022-09-09 13:06:51262 void OnAbortedRetransmissions(uint32_t,
263 rtc::ArrayView<const uint16_t>) override {}
264 absl::optional<uint32_t> GetRtxSsrcForMedia(uint32_t) const override {
265 return absl::nullopt;
266 }
Markus Handellc8c4a282023-05-08 14:46:21267 void OnBatchComplete() override {}
Erik Språng767f5042022-09-09 13:06:51268
Erik Språngd05edec2019-08-14 08:43:47269 int packets_sent() const { return packets_sent_; }
Per Kffdecdc2023-02-22 12:53:27270 int padding_packets_sent() const { return padding_packets_sent_; }
Erik Språngd05edec2019-08-14 08:43:47271 int padding_sent() const { return padding_sent_; }
Erik Språngb9d38092020-07-17 10:06:12272 int total_packets_sent() const { return packets_sent_ + padding_sent_; }
273 PacedPacketInfo last_pacing_info() const { return last_pacing_info_; }
Erik Språngd05edec2019-08-14 08:43:47274
275 private:
Per Kffdecdc2023-02-22 12:53:27276 bool can_generate_padding_ = true;
277 int packets_sent_ = 0;
278 int padding_packets_sent_ = 0;
279 int padding_sent_ = 0;
Erik Språngb9d38092020-07-17 10:06:12280 PacedPacketInfo last_pacing_info_;
Erik Språngd05edec2019-08-14 08:43:47281};
282
Erik Språng6aa5cea2022-05-16 11:20:36283class PacingControllerTest : public ::testing::Test {
Erik Språngd05edec2019-08-14 08:43:47284 protected:
Erik Språnge486a7b2022-03-15 14:13:25285 PacingControllerTest() : clock_(123456), trials_("") {}
Erik Språng9acc18d2020-04-16 17:41:07286
Per Kjellanderbfd30652022-05-27 11:15:17287 void SendAndExpectPacket(PacingController* pacer,
288 RtpPacketMediaType type,
Erik Språngd05edec2019-08-14 08:43:47289 uint32_t ssrc,
290 uint16_t sequence_number,
291 int64_t capture_time_ms,
292 size_t size) {
Per Kjellanderbfd30652022-05-27 11:15:17293 pacer->EnqueuePacket(
294 BuildPacket(type, ssrc, sequence_number, capture_time_ms, size));
295
Björn Terelius31d0f7c2020-02-06 15:35:46296 EXPECT_CALL(callback_,
297 SendPacket(ssrc, sequence_number, capture_time_ms,
Erik Språng41bbc3d2021-10-05 08:17:39298 type == RtpPacketMediaType::kRetransmission, false));
Erik Språngd05edec2019-08-14 08:43:47299 }
300
Per Kjellanderbfd30652022-05-27 11:15:17301 void AdvanceTimeUntil(webrtc::Timestamp time) {
Erik Språngeb487992019-11-14 13:15:15302 Timestamp now = clock_.CurrentTime();
Per Kjellanderbfd30652022-05-27 11:15:17303 clock_.AdvanceTime(std::max(TimeDelta::Zero(), time - now));
Erik Språngeb487992019-11-14 13:15:15304 }
Erik Språngd05edec2019-08-14 08:43:47305
Per Kjellanderbfd30652022-05-27 11:15:17306 void ConsumeInitialBudget(PacingController* pacer) {
Erik Språngeb487992019-11-14 13:15:15307 const uint32_t kSsrc = 54321;
308 uint16_t sequence_number = 1234;
309 int64_t capture_time_ms = clock_.TimeInMilliseconds();
310 const size_t kPacketSize = 250;
311
Per Kjellanderbfd30652022-05-27 11:15:17312 EXPECT_TRUE(pacer->OldestPacketEnqueueTime().IsInfinite());
Erik Språngeb487992019-11-14 13:15:15313
314 // Due to the multiplicative factor we can send 5 packets during a send
315 // interval. (network capacity * multiplier / (8 bits per byte *
316 // (packet size * #send intervals per second)
317 const size_t packets_to_send_per_interval =
318 kTargetRate.bps() * kPaceMultiplier / (8 * kPacketSize * 200);
319 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
Per Kjellanderbfd30652022-05-27 11:15:17320 SendAndExpectPacket(pacer, RtpPacketMediaType::kVideo, kSsrc,
321 sequence_number++, capture_time_ms, kPacketSize);
Erik Språngd05edec2019-08-14 08:43:47322 }
323
Per Kjellanderbfd30652022-05-27 11:15:17324 while (pacer->QueueSizePackets() > 0) {
325 AdvanceTimeUntil(pacer->NextSendTime());
326 pacer->ProcessPackets();
327 }
Erik Språngd05edec2019-08-14 08:43:47328 }
329
330 SimulatedClock clock_;
Per Kjellanderbfd30652022-05-27 11:15:17331
332 MediaStream audio_ = MediaStream(clock_,
333 /*type*/ RtpPacketMediaType::kAudio,
334 /*ssrc*/ kAudioSsrc,
335 /*packet_size*/ 100);
336 MediaStream video_ = MediaStream(clock_,
337 /*type*/ RtpPacketMediaType::kVideo,
338 /*ssrc*/ kVideoSsrc,
339 /*packet_size*/ 1000);
340
Erik Språng1d50cb62020-07-02 15:41:32341 ::testing::NiceMock<MockPacingControllerCallback> callback_;
Erik Språnge486a7b2022-03-15 14:13:25342 ExplicitKeyValueConfig trials_;
Erik Språngd05edec2019-08-14 08:43:47343};
344
Per Kjellanderbfd30652022-05-27 11:15:17345TEST_F(PacingControllerTest, DefaultNoPaddingInSilence) {
Erik Språnge486a7b2022-03-15 14:13:25346 const test::ExplicitKeyValueConfig trials("");
Erik Språng6aa5cea2022-05-16 11:20:36347 PacingController pacer(&clock_, &callback_, trials);
Erik Språngd05edec2019-08-14 08:43:47348 pacer.SetPacingRates(kTargetRate, DataRate::Zero());
349 // Video packet to reset last send time and provide padding data.
Per Kjellanderbfd30652022-05-27 11:15:17350 pacer.EnqueuePacket(video_.BuildNextPacket());
Erik Språngd05edec2019-08-14 08:43:47351 EXPECT_CALL(callback_, SendPacket).Times(1);
352 clock_.AdvanceTimeMilliseconds(5);
353 pacer.ProcessPackets();
354 EXPECT_CALL(callback_, SendPadding).Times(0);
355 // Waiting 500 ms should not trigger sending of padding.
356 clock_.AdvanceTimeMilliseconds(500);
357 pacer.ProcessPackets();
358}
359
Per Kjellanderbfd30652022-05-27 11:15:17360TEST_F(PacingControllerTest, PaddingInSilenceWithTrial) {
Erik Språnge486a7b2022-03-15 14:13:25361 const test::ExplicitKeyValueConfig trials(
362 "WebRTC-Pacer-PadInSilence/Enabled/");
Erik Språng6aa5cea2022-05-16 11:20:36363 PacingController pacer(&clock_, &callback_, trials);
Erik Språngd05edec2019-08-14 08:43:47364 pacer.SetPacingRates(kTargetRate, DataRate::Zero());
365 // Video packet to reset last send time and provide padding data.
Per Kjellanderbfd30652022-05-27 11:15:17366 pacer.EnqueuePacket(video_.BuildNextPacket());
Erik Språngf5815fa2019-08-21 12:27:31367 EXPECT_CALL(callback_, SendPacket).Times(2);
Erik Språngd05edec2019-08-14 08:43:47368 clock_.AdvanceTimeMilliseconds(5);
369 pacer.ProcessPackets();
370 EXPECT_CALL(callback_, SendPadding).WillOnce(Return(1000));
371 // Waiting 500 ms should trigger sending of padding.
372 clock_.AdvanceTimeMilliseconds(500);
373 pacer.ProcessPackets();
374}
375
Per Kjellanderbfd30652022-05-27 11:15:17376TEST_F(PacingControllerTest, CongestionWindowAffectsAudioInTrial) {
Erik Språnge486a7b2022-03-15 14:13:25377 const test::ExplicitKeyValueConfig trials("WebRTC-Pacer-BlockAudio/Enabled/");
Erik Språngd05edec2019-08-14 08:43:47378 EXPECT_CALL(callback_, SendPadding).Times(0);
Erik Språng6aa5cea2022-05-16 11:20:36379 PacingController pacer(&clock_, &callback_, trials);
Danil Chapovalovcad3e0e2020-02-17 17:46:07380 pacer.SetPacingRates(DataRate::KilobitsPerSec(10000), DataRate::Zero());
Erik Språngd05edec2019-08-14 08:43:47381 // Video packet fills congestion window.
Per Kjellanderbfd30652022-05-27 11:15:17382 pacer.EnqueuePacket(video_.BuildNextPacket());
Erik Språngd05edec2019-08-14 08:43:47383 EXPECT_CALL(callback_, SendPacket).Times(1);
Per Kjellanderbfd30652022-05-27 11:15:17384 AdvanceTimeUntil(pacer.NextSendTime());
385 pacer.ProcessPackets();
Erik Språng66734372022-03-16 13:20:49386 pacer.SetCongested(true);
Erik Språngd05edec2019-08-14 08:43:47387 // Audio packet blocked due to congestion.
Per Kjellanderbfd30652022-05-27 11:15:17388 pacer.EnqueuePacket(audio_.BuildNextPacket());
Erik Språngd05edec2019-08-14 08:43:47389 EXPECT_CALL(callback_, SendPacket).Times(0);
Erik Språng6aa5cea2022-05-16 11:20:36390 // Forward time to where we send keep-alive.
391 EXPECT_CALL(callback_, SendPadding(1)).Times(2);
Per Kjellanderbfd30652022-05-27 11:15:17392 AdvanceTimeUntil(pacer.NextSendTime());
393 pacer.ProcessPackets();
394 AdvanceTimeUntil(pacer.NextSendTime());
395 pacer.ProcessPackets();
Erik Språngd05edec2019-08-14 08:43:47396 // Audio packet unblocked when congestion window clear.
397 ::testing::Mock::VerifyAndClearExpectations(&callback_);
Erik Språng66734372022-03-16 13:20:49398 pacer.SetCongested(false);
Erik Språngd05edec2019-08-14 08:43:47399 EXPECT_CALL(callback_, SendPacket).Times(1);
Per Kjellanderbfd30652022-05-27 11:15:17400 AdvanceTimeUntil(pacer.NextSendTime());
401 pacer.ProcessPackets();
Erik Språngd05edec2019-08-14 08:43:47402}
403
Per Kjellanderbfd30652022-05-27 11:15:17404TEST_F(PacingControllerTest, DefaultCongestionWindowDoesNotAffectAudio) {
Erik Språngd05edec2019-08-14 08:43:47405 EXPECT_CALL(callback_, SendPadding).Times(0);
Erik Språnge486a7b2022-03-15 14:13:25406 const test::ExplicitKeyValueConfig trials("");
Erik Språng6aa5cea2022-05-16 11:20:36407 PacingController pacer(&clock_, &callback_, trials);
Danil Chapovalovcad3e0e2020-02-17 17:46:07408 pacer.SetPacingRates(DataRate::BitsPerSec(10000000), DataRate::Zero());
Erik Språngd05edec2019-08-14 08:43:47409 // Video packet fills congestion window.
Per Kjellanderbfd30652022-05-27 11:15:17410 pacer.EnqueuePacket(video_.BuildNextPacket());
Erik Språngd05edec2019-08-14 08:43:47411 EXPECT_CALL(callback_, SendPacket).Times(1);
Per Kjellanderbfd30652022-05-27 11:15:17412 AdvanceTimeUntil(pacer.NextSendTime());
413 pacer.ProcessPackets();
Erik Språng66734372022-03-16 13:20:49414 pacer.SetCongested(true);
Erik Språngd05edec2019-08-14 08:43:47415 // Audio not blocked due to congestion.
Per Kjellanderbfd30652022-05-27 11:15:17416 pacer.EnqueuePacket(audio_.BuildNextPacket());
Erik Språngd05edec2019-08-14 08:43:47417 EXPECT_CALL(callback_, SendPacket).Times(1);
Per Kjellanderbfd30652022-05-27 11:15:17418 AdvanceTimeUntil(pacer.NextSendTime());
419 pacer.ProcessPackets();
Erik Språngd05edec2019-08-14 08:43:47420}
421
Per Kjellanderbfd30652022-05-27 11:15:17422TEST_F(PacingControllerTest, BudgetAffectsAudioInTrial) {
Erik Språnge486a7b2022-03-15 14:13:25423 ExplicitKeyValueConfig trials("WebRTC-Pacer-BlockAudio/Enabled/");
Erik Språng6aa5cea2022-05-16 11:20:36424 PacingController pacer(&clock_, &callback_, trials);
Per Kjellanderbfd30652022-05-27 11:15:17425 const size_t kPacketSize = 1000;
426 const int kProcessIntervalsPerSecond = 1000 / 5;
427 DataRate pacing_rate =
428 DataRate::BitsPerSec(kPacketSize / 3 * 8 * kProcessIntervalsPerSecond);
Erik Språngeb487992019-11-14 13:15:15429 pacer.SetPacingRates(pacing_rate, DataRate::Zero());
Erik Språngd05edec2019-08-14 08:43:47430 // Video fills budget for following process periods.
Per Kjellanderbfd30652022-05-27 11:15:17431 pacer.EnqueuePacket(video_.BuildNextPacket(kPacketSize));
Erik Språngd05edec2019-08-14 08:43:47432 EXPECT_CALL(callback_, SendPacket).Times(1);
Per Kjellanderbfd30652022-05-27 11:15:17433 AdvanceTimeUntil(pacer.NextSendTime());
434 pacer.ProcessPackets();
Erik Språngd05edec2019-08-14 08:43:47435 // Audio packet blocked due to budget limit.
Per Kjellanderbfd30652022-05-27 11:15:17436 pacer.EnqueuePacket(audio_.BuildNextPacket());
Erik Språngeb487992019-11-14 13:15:15437 Timestamp wait_start_time = clock_.CurrentTime();
438 Timestamp wait_end_time = Timestamp::MinusInfinity();
Erik Språng1a080962022-03-17 14:16:59439 EXPECT_CALL(callback_, SendPacket).WillOnce(WithoutArgs([&]() {
440 wait_end_time = clock_.CurrentTime();
441 }));
Erik Språngeb487992019-11-14 13:15:15442 while (!wait_end_time.IsFinite()) {
Per Kjellanderbfd30652022-05-27 11:15:17443 AdvanceTimeUntil(pacer.NextSendTime());
444 pacer.ProcessPackets();
Erik Språngeb487992019-11-14 13:15:15445 }
446 const TimeDelta expected_wait_time =
Per Kjellanderbfd30652022-05-27 11:15:17447 DataSize::Bytes(kPacketSize) / pacing_rate;
Erik Språngeb487992019-11-14 13:15:15448 // Verify delay is near expectation, within timing margin.
449 EXPECT_LT(((wait_end_time - wait_start_time) - expected_wait_time).Abs(),
Erik Språng6aa5cea2022-05-16 11:20:36450 PacingController::kMinSleepTime);
Erik Språngd05edec2019-08-14 08:43:47451}
452
Per Kjellanderbfd30652022-05-27 11:15:17453TEST_F(PacingControllerTest, DefaultBudgetDoesNotAffectAudio) {
454 const size_t kPacketSize = 1000;
Erik Språngd05edec2019-08-14 08:43:47455 EXPECT_CALL(callback_, SendPadding).Times(0);
Erik Språnge486a7b2022-03-15 14:13:25456 const test::ExplicitKeyValueConfig trials("");
Erik Språng6aa5cea2022-05-16 11:20:36457 PacingController pacer(&clock_, &callback_, trials);
Per Kjellanderbfd30652022-05-27 11:15:17458 const int kProcessIntervalsPerSecond = 1000 / 5;
459 pacer.SetPacingRates(
460 DataRate::BitsPerSec(kPacketSize / 3 * 8 * kProcessIntervalsPerSecond),
461 DataRate::Zero());
Erik Språngd05edec2019-08-14 08:43:47462 // Video fills budget for following process periods.
Per Kjellanderbfd30652022-05-27 11:15:17463 pacer.EnqueuePacket(video_.BuildNextPacket(kPacketSize));
Erik Språngd05edec2019-08-14 08:43:47464 EXPECT_CALL(callback_, SendPacket).Times(1);
Per Kjellanderbfd30652022-05-27 11:15:17465 AdvanceTimeUntil(pacer.NextSendTime());
466 pacer.ProcessPackets();
Erik Språngd05edec2019-08-14 08:43:47467 // Audio packet not blocked due to budget limit.
468 EXPECT_CALL(callback_, SendPacket).Times(1);
Per Kjellanderbfd30652022-05-27 11:15:17469 pacer.EnqueuePacket(audio_.BuildNextPacket());
470 AdvanceTimeUntil(pacer.NextSendTime());
471 pacer.ProcessPackets();
Erik Språngd05edec2019-08-14 08:43:47472}
473
Erik Språng6aa5cea2022-05-16 11:20:36474TEST_F(PacingControllerTest, FirstSentPacketTimeIsSet) {
Erik Språngd05edec2019-08-14 08:43:47475 const Timestamp kStartTime = clock_.CurrentTime();
Per Kjellanderbfd30652022-05-27 11:15:17476 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
477 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
Erik Språngd05edec2019-08-14 08:43:47478
479 // No packet sent.
Per Kjellanderbfd30652022-05-27 11:15:17480 EXPECT_FALSE(pacer->FirstSentPacketTime().has_value());
481 pacer->EnqueuePacket(video_.BuildNextPacket());
482 AdvanceTimeUntil(pacer->NextSendTime());
483 pacer->ProcessPackets();
484 EXPECT_EQ(kStartTime, pacer->FirstSentPacketTime());
Erik Språngd05edec2019-08-14 08:43:47485}
486
Erik Språng6aa5cea2022-05-16 11:20:36487TEST_F(PacingControllerTest, QueueAndPacePackets) {
Erik Språngeb487992019-11-14 13:15:15488 const uint32_t kSsrc = 12345;
489 uint16_t sequence_number = 1234;
Danil Chapovalovcad3e0e2020-02-17 17:46:07490 const DataSize kPackeSize = DataSize::Bytes(250);
Danil Chapovalov55284022020-02-07 13:53:52491 const TimeDelta kSendInterval = TimeDelta::Millis(5);
Erik Språngeb487992019-11-14 13:15:15492
493 // Due to the multiplicative factor we can send 5 packets during a 5ms send
494 // interval. (send interval * network capacity * multiplier / packet size)
495 const size_t kPacketsToSend = (kSendInterval * kTargetRate).bytes() *
496 kPaceMultiplier / kPackeSize.bytes();
Per Kjellanderbfd30652022-05-27 11:15:17497 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
498 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
Erik Språngeb487992019-11-14 13:15:15499
500 for (size_t i = 0; i < kPacketsToSend; ++i) {
Per Kjellanderbfd30652022-05-27 11:15:17501 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, kSsrc,
502 sequence_number++, clock_.TimeInMilliseconds(),
503 kPackeSize.bytes());
Erik Språngeb487992019-11-14 13:15:15504 }
505 EXPECT_CALL(callback_, SendPadding).Times(0);
506
507 // Enqueue one extra packet.
508 int64_t queued_packet_timestamp = clock_.TimeInMilliseconds();
Per Kjellanderbfd30652022-05-27 11:15:17509 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, kSsrc,
510 sequence_number, queued_packet_timestamp,
511 kPackeSize.bytes()));
512 EXPECT_EQ(kPacketsToSend + 1, pacer->QueueSizePackets());
Erik Språngeb487992019-11-14 13:15:15513
514 // Send packets until the initial kPacketsToSend packets are done.
515 Timestamp start_time = clock_.CurrentTime();
Per Kjellanderbfd30652022-05-27 11:15:17516 while (pacer->QueueSizePackets() > 1) {
517 AdvanceTimeUntil(pacer->NextSendTime());
518 pacer->ProcessPackets();
Erik Språngeb487992019-11-14 13:15:15519 }
520 EXPECT_LT(clock_.CurrentTime() - start_time, kSendInterval);
521
522 // Proceed till last packet can be sent.
523 EXPECT_CALL(callback_, SendPacket(kSsrc, sequence_number,
524 queued_packet_timestamp, false, false))
525 .Times(1);
Per Kjellanderbfd30652022-05-27 11:15:17526 AdvanceTimeUntil(pacer->NextSendTime());
527 pacer->ProcessPackets();
Erik Språngeb487992019-11-14 13:15:15528 EXPECT_GE(clock_.CurrentTime() - start_time, kSendInterval);
Per Kjellanderbfd30652022-05-27 11:15:17529 EXPECT_EQ(pacer->QueueSizePackets(), 0u);
Erik Språngeb487992019-11-14 13:15:15530}
531
Erik Språng6aa5cea2022-05-16 11:20:36532TEST_F(PacingControllerTest, PaceQueuedPackets) {
Erik Språngd05edec2019-08-14 08:43:47533 uint32_t ssrc = 12345;
534 uint16_t sequence_number = 1234;
Erik Språngeb487992019-11-14 13:15:15535 const size_t kPacketSize = 250;
Per Kjellanderbfd30652022-05-27 11:15:17536 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
537 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
Erik Språngd05edec2019-08-14 08:43:47538
539 // Due to the multiplicative factor we can send 5 packets during a send
540 // interval. (network capacity * multiplier / (8 bits per byte *
541 // (packet size * #send intervals per second)
542 const size_t packets_to_send_per_interval =
Erik Språngeb487992019-11-14 13:15:15543 kTargetRate.bps() * kPaceMultiplier / (8 * kPacketSize * 200);
Erik Språngd05edec2019-08-14 08:43:47544 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
Per Kjellanderbfd30652022-05-27 11:15:17545 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc,
546 sequence_number++, clock_.TimeInMilliseconds(),
547 kPacketSize);
Erik Språngd05edec2019-08-14 08:43:47548 }
549
550 for (size_t j = 0; j < packets_to_send_per_interval * 10; ++j) {
Per Kjellanderbfd30652022-05-27 11:15:17551 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, ssrc,
552 sequence_number++,
553 clock_.TimeInMilliseconds(), kPacketSize));
Erik Språngd05edec2019-08-14 08:43:47554 }
555 EXPECT_EQ(packets_to_send_per_interval + packets_to_send_per_interval * 10,
Per Kjellanderbfd30652022-05-27 11:15:17556 pacer->QueueSizePackets());
Erik Språng6aa5cea2022-05-16 11:20:36557
Per Kjellanderbfd30652022-05-27 11:15:17558 while (pacer->QueueSizePackets() > packets_to_send_per_interval * 10) {
559 AdvanceTimeUntil(pacer->NextSendTime());
560 pacer->ProcessPackets();
561 }
562 EXPECT_EQ(pacer->QueueSizePackets(), packets_to_send_per_interval * 10);
Erik Språngeb487992019-11-14 13:15:15563 EXPECT_CALL(callback_, SendPadding).Times(0);
564
565 EXPECT_CALL(callback_, SendPacket(ssrc, _, _, false, false))
Per Kjellanderbfd30652022-05-27 11:15:17566 .Times(pacer->QueueSizePackets());
Erik Språngeb487992019-11-14 13:15:15567 const TimeDelta expected_pace_time =
Per Kjellanderbfd30652022-05-27 11:15:17568 DataSize::Bytes(pacer->QueueSizePackets() * kPacketSize) /
Erik Språngeb487992019-11-14 13:15:15569 (kPaceMultiplier * kTargetRate);
570 Timestamp start_time = clock_.CurrentTime();
Per Kjellanderbfd30652022-05-27 11:15:17571 while (pacer->QueueSizePackets() > 0) {
572 AdvanceTimeUntil(pacer->NextSendTime());
573 pacer->ProcessPackets();
Erik Språngeb487992019-11-14 13:15:15574 }
575 const TimeDelta actual_pace_time = clock_.CurrentTime() - start_time;
Danil Chapovalov55284022020-02-07 13:53:52576 EXPECT_LT((actual_pace_time - expected_pace_time).Abs(),
Erik Språng6aa5cea2022-05-16 11:20:36577 PacingController::kMinSleepTime);
Erik Språngeb487992019-11-14 13:15:15578
Per Kjellanderbfd30652022-05-27 11:15:17579 EXPECT_EQ(0u, pacer->QueueSizePackets());
580 AdvanceTimeUntil(pacer->NextSendTime());
581 EXPECT_EQ(0u, pacer->QueueSizePackets());
582 pacer->ProcessPackets();
Erik Språngd05edec2019-08-14 08:43:47583
Erik Språngeb487992019-11-14 13:15:15584 // Send some more packet, just show that we can..?
Erik Språngd05edec2019-08-14 08:43:47585 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
Per Kjellanderbfd30652022-05-27 11:15:17586 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc,
587 sequence_number++, clock_.TimeInMilliseconds(), 250);
Erik Språngd05edec2019-08-14 08:43:47588 }
Per Kjellanderbfd30652022-05-27 11:15:17589 EXPECT_EQ(packets_to_send_per_interval, pacer->QueueSizePackets());
Erik Språng6aa5cea2022-05-16 11:20:36590 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
Per Kjellanderbfd30652022-05-27 11:15:17591 AdvanceTimeUntil(pacer->NextSendTime());
592 pacer->ProcessPackets();
Erik Språngeb487992019-11-14 13:15:15593 }
Per Kjellanderbfd30652022-05-27 11:15:17594 EXPECT_EQ(0u, pacer->QueueSizePackets());
Erik Språngd05edec2019-08-14 08:43:47595}
596
Erik Språng6aa5cea2022-05-16 11:20:36597TEST_F(PacingControllerTest, RepeatedRetransmissionsAllowed) {
Per Kjellanderbfd30652022-05-27 11:15:17598 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
599 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
600
Erik Språngd05edec2019-08-14 08:43:47601 // Send one packet, then two retransmissions of that packet.
602 for (size_t i = 0; i < 3; i++) {
603 constexpr uint32_t ssrc = 333;
604 constexpr uint16_t sequence_number = 444;
605 constexpr size_t bytes = 250;
606 bool is_retransmission = (i != 0); // Original followed by retransmissions.
Per Kjellanderbfd30652022-05-27 11:15:17607 SendAndExpectPacket(pacer.get(),
608 is_retransmission ? RtpPacketMediaType::kRetransmission
Björn Terelius31d0f7c2020-02-06 15:35:46609 : RtpPacketMediaType::kVideo,
610 ssrc, sequence_number, clock_.TimeInMilliseconds(),
611 bytes);
Erik Språngd05edec2019-08-14 08:43:47612 clock_.AdvanceTimeMilliseconds(5);
613 }
Per Kjellanderbfd30652022-05-27 11:15:17614 while (pacer->QueueSizePackets() > 0) {
615 AdvanceTimeUntil(pacer->NextSendTime());
616 pacer->ProcessPackets();
617 }
Erik Språngd05edec2019-08-14 08:43:47618}
619
Erik Språng6aa5cea2022-05-16 11:20:36620TEST_F(PacingControllerTest,
Erik Språngd05edec2019-08-14 08:43:47621 CanQueuePacketsWithSameSequenceNumberOnDifferentSsrcs) {
622 uint32_t ssrc = 12345;
623 uint16_t sequence_number = 1234;
Per Kjellanderbfd30652022-05-27 11:15:17624 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
625 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
Erik Språngd05edec2019-08-14 08:43:47626
Per Kjellanderbfd30652022-05-27 11:15:17627 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc,
628 sequence_number, clock_.TimeInMilliseconds(), 250);
Erik Språngd05edec2019-08-14 08:43:47629
630 // Expect packet on second ssrc to be queued and sent as well.
Per Kjellanderbfd30652022-05-27 11:15:17631 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc + 1,
632 sequence_number, clock_.TimeInMilliseconds(), 250);
Erik Språngd05edec2019-08-14 08:43:47633
634 clock_.AdvanceTimeMilliseconds(1000);
Per Kjellanderbfd30652022-05-27 11:15:17635 while (pacer->QueueSizePackets() > 0) {
636 AdvanceTimeUntil(pacer->NextSendTime());
637 pacer->ProcessPackets();
638 }
Erik Språngd05edec2019-08-14 08:43:47639}
640
Erik Språng6aa5cea2022-05-16 11:20:36641TEST_F(PacingControllerTest, Padding) {
Erik Språngd05edec2019-08-14 08:43:47642 uint32_t ssrc = 12345;
643 uint16_t sequence_number = 1234;
Erik Språngeb487992019-11-14 13:15:15644 const size_t kPacketSize = 250;
Per Kjellanderbfd30652022-05-27 11:15:17645 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
646 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
Erik Språngd05edec2019-08-14 08:43:47647
Per Kjellanderbfd30652022-05-27 11:15:17648 const size_t kPacketsToSend = 20;
649 for (size_t i = 0; i < kPacketsToSend; ++i) {
650 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc,
651 sequence_number++, clock_.TimeInMilliseconds(),
652 kPacketSize);
653 }
654 const TimeDelta expected_pace_time =
655 DataSize::Bytes(pacer->QueueSizePackets() * kPacketSize) /
656 (kPaceMultiplier * kTargetRate);
657 EXPECT_CALL(callback_, SendPadding).Times(0);
658 // Only the media packets should be sent.
659 Timestamp start_time = clock_.CurrentTime();
660 while (pacer->QueueSizePackets() > 0) {
661 AdvanceTimeUntil(pacer->NextSendTime());
662 pacer->ProcessPackets();
663 }
Jared Siskinc018bae2023-04-19 23:24:03664 const TimeDelta actual_pace_time = clock_.CurrentTime() - start_time;
665 EXPECT_LE((actual_pace_time - expected_pace_time).Abs(),
666 PacingController::kMinSleepTime);
Erik Språngeb487992019-11-14 13:15:15667
Jared Siskinc018bae2023-04-19 23:24:03668 // Pacing media happens at 2.5x, but padding was configured with 1.0x
669 // factor. We have to wait until the padding debt is gone before we start
670 // sending padding.
671 const TimeDelta time_to_padding_debt_free =
672 (expected_pace_time * kPaceMultiplier) - actual_pace_time;
673 clock_.AdvanceTime(time_to_padding_debt_free -
674 PacingController::kMinSleepTime);
675 pacer->ProcessPackets();
676
677 // Send 10 padding packets.
678 const size_t kPaddingPacketsToSend = 10;
679 DataSize padding_sent = DataSize::Zero();
680 size_t packets_sent = 0;
681 Timestamp first_send_time = Timestamp::MinusInfinity();
682 Timestamp last_send_time = Timestamp::MinusInfinity();
683
684 EXPECT_CALL(callback_, SendPadding)
685 .Times(kPaddingPacketsToSend)
686 .WillRepeatedly([&](size_t target_size) {
687 ++packets_sent;
688 if (packets_sent < kPaddingPacketsToSend) {
689 // Don't count bytes of last packet, instead just
690 // use this as the time the last packet finished
691 // sending.
692 padding_sent += DataSize::Bytes(target_size);
693 }
694 if (first_send_time.IsInfinite()) {
695 first_send_time = clock_.CurrentTime();
696 } else {
697 last_send_time = clock_.CurrentTime();
698 }
699 return target_size;
700 });
701 EXPECT_CALL(callback_, SendPacket(_, _, _, false, true))
702 .Times(kPaddingPacketsToSend);
703
704 while (packets_sent < kPaddingPacketsToSend) {
705 AdvanceTimeUntil(pacer->NextSendTime());
Per Kjellanderbfd30652022-05-27 11:15:17706 pacer->ProcessPackets();
Jared Siskinc018bae2023-04-19 23:24:03707 }
Erik Språngeb487992019-11-14 13:15:15708
Jared Siskinc018bae2023-04-19 23:24:03709 // Verify rate of sent padding.
710 TimeDelta padding_duration = last_send_time - first_send_time;
711 DataRate padding_rate = padding_sent / padding_duration;
712 EXPECT_EQ(padding_rate, kTargetRate);
Erik Språngd05edec2019-08-14 08:43:47713}
714
Erik Språng6aa5cea2022-05-16 11:20:36715TEST_F(PacingControllerTest, NoPaddingBeforeNormalPacket) {
Per Kjellanderbfd30652022-05-27 11:15:17716 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
717 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
Erik Språngd05edec2019-08-14 08:43:47718
719 EXPECT_CALL(callback_, SendPadding).Times(0);
Erik Språngeb487992019-11-14 13:15:15720
Per Kjellanderbfd30652022-05-27 11:15:17721 pacer->ProcessPackets();
722 AdvanceTimeUntil(pacer->NextSendTime());
Erik Språngd05edec2019-08-14 08:43:47723
Per Kjellanderbfd30652022-05-27 11:15:17724 pacer->ProcessPackets();
725 AdvanceTimeUntil(pacer->NextSendTime());
Erik Språngd05edec2019-08-14 08:43:47726
727 uint32_t ssrc = 12345;
728 uint16_t sequence_number = 1234;
729 int64_t capture_time_ms = 56789;
730
Per Kjellanderbfd30652022-05-27 11:15:17731 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc,
732 sequence_number++, capture_time_ms, 250);
Erik Språngb1ccae22019-11-25 17:22:09733 bool padding_sent = false;
734 EXPECT_CALL(callback_, SendPadding).WillOnce([&](size_t padding) {
735 padding_sent = true;
Erik Språngeb487992019-11-14 13:15:15736 return padding;
737 });
Erik Språngf5815fa2019-08-21 12:27:31738 EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
Erik Språng6aa5cea2022-05-16 11:20:36739 while (!padding_sent) {
Per Kjellanderbfd30652022-05-27 11:15:17740 AdvanceTimeUntil(pacer->NextSendTime());
741 pacer->ProcessPackets();
Erik Språngeb487992019-11-14 13:15:15742 }
Erik Språngd05edec2019-08-14 08:43:47743}
744
Erik Språng6aa5cea2022-05-16 11:20:36745TEST_F(PacingControllerTest, VerifyAverageBitrateVaryingMediaPayload) {
Erik Språngd05edec2019-08-14 08:43:47746 uint32_t ssrc = 12345;
747 uint16_t sequence_number = 1234;
748 int64_t capture_time_ms = 56789;
Danil Chapovalov55284022020-02-07 13:53:52749 const TimeDelta kAveragingWindowLength = TimeDelta::Seconds(10);
Erik Språngd05edec2019-08-14 08:43:47750 PacingControllerPadding callback;
Per Kjellanderbfd30652022-05-27 11:15:17751 auto pacer = std::make_unique<PacingController>(&clock_, &callback, trials_);
752 pacer->SetProbingEnabled(false);
753 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
Erik Språngd05edec2019-08-14 08:43:47754
Erik Språngeb487992019-11-14 13:15:15755 Timestamp start_time = clock_.CurrentTime();
Erik Språngd05edec2019-08-14 08:43:47756 size_t media_bytes = 0;
Erik Språngeb487992019-11-14 13:15:15757 while (clock_.CurrentTime() - start_time < kAveragingWindowLength) {
758 // Maybe add some new media packets corresponding to expected send rate.
Erik Språngd05edec2019-08-14 08:43:47759 int rand_value = rand(); // NOLINT (rand_r instead of rand)
Erik Språngeb487992019-11-14 13:15:15760 while (
761 media_bytes <
762 (kTargetRate * (clock_.CurrentTime() - start_time)).bytes<size_t>()) {
763 size_t media_payload = rand_value % 400 + 800; // [400, 1200] bytes.
Per Kjellanderbfd30652022-05-27 11:15:17764 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, ssrc,
765 sequence_number++, capture_time_ms,
766 media_payload));
Erik Språngeb487992019-11-14 13:15:15767 media_bytes += media_payload;
768 }
769
Per Kjellanderbfd30652022-05-27 11:15:17770 AdvanceTimeUntil(pacer->NextSendTime());
771 pacer->ProcessPackets();
Erik Språngd05edec2019-08-14 08:43:47772 }
Erik Språngeb487992019-11-14 13:15:15773
774 EXPECT_NEAR(
775 kTargetRate.bps(),
Danil Chapovalovcad3e0e2020-02-17 17:46:07776 (DataSize::Bytes(callback.total_bytes_sent()) / kAveragingWindowLength)
Erik Språngeb487992019-11-14 13:15:15777 .bps(),
778 (kTargetRate * 0.01 /* 1% error marging */).bps());
Erik Språngd05edec2019-08-14 08:43:47779}
780
Erik Språng6aa5cea2022-05-16 11:20:36781TEST_F(PacingControllerTest, Priority) {
Erik Språngd05edec2019-08-14 08:43:47782 uint32_t ssrc_low_priority = 12345;
783 uint32_t ssrc = 12346;
784 uint16_t sequence_number = 1234;
785 int64_t capture_time_ms = 56789;
786 int64_t capture_time_ms_low_priority = 1234567;
Per Kjellanderbfd30652022-05-27 11:15:17787 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
788 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
Erik Språngd05edec2019-08-14 08:43:47789
Per Kjellanderbfd30652022-05-27 11:15:17790 ConsumeInitialBudget(pacer.get());
Erik Språngd05edec2019-08-14 08:43:47791
792 // Expect normal and low priority to be queued and high to pass through.
Per Kjellanderbfd30652022-05-27 11:15:17793 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo,
794 ssrc_low_priority, sequence_number++,
795 capture_time_ms_low_priority, 250));
Erik Språngd05edec2019-08-14 08:43:47796
Erik Språngeb487992019-11-14 13:15:15797 const size_t packets_to_send_per_interval =
798 kTargetRate.bps() * kPaceMultiplier / (8 * 250 * 200);
Erik Språngd05edec2019-08-14 08:43:47799 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
Per Kjellanderbfd30652022-05-27 11:15:17800 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kRetransmission, ssrc,
801 sequence_number++, capture_time_ms, 250));
Erik Språngd05edec2019-08-14 08:43:47802 }
Per Kjellanderbfd30652022-05-27 11:15:17803 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kAudio, ssrc,
804 sequence_number++, capture_time_ms, 250));
Erik Språngd05edec2019-08-14 08:43:47805
806 // Expect all high and normal priority to be sent out first.
807 EXPECT_CALL(callback_, SendPadding).Times(0);
808 EXPECT_CALL(callback_, SendPacket(ssrc, _, capture_time_ms, _, _))
809 .Times(packets_to_send_per_interval + 1);
810
Per Kjellanderbfd30652022-05-27 11:15:17811 while (pacer->QueueSizePackets() > 1) {
812 AdvanceTimeUntil(pacer->NextSendTime());
813 pacer->ProcessPackets();
814 }
Erik Språngeb487992019-11-14 13:15:15815
Per Kjellanderbfd30652022-05-27 11:15:17816 EXPECT_EQ(1u, pacer->QueueSizePackets());
Erik Språngd05edec2019-08-14 08:43:47817
818 EXPECT_CALL(callback_, SendPacket(ssrc_low_priority, _,
Erik Språng6aa5cea2022-05-16 11:20:36819 capture_time_ms_low_priority, _, _));
Per Kjellanderbfd30652022-05-27 11:15:17820 AdvanceTimeUntil(pacer->NextSendTime());
821 pacer->ProcessPackets();
Erik Språngd05edec2019-08-14 08:43:47822}
823
Erik Språng6aa5cea2022-05-16 11:20:36824TEST_F(PacingControllerTest, RetransmissionPriority) {
Erik Språngd05edec2019-08-14 08:43:47825 uint32_t ssrc = 12345;
826 uint16_t sequence_number = 1234;
827 int64_t capture_time_ms = 45678;
828 int64_t capture_time_ms_retransmission = 56789;
Per Kjellanderbfd30652022-05-27 11:15:17829 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
830 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
Erik Språngd05edec2019-08-14 08:43:47831
832 // Due to the multiplicative factor we can send 5 packets during a send
833 // interval. (network capacity * multiplier / (8 bits per byte *
834 // (packet size * #send intervals per second)
835 const size_t packets_to_send_per_interval =
836 kTargetRate.bps() * kPaceMultiplier / (8 * 250 * 200);
Per Kjellanderbfd30652022-05-27 11:15:17837 pacer->ProcessPackets();
838 EXPECT_EQ(0u, pacer->QueueSizePackets());
Erik Språngd05edec2019-08-14 08:43:47839
840 // Alternate retransmissions and normal packets.
841 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
Per Kjellanderbfd30652022-05-27 11:15:17842 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, ssrc,
843 sequence_number++, capture_time_ms, 250));
844 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kRetransmission, ssrc,
845 sequence_number++,
846 capture_time_ms_retransmission, 250));
Erik Språngd05edec2019-08-14 08:43:47847 }
Per Kjellanderbfd30652022-05-27 11:15:17848 EXPECT_EQ(2 * packets_to_send_per_interval, pacer->QueueSizePackets());
Erik Språngd05edec2019-08-14 08:43:47849
850 // Expect all retransmissions to be sent out first despite having a later
851 // capture time.
852 EXPECT_CALL(callback_, SendPadding).Times(0);
853 EXPECT_CALL(callback_, SendPacket(_, _, _, false, _)).Times(0);
854 EXPECT_CALL(callback_,
855 SendPacket(ssrc, _, capture_time_ms_retransmission, true, _))
856 .Times(packets_to_send_per_interval);
857
Per Kjellanderbfd30652022-05-27 11:15:17858 while (pacer->QueueSizePackets() > packets_to_send_per_interval) {
859 AdvanceTimeUntil(pacer->NextSendTime());
860 pacer->ProcessPackets();
861 }
862 EXPECT_EQ(packets_to_send_per_interval, pacer->QueueSizePackets());
Erik Språngd05edec2019-08-14 08:43:47863
864 // Expect the remaining (non-retransmission) packets to be sent.
865 EXPECT_CALL(callback_, SendPadding).Times(0);
866 EXPECT_CALL(callback_, SendPacket(_, _, _, true, _)).Times(0);
867 EXPECT_CALL(callback_, SendPacket(ssrc, _, capture_time_ms, false, _))
868 .Times(packets_to_send_per_interval);
869
Per Kjellanderbfd30652022-05-27 11:15:17870 while (pacer->QueueSizePackets() > 0) {
871 AdvanceTimeUntil(pacer->NextSendTime());
872 pacer->ProcessPackets();
873 }
874 EXPECT_EQ(0u, pacer->QueueSizePackets());
Erik Språngd05edec2019-08-14 08:43:47875}
876
Erik Språng6aa5cea2022-05-16 11:20:36877TEST_F(PacingControllerTest, HighPrioDoesntAffectBudget) {
Erik Språngeb487992019-11-14 13:15:15878 const size_t kPacketSize = 250;
Erik Språngd05edec2019-08-14 08:43:47879 uint32_t ssrc = 12346;
880 uint16_t sequence_number = 1234;
881 int64_t capture_time_ms = 56789;
Per Kjellanderbfd30652022-05-27 11:15:17882 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
883 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
Erik Språngd05edec2019-08-14 08:43:47884
885 // As high prio packets doesn't affect the budget, we should be able to send
886 // a high number of them at once.
Erik Språngeb487992019-11-14 13:15:15887 const size_t kNumAudioPackets = 25;
888 for (size_t i = 0; i < kNumAudioPackets; ++i) {
Per Kjellanderbfd30652022-05-27 11:15:17889 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kAudio, ssrc,
890 sequence_number++, capture_time_ms, kPacketSize);
Erik Språngd05edec2019-08-14 08:43:47891 }
Per Kjellanderbfd30652022-05-27 11:15:17892 pacer->ProcessPackets();
Erik Språngd05edec2019-08-14 08:43:47893 // Low prio packets does affect the budget.
894 // Due to the multiplicative factor we can send 5 packets during a send
895 // interval. (network capacity * multiplier / (8 bits per byte *
896 // (packet size * #send intervals per second)
Erik Språngeb487992019-11-14 13:15:15897 const size_t kPacketsToSendPerInterval =
898 kTargetRate.bps() * kPaceMultiplier / (8 * kPacketSize * 200);
899 for (size_t i = 0; i < kPacketsToSendPerInterval; ++i) {
Per Kjellanderbfd30652022-05-27 11:15:17900 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc,
901 sequence_number++, clock_.TimeInMilliseconds(),
902 kPacketSize);
Erik Språngd05edec2019-08-14 08:43:47903 }
Erik Språngeb487992019-11-14 13:15:15904
905 // Send all packets and measure pace time.
906 Timestamp start_time = clock_.CurrentTime();
Per Kjellanderbfd30652022-05-27 11:15:17907 while (pacer->QueueSizePackets() > 0) {
908 AdvanceTimeUntil(pacer->NextSendTime());
909 pacer->ProcessPackets();
910 }
Erik Språngeb487992019-11-14 13:15:15911
912 // Measure pacing time. Expect only low-prio packets to affect this.
913 TimeDelta pacing_time = clock_.CurrentTime() - start_time;
914 TimeDelta expected_pacing_time =
Danil Chapovalovcad3e0e2020-02-17 17:46:07915 DataSize::Bytes(kPacketsToSendPerInterval * kPacketSize) /
Erik Språngeb487992019-11-14 13:15:15916 (kTargetRate * kPaceMultiplier);
917 EXPECT_NEAR(pacing_time.us<double>(), expected_pacing_time.us<double>(),
Erik Språng6aa5cea2022-05-16 11:20:36918 PacingController::kMinSleepTime.us<double>());
Erik Språngd05edec2019-08-14 08:43:47919}
920
Erik Språng6aa5cea2022-05-16 11:20:36921TEST_F(PacingControllerTest, SendsOnlyPaddingWhenCongested) {
Erik Språngd05edec2019-08-14 08:43:47922 uint32_t ssrc = 202020;
923 uint16_t sequence_number = 1000;
924 int kPacketSize = 250;
Per Kjellanderbfd30652022-05-27 11:15:17925 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
926 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
Erik Språngd05edec2019-08-14 08:43:47927
Erik Språng66734372022-03-16 13:20:49928 // Send an initial packet so we have a last send time.
Per Kjellanderbfd30652022-05-27 11:15:17929 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc,
930 sequence_number++, clock_.TimeInMilliseconds(),
931 kPacketSize);
932 AdvanceTimeUntil(pacer->NextSendTime());
933 pacer->ProcessPackets();
Erik Språngd05edec2019-08-14 08:43:47934 ::testing::Mock::VerifyAndClearExpectations(&callback_);
Erik Språng66734372022-03-16 13:20:49935
936 // Set congested state, we should not send anything until the 500ms since
937 // last send time limit for keep-alives is triggered.
Erik Språngd05edec2019-08-14 08:43:47938 EXPECT_CALL(callback_, SendPacket).Times(0);
939 EXPECT_CALL(callback_, SendPadding).Times(0);
Per Kjellanderbfd30652022-05-27 11:15:17940 pacer->SetCongested(true);
Erik Språngd05edec2019-08-14 08:43:47941 size_t blocked_packets = 0;
942 int64_t expected_time_until_padding = 500;
943 while (expected_time_until_padding > 5) {
Per Kjellanderbfd30652022-05-27 11:15:17944 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, ssrc,
945 sequence_number++,
946 clock_.TimeInMilliseconds(), kPacketSize));
Erik Språngd05edec2019-08-14 08:43:47947 blocked_packets++;
948 clock_.AdvanceTimeMilliseconds(5);
Per Kjellanderbfd30652022-05-27 11:15:17949 pacer->ProcessPackets();
Erik Språngd05edec2019-08-14 08:43:47950 expected_time_until_padding -= 5;
951 }
Erik Språng66734372022-03-16 13:20:49952
Erik Språngd05edec2019-08-14 08:43:47953 ::testing::Mock::VerifyAndClearExpectations(&callback_);
954 EXPECT_CALL(callback_, SendPadding(1)).WillOnce(Return(1));
Erik Språngf5815fa2019-08-21 12:27:31955 EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
Erik Språngd05edec2019-08-14 08:43:47956 clock_.AdvanceTimeMilliseconds(5);
Per Kjellanderbfd30652022-05-27 11:15:17957 pacer->ProcessPackets();
958 EXPECT_EQ(blocked_packets, pacer->QueueSizePackets());
Erik Språngd05edec2019-08-14 08:43:47959}
960
Erik Språng6aa5cea2022-05-16 11:20:36961TEST_F(PacingControllerTest, DoesNotAllowOveruseAfterCongestion) {
Erik Språngd05edec2019-08-14 08:43:47962 uint32_t ssrc = 202020;
963 uint16_t seq_num = 1000;
964 int size = 1000;
965 auto now_ms = [this] { return clock_.TimeInMilliseconds(); };
Per Kjellanderbfd30652022-05-27 11:15:17966 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
967 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
Erik Språngd05edec2019-08-14 08:43:47968 EXPECT_CALL(callback_, SendPadding).Times(0);
969 // The pacing rate is low enough that the budget should not allow two packets
970 // to be sent in a row.
Per Kjellanderbfd30652022-05-27 11:15:17971 pacer->SetPacingRates(DataRate::BitsPerSec(400 * 8 * 1000 / 5),
972 DataRate::Zero());
Erik Språngd05edec2019-08-14 08:43:47973 // Not yet budget limited or congested, packet is sent.
Per Kjellanderbfd30652022-05-27 11:15:17974 pacer->EnqueuePacket(
975 BuildPacket(RtpPacketMediaType::kVideo, ssrc, seq_num++, now_ms(), size));
Erik Språngd05edec2019-08-14 08:43:47976 EXPECT_CALL(callback_, SendPacket).Times(1);
977 clock_.AdvanceTimeMilliseconds(5);
Per Kjellanderbfd30652022-05-27 11:15:17978 pacer->ProcessPackets();
Erik Språngd05edec2019-08-14 08:43:47979 // Packet blocked due to congestion.
Per Kjellanderbfd30652022-05-27 11:15:17980 pacer->SetCongested(true);
981 pacer->EnqueuePacket(
982 BuildPacket(RtpPacketMediaType::kVideo, ssrc, seq_num++, now_ms(), size));
Erik Språngd05edec2019-08-14 08:43:47983 EXPECT_CALL(callback_, SendPacket).Times(0);
984 clock_.AdvanceTimeMilliseconds(5);
Per Kjellanderbfd30652022-05-27 11:15:17985 pacer->ProcessPackets();
Erik Språngd05edec2019-08-14 08:43:47986 // Packet blocked due to congestion.
Per Kjellanderbfd30652022-05-27 11:15:17987 pacer->EnqueuePacket(
988 BuildPacket(RtpPacketMediaType::kVideo, ssrc, seq_num++, now_ms(), size));
Erik Språngd05edec2019-08-14 08:43:47989 EXPECT_CALL(callback_, SendPacket).Times(0);
990 clock_.AdvanceTimeMilliseconds(5);
Per Kjellanderbfd30652022-05-27 11:15:17991 pacer->ProcessPackets();
Erik Språngd05edec2019-08-14 08:43:47992 // Congestion removed and budget has recovered, packet is sent.
Per Kjellanderbfd30652022-05-27 11:15:17993 pacer->EnqueuePacket(
994 BuildPacket(RtpPacketMediaType::kVideo, ssrc, seq_num++, now_ms(), size));
Erik Språngd05edec2019-08-14 08:43:47995 EXPECT_CALL(callback_, SendPacket).Times(1);
996 clock_.AdvanceTimeMilliseconds(5);
Per Kjellanderbfd30652022-05-27 11:15:17997 pacer->SetCongested(false);
998 pacer->ProcessPackets();
Erik Språngd05edec2019-08-14 08:43:47999 // Should be blocked due to budget limitation as congestion has be removed.
Per Kjellanderbfd30652022-05-27 11:15:171000 pacer->EnqueuePacket(
1001 BuildPacket(RtpPacketMediaType::kVideo, ssrc, seq_num++, now_ms(), size));
Erik Språngd05edec2019-08-14 08:43:471002 EXPECT_CALL(callback_, SendPacket).Times(0);
1003 clock_.AdvanceTimeMilliseconds(5);
Per Kjellanderbfd30652022-05-27 11:15:171004 pacer->ProcessPackets();
Erik Språngd05edec2019-08-14 08:43:471005}
1006
Erik Språng6aa5cea2022-05-16 11:20:361007TEST_F(PacingControllerTest, Pause) {
Erik Språngd05edec2019-08-14 08:43:471008 uint32_t ssrc_low_priority = 12345;
1009 uint32_t ssrc = 12346;
1010 uint32_t ssrc_high_priority = 12347;
1011 uint16_t sequence_number = 1234;
Per Kjellanderbfd30652022-05-27 11:15:171012 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
1013 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
Erik Språngd05edec2019-08-14 08:43:471014
Per Kjellanderbfd30652022-05-27 11:15:171015 EXPECT_TRUE(pacer->OldestPacketEnqueueTime().IsInfinite());
Erik Språngd05edec2019-08-14 08:43:471016
Per Kjellanderbfd30652022-05-27 11:15:171017 ConsumeInitialBudget(pacer.get());
Erik Språngd05edec2019-08-14 08:43:471018
Per Kjellanderbfd30652022-05-27 11:15:171019 pacer->Pause();
Erik Språngd05edec2019-08-14 08:43:471020
Erik Språngeb487992019-11-14 13:15:151021 int64_t capture_time_ms = clock_.TimeInMilliseconds();
1022 const size_t packets_to_send_per_interval =
1023 kTargetRate.bps() * kPaceMultiplier / (8 * 250 * 200);
Erik Språngd05edec2019-08-14 08:43:471024 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
Per Kjellanderbfd30652022-05-27 11:15:171025 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo,
1026 ssrc_low_priority, sequence_number++,
1027 capture_time_ms, 250));
1028 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kRetransmission, ssrc,
1029 sequence_number++, capture_time_ms, 250));
1030 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kAudio,
1031 ssrc_high_priority, sequence_number++,
1032 capture_time_ms, 250));
Erik Språngd05edec2019-08-14 08:43:471033 }
1034 clock_.AdvanceTimeMilliseconds(10000);
1035 int64_t second_capture_time_ms = clock_.TimeInMilliseconds();
1036 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
Per Kjellanderbfd30652022-05-27 11:15:171037 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo,
1038 ssrc_low_priority, sequence_number++,
1039 second_capture_time_ms, 250));
1040 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kRetransmission, ssrc,
1041 sequence_number++, second_capture_time_ms,
1042 250));
1043 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kAudio,
1044 ssrc_high_priority, sequence_number++,
1045 second_capture_time_ms, 250));
Erik Språngd05edec2019-08-14 08:43:471046 }
1047
1048 // Expect everything to be queued.
Per Kjellanderbfd30652022-05-27 11:15:171049 EXPECT_EQ(capture_time_ms, pacer->OldestPacketEnqueueTime().ms());
Erik Språngd05edec2019-08-14 08:43:471050
Erik Språngeb487992019-11-14 13:15:151051 // Process triggers keep-alive packet.
1052 EXPECT_CALL(callback_, SendPadding).WillOnce([](size_t padding) {
1053 return padding;
1054 });
Erik Språngf5815fa2019-08-21 12:27:311055 EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
Per Kjellanderbfd30652022-05-27 11:15:171056 pacer->ProcessPackets();
Erik Språngd05edec2019-08-14 08:43:471057
Erik Språngeb487992019-11-14 13:15:151058 // Verify no packets sent for the rest of the paused process interval.
Danil Chapovalov55284022020-02-07 13:53:521059 const TimeDelta kProcessInterval = TimeDelta::Millis(5);
Erik Språngeb487992019-11-14 13:15:151060 TimeDelta expected_time_until_send = PacingController::kPausedProcessInterval;
Erik Språngd05edec2019-08-14 08:43:471061 EXPECT_CALL(callback_, SendPadding).Times(0);
Erik Språngeb487992019-11-14 13:15:151062 while (expected_time_until_send >= kProcessInterval) {
Per Kjellanderbfd30652022-05-27 11:15:171063 pacer->ProcessPackets();
Erik Språngeb487992019-11-14 13:15:151064 clock_.AdvanceTime(kProcessInterval);
1065 expected_time_until_send -= kProcessInterval;
Erik Språngd05edec2019-08-14 08:43:471066 }
1067
Erik Språngeb487992019-11-14 13:15:151068 // New keep-alive packet.
Erik Språngd05edec2019-08-14 08:43:471069 ::testing::Mock::VerifyAndClearExpectations(&callback_);
Erik Språngeb487992019-11-14 13:15:151070 EXPECT_CALL(callback_, SendPadding).WillOnce([](size_t padding) {
1071 return padding;
1072 });
Erik Språngf5815fa2019-08-21 12:27:311073 EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
Erik Språngeb487992019-11-14 13:15:151074 clock_.AdvanceTime(kProcessInterval);
Per Kjellanderbfd30652022-05-27 11:15:171075 pacer->ProcessPackets();
Erik Språngd05edec2019-08-14 08:43:471076 ::testing::Mock::VerifyAndClearExpectations(&callback_);
1077
1078 // Expect high prio packets to come out first followed by normal
1079 // prio packets and low prio packets (all in capture order).
1080 {
1081 ::testing::InSequence sequence;
1082 EXPECT_CALL(callback_,
1083 SendPacket(ssrc_high_priority, _, capture_time_ms, _, _))
1084 .Times(packets_to_send_per_interval);
1085 EXPECT_CALL(callback_,
1086 SendPacket(ssrc_high_priority, _, second_capture_time_ms, _, _))
1087 .Times(packets_to_send_per_interval);
1088
1089 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
1090 EXPECT_CALL(callback_, SendPacket(ssrc, _, capture_time_ms, _, _))
1091 .Times(1);
1092 }
1093 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
1094 EXPECT_CALL(callback_, SendPacket(ssrc, _, second_capture_time_ms, _, _))
1095 .Times(1);
1096 }
1097 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
1098 EXPECT_CALL(callback_,
1099 SendPacket(ssrc_low_priority, _, capture_time_ms, _, _))
1100 .Times(1);
1101 }
1102 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
1103 EXPECT_CALL(callback_, SendPacket(ssrc_low_priority, _,
1104 second_capture_time_ms, _, _))
1105 .Times(1);
1106 }
1107 }
Per Kjellanderbfd30652022-05-27 11:15:171108 pacer->Resume();
1109 while (pacer->QueueSizePackets() > 0) {
1110 AdvanceTimeUntil(pacer->NextSendTime());
1111 pacer->ProcessPackets();
1112 }
Erik Språngd05edec2019-08-14 08:43:471113
Per Kjellanderbfd30652022-05-27 11:15:171114 EXPECT_TRUE(pacer->OldestPacketEnqueueTime().IsInfinite());
Erik Språngd05edec2019-08-14 08:43:471115}
1116
Erik Språng6aa5cea2022-05-16 11:20:361117TEST_F(PacingControllerTest, InactiveFromStart) {
Erik Språngeb487992019-11-14 13:15:151118 // Recreate the pacer without the inital time forwarding.
Per Kjellanderbfd30652022-05-27 11:15:171119 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
1120 pacer->SetProbingEnabled(false);
1121 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
Erik Språngeb487992019-11-14 13:15:151122
Erik Språngeb487992019-11-14 13:15:151123 // No packets sent, there should be no keep-alives sent either.
1124 EXPECT_CALL(callback_, SendPadding).Times(0);
1125 EXPECT_CALL(callback_, SendPacket).Times(0);
Per Kjellanderbfd30652022-05-27 11:15:171126 pacer->ProcessPackets();
Erik Språngeb487992019-11-14 13:15:151127
1128 const Timestamp start_time = clock_.CurrentTime();
1129
1130 // Determine the margin need so we can advance to the last possible moment
1131 // that will not cause a process event.
1132 const TimeDelta time_margin =
Erik Språng6aa5cea2022-05-16 11:20:361133 PacingController::kMinSleepTime + TimeDelta::Micros(1);
Erik Språngeb487992019-11-14 13:15:151134
Per Kjellanderbfd30652022-05-27 11:15:171135 EXPECT_EQ(pacer->NextSendTime() - start_time,
Erik Språngeb487992019-11-14 13:15:151136 PacingController::kPausedProcessInterval);
1137 clock_.AdvanceTime(PacingController::kPausedProcessInterval - time_margin);
Per Kjellanderbfd30652022-05-27 11:15:171138 pacer->ProcessPackets();
1139 EXPECT_EQ(pacer->NextSendTime() - start_time,
Erik Språngeb487992019-11-14 13:15:151140 PacingController::kPausedProcessInterval);
1141
1142 clock_.AdvanceTime(time_margin);
Per Kjellanderbfd30652022-05-27 11:15:171143 pacer->ProcessPackets();
1144 EXPECT_EQ(pacer->NextSendTime() - start_time,
Erik Språngeb487992019-11-14 13:15:151145 2 * PacingController::kPausedProcessInterval);
1146}
1147
Erik Språng6aa5cea2022-05-16 11:20:361148TEST_F(PacingControllerTest, QueueTimeGrowsOverTime) {
Erik Språngd05edec2019-08-14 08:43:471149 uint32_t ssrc = 12346;
1150 uint16_t sequence_number = 1234;
Per Kjellanderbfd30652022-05-27 11:15:171151 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
1152 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
1153 EXPECT_TRUE(pacer->OldestPacketEnqueueTime().IsInfinite());
Erik Språngd05edec2019-08-14 08:43:471154
Per Kjellanderbfd30652022-05-27 11:15:171155 pacer->SetPacingRates(DataRate::BitsPerSec(30000 * kPaceMultiplier),
1156 DataRate::Zero());
1157 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc,
1158 sequence_number, clock_.TimeInMilliseconds(), 1200);
Erik Språngd05edec2019-08-14 08:43:471159
1160 clock_.AdvanceTimeMilliseconds(500);
Jianhui Dai94457792021-12-07 11:34:361161 EXPECT_EQ(clock_.TimeInMilliseconds() - 500,
Per Kjellanderbfd30652022-05-27 11:15:171162 pacer->OldestPacketEnqueueTime().ms());
1163 pacer->ProcessPackets();
1164 EXPECT_TRUE(pacer->OldestPacketEnqueueTime().IsInfinite());
Erik Språngd05edec2019-08-14 08:43:471165}
1166
Erik Språng6aa5cea2022-05-16 11:20:361167TEST_F(PacingControllerTest, ProbingWithInsertedPackets) {
Erik Språngd05edec2019-08-14 08:43:471168 const size_t kPacketSize = 1200;
1169 const int kInitialBitrateBps = 300000;
1170 uint32_t ssrc = 12346;
1171 uint16_t sequence_number = 1234;
1172
1173 PacingControllerProbing packet_sender;
Per Kjellanderbfd30652022-05-27 11:15:171174 auto pacer =
1175 std::make_unique<PacingController>(&clock_, &packet_sender, trials_);
Per Kjellander88af2032022-05-16 17:58:401176 std::vector<ProbeClusterConfig> probe_clusters = {
1177 {.at_time = clock_.CurrentTime(),
1178 .target_data_rate = kFirstClusterRate,
1179 .target_duration = TimeDelta::Millis(15),
1180 .target_probe_count = 5,
1181 .id = 0},
1182 {.at_time = clock_.CurrentTime(),
1183 .target_data_rate = kSecondClusterRate,
1184 .target_duration = TimeDelta::Millis(15),
1185 .target_probe_count = 5,
1186 .id = 1}};
Per Kjellanderbfd30652022-05-27 11:15:171187 pacer->CreateProbeClusters(probe_clusters);
1188 pacer->SetPacingRates(
Danil Chapovalovcad3e0e2020-02-17 17:46:071189 DataRate::BitsPerSec(kInitialBitrateBps * kPaceMultiplier),
1190 DataRate::Zero());
Erik Språngd05edec2019-08-14 08:43:471191
1192 for (int i = 0; i < 10; ++i) {
Per Kjellanderbfd30652022-05-27 11:15:171193 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, ssrc,
1194 sequence_number++,
1195 clock_.TimeInMilliseconds(), kPacketSize));
Erik Språngd05edec2019-08-14 08:43:471196 }
1197
1198 int64_t start = clock_.TimeInMilliseconds();
1199 while (packet_sender.packets_sent() < 5) {
Per Kjellanderbfd30652022-05-27 11:15:171200 AdvanceTimeUntil(pacer->NextSendTime());
1201 pacer->ProcessPackets();
Erik Språngd05edec2019-08-14 08:43:471202 }
1203 int packets_sent = packet_sender.packets_sent();
1204 // Validate first cluster bitrate. Note that we have to account for number
1205 // of intervals and hence (packets_sent - 1) on the first cluster.
1206 EXPECT_NEAR((packets_sent - 1) * kPacketSize * 8000 /
1207 (clock_.TimeInMilliseconds() - start),
1208 kFirstClusterRate.bps(), kProbingErrorMargin.bps());
Erik Språng279f3702020-10-13 19:55:071209 // Probing always starts with a small padding packet.
1210 EXPECT_EQ(1, packet_sender.padding_sent());
Erik Språngd05edec2019-08-14 08:43:471211
Per Kjellanderbfd30652022-05-27 11:15:171212 AdvanceTimeUntil(pacer->NextSendTime());
Erik Språngd05edec2019-08-14 08:43:471213 start = clock_.TimeInMilliseconds();
1214 while (packet_sender.packets_sent() < 10) {
Per Kjellanderbfd30652022-05-27 11:15:171215 AdvanceTimeUntil(pacer->NextSendTime());
1216 pacer->ProcessPackets();
Erik Språngd05edec2019-08-14 08:43:471217 }
1218 packets_sent = packet_sender.packets_sent() - packets_sent;
1219 // Validate second cluster bitrate.
1220 EXPECT_NEAR((packets_sent - 1) * kPacketSize * 8000 /
1221 (clock_.TimeInMilliseconds() - start),
1222 kSecondClusterRate.bps(), kProbingErrorMargin.bps());
1223}
1224
Erik Språng6aa5cea2022-05-16 11:20:361225TEST_F(PacingControllerTest, SkipsProbesWhenProcessIntervalTooLarge) {
Erik Språngb210eeb2019-11-05 10:21:481226 const size_t kPacketSize = 1200;
1227 const int kInitialBitrateBps = 300000;
Erik Språngb9d38092020-07-17 10:06:121228 const uint32_t ssrc = 12346;
1229 const int kProbeClusterId = 3;
Erik Språngb210eeb2019-11-05 10:21:481230
Per Kjellanderbfd30652022-05-27 11:15:171231 uint16_t sequence_number = 1234;
Erik Språngb210eeb2019-11-05 10:21:481232
Per Kjellanderbfd30652022-05-27 11:15:171233 PacingControllerProbing packet_sender;
Erik Språngb9d38092020-07-17 10:06:121234
Per Kjellanderbfd30652022-05-27 11:15:171235 const test::ExplicitKeyValueConfig trials(
1236 "WebRTC-Bwe-ProbingBehavior/max_probe_delay:2ms/");
1237 auto pacer =
1238 std::make_unique<PacingController>(&clock_, &packet_sender, trials);
1239 pacer->SetPacingRates(
1240 DataRate::BitsPerSec(kInitialBitrateBps * kPaceMultiplier),
1241 DataRate::BitsPerSec(kInitialBitrateBps));
Erik Språngb9d38092020-07-17 10:06:121242
Per Kjellanderbfd30652022-05-27 11:15:171243 for (int i = 0; i < 10; ++i) {
1244 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, ssrc,
1245 sequence_number++,
1246 clock_.TimeInMilliseconds(), kPacketSize));
1247 }
1248 while (pacer->QueueSizePackets() > 0) {
1249 AdvanceTimeUntil(pacer->NextSendTime());
1250 pacer->ProcessPackets();
1251 }
Erik Språngb9d38092020-07-17 10:06:121252
Jared Siskinc018bae2023-04-19 23:24:031253 // Probe at a very high rate.
1254 std::vector<ProbeClusterConfig> probe_clusters = {
1255 {.at_time = clock_.CurrentTime(),
1256 .target_data_rate = DataRate::KilobitsPerSec(10000), // 10 Mbps,
1257 .target_duration = TimeDelta::Millis(15),
1258 .target_probe_count = 5,
1259 .id = kProbeClusterId}};
1260 pacer->CreateProbeClusters(probe_clusters);
Per Kjellander88af2032022-05-16 17:58:401261
Jared Siskinc018bae2023-04-19 23:24:031262 // We need one packet to start the probe.
1263 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, ssrc,
1264 sequence_number++,
1265 clock_.TimeInMilliseconds(), kPacketSize));
1266 const int packets_sent_before_probe = packet_sender.packets_sent();
1267 AdvanceTimeUntil(pacer->NextSendTime());
1268 pacer->ProcessPackets();
1269 EXPECT_EQ(packet_sender.packets_sent(), packets_sent_before_probe + 1);
Erik Språngb9d38092020-07-17 10:06:121270
Jared Siskinc018bae2023-04-19 23:24:031271 // Figure out how long between probe packets.
1272 Timestamp start_time = clock_.CurrentTime();
1273 AdvanceTimeUntil(pacer->NextSendTime());
1274 TimeDelta time_between_probes = clock_.CurrentTime() - start_time;
1275 // Advance that distance again + 1ms.
1276 clock_.AdvanceTime(time_between_probes);
Erik Språngb9d38092020-07-17 10:06:121277
Jared Siskinc018bae2023-04-19 23:24:031278 // Send second probe packet.
1279 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, ssrc,
1280 sequence_number++,
1281 clock_.TimeInMilliseconds(), kPacketSize));
1282 pacer->ProcessPackets();
1283 EXPECT_EQ(packet_sender.packets_sent(), packets_sent_before_probe + 2);
1284 PacedPacketInfo last_pacing_info = packet_sender.last_pacing_info();
1285 EXPECT_EQ(last_pacing_info.probe_cluster_id, kProbeClusterId);
Erik Språngb9d38092020-07-17 10:06:121286
Jared Siskinc018bae2023-04-19 23:24:031287 // We're exactly where we should be for the next probe.
1288 const Timestamp probe_time = clock_.CurrentTime();
1289 EXPECT_EQ(pacer->NextSendTime(), clock_.CurrentTime());
Erik Språngb9d38092020-07-17 10:06:121290
Jared Siskinc018bae2023-04-19 23:24:031291 BitrateProberConfig probing_config(&trials);
1292 EXPECT_GT(probing_config.max_probe_delay.Get(), TimeDelta::Zero());
1293 // Advance to within max probe delay, should still return same target.
1294 clock_.AdvanceTime(probing_config.max_probe_delay.Get());
1295 EXPECT_EQ(pacer->NextSendTime(), probe_time);
Erik Språngb9d38092020-07-17 10:06:121296
Jared Siskinc018bae2023-04-19 23:24:031297 // Too high probe delay, drop it!
1298 clock_.AdvanceTime(TimeDelta::Micros(1));
Erik Språngb9d38092020-07-17 10:06:121299
Jared Siskinc018bae2023-04-19 23:24:031300 int packets_sent_before_timeout = packet_sender.total_packets_sent();
1301 // Expected next process time is unchanged, but calling should not
1302 // generate new packets.
1303 EXPECT_EQ(pacer->NextSendTime(), probe_time);
1304 pacer->ProcessPackets();
1305 EXPECT_EQ(packet_sender.total_packets_sent(), packets_sent_before_timeout);
Erik Språngb9d38092020-07-17 10:06:121306
Jared Siskinc018bae2023-04-19 23:24:031307 // Next packet sent is not part of probe.
1308 AdvanceTimeUntil(pacer->NextSendTime());
1309 pacer->ProcessPackets();
1310 const int expected_probe_id = PacedPacketInfo::kNotAProbe;
1311 EXPECT_EQ(packet_sender.last_pacing_info().probe_cluster_id,
1312 expected_probe_id);
Erik Språngb210eeb2019-11-05 10:21:481313}
1314
Erik Språng6aa5cea2022-05-16 11:20:361315TEST_F(PacingControllerTest, ProbingWithPaddingSupport) {
Erik Språngd05edec2019-08-14 08:43:471316 const size_t kPacketSize = 1200;
1317 const int kInitialBitrateBps = 300000;
1318 uint32_t ssrc = 12346;
1319 uint16_t sequence_number = 1234;
1320
1321 PacingControllerProbing packet_sender;
Per Kjellanderbfd30652022-05-27 11:15:171322 auto pacer =
1323 std::make_unique<PacingController>(&clock_, &packet_sender, trials_);
Per Kjellander88af2032022-05-16 17:58:401324 std::vector<ProbeClusterConfig> probe_clusters = {
1325 {.at_time = clock_.CurrentTime(),
1326 .target_data_rate = kFirstClusterRate,
1327 .target_duration = TimeDelta::Millis(15),
1328 .target_probe_count = 5,
1329 .id = 0}};
Per Kjellanderbfd30652022-05-27 11:15:171330 pacer->CreateProbeClusters(probe_clusters);
Per Kjellander88af2032022-05-16 17:58:401331
Per Kjellanderbfd30652022-05-27 11:15:171332 pacer->SetPacingRates(
Danil Chapovalovcad3e0e2020-02-17 17:46:071333 DataRate::BitsPerSec(kInitialBitrateBps * kPaceMultiplier),
1334 DataRate::Zero());
Erik Språngd05edec2019-08-14 08:43:471335
1336 for (int i = 0; i < 3; ++i) {
Per Kjellanderbfd30652022-05-27 11:15:171337 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, ssrc,
1338 sequence_number++,
1339 clock_.TimeInMilliseconds(), kPacketSize));
Erik Språngd05edec2019-08-14 08:43:471340 }
1341
1342 int64_t start = clock_.TimeInMilliseconds();
1343 int process_count = 0;
1344 while (process_count < 5) {
Per Kjellanderbfd30652022-05-27 11:15:171345 AdvanceTimeUntil(pacer->NextSendTime());
1346 pacer->ProcessPackets();
Erik Språngd05edec2019-08-14 08:43:471347 ++process_count;
1348 }
1349 int packets_sent = packet_sender.packets_sent();
1350 int padding_sent = packet_sender.padding_sent();
1351 EXPECT_GT(packets_sent, 0);
1352 EXPECT_GT(padding_sent, 0);
1353 // Note that the number of intervals here for kPacketSize is
1354 // packets_sent due to padding in the same cluster.
1355 EXPECT_NEAR((packets_sent * kPacketSize * 8000 + padding_sent) /
1356 (clock_.TimeInMilliseconds() - start),
1357 kFirstClusterRate.bps(), kProbingErrorMargin.bps());
1358}
1359
Per Kffdecdc2023-02-22 12:53:271360TEST_F(PacingControllerTest, CanProbeWithPaddingBeforeFirstMediaPacket) {
1361 // const size_t kPacketSize = 1200;
1362 const int kInitialBitrateBps = 300000;
1363
1364 PacingControllerProbing packet_sender;
1365 const test::ExplicitKeyValueConfig trials(
1366 "WebRTC-Bwe-ProbingBehavior/min_packet_size:0/");
1367 auto pacer =
1368 std::make_unique<PacingController>(&clock_, &packet_sender, trials);
1369 std::vector<ProbeClusterConfig> probe_clusters = {
1370 {.at_time = clock_.CurrentTime(),
1371 .target_data_rate = kFirstClusterRate,
1372 .target_duration = TimeDelta::Millis(15),
1373 .target_probe_count = 5,
1374 .id = 0}};
1375 pacer->CreateProbeClusters(probe_clusters);
1376
1377 pacer->SetPacingRates(
1378 DataRate::BitsPerSec(kInitialBitrateBps * kPaceMultiplier),
1379 DataRate::Zero());
1380
1381 Timestamp start = clock_.CurrentTime();
1382 Timestamp next_process = pacer->NextSendTime();
1383 while (clock_.CurrentTime() < start + TimeDelta::Millis(100) &&
1384 next_process.IsFinite()) {
1385 AdvanceTimeUntil(next_process);
1386 pacer->ProcessPackets();
1387 next_process = pacer->NextSendTime();
1388 }
1389 EXPECT_GT(packet_sender.padding_packets_sent(), 5);
1390}
1391
1392TEST_F(PacingControllerTest, CanNotProbeWithPaddingIfGeneratePaddingFails) {
1393 // const size_t kPacketSize = 1200;
1394 const int kInitialBitrateBps = 300000;
1395
1396 PacingControllerProbing packet_sender;
1397 packet_sender.SetCanGeneratePadding(false);
1398 const test::ExplicitKeyValueConfig trials(
1399 "WebRTC-Bwe-ProbingBehavior/min_packet_size:0/");
1400 auto pacer =
1401 std::make_unique<PacingController>(&clock_, &packet_sender, trials);
1402 std::vector<ProbeClusterConfig> probe_clusters = {
1403 {.at_time = clock_.CurrentTime(),
1404 .target_data_rate = kFirstClusterRate,
1405 .target_duration = TimeDelta::Millis(15),
1406 .target_probe_count = 5,
1407 .id = 0}};
1408 pacer->CreateProbeClusters(probe_clusters);
1409
1410 pacer->SetPacingRates(
1411 DataRate::BitsPerSec(kInitialBitrateBps * kPaceMultiplier),
1412 DataRate::Zero());
1413
1414 Timestamp start = clock_.CurrentTime();
1415 int process_count = 0;
1416 Timestamp next_process = pacer->NextSendTime();
1417 while (clock_.CurrentTime() < start + TimeDelta::Millis(100) &&
1418 next_process.IsFinite()) {
1419 AdvanceTimeUntil(next_process);
1420 pacer->ProcessPackets();
1421 ++process_count;
1422 next_process = pacer->NextSendTime();
1423 }
1424
1425 EXPECT_LT(process_count, 10);
1426 EXPECT_EQ(packet_sender.padding_packets_sent(), 0);
1427}
1428
Erik Språng6aa5cea2022-05-16 11:20:361429TEST_F(PacingControllerTest, PaddingOveruse) {
Erik Språngd05edec2019-08-14 08:43:471430 uint32_t ssrc = 12346;
1431 uint16_t sequence_number = 1234;
1432 const size_t kPacketSize = 1200;
Per Kjellanderbfd30652022-05-27 11:15:171433 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
1434 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
Erik Språngd05edec2019-08-14 08:43:471435
Erik Språngeb487992019-11-14 13:15:151436 // Initially no padding rate.
Per Kjellanderbfd30652022-05-27 11:15:171437 pacer->ProcessPackets();
1438 pacer->SetPacingRates(DataRate::BitsPerSec(60000 * kPaceMultiplier),
1439 DataRate::Zero());
Erik Språngd05edec2019-08-14 08:43:471440
Per Kjellanderbfd30652022-05-27 11:15:171441 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc,
1442 sequence_number++, clock_.TimeInMilliseconds(),
1443 kPacketSize);
1444 pacer->ProcessPackets();
Erik Språngd05edec2019-08-14 08:43:471445
1446 // Add 30kbit padding. When increasing budget, media budget will increase from
1447 // negative (overuse) while padding budget will increase from 0.
1448 clock_.AdvanceTimeMilliseconds(5);
Per Kjellanderbfd30652022-05-27 11:15:171449 pacer->SetPacingRates(DataRate::BitsPerSec(60000 * kPaceMultiplier),
1450 DataRate::BitsPerSec(30000));
Erik Språngd05edec2019-08-14 08:43:471451
Per Kjellanderbfd30652022-05-27 11:15:171452 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc,
1453 sequence_number++, clock_.TimeInMilliseconds(),
1454 kPacketSize);
1455 EXPECT_LT(TimeDelta::Millis(5), pacer->ExpectedQueueTime());
Erik Språngd05edec2019-08-14 08:43:471456 // Don't send padding if queue is non-empty, even if padding budget > 0.
1457 EXPECT_CALL(callback_, SendPadding).Times(0);
Per Kjellanderbfd30652022-05-27 11:15:171458 AdvanceTimeUntil(pacer->NextSendTime());
1459 pacer->ProcessPackets();
Erik Språngd05edec2019-08-14 08:43:471460}
1461
Markus Handellc8c4a282023-05-08 14:46:211462TEST_F(PacingControllerTest, ProvidesOnBatchCompleteToPacketSender) {
1463 MockPacketSender callback;
1464 auto pacer = std::make_unique<PacingController>(&clock_, &callback, trials_);
1465 EXPECT_CALL(callback, OnBatchComplete);
1466 pacer->ProcessPackets();
1467}
1468
Erik Språng6aa5cea2022-05-16 11:20:361469TEST_F(PacingControllerTest, ProbeClusterId) {
Erik Språngd05edec2019-08-14 08:43:471470 MockPacketSender callback;
Erik Språngd05edec2019-08-14 08:43:471471 uint32_t ssrc = 12346;
1472 uint16_t sequence_number = 1234;
1473 const size_t kPacketSize = 1200;
1474
Per Kjellanderbfd30652022-05-27 11:15:171475 auto pacer = std::make_unique<PacingController>(&clock_, &callback, trials_);
1476 pacer->CreateProbeClusters(std::vector<ProbeClusterConfig>(
1477 {{.at_time = clock_.CurrentTime(),
1478 .target_data_rate = kFirstClusterRate,
1479 .target_duration = TimeDelta::Millis(15),
1480 .target_probe_count = 5,
1481 .id = 0},
1482 {.at_time = clock_.CurrentTime(),
1483 .target_data_rate = kSecondClusterRate,
1484 .target_duration = TimeDelta::Millis(15),
1485 .target_probe_count = 5,
1486 .id = 1}}));
1487 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
1488 pacer->SetProbingEnabled(true);
Erik Språngd05edec2019-08-14 08:43:471489 for (int i = 0; i < 10; ++i) {
Per Kjellanderbfd30652022-05-27 11:15:171490 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, ssrc,
1491 sequence_number++,
1492 clock_.TimeInMilliseconds(), kPacketSize));
Erik Språngd05edec2019-08-14 08:43:471493 }
1494
1495 // First probing cluster.
Erik Språngf5815fa2019-08-21 12:27:311496 EXPECT_CALL(callback,
Erik Språnged1fb192020-06-30 11:53:371497 SendPacket(_, Field(&PacedPacketInfo::probe_cluster_id, 0)))
Erik Språngf5815fa2019-08-21 12:27:311498 .Times(5);
Erik Språngd05edec2019-08-14 08:43:471499
1500 for (int i = 0; i < 5; ++i) {
Per Kjellanderbfd30652022-05-27 11:15:171501 AdvanceTimeUntil(pacer->NextSendTime());
1502 pacer->ProcessPackets();
Erik Språngd05edec2019-08-14 08:43:471503 }
1504
1505 // Second probing cluster.
Erik Språngf5815fa2019-08-21 12:27:311506 EXPECT_CALL(callback,
Erik Språnged1fb192020-06-30 11:53:371507 SendPacket(_, Field(&PacedPacketInfo::probe_cluster_id, 1)))
Erik Språngf5815fa2019-08-21 12:27:311508 .Times(5);
Erik Språngd05edec2019-08-14 08:43:471509
1510 for (int i = 0; i < 5; ++i) {
Per Kjellanderbfd30652022-05-27 11:15:171511 AdvanceTimeUntil(pacer->NextSendTime());
1512 pacer->ProcessPackets();
Erik Språngd05edec2019-08-14 08:43:471513 }
1514
1515 // Needed for the Field comparer below.
1516 const int kNotAProbe = PacedPacketInfo::kNotAProbe;
1517 // No more probing packets.
Erik Språngf5815fa2019-08-21 12:27:311518 EXPECT_CALL(callback, GeneratePadding).WillOnce([&](DataSize padding_size) {
1519 std::vector<std::unique_ptr<RtpPacketToSend>> padding_packets;
1520 padding_packets.emplace_back(
Björn Terelius31d0f7c2020-02-06 15:35:461521 BuildPacket(RtpPacketMediaType::kPadding, ssrc, sequence_number++,
Erik Språngf5815fa2019-08-21 12:27:311522 clock_.TimeInMilliseconds(), padding_size.bytes()));
1523 return padding_packets;
1524 });
Erik Språngeb487992019-11-14 13:15:151525 bool non_probe_packet_seen = false;
Erik Språnged1fb192020-06-30 11:53:371526 EXPECT_CALL(callback, SendPacket)
Erik Språngeb487992019-11-14 13:15:151527 .WillOnce([&](std::unique_ptr<RtpPacketToSend> packet,
1528 const PacedPacketInfo& cluster_info) {
1529 EXPECT_EQ(cluster_info.probe_cluster_id, kNotAProbe);
1530 non_probe_packet_seen = true;
1531 });
1532 while (!non_probe_packet_seen) {
Per Kjellanderbfd30652022-05-27 11:15:171533 AdvanceTimeUntil(pacer->NextSendTime());
1534 pacer->ProcessPackets();
Erik Språngeb487992019-11-14 13:15:151535 }
Erik Språngd05edec2019-08-14 08:43:471536}
1537
Erik Språng6aa5cea2022-05-16 11:20:361538TEST_F(PacingControllerTest, OwnedPacketPrioritizedOnType) {
Erik Språngd05edec2019-08-14 08:43:471539 MockPacketSender callback;
Per Kjellanderbfd30652022-05-27 11:15:171540 uint32_t ssrc = 123;
1541
1542 auto pacer = std::make_unique<PacingController>(&clock_, &callback, trials_);
1543 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
Erik Språngd05edec2019-08-14 08:43:471544
1545 // Insert a packet of each type, from low to high priority. Since priority
1546 // is weighted higher than insert order, these should come out of the pacer
1547 // in backwards order with the exception of FEC and Video.
Per Kjellanderbfd30652022-05-27 11:15:171548
Björn Terelius31d0f7c2020-02-06 15:35:461549 for (RtpPacketMediaType type :
1550 {RtpPacketMediaType::kPadding,
1551 RtpPacketMediaType::kForwardErrorCorrection, RtpPacketMediaType::kVideo,
1552 RtpPacketMediaType::kRetransmission, RtpPacketMediaType::kAudio}) {
Per Kjellanderbfd30652022-05-27 11:15:171553 pacer->EnqueuePacket(BuildPacket(type, ++ssrc, /*sequence_number=*/123,
1554 clock_.TimeInMilliseconds(),
1555 /*size=*/150));
Erik Språngd05edec2019-08-14 08:43:471556 }
1557
1558 ::testing::InSequence seq;
Per Kjellanderbfd30652022-05-27 11:15:171559 EXPECT_CALL(callback,
1560 SendPacket(Pointee(Property(&RtpPacketToSend::packet_type,
1561 RtpPacketMediaType::kAudio)),
1562 _));
1563 EXPECT_CALL(callback,
1564 SendPacket(Pointee(Property(&RtpPacketToSend::packet_type,
1565 RtpPacketMediaType::kRetransmission)),
1566 _));
Erik Språngd05edec2019-08-14 08:43:471567
1568 // FEC and video actually have the same priority, so will come out in
1569 // insertion order.
Erik Språngd05edec2019-08-14 08:43:471570 EXPECT_CALL(
1571 callback,
Per Kjellanderbfd30652022-05-27 11:15:171572 SendPacket(Pointee(Property(&RtpPacketToSend::packet_type,
1573 RtpPacketMediaType::kForwardErrorCorrection)),
1574 _));
1575 EXPECT_CALL(callback,
1576 SendPacket(Pointee(Property(&RtpPacketToSend::packet_type,
1577 RtpPacketMediaType::kVideo)),
1578 _));
Erik Språngd05edec2019-08-14 08:43:471579
Per Kjellanderbfd30652022-05-27 11:15:171580 EXPECT_CALL(callback,
1581 SendPacket(Pointee(Property(&RtpPacketToSend::packet_type,
1582 RtpPacketMediaType::kPadding)),
1583 _));
Erik Språngd05edec2019-08-14 08:43:471584
Per Kjellanderbfd30652022-05-27 11:15:171585 while (pacer->QueueSizePackets() > 0) {
1586 AdvanceTimeUntil(pacer->NextSendTime());
1587 pacer->ProcessPackets();
1588 }
Erik Språngd05edec2019-08-14 08:43:471589}
Erik Språng78c82a42019-10-03 16:46:041590
Erik Språng6aa5cea2022-05-16 11:20:361591TEST_F(PacingControllerTest, SmallFirstProbePacket) {
Erik Språng78c82a42019-10-03 16:46:041592 MockPacketSender callback;
Per Kjellanderbfd30652022-05-27 11:15:171593 auto pacer = std::make_unique<PacingController>(&clock_, &callback, trials_);
Per Kjellander88af2032022-05-16 17:58:401594 std::vector<ProbeClusterConfig> probe_clusters = {
1595 {.at_time = clock_.CurrentTime(),
1596 .target_data_rate = kFirstClusterRate,
1597 .target_duration = TimeDelta::Millis(15),
1598 .target_probe_count = 5,
1599 .id = 0}};
Per Kjellanderbfd30652022-05-27 11:15:171600 pacer->CreateProbeClusters(probe_clusters);
Per Kjellander88af2032022-05-16 17:58:401601
Per Kjellanderbfd30652022-05-27 11:15:171602 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
Erik Språng78c82a42019-10-03 16:46:041603
1604 // Add high prio media.
Per Kjellanderbfd30652022-05-27 11:15:171605 pacer->EnqueuePacket(audio_.BuildNextPacket(234));
Erik Språng78c82a42019-10-03 16:46:041606
1607 // Expect small padding packet to be requested.
Danil Chapovalovcad3e0e2020-02-17 17:46:071608 EXPECT_CALL(callback, GeneratePadding(DataSize::Bytes(1)))
Erik Språng78c82a42019-10-03 16:46:041609 .WillOnce([&](DataSize padding_size) {
1610 std::vector<std::unique_ptr<RtpPacketToSend>> padding_packets;
1611 padding_packets.emplace_back(
Björn Terelius31d0f7c2020-02-06 15:35:461612 BuildPacket(RtpPacketMediaType::kPadding, kAudioSsrc, 1,
Erik Språng78c82a42019-10-03 16:46:041613 clock_.TimeInMilliseconds(), 1));
1614 return padding_packets;
1615 });
1616
1617 size_t packets_sent = 0;
1618 bool media_seen = false;
Erik Språnged1fb192020-06-30 11:53:371619 EXPECT_CALL(callback, SendPacket)
Erik Språnge03862b2022-11-29 08:44:511620 .Times(AnyNumber())
Erik Språng78c82a42019-10-03 16:46:041621 .WillRepeatedly([&](std::unique_ptr<RtpPacketToSend> packet,
1622 const PacedPacketInfo& cluster_info) {
1623 if (packets_sent == 0) {
Björn Terelius31d0f7c2020-02-06 15:35:461624 EXPECT_EQ(packet->packet_type(), RtpPacketMediaType::kPadding);
Erik Språng78c82a42019-10-03 16:46:041625 } else {
Björn Terelius31d0f7c2020-02-06 15:35:461626 if (packet->packet_type() == RtpPacketMediaType::kAudio) {
Erik Språng78c82a42019-10-03 16:46:041627 media_seen = true;
1628 }
1629 }
1630 packets_sent++;
1631 });
1632 while (!media_seen) {
Per Kjellanderbfd30652022-05-27 11:15:171633 pacer->ProcessPackets();
Erik Språng78c82a42019-10-03 16:46:041634 clock_.AdvanceTimeMilliseconds(5);
1635 }
1636}
Erik Språngeb487992019-11-14 13:15:151637
Erik Språng6aa5cea2022-05-16 11:20:361638TEST_F(PacingControllerTest, TaskLate) {
Erik Språngeb487992019-11-14 13:15:151639 // Set a low send rate to more easily test timing issues.
Danil Chapovalovcad3e0e2020-02-17 17:46:071640 DataRate kSendRate = DataRate::KilobitsPerSec(30);
Per Kjellanderbfd30652022-05-27 11:15:171641 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
1642 pacer->SetPacingRates(kSendRate, DataRate::Zero());
Erik Språngeb487992019-11-14 13:15:151643
1644 // Add four packets of equal size and priority.
Per Kjellanderbfd30652022-05-27 11:15:171645 pacer->EnqueuePacket(video_.BuildNextPacket(1000));
1646 pacer->EnqueuePacket(video_.BuildNextPacket(1000));
1647 pacer->EnqueuePacket(video_.BuildNextPacket(1000));
1648 pacer->EnqueuePacket(video_.BuildNextPacket(1000));
Erik Språngeb487992019-11-14 13:15:151649
1650 // Process packets, only first should be sent.
1651 EXPECT_CALL(callback_, SendPacket).Times(1);
Per Kjellanderbfd30652022-05-27 11:15:171652 pacer->ProcessPackets();
Erik Språngeb487992019-11-14 13:15:151653
Per Kjellanderbfd30652022-05-27 11:15:171654 Timestamp next_send_time = pacer->NextSendTime();
Erik Språngb571ff42020-04-04 15:20:371655 // Determine time between packets (ca 62ms)
Erik Språngeb487992019-11-14 13:15:151656 const TimeDelta time_between_packets = next_send_time - clock_.CurrentTime();
1657
1658 // Simulate a late process call, executed just before we allow sending the
1659 // fourth packet.
Erik Språngb571ff42020-04-04 15:20:371660 const TimeDelta kOffset = TimeDelta::Millis(1);
1661 clock_.AdvanceTime((time_between_packets * 3) - kOffset);
Erik Språngeb487992019-11-14 13:15:151662
1663 EXPECT_CALL(callback_, SendPacket).Times(2);
Per Kjellanderbfd30652022-05-27 11:15:171664 pacer->ProcessPackets();
Erik Språngeb487992019-11-14 13:15:151665
Erik Språngb571ff42020-04-04 15:20:371666 // Check that next scheduled send time is in ca 1ms.
Per Kjellanderbfd30652022-05-27 11:15:171667 next_send_time = pacer->NextSendTime();
Erik Språngb571ff42020-04-04 15:20:371668 const TimeDelta time_left = next_send_time - clock_.CurrentTime();
1669 EXPECT_EQ(time_left.RoundTo(TimeDelta::Millis(1)), kOffset);
Erik Språngeb487992019-11-14 13:15:151670
Erik Språngb571ff42020-04-04 15:20:371671 clock_.AdvanceTime(time_left);
1672 EXPECT_CALL(callback_, SendPacket);
Per Kjellanderbfd30652022-05-27 11:15:171673 pacer->ProcessPackets();
Erik Språngeb487992019-11-14 13:15:151674}
1675
Erik Språng6aa5cea2022-05-16 11:20:361676TEST_F(PacingControllerTest, NoProbingWhilePaused) {
Erik Språngae100292019-12-17 16:49:491677 uint32_t ssrc = 12345;
1678 uint16_t sequence_number = 1234;
Per Kjellanderbfd30652022-05-27 11:15:171679 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
1680 pacer->SetProbingEnabled(true);
1681 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
1682 pacer->CreateProbeClusters(std::vector<ProbeClusterConfig>(
1683 {{.at_time = clock_.CurrentTime(),
1684 .target_data_rate = kFirstClusterRate,
1685 .target_duration = TimeDelta::Millis(15),
1686 .target_probe_count = 5,
1687 .id = 0},
1688 {.at_time = clock_.CurrentTime(),
1689 .target_data_rate = kSecondClusterRate,
1690 .target_duration = TimeDelta::Millis(15),
1691 .target_probe_count = 5,
1692 .id = 1}}));
Erik Språngae100292019-12-17 16:49:491693
1694 // Send at least one packet so probing can initate.
Per Kjellanderbfd30652022-05-27 11:15:171695 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc,
1696 sequence_number, clock_.TimeInMilliseconds(), 250);
1697 while (pacer->QueueSizePackets() > 0) {
1698 AdvanceTimeUntil(pacer->NextSendTime());
1699 pacer->ProcessPackets();
1700 }
Erik Språngae100292019-12-17 16:49:491701
1702 // Trigger probing.
Per Kjellander88af2032022-05-16 17:58:401703 std::vector<ProbeClusterConfig> probe_clusters = {
1704 {.at_time = clock_.CurrentTime(),
1705 .target_data_rate = DataRate::KilobitsPerSec(10000), // 10 Mbps.
1706 .target_duration = TimeDelta::Millis(15),
1707 .target_probe_count = 5,
1708 .id = 3}};
Per Kjellanderbfd30652022-05-27 11:15:171709 pacer->CreateProbeClusters(probe_clusters);
Erik Språngae100292019-12-17 16:49:491710
1711 // Time to next send time should be small.
Per Kjellanderbfd30652022-05-27 11:15:171712 EXPECT_LT(pacer->NextSendTime() - clock_.CurrentTime(),
Erik Språngae100292019-12-17 16:49:491713 PacingController::kPausedProcessInterval);
1714
1715 // Pause pacer, time to next send time should now be the pause process
1716 // interval.
Per Kjellanderbfd30652022-05-27 11:15:171717 pacer->Pause();
Erik Språngae100292019-12-17 16:49:491718
Per Kjellanderbfd30652022-05-27 11:15:171719 EXPECT_EQ(pacer->NextSendTime() - clock_.CurrentTime(),
Erik Språngae100292019-12-17 16:49:491720 PacingController::kPausedProcessInterval);
1721}
1722
Erik Språng6aa5cea2022-05-16 11:20:361723TEST_F(PacingControllerTest, AudioNotPacedEvenWhenAccountedFor) {
Erik Språng9cb58d52020-03-28 16:15:541724 const uint32_t kSsrc = 12345;
1725 uint16_t sequence_number = 1234;
1726 const size_t kPacketSize = 123;
Per Kjellanderbfd30652022-05-27 11:15:171727 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
Erik Språng9cb58d52020-03-28 16:15:541728
1729 // Account for audio - so that audio packets can cause pushback on other
1730 // types such as video. Audio packet should still be immediated passed
1731 // through though ("WebRTC-Pacer-BlockAudio" needs to be enabled in order
1732 // to pace audio packets).
Per Kjellanderbfd30652022-05-27 11:15:171733 pacer->SetAccountForAudioPackets(true);
Erik Språng9cb58d52020-03-28 16:15:541734
1735 // Set pacing rate to 1 packet/s, no padding.
Per Kjellanderbfd30652022-05-27 11:15:171736 pacer->SetPacingRates(DataSize::Bytes(kPacketSize) / TimeDelta::Seconds(1),
1737 DataRate::Zero());
Erik Språng9cb58d52020-03-28 16:15:541738
1739 // Add and send an audio packet.
Per Kjellanderbfd30652022-05-27 11:15:171740 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kAudio, kSsrc,
1741 sequence_number++, clock_.TimeInMilliseconds(),
1742 kPacketSize);
1743 pacer->ProcessPackets();
Erik Språng9cb58d52020-03-28 16:15:541744
1745 // Advance time, add another audio packet and process. It should be sent
1746 // immediately.
1747 clock_.AdvanceTimeMilliseconds(5);
Per Kjellanderbfd30652022-05-27 11:15:171748 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kAudio, kSsrc,
1749 sequence_number++, clock_.TimeInMilliseconds(),
1750 kPacketSize);
1751 pacer->ProcessPackets();
Erik Språng9cb58d52020-03-28 16:15:541752}
1753
Erik Språng6aa5cea2022-05-16 11:20:361754TEST_F(PacingControllerTest,
Erik Språngb571ff42020-04-04 15:20:371755 PaddingResumesAfterSaturationEvenWithConcurrentAudio) {
Erik Språng0920d5d2020-03-30 15:14:081756 const uint32_t kSsrc = 12345;
1757 const DataRate kPacingDataRate = DataRate::KilobitsPerSec(125);
1758 const DataRate kPaddingDataRate = DataRate::KilobitsPerSec(100);
1759 const TimeDelta kMaxBufferInTime = TimeDelta::Millis(500);
1760 const DataSize kPacketSize = DataSize::Bytes(130);
1761 const TimeDelta kAudioPacketInterval = TimeDelta::Millis(20);
1762
1763 // In this test, we fist send a burst of video in order to saturate the
1764 // padding debt level.
1765 // We then proceed to send audio at a bitrate that is slightly lower than
1766 // the padding rate, meaning there will be a period with audio but no
1767 // padding sent while the debt is draining, then audio and padding will
1768 // be interlieved.
1769
1770 // Verify both with and without accounting for audio.
1771 for (bool account_for_audio : {false, true}) {
1772 uint16_t sequence_number = 1234;
1773 MockPacketSender callback;
Erik Språnge03862b2022-11-29 08:44:511774 EXPECT_CALL(callback, SendPacket).Times(AnyNumber());
Per Kjellanderbfd30652022-05-27 11:15:171775 auto pacer =
1776 std::make_unique<PacingController>(&clock_, &callback, trials_);
1777 pacer->SetAccountForAudioPackets(account_for_audio);
Erik Språng0920d5d2020-03-30 15:14:081778
1779 // First, saturate the padding budget.
Per Kjellanderbfd30652022-05-27 11:15:171780 pacer->SetPacingRates(kPacingDataRate, kPaddingDataRate);
Erik Språng0920d5d2020-03-30 15:14:081781
1782 const TimeDelta kPaddingSaturationTime =
1783 kMaxBufferInTime * kPaddingDataRate /
1784 (kPacingDataRate - kPaddingDataRate);
1785 const DataSize kVideoToSend = kPaddingSaturationTime * kPacingDataRate;
1786 const DataSize kVideoPacketSize = DataSize::Bytes(1200);
1787 DataSize video_sent = DataSize::Zero();
1788 while (video_sent < kVideoToSend) {
Per Kjellanderbfd30652022-05-27 11:15:171789 pacer->EnqueuePacket(
Erik Språng0920d5d2020-03-30 15:14:081790 BuildPacket(RtpPacketMediaType::kVideo, kSsrc, sequence_number++,
1791 clock_.TimeInMilliseconds(), kVideoPacketSize.bytes()));
1792 video_sent += kVideoPacketSize;
1793 }
Per Kjellanderbfd30652022-05-27 11:15:171794 while (pacer->QueueSizePackets() > 0) {
1795 AdvanceTimeUntil(pacer->NextSendTime());
1796 pacer->ProcessPackets();
1797 }
Erik Språng0920d5d2020-03-30 15:14:081798
1799 // Add a stream of audio packets at a rate slightly lower than the padding
1800 // rate, once the padding debt is paid off we expect padding to be
1801 // generated.
Per Kjellanderbfd30652022-05-27 11:15:171802 pacer->SetPacingRates(kPacingDataRate, kPaddingDataRate);
Erik Språng0920d5d2020-03-30 15:14:081803 bool padding_seen = false;
1804 EXPECT_CALL(callback, GeneratePadding).WillOnce([&](DataSize padding_size) {
1805 padding_seen = true;
1806 std::vector<std::unique_ptr<RtpPacketToSend>> padding_packets;
1807 padding_packets.emplace_back(
1808 BuildPacket(RtpPacketMediaType::kPadding, kSsrc, sequence_number++,
1809 clock_.TimeInMilliseconds(), padding_size.bytes()));
1810 return padding_packets;
1811 });
1812
1813 Timestamp start_time = clock_.CurrentTime();
1814 Timestamp last_audio_time = start_time;
1815 while (!padding_seen) {
1816 Timestamp now = clock_.CurrentTime();
Per Kjellanderbfd30652022-05-27 11:15:171817 Timestamp next_send_time = pacer->NextSendTime();
Erik Språng0920d5d2020-03-30 15:14:081818 TimeDelta sleep_time =
1819 std::min(next_send_time, last_audio_time + kAudioPacketInterval) -
1820 now;
1821 clock_.AdvanceTime(sleep_time);
1822 while (clock_.CurrentTime() >= last_audio_time + kAudioPacketInterval) {
Per Kjellanderbfd30652022-05-27 11:15:171823 pacer->EnqueuePacket(
Erik Språng0920d5d2020-03-30 15:14:081824 BuildPacket(RtpPacketMediaType::kAudio, kSsrc, sequence_number++,
1825 clock_.TimeInMilliseconds(), kPacketSize.bytes()));
1826 last_audio_time += kAudioPacketInterval;
1827 }
Per Kjellanderbfd30652022-05-27 11:15:171828 pacer->ProcessPackets();
Erik Språng0920d5d2020-03-30 15:14:081829 }
1830
1831 // Verify how long it took to drain the padding debt. Allow 2% error margin.
1832 const DataRate kAudioDataRate = kPacketSize / kAudioPacketInterval;
1833 const TimeDelta expected_drain_time =
1834 account_for_audio ? (kMaxBufferInTime * kPaddingDataRate /
1835 (kPaddingDataRate - kAudioDataRate))
1836 : kMaxBufferInTime;
1837 const TimeDelta actual_drain_time = clock_.CurrentTime() - start_time;
1838 EXPECT_NEAR(actual_drain_time.ms(), expected_drain_time.ms(),
1839 expected_drain_time.ms() * 0.02)
1840 << " where account_for_audio = "
1841 << (account_for_audio ? "true" : "false");
1842 }
1843}
1844
Erik Språngdf9e51a2022-06-10 09:42:151845TEST_F(PacingControllerTest, AccountsForAudioEnqueueTime) {
Erik Språngb571ff42020-04-04 15:20:371846 const uint32_t kSsrc = 12345;
1847 const DataRate kPacingDataRate = DataRate::KilobitsPerSec(125);
1848 const DataRate kPaddingDataRate = DataRate::Zero();
1849 const DataSize kPacketSize = DataSize::Bytes(130);
1850 const TimeDelta kPacketPacingTime = kPacketSize / kPacingDataRate;
Erik Språngb571ff42020-04-04 15:20:371851 uint32_t sequnce_number = 1;
Per Kjellanderbfd30652022-05-27 11:15:171852 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
Erik Språngb571ff42020-04-04 15:20:371853 // Audio not paced, but still accounted for in budget.
Per Kjellanderbfd30652022-05-27 11:15:171854 pacer->SetAccountForAudioPackets(true);
1855 pacer->SetPacingRates(kPacingDataRate, kPaddingDataRate);
Erik Språngb571ff42020-04-04 15:20:371856
1857 // Enqueue two audio packets, advance clock to where one packet
1858 // should have drained the buffer already, has they been sent
1859 // immediately.
Per Kjellanderbfd30652022-05-27 11:15:171860 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kAudio, kSsrc,
1861 sequnce_number++, clock_.TimeInMilliseconds(),
1862 kPacketSize.bytes());
1863 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kAudio, kSsrc,
1864 sequnce_number++, clock_.TimeInMilliseconds(),
1865 kPacketSize.bytes());
Erik Språngb571ff42020-04-04 15:20:371866 clock_.AdvanceTime(kPacketPacingTime);
1867 // Now process and make sure both packets were sent.
Per Kjellanderbfd30652022-05-27 11:15:171868 pacer->ProcessPackets();
Erik Språngb571ff42020-04-04 15:20:371869 ::testing::Mock::VerifyAndClearExpectations(&callback_);
1870
1871 // Add a video packet. I can't be sent until debt from audio
1872 // packets have been drained.
Per Kjellanderbfd30652022-05-27 11:15:171873 pacer->EnqueuePacket(
1874 BuildPacket(RtpPacketMediaType::kVideo, kSsrc + 1, sequnce_number++,
1875 clock_.TimeInMilliseconds(), kPacketSize.bytes()));
1876 EXPECT_EQ(pacer->NextSendTime() - clock_.CurrentTime(), kPacketPacingTime);
Erik Språngb571ff42020-04-04 15:20:371877}
1878
Erik Språng6aa5cea2022-05-16 11:20:361879TEST_F(PacingControllerTest, NextSendTimeAccountsForPadding) {
Erik Språngbe152f52020-04-06 14:30:231880 const uint32_t kSsrc = 12345;
1881 const DataRate kPacingDataRate = DataRate::KilobitsPerSec(125);
1882 const DataSize kPacketSize = DataSize::Bytes(130);
1883 const TimeDelta kPacketPacingTime = kPacketSize / kPacingDataRate;
Erik Språngbe152f52020-04-06 14:30:231884 uint32_t sequnce_number = 1;
Per Kjellanderbfd30652022-05-27 11:15:171885 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
Erik Språngbe152f52020-04-06 14:30:231886
1887 // Start with no padding.
Per Kjellanderbfd30652022-05-27 11:15:171888 pacer->SetPacingRates(kPacingDataRate, DataRate::Zero());
Erik Språngbe152f52020-04-06 14:30:231889
1890 // Send a single packet.
Per Kjellanderbfd30652022-05-27 11:15:171891 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, kSsrc,
1892 sequnce_number++, clock_.TimeInMilliseconds(),
1893 kPacketSize.bytes());
1894 pacer->ProcessPackets();
Erik Språngbe152f52020-04-06 14:30:231895 ::testing::Mock::VerifyAndClearExpectations(&callback_);
1896
1897 // With current conditions, no need to wake until next keep-alive.
Per Kjellanderbfd30652022-05-27 11:15:171898 EXPECT_EQ(pacer->NextSendTime() - clock_.CurrentTime(),
Erik Språngbe152f52020-04-06 14:30:231899 PacingController::kPausedProcessInterval);
1900
1901 // Enqueue a new packet, that can't be sent until previous buffer has
1902 // drained.
Per Kjellanderbfd30652022-05-27 11:15:171903 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, kSsrc,
1904 sequnce_number++, clock_.TimeInMilliseconds(),
1905 kPacketSize.bytes());
1906 EXPECT_EQ(pacer->NextSendTime() - clock_.CurrentTime(), kPacketPacingTime);
Erik Språngbe152f52020-04-06 14:30:231907 clock_.AdvanceTime(kPacketPacingTime);
Per Kjellanderbfd30652022-05-27 11:15:171908 pacer->ProcessPackets();
Erik Språngbe152f52020-04-06 14:30:231909 ::testing::Mock::VerifyAndClearExpectations(&callback_);
1910
1911 // With current conditions, again no need to wake until next keep-alive.
Per Kjellanderbfd30652022-05-27 11:15:171912 EXPECT_EQ(pacer->NextSendTime() - clock_.CurrentTime(),
Erik Språngbe152f52020-04-06 14:30:231913 PacingController::kPausedProcessInterval);
1914
1915 // Set a non-zero padding rate. Padding also can't be sent until
1916 // previous debt has cleared. Since padding was disabled before, there
1917 // currently is no padding debt.
Per Kjellanderbfd30652022-05-27 11:15:171918 pacer->SetPacingRates(kPacingDataRate, kPacingDataRate / 2);
1919 EXPECT_EQ(pacer->NextSendTime() - clock_.CurrentTime(), kPacketPacingTime);
Erik Språngbe152f52020-04-06 14:30:231920
1921 // Advance time, expect padding.
1922 EXPECT_CALL(callback_, SendPadding).WillOnce(Return(kPacketSize.bytes()));
1923 clock_.AdvanceTime(kPacketPacingTime);
Per Kjellanderbfd30652022-05-27 11:15:171924 pacer->ProcessPackets();
Erik Språngbe152f52020-04-06 14:30:231925 ::testing::Mock::VerifyAndClearExpectations(&callback_);
1926
1927 // Since padding rate is half of pacing rate, next time we can send
1928 // padding is double the packet pacing time.
Per Kjellanderbfd30652022-05-27 11:15:171929 EXPECT_EQ(pacer->NextSendTime() - clock_.CurrentTime(),
Erik Språngbe152f52020-04-06 14:30:231930 kPacketPacingTime * 2);
1931
1932 // Insert a packet to be sent, this take precedence again.
Per Kjellanderbfd30652022-05-27 11:15:171933 pacer->EnqueuePacket(
1934 BuildPacket(RtpPacketMediaType::kVideo, kSsrc, sequnce_number++,
1935 clock_.TimeInMilliseconds(), kPacketSize.bytes()));
1936 EXPECT_EQ(pacer->NextSendTime() - clock_.CurrentTime(), kPacketPacingTime);
Erik Språngbe152f52020-04-06 14:30:231937}
1938
Erik Språng6aa5cea2022-05-16 11:20:361939TEST_F(PacingControllerTest, PaddingTargetAccountsForPaddingRate) {
Erik Språngc52e6272022-07-07 10:41:571940 // Target size for a padding packet is 5ms * padding rate.
1941 const TimeDelta kPaddingTarget = TimeDelta::Millis(5);
Erik Språnge486a7b2022-03-15 14:13:251942 srand(0);
1943 // Need to initialize PacingController after we initialize clock.
Erik Språngc52e6272022-07-07 10:41:571944 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
Erik Språng9acc18d2020-04-16 17:41:071945
1946 const uint32_t kSsrc = 12345;
1947 const DataRate kPacingDataRate = DataRate::KilobitsPerSec(125);
1948 const DataSize kPacketSize = DataSize::Bytes(130);
1949
1950 uint32_t sequnce_number = 1;
1951
1952 // Start with pacing and padding rate equal.
Per Kjellanderbfd30652022-05-27 11:15:171953 pacer->SetPacingRates(kPacingDataRate, kPacingDataRate);
Erik Språng9acc18d2020-04-16 17:41:071954
1955 // Send a single packet.
Per Kjellanderbfd30652022-05-27 11:15:171956 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, kSsrc,
1957 sequnce_number++, clock_.TimeInMilliseconds(),
1958 kPacketSize.bytes());
1959 AdvanceTimeUntil(pacer->NextSendTime());
1960 pacer->ProcessPackets();
Erik Språng9acc18d2020-04-16 17:41:071961 ::testing::Mock::VerifyAndClearExpectations(&callback_);
1962
1963 size_t expected_padding_target_bytes =
1964 (kPaddingTarget * kPacingDataRate).bytes();
1965 EXPECT_CALL(callback_, SendPadding(expected_padding_target_bytes))
1966 .WillOnce(Return(expected_padding_target_bytes));
Per Kjellanderbfd30652022-05-27 11:15:171967 AdvanceTimeUntil(pacer->NextSendTime());
1968 pacer->ProcessPackets();
Erik Språng9acc18d2020-04-16 17:41:071969
1970 // Half the padding rate - expect half the padding target.
Per Kjellanderbfd30652022-05-27 11:15:171971 pacer->SetPacingRates(kPacingDataRate, kPacingDataRate / 2);
Erik Språng9acc18d2020-04-16 17:41:071972 EXPECT_CALL(callback_, SendPadding(expected_padding_target_bytes / 2))
1973 .WillOnce(Return(expected_padding_target_bytes / 2));
Per Kjellanderbfd30652022-05-27 11:15:171974 AdvanceTimeUntil(pacer->NextSendTime());
1975 pacer->ProcessPackets();
Erik Språng9acc18d2020-04-16 17:41:071976}
1977
Erik Språng6aa5cea2022-05-16 11:20:361978TEST_F(PacingControllerTest, SendsFecPackets) {
Erik Språng1d50cb62020-07-02 15:41:321979 const uint32_t kSsrc = 12345;
1980 const uint32_t kFlexSsrc = 54321;
1981 uint16_t sequence_number = 1234;
1982 uint16_t flexfec_sequence_number = 4321;
1983 const size_t kPacketSize = 123;
Per Kjellanderbfd30652022-05-27 11:15:171984 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
Erik Språng1d50cb62020-07-02 15:41:321985
1986 // Set pacing rate to 1000 packet/s, no padding.
Per Kjellanderbfd30652022-05-27 11:15:171987 pacer->SetPacingRates(
Erik Språng1d50cb62020-07-02 15:41:321988 DataSize::Bytes(1000 * kPacketSize) / TimeDelta::Seconds(1),
1989 DataRate::Zero());
1990
1991 int64_t now = clock_.TimeInMilliseconds();
Per Kjellanderbfd30652022-05-27 11:15:171992 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, kSsrc,
1993 sequence_number, now, kPacketSize));
Erik Språng1d50cb62020-07-02 15:41:321994 EXPECT_CALL(callback_, SendPacket(kSsrc, sequence_number, now, false, false));
1995 EXPECT_CALL(callback_, FetchFec).WillOnce([&]() {
1996 EXPECT_CALL(callback_, SendPacket(kFlexSsrc, flexfec_sequence_number, now,
1997 false, false));
1998 EXPECT_CALL(callback_, FetchFec);
1999 std::vector<std::unique_ptr<RtpPacketToSend>> fec_packets;
2000 fec_packets.push_back(
2001 BuildPacket(RtpPacketMediaType::kForwardErrorCorrection, kFlexSsrc,
2002 flexfec_sequence_number, now, kPacketSize));
2003 return fec_packets;
2004 });
Per Kjellanderbfd30652022-05-27 11:15:172005 AdvanceTimeUntil(pacer->NextSendTime());
2006 pacer->ProcessPackets();
2007 AdvanceTimeUntil(pacer->NextSendTime());
2008 pacer->ProcessPackets();
Erik Språng1d50cb62020-07-02 15:41:322009}
2010
Erik Språng6aa5cea2022-05-16 11:20:362011TEST_F(PacingControllerTest, GapInPacingDoesntAccumulateBudget) {
Erik Språng41bbc3d2021-10-05 08:17:392012 const uint32_t kSsrc = 12345;
2013 uint16_t sequence_number = 1234;
2014 const DataSize kPackeSize = DataSize::Bytes(250);
2015 const TimeDelta kPacketSendTime = TimeDelta::Millis(15);
Per Kjellanderbfd30652022-05-27 11:15:172016 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
Erik Språng41bbc3d2021-10-05 08:17:392017
Per Kjellanderbfd30652022-05-27 11:15:172018 pacer->SetPacingRates(kPackeSize / kPacketSendTime,
2019 /*padding_rate=*/DataRate::Zero());
Erik Språng41bbc3d2021-10-05 08:17:392020
2021 // Send an initial packet.
Per Kjellanderbfd30652022-05-27 11:15:172022 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, kSsrc,
2023 sequence_number++, clock_.TimeInMilliseconds(),
2024 kPackeSize.bytes());
2025 pacer->ProcessPackets();
Erik Språng41bbc3d2021-10-05 08:17:392026 ::testing::Mock::VerifyAndClearExpectations(&callback_);
2027
2028 // Advance time kPacketSendTime past where the media debt should be 0.
2029 clock_.AdvanceTime(2 * kPacketSendTime);
2030
2031 // Enqueue two new packets. Expect only one to be sent one ProcessPackets().
Per Kjellanderbfd30652022-05-27 11:15:172032 pacer->EnqueuePacket(
2033 BuildPacket(RtpPacketMediaType::kVideo, kSsrc, sequence_number + 1,
2034 clock_.TimeInMilliseconds(), kPackeSize.bytes()));
2035 pacer->EnqueuePacket(
2036 BuildPacket(RtpPacketMediaType::kVideo, kSsrc, sequence_number + 2,
2037 clock_.TimeInMilliseconds(), kPackeSize.bytes()));
Erik Språng41bbc3d2021-10-05 08:17:392038 EXPECT_CALL(callback_, SendPacket(kSsrc, sequence_number + 1,
2039 clock_.TimeInMilliseconds(), false, false));
Per Kjellanderbfd30652022-05-27 11:15:172040 pacer->ProcessPackets();
Erik Språng41bbc3d2021-10-05 08:17:392041}
2042
Erik Språng6aa5cea2022-05-16 11:20:362043TEST_F(PacingControllerTest, HandlesSubMicrosecondSendIntervals) {
Erik Språngb844dd82022-04-22 10:18:172044 static constexpr DataSize kPacketSize = DataSize::Bytes(1);
2045 static constexpr TimeDelta kPacketSendTime = TimeDelta::Micros(1);
Per Kjellanderbfd30652022-05-27 11:15:172046 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
Erik Språngb844dd82022-04-22 10:18:172047
2048 // Set pacing rate such that a packet is sent in 0.5us.
Per Kjellanderbfd30652022-05-27 11:15:172049 pacer->SetPacingRates(/*pacing_rate=*/2 * kPacketSize / kPacketSendTime,
2050 /*padding_rate=*/DataRate::Zero());
Erik Språngb844dd82022-04-22 10:18:172051
2052 // Enqueue three packets, the first two should be sent immediately - the third
2053 // should cause a non-zero delta to the next process time.
2054 EXPECT_CALL(callback_, SendPacket).Times(2);
2055 for (int i = 0; i < 3; ++i) {
Per Kjellanderbfd30652022-05-27 11:15:172056 pacer->EnqueuePacket(BuildPacket(
2057 RtpPacketMediaType::kVideo, /*ssrc=*/12345, /*sequence_number=*/i,
2058 clock_.TimeInMilliseconds(), kPacketSize.bytes()));
Erik Språngb844dd82022-04-22 10:18:172059 }
Per Kjellanderbfd30652022-05-27 11:15:172060 pacer->ProcessPackets();
Erik Språngb844dd82022-04-22 10:18:172061
Per Kjellanderbfd30652022-05-27 11:15:172062 EXPECT_GT(pacer->NextSendTime(), clock_.CurrentTime());
Erik Språngb844dd82022-04-22 10:18:172063}
2064
Erik Språng6aa5cea2022-05-16 11:20:362065TEST_F(PacingControllerTest, HandlesSubMicrosecondPaddingInterval) {
Erik Språngb844dd82022-04-22 10:18:172066 static constexpr DataSize kPacketSize = DataSize::Bytes(1);
2067 static constexpr TimeDelta kPacketSendTime = TimeDelta::Micros(1);
Per Kjellanderbfd30652022-05-27 11:15:172068 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
Erik Språngb844dd82022-04-22 10:18:172069
2070 // Set both pacing and padding rates to 1 byte per 0.5us.
Per Kjellanderbfd30652022-05-27 11:15:172071 pacer->SetPacingRates(/*pacing_rate=*/2 * kPacketSize / kPacketSendTime,
2072 /*padding_rate=*/2 * kPacketSize / kPacketSendTime);
Erik Språngb844dd82022-04-22 10:18:172073
2074 // Enqueue and send one packet.
2075 EXPECT_CALL(callback_, SendPacket);
Per Kjellanderbfd30652022-05-27 11:15:172076 pacer->EnqueuePacket(BuildPacket(
2077 RtpPacketMediaType::kVideo, /*ssrc=*/12345, /*sequence_number=*/1234,
2078 clock_.TimeInMilliseconds(), kPacketSize.bytes()));
2079 pacer->ProcessPackets();
Erik Språngb844dd82022-04-22 10:18:172080
2081 // The padding debt is now 1 byte, and the pacing time for that is lower than
2082 // the precision of a TimeStamp tick. Make sure the pacer still indicates a
2083 // non-zero sleep time is needed until the next process.
Per Kjellanderbfd30652022-05-27 11:15:172084 EXPECT_GT(pacer->NextSendTime(), clock_.CurrentTime());
Erik Språngb844dd82022-04-22 10:18:172085}
2086
Per Kjellander8d847f02022-06-01 18:21:582087TEST_F(PacingControllerTest, SendsPacketsInBurstImmediately) {
2088 constexpr TimeDelta kMaxDelay = TimeDelta::Millis(20);
2089 PacingController pacer(&clock_, &callback_, trials_);
2090 pacer.SetSendBurstInterval(kMaxDelay);
2091 pacer.SetPacingRates(DataRate::BytesPerSec(10000), DataRate::Zero());
2092
2093 // Max allowed send burst size is 100000*20/1000) = 200byte
2094 pacer.EnqueuePacket(video_.BuildNextPacket(100));
2095 pacer.EnqueuePacket(video_.BuildNextPacket(100));
2096 pacer.EnqueuePacket(video_.BuildNextPacket(100));
2097 pacer.ProcessPackets();
2098 EXPECT_EQ(pacer.QueueSizePackets(), 1u);
2099 EXPECT_EQ(pacer.NextSendTime(), clock_.CurrentTime() + kMaxDelay);
2100
2101 AdvanceTimeUntil(pacer.NextSendTime());
2102 pacer.ProcessPackets();
2103 EXPECT_EQ(pacer.QueueSizePackets(), 0u);
2104}
2105
2106TEST_F(PacingControllerTest, SendsPacketsInBurstEvenIfNotEnqueedAtSameTime) {
2107 constexpr TimeDelta kMaxDelay = TimeDelta::Millis(20);
2108 PacingController pacer(&clock_, &callback_, trials_);
2109 pacer.SetSendBurstInterval(kMaxDelay);
2110 pacer.SetPacingRates(DataRate::BytesPerSec(10000), DataRate::Zero());
2111 pacer.EnqueuePacket(video_.BuildNextPacket(200));
2112 EXPECT_EQ(pacer.NextSendTime(), clock_.CurrentTime());
2113 pacer.ProcessPackets();
2114 clock_.AdvanceTime(TimeDelta::Millis(1));
2115 pacer.EnqueuePacket(video_.BuildNextPacket(200));
2116 EXPECT_EQ(pacer.NextSendTime(), clock_.CurrentTime());
2117 pacer.ProcessPackets();
2118 EXPECT_EQ(pacer.QueueSizePackets(), 0u);
2119}
2120
2121TEST_F(PacingControllerTest, RespectsTargetRateWhenSendingPacketsInBursts) {
2122 PacingController pacer(&clock_, &callback_, trials_);
2123 pacer.SetSendBurstInterval(TimeDelta::Millis(20));
2124 pacer.SetAccountForAudioPackets(true);
2125 pacer.SetPacingRates(DataRate::KilobitsPerSec(1000), DataRate::Zero());
2126 Timestamp start_time = clock_.CurrentTime();
2127 // Inject 100 packets, with size 1000bytes over 100ms.
2128 // Expect only 1Mbps / (8*1000) / 10 = 12 packets to be sent.
2129 // Packets are sent in burst. Each burst is then 3 packets * 1000bytes at
2130 // 1Mbits = 24ms long. Thus, expect 4 bursts.
2131 EXPECT_CALL(callback_, SendPacket).Times(12);
2132 int number_of_bursts = 0;
2133 while (clock_.CurrentTime() < start_time + TimeDelta::Millis(100)) {
2134 pacer.EnqueuePacket(video_.BuildNextPacket(1000));
2135 pacer.EnqueuePacket(video_.BuildNextPacket(1000));
2136 pacer.EnqueuePacket(video_.BuildNextPacket(1000));
2137 pacer.EnqueuePacket(video_.BuildNextPacket(1000));
2138 pacer.EnqueuePacket(video_.BuildNextPacket(1000));
2139 if (pacer.NextSendTime() <= clock_.CurrentTime()) {
2140 pacer.ProcessPackets();
2141 ++number_of_bursts;
2142 }
2143 clock_.AdvanceTime(TimeDelta::Millis(5));
2144 }
2145 EXPECT_EQ(pacer.QueueSizePackets(), 88u);
2146 EXPECT_EQ(number_of_bursts, 4);
2147}
2148
Erik Språngdf9e51a2022-06-10 09:42:152149TEST_F(PacingControllerTest, RespectsQueueTimeLimit) {
2150 static constexpr DataSize kPacketSize = DataSize::Bytes(100);
2151 static constexpr DataRate kNominalPacingRate = DataRate::KilobitsPerSec(200);
2152 static constexpr TimeDelta kPacketPacingTime =
2153 kPacketSize / kNominalPacingRate;
2154 static constexpr TimeDelta kQueueTimeLimit = TimeDelta::Millis(1000);
2155
2156 PacingController pacer(&clock_, &callback_, trials_);
2157 pacer.SetPacingRates(kNominalPacingRate, /*padding_rate=*/DataRate::Zero());
2158 pacer.SetQueueTimeLimit(kQueueTimeLimit);
2159
2160 // Fill pacer up to queue time limit.
2161 static constexpr int kNumPackets = kQueueTimeLimit / kPacketPacingTime;
2162 for (int i = 0; i < kNumPackets; ++i) {
2163 pacer.EnqueuePacket(video_.BuildNextPacket(kPacketSize.bytes()));
2164 }
2165 EXPECT_EQ(pacer.ExpectedQueueTime(), kQueueTimeLimit);
2166 EXPECT_EQ(pacer.pacing_rate(), kNominalPacingRate);
2167
2168 // Double the amount of packets in the queue, the queue time limit should
2169 // effectively double the pacing rate in response.
2170 for (int i = 0; i < kNumPackets; ++i) {
2171 pacer.EnqueuePacket(video_.BuildNextPacket(kPacketSize.bytes()));
2172 }
2173 EXPECT_EQ(pacer.ExpectedQueueTime(), kQueueTimeLimit);
2174 EXPECT_EQ(pacer.pacing_rate(), 2 * kNominalPacingRate);
2175
2176 // Send all the packets, should take as long as the queue time limit.
2177 Timestamp start_time = clock_.CurrentTime();
2178 while (pacer.QueueSizePackets() > 0) {
2179 AdvanceTimeUntil(pacer.NextSendTime());
2180 pacer.ProcessPackets();
2181 }
2182 EXPECT_EQ(clock_.CurrentTime() - start_time, kQueueTimeLimit);
2183
2184 // We're back in a normal state - pacing rate should be back to previous
2185 // levels.
2186 EXPECT_EQ(pacer.pacing_rate(), kNominalPacingRate);
2187}
2188
Erik Språngc18a8fd2022-08-20 12:34:202189TEST_F(PacingControllerTest, BudgetDoesNotAffectRetransmissionInsTrial) {
2190 const DataSize kPacketSize = DataSize::Bytes(1000);
2191
2192 EXPECT_CALL(callback_, SendPadding).Times(0);
2193 const test::ExplicitKeyValueConfig trials(
2194 "WebRTC-Pacer-FastRetransmissions/Enabled/");
2195 PacingController pacer(&clock_, &callback_, trials);
2196 pacer.SetPacingRates(kTargetRate, /*padding_rate=*/DataRate::Zero());
2197
2198 // Send a video packet so that we have a bit debt.
2199 pacer.EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, kVideoSsrc,
2200 /*sequence_number=*/1,
2201 /*capture_time=*/1, kPacketSize.bytes()));
2202 EXPECT_CALL(callback_, SendPacket);
2203 pacer.ProcessPackets();
2204 EXPECT_GT(pacer.NextSendTime(), clock_.CurrentTime());
2205
2206 // A retransmission packet should still be immediately processed.
2207 EXPECT_CALL(callback_, SendPacket);
2208 pacer.EnqueuePacket(BuildPacket(RtpPacketMediaType::kRetransmission,
2209 kVideoSsrc,
2210 /*sequence_number=*/1,
2211 /*capture_time=*/1, kPacketSize.bytes()));
2212 pacer.ProcessPackets();
2213}
2214
Erik Språnge158b772022-11-17 10:46:282215TEST_F(PacingControllerTest, AbortsAfterReachingCircuitBreakLimit) {
2216 const DataSize kPacketSize = DataSize::Bytes(1000);
2217
2218 EXPECT_CALL(callback_, SendPadding).Times(0);
2219 PacingController pacer(&clock_, &callback_, trials_);
2220 pacer.SetPacingRates(kTargetRate, /*padding_rate=*/DataRate::Zero());
2221
2222 // Set the circuit breaker to abort after one iteration of the main
2223 // sending loop.
2224 pacer.SetCircuitBreakerThreshold(1);
2225 EXPECT_CALL(callback_, SendPacket).Times(1);
2226
2227 // Send two packets.
2228 pacer.EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, kVideoSsrc,
2229 /*sequence_number=*/1,
2230 /*capture_time=*/1, kPacketSize.bytes()));
2231 pacer.EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, kVideoSsrc,
2232 /*sequence_number=*/2,
2233 /*capture_time=*/2, kPacketSize.bytes()));
2234
2235 // Advance time to way past where both should be eligible for sending.
2236 clock_.AdvanceTime(TimeDelta::Seconds(1));
2237
2238 pacer.ProcessPackets();
2239}
2240
Erik Språnge03862b2022-11-29 08:44:512241TEST_F(PacingControllerTest, DoesNotPadIfProcessThreadIsBorked) {
2242 PacingControllerPadding callback;
2243 PacingController pacer(&clock_, &callback, trials_);
2244
2245 // Set both pacing and padding rate to be non-zero.
2246 pacer.SetPacingRates(kTargetRate, /*padding_rate=*/kTargetRate);
2247
2248 // Add one packet to the queue, but do not send it yet.
2249 pacer.EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, kVideoSsrc,
2250 /*sequence_number=*/1,
2251 /*capture_time=*/1,
2252 /*size=*/1000));
2253
2254 // Advance time to waaay after the packet should have been sent.
2255 clock_.AdvanceTime(TimeDelta::Seconds(42));
2256
2257 // `ProcessPackets()` should send the delayed packet, followed by a small
2258 // amount of missed padding.
2259 pacer.ProcessPackets();
2260
2261 // The max padding window is the max replay duration + the target padding
2262 // duration.
2263 const DataSize kMaxPadding = (PacingController::kMaxPaddingReplayDuration +
2264 PacingController::kTargetPaddingDuration) *
2265 kTargetRate;
2266
2267 EXPECT_LE(callback.padding_sent(), kMaxPadding.bytes<size_t>());
2268}
2269
Erik Språngaab1bde2023-04-06 13:47:072270TEST_F(PacingControllerTest, FlushesPacketsOnKeyFrames) {
2271 const uint32_t kSsrc = 12345;
2272 const uint32_t kRtxSsrc = 12346;
2273
2274 const test::ExplicitKeyValueConfig trials(
2275 "WebRTC-Pacer-KeyframeFlushing/Enabled/");
2276 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials);
2277 EXPECT_CALL(callback_, GetRtxSsrcForMedia(kSsrc))
2278 .WillRepeatedly(Return(kRtxSsrc));
2279 pacer->SetPacingRates(kTargetRate, DataRate::Zero());
2280
2281 // Enqueue a video packet and a retransmission of that video stream.
2282 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, kSsrc,
2283 /*sequence_number=*/1, /*capture_time=*/1,
2284 /*size_bytes=*/100));
2285 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kRetransmission,
2286 kRtxSsrc,
2287 /*sequence_number=*/10, /*capture_time=*/1,
2288 /*size_bytes=*/100));
2289 EXPECT_EQ(pacer->QueueSizePackets(), 2u);
2290
2291 // Enqueue the first packet of a keyframe for said stream.
2292 auto packet = BuildPacket(RtpPacketMediaType::kVideo, kSsrc,
2293 /*sequence_number=*/2, /*capture_time=*/2,
2294 /*size_bytes=*/1000);
2295 packet->set_is_key_frame(true);
2296 packet->set_first_packet_of_frame(true);
2297 pacer->EnqueuePacket(std::move(packet));
2298
2299 // Only they new keyframe packet should be left in the queue.
2300 EXPECT_EQ(pacer->QueueSizePackets(), 1u);
2301
2302 EXPECT_CALL(callback_, SendPacket(kSsrc, /*sequence_number=*/2,
2303 /*timestamp=*/2, /*is_retrnamission=*/false,
2304 /*is_padding=*/false));
2305 AdvanceTimeUntil(pacer->NextSendTime());
2306 pacer->ProcessPackets();
2307}
2308
Per Kjellanderbfd30652022-05-27 11:15:172309} // namespace
Erik Språngd05edec2019-08-14 08:43:472310} // namespace webrtc