blob: bd2dd1de025f2d5c9bcb49401b4f22f3a1f87396 [file] [log] [blame]
Erik Språngd05edec2019-08-14 10:43:47 +02001/*
2 * Copyright (c) 2019 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11#include "modules/pacing/pacing_controller.h"
12
13#include <algorithm>
14#include <list>
15#include <memory>
16#include <string>
17#include <utility>
18#include <vector>
19
Erik Språngd05edec2019-08-14 10:43:47 +020020#include "api/units/data_rate.h"
21#include "modules/pacing/packet_router.h"
22#include "system_wrappers/include/clock.h"
23#include "test/field_trial.h"
24#include "test/gmock.h"
25#include "test/gtest.h"
26
27using ::testing::_;
28using ::testing::Field;
29using ::testing::Pointee;
30using ::testing::Property;
31using ::testing::Return;
32
33namespace webrtc {
34namespace test {
35namespace {
36constexpr DataRate kFirstClusterRate = DataRate::KilobitsPerSec<900>();
37constexpr DataRate kSecondClusterRate = DataRate::KilobitsPerSec<1800>();
38
39// The error stems from truncating the time interval of probe packets to integer
40// values. This results in probing slightly higher than the target bitrate.
41// For 1.8 Mbps, this comes to be about 120 kbps with 1200 probe packets.
42constexpr DataRate kProbingErrorMargin = DataRate::KilobitsPerSec<150>();
43
44const float kPaceMultiplier = 2.5f;
45
46constexpr uint32_t kAudioSsrc = 12345;
47constexpr uint32_t kVideoSsrc = 234565;
48constexpr uint32_t kVideoRtxSsrc = 34567;
49constexpr uint32_t kFlexFecSsrc = 45678;
50
51constexpr DataRate kTargetRate = DataRate::KilobitsPerSec<800>();
52
Erik Språngd05edec2019-08-14 10:43:47 +020053std::unique_ptr<RtpPacketToSend> BuildPacket(RtpPacketToSend::Type type,
54 uint32_t ssrc,
55 uint16_t sequence_number,
56 int64_t capture_time_ms,
57 size_t size) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +020058 auto packet = std::make_unique<RtpPacketToSend>(nullptr);
Erik Språngd05edec2019-08-14 10:43:47 +020059 packet->set_packet_type(type);
60 packet->SetSsrc(ssrc);
61 packet->SetSequenceNumber(sequence_number);
62 packet->set_capture_time_ms(capture_time_ms);
63 packet->SetPayloadSize(size);
64 return packet;
65}
66} // namespace
67
68// Mock callback proxy, where both new and old api redirects to common mock
69// methods that focus on core aspects.
70class MockPacingControllerCallback : public PacingController::PacketSender {
71 public:
Erik Språngd05edec2019-08-14 10:43:47 +020072 void SendRtpPacket(std::unique_ptr<RtpPacketToSend> packet,
73 const PacedPacketInfo& cluster_info) override {
74 SendPacket(packet->Ssrc(), packet->SequenceNumber(),
75 packet->capture_time_ms(),
76 packet->packet_type() == RtpPacketToSend::Type::kRetransmission,
77 packet->packet_type() == RtpPacketToSend::Type::kPadding);
78 }
79
Erik Språngd05edec2019-08-14 10:43:47 +020080 std::vector<std::unique_ptr<RtpPacketToSend>> GeneratePadding(
81 DataSize target_size) override {
82 std::vector<std::unique_ptr<RtpPacketToSend>> ret;
83 size_t padding_size = SendPadding(target_size.bytes());
84 if (padding_size > 0) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +020085 auto packet = std::make_unique<RtpPacketToSend>(nullptr);
Erik Språngd05edec2019-08-14 10:43:47 +020086 packet->SetPayloadSize(padding_size);
87 packet->set_packet_type(RtpPacketToSend::Type::kPadding);
88 ret.emplace_back(std::move(packet));
89 }
90 return ret;
91 }
92
93 MOCK_METHOD5(SendPacket,
94 void(uint32_t ssrc,
95 uint16_t sequence_number,
96 int64_t capture_timestamp,
97 bool retransmission,
98 bool padding));
99 MOCK_METHOD1(SendPadding, size_t(size_t target_size));
100};
101
102// Mock callback implementing the raw api.
103class MockPacketSender : public PacingController::PacketSender {
104 public:
Erik Språngd05edec2019-08-14 10:43:47 +0200105 MOCK_METHOD2(SendRtpPacket,
106 void(std::unique_ptr<RtpPacketToSend> packet,
107 const PacedPacketInfo& cluster_info));
108 MOCK_METHOD1(
109 GeneratePadding,
110 std::vector<std::unique_ptr<RtpPacketToSend>>(DataSize target_size));
111};
112
113class PacingControllerPadding : public PacingController::PacketSender {
114 public:
115 static const size_t kPaddingPacketSize = 224;
116
117 PacingControllerPadding() : padding_sent_(0) {}
118
Erik Språngd05edec2019-08-14 10:43:47 +0200119 void SendRtpPacket(std::unique_ptr<RtpPacketToSend> packet,
120 const PacedPacketInfo& pacing_info) override {}
121
Erik Språngd05edec2019-08-14 10:43:47 +0200122 std::vector<std::unique_ptr<RtpPacketToSend>> GeneratePadding(
123 DataSize target_size) override {
124 size_t num_packets =
125 (target_size.bytes() + kPaddingPacketSize - 1) / kPaddingPacketSize;
126 std::vector<std::unique_ptr<RtpPacketToSend>> packets;
127 for (size_t i = 0; i < num_packets; ++i) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200128 packets.emplace_back(std::make_unique<RtpPacketToSend>(nullptr));
Erik Språngd05edec2019-08-14 10:43:47 +0200129 packets.back()->SetPadding(kPaddingPacketSize);
130 packets.back()->set_packet_type(RtpPacketToSend::Type::kPadding);
131 padding_sent_ += kPaddingPacketSize;
132 }
133 return packets;
134 }
135
136 size_t padding_sent() { return padding_sent_; }
137
138 private:
139 size_t padding_sent_;
140};
141
142class PacingControllerProbing : public PacingController::PacketSender {
143 public:
144 PacingControllerProbing() : packets_sent_(0), padding_sent_(0) {}
145
Erik Språngd05edec2019-08-14 10:43:47 +0200146 void SendRtpPacket(std::unique_ptr<RtpPacketToSend> packet,
147 const PacedPacketInfo& pacing_info) override {
148 if (packet->packet_type() != RtpPacketToSend::Type::kPadding) {
149 ++packets_sent_;
150 }
151 }
152
Erik Språngd05edec2019-08-14 10:43:47 +0200153 std::vector<std::unique_ptr<RtpPacketToSend>> GeneratePadding(
154 DataSize target_size) override {
Erik Språngb210eeb2019-11-05 11:21:48 +0100155 // From RTPSender:
156 // Max in the RFC 3550 is 255 bytes, we limit it to be modulus 32 for SRTP.
157 const DataSize kMaxPadding = DataSize::bytes(224);
158
Erik Språngd05edec2019-08-14 10:43:47 +0200159 std::vector<std::unique_ptr<RtpPacketToSend>> packets;
Erik Språngb210eeb2019-11-05 11:21:48 +0100160 while (target_size > DataSize::Zero()) {
161 DataSize padding_size = std::min(kMaxPadding, target_size);
162 packets.emplace_back(std::make_unique<RtpPacketToSend>(nullptr));
163 packets.back()->SetPadding(padding_size.bytes());
164 packets.back()->set_packet_type(RtpPacketToSend::Type::kPadding);
165 padding_sent_ += padding_size.bytes();
166 target_size -= padding_size;
167 }
Erik Språngd05edec2019-08-14 10:43:47 +0200168 return packets;
169 }
170
171 int packets_sent() const { return packets_sent_; }
172
173 int padding_sent() const { return padding_sent_; }
174
175 private:
176 int packets_sent_;
177 int padding_sent_;
178};
179
Erik Språngf5815fa2019-08-21 14:27:31 +0200180class PacingControllerTest : public ::testing::Test {
Erik Språngd05edec2019-08-14 10:43:47 +0200181 protected:
Erik Språngf5815fa2019-08-21 14:27:31 +0200182 PacingControllerTest() : clock_(123456) {
Erik Språngd05edec2019-08-14 10:43:47 +0200183 srand(0);
184 // Need to initialize PacingController after we initialize clock.
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200185 pacer_ = std::make_unique<PacingController>(&clock_, &callback_, nullptr,
186 nullptr);
Erik Språngd05edec2019-08-14 10:43:47 +0200187 Init();
188 }
189
190 void Init() {
191 pacer_->CreateProbeCluster(kFirstClusterRate, /*cluster_id=*/0);
192 pacer_->CreateProbeCluster(kSecondClusterRate, /*cluster_id=*/1);
193 // Default to bitrate probing disabled for testing purposes. Probing tests
194 // have to enable probing, either by creating a new PacingController
195 // instance or by calling SetProbingEnabled(true).
196 pacer_->SetProbingEnabled(false);
197 pacer_->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
198
199 clock_.AdvanceTime(TimeUntilNextProcess());
200 }
201
202 void Send(RtpPacketToSend::Type type,
203 uint32_t ssrc,
204 uint16_t sequence_number,
205 int64_t capture_time_ms,
206 size_t size) {
Erik Språngf5815fa2019-08-21 14:27:31 +0200207 pacer_->EnqueuePacket(
208 BuildPacket(type, ssrc, sequence_number, capture_time_ms, size));
Erik Språngd05edec2019-08-14 10:43:47 +0200209 }
210
211 void SendAndExpectPacket(RtpPacketToSend::Type type,
212 uint32_t ssrc,
213 uint16_t sequence_number,
214 int64_t capture_time_ms,
215 size_t size) {
216 Send(type, ssrc, sequence_number, capture_time_ms, size);
217 EXPECT_CALL(
218 callback_,
219 SendPacket(ssrc, sequence_number, capture_time_ms,
220 type == RtpPacketToSend::Type::kRetransmission, false))
221 .Times(1);
222 }
223
Erik Språngd05edec2019-08-14 10:43:47 +0200224 std::unique_ptr<RtpPacketToSend> BuildRtpPacket(RtpPacketToSend::Type type) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200225 auto packet = std::make_unique<RtpPacketToSend>(nullptr);
Erik Språngd05edec2019-08-14 10:43:47 +0200226 packet->set_packet_type(type);
227 switch (type) {
228 case RtpPacketToSend::Type::kAudio:
229 packet->SetSsrc(kAudioSsrc);
230 break;
231 case RtpPacketToSend::Type::kVideo:
232 packet->SetSsrc(kVideoSsrc);
233 break;
234 case RtpPacketToSend::Type::kRetransmission:
235 case RtpPacketToSend::Type::kPadding:
236 packet->SetSsrc(kVideoRtxSsrc);
237 break;
238 case RtpPacketToSend::Type::kForwardErrorCorrection:
239 packet->SetSsrc(kFlexFecSsrc);
240 break;
241 }
242
243 packet->SetPayloadSize(234);
244 return packet;
245 }
246
247 TimeDelta TimeUntilNextProcess() {
248 // TODO(bugs.webrtc.org/10809): Replace this with TimeUntilAvailableBudget()
249 // once ported from WIP code. For now, emulate PacedSender method.
250
251 TimeDelta elapsed_time = pacer_->TimeElapsedSinceLastProcess();
252 if (pacer_->IsPaused()) {
253 return std::max(PacingController::kPausedProcessInterval - elapsed_time,
254 TimeDelta::Zero());
255 }
256
Erik Språngb210eeb2019-11-05 11:21:48 +0100257 Timestamp next_probe = pacer_->NextProbeTime();
258 if (next_probe != Timestamp::PlusInfinity()) {
259 return std::max(TimeDelta::Zero(), next_probe - clock_.CurrentTime());
Erik Språngd05edec2019-08-14 10:43:47 +0200260 }
261
262 const TimeDelta min_packet_limit = TimeDelta::ms(5);
263 return std::max(min_packet_limit - elapsed_time, TimeDelta::Zero());
264 }
265
266 SimulatedClock clock_;
Erik Språngd05edec2019-08-14 10:43:47 +0200267 MockPacingControllerCallback callback_;
268 std::unique_ptr<PacingController> pacer_;
269};
270
Erik Språngf5815fa2019-08-21 14:27:31 +0200271class PacingControllerFieldTrialTest : public ::testing::Test {
Erik Språngd05edec2019-08-14 10:43:47 +0200272 protected:
273 struct MediaStream {
274 const RtpPacketToSend::Type type;
275 const uint32_t ssrc;
276 const size_t packet_size;
277 uint16_t seq_num;
278 };
279
280 const int kProcessIntervalsPerSecond = 1000 / 5;
281
282 PacingControllerFieldTrialTest() : clock_(123456) {}
283 void InsertPacket(PacingController* pacer, MediaStream* stream) {
Erik Språngf5815fa2019-08-21 14:27:31 +0200284 pacer->EnqueuePacket(
285 BuildPacket(stream->type, stream->ssrc, stream->seq_num++,
286 clock_.TimeInMilliseconds(), stream->packet_size));
Erik Språngd05edec2019-08-14 10:43:47 +0200287 }
288 void ProcessNext(PacingController* pacer) {
289 clock_.AdvanceTimeMilliseconds(5);
290 pacer->ProcessPackets();
291 }
292 MediaStream audio{/*type*/ RtpPacketToSend::Type::kAudio,
293 /*ssrc*/ 3333, /*packet_size*/ 100, /*seq_num*/ 1000};
294 MediaStream video{/*type*/ RtpPacketToSend::Type::kVideo,
295 /*ssrc*/ 4444, /*packet_size*/ 1000, /*seq_num*/ 1000};
296 SimulatedClock clock_;
297 MockPacingControllerCallback callback_;
298};
299
Erik Språngf5815fa2019-08-21 14:27:31 +0200300TEST_F(PacingControllerFieldTrialTest, DefaultNoPaddingInSilence) {
Erik Språngd05edec2019-08-14 10:43:47 +0200301 PacingController pacer(&clock_, &callback_, nullptr, nullptr);
302 pacer.SetPacingRates(kTargetRate, DataRate::Zero());
303 // Video packet to reset last send time and provide padding data.
304 InsertPacket(&pacer, &video);
305 EXPECT_CALL(callback_, SendPacket).Times(1);
306 clock_.AdvanceTimeMilliseconds(5);
307 pacer.ProcessPackets();
308 EXPECT_CALL(callback_, SendPadding).Times(0);
309 // Waiting 500 ms should not trigger sending of padding.
310 clock_.AdvanceTimeMilliseconds(500);
311 pacer.ProcessPackets();
312}
313
Erik Språngf5815fa2019-08-21 14:27:31 +0200314TEST_F(PacingControllerFieldTrialTest, PaddingInSilenceWithTrial) {
315 ScopedFieldTrials trial("WebRTC-Pacer-PadInSilence/Enabled/");
Erik Språngd05edec2019-08-14 10:43:47 +0200316 PacingController pacer(&clock_, &callback_, nullptr, nullptr);
317 pacer.SetPacingRates(kTargetRate, DataRate::Zero());
318 // Video packet to reset last send time and provide padding data.
319 InsertPacket(&pacer, &video);
Erik Språngf5815fa2019-08-21 14:27:31 +0200320 EXPECT_CALL(callback_, SendPacket).Times(2);
Erik Språngd05edec2019-08-14 10:43:47 +0200321 clock_.AdvanceTimeMilliseconds(5);
322 pacer.ProcessPackets();
323 EXPECT_CALL(callback_, SendPadding).WillOnce(Return(1000));
324 // Waiting 500 ms should trigger sending of padding.
325 clock_.AdvanceTimeMilliseconds(500);
326 pacer.ProcessPackets();
327}
328
Erik Språngf5815fa2019-08-21 14:27:31 +0200329TEST_F(PacingControllerFieldTrialTest, DefaultCongestionWindowAffectsAudio) {
Erik Språngd05edec2019-08-14 10:43:47 +0200330 EXPECT_CALL(callback_, SendPadding).Times(0);
331 PacingController pacer(&clock_, &callback_, nullptr, nullptr);
332 pacer.SetPacingRates(DataRate::bps(10000000), DataRate::Zero());
333 pacer.SetCongestionWindow(DataSize::bytes(800));
334 pacer.UpdateOutstandingData(DataSize::Zero());
335 // Video packet fills congestion window.
336 InsertPacket(&pacer, &video);
337 EXPECT_CALL(callback_, SendPacket).Times(1);
338 ProcessNext(&pacer);
339 // Audio packet blocked due to congestion.
340 InsertPacket(&pacer, &audio);
341 EXPECT_CALL(callback_, SendPacket).Times(0);
342 ProcessNext(&pacer);
343 ProcessNext(&pacer);
344 // Audio packet unblocked when congestion window clear.
345 ::testing::Mock::VerifyAndClearExpectations(&callback_);
346 pacer.UpdateOutstandingData(DataSize::Zero());
347 EXPECT_CALL(callback_, SendPacket).Times(1);
348 ProcessNext(&pacer);
349}
350
Erik Språngf5815fa2019-08-21 14:27:31 +0200351TEST_F(PacingControllerFieldTrialTest,
Erik Språngd05edec2019-08-14 10:43:47 +0200352 CongestionWindowDoesNotAffectAudioInTrial) {
Erik Språngf5815fa2019-08-21 14:27:31 +0200353 ScopedFieldTrials trial("WebRTC-Pacer-BlockAudio/Disabled/");
Erik Språngd05edec2019-08-14 10:43:47 +0200354 EXPECT_CALL(callback_, SendPadding).Times(0);
355 PacingController pacer(&clock_, &callback_, nullptr, nullptr);
356 pacer.SetPacingRates(DataRate::bps(10000000), DataRate::Zero());
357 pacer.SetCongestionWindow(DataSize::bytes(800));
358 pacer.UpdateOutstandingData(DataSize::Zero());
359 // Video packet fills congestion window.
360 InsertPacket(&pacer, &video);
361 EXPECT_CALL(callback_, SendPacket).Times(1);
362 ProcessNext(&pacer);
363 // Audio not blocked due to congestion.
364 InsertPacket(&pacer, &audio);
365 EXPECT_CALL(callback_, SendPacket).Times(1);
366 ProcessNext(&pacer);
367}
368
Erik Språngf5815fa2019-08-21 14:27:31 +0200369TEST_F(PacingControllerFieldTrialTest, DefaultBudgetAffectsAudio) {
Erik Språngd05edec2019-08-14 10:43:47 +0200370 PacingController pacer(&clock_, &callback_, nullptr, nullptr);
371 pacer.SetPacingRates(
372 DataRate::bps(video.packet_size / 3 * 8 * kProcessIntervalsPerSecond),
373 DataRate::Zero());
374 // Video fills budget for following process periods.
375 InsertPacket(&pacer, &video);
376 EXPECT_CALL(callback_, SendPacket).Times(1);
377 ProcessNext(&pacer);
378 // Audio packet blocked due to budget limit.
379 EXPECT_CALL(callback_, SendPacket).Times(0);
380 InsertPacket(&pacer, &audio);
381 ProcessNext(&pacer);
382 ProcessNext(&pacer);
383 ::testing::Mock::VerifyAndClearExpectations(&callback_);
384 // Audio packet unblocked when the budget has recovered.
385 EXPECT_CALL(callback_, SendPacket).Times(1);
386 ProcessNext(&pacer);
387 ProcessNext(&pacer);
388}
389
Erik Språngf5815fa2019-08-21 14:27:31 +0200390TEST_F(PacingControllerFieldTrialTest, BudgetDoesNotAffectAudioInTrial) {
391 ScopedFieldTrials trial("WebRTC-Pacer-BlockAudio/Disabled/");
Erik Språngd05edec2019-08-14 10:43:47 +0200392 EXPECT_CALL(callback_, SendPadding).Times(0);
393 PacingController pacer(&clock_, &callback_, nullptr, nullptr);
394 pacer.SetPacingRates(
395 DataRate::bps(video.packet_size / 3 * 8 * kProcessIntervalsPerSecond),
396 DataRate::Zero());
397 // Video fills budget for following process periods.
398 InsertPacket(&pacer, &video);
399 EXPECT_CALL(callback_, SendPacket).Times(1);
400 ProcessNext(&pacer);
401 // Audio packet not blocked due to budget limit.
402 EXPECT_CALL(callback_, SendPacket).Times(1);
403 InsertPacket(&pacer, &audio);
404 ProcessNext(&pacer);
405}
406
Erik Språngf5815fa2019-08-21 14:27:31 +0200407TEST_F(PacingControllerTest, FirstSentPacketTimeIsSet) {
Erik Språngd05edec2019-08-14 10:43:47 +0200408 uint16_t sequence_number = 1234;
409 const uint32_t kSsrc = 12345;
410 const size_t kSizeBytes = 250;
411 const size_t kPacketToSend = 3;
412 const Timestamp kStartTime = clock_.CurrentTime();
413
414 // No packet sent.
415 EXPECT_FALSE(pacer_->FirstSentPacketTime().has_value());
416
417 for (size_t i = 0; i < kPacketToSend; ++i) {
418 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, kSsrc, sequence_number++,
419 clock_.TimeInMilliseconds(), kSizeBytes);
420 pacer_->ProcessPackets();
421 clock_.AdvanceTime(TimeUntilNextProcess());
422 }
423 EXPECT_EQ(kStartTime, pacer_->FirstSentPacketTime());
424}
425
Erik Språngf5815fa2019-08-21 14:27:31 +0200426TEST_F(PacingControllerTest, QueuePacket) {
Erik Språngd05edec2019-08-14 10:43:47 +0200427 uint32_t ssrc = 12345;
428 uint16_t sequence_number = 1234;
429 // Due to the multiplicative factor we can send 5 packets during a send
430 // interval. (network capacity * multiplier / (8 bits per byte *
431 // (packet size * #send intervals per second)
432 const size_t packets_to_send =
433 kTargetRate.bps() * kPaceMultiplier / (8 * 250 * 200);
434 for (size_t i = 0; i < packets_to_send; ++i) {
435 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
436 clock_.TimeInMilliseconds(), 250);
437 }
438
439 int64_t queued_packet_timestamp = clock_.TimeInMilliseconds();
440 Send(RtpPacketToSend::Type::kVideo, ssrc, sequence_number,
441 queued_packet_timestamp, 250);
442 EXPECT_EQ(packets_to_send + 1, pacer_->QueueSizePackets());
443 pacer_->ProcessPackets();
444 EXPECT_CALL(callback_, SendPadding).Times(0);
445 clock_.AdvanceTimeMilliseconds(5);
446 EXPECT_EQ(1u, pacer_->QueueSizePackets());
447 EXPECT_CALL(callback_, SendPacket(ssrc, sequence_number++,
448 queued_packet_timestamp, false, false))
449 .Times(1);
450 pacer_->ProcessPackets();
451 sequence_number++;
452 EXPECT_EQ(0u, pacer_->QueueSizePackets());
453
454 // We can send packets_to_send -1 packets of size 250 during the current
455 // interval since one packet has already been sent.
456 for (size_t i = 0; i < packets_to_send - 1; ++i) {
457 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
458 clock_.TimeInMilliseconds(), 250);
459 }
460 Send(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
461 clock_.TimeInMilliseconds(), 250);
462 EXPECT_EQ(packets_to_send, pacer_->QueueSizePackets());
463 pacer_->ProcessPackets();
464 EXPECT_EQ(1u, pacer_->QueueSizePackets());
465}
466
Erik Språngf5815fa2019-08-21 14:27:31 +0200467TEST_F(PacingControllerTest, PaceQueuedPackets) {
Erik Språngd05edec2019-08-14 10:43:47 +0200468 uint32_t ssrc = 12345;
469 uint16_t sequence_number = 1234;
470
471 // Due to the multiplicative factor we can send 5 packets during a send
472 // interval. (network capacity * multiplier / (8 bits per byte *
473 // (packet size * #send intervals per second)
474 const size_t packets_to_send_per_interval =
475 kTargetRate.bps() * kPaceMultiplier / (8 * 250 * 200);
476 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
477 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
478 clock_.TimeInMilliseconds(), 250);
479 }
480
481 for (size_t j = 0; j < packets_to_send_per_interval * 10; ++j) {
482 Send(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
483 clock_.TimeInMilliseconds(), 250);
484 }
485 EXPECT_EQ(packets_to_send_per_interval + packets_to_send_per_interval * 10,
486 pacer_->QueueSizePackets());
487 pacer_->ProcessPackets();
488 EXPECT_EQ(packets_to_send_per_interval * 10, pacer_->QueueSizePackets());
489 EXPECT_CALL(callback_, SendPadding).Times(0);
490 for (int k = 0; k < 10; ++k) {
491 clock_.AdvanceTime(TimeUntilNextProcess());
492 EXPECT_CALL(callback_, SendPacket(ssrc, _, _, false, false))
493 .Times(packets_to_send_per_interval);
494 pacer_->ProcessPackets();
495 }
496 EXPECT_EQ(0u, pacer_->QueueSizePackets());
497 clock_.AdvanceTime(TimeUntilNextProcess());
498 EXPECT_EQ(0u, pacer_->QueueSizePackets());
499 pacer_->ProcessPackets();
500
501 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
502 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
503 clock_.TimeInMilliseconds(), 250);
504 }
505 Send(RtpPacketToSend::Type::kVideo, ssrc, sequence_number,
506 clock_.TimeInMilliseconds(), 250);
507 pacer_->ProcessPackets();
508 EXPECT_EQ(1u, pacer_->QueueSizePackets());
509}
510
Erik Språngf5815fa2019-08-21 14:27:31 +0200511TEST_F(PacingControllerTest, RepeatedRetransmissionsAllowed) {
Erik Språngd05edec2019-08-14 10:43:47 +0200512 // Send one packet, then two retransmissions of that packet.
513 for (size_t i = 0; i < 3; i++) {
514 constexpr uint32_t ssrc = 333;
515 constexpr uint16_t sequence_number = 444;
516 constexpr size_t bytes = 250;
517 bool is_retransmission = (i != 0); // Original followed by retransmissions.
518 SendAndExpectPacket(
519 is_retransmission ? RtpPacketToSend::Type::kRetransmission
520 : RtpPacketToSend::Type::kVideo,
521 ssrc, sequence_number, clock_.TimeInMilliseconds(), bytes);
522 clock_.AdvanceTimeMilliseconds(5);
523 }
524 pacer_->ProcessPackets();
525}
526
Erik Språngf5815fa2019-08-21 14:27:31 +0200527TEST_F(PacingControllerTest,
Erik Språngd05edec2019-08-14 10:43:47 +0200528 CanQueuePacketsWithSameSequenceNumberOnDifferentSsrcs) {
529 uint32_t ssrc = 12345;
530 uint16_t sequence_number = 1234;
531
532 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number,
533 clock_.TimeInMilliseconds(), 250);
534
535 // Expect packet on second ssrc to be queued and sent as well.
536 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc + 1, sequence_number,
537 clock_.TimeInMilliseconds(), 250);
538
539 clock_.AdvanceTimeMilliseconds(1000);
540 pacer_->ProcessPackets();
541}
542
Erik Språngf5815fa2019-08-21 14:27:31 +0200543TEST_F(PacingControllerTest, Padding) {
Erik Språngd05edec2019-08-14 10:43:47 +0200544 uint32_t ssrc = 12345;
545 uint16_t sequence_number = 1234;
546
547 pacer_->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
548
549 // Due to the multiplicative factor we can send 5 packets during a send
550 // interval. (network capacity * multiplier / (8 bits per byte *
551 // (packet size * #send intervals per second)
552 const size_t packets_to_send_per_interval =
553 kTargetRate.bps() * kPaceMultiplier / (8 * 250 * 200);
554 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
555 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
556 clock_.TimeInMilliseconds(), 250);
557 }
558 // No padding is expected since we have sent too much already.
559 EXPECT_CALL(callback_, SendPadding).Times(0);
560 pacer_->ProcessPackets();
561 EXPECT_EQ(0u, pacer_->QueueSizePackets());
562
563 // 5 milliseconds later should not send padding since we filled the buffers
564 // initially.
565 EXPECT_CALL(callback_, SendPadding(250)).Times(0);
566 clock_.AdvanceTime(TimeUntilNextProcess());
567 pacer_->ProcessPackets();
568
569 // 5 milliseconds later we have enough budget to send some padding.
570 EXPECT_CALL(callback_, SendPadding(250)).WillOnce(Return(250));
Erik Språngf5815fa2019-08-21 14:27:31 +0200571 EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
Erik Språngd05edec2019-08-14 10:43:47 +0200572 clock_.AdvanceTime(TimeUntilNextProcess());
573 pacer_->ProcessPackets();
574}
575
Erik Språngf5815fa2019-08-21 14:27:31 +0200576TEST_F(PacingControllerTest, NoPaddingBeforeNormalPacket) {
Erik Språngd05edec2019-08-14 10:43:47 +0200577 pacer_->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
578
579 EXPECT_CALL(callback_, SendPadding).Times(0);
580 pacer_->ProcessPackets();
581 clock_.AdvanceTime(TimeUntilNextProcess());
582
583 pacer_->ProcessPackets();
584 clock_.AdvanceTime(TimeUntilNextProcess());
585
586 uint32_t ssrc = 12345;
587 uint16_t sequence_number = 1234;
588 int64_t capture_time_ms = 56789;
589
590 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
591 capture_time_ms, 250);
592 EXPECT_CALL(callback_, SendPadding(250)).WillOnce(Return(250));
Erik Språngf5815fa2019-08-21 14:27:31 +0200593 EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
Erik Språngd05edec2019-08-14 10:43:47 +0200594 pacer_->ProcessPackets();
595}
596
Erik Språngf5815fa2019-08-21 14:27:31 +0200597TEST_F(PacingControllerTest, VerifyPaddingUpToBitrate) {
Erik Språngd05edec2019-08-14 10:43:47 +0200598 uint32_t ssrc = 12345;
599 uint16_t sequence_number = 1234;
600 int64_t capture_time_ms = 56789;
601 const int kTimeStep = 5;
602 const int64_t kBitrateWindow = 100;
603 pacer_->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
604
605 int64_t start_time = clock_.TimeInMilliseconds();
606 while (clock_.TimeInMilliseconds() - start_time < kBitrateWindow) {
607 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
608 capture_time_ms, 250);
609 EXPECT_CALL(callback_, SendPadding(250)).WillOnce(Return(250));
Erik Språngf5815fa2019-08-21 14:27:31 +0200610 EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
Erik Språngd05edec2019-08-14 10:43:47 +0200611 pacer_->ProcessPackets();
612 clock_.AdvanceTimeMilliseconds(kTimeStep);
613 }
614}
615
Erik Språngf5815fa2019-08-21 14:27:31 +0200616TEST_F(PacingControllerTest, VerifyAverageBitrateVaryingMediaPayload) {
Erik Språngd05edec2019-08-14 10:43:47 +0200617 uint32_t ssrc = 12345;
618 uint16_t sequence_number = 1234;
619 int64_t capture_time_ms = 56789;
620 const int kTimeStep = 5;
621 const int64_t kBitrateWindow = 10000;
622 PacingControllerPadding callback;
623 pacer_ =
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200624 std::make_unique<PacingController>(&clock_, &callback, nullptr, nullptr);
Erik Språngd05edec2019-08-14 10:43:47 +0200625 pacer_->SetProbingEnabled(false);
626 pacer_->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
627
628 int64_t start_time = clock_.TimeInMilliseconds();
629 size_t media_bytes = 0;
630 while (clock_.TimeInMilliseconds() - start_time < kBitrateWindow) {
631 int rand_value = rand(); // NOLINT (rand_r instead of rand)
632 size_t media_payload = rand_value % 100 + 200; // [200, 300] bytes.
633 Send(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
634 capture_time_ms, media_payload);
635 media_bytes += media_payload;
636 clock_.AdvanceTimeMilliseconds(kTimeStep);
637 pacer_->ProcessPackets();
638 }
639 EXPECT_NEAR(kTargetRate.kbps(),
640 static_cast<int>(8 * (media_bytes + callback.padding_sent()) /
641 kBitrateWindow),
642 1);
643}
644
Erik Språngf5815fa2019-08-21 14:27:31 +0200645TEST_F(PacingControllerTest, Priority) {
Erik Språngd05edec2019-08-14 10:43:47 +0200646 uint32_t ssrc_low_priority = 12345;
647 uint32_t ssrc = 12346;
648 uint16_t sequence_number = 1234;
649 int64_t capture_time_ms = 56789;
650 int64_t capture_time_ms_low_priority = 1234567;
651
652 // Due to the multiplicative factor we can send 5 packets during a send
653 // interval. (network capacity * multiplier / (8 bits per byte *
654 // (packet size * #send intervals per second)
655 const size_t packets_to_send_per_interval =
656 kTargetRate.bps() * kPaceMultiplier / (8 * 250 * 200);
657 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
658 SendAndExpectPacket(RtpPacketToSend::Type::kRetransmission, ssrc,
659 sequence_number++, clock_.TimeInMilliseconds(), 250);
660 }
661 pacer_->ProcessPackets();
662 EXPECT_EQ(0u, pacer_->QueueSizePackets());
663
664 // Expect normal and low priority to be queued and high to pass through.
665 Send(RtpPacketToSend::Type::kVideo, ssrc_low_priority, sequence_number++,
666 capture_time_ms_low_priority, 250);
667
668 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
669 Send(RtpPacketToSend::Type::kRetransmission, ssrc, sequence_number++,
670 capture_time_ms, 250);
671 }
672 Send(RtpPacketToSend::Type::kAudio, ssrc, sequence_number++, capture_time_ms,
673 250);
674
675 // Expect all high and normal priority to be sent out first.
676 EXPECT_CALL(callback_, SendPadding).Times(0);
677 EXPECT_CALL(callback_, SendPacket(ssrc, _, capture_time_ms, _, _))
678 .Times(packets_to_send_per_interval + 1);
679
680 clock_.AdvanceTime(TimeUntilNextProcess());
681 pacer_->ProcessPackets();
682 EXPECT_EQ(1u, pacer_->QueueSizePackets());
683
684 EXPECT_CALL(callback_, SendPacket(ssrc_low_priority, _,
685 capture_time_ms_low_priority, _, _))
686 .Times(1);
687
688 clock_.AdvanceTime(TimeUntilNextProcess());
689 pacer_->ProcessPackets();
690}
691
Erik Språngf5815fa2019-08-21 14:27:31 +0200692TEST_F(PacingControllerTest, RetransmissionPriority) {
Erik Språngd05edec2019-08-14 10:43:47 +0200693 uint32_t ssrc = 12345;
694 uint16_t sequence_number = 1234;
695 int64_t capture_time_ms = 45678;
696 int64_t capture_time_ms_retransmission = 56789;
697
698 // Due to the multiplicative factor we can send 5 packets during a send
699 // interval. (network capacity * multiplier / (8 bits per byte *
700 // (packet size * #send intervals per second)
701 const size_t packets_to_send_per_interval =
702 kTargetRate.bps() * kPaceMultiplier / (8 * 250 * 200);
703 pacer_->ProcessPackets();
704 EXPECT_EQ(0u, pacer_->QueueSizePackets());
705
706 // Alternate retransmissions and normal packets.
707 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
708 Send(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
709 capture_time_ms, 250);
710 Send(RtpPacketToSend::Type::kRetransmission, ssrc, sequence_number++,
711 capture_time_ms_retransmission, 250);
712 }
713 EXPECT_EQ(2 * packets_to_send_per_interval, pacer_->QueueSizePackets());
714
715 // Expect all retransmissions to be sent out first despite having a later
716 // capture time.
717 EXPECT_CALL(callback_, SendPadding).Times(0);
718 EXPECT_CALL(callback_, SendPacket(_, _, _, false, _)).Times(0);
719 EXPECT_CALL(callback_,
720 SendPacket(ssrc, _, capture_time_ms_retransmission, true, _))
721 .Times(packets_to_send_per_interval);
722
723 clock_.AdvanceTime(TimeUntilNextProcess());
724 pacer_->ProcessPackets();
725 EXPECT_EQ(packets_to_send_per_interval, pacer_->QueueSizePackets());
726
727 // Expect the remaining (non-retransmission) packets to be sent.
728 EXPECT_CALL(callback_, SendPadding).Times(0);
729 EXPECT_CALL(callback_, SendPacket(_, _, _, true, _)).Times(0);
730 EXPECT_CALL(callback_, SendPacket(ssrc, _, capture_time_ms, false, _))
731 .Times(packets_to_send_per_interval);
732
733 clock_.AdvanceTime(TimeUntilNextProcess());
734 pacer_->ProcessPackets();
735
736 EXPECT_EQ(0u, pacer_->QueueSizePackets());
737}
738
Erik Språngf5815fa2019-08-21 14:27:31 +0200739TEST_F(PacingControllerTest, HighPrioDoesntAffectBudget) {
Erik Språngd05edec2019-08-14 10:43:47 +0200740 uint32_t ssrc = 12346;
741 uint16_t sequence_number = 1234;
742 int64_t capture_time_ms = 56789;
743
744 // As high prio packets doesn't affect the budget, we should be able to send
745 // a high number of them at once.
746 for (int i = 0; i < 25; ++i) {
747 SendAndExpectPacket(RtpPacketToSend::Type::kAudio, ssrc, sequence_number++,
748 capture_time_ms, 250);
749 }
750 pacer_->ProcessPackets();
751 // Low prio packets does affect the budget.
752 // Due to the multiplicative factor we can send 5 packets during a send
753 // interval. (network capacity * multiplier / (8 bits per byte *
754 // (packet size * #send intervals per second)
755 const size_t packets_to_send_per_interval =
756 kTargetRate.bps() * kPaceMultiplier / (8 * 250 * 200);
757 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
758 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
759 clock_.TimeInMilliseconds(), 250);
760 }
761 Send(RtpPacketToSend::Type::kVideo, ssrc, sequence_number, capture_time_ms,
762 250);
763 clock_.AdvanceTime(TimeUntilNextProcess());
764 pacer_->ProcessPackets();
765 EXPECT_EQ(1u, pacer_->QueueSizePackets());
766 EXPECT_CALL(callback_,
767 SendPacket(ssrc, sequence_number++, capture_time_ms, false, _))
768 .Times(1);
769 clock_.AdvanceTime(TimeUntilNextProcess());
770 pacer_->ProcessPackets();
771 EXPECT_EQ(0u, pacer_->QueueSizePackets());
772}
773
Erik Språngf5815fa2019-08-21 14:27:31 +0200774TEST_F(PacingControllerTest, SendsOnlyPaddingWhenCongested) {
Erik Språngd05edec2019-08-14 10:43:47 +0200775 uint32_t ssrc = 202020;
776 uint16_t sequence_number = 1000;
777 int kPacketSize = 250;
778 int kCongestionWindow = kPacketSize * 10;
779
780 pacer_->UpdateOutstandingData(DataSize::Zero());
781 pacer_->SetCongestionWindow(DataSize::bytes(kCongestionWindow));
782 int sent_data = 0;
783 while (sent_data < kCongestionWindow) {
784 sent_data += kPacketSize;
785 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
786 clock_.TimeInMilliseconds(), kPacketSize);
787 clock_.AdvanceTimeMilliseconds(5);
788 pacer_->ProcessPackets();
789 }
790 ::testing::Mock::VerifyAndClearExpectations(&callback_);
791 EXPECT_CALL(callback_, SendPacket).Times(0);
792 EXPECT_CALL(callback_, SendPadding).Times(0);
793
794 size_t blocked_packets = 0;
795 int64_t expected_time_until_padding = 500;
796 while (expected_time_until_padding > 5) {
797 Send(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
798 clock_.TimeInMilliseconds(), kPacketSize);
799 blocked_packets++;
800 clock_.AdvanceTimeMilliseconds(5);
801 pacer_->ProcessPackets();
802 expected_time_until_padding -= 5;
803 }
804 ::testing::Mock::VerifyAndClearExpectations(&callback_);
805 EXPECT_CALL(callback_, SendPadding(1)).WillOnce(Return(1));
Erik Språngf5815fa2019-08-21 14:27:31 +0200806 EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
Erik Språngd05edec2019-08-14 10:43:47 +0200807 clock_.AdvanceTimeMilliseconds(5);
808 pacer_->ProcessPackets();
809 EXPECT_EQ(blocked_packets, pacer_->QueueSizePackets());
810}
811
Erik Språngf5815fa2019-08-21 14:27:31 +0200812TEST_F(PacingControllerTest, DoesNotAllowOveruseAfterCongestion) {
Erik Språngd05edec2019-08-14 10:43:47 +0200813 uint32_t ssrc = 202020;
814 uint16_t seq_num = 1000;
815 int size = 1000;
816 auto now_ms = [this] { return clock_.TimeInMilliseconds(); };
817 EXPECT_CALL(callback_, SendPadding).Times(0);
818 // The pacing rate is low enough that the budget should not allow two packets
819 // to be sent in a row.
820 pacer_->SetPacingRates(DataRate::bps(400 * 8 * 1000 / 5), DataRate::Zero());
821 // The congestion window is small enough to only let one packet through.
822 pacer_->SetCongestionWindow(DataSize::bytes(800));
823 pacer_->UpdateOutstandingData(DataSize::Zero());
824 // Not yet budget limited or congested, packet is sent.
825 Send(RtpPacketToSend::Type::kVideo, ssrc, seq_num++, now_ms(), size);
826 EXPECT_CALL(callback_, SendPacket).Times(1);
827 clock_.AdvanceTimeMilliseconds(5);
828 pacer_->ProcessPackets();
829 // Packet blocked due to congestion.
830 Send(RtpPacketToSend::Type::kVideo, ssrc, seq_num++, now_ms(), size);
831 EXPECT_CALL(callback_, SendPacket).Times(0);
832 clock_.AdvanceTimeMilliseconds(5);
833 pacer_->ProcessPackets();
834 // Packet blocked due to congestion.
835 Send(RtpPacketToSend::Type::kVideo, ssrc, seq_num++, now_ms(), size);
836 EXPECT_CALL(callback_, SendPacket).Times(0);
837 clock_.AdvanceTimeMilliseconds(5);
838 pacer_->ProcessPackets();
839 pacer_->UpdateOutstandingData(DataSize::Zero());
840 // Congestion removed and budget has recovered, packet is sent.
841 Send(RtpPacketToSend::Type::kVideo, ssrc, seq_num++, now_ms(), size);
842 EXPECT_CALL(callback_, SendPacket).Times(1);
843 clock_.AdvanceTimeMilliseconds(5);
844 pacer_->ProcessPackets();
845 pacer_->UpdateOutstandingData(DataSize::Zero());
846 // Should be blocked due to budget limitation as congestion has be removed.
847 Send(RtpPacketToSend::Type::kVideo, ssrc, seq_num++, now_ms(), size);
848 EXPECT_CALL(callback_, SendPacket).Times(0);
849 clock_.AdvanceTimeMilliseconds(5);
850 pacer_->ProcessPackets();
851}
852
Erik Språngf5815fa2019-08-21 14:27:31 +0200853TEST_F(PacingControllerTest, ResumesSendingWhenCongestionEnds) {
Erik Språngd05edec2019-08-14 10:43:47 +0200854 uint32_t ssrc = 202020;
855 uint16_t sequence_number = 1000;
856 int64_t kPacketSize = 250;
857 int64_t kCongestionCount = 10;
858 int64_t kCongestionWindow = kPacketSize * kCongestionCount;
859 int64_t kCongestionTimeMs = 1000;
860
861 pacer_->UpdateOutstandingData(DataSize::Zero());
862 pacer_->SetCongestionWindow(DataSize::bytes(kCongestionWindow));
863 int sent_data = 0;
864 while (sent_data < kCongestionWindow) {
865 sent_data += kPacketSize;
866 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
867 clock_.TimeInMilliseconds(), kPacketSize);
868 clock_.AdvanceTimeMilliseconds(5);
869 pacer_->ProcessPackets();
870 }
871 ::testing::Mock::VerifyAndClearExpectations(&callback_);
872 EXPECT_CALL(callback_, SendPacket).Times(0);
873 int unacked_packets = 0;
874 for (int duration = 0; duration < kCongestionTimeMs; duration += 5) {
875 Send(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
876 clock_.TimeInMilliseconds(), kPacketSize);
877 unacked_packets++;
878 clock_.AdvanceTimeMilliseconds(5);
879 pacer_->ProcessPackets();
880 }
881 ::testing::Mock::VerifyAndClearExpectations(&callback_);
882
883 // First mark half of the congested packets as cleared and make sure that just
884 // as many are sent
885 int ack_count = kCongestionCount / 2;
886 EXPECT_CALL(callback_, SendPacket(ssrc, _, _, false, _)).Times(ack_count);
887 pacer_->UpdateOutstandingData(
888 DataSize::bytes(kCongestionWindow - kPacketSize * ack_count));
889
890 for (int duration = 0; duration < kCongestionTimeMs; duration += 5) {
891 clock_.AdvanceTimeMilliseconds(5);
892 pacer_->ProcessPackets();
893 }
894 unacked_packets -= ack_count;
895 ::testing::Mock::VerifyAndClearExpectations(&callback_);
896
897 // Second make sure all packets are sent if sent packets are continuously
898 // marked as acked.
899 EXPECT_CALL(callback_, SendPacket(ssrc, _, _, false, _))
900 .Times(unacked_packets);
901 for (int duration = 0; duration < kCongestionTimeMs; duration += 5) {
902 pacer_->UpdateOutstandingData(DataSize::Zero());
903 clock_.AdvanceTimeMilliseconds(5);
904 pacer_->ProcessPackets();
905 }
906}
907
Erik Språngf5815fa2019-08-21 14:27:31 +0200908TEST_F(PacingControllerTest, Pause) {
Erik Språngd05edec2019-08-14 10:43:47 +0200909 uint32_t ssrc_low_priority = 12345;
910 uint32_t ssrc = 12346;
911 uint32_t ssrc_high_priority = 12347;
912 uint16_t sequence_number = 1234;
913 int64_t capture_time_ms = clock_.TimeInMilliseconds();
914
915 EXPECT_EQ(TimeDelta::Zero(), pacer_->OldestPacketWaitTime());
916
917 // Due to the multiplicative factor we can send 5 packets during a send
918 // interval. (network capacity * multiplier / (8 bits per byte *
919 // (packet size * #send intervals per second)
920 const size_t packets_to_send_per_interval =
921 kTargetRate.bps() * kPaceMultiplier / (8 * 250 * 200);
922 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
923 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
924 clock_.TimeInMilliseconds(), 250);
925 }
926
927 pacer_->ProcessPackets();
928
929 pacer_->Pause();
930
931 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
932 Send(RtpPacketToSend::Type::kVideo, ssrc_low_priority, sequence_number++,
933 capture_time_ms, 250);
934 Send(RtpPacketToSend::Type::kRetransmission, ssrc, sequence_number++,
935 capture_time_ms, 250);
936 Send(RtpPacketToSend::Type::kAudio, ssrc_high_priority, sequence_number++,
937 capture_time_ms, 250);
938 }
939 clock_.AdvanceTimeMilliseconds(10000);
940 int64_t second_capture_time_ms = clock_.TimeInMilliseconds();
941 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
942 Send(RtpPacketToSend::Type::kVideo, ssrc_low_priority, sequence_number++,
943 second_capture_time_ms, 250);
944 Send(RtpPacketToSend::Type::kRetransmission, ssrc, sequence_number++,
945 second_capture_time_ms, 250);
946 Send(RtpPacketToSend::Type::kAudio, ssrc_high_priority, sequence_number++,
947 second_capture_time_ms, 250);
948 }
949
950 // Expect everything to be queued.
951 EXPECT_EQ(TimeDelta::ms(second_capture_time_ms - capture_time_ms),
952 pacer_->OldestPacketWaitTime());
953
954 EXPECT_CALL(callback_, SendPadding(1)).WillOnce(Return(1));
Erik Språngf5815fa2019-08-21 14:27:31 +0200955 EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
Erik Språngd05edec2019-08-14 10:43:47 +0200956 pacer_->ProcessPackets();
957
958 int64_t expected_time_until_send = 500;
959 EXPECT_CALL(callback_, SendPadding).Times(0);
960 while (expected_time_until_send >= 5) {
961 pacer_->ProcessPackets();
962 clock_.AdvanceTimeMilliseconds(5);
963 expected_time_until_send -= 5;
964 }
965
966 ::testing::Mock::VerifyAndClearExpectations(&callback_);
967 EXPECT_CALL(callback_, SendPadding(1)).WillOnce(Return(1));
Erik Språngf5815fa2019-08-21 14:27:31 +0200968 EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
Erik Språngd05edec2019-08-14 10:43:47 +0200969 clock_.AdvanceTimeMilliseconds(5);
970 pacer_->ProcessPackets();
971 ::testing::Mock::VerifyAndClearExpectations(&callback_);
972
973 // Expect high prio packets to come out first followed by normal
974 // prio packets and low prio packets (all in capture order).
975 {
976 ::testing::InSequence sequence;
977 EXPECT_CALL(callback_,
978 SendPacket(ssrc_high_priority, _, capture_time_ms, _, _))
979 .Times(packets_to_send_per_interval);
980 EXPECT_CALL(callback_,
981 SendPacket(ssrc_high_priority, _, second_capture_time_ms, _, _))
982 .Times(packets_to_send_per_interval);
983
984 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
985 EXPECT_CALL(callback_, SendPacket(ssrc, _, capture_time_ms, _, _))
986 .Times(1);
987 }
988 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
989 EXPECT_CALL(callback_, SendPacket(ssrc, _, second_capture_time_ms, _, _))
990 .Times(1);
991 }
992 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
993 EXPECT_CALL(callback_,
994 SendPacket(ssrc_low_priority, _, capture_time_ms, _, _))
995 .Times(1);
996 }
997 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
998 EXPECT_CALL(callback_, SendPacket(ssrc_low_priority, _,
999 second_capture_time_ms, _, _))
1000 .Times(1);
1001 }
1002 }
1003 pacer_->Resume();
1004
1005 // The pacer was resumed directly after the previous process call finished. It
1006 // will therefore wait 5 ms until next process.
1007 clock_.AdvanceTime(TimeUntilNextProcess());
1008
1009 for (size_t i = 0; i < 4; i++) {
1010 pacer_->ProcessPackets();
1011 clock_.AdvanceTime(TimeUntilNextProcess());
1012 }
1013
1014 EXPECT_EQ(TimeDelta::Zero(), pacer_->OldestPacketWaitTime());
1015}
1016
Erik Språngf5815fa2019-08-21 14:27:31 +02001017TEST_F(PacingControllerTest, ExpectedQueueTimeMs) {
Erik Språngd05edec2019-08-14 10:43:47 +02001018 uint32_t ssrc = 12346;
1019 uint16_t sequence_number = 1234;
1020 const size_t kNumPackets = 60;
1021 const size_t kPacketSize = 1200;
1022 const int32_t kMaxBitrate = kPaceMultiplier * 30000;
1023 EXPECT_EQ(TimeDelta::Zero(), pacer_->OldestPacketWaitTime());
1024
1025 pacer_->SetPacingRates(DataRate::bps(30000 * kPaceMultiplier),
1026 DataRate::Zero());
1027 for (size_t i = 0; i < kNumPackets; ++i) {
1028 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
1029 clock_.TimeInMilliseconds(), kPacketSize);
1030 }
1031
1032 // Queue in ms = 1000 * (bytes in queue) *8 / (bits per second)
1033 TimeDelta queue_time =
1034 TimeDelta::ms(1000 * kNumPackets * kPacketSize * 8 / kMaxBitrate);
1035 EXPECT_EQ(queue_time, pacer_->ExpectedQueueTime());
1036
1037 const Timestamp time_start = clock_.CurrentTime();
1038 while (pacer_->QueueSizePackets() > 0) {
1039 clock_.AdvanceTime(TimeUntilNextProcess());
1040 pacer_->ProcessPackets();
1041 }
1042 TimeDelta duration = clock_.CurrentTime() - time_start;
1043
1044 EXPECT_EQ(TimeDelta::Zero(), pacer_->ExpectedQueueTime());
1045
1046 // Allow for aliasing, duration should be within one pack of max time limit.
1047 const TimeDelta deviation =
1048 duration - PacingController::kMaxExpectedQueueLength;
1049 EXPECT_LT(deviation.Abs(),
1050 TimeDelta::ms(1000 * kPacketSize * 8 / kMaxBitrate));
1051}
1052
Erik Språngf5815fa2019-08-21 14:27:31 +02001053TEST_F(PacingControllerTest, QueueTimeGrowsOverTime) {
Erik Språngd05edec2019-08-14 10:43:47 +02001054 uint32_t ssrc = 12346;
1055 uint16_t sequence_number = 1234;
1056 EXPECT_EQ(TimeDelta::Zero(), pacer_->OldestPacketWaitTime());
1057
1058 pacer_->SetPacingRates(DataRate::bps(30000 * kPaceMultiplier),
1059 DataRate::Zero());
1060 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number,
1061 clock_.TimeInMilliseconds(), 1200);
1062
1063 clock_.AdvanceTimeMilliseconds(500);
1064 EXPECT_EQ(TimeDelta::ms(500), pacer_->OldestPacketWaitTime());
1065 pacer_->ProcessPackets();
1066 EXPECT_EQ(TimeDelta::Zero(), pacer_->OldestPacketWaitTime());
1067}
1068
Erik Språngf5815fa2019-08-21 14:27:31 +02001069TEST_F(PacingControllerTest, ProbingWithInsertedPackets) {
Erik Språngd05edec2019-08-14 10:43:47 +02001070 const size_t kPacketSize = 1200;
1071 const int kInitialBitrateBps = 300000;
1072 uint32_t ssrc = 12346;
1073 uint16_t sequence_number = 1234;
1074
1075 PacingControllerProbing packet_sender;
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001076 pacer_ = std::make_unique<PacingController>(&clock_, &packet_sender, nullptr,
1077 nullptr);
Erik Språngd05edec2019-08-14 10:43:47 +02001078 pacer_->CreateProbeCluster(kFirstClusterRate,
1079 /*cluster_id=*/0);
1080 pacer_->CreateProbeCluster(kSecondClusterRate,
1081 /*cluster_id=*/1);
1082 pacer_->SetPacingRates(DataRate::bps(kInitialBitrateBps * kPaceMultiplier),
1083 DataRate::Zero());
1084
1085 for (int i = 0; i < 10; ++i) {
1086 Send(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
1087 clock_.TimeInMilliseconds(), kPacketSize);
1088 }
1089
1090 int64_t start = clock_.TimeInMilliseconds();
1091 while (packet_sender.packets_sent() < 5) {
1092 clock_.AdvanceTime(TimeUntilNextProcess());
1093 pacer_->ProcessPackets();
1094 }
1095 int packets_sent = packet_sender.packets_sent();
1096 // Validate first cluster bitrate. Note that we have to account for number
1097 // of intervals and hence (packets_sent - 1) on the first cluster.
1098 EXPECT_NEAR((packets_sent - 1) * kPacketSize * 8000 /
1099 (clock_.TimeInMilliseconds() - start),
1100 kFirstClusterRate.bps(), kProbingErrorMargin.bps());
1101 EXPECT_EQ(0, packet_sender.padding_sent());
1102
1103 clock_.AdvanceTime(TimeUntilNextProcess());
1104 start = clock_.TimeInMilliseconds();
1105 while (packet_sender.packets_sent() < 10) {
1106 clock_.AdvanceTime(TimeUntilNextProcess());
1107 pacer_->ProcessPackets();
1108 }
1109 packets_sent = packet_sender.packets_sent() - packets_sent;
1110 // Validate second cluster bitrate.
1111 EXPECT_NEAR((packets_sent - 1) * kPacketSize * 8000 /
1112 (clock_.TimeInMilliseconds() - start),
1113 kSecondClusterRate.bps(), kProbingErrorMargin.bps());
1114}
1115
Erik Språngb210eeb2019-11-05 11:21:48 +01001116TEST_F(PacingControllerTest, SkipsProbesWhenProcessIntervalTooLarge) {
1117 const size_t kPacketSize = 1200;
1118 const int kInitialBitrateBps = 300000;
1119 uint32_t ssrc = 12346;
1120 uint16_t sequence_number = 1234;
1121
1122 PacingControllerProbing packet_sender;
1123 pacer_ = std::make_unique<PacingController>(&clock_, &packet_sender, nullptr,
1124 nullptr);
1125 pacer_->SetPacingRates(DataRate::bps(kInitialBitrateBps * kPaceMultiplier),
1126 DataRate::Zero());
1127
1128 for (int i = 0; i < 10; ++i) {
1129 Send(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
1130 clock_.TimeInMilliseconds(), kPacketSize);
1131 }
1132 while (pacer_->QueueSizePackets() > 0) {
1133 clock_.AdvanceTime(TimeUntilNextProcess());
1134 pacer_->ProcessPackets();
1135 }
1136
1137 // Probe at a very high rate.
1138 pacer_->CreateProbeCluster(DataRate::kbps(10000), // 10 Mbps.
1139 /*cluster_id=*/3);
1140 // We need one packet to start the probe.
1141 Send(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
1142 clock_.TimeInMilliseconds(), kPacketSize);
1143 const int packets_sent_before_probe = packet_sender.packets_sent();
1144 clock_.AdvanceTime(TimeUntilNextProcess());
1145 pacer_->ProcessPackets();
1146 EXPECT_EQ(packet_sender.packets_sent(), packets_sent_before_probe + 1);
1147
1148 // Figure out how long between probe packets.
1149 Timestamp start_time = clock_.CurrentTime();
1150 clock_.AdvanceTime(TimeUntilNextProcess());
1151 TimeDelta time_between_probes = clock_.CurrentTime() - start_time;
1152 // Advance that distance again + 1ms.
1153 clock_.AdvanceTime(time_between_probes);
1154
1155 // Send second probe packet.
1156 Send(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
1157 clock_.TimeInMilliseconds(), kPacketSize);
1158 pacer_->ProcessPackets();
1159 EXPECT_EQ(packet_sender.packets_sent(), packets_sent_before_probe + 2);
1160
1161 // We're exactly where we should be for the next probe.
1162 EXPECT_TRUE(pacer_->NextProbeTime().IsFinite());
1163
Erik Språng22fd5d72019-11-07 14:21:05 +01001164 FieldTrialBasedConfig field_trial_config;
1165 BitrateProberConfig probing_config(&field_trial_config);
1166 EXPECT_GT(probing_config.max_probe_delay.Get(), TimeDelta::Zero());
1167
1168 // Advance to within max probe delay.
1169 clock_.AdvanceTime(probing_config.max_probe_delay.Get());
Erik Språngb210eeb2019-11-05 11:21:48 +01001170 EXPECT_TRUE(pacer_->NextProbeTime().IsFinite());
1171
Erik Språng22fd5d72019-11-07 14:21:05 +01001172 // Too high probe delay, drop it!
1173 clock_.AdvanceTime(TimeDelta::us(1));
Erik Språngb210eeb2019-11-05 11:21:48 +01001174 EXPECT_EQ(pacer_->NextProbeTime(), Timestamp::PlusInfinity());
1175}
1176
Erik Språngf5815fa2019-08-21 14:27:31 +02001177TEST_F(PacingControllerTest, ProbingWithPaddingSupport) {
Erik Språngd05edec2019-08-14 10:43:47 +02001178 const size_t kPacketSize = 1200;
1179 const int kInitialBitrateBps = 300000;
1180 uint32_t ssrc = 12346;
1181 uint16_t sequence_number = 1234;
1182
1183 PacingControllerProbing packet_sender;
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001184 pacer_ = std::make_unique<PacingController>(&clock_, &packet_sender, nullptr,
1185 nullptr);
Erik Språngd05edec2019-08-14 10:43:47 +02001186 pacer_->CreateProbeCluster(kFirstClusterRate,
1187 /*cluster_id=*/0);
1188 pacer_->SetPacingRates(DataRate::bps(kInitialBitrateBps * kPaceMultiplier),
1189 DataRate::Zero());
1190
1191 for (int i = 0; i < 3; ++i) {
1192 Send(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
1193 clock_.TimeInMilliseconds(), kPacketSize);
1194 }
1195
1196 int64_t start = clock_.TimeInMilliseconds();
1197 int process_count = 0;
1198 while (process_count < 5) {
1199 clock_.AdvanceTime(TimeUntilNextProcess());
1200 pacer_->ProcessPackets();
1201 ++process_count;
1202 }
1203 int packets_sent = packet_sender.packets_sent();
1204 int padding_sent = packet_sender.padding_sent();
1205 EXPECT_GT(packets_sent, 0);
1206 EXPECT_GT(padding_sent, 0);
1207 // Note that the number of intervals here for kPacketSize is
1208 // packets_sent due to padding in the same cluster.
1209 EXPECT_NEAR((packets_sent * kPacketSize * 8000 + padding_sent) /
1210 (clock_.TimeInMilliseconds() - start),
1211 kFirstClusterRate.bps(), kProbingErrorMargin.bps());
1212}
1213
Erik Språngf5815fa2019-08-21 14:27:31 +02001214TEST_F(PacingControllerTest, PaddingOveruse) {
Erik Språngd05edec2019-08-14 10:43:47 +02001215 uint32_t ssrc = 12346;
1216 uint16_t sequence_number = 1234;
1217 const size_t kPacketSize = 1200;
1218
1219 pacer_->ProcessPackets();
1220 pacer_->SetPacingRates(DataRate::bps(60000 * kPaceMultiplier),
1221 DataRate::Zero());
1222
1223 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
1224 clock_.TimeInMilliseconds(), kPacketSize);
1225 pacer_->ProcessPackets();
1226
1227 // Add 30kbit padding. When increasing budget, media budget will increase from
1228 // negative (overuse) while padding budget will increase from 0.
1229 clock_.AdvanceTimeMilliseconds(5);
1230 pacer_->SetPacingRates(DataRate::bps(60000 * kPaceMultiplier),
1231 DataRate::bps(30000));
1232
1233 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
1234 clock_.TimeInMilliseconds(), kPacketSize);
1235 EXPECT_LT(TimeDelta::ms(5), pacer_->ExpectedQueueTime());
1236 // Don't send padding if queue is non-empty, even if padding budget > 0.
1237 EXPECT_CALL(callback_, SendPadding).Times(0);
1238 pacer_->ProcessPackets();
1239}
1240
Erik Språngf5815fa2019-08-21 14:27:31 +02001241TEST_F(PacingControllerTest, ProbeClusterId) {
Erik Språngd05edec2019-08-14 10:43:47 +02001242 MockPacketSender callback;
1243
1244 pacer_ =
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001245 std::make_unique<PacingController>(&clock_, &callback, nullptr, nullptr);
Erik Språngd05edec2019-08-14 10:43:47 +02001246 Init();
1247
1248 uint32_t ssrc = 12346;
1249 uint16_t sequence_number = 1234;
1250 const size_t kPacketSize = 1200;
1251
1252 pacer_->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
1253 pacer_->SetProbingEnabled(true);
1254 for (int i = 0; i < 10; ++i) {
1255 Send(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
1256 clock_.TimeInMilliseconds(), kPacketSize);
1257 }
1258
1259 // First probing cluster.
Erik Språngf5815fa2019-08-21 14:27:31 +02001260 EXPECT_CALL(callback,
1261 SendRtpPacket(_, Field(&PacedPacketInfo::probe_cluster_id, 0)))
1262 .Times(5);
Erik Språngd05edec2019-08-14 10:43:47 +02001263
1264 for (int i = 0; i < 5; ++i) {
1265 clock_.AdvanceTimeMilliseconds(20);
1266 pacer_->ProcessPackets();
1267 }
1268
1269 // Second probing cluster.
Erik Språngf5815fa2019-08-21 14:27:31 +02001270 EXPECT_CALL(callback,
1271 SendRtpPacket(_, Field(&PacedPacketInfo::probe_cluster_id, 1)))
1272 .Times(5);
Erik Språngd05edec2019-08-14 10:43:47 +02001273
1274 for (int i = 0; i < 5; ++i) {
1275 clock_.AdvanceTimeMilliseconds(20);
1276 pacer_->ProcessPackets();
1277 }
1278
1279 // Needed for the Field comparer below.
1280 const int kNotAProbe = PacedPacketInfo::kNotAProbe;
1281 // No more probing packets.
Erik Språngf5815fa2019-08-21 14:27:31 +02001282 EXPECT_CALL(callback, GeneratePadding).WillOnce([&](DataSize padding_size) {
1283 std::vector<std::unique_ptr<RtpPacketToSend>> padding_packets;
1284 padding_packets.emplace_back(
1285 BuildPacket(RtpPacketToSend::Type::kPadding, ssrc, sequence_number++,
1286 clock_.TimeInMilliseconds(), padding_size.bytes()));
1287 return padding_packets;
1288 });
1289 EXPECT_CALL(
1290 callback,
1291 SendRtpPacket(_, Field(&PacedPacketInfo::probe_cluster_id, kNotAProbe)))
1292 .Times(1);
Erik Språngd05edec2019-08-14 10:43:47 +02001293 pacer_->ProcessPackets();
1294}
1295
Erik Språngf5815fa2019-08-21 14:27:31 +02001296TEST_F(PacingControllerTest, OwnedPacketPrioritizedOnType) {
Erik Språngd05edec2019-08-14 10:43:47 +02001297 MockPacketSender callback;
1298 pacer_ =
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001299 std::make_unique<PacingController>(&clock_, &callback, nullptr, nullptr);
Erik Språngd05edec2019-08-14 10:43:47 +02001300 Init();
1301
1302 // Insert a packet of each type, from low to high priority. Since priority
1303 // is weighted higher than insert order, these should come out of the pacer
1304 // in backwards order with the exception of FEC and Video.
1305 for (RtpPacketToSend::Type type :
1306 {RtpPacketToSend::Type::kPadding,
1307 RtpPacketToSend::Type::kForwardErrorCorrection,
1308 RtpPacketToSend::Type::kVideo, RtpPacketToSend::Type::kRetransmission,
1309 RtpPacketToSend::Type::kAudio}) {
1310 pacer_->EnqueuePacket(BuildRtpPacket(type));
1311 }
1312
1313 ::testing::InSequence seq;
1314 EXPECT_CALL(
1315 callback,
1316 SendRtpPacket(Pointee(Property(&RtpPacketToSend::Ssrc, kAudioSsrc)), _));
1317 EXPECT_CALL(callback,
1318 SendRtpPacket(
1319 Pointee(Property(&RtpPacketToSend::Ssrc, kVideoRtxSsrc)), _));
1320
1321 // FEC and video actually have the same priority, so will come out in
1322 // insertion order.
1323 EXPECT_CALL(callback,
1324 SendRtpPacket(
1325 Pointee(Property(&RtpPacketToSend::Ssrc, kFlexFecSsrc)), _));
1326 EXPECT_CALL(
1327 callback,
1328 SendRtpPacket(Pointee(Property(&RtpPacketToSend::Ssrc, kVideoSsrc)), _));
1329
1330 EXPECT_CALL(callback,
1331 SendRtpPacket(
1332 Pointee(Property(&RtpPacketToSend::Ssrc, kVideoRtxSsrc)), _));
1333
1334 clock_.AdvanceTimeMilliseconds(200);
1335 pacer_->ProcessPackets();
1336}
Erik Språng78c82a42019-10-03 18:46:04 +02001337
1338TEST_F(PacingControllerTest, SmallFirstProbePacket) {
1339 ScopedFieldTrials trial("WebRTC-Pacer-SmallFirstProbePacket/Enabled/");
1340 MockPacketSender callback;
1341 pacer_ =
1342 std::make_unique<PacingController>(&clock_, &callback, nullptr, nullptr);
1343 pacer_->CreateProbeCluster(kFirstClusterRate, /*cluster_id=*/0);
1344 pacer_->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
1345
1346 // Add high prio media.
1347 pacer_->EnqueuePacket(BuildRtpPacket(RtpPacketToSend::Type::kAudio));
1348
1349 // Expect small padding packet to be requested.
1350 EXPECT_CALL(callback, GeneratePadding(DataSize::bytes(1)))
1351 .WillOnce([&](DataSize padding_size) {
1352 std::vector<std::unique_ptr<RtpPacketToSend>> padding_packets;
1353 padding_packets.emplace_back(
1354 BuildPacket(RtpPacketToSend::Type::kPadding, kAudioSsrc, 1,
1355 clock_.TimeInMilliseconds(), 1));
1356 return padding_packets;
1357 });
1358
1359 size_t packets_sent = 0;
1360 bool media_seen = false;
1361 EXPECT_CALL(callback, SendRtpPacket)
1362 .Times(::testing::AnyNumber())
1363 .WillRepeatedly([&](std::unique_ptr<RtpPacketToSend> packet,
1364 const PacedPacketInfo& cluster_info) {
1365 if (packets_sent == 0) {
1366 EXPECT_EQ(packet->packet_type(), RtpPacketToSend::Type::kPadding);
1367 } else {
1368 if (packet->packet_type() == RtpPacketToSend::Type::kAudio) {
1369 media_seen = true;
1370 }
1371 }
1372 packets_sent++;
1373 });
1374 while (!media_seen) {
1375 pacer_->ProcessPackets();
1376 clock_.AdvanceTimeMilliseconds(5);
1377 }
1378}
Erik Språngd05edec2019-08-14 10:43:47 +02001379} // namespace test
1380} // namespace webrtc