blob: a953d5b43930ba2d83714568f576bedcf627d74f [file] [log] [blame]
Erik Språngd05edec2019-08-14 10:43:47 +02001/*
2 * Copyright (c) 2019 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11#include "modules/pacing/pacing_controller.h"
12
13#include <algorithm>
14#include <list>
15#include <memory>
16#include <string>
17#include <utility>
18#include <vector>
19
Erik Språngd05edec2019-08-14 10:43:47 +020020#include "api/units/data_rate.h"
21#include "modules/pacing/packet_router.h"
22#include "system_wrappers/include/clock.h"
Erik Språngb9d38092020-07-17 12:06:12 +020023#include "test/explicit_key_value_config.h"
Erik Språngd05edec2019-08-14 10:43:47 +020024#include "test/field_trial.h"
25#include "test/gmock.h"
26#include "test/gtest.h"
27
28using ::testing::_;
29using ::testing::Field;
30using ::testing::Pointee;
31using ::testing::Property;
32using ::testing::Return;
33
34namespace webrtc {
35namespace test {
36namespace {
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +010037constexpr DataRate kFirstClusterRate = DataRate::KilobitsPerSec(900);
38constexpr DataRate kSecondClusterRate = DataRate::KilobitsPerSec(1800);
Erik Språngd05edec2019-08-14 10:43:47 +020039
40// The error stems from truncating the time interval of probe packets to integer
41// values. This results in probing slightly higher than the target bitrate.
42// For 1.8 Mbps, this comes to be about 120 kbps with 1200 probe packets.
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +010043constexpr DataRate kProbingErrorMargin = DataRate::KilobitsPerSec(150);
Erik Språngd05edec2019-08-14 10:43:47 +020044
45const float kPaceMultiplier = 2.5f;
46
47constexpr uint32_t kAudioSsrc = 12345;
48constexpr uint32_t kVideoSsrc = 234565;
49constexpr uint32_t kVideoRtxSsrc = 34567;
50constexpr uint32_t kFlexFecSsrc = 45678;
51
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +010052constexpr DataRate kTargetRate = DataRate::KilobitsPerSec(800);
Erik Språngd05edec2019-08-14 10:43:47 +020053
Björn Terelius31d0f7c2020-02-06 16:35:46 +010054std::unique_ptr<RtpPacketToSend> BuildPacket(RtpPacketMediaType type,
Erik Språngd05edec2019-08-14 10:43:47 +020055 uint32_t ssrc,
56 uint16_t sequence_number,
57 int64_t capture_time_ms,
58 size_t size) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +020059 auto packet = std::make_unique<RtpPacketToSend>(nullptr);
Erik Språngd05edec2019-08-14 10:43:47 +020060 packet->set_packet_type(type);
61 packet->SetSsrc(ssrc);
62 packet->SetSequenceNumber(sequence_number);
63 packet->set_capture_time_ms(capture_time_ms);
64 packet->SetPayloadSize(size);
65 return packet;
66}
67} // namespace
68
69// Mock callback proxy, where both new and old api redirects to common mock
70// methods that focus on core aspects.
71class MockPacingControllerCallback : public PacingController::PacketSender {
72 public:
Erik Språnged1fb192020-06-30 11:53:37 +000073 void SendPacket(std::unique_ptr<RtpPacketToSend> packet,
74 const PacedPacketInfo& cluster_info) override {
Erik Språngd05edec2019-08-14 10:43:47 +020075 SendPacket(packet->Ssrc(), packet->SequenceNumber(),
76 packet->capture_time_ms(),
Björn Terelius31d0f7c2020-02-06 16:35:46 +010077 packet->packet_type() == RtpPacketMediaType::kRetransmission,
78 packet->packet_type() == RtpPacketMediaType::kPadding);
Erik Språngd05edec2019-08-14 10:43:47 +020079 }
80
Erik Språngd05edec2019-08-14 10:43:47 +020081 std::vector<std::unique_ptr<RtpPacketToSend>> GeneratePadding(
82 DataSize target_size) override {
83 std::vector<std::unique_ptr<RtpPacketToSend>> ret;
84 size_t padding_size = SendPadding(target_size.bytes());
85 if (padding_size > 0) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +020086 auto packet = std::make_unique<RtpPacketToSend>(nullptr);
Erik Språngd05edec2019-08-14 10:43:47 +020087 packet->SetPayloadSize(padding_size);
Björn Terelius31d0f7c2020-02-06 16:35:46 +010088 packet->set_packet_type(RtpPacketMediaType::kPadding);
Erik Språngd05edec2019-08-14 10:43:47 +020089 ret.emplace_back(std::move(packet));
90 }
91 return ret;
92 }
93
Danil Chapovalov014197b2020-05-26 19:18:17 +020094 MOCK_METHOD(void,
95 SendPacket,
96 (uint32_t ssrc,
97 uint16_t sequence_number,
98 int64_t capture_timestamp,
99 bool retransmission,
100 bool padding));
Erik Språng1d50cb62020-07-02 17:41:32 +0200101 MOCK_METHOD(std::vector<std::unique_ptr<RtpPacketToSend>>,
102 FetchFec,
103 (),
104 (override));
Danil Chapovalov014197b2020-05-26 19:18:17 +0200105 MOCK_METHOD(size_t, SendPadding, (size_t target_size));
Erik Språngd05edec2019-08-14 10:43:47 +0200106};
107
108// Mock callback implementing the raw api.
109class MockPacketSender : public PacingController::PacketSender {
110 public:
Danil Chapovalov014197b2020-05-26 19:18:17 +0200111 MOCK_METHOD(void,
Erik Språnged1fb192020-06-30 11:53:37 +0000112 SendPacket,
Danil Chapovalov014197b2020-05-26 19:18:17 +0200113 (std::unique_ptr<RtpPacketToSend> packet,
114 const PacedPacketInfo& cluster_info),
115 (override));
116 MOCK_METHOD(std::vector<std::unique_ptr<RtpPacketToSend>>,
Erik Språng1d50cb62020-07-02 17:41:32 +0200117 FetchFec,
118 (),
119 (override));
120
121 MOCK_METHOD(std::vector<std::unique_ptr<RtpPacketToSend>>,
Danil Chapovalov014197b2020-05-26 19:18:17 +0200122 GeneratePadding,
123 (DataSize target_size),
124 (override));
Erik Språngd05edec2019-08-14 10:43:47 +0200125};
126
127class PacingControllerPadding : public PacingController::PacketSender {
128 public:
129 static const size_t kPaddingPacketSize = 224;
130
Erik Språngeb487992019-11-14 14:15:15 +0100131 PacingControllerPadding() : padding_sent_(0), total_bytes_sent_(0) {}
Erik Språngd05edec2019-08-14 10:43:47 +0200132
Erik Språnged1fb192020-06-30 11:53:37 +0000133 void SendPacket(std::unique_ptr<RtpPacketToSend> packet,
134 const PacedPacketInfo& pacing_info) override {
Erik Språngeb487992019-11-14 14:15:15 +0100135 total_bytes_sent_ += packet->payload_size();
136 }
Erik Språngd05edec2019-08-14 10:43:47 +0200137
Erik Språng1d50cb62020-07-02 17:41:32 +0200138 std::vector<std::unique_ptr<RtpPacketToSend>> FetchFec() override {
139 return {};
140 }
141
Erik Språngd05edec2019-08-14 10:43:47 +0200142 std::vector<std::unique_ptr<RtpPacketToSend>> GeneratePadding(
143 DataSize target_size) override {
144 size_t num_packets =
145 (target_size.bytes() + kPaddingPacketSize - 1) / kPaddingPacketSize;
146 std::vector<std::unique_ptr<RtpPacketToSend>> packets;
147 for (size_t i = 0; i < num_packets; ++i) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200148 packets.emplace_back(std::make_unique<RtpPacketToSend>(nullptr));
Erik Språngd05edec2019-08-14 10:43:47 +0200149 packets.back()->SetPadding(kPaddingPacketSize);
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100150 packets.back()->set_packet_type(RtpPacketMediaType::kPadding);
Erik Språngd05edec2019-08-14 10:43:47 +0200151 padding_sent_ += kPaddingPacketSize;
152 }
153 return packets;
154 }
155
156 size_t padding_sent() { return padding_sent_; }
Erik Språngeb487992019-11-14 14:15:15 +0100157 size_t total_bytes_sent() { return total_bytes_sent_; }
Erik Språngd05edec2019-08-14 10:43:47 +0200158
159 private:
160 size_t padding_sent_;
Erik Språngeb487992019-11-14 14:15:15 +0100161 size_t total_bytes_sent_;
Erik Språngd05edec2019-08-14 10:43:47 +0200162};
163
164class PacingControllerProbing : public PacingController::PacketSender {
165 public:
166 PacingControllerProbing() : packets_sent_(0), padding_sent_(0) {}
167
Erik Språnged1fb192020-06-30 11:53:37 +0000168 void SendPacket(std::unique_ptr<RtpPacketToSend> packet,
169 const PacedPacketInfo& pacing_info) override {
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100170 if (packet->packet_type() != RtpPacketMediaType::kPadding) {
Erik Språngd05edec2019-08-14 10:43:47 +0200171 ++packets_sent_;
172 }
Erik Språngb9d38092020-07-17 12:06:12 +0200173 last_pacing_info_ = pacing_info;
Erik Språngd05edec2019-08-14 10:43:47 +0200174 }
175
Erik Språng1d50cb62020-07-02 17:41:32 +0200176 std::vector<std::unique_ptr<RtpPacketToSend>> FetchFec() override {
177 return {};
178 }
179
Erik Språngd05edec2019-08-14 10:43:47 +0200180 std::vector<std::unique_ptr<RtpPacketToSend>> GeneratePadding(
181 DataSize target_size) override {
Erik Språngb210eeb2019-11-05 11:21:48 +0100182 // From RTPSender:
183 // Max in the RFC 3550 is 255 bytes, we limit it to be modulus 32 for SRTP.
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +0100184 const DataSize kMaxPadding = DataSize::Bytes(224);
Erik Språngb210eeb2019-11-05 11:21:48 +0100185
Erik Språngd05edec2019-08-14 10:43:47 +0200186 std::vector<std::unique_ptr<RtpPacketToSend>> packets;
Erik Språngb210eeb2019-11-05 11:21:48 +0100187 while (target_size > DataSize::Zero()) {
188 DataSize padding_size = std::min(kMaxPadding, target_size);
189 packets.emplace_back(std::make_unique<RtpPacketToSend>(nullptr));
190 packets.back()->SetPadding(padding_size.bytes());
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100191 packets.back()->set_packet_type(RtpPacketMediaType::kPadding);
Erik Språngb210eeb2019-11-05 11:21:48 +0100192 padding_sent_ += padding_size.bytes();
193 target_size -= padding_size;
194 }
Erik Språngd05edec2019-08-14 10:43:47 +0200195 return packets;
196 }
197
198 int packets_sent() const { return packets_sent_; }
Erik Språngd05edec2019-08-14 10:43:47 +0200199 int padding_sent() const { return padding_sent_; }
Erik Språngb9d38092020-07-17 12:06:12 +0200200 int total_packets_sent() const { return packets_sent_ + padding_sent_; }
201 PacedPacketInfo last_pacing_info() const { return last_pacing_info_; }
Erik Språngd05edec2019-08-14 10:43:47 +0200202
203 private:
204 int packets_sent_;
205 int padding_sent_;
Erik Språngb9d38092020-07-17 12:06:12 +0200206 PacedPacketInfo last_pacing_info_;
Erik Språngd05edec2019-08-14 10:43:47 +0200207};
208
Erik Språngeb487992019-11-14 14:15:15 +0100209class PacingControllerTest
210 : public ::testing::TestWithParam<PacingController::ProcessMode> {
Erik Språngd05edec2019-08-14 10:43:47 +0200211 protected:
Erik Språng9acc18d2020-04-16 19:41:07 +0200212 PacingControllerTest() : clock_(123456) {}
213
214 void SetUp() override {
Erik Språngd05edec2019-08-14 10:43:47 +0200215 srand(0);
216 // Need to initialize PacingController after we initialize clock.
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200217 pacer_ = std::make_unique<PacingController>(&clock_, &callback_, nullptr,
Erik Språngeb487992019-11-14 14:15:15 +0100218 nullptr, GetParam());
Erik Språngd05edec2019-08-14 10:43:47 +0200219 Init();
220 }
221
Erik Språngeb487992019-11-14 14:15:15 +0100222 bool PeriodicProcess() const {
223 return GetParam() == PacingController::ProcessMode::kPeriodic;
224 }
225
Erik Språngd05edec2019-08-14 10:43:47 +0200226 void Init() {
227 pacer_->CreateProbeCluster(kFirstClusterRate, /*cluster_id=*/0);
228 pacer_->CreateProbeCluster(kSecondClusterRate, /*cluster_id=*/1);
229 // Default to bitrate probing disabled for testing purposes. Probing tests
230 // have to enable probing, either by creating a new PacingController
231 // instance or by calling SetProbingEnabled(true).
232 pacer_->SetProbingEnabled(false);
233 pacer_->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
234
235 clock_.AdvanceTime(TimeUntilNextProcess());
236 }
237
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100238 void Send(RtpPacketMediaType type,
Erik Språngd05edec2019-08-14 10:43:47 +0200239 uint32_t ssrc,
240 uint16_t sequence_number,
241 int64_t capture_time_ms,
242 size_t size) {
Erik Språngf5815fa2019-08-21 14:27:31 +0200243 pacer_->EnqueuePacket(
244 BuildPacket(type, ssrc, sequence_number, capture_time_ms, size));
Erik Språngd05edec2019-08-14 10:43:47 +0200245 }
246
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100247 void SendAndExpectPacket(RtpPacketMediaType type,
Erik Språngd05edec2019-08-14 10:43:47 +0200248 uint32_t ssrc,
249 uint16_t sequence_number,
250 int64_t capture_time_ms,
251 size_t size) {
252 Send(type, ssrc, sequence_number, capture_time_ms, size);
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100253 EXPECT_CALL(callback_,
254 SendPacket(ssrc, sequence_number, capture_time_ms,
255 type == RtpPacketMediaType::kRetransmission, false))
Erik Språngd05edec2019-08-14 10:43:47 +0200256 .Times(1);
257 }
258
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100259 std::unique_ptr<RtpPacketToSend> BuildRtpPacket(RtpPacketMediaType type) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200260 auto packet = std::make_unique<RtpPacketToSend>(nullptr);
Erik Språngd05edec2019-08-14 10:43:47 +0200261 packet->set_packet_type(type);
262 switch (type) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100263 case RtpPacketMediaType::kAudio:
Erik Språngd05edec2019-08-14 10:43:47 +0200264 packet->SetSsrc(kAudioSsrc);
265 break;
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100266 case RtpPacketMediaType::kVideo:
Erik Språngd05edec2019-08-14 10:43:47 +0200267 packet->SetSsrc(kVideoSsrc);
268 break;
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100269 case RtpPacketMediaType::kRetransmission:
270 case RtpPacketMediaType::kPadding:
Erik Språngd05edec2019-08-14 10:43:47 +0200271 packet->SetSsrc(kVideoRtxSsrc);
272 break;
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100273 case RtpPacketMediaType::kForwardErrorCorrection:
Erik Språngd05edec2019-08-14 10:43:47 +0200274 packet->SetSsrc(kFlexFecSsrc);
275 break;
276 }
277
278 packet->SetPayloadSize(234);
279 return packet;
280 }
281
282 TimeDelta TimeUntilNextProcess() {
Erik Språngeb487992019-11-14 14:15:15 +0100283 Timestamp now = clock_.CurrentTime();
284 return std::max(pacer_->NextSendTime() - now, TimeDelta::Zero());
285 }
Erik Språngd05edec2019-08-14 10:43:47 +0200286
Erik Språngeb487992019-11-14 14:15:15 +0100287 void AdvanceTimeAndProcess() {
288 Timestamp now = clock_.CurrentTime();
289 Timestamp next_send_time = pacer_->NextSendTime();
290 clock_.AdvanceTime(std::max(TimeDelta::Zero(), next_send_time - now));
291 pacer_->ProcessPackets();
292 }
293
294 void ConsumeInitialBudget() {
295 const uint32_t kSsrc = 54321;
296 uint16_t sequence_number = 1234;
297 int64_t capture_time_ms = clock_.TimeInMilliseconds();
298 const size_t kPacketSize = 250;
299
300 EXPECT_EQ(TimeDelta::Zero(), pacer_->OldestPacketWaitTime());
301
302 // Due to the multiplicative factor we can send 5 packets during a send
303 // interval. (network capacity * multiplier / (8 bits per byte *
304 // (packet size * #send intervals per second)
305 const size_t packets_to_send_per_interval =
306 kTargetRate.bps() * kPaceMultiplier / (8 * kPacketSize * 200);
307 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100308 SendAndExpectPacket(RtpPacketMediaType::kVideo, kSsrc, sequence_number++,
309 capture_time_ms, kPacketSize);
Erik Språngd05edec2019-08-14 10:43:47 +0200310 }
311
Erik Språngeb487992019-11-14 14:15:15 +0100312 while (pacer_->QueueSizePackets() > 0) {
313 if (PeriodicProcess()) {
314 clock_.AdvanceTime(TimeUntilNextProcess());
315 pacer_->ProcessPackets();
316 } else {
317 AdvanceTimeAndProcess();
318 }
Erik Språngd05edec2019-08-14 10:43:47 +0200319 }
Erik Språngd05edec2019-08-14 10:43:47 +0200320 }
321
322 SimulatedClock clock_;
Erik Språng1d50cb62020-07-02 17:41:32 +0200323 ::testing::NiceMock<MockPacingControllerCallback> callback_;
Erik Språngd05edec2019-08-14 10:43:47 +0200324 std::unique_ptr<PacingController> pacer_;
325};
326
Erik Språngeb487992019-11-14 14:15:15 +0100327class PacingControllerFieldTrialTest
328 : public ::testing::TestWithParam<PacingController::ProcessMode> {
Erik Språngd05edec2019-08-14 10:43:47 +0200329 protected:
330 struct MediaStream {
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100331 const RtpPacketMediaType type;
Erik Språngd05edec2019-08-14 10:43:47 +0200332 const uint32_t ssrc;
333 const size_t packet_size;
334 uint16_t seq_num;
335 };
336
337 const int kProcessIntervalsPerSecond = 1000 / 5;
338
339 PacingControllerFieldTrialTest() : clock_(123456) {}
340 void InsertPacket(PacingController* pacer, MediaStream* stream) {
Erik Språngf5815fa2019-08-21 14:27:31 +0200341 pacer->EnqueuePacket(
342 BuildPacket(stream->type, stream->ssrc, stream->seq_num++,
343 clock_.TimeInMilliseconds(), stream->packet_size));
Erik Språngd05edec2019-08-14 10:43:47 +0200344 }
345 void ProcessNext(PacingController* pacer) {
Erik Språngeb487992019-11-14 14:15:15 +0100346 if (GetParam() == PacingController::ProcessMode::kPeriodic) {
Danil Chapovalov55284022020-02-07 14:53:52 +0100347 TimeDelta process_interval = TimeDelta::Millis(5);
Erik Språngeb487992019-11-14 14:15:15 +0100348 clock_.AdvanceTime(process_interval);
349 pacer->ProcessPackets();
350 return;
351 }
352
353 Timestamp now = clock_.CurrentTime();
354 Timestamp next_send_time = pacer->NextSendTime();
355 TimeDelta wait_time = std::max(TimeDelta::Zero(), next_send_time - now);
356 clock_.AdvanceTime(wait_time);
Erik Språngd05edec2019-08-14 10:43:47 +0200357 pacer->ProcessPackets();
358 }
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100359 MediaStream audio{/*type*/ RtpPacketMediaType::kAudio,
Erik Språngd05edec2019-08-14 10:43:47 +0200360 /*ssrc*/ 3333, /*packet_size*/ 100, /*seq_num*/ 1000};
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100361 MediaStream video{/*type*/ RtpPacketMediaType::kVideo,
Erik Språngd05edec2019-08-14 10:43:47 +0200362 /*ssrc*/ 4444, /*packet_size*/ 1000, /*seq_num*/ 1000};
363 SimulatedClock clock_;
364 MockPacingControllerCallback callback_;
365};
366
Erik Språngeb487992019-11-14 14:15:15 +0100367TEST_P(PacingControllerFieldTrialTest, DefaultNoPaddingInSilence) {
368 PacingController pacer(&clock_, &callback_, nullptr, nullptr, GetParam());
Erik Språngd05edec2019-08-14 10:43:47 +0200369 pacer.SetPacingRates(kTargetRate, DataRate::Zero());
370 // Video packet to reset last send time and provide padding data.
371 InsertPacket(&pacer, &video);
372 EXPECT_CALL(callback_, SendPacket).Times(1);
373 clock_.AdvanceTimeMilliseconds(5);
374 pacer.ProcessPackets();
375 EXPECT_CALL(callback_, SendPadding).Times(0);
376 // Waiting 500 ms should not trigger sending of padding.
377 clock_.AdvanceTimeMilliseconds(500);
378 pacer.ProcessPackets();
379}
380
Erik Språngeb487992019-11-14 14:15:15 +0100381TEST_P(PacingControllerFieldTrialTest, PaddingInSilenceWithTrial) {
Erik Språngf5815fa2019-08-21 14:27:31 +0200382 ScopedFieldTrials trial("WebRTC-Pacer-PadInSilence/Enabled/");
Erik Språngeb487992019-11-14 14:15:15 +0100383 PacingController pacer(&clock_, &callback_, nullptr, nullptr, GetParam());
Erik Språngd05edec2019-08-14 10:43:47 +0200384 pacer.SetPacingRates(kTargetRate, DataRate::Zero());
385 // Video packet to reset last send time and provide padding data.
386 InsertPacket(&pacer, &video);
Erik Språngf5815fa2019-08-21 14:27:31 +0200387 EXPECT_CALL(callback_, SendPacket).Times(2);
Erik Språngd05edec2019-08-14 10:43:47 +0200388 clock_.AdvanceTimeMilliseconds(5);
389 pacer.ProcessPackets();
390 EXPECT_CALL(callback_, SendPadding).WillOnce(Return(1000));
391 // Waiting 500 ms should trigger sending of padding.
392 clock_.AdvanceTimeMilliseconds(500);
393 pacer.ProcessPackets();
394}
395
Evan Shrubsole6ef59d12020-01-08 16:45:08 +0100396TEST_P(PacingControllerFieldTrialTest, CongestionWindowAffectsAudioInTrial) {
397 ScopedFieldTrials trial("WebRTC-Pacer-BlockAudio/Enabled/");
Erik Språngd05edec2019-08-14 10:43:47 +0200398 EXPECT_CALL(callback_, SendPadding).Times(0);
Erik Språngeb487992019-11-14 14:15:15 +0100399 PacingController pacer(&clock_, &callback_, nullptr, nullptr, GetParam());
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +0100400 pacer.SetPacingRates(DataRate::KilobitsPerSec(10000), DataRate::Zero());
401 pacer.SetCongestionWindow(DataSize::Bytes(video.packet_size - 100));
Erik Språngd05edec2019-08-14 10:43:47 +0200402 pacer.UpdateOutstandingData(DataSize::Zero());
403 // Video packet fills congestion window.
404 InsertPacket(&pacer, &video);
405 EXPECT_CALL(callback_, SendPacket).Times(1);
406 ProcessNext(&pacer);
407 // Audio packet blocked due to congestion.
408 InsertPacket(&pacer, &audio);
409 EXPECT_CALL(callback_, SendPacket).Times(0);
Erik Språngeb487992019-11-14 14:15:15 +0100410 if (GetParam() == PacingController::ProcessMode::kDynamic) {
411 // Without interval budget we'll forward time to where we send keep-alive.
412 EXPECT_CALL(callback_, SendPadding(1)).Times(2);
413 }
Erik Språngd05edec2019-08-14 10:43:47 +0200414 ProcessNext(&pacer);
415 ProcessNext(&pacer);
416 // Audio packet unblocked when congestion window clear.
417 ::testing::Mock::VerifyAndClearExpectations(&callback_);
418 pacer.UpdateOutstandingData(DataSize::Zero());
419 EXPECT_CALL(callback_, SendPacket).Times(1);
420 ProcessNext(&pacer);
421}
422
Erik Språngeb487992019-11-14 14:15:15 +0100423TEST_P(PacingControllerFieldTrialTest,
Evan Shrubsole6ef59d12020-01-08 16:45:08 +0100424 DefaultCongestionWindowDoesNotAffectAudio) {
Erik Språngd05edec2019-08-14 10:43:47 +0200425 EXPECT_CALL(callback_, SendPadding).Times(0);
Erik Språngeb487992019-11-14 14:15:15 +0100426 PacingController pacer(&clock_, &callback_, nullptr, nullptr, GetParam());
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +0100427 pacer.SetPacingRates(DataRate::BitsPerSec(10000000), DataRate::Zero());
428 pacer.SetCongestionWindow(DataSize::Bytes(800));
Erik Språngd05edec2019-08-14 10:43:47 +0200429 pacer.UpdateOutstandingData(DataSize::Zero());
430 // Video packet fills congestion window.
431 InsertPacket(&pacer, &video);
432 EXPECT_CALL(callback_, SendPacket).Times(1);
433 ProcessNext(&pacer);
434 // Audio not blocked due to congestion.
435 InsertPacket(&pacer, &audio);
436 EXPECT_CALL(callback_, SendPacket).Times(1);
437 ProcessNext(&pacer);
438}
439
Evan Shrubsole6ef59d12020-01-08 16:45:08 +0100440TEST_P(PacingControllerFieldTrialTest, BudgetAffectsAudioInTrial) {
441 ScopedFieldTrials trial("WebRTC-Pacer-BlockAudio/Enabled/");
Erik Språngeb487992019-11-14 14:15:15 +0100442 PacingController pacer(&clock_, &callback_, nullptr, nullptr, GetParam());
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +0100443 DataRate pacing_rate = DataRate::BitsPerSec(video.packet_size / 3 * 8 *
444 kProcessIntervalsPerSecond);
Erik Språngeb487992019-11-14 14:15:15 +0100445 pacer.SetPacingRates(pacing_rate, DataRate::Zero());
Erik Språngd05edec2019-08-14 10:43:47 +0200446 // Video fills budget for following process periods.
447 InsertPacket(&pacer, &video);
448 EXPECT_CALL(callback_, SendPacket).Times(1);
449 ProcessNext(&pacer);
450 // Audio packet blocked due to budget limit.
Erik Språngd05edec2019-08-14 10:43:47 +0200451 InsertPacket(&pacer, &audio);
Erik Språngeb487992019-11-14 14:15:15 +0100452 Timestamp wait_start_time = clock_.CurrentTime();
453 Timestamp wait_end_time = Timestamp::MinusInfinity();
454 EXPECT_CALL(callback_, SendPacket)
455 .WillOnce([&](uint32_t ssrc, uint16_t sequence_number,
456 int64_t capture_timestamp, bool retransmission,
457 bool padding) { wait_end_time = clock_.CurrentTime(); });
458 while (!wait_end_time.IsFinite()) {
459 ProcessNext(&pacer);
460 }
461 const TimeDelta expected_wait_time =
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +0100462 DataSize::Bytes(video.packet_size) / pacing_rate;
Erik Språngeb487992019-11-14 14:15:15 +0100463 // Verify delay is near expectation, within timing margin.
464 EXPECT_LT(((wait_end_time - wait_start_time) - expected_wait_time).Abs(),
465 GetParam() == PacingController::ProcessMode::kPeriodic
Danil Chapovalov55284022020-02-07 14:53:52 +0100466 ? TimeDelta::Millis(5)
Erik Språngeb487992019-11-14 14:15:15 +0100467 : PacingController::kMinSleepTime);
Erik Språngd05edec2019-08-14 10:43:47 +0200468}
469
Evan Shrubsole6ef59d12020-01-08 16:45:08 +0100470TEST_P(PacingControllerFieldTrialTest, DefaultBudgetDoesNotAffectAudio) {
Erik Språngd05edec2019-08-14 10:43:47 +0200471 EXPECT_CALL(callback_, SendPadding).Times(0);
Erik Språngeb487992019-11-14 14:15:15 +0100472 PacingController pacer(&clock_, &callback_, nullptr, nullptr, GetParam());
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +0100473 pacer.SetPacingRates(DataRate::BitsPerSec(video.packet_size / 3 * 8 *
474 kProcessIntervalsPerSecond),
475 DataRate::Zero());
Erik Språngd05edec2019-08-14 10:43:47 +0200476 // Video fills budget for following process periods.
477 InsertPacket(&pacer, &video);
478 EXPECT_CALL(callback_, SendPacket).Times(1);
479 ProcessNext(&pacer);
480 // Audio packet not blocked due to budget limit.
481 EXPECT_CALL(callback_, SendPacket).Times(1);
482 InsertPacket(&pacer, &audio);
483 ProcessNext(&pacer);
484}
485
Erik Språngeb487992019-11-14 14:15:15 +0100486INSTANTIATE_TEST_SUITE_P(WithAndWithoutIntervalBudget,
487 PacingControllerFieldTrialTest,
488 ::testing::Values(false, true));
489
490TEST_P(PacingControllerTest, FirstSentPacketTimeIsSet) {
Erik Språngd05edec2019-08-14 10:43:47 +0200491 uint16_t sequence_number = 1234;
492 const uint32_t kSsrc = 12345;
493 const size_t kSizeBytes = 250;
494 const size_t kPacketToSend = 3;
495 const Timestamp kStartTime = clock_.CurrentTime();
496
497 // No packet sent.
498 EXPECT_FALSE(pacer_->FirstSentPacketTime().has_value());
499
500 for (size_t i = 0; i < kPacketToSend; ++i) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100501 SendAndExpectPacket(RtpPacketMediaType::kVideo, kSsrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +0200502 clock_.TimeInMilliseconds(), kSizeBytes);
Erik Språngd05edec2019-08-14 10:43:47 +0200503 clock_.AdvanceTime(TimeUntilNextProcess());
Erik Språngeb487992019-11-14 14:15:15 +0100504 pacer_->ProcessPackets();
Erik Språngd05edec2019-08-14 10:43:47 +0200505 }
506 EXPECT_EQ(kStartTime, pacer_->FirstSentPacketTime());
507}
508
Erik Språngeb487992019-11-14 14:15:15 +0100509TEST_P(PacingControllerTest, QueuePacket) {
510 if (!PeriodicProcess()) {
511 // This test checks behavior applicable only when using interval budget.
512 return;
513 }
514
Erik Språngd05edec2019-08-14 10:43:47 +0200515 uint32_t ssrc = 12345;
516 uint16_t sequence_number = 1234;
Erik Språngeb487992019-11-14 14:15:15 +0100517 // Due to the multiplicative factor we can send 5 packets during a 5ms send
Erik Språngd05edec2019-08-14 10:43:47 +0200518 // interval. (network capacity * multiplier / (8 bits per byte *
519 // (packet size * #send intervals per second)
Erik Språngeb487992019-11-14 14:15:15 +0100520 const size_t kPacketsToSend =
Erik Språngd05edec2019-08-14 10:43:47 +0200521 kTargetRate.bps() * kPaceMultiplier / (8 * 250 * 200);
Erik Språngeb487992019-11-14 14:15:15 +0100522 for (size_t i = 0; i < kPacketsToSend; ++i) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100523 SendAndExpectPacket(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +0200524 clock_.TimeInMilliseconds(), 250);
525 }
Erik Språngeb487992019-11-14 14:15:15 +0100526 EXPECT_CALL(callback_, SendPadding).Times(0);
Erik Språngd05edec2019-08-14 10:43:47 +0200527
Erik Språngeb487992019-11-14 14:15:15 +0100528 // Enqueue one extra packet.
Erik Språngd05edec2019-08-14 10:43:47 +0200529 int64_t queued_packet_timestamp = clock_.TimeInMilliseconds();
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100530 Send(RtpPacketMediaType::kVideo, ssrc, sequence_number,
Erik Språngd05edec2019-08-14 10:43:47 +0200531 queued_packet_timestamp, 250);
Erik Språngeb487992019-11-14 14:15:15 +0100532 EXPECT_EQ(kPacketsToSend + 1, pacer_->QueueSizePackets());
533
534 // The first kPacketsToSend packets will be sent with budget from the
535 // initial 5ms interval.
Erik Språngd05edec2019-08-14 10:43:47 +0200536 pacer_->ProcessPackets();
Erik Språngd05edec2019-08-14 10:43:47 +0200537 EXPECT_EQ(1u, pacer_->QueueSizePackets());
Erik Språngeb487992019-11-14 14:15:15 +0100538
539 // Advance time to next interval, make sure the last packet is sent.
540 clock_.AdvanceTimeMilliseconds(5);
Erik Språngd05edec2019-08-14 10:43:47 +0200541 EXPECT_CALL(callback_, SendPacket(ssrc, sequence_number++,
542 queued_packet_timestamp, false, false))
543 .Times(1);
544 pacer_->ProcessPackets();
545 sequence_number++;
546 EXPECT_EQ(0u, pacer_->QueueSizePackets());
547
548 // We can send packets_to_send -1 packets of size 250 during the current
549 // interval since one packet has already been sent.
Erik Språngeb487992019-11-14 14:15:15 +0100550 for (size_t i = 0; i < kPacketsToSend - 1; ++i) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100551 SendAndExpectPacket(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +0200552 clock_.TimeInMilliseconds(), 250);
553 }
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100554 Send(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +0200555 clock_.TimeInMilliseconds(), 250);
Erik Språngeb487992019-11-14 14:15:15 +0100556 EXPECT_EQ(kPacketsToSend, pacer_->QueueSizePackets());
Erik Språngd05edec2019-08-14 10:43:47 +0200557 pacer_->ProcessPackets();
558 EXPECT_EQ(1u, pacer_->QueueSizePackets());
559}
560
Erik Språngeb487992019-11-14 14:15:15 +0100561TEST_P(PacingControllerTest, QueueAndPacePackets) {
562 if (PeriodicProcess()) {
563 // This test checks behavior when not using interval budget.
564 return;
565 }
566
567 const uint32_t kSsrc = 12345;
568 uint16_t sequence_number = 1234;
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +0100569 const DataSize kPackeSize = DataSize::Bytes(250);
Danil Chapovalov55284022020-02-07 14:53:52 +0100570 const TimeDelta kSendInterval = TimeDelta::Millis(5);
Erik Språngeb487992019-11-14 14:15:15 +0100571
572 // Due to the multiplicative factor we can send 5 packets during a 5ms send
573 // interval. (send interval * network capacity * multiplier / packet size)
574 const size_t kPacketsToSend = (kSendInterval * kTargetRate).bytes() *
575 kPaceMultiplier / kPackeSize.bytes();
576
577 for (size_t i = 0; i < kPacketsToSend; ++i) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100578 SendAndExpectPacket(RtpPacketMediaType::kVideo, kSsrc, sequence_number++,
Erik Språngeb487992019-11-14 14:15:15 +0100579 clock_.TimeInMilliseconds(), kPackeSize.bytes());
580 }
581 EXPECT_CALL(callback_, SendPadding).Times(0);
582
583 // Enqueue one extra packet.
584 int64_t queued_packet_timestamp = clock_.TimeInMilliseconds();
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100585 Send(RtpPacketMediaType::kVideo, kSsrc, sequence_number,
Erik Språngeb487992019-11-14 14:15:15 +0100586 queued_packet_timestamp, kPackeSize.bytes());
587 EXPECT_EQ(kPacketsToSend + 1, pacer_->QueueSizePackets());
588
589 // Send packets until the initial kPacketsToSend packets are done.
590 Timestamp start_time = clock_.CurrentTime();
591 while (pacer_->QueueSizePackets() > 1) {
592 AdvanceTimeAndProcess();
593 }
594 EXPECT_LT(clock_.CurrentTime() - start_time, kSendInterval);
595
596 // Proceed till last packet can be sent.
597 EXPECT_CALL(callback_, SendPacket(kSsrc, sequence_number,
598 queued_packet_timestamp, false, false))
599 .Times(1);
600 AdvanceTimeAndProcess();
601 EXPECT_GE(clock_.CurrentTime() - start_time, kSendInterval);
602 EXPECT_EQ(pacer_->QueueSizePackets(), 0u);
603}
604
605TEST_P(PacingControllerTest, PaceQueuedPackets) {
Erik Språngd05edec2019-08-14 10:43:47 +0200606 uint32_t ssrc = 12345;
607 uint16_t sequence_number = 1234;
Erik Språngeb487992019-11-14 14:15:15 +0100608 const size_t kPacketSize = 250;
Erik Språngd05edec2019-08-14 10:43:47 +0200609
610 // Due to the multiplicative factor we can send 5 packets during a send
611 // interval. (network capacity * multiplier / (8 bits per byte *
612 // (packet size * #send intervals per second)
613 const size_t packets_to_send_per_interval =
Erik Språngeb487992019-11-14 14:15:15 +0100614 kTargetRate.bps() * kPaceMultiplier / (8 * kPacketSize * 200);
Erik Språngd05edec2019-08-14 10:43:47 +0200615 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100616 SendAndExpectPacket(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngeb487992019-11-14 14:15:15 +0100617 clock_.TimeInMilliseconds(), kPacketSize);
Erik Språngd05edec2019-08-14 10:43:47 +0200618 }
619
620 for (size_t j = 0; j < packets_to_send_per_interval * 10; ++j) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100621 Send(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngeb487992019-11-14 14:15:15 +0100622 clock_.TimeInMilliseconds(), kPacketSize);
Erik Språngd05edec2019-08-14 10:43:47 +0200623 }
624 EXPECT_EQ(packets_to_send_per_interval + packets_to_send_per_interval * 10,
625 pacer_->QueueSizePackets());
Erik Språngeb487992019-11-14 14:15:15 +0100626 if (PeriodicProcess()) {
Erik Språngd05edec2019-08-14 10:43:47 +0200627 pacer_->ProcessPackets();
Erik Språngeb487992019-11-14 14:15:15 +0100628 } else {
629 while (pacer_->QueueSizePackets() > packets_to_send_per_interval * 10) {
630 AdvanceTimeAndProcess();
631 }
Erik Språngd05edec2019-08-14 10:43:47 +0200632 }
Erik Språngeb487992019-11-14 14:15:15 +0100633 EXPECT_EQ(pacer_->QueueSizePackets(), packets_to_send_per_interval * 10);
634 EXPECT_CALL(callback_, SendPadding).Times(0);
635
636 EXPECT_CALL(callback_, SendPacket(ssrc, _, _, false, false))
637 .Times(pacer_->QueueSizePackets());
638 const TimeDelta expected_pace_time =
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +0100639 DataSize::Bytes(pacer_->QueueSizePackets() * kPacketSize) /
Erik Språngeb487992019-11-14 14:15:15 +0100640 (kPaceMultiplier * kTargetRate);
641 Timestamp start_time = clock_.CurrentTime();
642 while (pacer_->QueueSizePackets() > 0) {
643 if (PeriodicProcess()) {
644 clock_.AdvanceTime(TimeUntilNextProcess());
645 pacer_->ProcessPackets();
646 } else {
647 AdvanceTimeAndProcess();
648 }
649 }
650 const TimeDelta actual_pace_time = clock_.CurrentTime() - start_time;
Danil Chapovalov55284022020-02-07 14:53:52 +0100651 EXPECT_LT((actual_pace_time - expected_pace_time).Abs(),
652 PeriodicProcess() ? TimeDelta::Millis(5)
653 : PacingController::kMinSleepTime);
Erik Språngeb487992019-11-14 14:15:15 +0100654
Erik Språngd05edec2019-08-14 10:43:47 +0200655 EXPECT_EQ(0u, pacer_->QueueSizePackets());
656 clock_.AdvanceTime(TimeUntilNextProcess());
657 EXPECT_EQ(0u, pacer_->QueueSizePackets());
658 pacer_->ProcessPackets();
659
Erik Språngeb487992019-11-14 14:15:15 +0100660 // Send some more packet, just show that we can..?
Erik Språngd05edec2019-08-14 10:43:47 +0200661 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100662 SendAndExpectPacket(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +0200663 clock_.TimeInMilliseconds(), 250);
664 }
Erik Språngeb487992019-11-14 14:15:15 +0100665 EXPECT_EQ(packets_to_send_per_interval, pacer_->QueueSizePackets());
666 if (PeriodicProcess()) {
667 pacer_->ProcessPackets();
668 } else {
669 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
670 AdvanceTimeAndProcess();
671 }
672 }
673 EXPECT_EQ(0u, pacer_->QueueSizePackets());
Erik Språngd05edec2019-08-14 10:43:47 +0200674}
675
Erik Språngeb487992019-11-14 14:15:15 +0100676TEST_P(PacingControllerTest, RepeatedRetransmissionsAllowed) {
Erik Språngd05edec2019-08-14 10:43:47 +0200677 // Send one packet, then two retransmissions of that packet.
678 for (size_t i = 0; i < 3; i++) {
679 constexpr uint32_t ssrc = 333;
680 constexpr uint16_t sequence_number = 444;
681 constexpr size_t bytes = 250;
682 bool is_retransmission = (i != 0); // Original followed by retransmissions.
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100683 SendAndExpectPacket(is_retransmission ? RtpPacketMediaType::kRetransmission
684 : RtpPacketMediaType::kVideo,
685 ssrc, sequence_number, clock_.TimeInMilliseconds(),
686 bytes);
Erik Språngd05edec2019-08-14 10:43:47 +0200687 clock_.AdvanceTimeMilliseconds(5);
688 }
Erik Språngeb487992019-11-14 14:15:15 +0100689 if (PeriodicProcess()) {
690 pacer_->ProcessPackets();
691 } else {
692 while (pacer_->QueueSizePackets() > 0) {
693 AdvanceTimeAndProcess();
694 }
695 }
Erik Språngd05edec2019-08-14 10:43:47 +0200696}
697
Erik Språngeb487992019-11-14 14:15:15 +0100698TEST_P(PacingControllerTest,
Erik Språngd05edec2019-08-14 10:43:47 +0200699 CanQueuePacketsWithSameSequenceNumberOnDifferentSsrcs) {
700 uint32_t ssrc = 12345;
701 uint16_t sequence_number = 1234;
702
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100703 SendAndExpectPacket(RtpPacketMediaType::kVideo, ssrc, sequence_number,
Erik Språngd05edec2019-08-14 10:43:47 +0200704 clock_.TimeInMilliseconds(), 250);
705
706 // Expect packet on second ssrc to be queued and sent as well.
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100707 SendAndExpectPacket(RtpPacketMediaType::kVideo, ssrc + 1, sequence_number,
Erik Språngd05edec2019-08-14 10:43:47 +0200708 clock_.TimeInMilliseconds(), 250);
709
710 clock_.AdvanceTimeMilliseconds(1000);
Erik Språngeb487992019-11-14 14:15:15 +0100711 if (PeriodicProcess()) {
712 pacer_->ProcessPackets();
713 } else {
714 while (pacer_->QueueSizePackets() > 0) {
715 AdvanceTimeAndProcess();
716 }
717 }
Erik Språngd05edec2019-08-14 10:43:47 +0200718}
719
Erik Språngeb487992019-11-14 14:15:15 +0100720TEST_P(PacingControllerTest, Padding) {
Erik Språngd05edec2019-08-14 10:43:47 +0200721 uint32_t ssrc = 12345;
722 uint16_t sequence_number = 1234;
Erik Språngeb487992019-11-14 14:15:15 +0100723 const size_t kPacketSize = 250;
Erik Språngd05edec2019-08-14 10:43:47 +0200724
725 pacer_->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
726
Erik Språngeb487992019-11-14 14:15:15 +0100727 if (PeriodicProcess()) {
728 ConsumeInitialBudget();
729
730 // 5 milliseconds later should not send padding since we filled the buffers
731 // initially.
732 EXPECT_CALL(callback_, SendPadding(kPacketSize)).Times(0);
733 clock_.AdvanceTime(TimeUntilNextProcess());
734 pacer_->ProcessPackets();
735
736 // 5 milliseconds later we have enough budget to send some padding.
737 EXPECT_CALL(callback_, SendPadding(250)).WillOnce(Return(kPacketSize));
738 EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
739 clock_.AdvanceTime(TimeUntilNextProcess());
740 pacer_->ProcessPackets();
741 } else {
742 const size_t kPacketsToSend = 20;
743 for (size_t i = 0; i < kPacketsToSend; ++i) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100744 SendAndExpectPacket(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
745 clock_.TimeInMilliseconds(), kPacketSize);
Erik Språngeb487992019-11-14 14:15:15 +0100746 }
747 const TimeDelta expected_pace_time =
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +0100748 DataSize::Bytes(pacer_->QueueSizePackets() * kPacketSize) /
Erik Språngeb487992019-11-14 14:15:15 +0100749 (kPaceMultiplier * kTargetRate);
750 EXPECT_CALL(callback_, SendPadding).Times(0);
751 // Only the media packets should be sent.
752 Timestamp start_time = clock_.CurrentTime();
753 while (pacer_->QueueSizePackets() > 0) {
754 AdvanceTimeAndProcess();
755 }
756 const TimeDelta actual_pace_time = clock_.CurrentTime() - start_time;
757 EXPECT_LE((actual_pace_time - expected_pace_time).Abs(),
758 PacingController::kMinSleepTime);
759
Erik Språngb1ccae22019-11-25 18:22:09 +0100760 // Pacing media happens at 2.5x, but padding was configured with 1.0x
Erik Språngeb487992019-11-14 14:15:15 +0100761 // factor. We have to wait until the padding debt is gone before we start
762 // sending padding.
763 const TimeDelta time_to_padding_debt_free =
764 (expected_pace_time * kPaceMultiplier) - actual_pace_time;
Erik Språngb1ccae22019-11-25 18:22:09 +0100765 clock_.AdvanceTime(time_to_padding_debt_free -
766 PacingController::kMinSleepTime);
767 pacer_->ProcessPackets();
Erik Språngeb487992019-11-14 14:15:15 +0100768
769 // Send 10 padding packets.
770 const size_t kPaddingPacketsToSend = 10;
771 DataSize padding_sent = DataSize::Zero();
Erik Språngb1ccae22019-11-25 18:22:09 +0100772 size_t packets_sent = 0;
773 Timestamp first_send_time = Timestamp::MinusInfinity();
774 Timestamp last_send_time = Timestamp::MinusInfinity();
775
Erik Språngeb487992019-11-14 14:15:15 +0100776 EXPECT_CALL(callback_, SendPadding)
777 .Times(kPaddingPacketsToSend)
778 .WillRepeatedly([&](size_t target_size) {
Erik Språngb1ccae22019-11-25 18:22:09 +0100779 ++packets_sent;
780 if (packets_sent < kPaddingPacketsToSend) {
781 // Don't count bytes of last packet, instead just
782 // use this as the time the last packet finished
783 // sending.
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +0100784 padding_sent += DataSize::Bytes(target_size);
Erik Språngb1ccae22019-11-25 18:22:09 +0100785 }
786 if (first_send_time.IsInfinite()) {
787 first_send_time = clock_.CurrentTime();
788 } else {
789 last_send_time = clock_.CurrentTime();
790 }
Erik Språngeb487992019-11-14 14:15:15 +0100791 return target_size;
792 });
793 EXPECT_CALL(callback_, SendPacket(_, _, _, false, true))
794 .Times(kPaddingPacketsToSend);
Erik Språngb1ccae22019-11-25 18:22:09 +0100795
796 while (packets_sent < kPaddingPacketsToSend) {
Erik Språngeb487992019-11-14 14:15:15 +0100797 AdvanceTimeAndProcess();
798 }
799
800 // Verify rate of sent padding.
Erik Språngb1ccae22019-11-25 18:22:09 +0100801 TimeDelta padding_duration = last_send_time - first_send_time;
Erik Språngeb487992019-11-14 14:15:15 +0100802 DataRate padding_rate = padding_sent / padding_duration;
803 EXPECT_EQ(padding_rate, kTargetRate);
Erik Språngd05edec2019-08-14 10:43:47 +0200804 }
Erik Språngd05edec2019-08-14 10:43:47 +0200805}
806
Erik Språngeb487992019-11-14 14:15:15 +0100807TEST_P(PacingControllerTest, NoPaddingBeforeNormalPacket) {
Erik Språngd05edec2019-08-14 10:43:47 +0200808 pacer_->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
809
810 EXPECT_CALL(callback_, SendPadding).Times(0);
Erik Språngeb487992019-11-14 14:15:15 +0100811
Erik Språngd05edec2019-08-14 10:43:47 +0200812 pacer_->ProcessPackets();
813 clock_.AdvanceTime(TimeUntilNextProcess());
814
815 pacer_->ProcessPackets();
816 clock_.AdvanceTime(TimeUntilNextProcess());
817
818 uint32_t ssrc = 12345;
819 uint16_t sequence_number = 1234;
820 int64_t capture_time_ms = 56789;
821
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100822 SendAndExpectPacket(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +0200823 capture_time_ms, 250);
Erik Språngb1ccae22019-11-25 18:22:09 +0100824 bool padding_sent = false;
825 EXPECT_CALL(callback_, SendPadding).WillOnce([&](size_t padding) {
826 padding_sent = true;
Erik Språngeb487992019-11-14 14:15:15 +0100827 return padding;
828 });
Erik Språngf5815fa2019-08-21 14:27:31 +0200829 EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
Erik Språngeb487992019-11-14 14:15:15 +0100830 if (PeriodicProcess()) {
831 pacer_->ProcessPackets();
832 } else {
Erik Språngb1ccae22019-11-25 18:22:09 +0100833 while (!padding_sent) {
834 AdvanceTimeAndProcess();
835 }
Erik Språngeb487992019-11-14 14:15:15 +0100836 }
Erik Språngd05edec2019-08-14 10:43:47 +0200837}
838
Erik Språngeb487992019-11-14 14:15:15 +0100839TEST_P(PacingControllerTest, VerifyPaddingUpToBitrate) {
840 if (!PeriodicProcess()) {
841 // Already tested in PacingControllerTest.Padding.
842 return;
843 }
844
Erik Språngd05edec2019-08-14 10:43:47 +0200845 uint32_t ssrc = 12345;
846 uint16_t sequence_number = 1234;
847 int64_t capture_time_ms = 56789;
848 const int kTimeStep = 5;
849 const int64_t kBitrateWindow = 100;
850 pacer_->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
851
852 int64_t start_time = clock_.TimeInMilliseconds();
853 while (clock_.TimeInMilliseconds() - start_time < kBitrateWindow) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100854 SendAndExpectPacket(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +0200855 capture_time_ms, 250);
856 EXPECT_CALL(callback_, SendPadding(250)).WillOnce(Return(250));
Erik Språngf5815fa2019-08-21 14:27:31 +0200857 EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
Erik Språngd05edec2019-08-14 10:43:47 +0200858 pacer_->ProcessPackets();
859 clock_.AdvanceTimeMilliseconds(kTimeStep);
860 }
861}
862
Erik Språngeb487992019-11-14 14:15:15 +0100863TEST_P(PacingControllerTest, VerifyAverageBitrateVaryingMediaPayload) {
Erik Språngd05edec2019-08-14 10:43:47 +0200864 uint32_t ssrc = 12345;
865 uint16_t sequence_number = 1234;
866 int64_t capture_time_ms = 56789;
867 const int kTimeStep = 5;
Danil Chapovalov55284022020-02-07 14:53:52 +0100868 const TimeDelta kAveragingWindowLength = TimeDelta::Seconds(10);
Erik Språngd05edec2019-08-14 10:43:47 +0200869 PacingControllerPadding callback;
Erik Språngeb487992019-11-14 14:15:15 +0100870 pacer_ = std::make_unique<PacingController>(&clock_, &callback, nullptr,
871 nullptr, GetParam());
Erik Språngd05edec2019-08-14 10:43:47 +0200872 pacer_->SetProbingEnabled(false);
873 pacer_->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
874
Erik Språngeb487992019-11-14 14:15:15 +0100875 Timestamp start_time = clock_.CurrentTime();
Erik Språngd05edec2019-08-14 10:43:47 +0200876 size_t media_bytes = 0;
Erik Språngeb487992019-11-14 14:15:15 +0100877 while (clock_.CurrentTime() - start_time < kAveragingWindowLength) {
878 // Maybe add some new media packets corresponding to expected send rate.
Erik Språngd05edec2019-08-14 10:43:47 +0200879 int rand_value = rand(); // NOLINT (rand_r instead of rand)
Erik Språngeb487992019-11-14 14:15:15 +0100880 while (
881 media_bytes <
882 (kTargetRate * (clock_.CurrentTime() - start_time)).bytes<size_t>()) {
883 size_t media_payload = rand_value % 400 + 800; // [400, 1200] bytes.
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100884 Send(RtpPacketMediaType::kVideo, ssrc, sequence_number++, capture_time_ms,
885 media_payload);
Erik Språngeb487992019-11-14 14:15:15 +0100886 media_bytes += media_payload;
887 }
888
889 if (PeriodicProcess()) {
890 clock_.AdvanceTimeMilliseconds(kTimeStep);
891 pacer_->ProcessPackets();
892 } else {
893 AdvanceTimeAndProcess();
894 }
Erik Språngd05edec2019-08-14 10:43:47 +0200895 }
Erik Språngeb487992019-11-14 14:15:15 +0100896
897 EXPECT_NEAR(
898 kTargetRate.bps(),
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +0100899 (DataSize::Bytes(callback.total_bytes_sent()) / kAveragingWindowLength)
Erik Språngeb487992019-11-14 14:15:15 +0100900 .bps(),
901 (kTargetRate * 0.01 /* 1% error marging */).bps());
Erik Språngd05edec2019-08-14 10:43:47 +0200902}
903
Erik Språngeb487992019-11-14 14:15:15 +0100904TEST_P(PacingControllerTest, Priority) {
Erik Språngd05edec2019-08-14 10:43:47 +0200905 uint32_t ssrc_low_priority = 12345;
906 uint32_t ssrc = 12346;
907 uint16_t sequence_number = 1234;
908 int64_t capture_time_ms = 56789;
909 int64_t capture_time_ms_low_priority = 1234567;
910
Erik Språngeb487992019-11-14 14:15:15 +0100911 ConsumeInitialBudget();
Erik Språngd05edec2019-08-14 10:43:47 +0200912
913 // Expect normal and low priority to be queued and high to pass through.
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100914 Send(RtpPacketMediaType::kVideo, ssrc_low_priority, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +0200915 capture_time_ms_low_priority, 250);
916
Erik Språngeb487992019-11-14 14:15:15 +0100917 const size_t packets_to_send_per_interval =
918 kTargetRate.bps() * kPaceMultiplier / (8 * 250 * 200);
Erik Språngd05edec2019-08-14 10:43:47 +0200919 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100920 Send(RtpPacketMediaType::kRetransmission, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +0200921 capture_time_ms, 250);
922 }
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100923 Send(RtpPacketMediaType::kAudio, ssrc, sequence_number++, capture_time_ms,
Erik Språngd05edec2019-08-14 10:43:47 +0200924 250);
925
926 // Expect all high and normal priority to be sent out first.
927 EXPECT_CALL(callback_, SendPadding).Times(0);
928 EXPECT_CALL(callback_, SendPacket(ssrc, _, capture_time_ms, _, _))
929 .Times(packets_to_send_per_interval + 1);
930
Erik Språngeb487992019-11-14 14:15:15 +0100931 if (PeriodicProcess()) {
932 clock_.AdvanceTime(TimeUntilNextProcess());
933 pacer_->ProcessPackets();
934 } else {
935 while (pacer_->QueueSizePackets() > 1) {
936 AdvanceTimeAndProcess();
937 }
938 }
939
Erik Språngd05edec2019-08-14 10:43:47 +0200940 EXPECT_EQ(1u, pacer_->QueueSizePackets());
941
942 EXPECT_CALL(callback_, SendPacket(ssrc_low_priority, _,
943 capture_time_ms_low_priority, _, _))
944 .Times(1);
Erik Språngeb487992019-11-14 14:15:15 +0100945 if (PeriodicProcess()) {
946 clock_.AdvanceTime(TimeUntilNextProcess());
947 pacer_->ProcessPackets();
948 } else {
949 AdvanceTimeAndProcess();
950 }
Erik Språngd05edec2019-08-14 10:43:47 +0200951}
952
Erik Språngeb487992019-11-14 14:15:15 +0100953TEST_P(PacingControllerTest, RetransmissionPriority) {
Erik Språngd05edec2019-08-14 10:43:47 +0200954 uint32_t ssrc = 12345;
955 uint16_t sequence_number = 1234;
956 int64_t capture_time_ms = 45678;
957 int64_t capture_time_ms_retransmission = 56789;
958
959 // Due to the multiplicative factor we can send 5 packets during a send
960 // interval. (network capacity * multiplier / (8 bits per byte *
961 // (packet size * #send intervals per second)
962 const size_t packets_to_send_per_interval =
963 kTargetRate.bps() * kPaceMultiplier / (8 * 250 * 200);
964 pacer_->ProcessPackets();
965 EXPECT_EQ(0u, pacer_->QueueSizePackets());
966
967 // Alternate retransmissions and normal packets.
968 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100969 Send(RtpPacketMediaType::kVideo, ssrc, sequence_number++, capture_time_ms,
970 250);
971 Send(RtpPacketMediaType::kRetransmission, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +0200972 capture_time_ms_retransmission, 250);
973 }
974 EXPECT_EQ(2 * packets_to_send_per_interval, pacer_->QueueSizePackets());
975
976 // Expect all retransmissions to be sent out first despite having a later
977 // capture time.
978 EXPECT_CALL(callback_, SendPadding).Times(0);
979 EXPECT_CALL(callback_, SendPacket(_, _, _, false, _)).Times(0);
980 EXPECT_CALL(callback_,
981 SendPacket(ssrc, _, capture_time_ms_retransmission, true, _))
982 .Times(packets_to_send_per_interval);
983
Erik Språngeb487992019-11-14 14:15:15 +0100984 if (PeriodicProcess()) {
985 clock_.AdvanceTime(TimeUntilNextProcess());
986 pacer_->ProcessPackets();
987 } else {
988 while (pacer_->QueueSizePackets() > packets_to_send_per_interval) {
989 AdvanceTimeAndProcess();
990 }
991 }
Erik Språngd05edec2019-08-14 10:43:47 +0200992 EXPECT_EQ(packets_to_send_per_interval, pacer_->QueueSizePackets());
993
994 // Expect the remaining (non-retransmission) packets to be sent.
995 EXPECT_CALL(callback_, SendPadding).Times(0);
996 EXPECT_CALL(callback_, SendPacket(_, _, _, true, _)).Times(0);
997 EXPECT_CALL(callback_, SendPacket(ssrc, _, capture_time_ms, false, _))
998 .Times(packets_to_send_per_interval);
999
Erik Språngeb487992019-11-14 14:15:15 +01001000 if (PeriodicProcess()) {
1001 clock_.AdvanceTime(TimeUntilNextProcess());
1002 pacer_->ProcessPackets();
1003 } else {
1004 while (pacer_->QueueSizePackets() > 0) {
1005 AdvanceTimeAndProcess();
1006 }
1007 }
Erik Språngd05edec2019-08-14 10:43:47 +02001008
1009 EXPECT_EQ(0u, pacer_->QueueSizePackets());
1010}
1011
Erik Språngeb487992019-11-14 14:15:15 +01001012TEST_P(PacingControllerTest, HighPrioDoesntAffectBudget) {
1013 const size_t kPacketSize = 250;
Erik Språngd05edec2019-08-14 10:43:47 +02001014 uint32_t ssrc = 12346;
1015 uint16_t sequence_number = 1234;
1016 int64_t capture_time_ms = 56789;
1017
1018 // As high prio packets doesn't affect the budget, we should be able to send
1019 // a high number of them at once.
Erik Språngeb487992019-11-14 14:15:15 +01001020 const size_t kNumAudioPackets = 25;
1021 for (size_t i = 0; i < kNumAudioPackets; ++i) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001022 SendAndExpectPacket(RtpPacketMediaType::kAudio, ssrc, sequence_number++,
Erik Språngeb487992019-11-14 14:15:15 +01001023 capture_time_ms, kPacketSize);
Erik Språngd05edec2019-08-14 10:43:47 +02001024 }
1025 pacer_->ProcessPackets();
1026 // Low prio packets does affect the budget.
1027 // Due to the multiplicative factor we can send 5 packets during a send
1028 // interval. (network capacity * multiplier / (8 bits per byte *
1029 // (packet size * #send intervals per second)
Erik Språngeb487992019-11-14 14:15:15 +01001030 const size_t kPacketsToSendPerInterval =
1031 kTargetRate.bps() * kPaceMultiplier / (8 * kPacketSize * 200);
1032 for (size_t i = 0; i < kPacketsToSendPerInterval; ++i) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001033 SendAndExpectPacket(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngeb487992019-11-14 14:15:15 +01001034 clock_.TimeInMilliseconds(), kPacketSize);
Erik Språngd05edec2019-08-14 10:43:47 +02001035 }
Erik Språngeb487992019-11-14 14:15:15 +01001036
1037 // Send all packets and measure pace time.
1038 Timestamp start_time = clock_.CurrentTime();
1039 while (pacer_->QueueSizePackets() > 0) {
1040 if (PeriodicProcess()) {
1041 clock_.AdvanceTime(TimeUntilNextProcess());
1042 pacer_->ProcessPackets();
1043 } else {
1044 AdvanceTimeAndProcess();
1045 }
1046 }
1047
1048 // Measure pacing time. Expect only low-prio packets to affect this.
1049 TimeDelta pacing_time = clock_.CurrentTime() - start_time;
1050 TimeDelta expected_pacing_time =
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +01001051 DataSize::Bytes(kPacketsToSendPerInterval * kPacketSize) /
Erik Språngeb487992019-11-14 14:15:15 +01001052 (kTargetRate * kPaceMultiplier);
1053 EXPECT_NEAR(pacing_time.us<double>(), expected_pacing_time.us<double>(),
1054 PeriodicProcess() ? 5000.0
1055 : PacingController::kMinSleepTime.us<double>());
Erik Språngd05edec2019-08-14 10:43:47 +02001056}
1057
Erik Språngeb487992019-11-14 14:15:15 +01001058TEST_P(PacingControllerTest, SendsOnlyPaddingWhenCongested) {
Erik Språngd05edec2019-08-14 10:43:47 +02001059 uint32_t ssrc = 202020;
1060 uint16_t sequence_number = 1000;
1061 int kPacketSize = 250;
1062 int kCongestionWindow = kPacketSize * 10;
1063
1064 pacer_->UpdateOutstandingData(DataSize::Zero());
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +01001065 pacer_->SetCongestionWindow(DataSize::Bytes(kCongestionWindow));
Erik Språngd05edec2019-08-14 10:43:47 +02001066 int sent_data = 0;
1067 while (sent_data < kCongestionWindow) {
1068 sent_data += kPacketSize;
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001069 SendAndExpectPacket(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +02001070 clock_.TimeInMilliseconds(), kPacketSize);
Erik Språngeb487992019-11-14 14:15:15 +01001071 AdvanceTimeAndProcess();
Erik Språngd05edec2019-08-14 10:43:47 +02001072 }
1073 ::testing::Mock::VerifyAndClearExpectations(&callback_);
1074 EXPECT_CALL(callback_, SendPacket).Times(0);
1075 EXPECT_CALL(callback_, SendPadding).Times(0);
1076
1077 size_t blocked_packets = 0;
1078 int64_t expected_time_until_padding = 500;
1079 while (expected_time_until_padding > 5) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001080 Send(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +02001081 clock_.TimeInMilliseconds(), kPacketSize);
1082 blocked_packets++;
1083 clock_.AdvanceTimeMilliseconds(5);
1084 pacer_->ProcessPackets();
1085 expected_time_until_padding -= 5;
1086 }
1087 ::testing::Mock::VerifyAndClearExpectations(&callback_);
1088 EXPECT_CALL(callback_, SendPadding(1)).WillOnce(Return(1));
Erik Språngf5815fa2019-08-21 14:27:31 +02001089 EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
Erik Språngd05edec2019-08-14 10:43:47 +02001090 clock_.AdvanceTimeMilliseconds(5);
1091 pacer_->ProcessPackets();
1092 EXPECT_EQ(blocked_packets, pacer_->QueueSizePackets());
1093}
1094
Erik Språngeb487992019-11-14 14:15:15 +01001095TEST_P(PacingControllerTest, DoesNotAllowOveruseAfterCongestion) {
Erik Språngd05edec2019-08-14 10:43:47 +02001096 uint32_t ssrc = 202020;
1097 uint16_t seq_num = 1000;
1098 int size = 1000;
1099 auto now_ms = [this] { return clock_.TimeInMilliseconds(); };
1100 EXPECT_CALL(callback_, SendPadding).Times(0);
1101 // The pacing rate is low enough that the budget should not allow two packets
1102 // to be sent in a row.
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +01001103 pacer_->SetPacingRates(DataRate::BitsPerSec(400 * 8 * 1000 / 5),
1104 DataRate::Zero());
Erik Språngd05edec2019-08-14 10:43:47 +02001105 // The congestion window is small enough to only let one packet through.
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +01001106 pacer_->SetCongestionWindow(DataSize::Bytes(800));
Erik Språngd05edec2019-08-14 10:43:47 +02001107 pacer_->UpdateOutstandingData(DataSize::Zero());
1108 // Not yet budget limited or congested, packet is sent.
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001109 Send(RtpPacketMediaType::kVideo, ssrc, seq_num++, now_ms(), size);
Erik Språngd05edec2019-08-14 10:43:47 +02001110 EXPECT_CALL(callback_, SendPacket).Times(1);
1111 clock_.AdvanceTimeMilliseconds(5);
1112 pacer_->ProcessPackets();
1113 // Packet blocked due to congestion.
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001114 Send(RtpPacketMediaType::kVideo, ssrc, seq_num++, now_ms(), size);
Erik Språngd05edec2019-08-14 10:43:47 +02001115 EXPECT_CALL(callback_, SendPacket).Times(0);
1116 clock_.AdvanceTimeMilliseconds(5);
1117 pacer_->ProcessPackets();
1118 // Packet blocked due to congestion.
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001119 Send(RtpPacketMediaType::kVideo, ssrc, seq_num++, now_ms(), size);
Erik Språngd05edec2019-08-14 10:43:47 +02001120 EXPECT_CALL(callback_, SendPacket).Times(0);
1121 clock_.AdvanceTimeMilliseconds(5);
1122 pacer_->ProcessPackets();
Erik Språngd05edec2019-08-14 10:43:47 +02001123 // Congestion removed and budget has recovered, packet is sent.
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001124 Send(RtpPacketMediaType::kVideo, ssrc, seq_num++, now_ms(), size);
Erik Språngd05edec2019-08-14 10:43:47 +02001125 EXPECT_CALL(callback_, SendPacket).Times(1);
1126 clock_.AdvanceTimeMilliseconds(5);
Erik Språngd05edec2019-08-14 10:43:47 +02001127 pacer_->UpdateOutstandingData(DataSize::Zero());
Erik Språngeb487992019-11-14 14:15:15 +01001128 pacer_->ProcessPackets();
Erik Språngd05edec2019-08-14 10:43:47 +02001129 // Should be blocked due to budget limitation as congestion has be removed.
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001130 Send(RtpPacketMediaType::kVideo, ssrc, seq_num++, now_ms(), size);
Erik Språngd05edec2019-08-14 10:43:47 +02001131 EXPECT_CALL(callback_, SendPacket).Times(0);
1132 clock_.AdvanceTimeMilliseconds(5);
1133 pacer_->ProcessPackets();
1134}
1135
Erik Språngeb487992019-11-14 14:15:15 +01001136TEST_P(PacingControllerTest, ResumesSendingWhenCongestionEnds) {
Erik Språngd05edec2019-08-14 10:43:47 +02001137 uint32_t ssrc = 202020;
1138 uint16_t sequence_number = 1000;
1139 int64_t kPacketSize = 250;
1140 int64_t kCongestionCount = 10;
1141 int64_t kCongestionWindow = kPacketSize * kCongestionCount;
1142 int64_t kCongestionTimeMs = 1000;
1143
1144 pacer_->UpdateOutstandingData(DataSize::Zero());
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +01001145 pacer_->SetCongestionWindow(DataSize::Bytes(kCongestionWindow));
Erik Språngd05edec2019-08-14 10:43:47 +02001146 int sent_data = 0;
1147 while (sent_data < kCongestionWindow) {
1148 sent_data += kPacketSize;
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001149 SendAndExpectPacket(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +02001150 clock_.TimeInMilliseconds(), kPacketSize);
1151 clock_.AdvanceTimeMilliseconds(5);
1152 pacer_->ProcessPackets();
1153 }
1154 ::testing::Mock::VerifyAndClearExpectations(&callback_);
1155 EXPECT_CALL(callback_, SendPacket).Times(0);
1156 int unacked_packets = 0;
1157 for (int duration = 0; duration < kCongestionTimeMs; duration += 5) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001158 Send(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +02001159 clock_.TimeInMilliseconds(), kPacketSize);
1160 unacked_packets++;
1161 clock_.AdvanceTimeMilliseconds(5);
1162 pacer_->ProcessPackets();
1163 }
1164 ::testing::Mock::VerifyAndClearExpectations(&callback_);
1165
1166 // First mark half of the congested packets as cleared and make sure that just
1167 // as many are sent
1168 int ack_count = kCongestionCount / 2;
1169 EXPECT_CALL(callback_, SendPacket(ssrc, _, _, false, _)).Times(ack_count);
1170 pacer_->UpdateOutstandingData(
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +01001171 DataSize::Bytes(kCongestionWindow - kPacketSize * ack_count));
Erik Språngd05edec2019-08-14 10:43:47 +02001172
1173 for (int duration = 0; duration < kCongestionTimeMs; duration += 5) {
1174 clock_.AdvanceTimeMilliseconds(5);
1175 pacer_->ProcessPackets();
1176 }
1177 unacked_packets -= ack_count;
1178 ::testing::Mock::VerifyAndClearExpectations(&callback_);
1179
1180 // Second make sure all packets are sent if sent packets are continuously
1181 // marked as acked.
1182 EXPECT_CALL(callback_, SendPacket(ssrc, _, _, false, _))
1183 .Times(unacked_packets);
1184 for (int duration = 0; duration < kCongestionTimeMs; duration += 5) {
1185 pacer_->UpdateOutstandingData(DataSize::Zero());
1186 clock_.AdvanceTimeMilliseconds(5);
1187 pacer_->ProcessPackets();
1188 }
1189}
1190
Erik Språngeb487992019-11-14 14:15:15 +01001191TEST_P(PacingControllerTest, Pause) {
Erik Språngd05edec2019-08-14 10:43:47 +02001192 uint32_t ssrc_low_priority = 12345;
1193 uint32_t ssrc = 12346;
1194 uint32_t ssrc_high_priority = 12347;
1195 uint16_t sequence_number = 1234;
Erik Språngd05edec2019-08-14 10:43:47 +02001196
1197 EXPECT_EQ(TimeDelta::Zero(), pacer_->OldestPacketWaitTime());
1198
Erik Språngeb487992019-11-14 14:15:15 +01001199 ConsumeInitialBudget();
Erik Språngd05edec2019-08-14 10:43:47 +02001200
1201 pacer_->Pause();
1202
Erik Språngeb487992019-11-14 14:15:15 +01001203 int64_t capture_time_ms = clock_.TimeInMilliseconds();
1204 const size_t packets_to_send_per_interval =
1205 kTargetRate.bps() * kPaceMultiplier / (8 * 250 * 200);
Erik Språngd05edec2019-08-14 10:43:47 +02001206 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001207 Send(RtpPacketMediaType::kVideo, ssrc_low_priority, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +02001208 capture_time_ms, 250);
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001209 Send(RtpPacketMediaType::kRetransmission, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +02001210 capture_time_ms, 250);
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001211 Send(RtpPacketMediaType::kAudio, ssrc_high_priority, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +02001212 capture_time_ms, 250);
1213 }
1214 clock_.AdvanceTimeMilliseconds(10000);
1215 int64_t second_capture_time_ms = clock_.TimeInMilliseconds();
1216 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001217 Send(RtpPacketMediaType::kVideo, ssrc_low_priority, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +02001218 second_capture_time_ms, 250);
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001219 Send(RtpPacketMediaType::kRetransmission, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +02001220 second_capture_time_ms, 250);
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001221 Send(RtpPacketMediaType::kAudio, ssrc_high_priority, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +02001222 second_capture_time_ms, 250);
1223 }
1224
1225 // Expect everything to be queued.
Danil Chapovalov55284022020-02-07 14:53:52 +01001226 EXPECT_EQ(TimeDelta::Millis(second_capture_time_ms - capture_time_ms),
Erik Språngd05edec2019-08-14 10:43:47 +02001227 pacer_->OldestPacketWaitTime());
1228
Erik Språngeb487992019-11-14 14:15:15 +01001229 // Process triggers keep-alive packet.
1230 EXPECT_CALL(callback_, SendPadding).WillOnce([](size_t padding) {
1231 return padding;
1232 });
Erik Språngf5815fa2019-08-21 14:27:31 +02001233 EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
Erik Språngd05edec2019-08-14 10:43:47 +02001234 pacer_->ProcessPackets();
1235
Erik Språngeb487992019-11-14 14:15:15 +01001236 // Verify no packets sent for the rest of the paused process interval.
Danil Chapovalov55284022020-02-07 14:53:52 +01001237 const TimeDelta kProcessInterval = TimeDelta::Millis(5);
Erik Språngeb487992019-11-14 14:15:15 +01001238 TimeDelta expected_time_until_send = PacingController::kPausedProcessInterval;
Erik Språngd05edec2019-08-14 10:43:47 +02001239 EXPECT_CALL(callback_, SendPadding).Times(0);
Erik Språngeb487992019-11-14 14:15:15 +01001240 while (expected_time_until_send >= kProcessInterval) {
Erik Språngd05edec2019-08-14 10:43:47 +02001241 pacer_->ProcessPackets();
Erik Språngeb487992019-11-14 14:15:15 +01001242 clock_.AdvanceTime(kProcessInterval);
1243 expected_time_until_send -= kProcessInterval;
Erik Språngd05edec2019-08-14 10:43:47 +02001244 }
1245
Erik Språngeb487992019-11-14 14:15:15 +01001246 // New keep-alive packet.
Erik Språngd05edec2019-08-14 10:43:47 +02001247 ::testing::Mock::VerifyAndClearExpectations(&callback_);
Erik Språngeb487992019-11-14 14:15:15 +01001248 EXPECT_CALL(callback_, SendPadding).WillOnce([](size_t padding) {
1249 return padding;
1250 });
Erik Språngf5815fa2019-08-21 14:27:31 +02001251 EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
Erik Språngeb487992019-11-14 14:15:15 +01001252 clock_.AdvanceTime(kProcessInterval);
Erik Språngd05edec2019-08-14 10:43:47 +02001253 pacer_->ProcessPackets();
1254 ::testing::Mock::VerifyAndClearExpectations(&callback_);
1255
1256 // Expect high prio packets to come out first followed by normal
1257 // prio packets and low prio packets (all in capture order).
1258 {
1259 ::testing::InSequence sequence;
1260 EXPECT_CALL(callback_,
1261 SendPacket(ssrc_high_priority, _, capture_time_ms, _, _))
1262 .Times(packets_to_send_per_interval);
1263 EXPECT_CALL(callback_,
1264 SendPacket(ssrc_high_priority, _, second_capture_time_ms, _, _))
1265 .Times(packets_to_send_per_interval);
1266
1267 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
1268 EXPECT_CALL(callback_, SendPacket(ssrc, _, capture_time_ms, _, _))
1269 .Times(1);
1270 }
1271 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
1272 EXPECT_CALL(callback_, SendPacket(ssrc, _, second_capture_time_ms, _, _))
1273 .Times(1);
1274 }
1275 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
1276 EXPECT_CALL(callback_,
1277 SendPacket(ssrc_low_priority, _, capture_time_ms, _, _))
1278 .Times(1);
1279 }
1280 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
1281 EXPECT_CALL(callback_, SendPacket(ssrc_low_priority, _,
1282 second_capture_time_ms, _, _))
1283 .Times(1);
1284 }
1285 }
1286 pacer_->Resume();
1287
Erik Språngeb487992019-11-14 14:15:15 +01001288 if (PeriodicProcess()) {
1289 // The pacer was resumed directly after the previous process call finished.
1290 // It will therefore wait 5 ms until next process.
Erik Språngd05edec2019-08-14 10:43:47 +02001291 clock_.AdvanceTime(TimeUntilNextProcess());
Erik Språngeb487992019-11-14 14:15:15 +01001292
1293 for (size_t i = 0; i < 4; i++) {
1294 pacer_->ProcessPackets();
1295 clock_.AdvanceTime(TimeUntilNextProcess());
1296 }
1297 } else {
1298 while (pacer_->QueueSizePackets() > 0) {
1299 AdvanceTimeAndProcess();
1300 }
Erik Språngd05edec2019-08-14 10:43:47 +02001301 }
1302
1303 EXPECT_EQ(TimeDelta::Zero(), pacer_->OldestPacketWaitTime());
1304}
1305
Erik Språngeb487992019-11-14 14:15:15 +01001306TEST_P(PacingControllerTest, InactiveFromStart) {
1307 // Recreate the pacer without the inital time forwarding.
1308 pacer_ = std::make_unique<PacingController>(&clock_, &callback_, nullptr,
1309 nullptr, GetParam());
1310 pacer_->SetProbingEnabled(false);
1311 pacer_->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
1312
1313 if (PeriodicProcess()) {
1314 // In period mode, pause the pacer to check the same idle behavior as
1315 // dynamic.
1316 pacer_->Pause();
1317 }
1318
1319 // No packets sent, there should be no keep-alives sent either.
1320 EXPECT_CALL(callback_, SendPadding).Times(0);
1321 EXPECT_CALL(callback_, SendPacket).Times(0);
1322 pacer_->ProcessPackets();
1323
1324 const Timestamp start_time = clock_.CurrentTime();
1325
1326 // Determine the margin need so we can advance to the last possible moment
1327 // that will not cause a process event.
1328 const TimeDelta time_margin =
1329 (GetParam() == PacingController::ProcessMode::kDynamic
1330 ? PacingController::kMinSleepTime
1331 : TimeDelta::Zero()) +
Danil Chapovalov55284022020-02-07 14:53:52 +01001332 TimeDelta::Micros(1);
Erik Språngeb487992019-11-14 14:15:15 +01001333
1334 EXPECT_EQ(pacer_->NextSendTime() - start_time,
1335 PacingController::kPausedProcessInterval);
1336 clock_.AdvanceTime(PacingController::kPausedProcessInterval - time_margin);
1337 pacer_->ProcessPackets();
1338 EXPECT_EQ(pacer_->NextSendTime() - start_time,
1339 PacingController::kPausedProcessInterval);
1340
1341 clock_.AdvanceTime(time_margin);
1342 pacer_->ProcessPackets();
1343 EXPECT_EQ(pacer_->NextSendTime() - start_time,
1344 2 * PacingController::kPausedProcessInterval);
1345}
1346
1347TEST_P(PacingControllerTest, ExpectedQueueTimeMs) {
Erik Språngd05edec2019-08-14 10:43:47 +02001348 uint32_t ssrc = 12346;
1349 uint16_t sequence_number = 1234;
1350 const size_t kNumPackets = 60;
1351 const size_t kPacketSize = 1200;
1352 const int32_t kMaxBitrate = kPaceMultiplier * 30000;
1353 EXPECT_EQ(TimeDelta::Zero(), pacer_->OldestPacketWaitTime());
1354
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +01001355 pacer_->SetPacingRates(DataRate::BitsPerSec(30000 * kPaceMultiplier),
Erik Språngd05edec2019-08-14 10:43:47 +02001356 DataRate::Zero());
1357 for (size_t i = 0; i < kNumPackets; ++i) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001358 SendAndExpectPacket(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +02001359 clock_.TimeInMilliseconds(), kPacketSize);
1360 }
1361
1362 // Queue in ms = 1000 * (bytes in queue) *8 / (bits per second)
1363 TimeDelta queue_time =
Danil Chapovalov55284022020-02-07 14:53:52 +01001364 TimeDelta::Millis(1000 * kNumPackets * kPacketSize * 8 / kMaxBitrate);
Erik Språngd05edec2019-08-14 10:43:47 +02001365 EXPECT_EQ(queue_time, pacer_->ExpectedQueueTime());
1366
1367 const Timestamp time_start = clock_.CurrentTime();
1368 while (pacer_->QueueSizePackets() > 0) {
1369 clock_.AdvanceTime(TimeUntilNextProcess());
1370 pacer_->ProcessPackets();
1371 }
1372 TimeDelta duration = clock_.CurrentTime() - time_start;
1373
1374 EXPECT_EQ(TimeDelta::Zero(), pacer_->ExpectedQueueTime());
1375
1376 // Allow for aliasing, duration should be within one pack of max time limit.
1377 const TimeDelta deviation =
1378 duration - PacingController::kMaxExpectedQueueLength;
1379 EXPECT_LT(deviation.Abs(),
Danil Chapovalov55284022020-02-07 14:53:52 +01001380 TimeDelta::Millis(1000 * kPacketSize * 8 / kMaxBitrate));
Erik Språngd05edec2019-08-14 10:43:47 +02001381}
1382
Erik Språngeb487992019-11-14 14:15:15 +01001383TEST_P(PacingControllerTest, QueueTimeGrowsOverTime) {
Erik Språngd05edec2019-08-14 10:43:47 +02001384 uint32_t ssrc = 12346;
1385 uint16_t sequence_number = 1234;
1386 EXPECT_EQ(TimeDelta::Zero(), pacer_->OldestPacketWaitTime());
1387
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +01001388 pacer_->SetPacingRates(DataRate::BitsPerSec(30000 * kPaceMultiplier),
Erik Språngd05edec2019-08-14 10:43:47 +02001389 DataRate::Zero());
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001390 SendAndExpectPacket(RtpPacketMediaType::kVideo, ssrc, sequence_number,
Erik Språngd05edec2019-08-14 10:43:47 +02001391 clock_.TimeInMilliseconds(), 1200);
1392
1393 clock_.AdvanceTimeMilliseconds(500);
Danil Chapovalov55284022020-02-07 14:53:52 +01001394 EXPECT_EQ(TimeDelta::Millis(500), pacer_->OldestPacketWaitTime());
Erik Språngd05edec2019-08-14 10:43:47 +02001395 pacer_->ProcessPackets();
1396 EXPECT_EQ(TimeDelta::Zero(), pacer_->OldestPacketWaitTime());
1397}
1398
Erik Språngeb487992019-11-14 14:15:15 +01001399TEST_P(PacingControllerTest, ProbingWithInsertedPackets) {
Erik Språngd05edec2019-08-14 10:43:47 +02001400 const size_t kPacketSize = 1200;
1401 const int kInitialBitrateBps = 300000;
1402 uint32_t ssrc = 12346;
1403 uint16_t sequence_number = 1234;
1404
1405 PacingControllerProbing packet_sender;
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001406 pacer_ = std::make_unique<PacingController>(&clock_, &packet_sender, nullptr,
Erik Språngeb487992019-11-14 14:15:15 +01001407 nullptr, GetParam());
Erik Språngd05edec2019-08-14 10:43:47 +02001408 pacer_->CreateProbeCluster(kFirstClusterRate,
1409 /*cluster_id=*/0);
1410 pacer_->CreateProbeCluster(kSecondClusterRate,
1411 /*cluster_id=*/1);
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +01001412 pacer_->SetPacingRates(
1413 DataRate::BitsPerSec(kInitialBitrateBps * kPaceMultiplier),
1414 DataRate::Zero());
Erik Språngd05edec2019-08-14 10:43:47 +02001415
1416 for (int i = 0; i < 10; ++i) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001417 Send(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +02001418 clock_.TimeInMilliseconds(), kPacketSize);
1419 }
1420
1421 int64_t start = clock_.TimeInMilliseconds();
1422 while (packet_sender.packets_sent() < 5) {
1423 clock_.AdvanceTime(TimeUntilNextProcess());
1424 pacer_->ProcessPackets();
1425 }
1426 int packets_sent = packet_sender.packets_sent();
1427 // Validate first cluster bitrate. Note that we have to account for number
1428 // of intervals and hence (packets_sent - 1) on the first cluster.
1429 EXPECT_NEAR((packets_sent - 1) * kPacketSize * 8000 /
1430 (clock_.TimeInMilliseconds() - start),
1431 kFirstClusterRate.bps(), kProbingErrorMargin.bps());
Erik Språng279f3702020-10-13 21:55:07 +02001432 // Probing always starts with a small padding packet.
1433 EXPECT_EQ(1, packet_sender.padding_sent());
Erik Språngd05edec2019-08-14 10:43:47 +02001434
1435 clock_.AdvanceTime(TimeUntilNextProcess());
1436 start = clock_.TimeInMilliseconds();
1437 while (packet_sender.packets_sent() < 10) {
1438 clock_.AdvanceTime(TimeUntilNextProcess());
1439 pacer_->ProcessPackets();
1440 }
1441 packets_sent = packet_sender.packets_sent() - packets_sent;
1442 // Validate second cluster bitrate.
1443 EXPECT_NEAR((packets_sent - 1) * kPacketSize * 8000 /
1444 (clock_.TimeInMilliseconds() - start),
1445 kSecondClusterRate.bps(), kProbingErrorMargin.bps());
1446}
1447
Erik Språngeb487992019-11-14 14:15:15 +01001448TEST_P(PacingControllerTest, SkipsProbesWhenProcessIntervalTooLarge) {
Erik Språngb210eeb2019-11-05 11:21:48 +01001449 const size_t kPacketSize = 1200;
1450 const int kInitialBitrateBps = 300000;
Erik Språngb9d38092020-07-17 12:06:12 +02001451 const uint32_t ssrc = 12346;
1452 const int kProbeClusterId = 3;
Erik Språngb210eeb2019-11-05 11:21:48 +01001453
Erik Språngb9d38092020-07-17 12:06:12 +02001454 // Test with both legacy and new probe discard modes.
1455 // TODO(bugs.webrtc.org/11780): Clean up when legacy is gone.
1456 for (bool abort_delayed_probes : {false, true}) {
1457 uint16_t sequence_number = 1234;
Erik Språngb210eeb2019-11-05 11:21:48 +01001458
Erik Språngb9d38092020-07-17 12:06:12 +02001459 PacingControllerProbing packet_sender;
1460
1461 const test::ExplicitKeyValueConfig trials(
1462 abort_delayed_probes ? "WebRTC-Bwe-ProbingBehavior/"
1463 "abort_delayed_probes:1,max_probe_delay:2ms/"
1464 : "WebRTC-Bwe-ProbingBehavior/"
1465 "abort_delayed_probes:0,max_probe_delay:2ms/");
1466 pacer_ = std::make_unique<PacingController>(&clock_, &packet_sender,
1467 nullptr, &trials, GetParam());
1468 pacer_->SetPacingRates(
1469 DataRate::BitsPerSec(kInitialBitrateBps * kPaceMultiplier),
1470 DataRate::BitsPerSec(kInitialBitrateBps));
1471
1472 for (int i = 0; i < 10; ++i) {
1473 Send(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
1474 clock_.TimeInMilliseconds(), kPacketSize);
1475 }
1476 while (pacer_->QueueSizePackets() > 0) {
1477 clock_.AdvanceTime(TimeUntilNextProcess());
1478 pacer_->ProcessPackets();
1479 }
1480
1481 // Probe at a very high rate.
1482 pacer_->CreateProbeCluster(DataRate::KilobitsPerSec(10000), // 10 Mbps.
1483 /*cluster_id=*/kProbeClusterId);
1484 // We need one packet to start the probe.
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001485 Send(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngb210eeb2019-11-05 11:21:48 +01001486 clock_.TimeInMilliseconds(), kPacketSize);
Erik Språngb9d38092020-07-17 12:06:12 +02001487 const int packets_sent_before_probe = packet_sender.packets_sent();
Erik Språngb210eeb2019-11-05 11:21:48 +01001488 clock_.AdvanceTime(TimeUntilNextProcess());
1489 pacer_->ProcessPackets();
Erik Språngb9d38092020-07-17 12:06:12 +02001490 EXPECT_EQ(packet_sender.packets_sent(), packets_sent_before_probe + 1);
1491
1492 // Figure out how long between probe packets.
1493 Timestamp start_time = clock_.CurrentTime();
1494 clock_.AdvanceTime(TimeUntilNextProcess());
1495 TimeDelta time_between_probes = clock_.CurrentTime() - start_time;
1496 // Advance that distance again + 1ms.
1497 clock_.AdvanceTime(time_between_probes);
1498
1499 // Send second probe packet.
1500 Send(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
1501 clock_.TimeInMilliseconds(), kPacketSize);
1502 pacer_->ProcessPackets();
1503 EXPECT_EQ(packet_sender.packets_sent(), packets_sent_before_probe + 2);
1504 PacedPacketInfo last_pacing_info = packet_sender.last_pacing_info();
1505 EXPECT_EQ(last_pacing_info.probe_cluster_id, kProbeClusterId);
1506
1507 // We're exactly where we should be for the next probe.
1508 const Timestamp probe_time = clock_.CurrentTime();
1509 EXPECT_EQ(pacer_->NextSendTime(), clock_.CurrentTime());
1510
1511 BitrateProberConfig probing_config(&trials);
1512 EXPECT_GT(probing_config.max_probe_delay.Get(), TimeDelta::Zero());
1513 // Advance to within max probe delay, should still return same target.
1514 clock_.AdvanceTime(probing_config.max_probe_delay.Get());
1515 EXPECT_EQ(pacer_->NextSendTime(), probe_time);
1516
1517 // Too high probe delay, drop it!
1518 clock_.AdvanceTime(TimeDelta::Micros(1));
1519
1520 int packets_sent_before_timeout = packet_sender.total_packets_sent();
1521 if (abort_delayed_probes) {
1522 // Expected next process time is unchanged, but calling should not
1523 // generate new packets.
1524 EXPECT_EQ(pacer_->NextSendTime(), probe_time);
1525 pacer_->ProcessPackets();
1526 EXPECT_EQ(packet_sender.total_packets_sent(),
1527 packets_sent_before_timeout);
1528
1529 // Next packet sent is not part of probe.
1530 if (PeriodicProcess()) {
1531 do {
1532 AdvanceTimeAndProcess();
1533 } while (packet_sender.total_packets_sent() ==
1534 packets_sent_before_timeout);
1535 } else {
1536 AdvanceTimeAndProcess();
1537 }
1538 const int expected_probe_id = PacedPacketInfo::kNotAProbe;
1539 EXPECT_EQ(packet_sender.last_pacing_info().probe_cluster_id,
1540 expected_probe_id);
1541 } else {
1542 // Legacy behaviour, probe "aborted" so send time moved back. Next call to
1543 // ProcessPackets() still results in packets being marked as part of probe
1544 // cluster.
1545 EXPECT_GT(pacer_->NextSendTime(), probe_time);
1546 AdvanceTimeAndProcess();
1547 EXPECT_GT(packet_sender.total_packets_sent(),
1548 packets_sent_before_timeout);
1549 const int expected_probe_id = last_pacing_info.probe_cluster_id;
1550 EXPECT_EQ(packet_sender.last_pacing_info().probe_cluster_id,
1551 expected_probe_id);
1552
1553 // Time between sent packets keeps being too large, but we still mark the
1554 // packets as being part of the cluster.
1555 Timestamp a = clock_.CurrentTime();
1556 AdvanceTimeAndProcess();
1557 EXPECT_GT(packet_sender.total_packets_sent(),
1558 packets_sent_before_timeout);
1559 EXPECT_EQ(packet_sender.last_pacing_info().probe_cluster_id,
1560 expected_probe_id);
1561 EXPECT_GT(clock_.CurrentTime() - a, time_between_probes);
1562 }
Erik Språngb210eeb2019-11-05 11:21:48 +01001563 }
Erik Språngb210eeb2019-11-05 11:21:48 +01001564}
1565
Erik Språngeb487992019-11-14 14:15:15 +01001566TEST_P(PacingControllerTest, ProbingWithPaddingSupport) {
Erik Språngd05edec2019-08-14 10:43:47 +02001567 const size_t kPacketSize = 1200;
1568 const int kInitialBitrateBps = 300000;
1569 uint32_t ssrc = 12346;
1570 uint16_t sequence_number = 1234;
1571
1572 PacingControllerProbing packet_sender;
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001573 pacer_ = std::make_unique<PacingController>(&clock_, &packet_sender, nullptr,
Erik Språngeb487992019-11-14 14:15:15 +01001574 nullptr, GetParam());
Erik Språngd05edec2019-08-14 10:43:47 +02001575 pacer_->CreateProbeCluster(kFirstClusterRate,
1576 /*cluster_id=*/0);
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +01001577 pacer_->SetPacingRates(
1578 DataRate::BitsPerSec(kInitialBitrateBps * kPaceMultiplier),
1579 DataRate::Zero());
Erik Språngd05edec2019-08-14 10:43:47 +02001580
1581 for (int i = 0; i < 3; ++i) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001582 Send(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +02001583 clock_.TimeInMilliseconds(), kPacketSize);
1584 }
1585
1586 int64_t start = clock_.TimeInMilliseconds();
1587 int process_count = 0;
1588 while (process_count < 5) {
1589 clock_.AdvanceTime(TimeUntilNextProcess());
1590 pacer_->ProcessPackets();
1591 ++process_count;
1592 }
1593 int packets_sent = packet_sender.packets_sent();
1594 int padding_sent = packet_sender.padding_sent();
1595 EXPECT_GT(packets_sent, 0);
1596 EXPECT_GT(padding_sent, 0);
1597 // Note that the number of intervals here for kPacketSize is
1598 // packets_sent due to padding in the same cluster.
1599 EXPECT_NEAR((packets_sent * kPacketSize * 8000 + padding_sent) /
1600 (clock_.TimeInMilliseconds() - start),
1601 kFirstClusterRate.bps(), kProbingErrorMargin.bps());
1602}
1603
Erik Språngeb487992019-11-14 14:15:15 +01001604TEST_P(PacingControllerTest, PaddingOveruse) {
Erik Språngd05edec2019-08-14 10:43:47 +02001605 uint32_t ssrc = 12346;
1606 uint16_t sequence_number = 1234;
1607 const size_t kPacketSize = 1200;
1608
Erik Språngeb487992019-11-14 14:15:15 +01001609 // Initially no padding rate.
Erik Språngd05edec2019-08-14 10:43:47 +02001610 pacer_->ProcessPackets();
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +01001611 pacer_->SetPacingRates(DataRate::BitsPerSec(60000 * kPaceMultiplier),
Erik Språngd05edec2019-08-14 10:43:47 +02001612 DataRate::Zero());
1613
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001614 SendAndExpectPacket(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +02001615 clock_.TimeInMilliseconds(), kPacketSize);
1616 pacer_->ProcessPackets();
1617
1618 // Add 30kbit padding. When increasing budget, media budget will increase from
1619 // negative (overuse) while padding budget will increase from 0.
1620 clock_.AdvanceTimeMilliseconds(5);
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +01001621 pacer_->SetPacingRates(DataRate::BitsPerSec(60000 * kPaceMultiplier),
1622 DataRate::BitsPerSec(30000));
Erik Språngd05edec2019-08-14 10:43:47 +02001623
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001624 SendAndExpectPacket(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +02001625 clock_.TimeInMilliseconds(), kPacketSize);
Danil Chapovalov55284022020-02-07 14:53:52 +01001626 EXPECT_LT(TimeDelta::Millis(5), pacer_->ExpectedQueueTime());
Erik Språngd05edec2019-08-14 10:43:47 +02001627 // Don't send padding if queue is non-empty, even if padding budget > 0.
1628 EXPECT_CALL(callback_, SendPadding).Times(0);
Erik Språngeb487992019-11-14 14:15:15 +01001629 if (PeriodicProcess()) {
1630 pacer_->ProcessPackets();
1631 } else {
1632 AdvanceTimeAndProcess();
1633 }
Erik Språngd05edec2019-08-14 10:43:47 +02001634}
1635
Erik Språngeb487992019-11-14 14:15:15 +01001636TEST_P(PacingControllerTest, ProbeClusterId) {
Erik Språngd05edec2019-08-14 10:43:47 +02001637 MockPacketSender callback;
1638
Erik Språngeb487992019-11-14 14:15:15 +01001639 pacer_ = std::make_unique<PacingController>(&clock_, &callback, nullptr,
1640 nullptr, GetParam());
Erik Språngd05edec2019-08-14 10:43:47 +02001641 Init();
1642
1643 uint32_t ssrc = 12346;
1644 uint16_t sequence_number = 1234;
1645 const size_t kPacketSize = 1200;
1646
1647 pacer_->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
1648 pacer_->SetProbingEnabled(true);
1649 for (int i = 0; i < 10; ++i) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001650 Send(RtpPacketMediaType::kVideo, ssrc, sequence_number++,
Erik Språngd05edec2019-08-14 10:43:47 +02001651 clock_.TimeInMilliseconds(), kPacketSize);
1652 }
1653
1654 // First probing cluster.
Erik Språngf5815fa2019-08-21 14:27:31 +02001655 EXPECT_CALL(callback,
Erik Språnged1fb192020-06-30 11:53:37 +00001656 SendPacket(_, Field(&PacedPacketInfo::probe_cluster_id, 0)))
Erik Språngf5815fa2019-08-21 14:27:31 +02001657 .Times(5);
Erik Språngd05edec2019-08-14 10:43:47 +02001658
1659 for (int i = 0; i < 5; ++i) {
Erik Språngeb487992019-11-14 14:15:15 +01001660 AdvanceTimeAndProcess();
Erik Språngd05edec2019-08-14 10:43:47 +02001661 }
1662
1663 // Second probing cluster.
Erik Språngf5815fa2019-08-21 14:27:31 +02001664 EXPECT_CALL(callback,
Erik Språnged1fb192020-06-30 11:53:37 +00001665 SendPacket(_, Field(&PacedPacketInfo::probe_cluster_id, 1)))
Erik Språngf5815fa2019-08-21 14:27:31 +02001666 .Times(5);
Erik Språngd05edec2019-08-14 10:43:47 +02001667
1668 for (int i = 0; i < 5; ++i) {
Erik Språngeb487992019-11-14 14:15:15 +01001669 AdvanceTimeAndProcess();
Erik Språngd05edec2019-08-14 10:43:47 +02001670 }
1671
1672 // Needed for the Field comparer below.
1673 const int kNotAProbe = PacedPacketInfo::kNotAProbe;
1674 // No more probing packets.
Erik Språngf5815fa2019-08-21 14:27:31 +02001675 EXPECT_CALL(callback, GeneratePadding).WillOnce([&](DataSize padding_size) {
1676 std::vector<std::unique_ptr<RtpPacketToSend>> padding_packets;
1677 padding_packets.emplace_back(
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001678 BuildPacket(RtpPacketMediaType::kPadding, ssrc, sequence_number++,
Erik Språngf5815fa2019-08-21 14:27:31 +02001679 clock_.TimeInMilliseconds(), padding_size.bytes()));
1680 return padding_packets;
1681 });
Erik Språngeb487992019-11-14 14:15:15 +01001682 bool non_probe_packet_seen = false;
Erik Språnged1fb192020-06-30 11:53:37 +00001683 EXPECT_CALL(callback, SendPacket)
Erik Språngeb487992019-11-14 14:15:15 +01001684 .WillOnce([&](std::unique_ptr<RtpPacketToSend> packet,
1685 const PacedPacketInfo& cluster_info) {
1686 EXPECT_EQ(cluster_info.probe_cluster_id, kNotAProbe);
1687 non_probe_packet_seen = true;
1688 });
1689 while (!non_probe_packet_seen) {
1690 AdvanceTimeAndProcess();
1691 }
Erik Språngd05edec2019-08-14 10:43:47 +02001692}
1693
Erik Språngeb487992019-11-14 14:15:15 +01001694TEST_P(PacingControllerTest, OwnedPacketPrioritizedOnType) {
Erik Språngd05edec2019-08-14 10:43:47 +02001695 MockPacketSender callback;
Erik Språngeb487992019-11-14 14:15:15 +01001696 pacer_ = std::make_unique<PacingController>(&clock_, &callback, nullptr,
1697 nullptr, GetParam());
Erik Språngd05edec2019-08-14 10:43:47 +02001698 Init();
1699
1700 // Insert a packet of each type, from low to high priority. Since priority
1701 // is weighted higher than insert order, these should come out of the pacer
1702 // in backwards order with the exception of FEC and Video.
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001703 for (RtpPacketMediaType type :
1704 {RtpPacketMediaType::kPadding,
1705 RtpPacketMediaType::kForwardErrorCorrection, RtpPacketMediaType::kVideo,
1706 RtpPacketMediaType::kRetransmission, RtpPacketMediaType::kAudio}) {
Erik Språngd05edec2019-08-14 10:43:47 +02001707 pacer_->EnqueuePacket(BuildRtpPacket(type));
1708 }
1709
1710 ::testing::InSequence seq;
1711 EXPECT_CALL(
1712 callback,
Erik Språnged1fb192020-06-30 11:53:37 +00001713 SendPacket(Pointee(Property(&RtpPacketToSend::Ssrc, kAudioSsrc)), _));
1714 EXPECT_CALL(
1715 callback,
1716 SendPacket(Pointee(Property(&RtpPacketToSend::Ssrc, kVideoRtxSsrc)), _));
Erik Språngd05edec2019-08-14 10:43:47 +02001717
1718 // FEC and video actually have the same priority, so will come out in
1719 // insertion order.
Erik Språngd05edec2019-08-14 10:43:47 +02001720 EXPECT_CALL(
1721 callback,
Erik Språnged1fb192020-06-30 11:53:37 +00001722 SendPacket(Pointee(Property(&RtpPacketToSend::Ssrc, kFlexFecSsrc)), _));
1723 EXPECT_CALL(
1724 callback,
1725 SendPacket(Pointee(Property(&RtpPacketToSend::Ssrc, kVideoSsrc)), _));
Erik Språngd05edec2019-08-14 10:43:47 +02001726
Erik Språnged1fb192020-06-30 11:53:37 +00001727 EXPECT_CALL(
1728 callback,
1729 SendPacket(Pointee(Property(&RtpPacketToSend::Ssrc, kVideoRtxSsrc)), _));
Erik Språngd05edec2019-08-14 10:43:47 +02001730
Erik Språngeb487992019-11-14 14:15:15 +01001731 while (pacer_->QueueSizePackets() > 0) {
1732 if (PeriodicProcess()) {
1733 clock_.AdvanceTimeMilliseconds(5);
1734 pacer_->ProcessPackets();
1735 } else {
1736 AdvanceTimeAndProcess();
1737 }
1738 }
Erik Språngd05edec2019-08-14 10:43:47 +02001739}
Erik Språng78c82a42019-10-03 18:46:04 +02001740
Erik Språngeb487992019-11-14 14:15:15 +01001741TEST_P(PacingControllerTest, SmallFirstProbePacket) {
Erik Språng78c82a42019-10-03 18:46:04 +02001742 MockPacketSender callback;
Erik Språngeb487992019-11-14 14:15:15 +01001743 pacer_ = std::make_unique<PacingController>(&clock_, &callback, nullptr,
1744 nullptr, GetParam());
Erik Språng78c82a42019-10-03 18:46:04 +02001745 pacer_->CreateProbeCluster(kFirstClusterRate, /*cluster_id=*/0);
1746 pacer_->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
1747
1748 // Add high prio media.
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001749 pacer_->EnqueuePacket(BuildRtpPacket(RtpPacketMediaType::kAudio));
Erik Språng78c82a42019-10-03 18:46:04 +02001750
1751 // Expect small padding packet to be requested.
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +01001752 EXPECT_CALL(callback, GeneratePadding(DataSize::Bytes(1)))
Erik Språng78c82a42019-10-03 18:46:04 +02001753 .WillOnce([&](DataSize padding_size) {
1754 std::vector<std::unique_ptr<RtpPacketToSend>> padding_packets;
1755 padding_packets.emplace_back(
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001756 BuildPacket(RtpPacketMediaType::kPadding, kAudioSsrc, 1,
Erik Språng78c82a42019-10-03 18:46:04 +02001757 clock_.TimeInMilliseconds(), 1));
1758 return padding_packets;
1759 });
1760
1761 size_t packets_sent = 0;
1762 bool media_seen = false;
Erik Språnged1fb192020-06-30 11:53:37 +00001763 EXPECT_CALL(callback, SendPacket)
Erik Språng78c82a42019-10-03 18:46:04 +02001764 .Times(::testing::AnyNumber())
1765 .WillRepeatedly([&](std::unique_ptr<RtpPacketToSend> packet,
1766 const PacedPacketInfo& cluster_info) {
1767 if (packets_sent == 0) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001768 EXPECT_EQ(packet->packet_type(), RtpPacketMediaType::kPadding);
Erik Språng78c82a42019-10-03 18:46:04 +02001769 } else {
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001770 if (packet->packet_type() == RtpPacketMediaType::kAudio) {
Erik Språng78c82a42019-10-03 18:46:04 +02001771 media_seen = true;
1772 }
1773 }
1774 packets_sent++;
1775 });
1776 while (!media_seen) {
1777 pacer_->ProcessPackets();
1778 clock_.AdvanceTimeMilliseconds(5);
1779 }
1780}
Erik Språngeb487992019-11-14 14:15:15 +01001781
Erik Språngeb487992019-11-14 14:15:15 +01001782TEST_P(PacingControllerTest, TaskLate) {
1783 if (PeriodicProcess()) {
1784 // This test applies only when NOT using interval budget.
1785 return;
1786 }
1787
1788 // Set a low send rate to more easily test timing issues.
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +01001789 DataRate kSendRate = DataRate::KilobitsPerSec(30);
Erik Språngeb487992019-11-14 14:15:15 +01001790 pacer_->SetPacingRates(kSendRate, DataRate::Zero());
1791
1792 // Add four packets of equal size and priority.
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001793 pacer_->EnqueuePacket(BuildRtpPacket(RtpPacketMediaType::kVideo));
1794 pacer_->EnqueuePacket(BuildRtpPacket(RtpPacketMediaType::kVideo));
1795 pacer_->EnqueuePacket(BuildRtpPacket(RtpPacketMediaType::kVideo));
1796 pacer_->EnqueuePacket(BuildRtpPacket(RtpPacketMediaType::kVideo));
Erik Språngeb487992019-11-14 14:15:15 +01001797
1798 // Process packets, only first should be sent.
1799 EXPECT_CALL(callback_, SendPacket).Times(1);
1800 pacer_->ProcessPackets();
1801
1802 Timestamp next_send_time = pacer_->NextSendTime();
Erik Språngb571ff42020-04-04 17:20:37 +02001803 // Determine time between packets (ca 62ms)
Erik Språngeb487992019-11-14 14:15:15 +01001804 const TimeDelta time_between_packets = next_send_time - clock_.CurrentTime();
1805
1806 // Simulate a late process call, executed just before we allow sending the
1807 // fourth packet.
Erik Språngb571ff42020-04-04 17:20:37 +02001808 const TimeDelta kOffset = TimeDelta::Millis(1);
1809 clock_.AdvanceTime((time_between_packets * 3) - kOffset);
Erik Språngeb487992019-11-14 14:15:15 +01001810
1811 EXPECT_CALL(callback_, SendPacket).Times(2);
1812 pacer_->ProcessPackets();
1813
Erik Språngb571ff42020-04-04 17:20:37 +02001814 // Check that next scheduled send time is in ca 1ms.
Erik Språngeb487992019-11-14 14:15:15 +01001815 next_send_time = pacer_->NextSendTime();
Erik Språngb571ff42020-04-04 17:20:37 +02001816 const TimeDelta time_left = next_send_time - clock_.CurrentTime();
1817 EXPECT_EQ(time_left.RoundTo(TimeDelta::Millis(1)), kOffset);
Erik Språngeb487992019-11-14 14:15:15 +01001818
Erik Språngb571ff42020-04-04 17:20:37 +02001819 clock_.AdvanceTime(time_left);
1820 EXPECT_CALL(callback_, SendPacket);
Erik Språngeb487992019-11-14 14:15:15 +01001821 pacer_->ProcessPackets();
1822}
1823
Erik Språngae100292019-12-17 17:49:49 +01001824TEST_P(PacingControllerTest, NoProbingWhilePaused) {
1825 uint32_t ssrc = 12345;
1826 uint16_t sequence_number = 1234;
1827
1828 pacer_->SetProbingEnabled(true);
1829
1830 // Send at least one packet so probing can initate.
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001831 SendAndExpectPacket(RtpPacketMediaType::kVideo, ssrc, sequence_number,
Erik Språngae100292019-12-17 17:49:49 +01001832 clock_.TimeInMilliseconds(), 250);
1833 while (pacer_->QueueSizePackets() > 0) {
1834 AdvanceTimeAndProcess();
1835 }
1836
1837 // Trigger probing.
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +01001838 pacer_->CreateProbeCluster(DataRate::KilobitsPerSec(10000), // 10 Mbps.
Erik Språngae100292019-12-17 17:49:49 +01001839 /*cluster_id=*/3);
1840
1841 // Time to next send time should be small.
1842 EXPECT_LT(pacer_->NextSendTime() - clock_.CurrentTime(),
1843 PacingController::kPausedProcessInterval);
1844
1845 // Pause pacer, time to next send time should now be the pause process
1846 // interval.
1847 pacer_->Pause();
1848
1849 EXPECT_EQ(pacer_->NextSendTime() - clock_.CurrentTime(),
1850 PacingController::kPausedProcessInterval);
1851}
1852
Erik Språng9cb58d52020-03-28 17:15:54 +01001853TEST_P(PacingControllerTest, AudioNotPacedEvenWhenAccountedFor) {
1854 const uint32_t kSsrc = 12345;
1855 uint16_t sequence_number = 1234;
1856 const size_t kPacketSize = 123;
1857
1858 // Account for audio - so that audio packets can cause pushback on other
1859 // types such as video. Audio packet should still be immediated passed
1860 // through though ("WebRTC-Pacer-BlockAudio" needs to be enabled in order
1861 // to pace audio packets).
1862 pacer_->SetAccountForAudioPackets(true);
1863
1864 // Set pacing rate to 1 packet/s, no padding.
1865 pacer_->SetPacingRates(DataSize::Bytes(kPacketSize) / TimeDelta::Seconds(1),
1866 DataRate::Zero());
1867
1868 // Add and send an audio packet.
1869 SendAndExpectPacket(RtpPacketMediaType::kAudio, kSsrc, sequence_number++,
1870 clock_.TimeInMilliseconds(), kPacketSize);
1871 pacer_->ProcessPackets();
1872
1873 // Advance time, add another audio packet and process. It should be sent
1874 // immediately.
1875 clock_.AdvanceTimeMilliseconds(5);
1876 SendAndExpectPacket(RtpPacketMediaType::kAudio, kSsrc, sequence_number++,
1877 clock_.TimeInMilliseconds(), kPacketSize);
1878 pacer_->ProcessPackets();
1879}
1880
Erik Språngb571ff42020-04-04 17:20:37 +02001881TEST_P(PacingControllerTest,
1882 PaddingResumesAfterSaturationEvenWithConcurrentAudio) {
Erik Språng0920d5d2020-03-30 17:14:08 +02001883 const uint32_t kSsrc = 12345;
1884 const DataRate kPacingDataRate = DataRate::KilobitsPerSec(125);
1885 const DataRate kPaddingDataRate = DataRate::KilobitsPerSec(100);
1886 const TimeDelta kMaxBufferInTime = TimeDelta::Millis(500);
1887 const DataSize kPacketSize = DataSize::Bytes(130);
1888 const TimeDelta kAudioPacketInterval = TimeDelta::Millis(20);
1889
1890 // In this test, we fist send a burst of video in order to saturate the
1891 // padding debt level.
1892 // We then proceed to send audio at a bitrate that is slightly lower than
1893 // the padding rate, meaning there will be a period with audio but no
1894 // padding sent while the debt is draining, then audio and padding will
1895 // be interlieved.
1896
1897 // Verify both with and without accounting for audio.
1898 for (bool account_for_audio : {false, true}) {
1899 uint16_t sequence_number = 1234;
1900 MockPacketSender callback;
Erik Språnged1fb192020-06-30 11:53:37 +00001901 EXPECT_CALL(callback, SendPacket).Times(::testing::AnyNumber());
Erik Språng0920d5d2020-03-30 17:14:08 +02001902 pacer_ = std::make_unique<PacingController>(&clock_, &callback, nullptr,
1903 nullptr, GetParam());
1904 pacer_->SetAccountForAudioPackets(account_for_audio);
1905
1906 // First, saturate the padding budget.
1907 pacer_->SetPacingRates(kPacingDataRate, kPaddingDataRate);
1908
1909 const TimeDelta kPaddingSaturationTime =
1910 kMaxBufferInTime * kPaddingDataRate /
1911 (kPacingDataRate - kPaddingDataRate);
1912 const DataSize kVideoToSend = kPaddingSaturationTime * kPacingDataRate;
1913 const DataSize kVideoPacketSize = DataSize::Bytes(1200);
1914 DataSize video_sent = DataSize::Zero();
1915 while (video_sent < kVideoToSend) {
1916 pacer_->EnqueuePacket(
1917 BuildPacket(RtpPacketMediaType::kVideo, kSsrc, sequence_number++,
1918 clock_.TimeInMilliseconds(), kVideoPacketSize.bytes()));
1919 video_sent += kVideoPacketSize;
1920 }
1921 while (pacer_->QueueSizePackets() > 0) {
1922 AdvanceTimeAndProcess();
1923 }
1924
1925 // Add a stream of audio packets at a rate slightly lower than the padding
1926 // rate, once the padding debt is paid off we expect padding to be
1927 // generated.
1928 pacer_->SetPacingRates(kPacingDataRate, kPaddingDataRate);
1929 bool padding_seen = false;
1930 EXPECT_CALL(callback, GeneratePadding).WillOnce([&](DataSize padding_size) {
1931 padding_seen = true;
1932 std::vector<std::unique_ptr<RtpPacketToSend>> padding_packets;
1933 padding_packets.emplace_back(
1934 BuildPacket(RtpPacketMediaType::kPadding, kSsrc, sequence_number++,
1935 clock_.TimeInMilliseconds(), padding_size.bytes()));
1936 return padding_packets;
1937 });
1938
1939 Timestamp start_time = clock_.CurrentTime();
1940 Timestamp last_audio_time = start_time;
1941 while (!padding_seen) {
1942 Timestamp now = clock_.CurrentTime();
1943 Timestamp next_send_time = pacer_->NextSendTime();
1944 TimeDelta sleep_time =
1945 std::min(next_send_time, last_audio_time + kAudioPacketInterval) -
1946 now;
1947 clock_.AdvanceTime(sleep_time);
1948 while (clock_.CurrentTime() >= last_audio_time + kAudioPacketInterval) {
1949 pacer_->EnqueuePacket(
1950 BuildPacket(RtpPacketMediaType::kAudio, kSsrc, sequence_number++,
1951 clock_.TimeInMilliseconds(), kPacketSize.bytes()));
1952 last_audio_time += kAudioPacketInterval;
1953 }
1954 pacer_->ProcessPackets();
1955 }
1956
1957 // Verify how long it took to drain the padding debt. Allow 2% error margin.
1958 const DataRate kAudioDataRate = kPacketSize / kAudioPacketInterval;
1959 const TimeDelta expected_drain_time =
1960 account_for_audio ? (kMaxBufferInTime * kPaddingDataRate /
1961 (kPaddingDataRate - kAudioDataRate))
1962 : kMaxBufferInTime;
1963 const TimeDelta actual_drain_time = clock_.CurrentTime() - start_time;
1964 EXPECT_NEAR(actual_drain_time.ms(), expected_drain_time.ms(),
1965 expected_drain_time.ms() * 0.02)
1966 << " where account_for_audio = "
1967 << (account_for_audio ? "true" : "false");
1968 }
1969}
1970
Erik Språngb571ff42020-04-04 17:20:37 +02001971TEST_P(PacingControllerTest, AccountsForAudioEnqueuTime) {
1972 if (PeriodicProcess()) {
1973 // This test applies only when NOT using interval budget.
1974 return;
1975 }
1976
1977 const uint32_t kSsrc = 12345;
1978 const DataRate kPacingDataRate = DataRate::KilobitsPerSec(125);
1979 const DataRate kPaddingDataRate = DataRate::Zero();
1980 const DataSize kPacketSize = DataSize::Bytes(130);
1981 const TimeDelta kPacketPacingTime = kPacketSize / kPacingDataRate;
1982
1983 uint32_t sequnce_number = 1;
1984 // Audio not paced, but still accounted for in budget.
1985 pacer_->SetAccountForAudioPackets(true);
1986 pacer_->SetPacingRates(kPacingDataRate, kPaddingDataRate);
1987
1988 // Enqueue two audio packets, advance clock to where one packet
1989 // should have drained the buffer already, has they been sent
1990 // immediately.
1991 SendAndExpectPacket(RtpPacketMediaType::kAudio, kSsrc, sequnce_number++,
1992 clock_.TimeInMilliseconds(), kPacketSize.bytes());
1993 SendAndExpectPacket(RtpPacketMediaType::kAudio, kSsrc, sequnce_number++,
1994 clock_.TimeInMilliseconds(), kPacketSize.bytes());
1995 clock_.AdvanceTime(kPacketPacingTime);
1996 // Now process and make sure both packets were sent.
1997 pacer_->ProcessPackets();
1998 ::testing::Mock::VerifyAndClearExpectations(&callback_);
1999
2000 // Add a video packet. I can't be sent until debt from audio
2001 // packets have been drained.
2002 Send(RtpPacketMediaType::kVideo, kSsrc + 1, sequnce_number++,
2003 clock_.TimeInMilliseconds(), kPacketSize.bytes());
2004 EXPECT_EQ(pacer_->NextSendTime() - clock_.CurrentTime(), kPacketPacingTime);
2005}
2006
Erik Språngbe152f52020-04-06 16:30:23 +02002007TEST_P(PacingControllerTest, NextSendTimeAccountsForPadding) {
2008 if (PeriodicProcess()) {
2009 // This test applies only when NOT using interval budget.
2010 return;
2011 }
2012
2013 const uint32_t kSsrc = 12345;
2014 const DataRate kPacingDataRate = DataRate::KilobitsPerSec(125);
2015 const DataSize kPacketSize = DataSize::Bytes(130);
2016 const TimeDelta kPacketPacingTime = kPacketSize / kPacingDataRate;
2017
2018 uint32_t sequnce_number = 1;
2019
2020 // Start with no padding.
2021 pacer_->SetPacingRates(kPacingDataRate, DataRate::Zero());
2022
2023 // Send a single packet.
2024 SendAndExpectPacket(RtpPacketMediaType::kVideo, kSsrc, sequnce_number++,
2025 clock_.TimeInMilliseconds(), kPacketSize.bytes());
2026 pacer_->ProcessPackets();
2027 ::testing::Mock::VerifyAndClearExpectations(&callback_);
2028
2029 // With current conditions, no need to wake until next keep-alive.
2030 EXPECT_EQ(pacer_->NextSendTime() - clock_.CurrentTime(),
2031 PacingController::kPausedProcessInterval);
2032
2033 // Enqueue a new packet, that can't be sent until previous buffer has
2034 // drained.
2035 SendAndExpectPacket(RtpPacketMediaType::kVideo, kSsrc, sequnce_number++,
2036 clock_.TimeInMilliseconds(), kPacketSize.bytes());
2037 EXPECT_EQ(pacer_->NextSendTime() - clock_.CurrentTime(), kPacketPacingTime);
2038 clock_.AdvanceTime(kPacketPacingTime);
2039 pacer_->ProcessPackets();
2040 ::testing::Mock::VerifyAndClearExpectations(&callback_);
2041
2042 // With current conditions, again no need to wake until next keep-alive.
2043 EXPECT_EQ(pacer_->NextSendTime() - clock_.CurrentTime(),
2044 PacingController::kPausedProcessInterval);
2045
2046 // Set a non-zero padding rate. Padding also can't be sent until
2047 // previous debt has cleared. Since padding was disabled before, there
2048 // currently is no padding debt.
2049 pacer_->SetPacingRates(kPacingDataRate, kPacingDataRate / 2);
2050 EXPECT_EQ(pacer_->NextSendTime() - clock_.CurrentTime(), kPacketPacingTime);
2051
2052 // Advance time, expect padding.
2053 EXPECT_CALL(callback_, SendPadding).WillOnce(Return(kPacketSize.bytes()));
2054 clock_.AdvanceTime(kPacketPacingTime);
2055 pacer_->ProcessPackets();
2056 ::testing::Mock::VerifyAndClearExpectations(&callback_);
2057
2058 // Since padding rate is half of pacing rate, next time we can send
2059 // padding is double the packet pacing time.
2060 EXPECT_EQ(pacer_->NextSendTime() - clock_.CurrentTime(),
2061 kPacketPacingTime * 2);
2062
2063 // Insert a packet to be sent, this take precedence again.
2064 Send(RtpPacketMediaType::kVideo, kSsrc, sequnce_number++,
2065 clock_.TimeInMilliseconds(), kPacketSize.bytes());
2066 EXPECT_EQ(pacer_->NextSendTime() - clock_.CurrentTime(), kPacketPacingTime);
2067}
2068
Erik Språng9acc18d2020-04-16 19:41:07 +02002069TEST_P(PacingControllerTest, PaddingTargetAccountsForPaddingRate) {
2070 if (PeriodicProcess()) {
2071 // This test applies only when NOT using interval budget.
2072 return;
2073 }
2074
2075 // Re-init pacer with an explicitly set padding target of 10ms;
2076 const TimeDelta kPaddingTarget = TimeDelta::Millis(10);
2077 ScopedFieldTrials field_trials(
2078 "WebRTC-Pacer-DynamicPaddingTarget/timedelta:10ms/");
2079 SetUp();
2080
2081 const uint32_t kSsrc = 12345;
2082 const DataRate kPacingDataRate = DataRate::KilobitsPerSec(125);
2083 const DataSize kPacketSize = DataSize::Bytes(130);
2084
2085 uint32_t sequnce_number = 1;
2086
2087 // Start with pacing and padding rate equal.
2088 pacer_->SetPacingRates(kPacingDataRate, kPacingDataRate);
2089
2090 // Send a single packet.
2091 SendAndExpectPacket(RtpPacketMediaType::kVideo, kSsrc, sequnce_number++,
2092 clock_.TimeInMilliseconds(), kPacketSize.bytes());
2093 AdvanceTimeAndProcess();
2094 ::testing::Mock::VerifyAndClearExpectations(&callback_);
2095
2096 size_t expected_padding_target_bytes =
2097 (kPaddingTarget * kPacingDataRate).bytes();
2098 EXPECT_CALL(callback_, SendPadding(expected_padding_target_bytes))
2099 .WillOnce(Return(expected_padding_target_bytes));
2100 AdvanceTimeAndProcess();
2101
2102 // Half the padding rate - expect half the padding target.
2103 pacer_->SetPacingRates(kPacingDataRate, kPacingDataRate / 2);
2104 EXPECT_CALL(callback_, SendPadding(expected_padding_target_bytes / 2))
2105 .WillOnce(Return(expected_padding_target_bytes / 2));
2106 AdvanceTimeAndProcess();
2107}
2108
Erik Språngb6477852020-10-05 14:20:51 +02002109TEST_P(PacingControllerTest, SendsFecPackets) {
Erik Språng1d50cb62020-07-02 17:41:32 +02002110 const uint32_t kSsrc = 12345;
2111 const uint32_t kFlexSsrc = 54321;
2112 uint16_t sequence_number = 1234;
2113 uint16_t flexfec_sequence_number = 4321;
2114 const size_t kPacketSize = 123;
2115
2116 // Set pacing rate to 1000 packet/s, no padding.
2117 pacer_->SetPacingRates(
2118 DataSize::Bytes(1000 * kPacketSize) / TimeDelta::Seconds(1),
2119 DataRate::Zero());
2120
2121 int64_t now = clock_.TimeInMilliseconds();
2122 Send(RtpPacketMediaType::kVideo, kSsrc, sequence_number, now, kPacketSize);
2123 EXPECT_CALL(callback_, SendPacket(kSsrc, sequence_number, now, false, false));
2124 EXPECT_CALL(callback_, FetchFec).WillOnce([&]() {
2125 EXPECT_CALL(callback_, SendPacket(kFlexSsrc, flexfec_sequence_number, now,
2126 false, false));
2127 EXPECT_CALL(callback_, FetchFec);
2128 std::vector<std::unique_ptr<RtpPacketToSend>> fec_packets;
2129 fec_packets.push_back(
2130 BuildPacket(RtpPacketMediaType::kForwardErrorCorrection, kFlexSsrc,
2131 flexfec_sequence_number, now, kPacketSize));
2132 return fec_packets;
2133 });
2134 AdvanceTimeAndProcess();
2135 AdvanceTimeAndProcess();
2136}
2137
Erik Språngeb487992019-11-14 14:15:15 +01002138INSTANTIATE_TEST_SUITE_P(
2139 WithAndWithoutIntervalBudget,
2140 PacingControllerTest,
2141 ::testing::Values(PacingController::ProcessMode::kPeriodic,
2142 PacingController::ProcessMode::kDynamic));
2143
Erik Språngd05edec2019-08-14 10:43:47 +02002144} // namespace test
2145} // namespace webrtc