Use round robin packet queue in the pacer by default
Bug: webrtc:8968 Change-Id: Ibf7d7917cd8ac6093b0994a8ac206c6934c5d6e8 Reviewed-on: https://webrtc-review.googlesource.com/59325 Reviewed-by: Philip Eliasson <philipel@webrtc.org> Commit-Queue: Ilya Nikolaevskiy <ilnik@webrtc.org> Cr-Commit-Position: refs/heads/master@{#22294}
This commit is contained in:

committed by
Commit Bot

parent
012b7e7473
commit
94065690f6
@ -21,7 +21,6 @@
|
||||
#include "modules/pacing/alr_detector.h"
|
||||
#include "modules/pacing/bitrate_prober.h"
|
||||
#include "modules/pacing/interval_budget.h"
|
||||
#include "modules/pacing/packet_queue.h"
|
||||
#include "modules/pacing/round_robin_packet_queue.h"
|
||||
#include "modules/utility/include/process_thread.h"
|
||||
#include "rtc_base/checks.h"
|
||||
@ -41,15 +40,6 @@ const int64_t kMaxElapsedTimeMs = 2000;
|
||||
// time.
|
||||
const int64_t kMaxIntervalTimeMs = 30;
|
||||
|
||||
const char kRoundRobinExperimentName[] = "WebRTC-RoundRobinPacing";
|
||||
|
||||
bool IsRoundRobinPacingEnabled() {
|
||||
return webrtc::field_trial::IsEnabled(kRoundRobinExperimentName) || (
|
||||
!webrtc::field_trial::IsDisabled(kRoundRobinExperimentName) &&
|
||||
webrtc::runtime_enabled_features::IsFeatureEnabled(
|
||||
webrtc::runtime_enabled_features::kDualStreamModeFeatureName));
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
namespace webrtc {
|
||||
@ -57,24 +47,13 @@ namespace webrtc {
|
||||
const int64_t PacedSender::kMaxQueueLengthMs = 2000;
|
||||
const float PacedSender::kDefaultPaceMultiplier = 2.5f;
|
||||
|
||||
namespace {
|
||||
std::unique_ptr<PacketQueueInterface> CreatePacketQueue(const Clock* clock,
|
||||
bool round_robin) {
|
||||
if (round_robin) {
|
||||
return rtc::MakeUnique<RoundRobinPacketQueue>(clock);
|
||||
} else {
|
||||
return rtc::MakeUnique<PacketQueue>(clock);
|
||||
}
|
||||
}
|
||||
} // namespace
|
||||
|
||||
PacedSender::PacedSender(const Clock* clock,
|
||||
PacketSender* packet_sender,
|
||||
RtcEventLog* event_log)
|
||||
: PacedSender(clock,
|
||||
packet_sender,
|
||||
event_log,
|
||||
CreatePacketQueue(clock, IsRoundRobinPacingEnabled())) {}
|
||||
rtc::MakeUnique<RoundRobinPacketQueue>(clock)) {}
|
||||
|
||||
PacedSender::PacedSender(const Clock* clock,
|
||||
PacketSender* packet_sender,
|
||||
@ -195,7 +174,7 @@ void PacedSender::InsertPacket(RtpPacketSender::Priority priority,
|
||||
if (capture_time_ms < 0)
|
||||
capture_time_ms = now_ms;
|
||||
|
||||
packets_->Push(PacketQueue::Packet(priority, ssrc, sequence_number,
|
||||
packets_->Push(PacketQueueInterface::Packet(priority, ssrc, sequence_number,
|
||||
capture_time_ms, now_ms, bytes,
|
||||
retransmission, packet_counter_++));
|
||||
}
|
||||
@ -317,7 +296,7 @@ void PacedSender::Process() {
|
||||
// Since we need to release the lock in order to send, we first pop the
|
||||
// element from the priority queue but keep it in storage, so that we can
|
||||
// reinsert it if send fails.
|
||||
const PacketQueue::Packet& packet = packets_->BeginPop();
|
||||
const PacketQueueInterface::Packet& packet = packets_->BeginPop();
|
||||
|
||||
if (SendPacket(packet, pacing_info)) {
|
||||
bytes_sent += packet.bytes;
|
||||
@ -358,7 +337,7 @@ void PacedSender::ProcessThreadAttached(ProcessThread* process_thread) {
|
||||
process_thread_ = process_thread;
|
||||
}
|
||||
|
||||
bool PacedSender::SendPacket(const PacketQueue::Packet& packet,
|
||||
bool PacedSender::SendPacket(const PacketQueueInterface::Packet& packet,
|
||||
const PacedPacketInfo& pacing_info) {
|
||||
RTC_DCHECK(!paused_);
|
||||
if (media_budget_->bytes_remaining() == 0 &&
|
||||
|
@ -108,7 +108,7 @@ class PacedSenderProbing : public PacedSender::PacketSender {
|
||||
|
||||
class PacedSenderTest : public testing::TestWithParam<std::string> {
|
||||
protected:
|
||||
PacedSenderTest() : clock_(123456), field_trial_(GetParam()) {
|
||||
PacedSenderTest() : clock_(123456) {
|
||||
srand(0);
|
||||
// Need to initialize PacedSender after we initialize clock.
|
||||
send_bucket_.reset(new PacedSender(&clock_, &callback_, nullptr));
|
||||
@ -139,15 +139,9 @@ class PacedSenderTest : public testing::TestWithParam<std::string> {
|
||||
SimulatedClock clock_;
|
||||
MockPacedSenderCallback callback_;
|
||||
std::unique_ptr<PacedSender> send_bucket_;
|
||||
test::ScopedFieldTrials field_trial_;
|
||||
};
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(RoundRobin,
|
||||
PacedSenderTest,
|
||||
::testing::Values("WebRTC-RoundRobinPacing/Disabled/",
|
||||
"WebRTC-RoundRobinPacing/Enabled/"));
|
||||
|
||||
TEST_P(PacedSenderTest, FirstSentPacketTimeIsSet) {
|
||||
TEST_F(PacedSenderTest, FirstSentPacketTimeIsSet) {
|
||||
uint16_t sequence_number = 1234;
|
||||
const uint32_t kSsrc = 12345;
|
||||
const size_t kSizeBytes = 250;
|
||||
@ -166,7 +160,7 @@ TEST_P(PacedSenderTest, FirstSentPacketTimeIsSet) {
|
||||
EXPECT_EQ(kStartMs, send_bucket_->FirstSentPacketTimeMs());
|
||||
}
|
||||
|
||||
TEST_P(PacedSenderTest, QueuePacket) {
|
||||
TEST_F(PacedSenderTest, QueuePacket) {
|
||||
uint32_t ssrc = 12345;
|
||||
uint16_t sequence_number = 1234;
|
||||
// Due to the multiplicative factor we can send 5 packets during a send
|
||||
@ -214,7 +208,7 @@ TEST_P(PacedSenderTest, QueuePacket) {
|
||||
EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
|
||||
}
|
||||
|
||||
TEST_P(PacedSenderTest, PaceQueuedPackets) {
|
||||
TEST_F(PacedSenderTest, PaceQueuedPackets) {
|
||||
uint32_t ssrc = 12345;
|
||||
uint16_t sequence_number = 1234;
|
||||
|
||||
@ -266,7 +260,7 @@ TEST_P(PacedSenderTest, PaceQueuedPackets) {
|
||||
EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
|
||||
}
|
||||
|
||||
TEST_P(PacedSenderTest, RepeatedRetransmissionsAllowed) {
|
||||
TEST_F(PacedSenderTest, RepeatedRetransmissionsAllowed) {
|
||||
// Send one packet, then two retransmissions of that packet.
|
||||
for (size_t i = 0; i < 3; i++) {
|
||||
constexpr uint32_t ssrc = 333;
|
||||
@ -280,7 +274,7 @@ TEST_P(PacedSenderTest, RepeatedRetransmissionsAllowed) {
|
||||
send_bucket_->Process();
|
||||
}
|
||||
|
||||
TEST_P(PacedSenderTest, CanQueuePacketsWithSameSequenceNumberOnDifferentSsrcs) {
|
||||
TEST_F(PacedSenderTest, CanQueuePacketsWithSameSequenceNumberOnDifferentSsrcs) {
|
||||
uint32_t ssrc = 12345;
|
||||
uint16_t sequence_number = 1234;
|
||||
|
||||
@ -303,7 +297,7 @@ TEST_P(PacedSenderTest, CanQueuePacketsWithSameSequenceNumberOnDifferentSsrcs) {
|
||||
send_bucket_->Process();
|
||||
}
|
||||
|
||||
TEST_P(PacedSenderTest, Padding) {
|
||||
TEST_F(PacedSenderTest, Padding) {
|
||||
uint32_t ssrc = 12345;
|
||||
uint16_t sequence_number = 1234;
|
||||
|
||||
@ -343,7 +337,7 @@ TEST_P(PacedSenderTest, Padding) {
|
||||
send_bucket_->Process();
|
||||
}
|
||||
|
||||
TEST_P(PacedSenderTest, NoPaddingBeforeNormalPacket) {
|
||||
TEST_F(PacedSenderTest, NoPaddingBeforeNormalPacket) {
|
||||
send_bucket_->SetPacingRates(kTargetBitrateBps * kPaceMultiplier,
|
||||
kTargetBitrateBps);
|
||||
|
||||
@ -366,7 +360,7 @@ TEST_P(PacedSenderTest, NoPaddingBeforeNormalPacket) {
|
||||
send_bucket_->Process();
|
||||
}
|
||||
|
||||
TEST_P(PacedSenderTest, VerifyPaddingUpToBitrate) {
|
||||
TEST_F(PacedSenderTest, VerifyPaddingUpToBitrate) {
|
||||
uint32_t ssrc = 12345;
|
||||
uint16_t sequence_number = 1234;
|
||||
int64_t capture_time_ms = 56789;
|
||||
@ -391,7 +385,7 @@ TEST_P(PacedSenderTest, VerifyPaddingUpToBitrate) {
|
||||
}
|
||||
}
|
||||
|
||||
TEST_P(PacedSenderTest, VerifyAverageBitrateVaryingMediaPayload) {
|
||||
TEST_F(PacedSenderTest, VerifyAverageBitrateVaryingMediaPayload) {
|
||||
uint32_t ssrc = 12345;
|
||||
uint16_t sequence_number = 1234;
|
||||
int64_t capture_time_ms = 56789;
|
||||
@ -421,7 +415,7 @@ TEST_P(PacedSenderTest, VerifyAverageBitrateVaryingMediaPayload) {
|
||||
1);
|
||||
}
|
||||
|
||||
TEST_P(PacedSenderTest, Priority) {
|
||||
TEST_F(PacedSenderTest, Priority) {
|
||||
uint32_t ssrc_low_priority = 12345;
|
||||
uint32_t ssrc = 12346;
|
||||
uint16_t sequence_number = 1234;
|
||||
@ -476,7 +470,7 @@ TEST_P(PacedSenderTest, Priority) {
|
||||
send_bucket_->Process();
|
||||
}
|
||||
|
||||
TEST_P(PacedSenderTest, RetransmissionPriority) {
|
||||
TEST_F(PacedSenderTest, RetransmissionPriority) {
|
||||
uint32_t ssrc = 12345;
|
||||
uint16_t sequence_number = 1234;
|
||||
int64_t capture_time_ms = 45678;
|
||||
@ -530,7 +524,7 @@ TEST_P(PacedSenderTest, RetransmissionPriority) {
|
||||
EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
|
||||
}
|
||||
|
||||
TEST_P(PacedSenderTest, HighPrioDoesntAffectBudget) {
|
||||
TEST_F(PacedSenderTest, HighPrioDoesntAffectBudget) {
|
||||
uint32_t ssrc = 12346;
|
||||
uint16_t sequence_number = 1234;
|
||||
int64_t capture_time_ms = 56789;
|
||||
@ -568,7 +562,7 @@ TEST_P(PacedSenderTest, HighPrioDoesntAffectBudget) {
|
||||
EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
|
||||
}
|
||||
|
||||
TEST_P(PacedSenderTest, Pause) {
|
||||
TEST_F(PacedSenderTest, Pause) {
|
||||
uint32_t ssrc_low_priority = 12345;
|
||||
uint32_t ssrc = 12346;
|
||||
uint32_t ssrc_high_priority = 12347;
|
||||
@ -688,7 +682,7 @@ TEST_P(PacedSenderTest, Pause) {
|
||||
EXPECT_EQ(0, send_bucket_->QueueInMs());
|
||||
}
|
||||
|
||||
TEST_P(PacedSenderTest, ResendPacket) {
|
||||
TEST_F(PacedSenderTest, ResendPacket) {
|
||||
uint32_t ssrc = 12346;
|
||||
uint16_t sequence_number = 1234;
|
||||
int64_t capture_time_ms = clock_.TimeInMilliseconds();
|
||||
@ -741,7 +735,7 @@ TEST_P(PacedSenderTest, ResendPacket) {
|
||||
EXPECT_EQ(0, send_bucket_->QueueInMs());
|
||||
}
|
||||
|
||||
TEST_P(PacedSenderTest, ExpectedQueueTimeMs) {
|
||||
TEST_F(PacedSenderTest, ExpectedQueueTimeMs) {
|
||||
uint32_t ssrc = 12346;
|
||||
uint16_t sequence_number = 1234;
|
||||
const size_t kNumPackets = 60;
|
||||
@ -778,7 +772,7 @@ TEST_P(PacedSenderTest, ExpectedQueueTimeMs) {
|
||||
static_cast<int64_t>(1000 * kPacketSize * 8 / kMaxBitrate));
|
||||
}
|
||||
|
||||
TEST_P(PacedSenderTest, QueueTimeGrowsOverTime) {
|
||||
TEST_F(PacedSenderTest, QueueTimeGrowsOverTime) {
|
||||
uint32_t ssrc = 12346;
|
||||
uint16_t sequence_number = 1234;
|
||||
EXPECT_EQ(0, send_bucket_->QueueInMs());
|
||||
@ -797,7 +791,7 @@ TEST_P(PacedSenderTest, QueueTimeGrowsOverTime) {
|
||||
EXPECT_EQ(0, send_bucket_->QueueInMs());
|
||||
}
|
||||
|
||||
TEST_P(PacedSenderTest, ProbingWithInsertedPackets) {
|
||||
TEST_F(PacedSenderTest, ProbingWithInsertedPackets) {
|
||||
const size_t kPacketSize = 1200;
|
||||
const int kInitialBitrateBps = 300000;
|
||||
uint32_t ssrc = 12346;
|
||||
@ -843,7 +837,7 @@ TEST_P(PacedSenderTest, ProbingWithInsertedPackets) {
|
||||
kSecondClusterBps, kBitrateProbingError);
|
||||
}
|
||||
|
||||
TEST_P(PacedSenderTest, ProbingWithPaddingSupport) {
|
||||
TEST_F(PacedSenderTest, ProbingWithPaddingSupport) {
|
||||
const size_t kPacketSize = 1200;
|
||||
const int kInitialBitrateBps = 300000;
|
||||
uint32_t ssrc = 12346;
|
||||
@ -879,62 +873,7 @@ TEST_P(PacedSenderTest, ProbingWithPaddingSupport) {
|
||||
kFirstClusterBps, kBitrateProbingError);
|
||||
}
|
||||
|
||||
TEST_P(PacedSenderTest, PriorityInversion) {
|
||||
// In this test capture timestamps are used to order packets, capture
|
||||
// timestamps are not used in PacketQueue2.
|
||||
if (webrtc::field_trial::IsEnabled("WebRTC-RoundRobinPacing"))
|
||||
return;
|
||||
uint32_t ssrc = 12346;
|
||||
uint16_t sequence_number = 1234;
|
||||
const size_t kPacketSize = 1200;
|
||||
|
||||
send_bucket_->InsertPacket(
|
||||
PacedSender::kHighPriority, ssrc, sequence_number + 3,
|
||||
clock_.TimeInMilliseconds() + 33, kPacketSize, true);
|
||||
|
||||
send_bucket_->InsertPacket(
|
||||
PacedSender::kHighPriority, ssrc, sequence_number + 2,
|
||||
clock_.TimeInMilliseconds() + 33, kPacketSize, true);
|
||||
|
||||
send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc, sequence_number,
|
||||
clock_.TimeInMilliseconds(), kPacketSize, true);
|
||||
|
||||
send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc,
|
||||
sequence_number + 1, clock_.TimeInMilliseconds(),
|
||||
kPacketSize, true);
|
||||
|
||||
// Packets from earlier frames should be sent first.
|
||||
{
|
||||
::testing::InSequence sequence;
|
||||
EXPECT_CALL(callback_,
|
||||
TimeToSendPacket(ssrc, sequence_number,
|
||||
clock_.TimeInMilliseconds(), true, _))
|
||||
.WillOnce(Return(true));
|
||||
EXPECT_CALL(callback_,
|
||||
TimeToSendPacket(ssrc, sequence_number + 1,
|
||||
clock_.TimeInMilliseconds(), true, _))
|
||||
.WillOnce(Return(true));
|
||||
EXPECT_CALL(callback_,
|
||||
TimeToSendPacket(ssrc, sequence_number + 3,
|
||||
clock_.TimeInMilliseconds() + 33, true, _))
|
||||
.WillOnce(Return(true));
|
||||
EXPECT_CALL(callback_,
|
||||
TimeToSendPacket(ssrc, sequence_number + 2,
|
||||
clock_.TimeInMilliseconds() + 33, true, _))
|
||||
.WillOnce(Return(true));
|
||||
|
||||
while (send_bucket_->QueueSizePackets() > 0) {
|
||||
int time_until_process = send_bucket_->TimeUntilNextProcess();
|
||||
if (time_until_process <= 0) {
|
||||
send_bucket_->Process();
|
||||
} else {
|
||||
clock_.AdvanceTimeMilliseconds(time_until_process);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TEST_P(PacedSenderTest, PaddingOveruse) {
|
||||
TEST_F(PacedSenderTest, PaddingOveruse) {
|
||||
uint32_t ssrc = 12346;
|
||||
uint16_t sequence_number = 1234;
|
||||
const size_t kPacketSize = 1200;
|
||||
@ -1007,7 +946,7 @@ TEST_F(PacedSenderTest, AverageQueueTime) {
|
||||
}
|
||||
#endif
|
||||
|
||||
TEST_P(PacedSenderTest, ProbeClusterId) {
|
||||
TEST_F(PacedSenderTest, ProbeClusterId) {
|
||||
uint32_t ssrc = 12346;
|
||||
uint16_t sequence_number = 1234;
|
||||
const size_t kPacketSize = 1200;
|
||||
@ -1054,7 +993,7 @@ TEST_P(PacedSenderTest, ProbeClusterId) {
|
||||
send_bucket_->Process();
|
||||
}
|
||||
|
||||
TEST_P(PacedSenderTest, AvoidBusyLoopOnSendFailure) {
|
||||
TEST_F(PacedSenderTest, AvoidBusyLoopOnSendFailure) {
|
||||
uint32_t ssrc = 12346;
|
||||
uint16_t sequence_number = 1234;
|
||||
const size_t kPacketSize = kFirstClusterBps / (8000 / 10);
|
||||
@ -1113,7 +1052,7 @@ TEST_F(PacedSenderTest, QueueTimeWithPause) {
|
||||
EXPECT_EQ(200, send_bucket_->AverageQueueTimeMs());
|
||||
}
|
||||
|
||||
TEST_P(PacedSenderTest, QueueTimePausedDuringPush) {
|
||||
TEST_F(PacedSenderTest, QueueTimePausedDuringPush) {
|
||||
const size_t kPacketSize = 1200;
|
||||
const uint32_t kSsrc = 12346;
|
||||
uint16_t sequence_number = 1234;
|
||||
|
Reference in New Issue
Block a user