pacing_controller_unittest.cc (99401B)
1 /* 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 <cmath> 15 #include <cstddef> 16 #include <cstdint> 17 #include <cstdlib> 18 #include <memory> 19 #include <optional> 20 #include <utility> 21 #include <vector> 22 23 #include "api/array_view.h" 24 #include "api/field_trials.h" 25 #include "api/transport/network_types.h" 26 #include "api/units/data_rate.h" 27 #include "api/units/data_size.h" 28 #include "api/units/time_delta.h" 29 #include "api/units/timestamp.h" 30 #include "modules/pacing/bitrate_prober.h" 31 #include "modules/rtp_rtcp/include/rtp_rtcp_defines.h" 32 #include "modules/rtp_rtcp/source/rtp_packet_to_send.h" 33 #include "system_wrappers/include/clock.h" 34 #include "test/create_test_field_trials.h" 35 #include "test/gmock.h" 36 #include "test/gtest.h" 37 38 using ::testing::_; 39 using ::testing::AnyNumber; 40 using ::testing::Field; 41 using ::testing::NiceMock; 42 using ::testing::Pointee; 43 using ::testing::Property; 44 using ::testing::Return; 45 using ::testing::WithoutArgs; 46 47 namespace webrtc { 48 namespace { 49 constexpr DataRate kFirstClusterRate = DataRate::KilobitsPerSec(900); 50 constexpr DataRate kSecondClusterRate = DataRate::KilobitsPerSec(1800); 51 52 // The error stems from truncating the time interval of probe packets to integer 53 // values. This results in probing slightly higher than the target bitrate. 54 // For 1.8 Mbps, this comes to be about 120 kbps with 1200 probe packets. 55 constexpr DataRate kProbingErrorMargin = DataRate::KilobitsPerSec(150); 56 57 constexpr float kPaceMultiplier = 2.5f; 58 59 constexpr uint32_t kAudioSsrc = 12345; 60 constexpr uint32_t kVideoSsrc = 234565; 61 62 constexpr DataRate kTargetRate = DataRate::KilobitsPerSec(800); 63 64 std::unique_ptr<RtpPacketToSend> BuildPacket(RtpPacketMediaType type, 65 uint32_t ssrc, 66 uint16_t sequence_number, 67 int64_t capture_time_ms, 68 size_t payload_size) { 69 auto packet = std::make_unique<RtpPacketToSend>(nullptr); 70 packet->set_packet_type(type); 71 packet->SetSsrc(ssrc); 72 packet->SetSequenceNumber(sequence_number); 73 packet->set_capture_time(Timestamp::Millis(capture_time_ms)); 74 packet->SetPayloadSize(payload_size); 75 return packet; 76 } 77 78 class MediaStream { 79 public: 80 MediaStream(SimulatedClock& clock, 81 RtpPacketMediaType type, 82 uint32_t ssrc, 83 size_t packet_size) 84 : clock_(clock), type_(type), ssrc_(ssrc), packet_size_(packet_size) {} 85 86 std::unique_ptr<RtpPacketToSend> BuildNextPacket() { 87 return BuildPacket(type_, ssrc_, seq_num_++, clock_.TimeInMilliseconds(), 88 packet_size_); 89 } 90 std::unique_ptr<RtpPacketToSend> BuildNextPacket(size_t size) { 91 return BuildPacket(type_, ssrc_, seq_num_++, clock_.TimeInMilliseconds(), 92 size); 93 } 94 95 private: 96 SimulatedClock& clock_; 97 const RtpPacketMediaType type_; 98 const uint32_t ssrc_; 99 const size_t packet_size_; 100 uint16_t seq_num_ = 1000; 101 }; 102 103 // Mock callback proxy, where both new and old api redirects to common mock 104 // methods that focus on core aspects. 105 class MockPacingControllerCallback : public PacingController::PacketSender { 106 public: 107 void SendPacket(std::unique_ptr<RtpPacketToSend> packet, 108 const PacedPacketInfo& /* cluster_info */) override { 109 SendPacket(packet->Ssrc(), packet->SequenceNumber(), 110 packet->capture_time().ms(), 111 packet->packet_type() == RtpPacketMediaType::kRetransmission, 112 packet->packet_type() == RtpPacketMediaType::kPadding); 113 } 114 115 std::vector<std::unique_ptr<RtpPacketToSend>> GeneratePadding( 116 DataSize target_size) override { 117 std::vector<std::unique_ptr<RtpPacketToSend>> ret; 118 size_t padding_size = SendPadding(target_size.bytes()); 119 if (padding_size > 0) { 120 auto packet = std::make_unique<RtpPacketToSend>(nullptr); 121 packet->SetPayloadSize(padding_size); 122 packet->set_packet_type(RtpPacketMediaType::kPadding); 123 ret.emplace_back(std::move(packet)); 124 } 125 return ret; 126 } 127 128 MOCK_METHOD(void, 129 SendPacket, 130 (uint32_t ssrc, 131 uint16_t sequence_number, 132 int64_t capture_timestamp, 133 bool retransmission, 134 bool padding)); 135 MOCK_METHOD(std::vector<std::unique_ptr<RtpPacketToSend>>, 136 FetchFec, 137 (), 138 (override)); 139 MOCK_METHOD(size_t, SendPadding, (size_t target_size)); 140 MOCK_METHOD(void, 141 OnAbortedRetransmissions, 142 (uint32_t, ArrayView<const uint16_t>), 143 (override)); 144 MOCK_METHOD(std::optional<uint32_t>, 145 GetRtxSsrcForMedia, 146 (uint32_t), 147 (const, override)); 148 MOCK_METHOD(void, OnBatchComplete, (), (override)); 149 }; 150 151 // Mock callback implementing the raw api. 152 class MockPacketSender : public PacingController::PacketSender { 153 public: 154 MOCK_METHOD(void, 155 SendPacket, 156 (std::unique_ptr<RtpPacketToSend> packet, 157 const PacedPacketInfo& cluster_info), 158 (override)); 159 MOCK_METHOD(std::vector<std::unique_ptr<RtpPacketToSend>>, 160 FetchFec, 161 (), 162 (override)); 163 164 MOCK_METHOD(std::vector<std::unique_ptr<RtpPacketToSend>>, 165 GeneratePadding, 166 (DataSize target_size), 167 (override)); 168 MOCK_METHOD(void, 169 OnAbortedRetransmissions, 170 (uint32_t, ArrayView<const uint16_t>), 171 (override)); 172 MOCK_METHOD(std::optional<uint32_t>, 173 GetRtxSsrcForMedia, 174 (uint32_t), 175 (const, override)); 176 MOCK_METHOD(void, OnBatchComplete, (), (override)); 177 }; 178 179 class PacingControllerPadding : public PacingController::PacketSender { 180 public: 181 static const size_t kPaddingPacketSize = 224; 182 183 PacingControllerPadding() : padding_sent_(0), total_bytes_sent_(0) {} 184 185 void SendPacket(std::unique_ptr<RtpPacketToSend> packet, 186 const PacedPacketInfo& /* pacing_info */) override { 187 total_bytes_sent_ += packet->payload_size(); 188 } 189 190 std::vector<std::unique_ptr<RtpPacketToSend>> FetchFec() override { 191 return {}; 192 } 193 194 std::vector<std::unique_ptr<RtpPacketToSend>> GeneratePadding( 195 DataSize target_size) override { 196 size_t num_packets = 197 (target_size.bytes() + kPaddingPacketSize - 1) / kPaddingPacketSize; 198 std::vector<std::unique_ptr<RtpPacketToSend>> packets; 199 for (size_t i = 0; i < num_packets; ++i) { 200 packets.emplace_back(std::make_unique<RtpPacketToSend>(nullptr)); 201 packets.back()->SetPadding(kPaddingPacketSize); 202 packets.back()->set_packet_type(RtpPacketMediaType::kPadding); 203 padding_sent_ += kPaddingPacketSize; 204 } 205 return packets; 206 } 207 208 void OnAbortedRetransmissions(uint32_t, ArrayView<const uint16_t>) override {} 209 std::optional<uint32_t> GetRtxSsrcForMedia(uint32_t) const override { 210 return std::nullopt; 211 } 212 213 void OnBatchComplete() override {} 214 215 size_t padding_sent() { return padding_sent_; } 216 size_t total_bytes_sent() { return total_bytes_sent_; } 217 218 private: 219 size_t padding_sent_; 220 size_t total_bytes_sent_; 221 }; 222 223 class PacingControllerProbing : public PacingController::PacketSender { 224 public: 225 PacingControllerProbing() = default; 226 // Controls if padding can be generated or not. 227 // In real implementation, padding can only be generated after a sent 228 // media packet, or if the sender support RTX. 229 void SetCanGeneratePadding(bool can_generate) { 230 can_generate_padding_ = can_generate; 231 } 232 233 void SendPacket(std::unique_ptr<RtpPacketToSend> packet, 234 const PacedPacketInfo& pacing_info) override { 235 if (packet->packet_type() != RtpPacketMediaType::kPadding) { 236 ++packets_sent_; 237 } else { 238 ++padding_packets_sent_; 239 } 240 last_pacing_info_ = pacing_info; 241 } 242 243 std::vector<std::unique_ptr<RtpPacketToSend>> FetchFec() override { 244 return {}; 245 } 246 247 std::vector<std::unique_ptr<RtpPacketToSend>> GeneratePadding( 248 DataSize target_size) override { 249 if (!can_generate_padding_) { 250 return {}; 251 } 252 // From RTPSender: 253 // Max in the RFC 3550 is 255 bytes, we limit it to be modulus 32 for SRTP. 254 const DataSize kMaxPadding = DataSize::Bytes(224); 255 256 std::vector<std::unique_ptr<RtpPacketToSend>> packets; 257 while (target_size > DataSize::Zero()) { 258 DataSize padding_size = std::min(kMaxPadding, target_size); 259 packets.emplace_back(std::make_unique<RtpPacketToSend>(nullptr)); 260 packets.back()->SetPadding(padding_size.bytes()); 261 packets.back()->set_packet_type(RtpPacketMediaType::kPadding); 262 padding_sent_ += padding_size.bytes(); 263 target_size -= padding_size; 264 } 265 return packets; 266 } 267 268 void OnAbortedRetransmissions(uint32_t, ArrayView<const uint16_t>) override {} 269 std::optional<uint32_t> GetRtxSsrcForMedia(uint32_t) const override { 270 return std::nullopt; 271 } 272 void OnBatchComplete() override {} 273 274 int packets_sent() const { return packets_sent_; } 275 int padding_packets_sent() const { return padding_packets_sent_; } 276 int padding_sent() const { return padding_sent_; } 277 int total_packets_sent() const { return packets_sent_ + padding_sent_; } 278 PacedPacketInfo last_pacing_info() const { return last_pacing_info_; } 279 280 private: 281 bool can_generate_padding_ = true; 282 int packets_sent_ = 0; 283 int padding_packets_sent_ = 0; 284 int padding_sent_ = 0; 285 PacedPacketInfo last_pacing_info_; 286 }; 287 288 class PacingControllerTest : public ::testing::Test { 289 protected: 290 PacingControllerTest() : clock_(123456), trials_(CreateTestFieldTrials()) {} 291 292 void SendAndExpectPacket(PacingController* pacer, 293 RtpPacketMediaType type, 294 uint32_t ssrc, 295 uint16_t sequence_number, 296 int64_t capture_time_ms, 297 size_t size) { 298 pacer->EnqueuePacket( 299 BuildPacket(type, ssrc, sequence_number, capture_time_ms, size)); 300 301 EXPECT_CALL(callback_, 302 SendPacket(ssrc, sequence_number, capture_time_ms, 303 type == RtpPacketMediaType::kRetransmission, false)); 304 } 305 306 void AdvanceTimeUntil(Timestamp time) { 307 Timestamp now = clock_.CurrentTime(); 308 clock_.AdvanceTime(std::max(TimeDelta::Zero(), time - now)); 309 } 310 311 void ConsumeInitialBudget(PacingController* pacer) { 312 const uint32_t kSsrc = 54321; 313 uint16_t sequence_number = 1234; 314 int64_t capture_time_ms = clock_.TimeInMilliseconds(); 315 const size_t kPacketSize = 250; 316 317 EXPECT_TRUE(pacer->OldestPacketEnqueueTime().IsInfinite()); 318 319 // Due to the multiplicative factor we can send 5 packets during a send 320 // interval. (network capacity * multiplier / (8 bits per byte * 321 // (packet size * #send intervals per second) 322 const size_t packets_to_send_per_interval = 323 kTargetRate.bps() * kPaceMultiplier / (8 * kPacketSize * 200); 324 for (size_t i = 0; i < packets_to_send_per_interval; ++i) { 325 SendAndExpectPacket(pacer, RtpPacketMediaType::kVideo, kSsrc, 326 sequence_number++, capture_time_ms, kPacketSize); 327 } 328 329 while (pacer->QueueSizePackets() > 0) { 330 AdvanceTimeUntil(pacer->NextSendTime()); 331 pacer->ProcessPackets(); 332 } 333 } 334 335 SimulatedClock clock_; 336 337 MediaStream audio_ = MediaStream(clock_, 338 /*type*/ RtpPacketMediaType::kAudio, 339 /*ssrc*/ kAudioSsrc, 340 /*packet_size*/ 100); 341 MediaStream video_ = MediaStream(clock_, 342 /*type*/ RtpPacketMediaType::kVideo, 343 /*ssrc*/ kVideoSsrc, 344 /*packet_size*/ 1000); 345 346 ::testing::NiceMock<MockPacingControllerCallback> callback_; 347 FieldTrials trials_; 348 }; 349 350 TEST_F(PacingControllerTest, DefaultNoPaddingInSilence) { 351 const FieldTrials trials = CreateTestFieldTrials(); 352 PacingController pacer(&clock_, &callback_, trials); 353 pacer.SetPacingRates(kTargetRate, DataRate::Zero()); 354 // Video packet to reset last send time and provide padding data. 355 pacer.EnqueuePacket(video_.BuildNextPacket()); 356 EXPECT_CALL(callback_, SendPacket).Times(1); 357 clock_.AdvanceTimeMilliseconds(5); 358 pacer.ProcessPackets(); 359 EXPECT_CALL(callback_, SendPadding).Times(0); 360 // Waiting 500 ms should not trigger sending of padding. 361 clock_.AdvanceTimeMilliseconds(500); 362 pacer.ProcessPackets(); 363 } 364 365 TEST_F(PacingControllerTest, PaddingInSilenceWithTrial) { 366 const FieldTrials trials = 367 CreateTestFieldTrials("WebRTC-Pacer-PadInSilence/Enabled/"); 368 PacingController pacer(&clock_, &callback_, trials); 369 pacer.SetPacingRates(kTargetRate, DataRate::Zero()); 370 // Video packet to reset last send time and provide padding data. 371 pacer.EnqueuePacket(video_.BuildNextPacket()); 372 EXPECT_CALL(callback_, SendPacket).Times(2); 373 clock_.AdvanceTimeMilliseconds(5); 374 pacer.ProcessPackets(); 375 EXPECT_CALL(callback_, SendPadding).WillOnce(Return(1000)); 376 // Waiting 500 ms should trigger sending of padding. 377 clock_.AdvanceTimeMilliseconds(500); 378 pacer.ProcessPackets(); 379 } 380 381 TEST_F(PacingControllerTest, CongestionWindowAffectsAudioInTrial) { 382 const FieldTrials trials = 383 CreateTestFieldTrials("WebRTC-Pacer-BlockAudio/Enabled/"); 384 EXPECT_CALL(callback_, SendPadding).Times(0); 385 PacingController pacer(&clock_, &callback_, trials); 386 pacer.SetPacingRates(DataRate::KilobitsPerSec(10000), DataRate::Zero()); 387 // Video packet fills congestion window. 388 pacer.EnqueuePacket(video_.BuildNextPacket()); 389 EXPECT_CALL(callback_, SendPacket).Times(1); 390 AdvanceTimeUntil(pacer.NextSendTime()); 391 pacer.ProcessPackets(); 392 pacer.SetCongested(true); 393 // Audio packet blocked due to congestion. 394 pacer.EnqueuePacket(audio_.BuildNextPacket()); 395 EXPECT_CALL(callback_, SendPacket).Times(0); 396 // Forward time to where we send keep-alive. 397 EXPECT_CALL(callback_, SendPadding(1)).Times(2); 398 AdvanceTimeUntil(pacer.NextSendTime()); 399 pacer.ProcessPackets(); 400 AdvanceTimeUntil(pacer.NextSendTime()); 401 pacer.ProcessPackets(); 402 // Audio packet unblocked when congestion window clear. 403 ::testing::Mock::VerifyAndClearExpectations(&callback_); 404 pacer.SetCongested(false); 405 EXPECT_CALL(callback_, SendPacket).Times(1); 406 AdvanceTimeUntil(pacer.NextSendTime()); 407 pacer.ProcessPackets(); 408 } 409 410 TEST_F(PacingControllerTest, DefaultCongestionWindowDoesNotAffectAudio) { 411 EXPECT_CALL(callback_, SendPadding).Times(0); 412 const FieldTrials trials = CreateTestFieldTrials(); 413 PacingController pacer(&clock_, &callback_, trials); 414 pacer.SetPacingRates(DataRate::BitsPerSec(10000000), DataRate::Zero()); 415 // Video packet fills congestion window. 416 pacer.EnqueuePacket(video_.BuildNextPacket()); 417 EXPECT_CALL(callback_, SendPacket).Times(1); 418 AdvanceTimeUntil(pacer.NextSendTime()); 419 pacer.ProcessPackets(); 420 pacer.SetCongested(true); 421 // Audio not blocked due to congestion. 422 pacer.EnqueuePacket(audio_.BuildNextPacket()); 423 EXPECT_CALL(callback_, SendPacket).Times(1); 424 AdvanceTimeUntil(pacer.NextSendTime()); 425 pacer.ProcessPackets(); 426 } 427 428 TEST_F(PacingControllerTest, BudgetAffectsAudioInTrial) { 429 FieldTrials trials = 430 CreateTestFieldTrials("WebRTC-Pacer-BlockAudio/Enabled/"); 431 PacingController pacer(&clock_, &callback_, trials); 432 const size_t kPacketSize = 1000; 433 const int kProcessIntervalsPerSecond = 1000 / 5; 434 DataRate pacing_rate = 435 DataRate::BitsPerSec(kPacketSize / 3 * 8 * kProcessIntervalsPerSecond); 436 pacer.SetPacingRates(pacing_rate, DataRate::Zero()); 437 pacer.SetSendBurstInterval(TimeDelta::Zero()); 438 // Video fills budget for following process periods. 439 pacer.EnqueuePacket(video_.BuildNextPacket(kPacketSize)); 440 EXPECT_CALL(callback_, SendPacket).Times(1); 441 AdvanceTimeUntil(pacer.NextSendTime()); 442 pacer.ProcessPackets(); 443 // Audio packet blocked due to budget limit. 444 pacer.EnqueuePacket(audio_.BuildNextPacket()); 445 Timestamp wait_start_time = clock_.CurrentTime(); 446 Timestamp wait_end_time = Timestamp::MinusInfinity(); 447 EXPECT_CALL(callback_, SendPacket).WillOnce(WithoutArgs([&]() { 448 wait_end_time = clock_.CurrentTime(); 449 })); 450 while (!wait_end_time.IsFinite()) { 451 AdvanceTimeUntil(pacer.NextSendTime()); 452 pacer.ProcessPackets(); 453 } 454 const TimeDelta expected_wait_time = 455 DataSize::Bytes(kPacketSize) / pacing_rate; 456 // Verify delay is near expectation, within timing margin. 457 EXPECT_LT(((wait_end_time - wait_start_time) - expected_wait_time).Abs(), 458 PacingController::kMinSleepTime); 459 } 460 461 TEST_F(PacingControllerTest, DefaultBudgetDoesNotAffectAudio) { 462 const size_t kPacketSize = 1000; 463 EXPECT_CALL(callback_, SendPadding).Times(0); 464 const FieldTrials trials = CreateTestFieldTrials(); 465 PacingController pacer(&clock_, &callback_, trials); 466 const int kProcessIntervalsPerSecond = 1000 / 5; 467 pacer.SetPacingRates( 468 DataRate::BitsPerSec(kPacketSize / 3 * 8 * kProcessIntervalsPerSecond), 469 DataRate::Zero()); 470 // Video fills budget for following process periods. 471 pacer.EnqueuePacket(video_.BuildNextPacket(kPacketSize)); 472 EXPECT_CALL(callback_, SendPacket).Times(1); 473 AdvanceTimeUntil(pacer.NextSendTime()); 474 pacer.ProcessPackets(); 475 // Audio packet not blocked due to budget limit. 476 EXPECT_CALL(callback_, SendPacket).Times(1); 477 pacer.EnqueuePacket(audio_.BuildNextPacket()); 478 AdvanceTimeUntil(pacer.NextSendTime()); 479 pacer.ProcessPackets(); 480 } 481 482 TEST_F(PacingControllerTest, FirstSentPacketTimeIsSet) { 483 const Timestamp kStartTime = clock_.CurrentTime(); 484 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_); 485 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero()); 486 487 // No packet sent. 488 EXPECT_FALSE(pacer->FirstSentPacketTime().has_value()); 489 pacer->EnqueuePacket(video_.BuildNextPacket()); 490 AdvanceTimeUntil(pacer->NextSendTime()); 491 pacer->ProcessPackets(); 492 EXPECT_EQ(kStartTime, pacer->FirstSentPacketTime()); 493 } 494 495 TEST_F(PacingControllerTest, QueueAndPacePacketsWithZeroBurstPeriod) { 496 const uint32_t kSsrc = 12345; 497 uint16_t sequence_number = 1234; 498 const DataSize kPackeSize = DataSize::Bytes(250); 499 const TimeDelta kSendInterval = TimeDelta::Millis(5); 500 501 // Due to the multiplicative factor we can send 5 packets during a 5ms send 502 // interval. (send interval * network capacity * multiplier / packet size) 503 const size_t kPacketsToSend = (kSendInterval * kTargetRate).bytes() * 504 kPaceMultiplier / kPackeSize.bytes(); 505 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_); 506 pacer->SetSendBurstInterval(TimeDelta::Zero()); 507 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero()); 508 509 for (size_t i = 0; i < kPacketsToSend; ++i) { 510 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, kSsrc, 511 sequence_number++, clock_.TimeInMilliseconds(), 512 kPackeSize.bytes()); 513 } 514 EXPECT_CALL(callback_, SendPadding).Times(0); 515 516 // Enqueue one extra packet. 517 int64_t queued_packet_timestamp = clock_.TimeInMilliseconds(); 518 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, kSsrc, 519 sequence_number, queued_packet_timestamp, 520 kPackeSize.bytes())); 521 EXPECT_EQ(kPacketsToSend + 1, pacer->QueueSizePackets()); 522 523 // Send packets until the initial kPacketsToSend packets are done. 524 Timestamp start_time = clock_.CurrentTime(); 525 while (pacer->QueueSizePackets() > 1) { 526 AdvanceTimeUntil(pacer->NextSendTime()); 527 pacer->ProcessPackets(); 528 } 529 EXPECT_LT(clock_.CurrentTime() - start_time, kSendInterval); 530 531 // Proceed till last packet can be sent. 532 EXPECT_CALL(callback_, SendPacket(kSsrc, sequence_number, 533 queued_packet_timestamp, false, false)) 534 .Times(1); 535 AdvanceTimeUntil(pacer->NextSendTime()); 536 pacer->ProcessPackets(); 537 EXPECT_GE(clock_.CurrentTime() - start_time, kSendInterval); 538 EXPECT_EQ(pacer->QueueSizePackets(), 0u); 539 } 540 541 TEST_F(PacingControllerTest, PaceQueuedPackets) { 542 uint32_t ssrc = 12345; 543 uint16_t sequence_number = 1234; 544 const size_t kPacketSize = 250; 545 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_); 546 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero()); 547 548 const size_t packets_to_send_per_burst_interval = 549 (kTargetRate * kPaceMultiplier * PacingController::kDefaultBurstInterval) 550 .bytes() / 551 kPacketSize; 552 for (size_t i = 0; i < packets_to_send_per_burst_interval; ++i) { 553 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc, 554 sequence_number++, clock_.TimeInMilliseconds(), 555 kPacketSize); 556 } 557 558 for (size_t j = 0; j < packets_to_send_per_burst_interval * 10; ++j) { 559 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, ssrc, 560 sequence_number++, 561 clock_.TimeInMilliseconds(), kPacketSize)); 562 } 563 EXPECT_EQ(packets_to_send_per_burst_interval + 564 packets_to_send_per_burst_interval * 10, 565 pacer->QueueSizePackets()); 566 567 while (pacer->QueueSizePackets() > packets_to_send_per_burst_interval * 10) { 568 AdvanceTimeUntil(pacer->NextSendTime()); 569 pacer->ProcessPackets(); 570 } 571 EXPECT_EQ(pacer->QueueSizePackets(), packets_to_send_per_burst_interval * 10); 572 EXPECT_CALL(callback_, SendPadding).Times(0); 573 574 EXPECT_CALL(callback_, SendPacket(ssrc, _, _, false, false)) 575 .Times(pacer->QueueSizePackets()); 576 const TimeDelta expected_pace_time = 577 DataSize::Bytes(pacer->QueueSizePackets() * kPacketSize) / 578 (kPaceMultiplier * kTargetRate); 579 Timestamp start_time = clock_.CurrentTime(); 580 while (pacer->QueueSizePackets() > 0) { 581 AdvanceTimeUntil(pacer->NextSendTime()); 582 pacer->ProcessPackets(); 583 } 584 const TimeDelta actual_pace_time = clock_.CurrentTime() - start_time; 585 EXPECT_LT((actual_pace_time - expected_pace_time).Abs(), 586 PacingController::kMinSleepTime); 587 588 EXPECT_EQ(0u, pacer->QueueSizePackets()); 589 AdvanceTimeUntil(pacer->NextSendTime()); 590 EXPECT_EQ(0u, pacer->QueueSizePackets()); 591 pacer->ProcessPackets(); 592 593 // Send some more packet, just show that we can..? 594 for (size_t i = 0; i < packets_to_send_per_burst_interval; ++i) { 595 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc, 596 sequence_number++, clock_.TimeInMilliseconds(), 250); 597 } 598 EXPECT_EQ(packets_to_send_per_burst_interval, pacer->QueueSizePackets()); 599 for (size_t i = 0; i < packets_to_send_per_burst_interval; ++i) { 600 AdvanceTimeUntil(pacer->NextSendTime()); 601 pacer->ProcessPackets(); 602 } 603 EXPECT_EQ(0u, pacer->QueueSizePackets()); 604 } 605 606 TEST_F(PacingControllerTest, RepeatedRetransmissionsAllowed) { 607 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_); 608 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero()); 609 610 // Send one packet, then two retransmissions of that packet. 611 for (size_t i = 0; i < 3; i++) { 612 constexpr uint32_t ssrc = 333; 613 constexpr uint16_t sequence_number = 444; 614 constexpr size_t bytes = 250; 615 bool is_retransmission = (i != 0); // Original followed by retransmissions. 616 SendAndExpectPacket(pacer.get(), 617 is_retransmission ? RtpPacketMediaType::kRetransmission 618 : RtpPacketMediaType::kVideo, 619 ssrc, sequence_number, clock_.TimeInMilliseconds(), 620 bytes); 621 clock_.AdvanceTimeMilliseconds(5); 622 } 623 while (pacer->QueueSizePackets() > 0) { 624 AdvanceTimeUntil(pacer->NextSendTime()); 625 pacer->ProcessPackets(); 626 } 627 } 628 629 TEST_F(PacingControllerTest, 630 CanQueuePacketsWithSameSequenceNumberOnDifferentSsrcs) { 631 uint32_t ssrc = 12345; 632 uint16_t sequence_number = 1234; 633 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_); 634 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero()); 635 636 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc, 637 sequence_number, clock_.TimeInMilliseconds(), 250); 638 639 // Expect packet on second ssrc to be queued and sent as well. 640 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc + 1, 641 sequence_number, clock_.TimeInMilliseconds(), 250); 642 643 clock_.AdvanceTimeMilliseconds(1000); 644 while (pacer->QueueSizePackets() > 0) { 645 AdvanceTimeUntil(pacer->NextSendTime()); 646 pacer->ProcessPackets(); 647 } 648 } 649 650 TEST_F(PacingControllerTest, Padding) { 651 uint32_t ssrc = 12345; 652 uint16_t sequence_number = 1234; 653 const size_t kPacketSize = 1000; 654 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_); 655 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate); 656 657 const size_t kPacketsToSend = 30; 658 for (size_t i = 0; i < kPacketsToSend; ++i) { 659 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc, 660 sequence_number++, clock_.TimeInMilliseconds(), 661 kPacketSize); 662 } 663 664 int expected_bursts = 665 floor(DataSize::Bytes(pacer->QueueSizePackets() * kPacketSize) / 666 (kPaceMultiplier * kTargetRate) / 667 PacingController::kDefaultBurstInterval); 668 const TimeDelta expected_pace_time = 669 (expected_bursts - 1) * PacingController::kDefaultBurstInterval; 670 EXPECT_CALL(callback_, SendPadding).Times(0); 671 // Only the media packets should be sent. 672 Timestamp start_time = clock_.CurrentTime(); 673 while (pacer->QueueSizePackets() > 0) { 674 AdvanceTimeUntil(pacer->NextSendTime()); 675 pacer->ProcessPackets(); 676 } 677 const TimeDelta actual_pace_time = clock_.CurrentTime() - start_time; 678 EXPECT_LE((actual_pace_time - expected_pace_time).Abs(), 679 PacingController::kDefaultBurstInterval); 680 681 // Pacing media happens at 2.5x, but padding was configured with 1.0x 682 // factor. We have to wait until the padding debt is gone before we start 683 // sending padding. 684 const TimeDelta time_to_padding_debt_free = 685 (expected_pace_time * kPaceMultiplier) - actual_pace_time; 686 clock_.AdvanceTime(time_to_padding_debt_free - 687 PacingController::kMinSleepTime); 688 pacer->ProcessPackets(); 689 690 // Send 10 padding packets. 691 const size_t kPaddingPacketsToSend = 10; 692 DataSize padding_sent = DataSize::Zero(); 693 size_t packets_sent = 0; 694 Timestamp first_send_time = Timestamp::MinusInfinity(); 695 Timestamp last_send_time = Timestamp::MinusInfinity(); 696 697 EXPECT_CALL(callback_, SendPadding) 698 .Times(kPaddingPacketsToSend) 699 .WillRepeatedly([&](size_t target_size) { 700 ++packets_sent; 701 if (packets_sent < kPaddingPacketsToSend) { 702 // Don't count bytes of last packet, instead just 703 // use this as the time the last packet finished 704 // sending. 705 padding_sent += DataSize::Bytes(target_size); 706 } 707 if (first_send_time.IsInfinite()) { 708 first_send_time = clock_.CurrentTime(); 709 } else { 710 last_send_time = clock_.CurrentTime(); 711 } 712 return target_size; 713 }); 714 EXPECT_CALL(callback_, SendPacket(_, _, _, false, true)) 715 .Times(kPaddingPacketsToSend); 716 717 while (packets_sent < kPaddingPacketsToSend) { 718 AdvanceTimeUntil(pacer->NextSendTime()); 719 pacer->ProcessPackets(); 720 } 721 722 // Verify rate of sent padding. 723 TimeDelta padding_duration = last_send_time - first_send_time; 724 DataRate padding_rate = padding_sent / padding_duration; 725 EXPECT_EQ(padding_rate, kTargetRate); 726 } 727 728 TEST_F(PacingControllerTest, NoPaddingBeforeNormalPacket) { 729 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_); 730 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate); 731 732 EXPECT_CALL(callback_, SendPadding).Times(0); 733 734 pacer->ProcessPackets(); 735 AdvanceTimeUntil(pacer->NextSendTime()); 736 737 pacer->ProcessPackets(); 738 AdvanceTimeUntil(pacer->NextSendTime()); 739 740 uint32_t ssrc = 12345; 741 uint16_t sequence_number = 1234; 742 int64_t capture_time_ms = 56789; 743 744 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc, 745 sequence_number++, capture_time_ms, 250); 746 bool padding_sent = false; 747 EXPECT_CALL(callback_, SendPadding).WillOnce([&](size_t padding) { 748 padding_sent = true; 749 return padding; 750 }); 751 EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1); 752 while (!padding_sent) { 753 AdvanceTimeUntil(pacer->NextSendTime()); 754 pacer->ProcessPackets(); 755 } 756 } 757 758 TEST_F(PacingControllerTest, VerifyAverageBitrateVaryingMediaPayload) { 759 uint32_t ssrc = 12345; 760 uint16_t sequence_number = 1234; 761 int64_t capture_time_ms = 56789; 762 const TimeDelta kAveragingWindowLength = TimeDelta::Seconds(10); 763 PacingControllerPadding callback; 764 auto pacer = std::make_unique<PacingController>(&clock_, &callback, trials_); 765 pacer->SetProbingEnabled(false); 766 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate); 767 768 Timestamp start_time = clock_.CurrentTime(); 769 size_t media_bytes = 0; 770 while (clock_.CurrentTime() - start_time < kAveragingWindowLength) { 771 // Maybe add some new media packets corresponding to expected send rate. 772 int rand_value = rand(); // NOLINT (rand_r instead of rand) 773 while ( 774 media_bytes < 775 (kTargetRate * (clock_.CurrentTime() - start_time)).bytes<size_t>()) { 776 size_t media_payload = rand_value % 400 + 800; // [400, 1200] bytes. 777 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, ssrc, 778 sequence_number++, capture_time_ms, 779 media_payload)); 780 media_bytes += media_payload; 781 } 782 AdvanceTimeUntil(std::min(clock_.CurrentTime() + TimeDelta::Millis(20), 783 pacer->NextSendTime())); 784 pacer->ProcessPackets(); 785 } 786 787 EXPECT_NEAR( 788 kTargetRate.bps(), 789 (DataSize::Bytes(callback.total_bytes_sent()) / kAveragingWindowLength) 790 .bps(), 791 (kTargetRate * 0.01 /* 1% error marging */).bps()); 792 } 793 794 TEST_F(PacingControllerTest, Priority) { 795 uint32_t ssrc_low_priority = 12345; 796 uint32_t ssrc = 12346; 797 uint16_t sequence_number = 1234; 798 int64_t capture_time_ms = 56789; 799 int64_t capture_time_ms_low_priority = 1234567; 800 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_); 801 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero()); 802 803 ConsumeInitialBudget(pacer.get()); 804 805 // Expect normal and low priority to be queued and high to pass through. 806 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, 807 ssrc_low_priority, sequence_number++, 808 capture_time_ms_low_priority, 250)); 809 810 const size_t packets_to_send_per_interval = 811 kTargetRate.bps() * kPaceMultiplier / (8 * 250 * 200); 812 for (size_t i = 0; i < packets_to_send_per_interval; ++i) { 813 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kRetransmission, ssrc, 814 sequence_number++, capture_time_ms, 250)); 815 } 816 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kAudio, ssrc, 817 sequence_number++, capture_time_ms, 250)); 818 819 // Expect all high and normal priority to be sent out first. 820 EXPECT_CALL(callback_, SendPadding).Times(0); 821 testing::Sequence s; 822 EXPECT_CALL(callback_, SendPacket(ssrc, _, capture_time_ms, _, _)) 823 .Times(packets_to_send_per_interval + 1) 824 .InSequence(s); 825 EXPECT_CALL(callback_, SendPacket(ssrc_low_priority, _, 826 capture_time_ms_low_priority, _, _)) 827 .InSequence(s); 828 829 while (pacer->QueueSizePackets() > 0) { 830 AdvanceTimeUntil(pacer->NextSendTime()); 831 pacer->ProcessPackets(); 832 } 833 } 834 835 TEST_F(PacingControllerTest, RetransmissionPriority) { 836 uint32_t ssrc = 12345; 837 uint16_t sequence_number = 1234; 838 int64_t capture_time_ms = 45678; 839 int64_t capture_time_ms_retransmission = 56789; 840 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_); 841 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero()); 842 843 const size_t packets_to_send_per_burst_interval = 844 (kTargetRate * kPaceMultiplier * PacingController::kDefaultBurstInterval) 845 .bytes() / 846 250; 847 pacer->ProcessPackets(); 848 EXPECT_EQ(0u, pacer->QueueSizePackets()); 849 850 // Alternate retransmissions and normal packets. 851 for (size_t i = 0; i < packets_to_send_per_burst_interval; ++i) { 852 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, ssrc, 853 sequence_number++, capture_time_ms, 250)); 854 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kRetransmission, ssrc, 855 sequence_number++, 856 capture_time_ms_retransmission, 250)); 857 } 858 EXPECT_EQ(2 * packets_to_send_per_burst_interval, pacer->QueueSizePackets()); 859 860 // Expect all retransmissions to be sent out first despite having a later 861 // capture time. 862 EXPECT_CALL(callback_, SendPadding).Times(0); 863 EXPECT_CALL(callback_, SendPacket(_, _, _, false, _)).Times(0); 864 EXPECT_CALL(callback_, 865 SendPacket(ssrc, _, capture_time_ms_retransmission, true, _)) 866 .Times(packets_to_send_per_burst_interval); 867 868 while (pacer->QueueSizePackets() > packets_to_send_per_burst_interval) { 869 AdvanceTimeUntil(pacer->NextSendTime()); 870 pacer->ProcessPackets(); 871 } 872 EXPECT_EQ(packets_to_send_per_burst_interval, pacer->QueueSizePackets()); 873 874 // Expect the remaining (non-retransmission) packets to be sent. 875 EXPECT_CALL(callback_, SendPadding).Times(0); 876 EXPECT_CALL(callback_, SendPacket(_, _, _, true, _)).Times(0); 877 EXPECT_CALL(callback_, SendPacket(ssrc, _, capture_time_ms, false, _)) 878 .Times(packets_to_send_per_burst_interval); 879 880 while (pacer->QueueSizePackets() > 0) { 881 AdvanceTimeUntil(pacer->NextSendTime()); 882 pacer->ProcessPackets(); 883 } 884 EXPECT_EQ(0u, pacer->QueueSizePackets()); 885 } 886 887 TEST_F(PacingControllerTest, HighPrioDoesntAffectBudget) { 888 const size_t kPacketSize = 250; 889 uint32_t ssrc = 12346; 890 uint16_t sequence_number = 1234; 891 int64_t capture_time_ms = 56789; 892 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_); 893 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero()); 894 895 // As high prio packets doesn't affect the budget, we should be able to send 896 // a high number of them at once. 897 const size_t kNumAudioPackets = 25; 898 for (size_t i = 0; i < kNumAudioPackets; ++i) { 899 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kAudio, ssrc, 900 sequence_number++, capture_time_ms, kPacketSize); 901 } 902 pacer->ProcessPackets(); 903 EXPECT_EQ(pacer->QueueSizePackets(), 0u); 904 // Low prio packets does affect the budget. 905 const size_t kPacketsToSendPerBurstInterval = 906 (kTargetRate * kPaceMultiplier * PacingController::kDefaultBurstInterval) 907 .bytes() / 908 kPacketSize; 909 for (size_t i = 0; i < kPacketsToSendPerBurstInterval; ++i) { 910 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc, 911 sequence_number++, clock_.TimeInMilliseconds(), 912 kPacketSize); 913 } 914 915 // Send all packets and measure pace time. 916 Timestamp start_time = clock_.CurrentTime(); 917 EXPECT_EQ(pacer->NextSendTime(), clock_.CurrentTime()); 918 while (pacer->QueueSizePackets() > 0) { 919 AdvanceTimeUntil(pacer->NextSendTime()); 920 pacer->ProcessPackets(); 921 } 922 923 // Measure pacing time. 924 TimeDelta pacing_time = clock_.CurrentTime() - start_time; 925 // All packets sent in one burst since audio packets are not accounted for. 926 TimeDelta expected_pacing_time = TimeDelta::Zero(); 927 EXPECT_NEAR(pacing_time.us<double>(), expected_pacing_time.us<double>(), 928 PacingController::kMinSleepTime.us<double>()); 929 } 930 931 TEST_F(PacingControllerTest, SendsOnlyPaddingWhenCongested) { 932 uint32_t ssrc = 202020; 933 uint16_t sequence_number = 1000; 934 int kPacketSize = 250; 935 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_); 936 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero()); 937 938 // Send an initial packet so we have a last send time. 939 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc, 940 sequence_number++, clock_.TimeInMilliseconds(), 941 kPacketSize); 942 AdvanceTimeUntil(pacer->NextSendTime()); 943 pacer->ProcessPackets(); 944 ::testing::Mock::VerifyAndClearExpectations(&callback_); 945 946 // Set congested state, we should not send anything until the 500ms since 947 // last send time limit for keep-alives is triggered. 948 EXPECT_CALL(callback_, SendPacket).Times(0); 949 EXPECT_CALL(callback_, SendPadding).Times(0); 950 pacer->SetCongested(true); 951 size_t blocked_packets = 0; 952 int64_t expected_time_until_padding = 500; 953 while (expected_time_until_padding > 5) { 954 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, ssrc, 955 sequence_number++, 956 clock_.TimeInMilliseconds(), kPacketSize)); 957 blocked_packets++; 958 clock_.AdvanceTimeMilliseconds(5); 959 pacer->ProcessPackets(); 960 expected_time_until_padding -= 5; 961 } 962 963 ::testing::Mock::VerifyAndClearExpectations(&callback_); 964 EXPECT_CALL(callback_, SendPadding(1)).WillOnce(Return(1)); 965 EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1); 966 clock_.AdvanceTimeMilliseconds(5); 967 pacer->ProcessPackets(); 968 EXPECT_EQ(blocked_packets, pacer->QueueSizePackets()); 969 } 970 971 TEST_F(PacingControllerTest, DoesNotAllowOveruseAfterCongestion) { 972 uint32_t ssrc = 202020; 973 uint16_t seq_num = 1000; 974 int size = 1000; 975 auto now_ms = [this] { return clock_.TimeInMilliseconds(); }; 976 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_); 977 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero()); 978 pacer->SetSendBurstInterval(TimeDelta::Zero()); 979 EXPECT_CALL(callback_, SendPadding).Times(0); 980 // The pacing rate is low enough that the budget should not allow two packets 981 // to be sent in a row. 982 pacer->SetPacingRates(DataRate::BitsPerSec(400 * 8 * 1000 / 5), 983 DataRate::Zero()); 984 // Not yet budget limited or congested, packet is sent. 985 pacer->EnqueuePacket( 986 BuildPacket(RtpPacketMediaType::kVideo, ssrc, seq_num++, now_ms(), size)); 987 EXPECT_CALL(callback_, SendPacket).Times(1); 988 clock_.AdvanceTimeMilliseconds(5); 989 pacer->ProcessPackets(); 990 // Packet blocked due to congestion. 991 pacer->SetCongested(true); 992 pacer->EnqueuePacket( 993 BuildPacket(RtpPacketMediaType::kVideo, ssrc, seq_num++, now_ms(), size)); 994 EXPECT_CALL(callback_, SendPacket).Times(0); 995 clock_.AdvanceTimeMilliseconds(5); 996 pacer->ProcessPackets(); 997 // Packet blocked due to congestion. 998 pacer->EnqueuePacket( 999 BuildPacket(RtpPacketMediaType::kVideo, ssrc, seq_num++, now_ms(), size)); 1000 EXPECT_CALL(callback_, SendPacket).Times(0); 1001 clock_.AdvanceTimeMilliseconds(5); 1002 pacer->ProcessPackets(); 1003 // Congestion removed and budget has recovered, packet is sent. 1004 pacer->EnqueuePacket( 1005 BuildPacket(RtpPacketMediaType::kVideo, ssrc, seq_num++, now_ms(), size)); 1006 EXPECT_CALL(callback_, SendPacket).Times(1); 1007 clock_.AdvanceTimeMilliseconds(5); 1008 pacer->SetCongested(false); 1009 pacer->ProcessPackets(); 1010 // Should be blocked due to budget limitation as congestion has be removed. 1011 pacer->EnqueuePacket( 1012 BuildPacket(RtpPacketMediaType::kVideo, ssrc, seq_num++, now_ms(), size)); 1013 EXPECT_CALL(callback_, SendPacket).Times(0); 1014 clock_.AdvanceTimeMilliseconds(5); 1015 pacer->ProcessPackets(); 1016 } 1017 1018 TEST_F(PacingControllerTest, Pause) { 1019 uint32_t ssrc_low_priority = 12345; 1020 uint32_t ssrc = 12346; 1021 uint32_t ssrc_high_priority = 12347; 1022 uint16_t sequence_number = 1234; 1023 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_); 1024 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero()); 1025 1026 EXPECT_TRUE(pacer->OldestPacketEnqueueTime().IsInfinite()); 1027 1028 ConsumeInitialBudget(pacer.get()); 1029 1030 pacer->Pause(); 1031 1032 int64_t capture_time_ms = clock_.TimeInMilliseconds(); 1033 const size_t packets_to_send_per_interval = 1034 kTargetRate.bps() * kPaceMultiplier / (8 * 250 * 200); 1035 for (size_t i = 0; i < packets_to_send_per_interval; ++i) { 1036 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, 1037 ssrc_low_priority, sequence_number++, 1038 capture_time_ms, 250)); 1039 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kRetransmission, ssrc, 1040 sequence_number++, capture_time_ms, 250)); 1041 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kAudio, 1042 ssrc_high_priority, sequence_number++, 1043 capture_time_ms, 250)); 1044 } 1045 clock_.AdvanceTimeMilliseconds(10000); 1046 int64_t second_capture_time_ms = clock_.TimeInMilliseconds(); 1047 for (size_t i = 0; i < packets_to_send_per_interval; ++i) { 1048 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, 1049 ssrc_low_priority, sequence_number++, 1050 second_capture_time_ms, 250)); 1051 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kRetransmission, ssrc, 1052 sequence_number++, second_capture_time_ms, 1053 250)); 1054 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kAudio, 1055 ssrc_high_priority, sequence_number++, 1056 second_capture_time_ms, 250)); 1057 } 1058 1059 // Expect everything to be queued. 1060 EXPECT_EQ(capture_time_ms, pacer->OldestPacketEnqueueTime().ms()); 1061 1062 // Process triggers keep-alive packet. 1063 EXPECT_CALL(callback_, SendPadding).WillOnce([](size_t padding) { 1064 return padding; 1065 }); 1066 EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1); 1067 pacer->ProcessPackets(); 1068 1069 // Verify no packets sent for the rest of the paused process interval. 1070 const TimeDelta kProcessInterval = TimeDelta::Millis(5); 1071 TimeDelta expected_time_until_send = PacingController::kPausedProcessInterval; 1072 EXPECT_CALL(callback_, SendPadding).Times(0); 1073 while (expected_time_until_send >= kProcessInterval) { 1074 pacer->ProcessPackets(); 1075 clock_.AdvanceTime(kProcessInterval); 1076 expected_time_until_send -= kProcessInterval; 1077 } 1078 1079 // New keep-alive packet. 1080 ::testing::Mock::VerifyAndClearExpectations(&callback_); 1081 EXPECT_CALL(callback_, SendPadding).WillOnce([](size_t padding) { 1082 return padding; 1083 }); 1084 EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1); 1085 clock_.AdvanceTime(kProcessInterval); 1086 pacer->ProcessPackets(); 1087 ::testing::Mock::VerifyAndClearExpectations(&callback_); 1088 1089 // Expect high prio packets to come out first followed by normal 1090 // prio packets and low prio packets (all in capture order). 1091 { 1092 ::testing::InSequence sequence; 1093 EXPECT_CALL(callback_, 1094 SendPacket(ssrc_high_priority, _, capture_time_ms, _, _)) 1095 .Times(packets_to_send_per_interval); 1096 EXPECT_CALL(callback_, 1097 SendPacket(ssrc_high_priority, _, second_capture_time_ms, _, _)) 1098 .Times(packets_to_send_per_interval); 1099 1100 for (size_t i = 0; i < packets_to_send_per_interval; ++i) { 1101 EXPECT_CALL(callback_, SendPacket(ssrc, _, capture_time_ms, _, _)) 1102 .Times(1); 1103 } 1104 for (size_t i = 0; i < packets_to_send_per_interval; ++i) { 1105 EXPECT_CALL(callback_, SendPacket(ssrc, _, second_capture_time_ms, _, _)) 1106 .Times(1); 1107 } 1108 for (size_t i = 0; i < packets_to_send_per_interval; ++i) { 1109 EXPECT_CALL(callback_, 1110 SendPacket(ssrc_low_priority, _, capture_time_ms, _, _)) 1111 .Times(1); 1112 } 1113 for (size_t i = 0; i < packets_to_send_per_interval; ++i) { 1114 EXPECT_CALL(callback_, SendPacket(ssrc_low_priority, _, 1115 second_capture_time_ms, _, _)) 1116 .Times(1); 1117 } 1118 } 1119 pacer->Resume(); 1120 while (pacer->QueueSizePackets() > 0) { 1121 AdvanceTimeUntil(pacer->NextSendTime()); 1122 pacer->ProcessPackets(); 1123 } 1124 1125 EXPECT_TRUE(pacer->OldestPacketEnqueueTime().IsInfinite()); 1126 } 1127 1128 TEST_F(PacingControllerTest, InactiveFromStart) { 1129 // Recreate the pacer without the inital time forwarding. 1130 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_); 1131 pacer->SetProbingEnabled(false); 1132 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate); 1133 1134 // No packets sent, there should be no keep-alives sent either. 1135 EXPECT_CALL(callback_, SendPadding).Times(0); 1136 EXPECT_CALL(callback_, SendPacket).Times(0); 1137 pacer->ProcessPackets(); 1138 1139 const Timestamp start_time = clock_.CurrentTime(); 1140 1141 // Determine the margin need so we can advance to the last possible moment 1142 // that will not cause a process event. 1143 const TimeDelta time_margin = 1144 PacingController::kMinSleepTime + TimeDelta::Micros(1); 1145 1146 EXPECT_EQ(pacer->NextSendTime() - start_time, 1147 PacingController::kPausedProcessInterval); 1148 clock_.AdvanceTime(PacingController::kPausedProcessInterval - time_margin); 1149 pacer->ProcessPackets(); 1150 EXPECT_EQ(pacer->NextSendTime() - start_time, 1151 PacingController::kPausedProcessInterval); 1152 1153 clock_.AdvanceTime(time_margin); 1154 pacer->ProcessPackets(); 1155 EXPECT_EQ(pacer->NextSendTime() - start_time, 1156 2 * PacingController::kPausedProcessInterval); 1157 } 1158 1159 TEST_F(PacingControllerTest, QueueTimeGrowsOverTime) { 1160 uint32_t ssrc = 12346; 1161 uint16_t sequence_number = 1234; 1162 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_); 1163 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero()); 1164 EXPECT_TRUE(pacer->OldestPacketEnqueueTime().IsInfinite()); 1165 1166 pacer->SetPacingRates(DataRate::BitsPerSec(30000 * kPaceMultiplier), 1167 DataRate::Zero()); 1168 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc, 1169 sequence_number, clock_.TimeInMilliseconds(), 1200); 1170 1171 clock_.AdvanceTimeMilliseconds(500); 1172 EXPECT_EQ(clock_.TimeInMilliseconds() - 500, 1173 pacer->OldestPacketEnqueueTime().ms()); 1174 pacer->ProcessPackets(); 1175 EXPECT_TRUE(pacer->OldestPacketEnqueueTime().IsInfinite()); 1176 } 1177 1178 TEST_F(PacingControllerTest, ProbingWithInsertedPackets) { 1179 const size_t kPacketSize = 1200; 1180 const int kInitialBitrateBps = 300000; 1181 uint32_t ssrc = 12346; 1182 uint16_t sequence_number = 1234; 1183 1184 PacingControllerProbing packet_sender; 1185 auto pacer = 1186 std::make_unique<PacingController>(&clock_, &packet_sender, trials_); 1187 std::vector<ProbeClusterConfig> probe_clusters = { 1188 {.at_time = clock_.CurrentTime(), 1189 .target_data_rate = kFirstClusterRate, 1190 .target_duration = TimeDelta::Millis(15), 1191 .target_probe_count = 5, 1192 .id = 0}, 1193 {.at_time = clock_.CurrentTime(), 1194 .target_data_rate = kSecondClusterRate, 1195 .target_duration = TimeDelta::Millis(15), 1196 .target_probe_count = 5, 1197 .id = 1}}; 1198 pacer->CreateProbeClusters(probe_clusters); 1199 pacer->SetPacingRates( 1200 DataRate::BitsPerSec(kInitialBitrateBps * kPaceMultiplier), 1201 DataRate::Zero()); 1202 1203 for (int i = 0; i < 10; ++i) { 1204 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, ssrc, 1205 sequence_number++, 1206 clock_.TimeInMilliseconds(), kPacketSize)); 1207 } 1208 1209 int64_t start = clock_.TimeInMilliseconds(); 1210 while (packet_sender.packets_sent() < 5) { 1211 AdvanceTimeUntil(pacer->NextSendTime()); 1212 pacer->ProcessPackets(); 1213 } 1214 int packets_sent = packet_sender.packets_sent(); 1215 // Validate first cluster bitrate. Note that we have to account for number 1216 // of intervals and hence (packets_sent - 1) on the first cluster. 1217 EXPECT_NEAR((packets_sent - 1) * kPacketSize * 8000 / 1218 (clock_.TimeInMilliseconds() - start), 1219 kFirstClusterRate.bps(), kProbingErrorMargin.bps()); 1220 // Probing always starts with a small padding packet. 1221 EXPECT_EQ(1, packet_sender.padding_sent()); 1222 1223 AdvanceTimeUntil(pacer->NextSendTime()); 1224 start = clock_.TimeInMilliseconds(); 1225 while (packet_sender.packets_sent() < 10) { 1226 AdvanceTimeUntil(pacer->NextSendTime()); 1227 pacer->ProcessPackets(); 1228 } 1229 packets_sent = packet_sender.packets_sent() - packets_sent; 1230 // Validate second cluster bitrate. 1231 EXPECT_NEAR((packets_sent - 1) * kPacketSize * 8000 / 1232 (clock_.TimeInMilliseconds() - start), 1233 kSecondClusterRate.bps(), kProbingErrorMargin.bps()); 1234 } 1235 1236 TEST_F(PacingControllerTest, SkipsProbesWhenProcessIntervalTooLarge) { 1237 const size_t kPacketSize = 1200; 1238 const int kInitialBitrateBps = 300000; 1239 const uint32_t ssrc = 12346; 1240 const int kProbeClusterId = 3; 1241 1242 uint16_t sequence_number = 1234; 1243 1244 PacingControllerProbing packet_sender; 1245 1246 const FieldTrials trials = 1247 CreateTestFieldTrials("WebRTC-Bwe-ProbingBehavior/max_probe_delay:2ms/"); 1248 auto pacer = 1249 std::make_unique<PacingController>(&clock_, &packet_sender, trials); 1250 pacer->SetPacingRates( 1251 DataRate::BitsPerSec(kInitialBitrateBps * kPaceMultiplier), 1252 DataRate::BitsPerSec(kInitialBitrateBps)); 1253 1254 for (int i = 0; i < 10; ++i) { 1255 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, ssrc, 1256 sequence_number++, 1257 clock_.TimeInMilliseconds(), kPacketSize)); 1258 } 1259 while (pacer->QueueSizePackets() > 0) { 1260 AdvanceTimeUntil(pacer->NextSendTime()); 1261 pacer->ProcessPackets(); 1262 } 1263 1264 // Probe at a very high rate. 1265 std::vector<ProbeClusterConfig> probe_clusters = { 1266 {.at_time = clock_.CurrentTime(), 1267 .target_data_rate = DataRate::KilobitsPerSec(10000), // 10 Mbps, 1268 .target_duration = TimeDelta::Millis(15), 1269 .target_probe_count = 5, 1270 .id = kProbeClusterId}}; 1271 pacer->CreateProbeClusters(probe_clusters); 1272 1273 // We need one packet to start the probe. 1274 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, ssrc, 1275 sequence_number++, 1276 clock_.TimeInMilliseconds(), kPacketSize)); 1277 const int packets_sent_before_probe = packet_sender.packets_sent(); 1278 AdvanceTimeUntil(pacer->NextSendTime()); 1279 pacer->ProcessPackets(); 1280 EXPECT_EQ(packet_sender.packets_sent(), packets_sent_before_probe + 1); 1281 1282 // Figure out how long between probe packets. 1283 Timestamp start_time = clock_.CurrentTime(); 1284 AdvanceTimeUntil(pacer->NextSendTime()); 1285 TimeDelta time_between_probes = clock_.CurrentTime() - start_time; 1286 // Advance that distance again + 1ms. 1287 clock_.AdvanceTime(time_between_probes); 1288 1289 // Send second probe packet. 1290 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, ssrc, 1291 sequence_number++, 1292 clock_.TimeInMilliseconds(), kPacketSize)); 1293 pacer->ProcessPackets(); 1294 EXPECT_EQ(packet_sender.packets_sent(), packets_sent_before_probe + 2); 1295 PacedPacketInfo last_pacing_info = packet_sender.last_pacing_info(); 1296 EXPECT_EQ(last_pacing_info.probe_cluster_id, kProbeClusterId); 1297 1298 // We're exactly where we should be for the next probe. 1299 const Timestamp probe_time = clock_.CurrentTime(); 1300 EXPECT_EQ(pacer->NextSendTime(), clock_.CurrentTime()); 1301 1302 BitrateProberConfig probing_config(&trials); 1303 EXPECT_GT(probing_config.max_probe_delay.Get(), TimeDelta::Zero()); 1304 // Advance to within max probe delay, should still return same target. 1305 clock_.AdvanceTime(probing_config.max_probe_delay.Get()); 1306 EXPECT_EQ(pacer->NextSendTime(), probe_time); 1307 1308 // Too high probe delay, drop it! 1309 clock_.AdvanceTime(TimeDelta::Micros(1)); 1310 1311 int packets_sent_before_timeout = packet_sender.total_packets_sent(); 1312 // Expected next process time is unchanged, but calling should not 1313 // generate new packets. 1314 EXPECT_EQ(pacer->NextSendTime(), probe_time); 1315 pacer->ProcessPackets(); 1316 EXPECT_EQ(packet_sender.total_packets_sent(), packets_sent_before_timeout); 1317 1318 // Next packet sent is not part of probe. 1319 AdvanceTimeUntil(pacer->NextSendTime()); 1320 pacer->ProcessPackets(); 1321 const int expected_probe_id = PacedPacketInfo::kNotAProbe; 1322 EXPECT_EQ(packet_sender.last_pacing_info().probe_cluster_id, 1323 expected_probe_id); 1324 } 1325 1326 TEST_F(PacingControllerTest, ProbingWithPaddingSupport) { 1327 const size_t kPacketSize = 1200; 1328 const int kInitialBitrateBps = 300000; 1329 uint32_t ssrc = 12346; 1330 uint16_t sequence_number = 1234; 1331 1332 PacingControllerProbing packet_sender; 1333 auto pacer = 1334 std::make_unique<PacingController>(&clock_, &packet_sender, trials_); 1335 std::vector<ProbeClusterConfig> probe_clusters = { 1336 {.at_time = clock_.CurrentTime(), 1337 .target_data_rate = kFirstClusterRate, 1338 .target_duration = TimeDelta::Millis(15), 1339 .target_probe_count = 5, 1340 .id = 0}}; 1341 pacer->CreateProbeClusters(probe_clusters); 1342 1343 pacer->SetPacingRates( 1344 DataRate::BitsPerSec(kInitialBitrateBps * kPaceMultiplier), 1345 DataRate::Zero()); 1346 1347 for (int i = 0; i < 3; ++i) { 1348 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, ssrc, 1349 sequence_number++, 1350 clock_.TimeInMilliseconds(), kPacketSize)); 1351 } 1352 1353 int64_t start = clock_.TimeInMilliseconds(); 1354 int process_count = 0; 1355 while (process_count < 5) { 1356 AdvanceTimeUntil(pacer->NextSendTime()); 1357 pacer->ProcessPackets(); 1358 ++process_count; 1359 } 1360 int packets_sent = packet_sender.packets_sent(); 1361 int padding_sent = packet_sender.padding_sent(); 1362 EXPECT_GT(packets_sent, 0); 1363 EXPECT_GT(padding_sent, 0); 1364 // Note that the number of intervals here for kPacketSize is 1365 // packets_sent due to padding in the same cluster. 1366 EXPECT_NEAR((packets_sent * kPacketSize * 8000 + padding_sent) / 1367 (clock_.TimeInMilliseconds() - start), 1368 kFirstClusterRate.bps(), kProbingErrorMargin.bps()); 1369 } 1370 1371 TEST_F(PacingControllerTest, PaddingPacketCanTriggerProbe) { 1372 const int kInitialBitrateBps = 300000; 1373 PacingControllerProbing packet_sender; 1374 auto pacer = 1375 std::make_unique<PacingController>(&clock_, &packet_sender, trials_); 1376 1377 pacer->SetPacingRates( 1378 DataRate::BitsPerSec(kInitialBitrateBps * kPaceMultiplier), 1379 /*padding_rate*/ DataRate::KilobitsPerSec(300)); 1380 1381 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, 1382 /*ssrc=*/123, /*sequence_number=*/1, 1383 clock_.TimeInMilliseconds(), 1384 /*payload_size=*/50)); 1385 1386 for (int i = 0; i < 5; ++i) { 1387 AdvanceTimeUntil(pacer->NextSendTime()); 1388 pacer->ProcessPackets(); 1389 EXPECT_EQ(packet_sender.last_pacing_info().probe_cluster_id, 1390 PacedPacketInfo::kNotAProbe); 1391 } 1392 ASSERT_GT(packet_sender.packets_sent(), 0); 1393 ASSERT_GT(packet_sender.padding_sent(), 0); 1394 1395 const int kProbeClusterId = 1; 1396 std::vector<ProbeClusterConfig> probe_clusters = { 1397 {.at_time = clock_.CurrentTime(), 1398 .target_data_rate = DataRate::KilobitsPerSec(1000), 1399 .target_duration = TimeDelta::Millis(15), 1400 .target_probe_count = 5, 1401 .id = kProbeClusterId}}; 1402 pacer->CreateProbeClusters(probe_clusters); 1403 bool probe_packet_seen = false; 1404 for (int i = 0; i < 5; ++i) { 1405 AdvanceTimeUntil(pacer->NextSendTime()); 1406 pacer->ProcessPackets(); 1407 if (packet_sender.last_pacing_info().probe_cluster_id == kProbeClusterId) { 1408 probe_packet_seen = true; 1409 break; 1410 } 1411 } 1412 EXPECT_TRUE(probe_packet_seen); 1413 } 1414 1415 TEST_F(PacingControllerTest, CanProbeWithPaddingBeforeFirstMediaPacket) { 1416 // const size_t kPacketSize = 1200; 1417 const int kInitialBitrateBps = 300000; 1418 1419 PacingControllerProbing packet_sender; 1420 auto pacer = 1421 std::make_unique<PacingController>(&clock_, &packet_sender, trials_); 1422 pacer->SetAllowProbeWithoutMediaPacket(true); 1423 std::vector<ProbeClusterConfig> probe_clusters = { 1424 {.at_time = clock_.CurrentTime(), 1425 .target_data_rate = kFirstClusterRate, 1426 .target_duration = TimeDelta::Millis(15), 1427 .target_probe_count = 5, 1428 .id = 0}}; 1429 pacer->CreateProbeClusters(probe_clusters); 1430 1431 pacer->SetPacingRates( 1432 DataRate::BitsPerSec(kInitialBitrateBps * kPaceMultiplier), 1433 DataRate::Zero()); 1434 1435 Timestamp start = clock_.CurrentTime(); 1436 Timestamp next_process = pacer->NextSendTime(); 1437 while (clock_.CurrentTime() < start + TimeDelta::Millis(100) && 1438 next_process.IsFinite()) { 1439 AdvanceTimeUntil(next_process); 1440 pacer->ProcessPackets(); 1441 next_process = pacer->NextSendTime(); 1442 } 1443 EXPECT_GT(packet_sender.padding_packets_sent(), 5); 1444 } 1445 1446 TEST_F(PacingControllerTest, ProbeSentAfterSetAllowProbeWithoutMediaPacket) { 1447 const int kInitialBitrateBps = 300000; 1448 1449 PacingControllerProbing packet_sender; 1450 auto pacer = 1451 std::make_unique<PacingController>(&clock_, &packet_sender, trials_); 1452 std::vector<ProbeClusterConfig> probe_clusters = { 1453 {.at_time = clock_.CurrentTime(), 1454 .target_data_rate = kFirstClusterRate, 1455 .target_duration = TimeDelta::Millis(15), 1456 .target_probe_count = 5, 1457 .id = 0}}; 1458 pacer->CreateProbeClusters(probe_clusters); 1459 1460 pacer->SetPacingRates( 1461 DataRate::BitsPerSec(kInitialBitrateBps * kPaceMultiplier), 1462 DataRate::Zero()); 1463 1464 pacer->SetAllowProbeWithoutMediaPacket(true); 1465 1466 Timestamp start = clock_.CurrentTime(); 1467 Timestamp next_process = pacer->NextSendTime(); 1468 while (clock_.CurrentTime() < start + TimeDelta::Millis(100) && 1469 next_process.IsFinite()) { 1470 AdvanceTimeUntil(next_process); 1471 pacer->ProcessPackets(); 1472 next_process = pacer->NextSendTime(); 1473 } 1474 EXPECT_GT(packet_sender.padding_packets_sent(), 5); 1475 } 1476 1477 TEST_F(PacingControllerTest, CanNotProbeWithPaddingIfGeneratePaddingFails) { 1478 // const size_t kPacketSize = 1200; 1479 const int kInitialBitrateBps = 300000; 1480 1481 PacingControllerProbing packet_sender; 1482 packet_sender.SetCanGeneratePadding(false); 1483 auto pacer = 1484 std::make_unique<PacingController>(&clock_, &packet_sender, trials_); 1485 pacer->SetAllowProbeWithoutMediaPacket(true); 1486 std::vector<ProbeClusterConfig> probe_clusters = { 1487 {.at_time = clock_.CurrentTime(), 1488 .target_data_rate = kFirstClusterRate, 1489 .target_duration = TimeDelta::Millis(15), 1490 .target_probe_count = 5, 1491 .id = 0}}; 1492 pacer->CreateProbeClusters(probe_clusters); 1493 1494 pacer->SetPacingRates( 1495 DataRate::BitsPerSec(kInitialBitrateBps * kPaceMultiplier), 1496 DataRate::Zero()); 1497 1498 Timestamp start = clock_.CurrentTime(); 1499 int process_count = 0; 1500 Timestamp next_process = pacer->NextSendTime(); 1501 while (clock_.CurrentTime() < start + TimeDelta::Millis(100) && 1502 next_process.IsFinite()) { 1503 AdvanceTimeUntil(next_process); 1504 pacer->ProcessPackets(); 1505 ++process_count; 1506 next_process = pacer->NextSendTime(); 1507 } 1508 1509 EXPECT_LT(process_count, 10); 1510 EXPECT_EQ(packet_sender.padding_packets_sent(), 0); 1511 } 1512 1513 TEST_F(PacingControllerTest, PaddingOveruse) { 1514 uint32_t ssrc = 12346; 1515 uint16_t sequence_number = 1234; 1516 const size_t kPacketSize = 1200; 1517 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_); 1518 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero()); 1519 1520 // Initially no padding rate. 1521 pacer->ProcessPackets(); 1522 pacer->SetPacingRates(DataRate::BitsPerSec(60000 * kPaceMultiplier), 1523 DataRate::Zero()); 1524 1525 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc, 1526 sequence_number++, clock_.TimeInMilliseconds(), 1527 kPacketSize); 1528 pacer->ProcessPackets(); 1529 1530 // Add 30kbit padding. When increasing budget, media budget will increase from 1531 // negative (overuse) while padding budget will increase from 0. 1532 clock_.AdvanceTimeMilliseconds(5); 1533 pacer->SetPacingRates(DataRate::BitsPerSec(60000 * kPaceMultiplier), 1534 DataRate::BitsPerSec(30000)); 1535 1536 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc, 1537 sequence_number++, clock_.TimeInMilliseconds(), 1538 kPacketSize); 1539 EXPECT_LT(TimeDelta::Millis(5), pacer->ExpectedQueueTime()); 1540 // Don't send padding if queue is non-empty, even if padding budget > 0. 1541 EXPECT_CALL(callback_, SendPadding).Times(0); 1542 AdvanceTimeUntil(pacer->NextSendTime()); 1543 pacer->ProcessPackets(); 1544 } 1545 1546 TEST_F(PacingControllerTest, ProvidesOnBatchCompleteToPacketSender) { 1547 MockPacketSender callback; 1548 auto pacer = std::make_unique<PacingController>(&clock_, &callback, trials_); 1549 EXPECT_CALL(callback, OnBatchComplete); 1550 pacer->ProcessPackets(); 1551 } 1552 1553 TEST_F(PacingControllerTest, ProbeClusterId) { 1554 MockPacketSender callback; 1555 uint32_t ssrc = 12346; 1556 uint16_t sequence_number = 1234; 1557 const size_t kPacketSize = 1200; 1558 1559 auto pacer = std::make_unique<PacingController>(&clock_, &callback, trials_); 1560 pacer->CreateProbeClusters(std::vector<ProbeClusterConfig>( 1561 {{.at_time = clock_.CurrentTime(), 1562 .target_data_rate = kFirstClusterRate, 1563 .target_duration = TimeDelta::Millis(15), 1564 .target_probe_count = 5, 1565 .id = 0}, 1566 {.at_time = clock_.CurrentTime(), 1567 .target_data_rate = kSecondClusterRate, 1568 .target_duration = TimeDelta::Millis(15), 1569 .target_probe_count = 5, 1570 .id = 1}})); 1571 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate); 1572 pacer->SetProbingEnabled(true); 1573 for (int i = 0; i < 10; ++i) { 1574 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, ssrc, 1575 sequence_number++, 1576 clock_.TimeInMilliseconds(), kPacketSize)); 1577 } 1578 1579 // First probing cluster. 1580 EXPECT_CALL(callback, 1581 SendPacket(_, Field(&PacedPacketInfo::probe_cluster_id, 0))) 1582 .Times(5); 1583 1584 for (int i = 0; i < 5; ++i) { 1585 AdvanceTimeUntil(pacer->NextSendTime()); 1586 pacer->ProcessPackets(); 1587 } 1588 1589 // Second probing cluster. 1590 EXPECT_CALL(callback, 1591 SendPacket(_, Field(&PacedPacketInfo::probe_cluster_id, 1))) 1592 .Times(5); 1593 1594 for (int i = 0; i < 5; ++i) { 1595 AdvanceTimeUntil(pacer->NextSendTime()); 1596 pacer->ProcessPackets(); 1597 } 1598 1599 // Needed for the Field comparer below. 1600 const int kNotAProbe = PacedPacketInfo::kNotAProbe; 1601 // No more probing packets. 1602 EXPECT_CALL(callback, GeneratePadding).WillOnce([&](DataSize padding_size) { 1603 std::vector<std::unique_ptr<RtpPacketToSend>> padding_packets; 1604 padding_packets.emplace_back( 1605 BuildPacket(RtpPacketMediaType::kPadding, ssrc, sequence_number++, 1606 clock_.TimeInMilliseconds(), padding_size.bytes())); 1607 return padding_packets; 1608 }); 1609 bool non_probe_packet_seen = false; 1610 EXPECT_CALL(callback, SendPacket) 1611 .WillOnce([&](std::unique_ptr<RtpPacketToSend> /* packet */, 1612 const PacedPacketInfo& cluster_info) { 1613 EXPECT_EQ(cluster_info.probe_cluster_id, kNotAProbe); 1614 non_probe_packet_seen = true; 1615 }); 1616 while (!non_probe_packet_seen) { 1617 AdvanceTimeUntil(pacer->NextSendTime()); 1618 pacer->ProcessPackets(); 1619 } 1620 } 1621 1622 TEST_F(PacingControllerTest, OwnedPacketPrioritizedOnType) { 1623 MockPacketSender callback; 1624 uint32_t ssrc = 123; 1625 1626 auto pacer = std::make_unique<PacingController>(&clock_, &callback, trials_); 1627 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero()); 1628 1629 // Insert a packet of each type, from low to high priority. Since priority 1630 // is weighted higher than insert order, these should come out of the pacer 1631 // in backwards order with the exception of FEC and Video. 1632 1633 for (RtpPacketMediaType type : 1634 {RtpPacketMediaType::kPadding, 1635 RtpPacketMediaType::kForwardErrorCorrection, RtpPacketMediaType::kVideo, 1636 RtpPacketMediaType::kRetransmission, RtpPacketMediaType::kAudio}) { 1637 pacer->EnqueuePacket(BuildPacket(type, ++ssrc, /*sequence_number=*/123, 1638 clock_.TimeInMilliseconds(), 1639 /*size=*/150)); 1640 } 1641 1642 ::testing::InSequence seq; 1643 EXPECT_CALL(callback, 1644 SendPacket(Pointee(Property(&RtpPacketToSend::packet_type, 1645 RtpPacketMediaType::kAudio)), 1646 _)); 1647 EXPECT_CALL(callback, 1648 SendPacket(Pointee(Property(&RtpPacketToSend::packet_type, 1649 RtpPacketMediaType::kRetransmission)), 1650 _)); 1651 1652 // FEC and video actually have the same priority, so will come out in 1653 // insertion order. 1654 EXPECT_CALL( 1655 callback, 1656 SendPacket(Pointee(Property(&RtpPacketToSend::packet_type, 1657 RtpPacketMediaType::kForwardErrorCorrection)), 1658 _)); 1659 EXPECT_CALL(callback, 1660 SendPacket(Pointee(Property(&RtpPacketToSend::packet_type, 1661 RtpPacketMediaType::kVideo)), 1662 _)); 1663 1664 EXPECT_CALL(callback, 1665 SendPacket(Pointee(Property(&RtpPacketToSend::packet_type, 1666 RtpPacketMediaType::kPadding)), 1667 _)); 1668 1669 while (pacer->QueueSizePackets() > 0) { 1670 AdvanceTimeUntil(pacer->NextSendTime()); 1671 pacer->ProcessPackets(); 1672 } 1673 } 1674 1675 TEST_F(PacingControllerTest, SmallFirstProbePacket) { 1676 MockPacketSender callback; 1677 auto pacer = std::make_unique<PacingController>(&clock_, &callback, trials_); 1678 std::vector<ProbeClusterConfig> probe_clusters = { 1679 {.at_time = clock_.CurrentTime(), 1680 .target_data_rate = kFirstClusterRate, 1681 .target_duration = TimeDelta::Millis(15), 1682 .target_probe_count = 5, 1683 .id = 0}}; 1684 pacer->CreateProbeClusters(probe_clusters); 1685 1686 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero()); 1687 1688 // Add high prio media. 1689 pacer->EnqueuePacket(audio_.BuildNextPacket(234)); 1690 1691 // Expect small padding packet to be requested. 1692 EXPECT_CALL(callback, GeneratePadding(DataSize::Bytes(1))) 1693 .WillOnce([&](DataSize /* padding_size */) { 1694 std::vector<std::unique_ptr<RtpPacketToSend>> padding_packets; 1695 padding_packets.emplace_back( 1696 BuildPacket(RtpPacketMediaType::kPadding, kAudioSsrc, 1, 1697 clock_.TimeInMilliseconds(), 1)); 1698 return padding_packets; 1699 }); 1700 1701 size_t packets_sent = 0; 1702 bool media_seen = false; 1703 EXPECT_CALL(callback, SendPacket) 1704 .Times(AnyNumber()) 1705 .WillRepeatedly([&](std::unique_ptr<RtpPacketToSend> packet, 1706 const PacedPacketInfo& /* cluster_info */) { 1707 if (packets_sent == 0) { 1708 EXPECT_EQ(packet->packet_type(), RtpPacketMediaType::kPadding); 1709 } else { 1710 if (packet->packet_type() == RtpPacketMediaType::kAudio) { 1711 media_seen = true; 1712 } 1713 } 1714 packets_sent++; 1715 }); 1716 while (!media_seen) { 1717 pacer->ProcessPackets(); 1718 clock_.AdvanceTimeMilliseconds(5); 1719 } 1720 } 1721 1722 TEST_F(PacingControllerTest, TaskLate) { 1723 // Set a low send rate to more easily test timing issues. 1724 DataRate kSendRate = DataRate::KilobitsPerSec(30); 1725 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_); 1726 pacer->SetPacingRates(kSendRate, DataRate::Zero()); 1727 1728 // Add four packets of equal size and priority. 1729 pacer->EnqueuePacket(video_.BuildNextPacket(1000)); 1730 pacer->EnqueuePacket(video_.BuildNextPacket(1000)); 1731 pacer->EnqueuePacket(video_.BuildNextPacket(1000)); 1732 pacer->EnqueuePacket(video_.BuildNextPacket(1000)); 1733 1734 // Process packets, only first should be sent. 1735 EXPECT_CALL(callback_, SendPacket).Times(1); 1736 pacer->ProcessPackets(); 1737 1738 Timestamp next_send_time = pacer->NextSendTime(); 1739 // Determine time between packets (ca 62ms) 1740 const TimeDelta time_between_packets = next_send_time - clock_.CurrentTime(); 1741 1742 // Simulate a late process call, executed just before we allow sending the 1743 // fourth packet. 1744 const TimeDelta kOffset = TimeDelta::Millis(1); 1745 clock_.AdvanceTime((time_between_packets * 3) - kOffset); 1746 1747 EXPECT_CALL(callback_, SendPacket).Times(2); 1748 pacer->ProcessPackets(); 1749 1750 // Check that next scheduled send time is in ca 1ms. 1751 next_send_time = pacer->NextSendTime(); 1752 const TimeDelta time_left = next_send_time - clock_.CurrentTime(); 1753 EXPECT_EQ(time_left.RoundTo(TimeDelta::Millis(1)), kOffset); 1754 1755 clock_.AdvanceTime(time_left); 1756 EXPECT_CALL(callback_, SendPacket); 1757 pacer->ProcessPackets(); 1758 } 1759 1760 TEST_F(PacingControllerTest, NoProbingWhilePaused) { 1761 uint32_t ssrc = 12345; 1762 uint16_t sequence_number = 1234; 1763 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_); 1764 pacer->SetProbingEnabled(true); 1765 pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero()); 1766 pacer->CreateProbeClusters(std::vector<ProbeClusterConfig>( 1767 {{.at_time = clock_.CurrentTime(), 1768 .target_data_rate = kFirstClusterRate, 1769 .target_duration = TimeDelta::Millis(15), 1770 .target_probe_count = 5, 1771 .id = 0}, 1772 {.at_time = clock_.CurrentTime(), 1773 .target_data_rate = kSecondClusterRate, 1774 .target_duration = TimeDelta::Millis(15), 1775 .target_probe_count = 5, 1776 .id = 1}})); 1777 1778 // Send at least one packet so probing can initate. 1779 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc, 1780 sequence_number, clock_.TimeInMilliseconds(), 250); 1781 while (pacer->QueueSizePackets() > 0) { 1782 AdvanceTimeUntil(pacer->NextSendTime()); 1783 pacer->ProcessPackets(); 1784 } 1785 1786 // Trigger probing. 1787 std::vector<ProbeClusterConfig> probe_clusters = { 1788 {.at_time = clock_.CurrentTime(), 1789 .target_data_rate = DataRate::KilobitsPerSec(10000), // 10 Mbps. 1790 .target_duration = TimeDelta::Millis(15), 1791 .target_probe_count = 5, 1792 .id = 3}}; 1793 pacer->CreateProbeClusters(probe_clusters); 1794 1795 // Time to next send time should be small. 1796 EXPECT_LT(pacer->NextSendTime() - clock_.CurrentTime(), 1797 PacingController::kPausedProcessInterval); 1798 1799 // Pause pacer, time to next send time should now be the pause process 1800 // interval. 1801 pacer->Pause(); 1802 1803 EXPECT_EQ(pacer->NextSendTime() - clock_.CurrentTime(), 1804 PacingController::kPausedProcessInterval); 1805 } 1806 1807 TEST_F(PacingControllerTest, AudioNotPacedEvenWhenAccountedFor) { 1808 const uint32_t kSsrc = 12345; 1809 uint16_t sequence_number = 1234; 1810 const size_t kPacketSize = 123; 1811 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_); 1812 1813 // Account for audio - so that audio packets can cause pushback on other 1814 // types such as video. Audio packet should still be immediated passed 1815 // through though ("WebRTC-Pacer-BlockAudio" needs to be enabled in order 1816 // to pace audio packets). 1817 pacer->SetAccountForAudioPackets(true); 1818 1819 // Set pacing rate to 1 packet/s, no padding. 1820 pacer->SetPacingRates(DataSize::Bytes(kPacketSize) / TimeDelta::Seconds(1), 1821 DataRate::Zero()); 1822 1823 // Add and send an audio packet. 1824 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kAudio, kSsrc, 1825 sequence_number++, clock_.TimeInMilliseconds(), 1826 kPacketSize); 1827 pacer->ProcessPackets(); 1828 1829 // Advance time, add another audio packet and process. It should be sent 1830 // immediately. 1831 clock_.AdvanceTimeMilliseconds(5); 1832 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kAudio, kSsrc, 1833 sequence_number++, clock_.TimeInMilliseconds(), 1834 kPacketSize); 1835 pacer->ProcessPackets(); 1836 } 1837 1838 TEST_F(PacingControllerTest, 1839 PaddingResumesAfterSaturationEvenWithConcurrentAudio) { 1840 const uint32_t kSsrc = 12345; 1841 const DataRate kPacingDataRate = DataRate::KilobitsPerSec(125); 1842 const DataRate kPaddingDataRate = DataRate::KilobitsPerSec(100); 1843 const TimeDelta kMaxBufferInTime = TimeDelta::Millis(500); 1844 const DataSize kPacketSize = DataSize::Bytes(130); 1845 const TimeDelta kAudioPacketInterval = TimeDelta::Millis(20); 1846 1847 // In this test, we fist send a burst of video in order to saturate the 1848 // padding debt level. 1849 // We then proceed to send audio at a bitrate that is slightly lower than 1850 // the padding rate, meaning there will be a period with audio but no 1851 // padding sent while the debt is draining, then audio and padding will 1852 // be interlieved. 1853 1854 // Verify both with and without accounting for audio. 1855 for (bool account_for_audio : {false, true}) { 1856 uint16_t sequence_number = 1234; 1857 MockPacketSender callback; 1858 EXPECT_CALL(callback, SendPacket).Times(AnyNumber()); 1859 auto pacer = 1860 std::make_unique<PacingController>(&clock_, &callback, trials_); 1861 pacer->SetAccountForAudioPackets(account_for_audio); 1862 1863 // First, saturate the padding budget. 1864 pacer->SetPacingRates(kPacingDataRate, kPaddingDataRate); 1865 1866 const TimeDelta kPaddingSaturationTime = 1867 kMaxBufferInTime * kPaddingDataRate / 1868 (kPacingDataRate - kPaddingDataRate); 1869 const DataSize kVideoToSend = kPaddingSaturationTime * kPacingDataRate; 1870 const DataSize kVideoPacketSize = DataSize::Bytes(1200); 1871 DataSize video_sent = DataSize::Zero(); 1872 while (video_sent < kVideoToSend) { 1873 pacer->EnqueuePacket( 1874 BuildPacket(RtpPacketMediaType::kVideo, kSsrc, sequence_number++, 1875 clock_.TimeInMilliseconds(), kVideoPacketSize.bytes())); 1876 video_sent += kVideoPacketSize; 1877 } 1878 while (pacer->QueueSizePackets() > 0) { 1879 AdvanceTimeUntil(pacer->NextSendTime()); 1880 pacer->ProcessPackets(); 1881 } 1882 1883 // Add a stream of audio packets at a rate slightly lower than the padding 1884 // rate, once the padding debt is paid off we expect padding to be 1885 // generated. 1886 pacer->SetPacingRates(kPacingDataRate, kPaddingDataRate); 1887 bool padding_seen = false; 1888 EXPECT_CALL(callback, GeneratePadding).WillOnce([&](DataSize padding_size) { 1889 padding_seen = true; 1890 std::vector<std::unique_ptr<RtpPacketToSend>> padding_packets; 1891 padding_packets.emplace_back( 1892 BuildPacket(RtpPacketMediaType::kPadding, kSsrc, sequence_number++, 1893 clock_.TimeInMilliseconds(), padding_size.bytes())); 1894 return padding_packets; 1895 }); 1896 1897 Timestamp start_time = clock_.CurrentTime(); 1898 Timestamp last_audio_time = start_time; 1899 while (!padding_seen) { 1900 Timestamp now = clock_.CurrentTime(); 1901 Timestamp next_send_time = pacer->NextSendTime(); 1902 TimeDelta sleep_time = 1903 std::min(next_send_time, last_audio_time + kAudioPacketInterval) - 1904 now; 1905 clock_.AdvanceTime(sleep_time); 1906 while (clock_.CurrentTime() >= last_audio_time + kAudioPacketInterval) { 1907 pacer->EnqueuePacket( 1908 BuildPacket(RtpPacketMediaType::kAudio, kSsrc, sequence_number++, 1909 clock_.TimeInMilliseconds(), kPacketSize.bytes())); 1910 last_audio_time += kAudioPacketInterval; 1911 } 1912 pacer->ProcessPackets(); 1913 } 1914 1915 // Verify how long it took to drain the padding debt. Allow 2% error margin. 1916 const DataRate kAudioDataRate = kPacketSize / kAudioPacketInterval; 1917 const TimeDelta expected_drain_time = 1918 account_for_audio ? (kMaxBufferInTime * kPaddingDataRate / 1919 (kPaddingDataRate - kAudioDataRate)) 1920 : kMaxBufferInTime; 1921 const TimeDelta actual_drain_time = clock_.CurrentTime() - start_time; 1922 EXPECT_NEAR(actual_drain_time.ms(), expected_drain_time.ms(), 1923 expected_drain_time.ms() * 0.02) 1924 << " where account_for_audio = " 1925 << (account_for_audio ? "true" : "false"); 1926 } 1927 } 1928 1929 TEST_F(PacingControllerTest, AccountsForAudioEnqueueTime) { 1930 const uint32_t kSsrc = 12345; 1931 const DataRate kPacingDataRate = DataRate::KilobitsPerSec(125); 1932 const DataRate kPaddingDataRate = DataRate::Zero(); 1933 const DataSize kPacketSize = DataSize::Bytes(130); 1934 const TimeDelta kPacketPacingTime = kPacketSize / kPacingDataRate; 1935 uint32_t sequnce_number = 1; 1936 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_); 1937 // Audio not paced, but still accounted for in budget. 1938 pacer->SetAccountForAudioPackets(true); 1939 pacer->SetPacingRates(kPacingDataRate, kPaddingDataRate); 1940 pacer->SetSendBurstInterval(TimeDelta::Zero()); 1941 1942 // Enqueue two audio packets, advance clock to where one packet 1943 // should have drained the buffer already, has they been sent 1944 // immediately. 1945 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kAudio, kSsrc, 1946 sequnce_number++, clock_.TimeInMilliseconds(), 1947 kPacketSize.bytes()); 1948 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kAudio, kSsrc, 1949 sequnce_number++, clock_.TimeInMilliseconds(), 1950 kPacketSize.bytes()); 1951 clock_.AdvanceTime(kPacketPacingTime); 1952 // Now process and make sure both packets were sent. 1953 pacer->ProcessPackets(); 1954 ::testing::Mock::VerifyAndClearExpectations(&callback_); 1955 1956 // Add a video packet. I can't be sent until debt from audio 1957 // packets have been drained. 1958 pacer->EnqueuePacket( 1959 BuildPacket(RtpPacketMediaType::kVideo, kSsrc + 1, sequnce_number++, 1960 clock_.TimeInMilliseconds(), kPacketSize.bytes())); 1961 EXPECT_EQ(pacer->NextSendTime() - clock_.CurrentTime(), kPacketPacingTime); 1962 } 1963 1964 TEST_F(PacingControllerTest, NextSendTimeAccountsForPadding) { 1965 const uint32_t kSsrc = 12345; 1966 const DataRate kPacingDataRate = DataRate::KilobitsPerSec(125); 1967 const DataSize kPacketSize = DataSize::Bytes(130); 1968 const TimeDelta kPacketPacingTime = kPacketSize / kPacingDataRate; 1969 uint32_t sequnce_number = 1; 1970 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_); 1971 1972 // Start with no padding. 1973 pacer->SetPacingRates(kPacingDataRate, DataRate::Zero()); 1974 1975 // Send a single packet. 1976 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, kSsrc, 1977 sequnce_number++, clock_.TimeInMilliseconds(), 1978 kPacketSize.bytes()); 1979 pacer->ProcessPackets(); 1980 ::testing::Mock::VerifyAndClearExpectations(&callback_); 1981 1982 // With current conditions, no need to wake until next keep-alive. 1983 EXPECT_EQ(pacer->NextSendTime() - clock_.CurrentTime(), 1984 PacingController::kPausedProcessInterval); 1985 1986 // Enqueue a new packet, that can be sent immediately due to default burst 1987 // rate is 40ms. 1988 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, kSsrc, 1989 sequnce_number++, clock_.TimeInMilliseconds(), 1990 kPacketSize.bytes()); 1991 EXPECT_EQ(pacer->NextSendTime() - clock_.CurrentTime(), TimeDelta::Zero()); 1992 pacer->ProcessPackets(); 1993 ::testing::Mock::VerifyAndClearExpectations(&callback_); 1994 1995 // With current conditions, again no need to wake until next keep-alive. 1996 EXPECT_EQ(pacer->NextSendTime() - clock_.CurrentTime(), 1997 PacingController::kPausedProcessInterval); 1998 1999 // Set a non-zero padding rate. Padding also can't be sent until 2000 // previous debt has cleared. Since padding was disabled before, there 2001 // currently is no padding debt. 2002 pacer->SetPacingRates(kPacingDataRate, kPacingDataRate / 2); 2003 EXPECT_EQ(pacer->QueueSizePackets(), 0u); 2004 EXPECT_LT(pacer->NextSendTime() - clock_.CurrentTime(), 2005 PacingController::kDefaultBurstInterval); 2006 2007 // Advance time, expect padding. 2008 EXPECT_CALL(callback_, SendPadding).WillOnce(Return(kPacketSize.bytes())); 2009 clock_.AdvanceTime(pacer->NextSendTime() - clock_.CurrentTime()); 2010 pacer->ProcessPackets(); 2011 ::testing::Mock::VerifyAndClearExpectations(&callback_); 2012 2013 // Since padding rate is half of pacing rate, next time we can send 2014 // padding is double the packet pacing time. 2015 EXPECT_EQ(pacer->NextSendTime() - clock_.CurrentTime(), 2016 kPacketPacingTime * 2); 2017 2018 // Insert a packet to be sent, this take precedence again. 2019 pacer->EnqueuePacket( 2020 BuildPacket(RtpPacketMediaType::kVideo, kSsrc, sequnce_number++, 2021 clock_.TimeInMilliseconds(), kPacketSize.bytes())); 2022 EXPECT_EQ(pacer->NextSendTime(), clock_.CurrentTime()); 2023 } 2024 2025 TEST_F(PacingControllerTest, PaddingTargetAccountsForPaddingRate) { 2026 // Target size for a padding packet is 5ms * padding rate. 2027 const TimeDelta kPaddingTarget = TimeDelta::Millis(5); 2028 srand(0); 2029 // Need to initialize PacingController after we initialize clock. 2030 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_); 2031 2032 const uint32_t kSsrc = 12345; 2033 const DataRate kPacingDataRate = DataRate::KilobitsPerSec(125); 2034 const DataSize kPacketSize = DataSize::Bytes(130); 2035 2036 uint32_t sequnce_number = 1; 2037 2038 // Start with pacing and padding rate equal. 2039 pacer->SetPacingRates(kPacingDataRate, kPacingDataRate); 2040 2041 // Send a single packet. 2042 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, kSsrc, 2043 sequnce_number++, clock_.TimeInMilliseconds(), 2044 kPacketSize.bytes()); 2045 AdvanceTimeUntil(pacer->NextSendTime()); 2046 pacer->ProcessPackets(); 2047 ::testing::Mock::VerifyAndClearExpectations(&callback_); 2048 2049 size_t expected_padding_target_bytes = 2050 (kPaddingTarget * kPacingDataRate).bytes(); 2051 EXPECT_CALL(callback_, SendPadding(expected_padding_target_bytes)) 2052 .WillOnce(Return(expected_padding_target_bytes)); 2053 AdvanceTimeUntil(pacer->NextSendTime()); 2054 pacer->ProcessPackets(); 2055 2056 // Half the padding rate - expect half the padding target. 2057 pacer->SetPacingRates(kPacingDataRate, kPacingDataRate / 2); 2058 EXPECT_CALL(callback_, SendPadding(expected_padding_target_bytes / 2)) 2059 .WillOnce(Return(expected_padding_target_bytes / 2)); 2060 AdvanceTimeUntil(pacer->NextSendTime()); 2061 pacer->ProcessPackets(); 2062 } 2063 2064 TEST_F(PacingControllerTest, SendsFecPackets) { 2065 const uint32_t kSsrc = 12345; 2066 const uint32_t kFlexSsrc = 54321; 2067 uint16_t sequence_number = 1234; 2068 uint16_t flexfec_sequence_number = 4321; 2069 const size_t kPacketSize = 123; 2070 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_); 2071 2072 // Set pacing rate to 1000 packet/s, no padding. 2073 pacer->SetPacingRates( 2074 DataSize::Bytes(1000 * kPacketSize) / TimeDelta::Seconds(1), 2075 DataRate::Zero()); 2076 2077 int64_t now = clock_.TimeInMilliseconds(); 2078 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, kSsrc, 2079 sequence_number, now, kPacketSize)); 2080 EXPECT_CALL(callback_, SendPacket(kSsrc, sequence_number, now, false, false)); 2081 EXPECT_CALL(callback_, FetchFec).WillOnce([&]() { 2082 EXPECT_CALL(callback_, SendPacket(kFlexSsrc, flexfec_sequence_number, now, 2083 false, false)); 2084 EXPECT_CALL(callback_, FetchFec); 2085 std::vector<std::unique_ptr<RtpPacketToSend>> fec_packets; 2086 fec_packets.push_back( 2087 BuildPacket(RtpPacketMediaType::kForwardErrorCorrection, kFlexSsrc, 2088 flexfec_sequence_number, now, kPacketSize)); 2089 return fec_packets; 2090 }); 2091 AdvanceTimeUntil(pacer->NextSendTime()); 2092 pacer->ProcessPackets(); 2093 AdvanceTimeUntil(pacer->NextSendTime()); 2094 pacer->ProcessPackets(); 2095 } 2096 2097 TEST_F(PacingControllerTest, GapInPacingDoesntAccumulateBudget) { 2098 const uint32_t kSsrc = 12345; 2099 uint16_t sequence_number = 1234; 2100 const DataSize kPackeSize = DataSize::Bytes(1000); 2101 const TimeDelta kPacketSendTime = TimeDelta::Millis(25); 2102 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_); 2103 2104 pacer->SetPacingRates(kPackeSize / kPacketSendTime, 2105 /*padding_rate=*/DataRate::Zero()); 2106 2107 // Send an initial packet. 2108 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, kSsrc, 2109 sequence_number++, clock_.TimeInMilliseconds(), 2110 kPackeSize.bytes()); 2111 pacer->ProcessPackets(); 2112 ::testing::Mock::VerifyAndClearExpectations(&callback_); 2113 2114 // Advance time kPacketSendTime past where the media debt should be 0. 2115 clock_.AdvanceTime(2 * kPacketSendTime); 2116 2117 // Enqueue three new packets. Expect only two to be sent one ProcessPackets() 2118 // since the default burst interval is 40ms. 2119 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, kSsrc, 2120 sequence_number++, clock_.TimeInMilliseconds(), 2121 kPackeSize.bytes()); 2122 SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, kSsrc, 2123 sequence_number++, clock_.TimeInMilliseconds(), 2124 kPackeSize.bytes()); 2125 EXPECT_CALL(callback_, SendPacket(kSsrc, sequence_number + 1, _, _, _)) 2126 .Times(0); 2127 pacer->EnqueuePacket( 2128 BuildPacket(RtpPacketMediaType::kVideo, kSsrc, sequence_number + 1, 2129 clock_.TimeInMilliseconds(), kPackeSize.bytes())); 2130 2131 pacer->ProcessPackets(); 2132 } 2133 2134 TEST_F(PacingControllerTest, HandlesSubMicrosecondSendIntervals) { 2135 static constexpr DataSize kPacketSize = DataSize::Bytes(1); 2136 static constexpr TimeDelta kPacketSendTime = TimeDelta::Micros(1); 2137 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_); 2138 pacer->SetSendBurstInterval(TimeDelta::Zero()); 2139 2140 // Set pacing rate such that a packet is sent in 0.5us. 2141 pacer->SetPacingRates(/*pacing_rate=*/2 * kPacketSize / kPacketSendTime, 2142 /*padding_rate=*/DataRate::Zero()); 2143 2144 // Enqueue three packets, the first two should be sent immediately - the third 2145 // should cause a non-zero delta to the next process time. 2146 EXPECT_CALL(callback_, SendPacket).Times(2); 2147 for (int i = 0; i < 3; ++i) { 2148 pacer->EnqueuePacket(BuildPacket( 2149 RtpPacketMediaType::kVideo, /*ssrc=*/12345, /*sequence_number=*/i, 2150 clock_.TimeInMilliseconds(), kPacketSize.bytes())); 2151 } 2152 pacer->ProcessPackets(); 2153 2154 EXPECT_GT(pacer->NextSendTime(), clock_.CurrentTime()); 2155 } 2156 2157 TEST_F(PacingControllerTest, HandlesSubMicrosecondPaddingInterval) { 2158 static constexpr DataSize kPacketSize = DataSize::Bytes(1); 2159 static constexpr TimeDelta kPacketSendTime = TimeDelta::Micros(1); 2160 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_); 2161 2162 // Set both pacing and padding rates to 1 byte per 0.5us. 2163 pacer->SetPacingRates(/*pacing_rate=*/2 * kPacketSize / kPacketSendTime, 2164 /*padding_rate=*/2 * kPacketSize / kPacketSendTime); 2165 2166 // Enqueue and send one packet. 2167 EXPECT_CALL(callback_, SendPacket); 2168 pacer->EnqueuePacket(BuildPacket( 2169 RtpPacketMediaType::kVideo, /*ssrc=*/12345, /*sequence_number=*/1234, 2170 clock_.TimeInMilliseconds(), kPacketSize.bytes())); 2171 pacer->ProcessPackets(); 2172 2173 // The padding debt is now 1 byte, and the pacing time for that is lower than 2174 // the precision of a TimeStamp tick. Make sure the pacer still indicates a 2175 // non-zero sleep time is needed until the next process. 2176 EXPECT_GT(pacer->NextSendTime(), clock_.CurrentTime()); 2177 } 2178 2179 TEST_F(PacingControllerTest, SendsPacketsInBurstImmediately) { 2180 constexpr TimeDelta kMaxDelay = TimeDelta::Millis(20); 2181 PacingController pacer(&clock_, &callback_, trials_); 2182 pacer.SetSendBurstInterval(kMaxDelay); 2183 pacer.SetPacingRates(DataRate::BytesPerSec(10000), DataRate::Zero()); 2184 2185 // Max allowed send burst size is 100000*20/1000) = 200byte 2186 pacer.EnqueuePacket(video_.BuildNextPacket(100)); 2187 pacer.EnqueuePacket(video_.BuildNextPacket(100)); 2188 pacer.EnqueuePacket(video_.BuildNextPacket(100)); 2189 pacer.ProcessPackets(); 2190 EXPECT_EQ(pacer.QueueSizePackets(), 1u); 2191 EXPECT_EQ(pacer.NextSendTime(), clock_.CurrentTime() + kMaxDelay); 2192 2193 AdvanceTimeUntil(pacer.NextSendTime()); 2194 pacer.ProcessPackets(); 2195 EXPECT_EQ(pacer.QueueSizePackets(), 0u); 2196 } 2197 2198 TEST_F(PacingControllerTest, SendsPacketsInBurstEvenIfNotEnqueedAtSameTime) { 2199 constexpr TimeDelta kMaxDelay = TimeDelta::Millis(20); 2200 PacingController pacer(&clock_, &callback_, trials_); 2201 pacer.SetSendBurstInterval(kMaxDelay); 2202 pacer.SetPacingRates(DataRate::BytesPerSec(10000), DataRate::Zero()); 2203 pacer.EnqueuePacket(video_.BuildNextPacket(200)); 2204 EXPECT_EQ(pacer.NextSendTime(), clock_.CurrentTime()); 2205 pacer.ProcessPackets(); 2206 clock_.AdvanceTime(TimeDelta::Millis(1)); 2207 pacer.EnqueuePacket(video_.BuildNextPacket(200)); 2208 EXPECT_EQ(pacer.NextSendTime(), clock_.CurrentTime()); 2209 pacer.ProcessPackets(); 2210 EXPECT_EQ(pacer.QueueSizePackets(), 0u); 2211 } 2212 2213 TEST_F(PacingControllerTest, RespectsTargetRateWhenSendingPacketsInBursts) { 2214 PacingController pacer(&clock_, &callback_, trials_); 2215 pacer.SetSendBurstInterval(TimeDelta::Millis(20)); 2216 pacer.SetAccountForAudioPackets(true); 2217 pacer.SetPacingRates(DataRate::KilobitsPerSec(1000), DataRate::Zero()); 2218 Timestamp start_time = clock_.CurrentTime(); 2219 // Inject 100 packets, with size 1000bytes over 100ms. 2220 // Expect only 1Mbps / (8*1000) / 10 = 12 packets to be sent. 2221 // Packets are sent in burst. Each burst is then 3 packets * 1000bytes at 2222 // 1Mbits = 24ms long. Thus, expect 4 bursts. 2223 EXPECT_CALL(callback_, SendPacket).Times(12); 2224 int number_of_bursts = 0; 2225 while (clock_.CurrentTime() < start_time + TimeDelta::Millis(100)) { 2226 pacer.EnqueuePacket(video_.BuildNextPacket(1000)); 2227 pacer.EnqueuePacket(video_.BuildNextPacket(1000)); 2228 pacer.EnqueuePacket(video_.BuildNextPacket(1000)); 2229 pacer.EnqueuePacket(video_.BuildNextPacket(1000)); 2230 pacer.EnqueuePacket(video_.BuildNextPacket(1000)); 2231 if (pacer.NextSendTime() <= clock_.CurrentTime()) { 2232 pacer.ProcessPackets(); 2233 ++number_of_bursts; 2234 } 2235 clock_.AdvanceTime(TimeDelta::Millis(5)); 2236 } 2237 EXPECT_EQ(pacer.QueueSizePackets(), 88u); 2238 EXPECT_EQ(number_of_bursts, 4); 2239 } 2240 2241 TEST_F(PacingControllerTest, 2242 MaxBurstSizeLimitedAtHighPacingRateWhenSendingPacketsInBursts) { 2243 NiceMock<MockPacketSender> callback; 2244 PacingController pacer(&clock_, &callback, trials_); 2245 pacer.SetSendBurstInterval(TimeDelta::Millis(100)); 2246 pacer.SetPacingRates(DataRate::KilobitsPerSec(10'000), DataRate::Zero()); 2247 2248 size_t sent_size_in_burst = 0; 2249 EXPECT_CALL(callback, SendPacket) 2250 .WillRepeatedly([&](std::unique_ptr<RtpPacketToSend> packet, 2251 const PacedPacketInfo& /* cluster_info */) { 2252 sent_size_in_burst += packet->size(); 2253 }); 2254 2255 // Enqueue 200 packets from a 200Kb encoded frame. 2256 for (int i = 0; i < 200; ++i) { 2257 pacer.EnqueuePacket(video_.BuildNextPacket(1000)); 2258 } 2259 2260 while (pacer.QueueSizePackets() > 70) { 2261 pacer.ProcessPackets(); 2262 EXPECT_NEAR(sent_size_in_burst, PacingController::kMaxBurstSize.bytes(), 2263 1000); 2264 sent_size_in_burst = 0; 2265 TimeDelta time_to_next = pacer.NextSendTime() - clock_.CurrentTime(); 2266 EXPECT_NEAR(time_to_next.ms(), 50, 2); 2267 clock_.AdvanceTime(time_to_next); 2268 } 2269 } 2270 2271 TEST_F(PacingControllerTest, RespectsQueueTimeLimit) { 2272 static constexpr DataSize kPacketSize = DataSize::Bytes(100); 2273 static constexpr DataRate kNominalPacingRate = DataRate::KilobitsPerSec(200); 2274 static constexpr TimeDelta kPacketPacingTime = 2275 kPacketSize / kNominalPacingRate; 2276 static constexpr TimeDelta kQueueTimeLimit = TimeDelta::Millis(1000); 2277 2278 PacingController pacer(&clock_, &callback_, trials_); 2279 pacer.SetPacingRates(kNominalPacingRate, /*padding_rate=*/DataRate::Zero()); 2280 pacer.SetQueueTimeLimit(kQueueTimeLimit); 2281 2282 // Fill pacer up to queue time limit. 2283 static constexpr int kNumPackets = kQueueTimeLimit / kPacketPacingTime; 2284 for (int i = 0; i < kNumPackets; ++i) { 2285 pacer.EnqueuePacket(video_.BuildNextPacket(kPacketSize.bytes())); 2286 } 2287 EXPECT_EQ(pacer.ExpectedQueueTime(), kQueueTimeLimit); 2288 EXPECT_EQ(pacer.pacing_rate(), kNominalPacingRate); 2289 2290 // Double the amount of packets in the queue, the queue time limit should 2291 // effectively double the pacing rate in response. 2292 for (int i = 0; i < kNumPackets; ++i) { 2293 pacer.EnqueuePacket(video_.BuildNextPacket(kPacketSize.bytes())); 2294 } 2295 EXPECT_EQ(pacer.ExpectedQueueTime(), kQueueTimeLimit); 2296 EXPECT_EQ(pacer.pacing_rate(), 2 * kNominalPacingRate); 2297 2298 // Send all the packets, should take as long as the queue time limit. 2299 Timestamp start_time = clock_.CurrentTime(); 2300 while (pacer.QueueSizePackets() > 0) { 2301 AdvanceTimeUntil(pacer.NextSendTime()); 2302 pacer.ProcessPackets(); 2303 } 2304 EXPECT_EQ(clock_.CurrentTime() - start_time, kQueueTimeLimit); 2305 2306 // We're back in a normal state - pacing rate should be back to previous 2307 // levels. 2308 EXPECT_EQ(pacer.pacing_rate(), kNominalPacingRate); 2309 } 2310 2311 TEST_F(PacingControllerTest, BudgetDoesNotAffectRetransmissionInsTrial) { 2312 const DataSize kPacketSize = DataSize::Bytes(1000); 2313 2314 EXPECT_CALL(callback_, SendPadding).Times(0); 2315 const FieldTrials trials = 2316 CreateTestFieldTrials("WebRTC-Pacer-FastRetransmissions/Enabled/"); 2317 PacingController pacer(&clock_, &callback_, trials); 2318 pacer.SetPacingRates(kTargetRate, /*padding_rate=*/DataRate::Zero()); 2319 2320 // Send a video packet so that we have a bit debt. 2321 pacer.EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, kVideoSsrc, 2322 /*sequence_number=*/1, 2323 /*capture_time_ms=*/1, kPacketSize.bytes())); 2324 EXPECT_CALL(callback_, SendPacket); 2325 pacer.ProcessPackets(); 2326 EXPECT_GT(pacer.NextSendTime(), clock_.CurrentTime()); 2327 2328 // A retransmission packet should still be immediately processed. 2329 EXPECT_CALL(callback_, SendPacket); 2330 pacer.EnqueuePacket(BuildPacket(RtpPacketMediaType::kRetransmission, 2331 kVideoSsrc, 2332 /*sequence_number=*/1, 2333 /*capture_time_ms=*/1, kPacketSize.bytes())); 2334 pacer.ProcessPackets(); 2335 } 2336 2337 TEST_F(PacingControllerTest, AbortsAfterReachingCircuitBreakLimit) { 2338 const DataSize kPacketSize = DataSize::Bytes(1000); 2339 2340 EXPECT_CALL(callback_, SendPadding).Times(0); 2341 PacingController pacer(&clock_, &callback_, trials_); 2342 pacer.SetPacingRates(kTargetRate, /*padding_rate=*/DataRate::Zero()); 2343 2344 // Set the circuit breaker to abort after one iteration of the main 2345 // sending loop. 2346 pacer.SetCircuitBreakerThreshold(1); 2347 EXPECT_CALL(callback_, SendPacket).Times(1); 2348 2349 // Send two packets. 2350 pacer.EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, kVideoSsrc, 2351 /*sequence_number=*/1, 2352 /*capture_time_ms=*/1, kPacketSize.bytes())); 2353 pacer.EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, kVideoSsrc, 2354 /*sequence_number=*/2, 2355 /*capture_time_ms=*/2, kPacketSize.bytes())); 2356 2357 // Advance time to way past where both should be eligible for sending. 2358 clock_.AdvanceTime(TimeDelta::Seconds(1)); 2359 2360 pacer.ProcessPackets(); 2361 } 2362 2363 TEST_F(PacingControllerTest, DoesNotPadIfProcessThreadIsBorked) { 2364 PacingControllerPadding callback; 2365 PacingController pacer(&clock_, &callback, trials_); 2366 2367 // Set both pacing and padding rate to be non-zero. 2368 pacer.SetPacingRates(kTargetRate, /*padding_rate=*/kTargetRate); 2369 2370 // Add one packet to the queue, but do not send it yet. 2371 pacer.EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, kVideoSsrc, 2372 /*sequence_number=*/1, 2373 /*capture_time_ms=*/1, 2374 /*size=*/1000)); 2375 2376 // Advance time to waaay after the packet should have been sent. 2377 clock_.AdvanceTime(TimeDelta::Seconds(42)); 2378 2379 // `ProcessPackets()` should send the delayed packet, followed by a small 2380 // amount of missed padding. 2381 pacer.ProcessPackets(); 2382 2383 // The max padding window is the max replay duration + the target padding 2384 // duration. 2385 const DataSize kMaxPadding = (PacingController::kMaxPaddingReplayDuration + 2386 PacingController::kTargetPaddingDuration) * 2387 kTargetRate; 2388 2389 EXPECT_LE(callback.padding_sent(), kMaxPadding.bytes<size_t>()); 2390 } 2391 2392 TEST_F(PacingControllerTest, FlushesPacketsOnKeyFrames) { 2393 const uint32_t kSsrc = 12345; 2394 const uint32_t kRtxSsrc = 12346; 2395 2396 const FieldTrials trials = 2397 CreateTestFieldTrials("WebRTC-Pacer-KeyframeFlushing/Enabled/"); 2398 auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials); 2399 EXPECT_CALL(callback_, GetRtxSsrcForMedia(kSsrc)) 2400 .WillRepeatedly(Return(kRtxSsrc)); 2401 pacer->SetPacingRates(kTargetRate, DataRate::Zero()); 2402 2403 // Enqueue a video packet and a retransmission of that video stream. 2404 pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, kSsrc, 2405 /*sequence_number=*/1, /*capture_time_ms=*/1, 2406 /*size_bytes=*/100)); 2407 pacer->EnqueuePacket( 2408 BuildPacket(RtpPacketMediaType::kRetransmission, kRtxSsrc, 2409 /*sequence_number=*/10, /*capture_time_ms=*/1, 2410 /*size_bytes=*/100)); 2411 EXPECT_EQ(pacer->QueueSizePackets(), 2u); 2412 2413 // Enqueue the first packet of a keyframe for said stream. 2414 auto packet = BuildPacket(RtpPacketMediaType::kVideo, kSsrc, 2415 /*sequence_number=*/2, /*capture_time_ms=*/2, 2416 /*size_bytes=*/1000); 2417 packet->set_is_key_frame(true); 2418 packet->set_first_packet_of_frame(true); 2419 pacer->EnqueuePacket(std::move(packet)); 2420 2421 // Only they new keyframe packet should be left in the queue. 2422 EXPECT_EQ(pacer->QueueSizePackets(), 1u); 2423 2424 EXPECT_CALL(callback_, SendPacket(kSsrc, /*sequence_number=*/2, 2425 /*timestamp=*/2, /*is_retrnamission=*/false, 2426 /*is_padding=*/false)); 2427 AdvanceTimeUntil(pacer->NextSendTime()); 2428 pacer->ProcessPackets(); 2429 } 2430 2431 TEST_F(PacingControllerTest, CanControlQueueSizeUsingTtl) { 2432 const uint32_t kSsrc = 54321; 2433 uint16_t sequence_number = 1234; 2434 2435 PacingController::Configuration config; 2436 config.drain_large_queues = false; 2437 config.packet_queue_ttl.video = TimeDelta::Millis(500); 2438 auto pacer = 2439 std::make_unique<PacingController>(&clock_, &callback_, trials_, config); 2440 pacer->SetPacingRates(DataRate::BitsPerSec(100'000), DataRate::Zero()); 2441 2442 Timestamp send_time = Timestamp::Zero(); 2443 for (int i = 0; i < 100; ++i) { 2444 // Enqueue a new audio and video frame every 33ms. 2445 if (clock_.CurrentTime() - send_time > TimeDelta::Millis(33)) { 2446 for (int j = 0; j < 3; ++j) { 2447 auto packet = BuildPacket(RtpPacketMediaType::kVideo, kSsrc, 2448 /*sequence_number=*/++sequence_number, 2449 /*capture_time_ms=*/2, 2450 /*size_bytes=*/1000); 2451 pacer->EnqueuePacket(std::move(packet)); 2452 } 2453 auto packet = BuildPacket(RtpPacketMediaType::kAudio, kAudioSsrc, 2454 /*sequence_number=*/++sequence_number, 2455 /*capture_time_ms=*/2, 2456 /*size_bytes=*/100); 2457 pacer->EnqueuePacket(std::move(packet)); 2458 send_time = clock_.CurrentTime(); 2459 } 2460 2461 EXPECT_LE(clock_.CurrentTime() - pacer->OldestPacketEnqueueTime(), 2462 TimeDelta::Millis(500)); 2463 clock_.AdvanceTime(pacer->NextSendTime() - clock_.CurrentTime()); 2464 pacer->ProcessPackets(); 2465 } 2466 } 2467 2468 } // namespace 2469 } // namespace webrtc