Remove WebRTC-Pacer-LegacyPacketReferencing flag and most usage
This flag has been default-off since Jul 24th (m77 branch) and apart
from a bug fixed on Aug 5th, there have been no reports of issues, so
let's remove it and start cleaning away the old code path.
Most of the usage within RtpSender/PacingController and their
respective unit tests are removed with this CL, but there will be
several more to follow.
Bug: webrtc:10633
Change-Id: I1986ccf093434ac8fbd8d6db82a0bb44f50b514e
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/149838
Reviewed-by: Sebastian Jansson <srte@webrtc.org>
Commit-Queue: Erik Språng <sprang@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#28930}
diff --git a/modules/pacing/paced_sender.cc b/modules/pacing/paced_sender.cc
index 665b070..83a8da3 100644
--- a/modules/pacing/paced_sender.cc
+++ b/modules/pacing/paced_sender.cc
@@ -78,11 +78,6 @@
pacing_controller_.UpdateOutstandingData(outstanding_data);
}
-void PacedSender::SetProbingEnabled(bool enabled) {
- rtc::CritScope cs(&critsect_);
- pacing_controller_.SetProbingEnabled(enabled);
-}
-
void PacedSender::SetPacingRates(DataRate pacing_rate, DataRate padding_rate) {
rtc::CritScope cs(&critsect_);
pacing_controller_.SetPacingRates(pacing_rate, padding_rate);
@@ -186,29 +181,4 @@
critsect_.Enter();
return padding_packets;
}
-
-RtpPacketSendResult PacedSender::TimeToSendPacket(
- uint32_t ssrc,
- uint16_t sequence_number,
- int64_t capture_timestamp,
- bool retransmission,
- const PacedPacketInfo& packet_info) {
- RtpPacketSendResult result;
- critsect_.Leave();
- result = packet_router_->TimeToSendPacket(
- ssrc, sequence_number, capture_timestamp, retransmission, packet_info);
- critsect_.Enter();
- return result;
-}
-
-DataSize PacedSender::TimeToSendPadding(DataSize size,
- const PacedPacketInfo& pacing_info) {
- size_t padding_bytes_sent;
- critsect_.Leave();
- padding_bytes_sent =
- packet_router_->TimeToSendPadding(size.bytes(), pacing_info);
- critsect_.Enter();
- return DataSize::bytes(padding_bytes_sent);
-}
-
} // namespace webrtc
diff --git a/modules/pacing/paced_sender.h b/modules/pacing/paced_sender.h
index 71e826d..7b14480 100644
--- a/modules/pacing/paced_sender.h
+++ b/modules/pacing/paced_sender.h
@@ -117,12 +117,6 @@
// Below are methods specific to this implementation, such as things related
// to module processing thread specifics or methods exposed for test.
- // TODO(bugs.webrtc.org/10809): Remove when cleanup up unit tests.
- // Enable bitrate probing. Enabled by default, mostly here to simplify
- // testing. Must be called before any packets are being sent to have an
- // effect.
- void SetProbingEnabled(bool enabled);
-
// Methods implementing Module.
// Returns the number of milliseconds until the module want a worker thread
@@ -145,17 +139,6 @@
std::vector<std::unique_ptr<RtpPacketToSend>> GeneratePadding(
DataSize size) override RTC_EXCLUSIVE_LOCKS_REQUIRED(critsect_);
- // TODO(bugs.webrtc.org/10633): Remove these when old code path is gone.
- RtpPacketSendResult TimeToSendPacket(uint32_t ssrc,
- uint16_t sequence_number,
- int64_t capture_timestamp,
- bool retransmission,
- const PacedPacketInfo& packet_info)
- override RTC_EXCLUSIVE_LOCKS_REQUIRED(critsect_);
- DataSize TimeToSendPadding(DataSize size,
- const PacedPacketInfo& pacing_info) override
- RTC_EXCLUSIVE_LOCKS_REQUIRED(critsect_);
-
rtc::CriticalSection critsect_;
PacingController pacing_controller_ RTC_GUARDED_BY(critsect_);
diff --git a/modules/pacing/paced_sender_unittest.cc b/modules/pacing/paced_sender_unittest.cc
index c49d370..8c5761d 100644
--- a/modules/pacing/paced_sender_unittest.cc
+++ b/modules/pacing/paced_sender_unittest.cc
@@ -28,7 +28,6 @@
using ::testing::Return;
namespace {
-static const int kTargetBitrateBps = 800000;
constexpr uint32_t kAudioSsrc = 12345;
constexpr uint32_t kVideoSsrc = 234565;
constexpr uint32_t kVideoRtxSsrc = 34567;
@@ -83,47 +82,6 @@
return packet;
}
-TEST(PacedSenderTest, PacesPacketsLegacyWay) {
- SimulatedClock clock(0);
- MockCallback callback;
- ScopedFieldTrials field_trials(
- "WebRTC-Pacer-LegacyPacketReferencing/Enabled/");
- PacedSender pacer(&clock, &callback, nullptr, nullptr);
-
- // Insert a number of packets over one second.
- static constexpr size_t kPacketsToSend = 42;
- pacer.SetPacingRates(DataRate::bps(kDefaultPacketSize * 8 * kPacketsToSend),
- DataRate::Zero());
- for (size_t i = 0; i < kPacketsToSend; ++i) {
- pacer.InsertPacket(RtpPacketSender::Priority::kNormalPriority, kVideoSsrc,
- i, clock.TimeInMilliseconds(), kDefaultPacketSize,
- false);
- }
-
- // Expect all of them to be sent.
- size_t packets_sent = 0;
- clock.AdvanceTimeMilliseconds(pacer.TimeUntilNextProcess());
- EXPECT_CALL(callback, TimeToSendPacket)
- .WillRepeatedly([&](uint32_t ssrc, uint16_t sequence_number,
- int64_t capture_time_ms, bool retransmission,
- const PacedPacketInfo& pacing_info) {
- ++packets_sent;
- return RtpPacketSendResult::kSuccess;
- });
-
- const Timestamp start_time = clock.CurrentTime();
-
- while (packets_sent < kPacketsToSend) {
- clock.AdvanceTimeMilliseconds(pacer.TimeUntilNextProcess());
- pacer.Process();
- }
-
- // Packets should be sent over a period of close to 1s. Expect a little lower
- // than this since initial probing is a bit quicker.
- TimeDelta duration = clock.CurrentTime() - start_time;
- EXPECT_GT(duration, TimeDelta::ms(900));
-}
-
TEST(PacedSenderTest, PacesPackets) {
SimulatedClock clock(0);
MockCallback callback;
@@ -158,49 +116,5 @@
EXPECT_GT(duration, TimeDelta::ms(900));
}
-TEST(PacedSenderTest, AvoidBusyLoopOnSendFailure) {
- // This test only makes sense for legacy packet referencing mode, since we
- // don't handle send failure and more.
-
- ScopedFieldTrials field_trials(
- "WebRTC-Pacer-LegacyPacketReferencing/Enabled/");
- MockCallback callback;
- SimulatedClock clock(0);
- PacedSender pacer(&clock, &callback, nullptr, nullptr);
-
- // Configure up to full target bitrate of padding.
- pacer.SetPacingRates(DataRate::bps(kTargetBitrateBps),
- DataRate::bps(kTargetBitrateBps));
-
- // Insert a number of packets, covering the initial probe.
- static constexpr size_t kPacketsToSend = 8;
- for (size_t i = 0; i < kPacketsToSend; ++i) {
- pacer.EnqueuePacket(BuildRtpPacket(RtpPacketToSend::Type::kVideo));
- }
-
- // Expect all of them to be sent.
- size_t packets_sent = 0;
- clock.AdvanceTimeMilliseconds(pacer.TimeUntilNextProcess());
- EXPECT_CALL(callback, SendPacket)
- .WillRepeatedly(
- [&](std::unique_ptr<RtpPacketToSend> packet,
- const PacedPacketInfo& cluster_info) { ++packets_sent; });
- while (packets_sent < kPacketsToSend) {
- clock.AdvanceTimeMilliseconds(pacer.TimeUntilNextProcess());
- pacer.Process();
- }
-
- // Make sure we have budget for padding.
- clock.AdvanceTimeMilliseconds(500);
-
- // If sending padding fails, wait the standard 5ms until trying again.
- EXPECT_CALL(callback, TimeToSendPadding).Times(2).WillRepeatedly(Return(0));
- pacer.Process();
- EXPECT_EQ(5, pacer.TimeUntilNextProcess());
- clock.AdvanceTimeMilliseconds(5);
- pacer.Process();
- EXPECT_EQ(5, pacer.TimeUntilNextProcess());
-}
-
} // namespace test
} // namespace webrtc
diff --git a/modules/pacing/pacing_controller.cc b/modules/pacing/pacing_controller.cc
index 233a3fa..3c97163 100644
--- a/modules/pacing/pacing_controller.cc
+++ b/modules/pacing/pacing_controller.cc
@@ -104,9 +104,7 @@
congestion_window_size_(DataSize::PlusInfinity()),
outstanding_data_(DataSize::Zero()),
queue_time_limit(kMaxExpectedQueueLength),
- account_for_audio_(false),
- legacy_packet_referencing_(
- IsEnabled(*field_trials_, "WebRTC-Pacer-LegacyPacketReferencing")) {
+ account_for_audio_(false) {
if (!drain_large_queues_) {
RTC_LOG(LS_WARNING) << "Pacer queues will not be drained,"
"pushback experiment must be enabled.";
@@ -192,29 +190,7 @@
int64_t capture_time_ms,
size_t bytes,
bool retransmission) {
- RTC_DCHECK(pacing_bitrate_ > DataRate::Zero())
- << "SetPacingRate must be called before InsertPacket.";
-
- Timestamp now = CurrentTime();
- prober_.OnIncomingPacket(bytes);
-
- if (capture_time_ms < 0)
- capture_time_ms = now.ms();
-
- RtpPacketToSend::Type type;
- switch (priority) {
- case RtpPacketSender::kHighPriority:
- type = RtpPacketToSend::Type::kAudio;
- break;
- case RtpPacketSender::kNormalPriority:
- type = RtpPacketToSend::Type::kRetransmission;
- break;
- default:
- type = RtpPacketToSend::Type::kVideo;
- }
- packet_queue_.Push(GetPriorityForType(type), type, ssrc, sequence_number,
- capture_time_ms, now, DataSize::bytes(bytes),
- retransmission, packet_counter_++);
+ RTC_NOTREACHED();
}
void PacingController::EnqueuePacket(std::unique_ptr<RtpPacketToSend> packet) {
@@ -316,20 +292,15 @@
Timestamp now = CurrentTime();
TimeDelta elapsed_time = UpdateTimeAndGetElapsed(now);
if (ShouldSendKeepalive(now)) {
- if (legacy_packet_referencing_) {
- OnPaddingSent(packet_sender_->TimeToSendPadding(DataSize::bytes(1),
- PacedPacketInfo()));
- } else {
- DataSize keepalive_data_sent = DataSize::Zero();
- std::vector<std::unique_ptr<RtpPacketToSend>> keepalive_packets =
- packet_sender_->GeneratePadding(DataSize::bytes(1));
- for (auto& packet : keepalive_packets) {
- keepalive_data_sent +=
- DataSize::bytes(packet->payload_size() + packet->padding_size());
- packet_sender_->SendRtpPacket(std::move(packet), PacedPacketInfo());
- }
- OnPaddingSent(keepalive_data_sent);
+ DataSize keepalive_data_sent = DataSize::Zero();
+ std::vector<std::unique_ptr<RtpPacketToSend>> keepalive_packets =
+ packet_sender_->GeneratePadding(DataSize::bytes(1));
+ for (auto& packet : keepalive_packets) {
+ keepalive_data_sent +=
+ DataSize::bytes(packet->payload_size() + packet->padding_size());
+ packet_sender_->SendRtpPacket(std::move(packet), PacedPacketInfo());
}
+ OnPaddingSent(keepalive_data_sent);
}
if (paused_)
@@ -375,22 +346,19 @@
auto* packet = GetPendingPacket(pacing_info);
if (packet == nullptr) {
// No packet available to send, check if we should send padding.
- if (!legacy_packet_referencing_) {
- DataSize padding_to_add =
- PaddingToAdd(recommended_probe_size, data_sent);
- if (padding_to_add > DataSize::Zero()) {
- std::vector<std::unique_ptr<RtpPacketToSend>> padding_packets =
- packet_sender_->GeneratePadding(padding_to_add);
- if (padding_packets.empty()) {
- // No padding packets were generated, quite send loop.
- break;
- }
- for (auto& packet : padding_packets) {
- EnqueuePacket(std::move(packet));
- }
- // Continue loop to send the padding that was just added.
- continue;
+ DataSize padding_to_add = PaddingToAdd(recommended_probe_size, data_sent);
+ if (padding_to_add > DataSize::Zero()) {
+ std::vector<std::unique_ptr<RtpPacketToSend>> padding_packets =
+ packet_sender_->GeneratePadding(padding_to_add);
+ if (padding_packets.empty()) {
+ // No padding packets were generated, quite send loop.
+ break;
}
+ for (auto& packet : padding_packets) {
+ EnqueuePacket(std::move(packet));
+ }
+ // Continue loop to send the padding that was just added.
+ continue;
}
// Can't fetch new packet and no padding to send, exit send loop.
@@ -398,55 +366,14 @@
}
std::unique_ptr<RtpPacketToSend> rtp_packet = packet->ReleasePacket();
- const bool owned_rtp_packet = rtp_packet != nullptr;
- RtpPacketSendResult success;
+ RTC_DCHECK(rtp_packet);
+ packet_sender_->SendRtpPacket(std::move(rtp_packet), pacing_info);
- if (rtp_packet != nullptr) {
- packet_sender_->SendRtpPacket(std::move(rtp_packet), pacing_info);
- success = RtpPacketSendResult::kSuccess;
- } else {
- success = packet_sender_->TimeToSendPacket(
- packet->ssrc(), packet->sequence_number(), packet->capture_time_ms(),
- packet->is_retransmission(), pacing_info);
- }
-
- if (success == RtpPacketSendResult::kSuccess ||
- success == RtpPacketSendResult::kPacketNotFound) {
- // Packet sent or invalid packet, remove it from queue.
- // TODO(webrtc:8052): Don't consume media budget on kInvalid.
- data_sent += packet->size();
- // Send succeeded, remove it from the queue.
- OnPacketSent(packet);
- if (recommended_probe_size && data_sent > *recommended_probe_size)
- break;
- } else if (owned_rtp_packet) {
- // Send failed, but we can't put it back in the queue, remove it without
- // consuming budget.
- packet_queue_.FinalizePop();
+ data_sent += packet->size();
+ // Send succeeded, remove it from the queue.
+ OnPacketSent(packet);
+ if (recommended_probe_size && data_sent > *recommended_probe_size)
break;
- } else {
- // Send failed, put it back into the queue.
- packet_queue_.CancelPop();
- break;
- }
- }
-
- if (legacy_packet_referencing_ && packet_queue_.Empty() && !Congested()) {
- // We can not send padding unless a normal packet has first been sent. If we
- // do, timestamps get messed up.
- if (packet_counter_ > 0) {
- DataSize padding_needed =
- (recommended_probe_size && *recommended_probe_size > data_sent)
- ? (*recommended_probe_size - data_sent)
- : DataSize::bytes(padding_budget_.bytes_remaining());
- if (padding_needed > DataSize::Zero()) {
- DataSize padding_sent = DataSize::Zero();
- padding_sent =
- packet_sender_->TimeToSendPadding(padding_needed, pacing_info);
- data_sent += padding_sent;
- OnPaddingSent(padding_sent);
- }
- }
}
if (is_probing) {
diff --git a/modules/pacing/pacing_controller.h b/modules/pacing/pacing_controller.h
index 0948616..50d0de0 100644
--- a/modules/pacing/pacing_controller.h
+++ b/modules/pacing/pacing_controller.h
@@ -51,16 +51,6 @@
const PacedPacketInfo& cluster_info) = 0;
virtual std::vector<std::unique_ptr<RtpPacketToSend>> GeneratePadding(
DataSize size) = 0;
-
- // TODO(bugs.webrtc.org/10633): Remove these when old code path is gone.
- virtual RtpPacketSendResult TimeToSendPacket(
- uint32_t ssrc,
- uint16_t sequence_number,
- int64_t capture_timestamp,
- bool retransmission,
- const PacedPacketInfo& packet_info) = 0;
- virtual DataSize TimeToSendPadding(DataSize size,
- const PacedPacketInfo& pacing_info) = 0;
};
// Expected max pacer delay. If ExpectedQueueTime() is higher than
@@ -210,11 +200,6 @@
TimeDelta queue_time_limit;
bool account_for_audio_;
-
- // If true, PacedSender should only reference packets as in legacy mode.
- // If false, PacedSender may have direct ownership of RtpPacketToSend objects.
- // Defaults to true, will be changed to default false soon.
- const bool legacy_packet_referencing_;
};
} // namespace webrtc
diff --git a/modules/pacing/pacing_controller_unittest.cc b/modules/pacing/pacing_controller_unittest.cc
index a092e01..e07e8c85 100644
--- a/modules/pacing/pacing_controller_unittest.cc
+++ b/modules/pacing/pacing_controller_unittest.cc
@@ -51,40 +51,6 @@
constexpr DataRate kTargetRate = DataRate::KilobitsPerSec<800>();
-enum class PacerMode { kReferencePackets, kOwnPackets };
-std::string GetFieldTrialStirng(PacerMode mode) {
- std::string field_trial = "WebRTC-Pacer-LegacyPacketReferencing/";
- switch (mode) {
- case PacerMode::kOwnPackets:
- field_trial += "Disabled";
- break;
- case PacerMode::kReferencePackets:
- field_trial += "Enabled";
- break;
- }
- field_trial += "/";
- return field_trial;
-}
-
-// TODO(bugs.webrtc.org/10633): Remove when packets are always owned by pacer.
-RtpPacketSender::Priority PacketTypeToPriority(RtpPacketToSend::Type type) {
- switch (type) {
- case RtpPacketToSend::Type::kAudio:
- return RtpPacketSender::Priority::kHighPriority;
- case RtpPacketToSend::Type::kVideo:
- return RtpPacketSender::Priority::kLowPriority;
- case RtpPacketToSend::Type::kRetransmission:
- return RtpPacketSender::Priority::kNormalPriority;
- case RtpPacketToSend::Type::kForwardErrorCorrection:
- return RtpPacketSender::Priority::kLowPriority;
- break;
- case RtpPacketToSend::Type::kPadding:
- RTC_NOTREACHED() << "Unexpected type for legacy path: kPadding";
- break;
- }
- return RtpPacketSender::Priority::kLowPriority;
-}
-
std::unique_ptr<RtpPacketToSend> BuildPacket(RtpPacketToSend::Type type,
uint32_t ssrc,
uint16_t sequence_number,
@@ -104,15 +70,6 @@
// methods that focus on core aspects.
class MockPacingControllerCallback : public PacingController::PacketSender {
public:
- RtpPacketSendResult TimeToSendPacket(uint32_t ssrc,
- uint16_t sequence_number,
- int64_t capture_timestamp,
- bool retransmission,
- const PacedPacketInfo& packet_info) {
- SendPacket(ssrc, sequence_number, capture_timestamp, retransmission, false);
- return RtpPacketSendResult::kSuccess;
- }
-
void SendRtpPacket(std::unique_ptr<RtpPacketToSend> packet,
const PacedPacketInfo& cluster_info) override {
SendPacket(packet->Ssrc(), packet->SequenceNumber(),
@@ -121,11 +78,6 @@
packet->packet_type() == RtpPacketToSend::Type::kPadding);
}
- DataSize TimeToSendPadding(DataSize size,
- const PacedPacketInfo& packet_info) override {
- return DataSize::bytes(SendPadding(size.bytes()));
- }
-
std::vector<std::unique_ptr<RtpPacketToSend>> GeneratePadding(
DataSize target_size) override {
std::vector<std::unique_ptr<RtpPacketToSend>> ret;
@@ -151,15 +103,6 @@
// Mock callback implementing the raw api.
class MockPacketSender : public PacingController::PacketSender {
public:
- MOCK_METHOD5(TimeToSendPacket,
- RtpPacketSendResult(uint32_t ssrc,
- uint16_t sequence_number,
- int64_t capture_time_ms,
- bool retransmission,
- const PacedPacketInfo& pacing_info));
- MOCK_METHOD2(TimeToSendPadding,
- DataSize(DataSize size, const PacedPacketInfo& pacing_info));
-
MOCK_METHOD2(SendRtpPacket,
void(std::unique_ptr<RtpPacketToSend> packet,
const PacedPacketInfo& cluster_info));
@@ -174,26 +117,9 @@
PacingControllerPadding() : padding_sent_(0) {}
- RtpPacketSendResult TimeToSendPacket(
- uint32_t ssrc,
- uint16_t sequence_number,
- int64_t capture_time_ms,
- bool retransmission,
- const PacedPacketInfo& pacing_info) override {
- return RtpPacketSendResult::kSuccess;
- }
-
void SendRtpPacket(std::unique_ptr<RtpPacketToSend> packet,
const PacedPacketInfo& pacing_info) override {}
- DataSize TimeToSendPadding(DataSize size,
- const PacedPacketInfo& pacing_info) override {
- size_t num_packets =
- (size.bytes() + kPaddingPacketSize - 1) / kPaddingPacketSize;
- padding_sent_ += kPaddingPacketSize * num_packets;
- return DataSize::bytes(kPaddingPacketSize * num_packets);
- }
-
std::vector<std::unique_ptr<RtpPacketToSend>> GeneratePadding(
DataSize target_size) override {
size_t num_packets =
@@ -218,16 +144,6 @@
public:
PacingControllerProbing() : packets_sent_(0), padding_sent_(0) {}
- RtpPacketSendResult TimeToSendPacket(
- uint32_t ssrc,
- uint16_t sequence_number,
- int64_t capture_time_ms,
- bool retransmission,
- const PacedPacketInfo& pacing_info) override {
- ++packets_sent_;
- return RtpPacketSendResult::kSuccess;
- }
-
void SendRtpPacket(std::unique_ptr<RtpPacketToSend> packet,
const PacedPacketInfo& pacing_info) override {
if (packet->packet_type() != RtpPacketToSend::Type::kPadding) {
@@ -235,12 +151,6 @@
}
}
- DataSize TimeToSendPadding(DataSize size,
- const PacedPacketInfo& pacing_info) override {
- padding_sent_ += size.bytes();
- return DataSize::bytes(padding_sent_);
- }
-
std::vector<std::unique_ptr<RtpPacketToSend>> GeneratePadding(
DataSize target_size) override {
std::vector<std::unique_ptr<RtpPacketToSend>> packets;
@@ -260,10 +170,9 @@
int padding_sent_;
};
-class PacingControllerTest : public ::testing::TestWithParam<PacerMode> {
+class PacingControllerTest : public ::testing::Test {
protected:
- PacingControllerTest()
- : clock_(123456), field_trial_(GetFieldTrialStirng(GetParam())) {
+ PacingControllerTest() : clock_(123456) {
srand(0);
// Need to initialize PacingController after we initialize clock.
pacer_ = absl::make_unique<PacingController>(&clock_, &callback_, nullptr,
@@ -288,14 +197,8 @@
uint16_t sequence_number,
int64_t capture_time_ms,
size_t size) {
- if (GetParam() == PacerMode::kReferencePackets) {
- pacer_->InsertPacket(PacketTypeToPriority(type), ssrc, sequence_number,
- capture_time_ms, size,
- type == RtpPacketToSend::Type::kRetransmission);
- } else {
- pacer_->EnqueuePacket(
- BuildPacket(type, ssrc, sequence_number, capture_time_ms, size));
- }
+ pacer_->EnqueuePacket(
+ BuildPacket(type, ssrc, sequence_number, capture_time_ms, size));
}
void SendAndExpectPacket(RtpPacketToSend::Type type,
@@ -311,12 +214,6 @@
.Times(1);
}
- void ExpectSendPadding() {
- if (GetParam() == PacerMode::kOwnPackets) {
- EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
- }
- }
-
std::unique_ptr<RtpPacketToSend> BuildRtpPacket(RtpPacketToSend::Type type) {
auto packet = absl::make_unique<RtpPacketToSend>(nullptr);
packet->set_packet_type(type);
@@ -360,13 +257,11 @@
}
SimulatedClock clock_;
- ScopedFieldTrials field_trial_;
MockPacingControllerCallback callback_;
std::unique_ptr<PacingController> pacer_;
};
-class PacingControllerFieldTrialTest
- : public ::testing::TestWithParam<PacerMode> {
+class PacingControllerFieldTrialTest : public ::testing::Test {
protected:
struct MediaStream {
const RtpPacketToSend::Type type;
@@ -379,15 +274,9 @@
PacingControllerFieldTrialTest() : clock_(123456) {}
void InsertPacket(PacingController* pacer, MediaStream* stream) {
- if (GetParam() == PacerMode::kReferencePackets) {
- pacer->InsertPacket(PacketTypeToPriority(stream->type), stream->ssrc,
- stream->seq_num++, clock_.TimeInMilliseconds(),
- stream->packet_size, false);
- } else {
- pacer->EnqueuePacket(
- BuildPacket(stream->type, stream->ssrc, stream->seq_num++,
- clock_.TimeInMilliseconds(), stream->packet_size));
- }
+ pacer->EnqueuePacket(
+ BuildPacket(stream->type, stream->ssrc, stream->seq_num++,
+ clock_.TimeInMilliseconds(), stream->packet_size));
}
void ProcessNext(PacingController* pacer) {
clock_.AdvanceTimeMilliseconds(5);
@@ -401,7 +290,7 @@
MockPacingControllerCallback callback_;
};
-TEST_P(PacingControllerFieldTrialTest, DefaultNoPaddingInSilence) {
+TEST_F(PacingControllerFieldTrialTest, DefaultNoPaddingInSilence) {
PacingController pacer(&clock_, &callback_, nullptr, nullptr);
pacer.SetPacingRates(kTargetRate, DataRate::Zero());
// Video packet to reset last send time and provide padding data.
@@ -415,19 +304,13 @@
pacer.ProcessPackets();
}
-TEST_P(PacingControllerFieldTrialTest, PaddingInSilenceWithTrial) {
- ScopedFieldTrials trial(GetFieldTrialStirng(GetParam()) +
- "WebRTC-Pacer-PadInSilence/Enabled/");
+TEST_F(PacingControllerFieldTrialTest, PaddingInSilenceWithTrial) {
+ ScopedFieldTrials trial("WebRTC-Pacer-PadInSilence/Enabled/");
PacingController pacer(&clock_, &callback_, nullptr, nullptr);
pacer.SetPacingRates(kTargetRate, DataRate::Zero());
// Video packet to reset last send time and provide padding data.
InsertPacket(&pacer, &video);
- if (GetParam() == PacerMode::kReferencePackets) {
- // Only payload, not padding, sent by pacer in legacy mode.
- EXPECT_CALL(callback_, SendPacket).Times(1);
- } else {
- EXPECT_CALL(callback_, SendPacket).Times(2);
- }
+ EXPECT_CALL(callback_, SendPacket).Times(2);
clock_.AdvanceTimeMilliseconds(5);
pacer.ProcessPackets();
EXPECT_CALL(callback_, SendPadding).WillOnce(Return(1000));
@@ -436,7 +319,7 @@
pacer.ProcessPackets();
}
-TEST_P(PacingControllerFieldTrialTest, DefaultCongestionWindowAffectsAudio) {
+TEST_F(PacingControllerFieldTrialTest, DefaultCongestionWindowAffectsAudio) {
EXPECT_CALL(callback_, SendPadding).Times(0);
PacingController pacer(&clock_, &callback_, nullptr, nullptr);
pacer.SetPacingRates(DataRate::bps(10000000), DataRate::Zero());
@@ -458,10 +341,9 @@
ProcessNext(&pacer);
}
-TEST_P(PacingControllerFieldTrialTest,
+TEST_F(PacingControllerFieldTrialTest,
CongestionWindowDoesNotAffectAudioInTrial) {
- ScopedFieldTrials trial(GetFieldTrialStirng(GetParam()) +
- "WebRTC-Pacer-BlockAudio/Disabled/");
+ ScopedFieldTrials trial("WebRTC-Pacer-BlockAudio/Disabled/");
EXPECT_CALL(callback_, SendPadding).Times(0);
PacingController pacer(&clock_, &callback_, nullptr, nullptr);
pacer.SetPacingRates(DataRate::bps(10000000), DataRate::Zero());
@@ -477,7 +359,7 @@
ProcessNext(&pacer);
}
-TEST_P(PacingControllerFieldTrialTest, DefaultBudgetAffectsAudio) {
+TEST_F(PacingControllerFieldTrialTest, DefaultBudgetAffectsAudio) {
PacingController pacer(&clock_, &callback_, nullptr, nullptr);
pacer.SetPacingRates(
DataRate::bps(video.packet_size / 3 * 8 * kProcessIntervalsPerSecond),
@@ -498,9 +380,8 @@
ProcessNext(&pacer);
}
-TEST_P(PacingControllerFieldTrialTest, BudgetDoesNotAffectAudioInTrial) {
- ScopedFieldTrials trial(GetFieldTrialStirng(GetParam()) +
- "WebRTC-Pacer-BlockAudio/Disabled/");
+TEST_F(PacingControllerFieldTrialTest, BudgetDoesNotAffectAudioInTrial) {
+ ScopedFieldTrials trial("WebRTC-Pacer-BlockAudio/Disabled/");
EXPECT_CALL(callback_, SendPadding).Times(0);
PacingController pacer(&clock_, &callback_, nullptr, nullptr);
pacer.SetPacingRates(
@@ -516,12 +397,7 @@
ProcessNext(&pacer);
}
-INSTANTIATE_TEST_SUITE_P(ReferencingAndOwningPackets,
- PacingControllerFieldTrialTest,
- ::testing::Values(PacerMode::kReferencePackets,
- PacerMode::kOwnPackets));
-
-TEST_P(PacingControllerTest, FirstSentPacketTimeIsSet) {
+TEST_F(PacingControllerTest, FirstSentPacketTimeIsSet) {
uint16_t sequence_number = 1234;
const uint32_t kSsrc = 12345;
const size_t kSizeBytes = 250;
@@ -540,7 +416,7 @@
EXPECT_EQ(kStartTime, pacer_->FirstSentPacketTime());
}
-TEST_P(PacingControllerTest, QueuePacket) {
+TEST_F(PacingControllerTest, QueuePacket) {
uint32_t ssrc = 12345;
uint16_t sequence_number = 1234;
// Due to the multiplicative factor we can send 5 packets during a send
@@ -581,7 +457,7 @@
EXPECT_EQ(1u, pacer_->QueueSizePackets());
}
-TEST_P(PacingControllerTest, PaceQueuedPackets) {
+TEST_F(PacingControllerTest, PaceQueuedPackets) {
uint32_t ssrc = 12345;
uint16_t sequence_number = 1234;
@@ -625,7 +501,7 @@
EXPECT_EQ(1u, pacer_->QueueSizePackets());
}
-TEST_P(PacingControllerTest, RepeatedRetransmissionsAllowed) {
+TEST_F(PacingControllerTest, RepeatedRetransmissionsAllowed) {
// Send one packet, then two retransmissions of that packet.
for (size_t i = 0; i < 3; i++) {
constexpr uint32_t ssrc = 333;
@@ -641,7 +517,7 @@
pacer_->ProcessPackets();
}
-TEST_P(PacingControllerTest,
+TEST_F(PacingControllerTest,
CanQueuePacketsWithSameSequenceNumberOnDifferentSsrcs) {
uint32_t ssrc = 12345;
uint16_t sequence_number = 1234;
@@ -657,7 +533,7 @@
pacer_->ProcessPackets();
}
-TEST_P(PacingControllerTest, Padding) {
+TEST_F(PacingControllerTest, Padding) {
uint32_t ssrc = 12345;
uint16_t sequence_number = 1234;
@@ -685,12 +561,12 @@
// 5 milliseconds later we have enough budget to send some padding.
EXPECT_CALL(callback_, SendPadding(250)).WillOnce(Return(250));
- ExpectSendPadding();
+ EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
clock_.AdvanceTime(TimeUntilNextProcess());
pacer_->ProcessPackets();
}
-TEST_P(PacingControllerTest, NoPaddingBeforeNormalPacket) {
+TEST_F(PacingControllerTest, NoPaddingBeforeNormalPacket) {
pacer_->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
EXPECT_CALL(callback_, SendPadding).Times(0);
@@ -707,11 +583,11 @@
SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
capture_time_ms, 250);
EXPECT_CALL(callback_, SendPadding(250)).WillOnce(Return(250));
- ExpectSendPadding();
+ EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
pacer_->ProcessPackets();
}
-TEST_P(PacingControllerTest, VerifyPaddingUpToBitrate) {
+TEST_F(PacingControllerTest, VerifyPaddingUpToBitrate) {
uint32_t ssrc = 12345;
uint16_t sequence_number = 1234;
int64_t capture_time_ms = 56789;
@@ -724,13 +600,13 @@
SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
capture_time_ms, 250);
EXPECT_CALL(callback_, SendPadding(250)).WillOnce(Return(250));
- ExpectSendPadding();
+ EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
pacer_->ProcessPackets();
clock_.AdvanceTimeMilliseconds(kTimeStep);
}
}
-TEST_P(PacingControllerTest, VerifyAverageBitrateVaryingMediaPayload) {
+TEST_F(PacingControllerTest, VerifyAverageBitrateVaryingMediaPayload) {
uint32_t ssrc = 12345;
uint16_t sequence_number = 1234;
int64_t capture_time_ms = 56789;
@@ -759,7 +635,7 @@
1);
}
-TEST_P(PacingControllerTest, Priority) {
+TEST_F(PacingControllerTest, Priority) {
uint32_t ssrc_low_priority = 12345;
uint32_t ssrc = 12346;
uint16_t sequence_number = 1234;
@@ -806,7 +682,7 @@
pacer_->ProcessPackets();
}
-TEST_P(PacingControllerTest, RetransmissionPriority) {
+TEST_F(PacingControllerTest, RetransmissionPriority) {
uint32_t ssrc = 12345;
uint16_t sequence_number = 1234;
int64_t capture_time_ms = 45678;
@@ -853,7 +729,7 @@
EXPECT_EQ(0u, pacer_->QueueSizePackets());
}
-TEST_P(PacingControllerTest, HighPrioDoesntAffectBudget) {
+TEST_F(PacingControllerTest, HighPrioDoesntAffectBudget) {
uint32_t ssrc = 12346;
uint16_t sequence_number = 1234;
int64_t capture_time_ms = 56789;
@@ -888,7 +764,7 @@
EXPECT_EQ(0u, pacer_->QueueSizePackets());
}
-TEST_P(PacingControllerTest, SendsOnlyPaddingWhenCongested) {
+TEST_F(PacingControllerTest, SendsOnlyPaddingWhenCongested) {
uint32_t ssrc = 202020;
uint16_t sequence_number = 1000;
int kPacketSize = 250;
@@ -920,13 +796,13 @@
}
::testing::Mock::VerifyAndClearExpectations(&callback_);
EXPECT_CALL(callback_, SendPadding(1)).WillOnce(Return(1));
- ExpectSendPadding();
+ EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
clock_.AdvanceTimeMilliseconds(5);
pacer_->ProcessPackets();
EXPECT_EQ(blocked_packets, pacer_->QueueSizePackets());
}
-TEST_P(PacingControllerTest, DoesNotAllowOveruseAfterCongestion) {
+TEST_F(PacingControllerTest, DoesNotAllowOveruseAfterCongestion) {
uint32_t ssrc = 202020;
uint16_t seq_num = 1000;
int size = 1000;
@@ -967,7 +843,7 @@
pacer_->ProcessPackets();
}
-TEST_P(PacingControllerTest, ResumesSendingWhenCongestionEnds) {
+TEST_F(PacingControllerTest, ResumesSendingWhenCongestionEnds) {
uint32_t ssrc = 202020;
uint16_t sequence_number = 1000;
int64_t kPacketSize = 250;
@@ -1022,7 +898,7 @@
}
}
-TEST_P(PacingControllerTest, Pause) {
+TEST_F(PacingControllerTest, Pause) {
uint32_t ssrc_low_priority = 12345;
uint32_t ssrc = 12346;
uint32_t ssrc_high_priority = 12347;
@@ -1069,7 +945,7 @@
pacer_->OldestPacketWaitTime());
EXPECT_CALL(callback_, SendPadding(1)).WillOnce(Return(1));
- ExpectSendPadding();
+ EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
pacer_->ProcessPackets();
int64_t expected_time_until_send = 500;
@@ -1082,7 +958,7 @@
::testing::Mock::VerifyAndClearExpectations(&callback_);
EXPECT_CALL(callback_, SendPadding(1)).WillOnce(Return(1));
- ExpectSendPadding();
+ EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
clock_.AdvanceTimeMilliseconds(5);
pacer_->ProcessPackets();
::testing::Mock::VerifyAndClearExpectations(&callback_);
@@ -1131,68 +1007,7 @@
EXPECT_EQ(TimeDelta::Zero(), pacer_->OldestPacketWaitTime());
}
-TEST_P(PacingControllerTest, ResendPacket) {
- if (GetParam() == PacerMode::kOwnPackets) {
- // This test only makes sense when re-sending is supported.
- return;
- }
-
- MockPacketSender callback;
-
- // Need to initialize PacedSender after we initialize clock.
- pacer_ =
- absl::make_unique<PacingController>(&clock_, &callback, nullptr, nullptr);
- Init();
-
- uint32_t ssrc = 12346;
- uint16_t sequence_number = 1234;
- int64_t capture_time_ms = clock_.TimeInMilliseconds();
- EXPECT_EQ(TimeDelta::Zero(), pacer_->OldestPacketWaitTime());
-
- pacer_->InsertPacket(RtpPacketSender::kNormalPriority, ssrc, sequence_number,
- capture_time_ms, 250, false);
- clock_.AdvanceTimeMilliseconds(1);
- pacer_->InsertPacket(RtpPacketSender::kNormalPriority, ssrc,
- sequence_number + 1, capture_time_ms + 1, 250, false);
- clock_.AdvanceTimeMilliseconds(9999);
- EXPECT_EQ(TimeDelta::ms(clock_.TimeInMilliseconds() - capture_time_ms),
- pacer_->OldestPacketWaitTime());
- // Fails to send first packet so only one call.
- EXPECT_CALL(callback, TimeToSendPacket(ssrc, sequence_number, capture_time_ms,
- false, _))
- .Times(1)
- .WillOnce(Return(RtpPacketSendResult::kTransportUnavailable));
- clock_.AdvanceTimeMilliseconds(10000);
- pacer_->ProcessPackets();
-
- // Queue remains unchanged.
- EXPECT_EQ(TimeDelta::ms(clock_.TimeInMilliseconds() - capture_time_ms),
- pacer_->OldestPacketWaitTime());
-
- // Fails to send second packet.
- EXPECT_CALL(callback, TimeToSendPacket(ssrc, sequence_number, capture_time_ms,
- false, _))
- .WillOnce(Return(RtpPacketSendResult::kSuccess));
- EXPECT_CALL(callback, TimeToSendPacket(ssrc, sequence_number + 1,
- capture_time_ms + 1, false, _))
- .WillOnce(Return(RtpPacketSendResult::kTransportUnavailable));
- clock_.AdvanceTimeMilliseconds(10000);
- pacer_->ProcessPackets();
-
- // Queue is reduced by 1 packet.
- EXPECT_EQ(TimeDelta::ms(clock_.TimeInMilliseconds() - capture_time_ms - 1),
- pacer_->OldestPacketWaitTime());
-
- // Send second packet and queue becomes empty.
- EXPECT_CALL(callback, TimeToSendPacket(ssrc, sequence_number + 1,
- capture_time_ms + 1, false, _))
- .WillOnce(Return(RtpPacketSendResult::kSuccess));
- clock_.AdvanceTimeMilliseconds(10000);
- pacer_->ProcessPackets();
- EXPECT_EQ(TimeDelta::Zero(), pacer_->OldestPacketWaitTime());
-}
-
-TEST_P(PacingControllerTest, ExpectedQueueTimeMs) {
+TEST_F(PacingControllerTest, ExpectedQueueTimeMs) {
uint32_t ssrc = 12346;
uint16_t sequence_number = 1234;
const size_t kNumPackets = 60;
@@ -1228,7 +1043,7 @@
TimeDelta::ms(1000 * kPacketSize * 8 / kMaxBitrate));
}
-TEST_P(PacingControllerTest, QueueTimeGrowsOverTime) {
+TEST_F(PacingControllerTest, QueueTimeGrowsOverTime) {
uint32_t ssrc = 12346;
uint16_t sequence_number = 1234;
EXPECT_EQ(TimeDelta::Zero(), pacer_->OldestPacketWaitTime());
@@ -1244,7 +1059,7 @@
EXPECT_EQ(TimeDelta::Zero(), pacer_->OldestPacketWaitTime());
}
-TEST_P(PacingControllerTest, ProbingWithInsertedPackets) {
+TEST_F(PacingControllerTest, ProbingWithInsertedPackets) {
const size_t kPacketSize = 1200;
const int kInitialBitrateBps = 300000;
uint32_t ssrc = 12346;
@@ -1291,7 +1106,7 @@
kSecondClusterRate.bps(), kProbingErrorMargin.bps());
}
-TEST_P(PacingControllerTest, ProbingWithPaddingSupport) {
+TEST_F(PacingControllerTest, ProbingWithPaddingSupport) {
const size_t kPacketSize = 1200;
const int kInitialBitrateBps = 300000;
uint32_t ssrc = 12346;
@@ -1328,7 +1143,7 @@
kFirstClusterRate.bps(), kProbingErrorMargin.bps());
}
-TEST_P(PacingControllerTest, PaddingOveruse) {
+TEST_F(PacingControllerTest, PaddingOveruse) {
uint32_t ssrc = 12346;
uint16_t sequence_number = 1234;
const size_t kPacketSize = 1200;
@@ -1355,7 +1170,7 @@
pacer_->ProcessPackets();
}
-TEST_P(PacingControllerTest, ProbeClusterId) {
+TEST_F(PacingControllerTest, ProbeClusterId) {
MockPacketSender callback;
pacer_ =
@@ -1374,17 +1189,9 @@
}
// First probing cluster.
- if (GetParam() == PacerMode::kReferencePackets) {
- EXPECT_CALL(callback,
- TimeToSendPacket(_, _, _, _,
- Field(&PacedPacketInfo::probe_cluster_id, 0)))
- .Times(5)
- .WillRepeatedly(Return(RtpPacketSendResult::kSuccess));
- } else {
- EXPECT_CALL(callback,
- SendRtpPacket(_, Field(&PacedPacketInfo::probe_cluster_id, 0)))
- .Times(5);
- }
+ EXPECT_CALL(callback,
+ SendRtpPacket(_, Field(&PacedPacketInfo::probe_cluster_id, 0)))
+ .Times(5);
for (int i = 0; i < 5; ++i) {
clock_.AdvanceTimeMilliseconds(20);
@@ -1392,18 +1199,9 @@
}
// Second probing cluster.
- if (GetParam() == PacerMode::kReferencePackets) {
- EXPECT_CALL(callback,
- TimeToSendPacket(_, _, _, _,
- Field(&PacedPacketInfo::probe_cluster_id, 1)))
- .Times(5)
- .WillRepeatedly(Return(RtpPacketSendResult::kSuccess));
- EXPECT_CALL(callback, TimeToSendPadding).WillOnce(Return(DataSize::Zero()));
- } else {
- EXPECT_CALL(callback,
- SendRtpPacket(_, Field(&PacedPacketInfo::probe_cluster_id, 1)))
- .Times(5);
- }
+ EXPECT_CALL(callback,
+ SendRtpPacket(_, Field(&PacedPacketInfo::probe_cluster_id, 1)))
+ .Times(5);
for (int i = 0; i < 5; ++i) {
clock_.AdvanceTimeMilliseconds(20);
@@ -1413,33 +1211,21 @@
// Needed for the Field comparer below.
const int kNotAProbe = PacedPacketInfo::kNotAProbe;
// No more probing packets.
- if (GetParam() == PacerMode::kReferencePackets) {
- EXPECT_CALL(callback,
- TimeToSendPadding(
- _, Field(&PacedPacketInfo::probe_cluster_id, kNotAProbe)))
- .WillOnce(Return(DataSize::bytes(500)));
- } else {
- EXPECT_CALL(callback, GeneratePadding).WillOnce([&](DataSize padding_size) {
- std::vector<std::unique_ptr<RtpPacketToSend>> padding_packets;
- padding_packets.emplace_back(
- BuildPacket(RtpPacketToSend::Type::kPadding, ssrc, sequence_number++,
- clock_.TimeInMilliseconds(), padding_size.bytes()));
- return padding_packets;
- });
- EXPECT_CALL(
- callback,
- SendRtpPacket(_, Field(&PacedPacketInfo::probe_cluster_id, kNotAProbe)))
- .Times(1);
- }
+ EXPECT_CALL(callback, GeneratePadding).WillOnce([&](DataSize padding_size) {
+ std::vector<std::unique_ptr<RtpPacketToSend>> padding_packets;
+ padding_packets.emplace_back(
+ BuildPacket(RtpPacketToSend::Type::kPadding, ssrc, sequence_number++,
+ clock_.TimeInMilliseconds(), padding_size.bytes()));
+ return padding_packets;
+ });
+ EXPECT_CALL(
+ callback,
+ SendRtpPacket(_, Field(&PacedPacketInfo::probe_cluster_id, kNotAProbe)))
+ .Times(1);
pacer_->ProcessPackets();
}
-TEST_P(PacingControllerTest, OwnedPacketPrioritizedOnType) {
- if (GetParam() != PacerMode::kOwnPackets) {
- // This test only makes sense when using the new code path.
- return;
- }
-
+TEST_F(PacingControllerTest, OwnedPacketPrioritizedOnType) {
MockPacketSender callback;
pacer_ =
absl::make_unique<PacingController>(&clock_, &callback, nullptr, nullptr);
@@ -1480,11 +1266,5 @@
clock_.AdvanceTimeMilliseconds(200);
pacer_->ProcessPackets();
}
-
-INSTANTIATE_TEST_SUITE_P(ReferencingAndOwningPackets,
- PacingControllerTest,
- ::testing::Values(PacerMode::kReferencePackets,
- PacerMode::kOwnPackets));
-
} // namespace test
} // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtp_sender.cc b/modules/rtp_rtcp/source/rtp_sender.cc
index f7ee263..08858e2 100644
--- a/modules/rtp_rtcp/source/rtp_sender.cc
+++ b/modules/rtp_rtcp/source/rtp_sender.cc
@@ -46,8 +46,6 @@
constexpr uint32_t kTimestampTicksPerMs = 90;
constexpr int kBitrateStatisticsWindowMs = 1000;
-constexpr size_t kMinFlexfecPacketsToStoreForPacing = 50;
-
// Min size needed to get payload padding from packet history.
constexpr int kMinPayloadPaddingBytes = 50;
@@ -89,42 +87,6 @@
RtpGenericFrameDescriptorExtension01::kMaxSizeBytes},
};
-// TODO(bugs.webrtc.org/10633): Remove when downstream code stops using
-// priority. At the time of writing, the priority can be directly mapped to a
-// packet type. This is only for a transition period.
-RtpPacketToSend::Type PacketPriorityToType(RtpPacketSender::Priority priority) {
- switch (priority) {
- case RtpPacketSender::Priority::kLowPriority:
- return RtpPacketToSend::Type::kVideo;
- case RtpPacketSender::Priority::kNormalPriority:
- return RtpPacketToSend::Type::kRetransmission;
- case RtpPacketSender::Priority::kHighPriority:
- return RtpPacketToSend::Type::kAudio;
- default:
- RTC_NOTREACHED() << "Unexpected priority: " << priority;
- return RtpPacketToSend::Type::kVideo;
- }
-}
-
-// TODO(bugs.webrtc.org/10633): Remove when packets are always owned by pacer.
-RtpPacketSender::Priority PacketTypeToPriority(RtpPacketToSend::Type type) {
- switch (type) {
- case RtpPacketToSend::Type::kAudio:
- return RtpPacketSender::Priority::kHighPriority;
- case RtpPacketToSend::Type::kVideo:
- return RtpPacketSender::Priority::kLowPriority;
- case RtpPacketToSend::Type::kRetransmission:
- return RtpPacketSender::Priority::kNormalPriority;
- case RtpPacketToSend::Type::kForwardErrorCorrection:
- return RtpPacketSender::Priority::kLowPriority;
- break;
- case RtpPacketToSend::Type::kPadding:
- RTC_NOTREACHED() << "Unexpected type for legacy path: kPadding";
- break;
- }
- return RtpPacketSender::Priority::kLowPriority;
-}
-
bool IsEnabled(absl::string_view name,
const WebRtcKeyValueConfig* field_trials) {
FieldTrialBasedConfig default_trials;
@@ -159,7 +121,6 @@
last_payload_type_(-1),
rtp_header_extension_map_(config.extmap_allow_mixed),
packet_history_(clock_),
- flexfec_packet_history_(clock_),
// Statistics
send_delays_(),
max_delay_it_(send_delays_.end()),
@@ -192,23 +153,12 @@
overhead_observer_(config.overhead_observer),
populate_network2_timestamp_(config.populate_network2_timestamp),
send_side_bwe_with_overhead_(
- IsEnabled("WebRTC-SendSideBwe-WithOverhead", config.field_trials)),
- pacer_legacy_packet_referencing_(
- IsEnabled("WebRTC-Pacer-LegacyPacketReferencing",
- config.field_trials)) {
+ IsEnabled("WebRTC-SendSideBwe-WithOverhead", config.field_trials)) {
// This random initialization is not intended to be cryptographic strong.
timestamp_offset_ = random_.Rand<uint32_t>();
// Random start, 16 bits. Can't be 0.
sequence_number_rtx_ = random_.Rand(1, kMaxInitRtpSeqNumber);
sequence_number_ = random_.Rand(1, kMaxInitRtpSeqNumber);
-
- // Store FlexFEC packets in the packet history data structure, so they can
- // be found when paced.
- if (flexfec_ssrc_) {
- flexfec_packet_history_.SetStorePacketsStatus(
- RtpPacketHistory::StorageMode::kStoreAndCull,
- kMinFlexfecPacketsToStoreForPacing);
- }
}
RTPSender::RTPSender(
@@ -244,7 +194,6 @@
last_payload_type_(-1),
rtp_header_extension_map_(extmap_allow_mixed),
packet_history_(clock),
- flexfec_packet_history_(clock),
// Statistics
send_delays_(),
max_delay_it_(send_delays_.end()),
@@ -276,23 +225,12 @@
populate_network2_timestamp_(populate_network2_timestamp),
send_side_bwe_with_overhead_(
field_trials.Lookup("WebRTC-SendSideBwe-WithOverhead")
- .find("Enabled") == 0),
- pacer_legacy_packet_referencing_(
- field_trials.Lookup("WebRTC-Pacer-LegacyPacketReferencing")
.find("Enabled") == 0) {
// This random initialization is not intended to be cryptographic strong.
timestamp_offset_ = random_.Rand<uint32_t>();
// Random start, 16 bits. Can't be 0.
sequence_number_rtx_ = random_.Rand(1, kMaxInitRtpSeqNumber);
sequence_number_ = random_.Rand(1, kMaxInitRtpSeqNumber);
-
- // Store FlexFEC packets in the packet history data structure, so they can
- // be found when paced.
- if (flexfec_ssrc_) {
- flexfec_packet_history_.SetStorePacketsStatus(
- RtpPacketHistory::StorageMode::kStoreAndCull,
- kMinFlexfecPacketsToStoreForPacing);
- }
}
RTPSender::~RTPSender() {
@@ -406,158 +344,6 @@
rtx_payload_type_map_[associated_payload_type] = payload_type;
}
-size_t RTPSender::TrySendRedundantPayloads(size_t bytes_to_send,
- const PacedPacketInfo& pacing_info) {
- {
- rtc::CritScope lock(&send_critsect_);
- if (!sending_media_)
- return 0;
- if ((rtx_ & kRtxRedundantPayloads) == 0)
- return 0;
- }
-
- int bytes_left = static_cast<int>(bytes_to_send);
- while (bytes_left >= kMinPayloadPaddingBytes) {
- std::unique_ptr<RtpPacketToSend> packet =
- packet_history_.GetPayloadPaddingPacket();
-
- if (!packet)
- break;
- size_t payload_size = packet->payload_size();
- if (!PrepareAndSendPacket(std::move(packet), true, false, pacing_info))
- break;
- bytes_left -= payload_size;
- }
- return bytes_to_send - bytes_left;
-}
-
-size_t RTPSender::SendPadData(size_t bytes,
- const PacedPacketInfo& pacing_info) {
- size_t padding_bytes_in_packet;
- size_t max_payload_size = max_packet_size_ - RtpHeaderLength();
-
- if (audio_configured_) {
- // Allow smaller padding packets for audio.
- padding_bytes_in_packet =
- rtc::SafeClamp(bytes, kMinAudioPaddingLength,
- rtc::SafeMin(max_payload_size, kMaxPaddingLength));
- } else {
- // Always send full padding packets. This is accounted for by the
- // RtpPacketSender, which will make sure we don't send too much padding even
- // if a single packet is larger than requested.
- // We do this to avoid frequently sending small packets on higher bitrates.
- padding_bytes_in_packet = rtc::SafeMin(max_payload_size, kMaxPaddingLength);
- }
- size_t bytes_sent = 0;
- while (bytes_sent < bytes) {
- int64_t now_ms = clock_->TimeInMilliseconds();
- uint32_t ssrc;
- uint32_t timestamp;
- int64_t capture_time_ms;
- uint16_t sequence_number;
- int payload_type;
- bool over_rtx;
- {
- rtc::CritScope lock(&send_critsect_);
- if (!sending_media_)
- break;
- timestamp = last_rtp_timestamp_;
- capture_time_ms = capture_time_ms_;
- if (rtx_ == kRtxOff) {
- if (last_payload_type_ == -1)
- break;
- // Without RTX we can't send padding in the middle of frames.
- // For audio marker bits doesn't mark the end of a frame and frames
- // are usually a single packet, so for now we don't apply this rule
- // for audio.
- if (!audio_configured_ && !last_packet_marker_bit_) {
- break;
- }
- if (!ssrc_) {
- RTC_LOG(LS_ERROR) << "SSRC unset.";
- return 0;
- }
-
- RTC_DCHECK(ssrc_);
- ssrc = *ssrc_;
-
- sequence_number = sequence_number_;
- ++sequence_number_;
- payload_type = last_payload_type_;
- over_rtx = false;
- } else {
- // Without abs-send-time or transport sequence number a media packet
- // must be sent before padding so that the timestamps used for
- // estimation are correct.
- if (!media_has_been_sent_ &&
- !(rtp_header_extension_map_.IsRegistered(AbsoluteSendTime::kId) ||
- (rtp_header_extension_map_.IsRegistered(
- TransportSequenceNumber::kId) &&
- transport_sequence_number_allocator_))) {
- break;
- }
- // Only change change the timestamp of padding packets sent over RTX.
- // Padding only packets over RTP has to be sent as part of a media
- // frame (and therefore the same timestamp).
- if (last_timestamp_time_ms_ > 0) {
- timestamp +=
- (now_ms - last_timestamp_time_ms_) * kTimestampTicksPerMs;
- capture_time_ms += (now_ms - last_timestamp_time_ms_);
- }
- if (!ssrc_rtx_) {
- RTC_LOG(LS_ERROR) << "RTX SSRC unset.";
- return 0;
- }
- RTC_DCHECK(ssrc_rtx_);
- ssrc = *ssrc_rtx_;
- sequence_number = sequence_number_rtx_;
- ++sequence_number_rtx_;
- payload_type = rtx_payload_type_map_.begin()->second;
- over_rtx = true;
- }
- }
-
- RtpPacketToSend padding_packet(&rtp_header_extension_map_);
- padding_packet.SetPayloadType(payload_type);
- padding_packet.SetMarker(false);
- padding_packet.SetSequenceNumber(sequence_number);
- padding_packet.SetTimestamp(timestamp);
- padding_packet.SetSsrc(ssrc);
-
- if (capture_time_ms > 0) {
- padding_packet.SetExtension<TransmissionOffset>(
- (now_ms - capture_time_ms) * kTimestampTicksPerMs);
- }
- padding_packet.SetExtension<AbsoluteSendTime>(
- AbsoluteSendTime::MsTo24Bits(now_ms));
- PacketOptions options;
- // Padding packets are never retransmissions.
- options.is_retransmit = false;
- bool has_transport_seq_num;
- {
- rtc::CritScope lock(&send_critsect_);
- has_transport_seq_num =
- UpdateTransportSequenceNumber(&padding_packet, &options.packet_id);
- options.included_in_allocation =
- has_transport_seq_num || force_part_of_allocation_;
- options.included_in_feedback = has_transport_seq_num;
- }
- padding_packet.SetPadding(padding_bytes_in_packet);
- if (has_transport_seq_num) {
- AddPacketToTransportFeedback(options.packet_id, padding_packet,
- pacing_info);
- }
-
- if (!SendPacketToNetwork(padding_packet, options, pacing_info))
- break;
-
- bytes_sent += padding_bytes_in_packet;
- UpdateRtpStats(padding_packet, over_rtx, false);
- }
-
- return bytes_sent;
-}
-
void RTPSender::SetStorePacketsStatus(bool enable, uint16_t number_to_store) {
packet_history_.SetStorePacketsStatus(
enable ? RtpPacketHistory::StorageMode::kStoreAndCull
@@ -584,54 +370,34 @@
const bool rtx = (RtxStatus() & kRtxRetransmitted) > 0;
if (paced_sender_) {
- if (pacer_legacy_packet_referencing_) {
- // Check if we're overusing retransmission bitrate.
- // TODO(sprang): Add histograms for nack success or failure reasons.
- if (retransmission_rate_limiter_ &&
- !retransmission_rate_limiter_->TryUseRate(packet_size)) {
- return -1;
- }
-
- // Mark packet as being in pacer queue again, to prevent duplicates.
- if (!packet_history_.SetPendingTransmission(packet_id)) {
- // Packet has already been removed from history, return early.
- return 0;
- }
-
- paced_sender_->InsertPacket(
- RtpPacketSender::kNormalPriority, stored_packet->ssrc,
- stored_packet->rtp_sequence_number, stored_packet->capture_time_ms,
- stored_packet->packet_size, true);
- } else {
- std::unique_ptr<RtpPacketToSend> packet =
- packet_history_.GetPacketAndMarkAsPending(
- packet_id, [&](const RtpPacketToSend& stored_packet) {
- // Check if we're overusing retransmission bitrate.
- // TODO(sprang): Add histograms for nack success or failure
- // reasons.
- std::unique_ptr<RtpPacketToSend> retransmit_packet;
- if (retransmission_rate_limiter_ &&
- !retransmission_rate_limiter_->TryUseRate(packet_size)) {
- return retransmit_packet;
- }
- if (rtx) {
- retransmit_packet = BuildRtxPacket(stored_packet);
- } else {
- retransmit_packet =
- absl::make_unique<RtpPacketToSend>(stored_packet);
- }
- if (retransmit_packet) {
- retransmit_packet->set_retransmitted_sequence_number(
- stored_packet.SequenceNumber());
- }
+ std::unique_ptr<RtpPacketToSend> packet =
+ packet_history_.GetPacketAndMarkAsPending(
+ packet_id, [&](const RtpPacketToSend& stored_packet) {
+ // Check if we're overusing retransmission bitrate.
+ // TODO(sprang): Add histograms for nack success or failure
+ // reasons.
+ std::unique_ptr<RtpPacketToSend> retransmit_packet;
+ if (retransmission_rate_limiter_ &&
+ !retransmission_rate_limiter_->TryUseRate(packet_size)) {
return retransmit_packet;
- });
- if (!packet) {
- return -1;
- }
- packet->set_packet_type(RtpPacketToSend::Type::kRetransmission);
- paced_sender_->EnqueuePacket(std::move(packet));
+ }
+ if (rtx) {
+ retransmit_packet = BuildRtxPacket(stored_packet);
+ } else {
+ retransmit_packet =
+ absl::make_unique<RtpPacketToSend>(stored_packet);
+ }
+ if (retransmit_packet) {
+ retransmit_packet->set_retransmitted_sequence_number(
+ stored_packet.SequenceNumber());
+ }
+ return retransmit_packet;
+ });
+ if (!packet) {
+ return -1;
}
+ packet->set_packet_type(RtpPacketToSend::Type::kRetransmission);
+ paced_sender_->EnqueuePacket(std::move(packet));
return packet_size;
}
@@ -712,28 +478,8 @@
int64_t capture_time_ms,
bool retransmission,
const PacedPacketInfo& pacing_info) {
- if (!SendingMedia()) {
- return RtpPacketSendResult::kPacketNotFound;
- }
-
- std::unique_ptr<RtpPacketToSend> packet;
- if (ssrc == SSRC()) {
- packet = packet_history_.GetPacketAndSetSendTime(sequence_number);
- } else if (ssrc == FlexfecSsrc()) {
- packet = flexfec_packet_history_.GetPacketAndSetSendTime(sequence_number);
- }
-
- if (!packet) {
- // Packet cannot be found or was resent too recently.
- return RtpPacketSendResult::kPacketNotFound;
- }
-
- return PrepareAndSendPacket(
- std::move(packet),
- retransmission && (RtxStatus() & kRtxRetransmitted) > 0,
- retransmission, pacing_info)
- ? RtpPacketSendResult::kSuccess
- : RtpPacketSendResult::kTransportUnavailable;
+ RTC_NOTREACHED();
+ return RtpPacketSendResult::kSuccess;
}
// Called from pacer when we can send the packet.
@@ -971,12 +717,15 @@
size_t RTPSender::TimeToSendPadding(size_t bytes,
const PacedPacketInfo& pacing_info) {
- if (bytes == 0)
- return 0;
- size_t bytes_sent = TrySendRedundantPayloads(bytes, pacing_info);
- if (bytes_sent < bytes)
- bytes_sent += SendPadData(bytes - bytes_sent, pacing_info);
- return bytes_sent;
+ // TODO(bugs.webrtc.org/10633): Remove when downstream test usage is gone.
+ size_t padding_bytes_sent = 0;
+ for (auto& packet : GeneratePadding(bytes)) {
+ const size_t packet_size = packet->payload_size() + packet->padding_size();
+ if (TrySendPacket(packet.get(), pacing_info)) {
+ padding_bytes_sent += packet_size;
+ }
+ }
+ return padding_bytes_sent;
}
std::vector<std::unique_ptr<RtpPacketToSend>> RTPSender::GeneratePadding(
@@ -1101,10 +850,6 @@
uint32_t ssrc = packet->Ssrc();
if (paced_sender_) {
- uint16_t seq_no = packet->SequenceNumber();
- int64_t capture_time_ms = packet->capture_time_ms();
- size_t packet_size =
- send_side_bwe_with_overhead_ ? packet->size() : packet->payload_size();
auto packet_type = packet->packet_type();
RTC_CHECK(packet_type) << "Packet type must be set before sending.";
@@ -1112,25 +857,9 @@
packet->set_capture_time_ms(now_ms);
}
- if (pacer_legacy_packet_referencing_) {
- // If |pacer_reference_packets_| then pacer needs to find the packet in
- // the history when it is time to send, so move packet there.
- if (ssrc == FlexfecSsrc()) {
- // Store FlexFEC packets in a separate history since they are on a
- // separate SSRC.
- flexfec_packet_history_.PutRtpPacket(std::move(packet), storage,
- absl::nullopt);
- } else {
- packet_history_.PutRtpPacket(std::move(packet), storage, absl::nullopt);
- }
-
- paced_sender_->InsertPacket(PacketTypeToPriority(*packet_type), ssrc,
- seq_no, capture_time_ms, packet_size, false);
- } else {
- packet->set_allow_retransmission(storage ==
- StorageType::kAllowRetransmission);
- paced_sender_->EnqueuePacket(std::move(packet));
- }
+ packet->set_allow_retransmission(storage ==
+ StorageType::kAllowRetransmission);
+ paced_sender_->EnqueuePacket(std::move(packet));
return true;
}
@@ -1192,13 +921,6 @@
return sent;
}
-bool RTPSender::SendToNetwork(std::unique_ptr<RtpPacketToSend> packet,
- StorageType storage,
- RtpPacketSender::Priority priority) {
- packet->set_packet_type(PacketPriorityToType(priority));
- return SendToNetwork(std::move(packet), storage);
-}
-
void RTPSender::RecomputeMaxSendDelay() {
max_delay_it_ = send_delays_.begin();
for (auto it = send_delays_.begin(); it != send_delays_.end(); ++it) {
@@ -1730,7 +1452,6 @@
void RTPSender::SetRtt(int64_t rtt_ms) {
packet_history_.SetRtt(rtt_ms);
- flexfec_packet_history_.SetRtt(rtt_ms);
}
void RTPSender::OnPacketsAcknowledged(
diff --git a/modules/rtp_rtcp/source/rtp_sender.h b/modules/rtp_rtcp/source/rtp_sender.h
index 08e8f42..f831e1b 100644
--- a/modules/rtp_rtcp/source/rtp_sender.h
+++ b/modules/rtp_rtcp/source/rtp_sender.h
@@ -176,11 +176,6 @@
bool SendToNetwork(std::unique_ptr<RtpPacketToSend> packet,
StorageType storage);
- // Fallback that infers PacketType from Priority.
- bool SendToNetwork(std::unique_ptr<RtpPacketToSend> packet,
- StorageType storage,
- RtpPacketSender::Priority priority);
-
// Called on update of RTP statistics.
void RegisterRtpStatisticsCallback(StreamDataCountersCallback* callback);
StreamDataCountersCallback* GetRtpStatisticsCallback() const;
@@ -204,18 +199,11 @@
// time.
typedef std::map<int64_t, int> SendDelayMap;
- size_t SendPadData(size_t bytes, const PacedPacketInfo& pacing_info);
-
bool PrepareAndSendPacket(std::unique_ptr<RtpPacketToSend> packet,
bool send_over_rtx,
bool is_retransmit,
const PacedPacketInfo& pacing_info);
- // Return the number of bytes sent. Note that both of these functions may
- // return a larger value that their argument.
- size_t TrySendRedundantPayloads(size_t bytes,
- const PacedPacketInfo& pacing_info);
-
std::unique_ptr<RtpPacketToSend> BuildRtxPacket(
const RtpPacketToSend& packet);
@@ -269,9 +257,6 @@
RTC_GUARDED_BY(send_critsect_);
RtpPacketHistory packet_history_;
- // TODO(brandtr): Remove |flexfec_packet_history_| when the FlexfecSender
- // is hooked up to the PacedSender.
- RtpPacketHistory flexfec_packet_history_;
// Statistics
rtc::CriticalSection statistics_crit_;
@@ -327,11 +312,6 @@
const bool send_side_bwe_with_overhead_;
- // If true, PacedSender should only reference packets as in legacy mode.
- // If false, PacedSender may have direct ownership of RtpPacketToSend objects.
- // Defaults to true, will be changed to default false soon.
- const bool pacer_legacy_packet_referencing_;
-
RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(RTPSender);
};
diff --git a/modules/rtp_rtcp/source/rtp_sender_unittest.cc b/modules/rtp_rtcp/source/rtp_sender_unittest.cc
index d505280..484711d 100644
--- a/modules/rtp_rtcp/source/rtp_sender_unittest.cc
+++ b/modules/rtp_rtcp/source/rtp_sender_unittest.cc
@@ -144,11 +144,8 @@
}
struct TestConfig {
- TestConfig(bool with_overhead, bool pacer_references_packets)
- : with_overhead(with_overhead),
- pacer_references_packets(pacer_references_packets) {}
+ explicit TestConfig(bool with_overhead) : with_overhead(with_overhead) {}
bool with_overhead = false;
- bool pacer_references_packets = false;
};
std::string ToFieldTrialString(TestConfig config) {
@@ -156,11 +153,6 @@
if (config.with_overhead) {
field_trials += "WebRTC-SendSideBwe-WithOverhead/Enabled/";
}
- if (config.pacer_references_packets) {
- field_trials += "WebRTC-Pacer-LegacyPacketReferencing/Enabled/";
- } else {
- field_trials += "WebRTC-Pacer-LegacyPacketReferencing/Disabled/";
- }
return field_trials;
}
@@ -734,30 +726,21 @@
Field(&RtpPacketSendInfo::pacing_info, PacedPacketInfo()))))
.Times(1);
- if (GetParam().pacer_references_packets) {
- EXPECT_CALL(mock_paced_sender_, InsertPacket(_, kSsrc, kSeqNum, _, _, _));
- SendGenericPacket();
- EXPECT_CALL(seq_num_allocator_, AllocateSequenceNumber())
- .WillOnce(Return(kTransportSequenceNumber));
- rtp_sender_->TimeToSendPacket(kSsrc, kSeqNum,
- fake_clock_.TimeInMilliseconds(), false,
- PacedPacketInfo());
- } else {
- EXPECT_CALL(
- mock_paced_sender_,
- EnqueuePacket(AllOf(
- Pointee(Property(&RtpPacketToSend::Ssrc, kSsrc)),
- Pointee(Property(&RtpPacketToSend::SequenceNumber, kSeqNum)))));
- auto packet = SendGenericPacket();
- packet->set_packet_type(RtpPacketToSend::Type::kVideo);
- // Transport sequence number is set by PacketRouter, before TrySendPacket().
- packet->SetExtension<TransportSequenceNumber>(kTransportSequenceNumber);
- rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo());
- }
+ EXPECT_CALL(
+ mock_paced_sender_,
+ EnqueuePacket(
+ AllOf(Pointee(Property(&RtpPacketToSend::Ssrc, kSsrc)),
+ Pointee(Property(&RtpPacketToSend::SequenceNumber, kSeqNum)))));
+ auto packet = SendGenericPacket();
+ packet->set_packet_type(RtpPacketToSend::Type::kVideo);
+ // Transport sequence number is set by PacketRouter, before TrySendPacket().
+ packet->SetExtension<TransportSequenceNumber>(kTransportSequenceNumber);
+ rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo());
- const auto& packet = transport_.last_sent_packet();
uint16_t transport_seq_no;
- EXPECT_TRUE(packet.GetExtension<TransportSequenceNumber>(&transport_seq_no));
+ EXPECT_TRUE(
+ transport_.last_sent_packet().GetExtension<TransportSequenceNumber>(
+ &transport_seq_no));
EXPECT_EQ(kTransportSequenceNumber, transport_seq_no);
EXPECT_EQ(transport_.last_options_.packet_id, transport_seq_no);
}
@@ -778,26 +761,13 @@
size_t packet_size = packet->size();
const int kStoredTimeInMs = 100;
- if (GetParam().pacer_references_packets) {
- EXPECT_CALL(
- mock_paced_sender_,
- InsertPacket(RtpPacketSender::kNormalPriority, kSsrc, _, _, _, _));
- EXPECT_TRUE(rtp_sender_->SendToNetwork(std::move(packet),
- kAllowRetransmission,
- RtpPacketSender::kNormalPriority));
- fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs);
- rtp_sender_->TimeToSendPacket(kSsrc, kSeqNum, capture_time_ms, false,
- PacedPacketInfo());
- } else {
- packet->set_packet_type(RtpPacketToSend::Type::kVideo);
- EXPECT_CALL(
- mock_paced_sender_,
- EnqueuePacket(Pointee(Property(&RtpPacketToSend::Ssrc, kSsrc))));
- EXPECT_TRUE(rtp_sender_->SendToNetwork(
- absl::make_unique<RtpPacketToSend>(*packet), kAllowRetransmission));
- fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs);
- rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo());
- }
+ packet->set_packet_type(RtpPacketToSend::Type::kVideo);
+ EXPECT_CALL(mock_paced_sender_,
+ EnqueuePacket(Pointee(Property(&RtpPacketToSend::Ssrc, kSsrc))));
+ EXPECT_TRUE(rtp_sender_->SendToNetwork(
+ absl::make_unique<RtpPacketToSend>(*packet), kAllowRetransmission));
+ fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs);
+ rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo());
EXPECT_EQ(1, transport_.packets_sent());
EXPECT_EQ(packet_size, transport_.last_sent_packet().size());
@@ -826,27 +796,14 @@
const int kStoredTimeInMs = 100;
- if (GetParam().pacer_references_packets) {
- EXPECT_CALL(
- mock_paced_sender_,
- InsertPacket(RtpPacketSender::kNormalPriority, kSsrc, _, _, _, _));
- EXPECT_TRUE(rtp_sender_->SendToNetwork(std::move(packet),
- kAllowRetransmission,
- RtpPacketSender::kNormalPriority));
- fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs);
- rtp_sender_->TimeToSendPacket(kSsrc, kSeqNum, capture_time_ms, false,
- PacedPacketInfo());
- } else {
packet->set_packet_type(RtpPacketToSend::Type::kVideo);
EXPECT_CALL(
mock_paced_sender_,
EnqueuePacket(Pointee(Property(&RtpPacketToSend::Ssrc, kSsrc))));
EXPECT_TRUE(rtp_sender_->SendToNetwork(
- absl::make_unique<RtpPacketToSend>(*packet), kAllowRetransmission,
- RtpPacketSender::kNormalPriority));
+ absl::make_unique<RtpPacketToSend>(*packet), kAllowRetransmission));
fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs);
rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo());
- }
EXPECT_EQ(1, transport_.packets_sent());
EXPECT_EQ(packet_size, transport_.last_sent_packet().size());
@@ -872,9 +829,8 @@
const int kPropagateTimeMs = 10;
fake_clock_.AdvanceTimeMilliseconds(kPropagateTimeMs);
- EXPECT_TRUE(rtp_sender_->SendToNetwork(std::move(packet),
- kAllowRetransmission,
- RtpPacketSender::kNormalPriority));
+ EXPECT_TRUE(
+ rtp_sender_->SendToNetwork(std::move(packet), kAllowRetransmission));
EXPECT_EQ(1, transport_.packets_sent());
absl::optional<VideoSendTiming> video_timing =
@@ -900,19 +856,6 @@
size_t packet_size = packet->size();
const int kStoredTimeInMs = 100;
- if (GetParam().pacer_references_packets) {
- EXPECT_CALL(mock_paced_sender_,
- InsertPacket(RtpPacketSender::kNormalPriority, kSsrc, kSeqNum,
- _, _, _));
- // Packet should be stored in a send bucket.
- EXPECT_TRUE(rtp_sender_->SendToNetwork(std::move(packet),
- kAllowRetransmission,
- RtpPacketSender::kNormalPriority));
- EXPECT_EQ(0, transport_.packets_sent());
- fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs);
- rtp_sender_->TimeToSendPacket(kSsrc, kSeqNum, capture_time_ms, false,
- PacedPacketInfo());
- } else {
EXPECT_CALL(
mock_paced_sender_,
EnqueuePacket(AllOf(
@@ -924,7 +867,6 @@
EXPECT_EQ(0, transport_.packets_sent());
fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs);
rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo());
- }
// Process send bucket. Packet should now be sent.
EXPECT_EQ(1, transport_.packets_sent());
@@ -957,17 +899,6 @@
size_t packet_size = packet->size();
// Packet should be stored in a send bucket.
- if (GetParam().pacer_references_packets) {
- EXPECT_CALL(mock_paced_sender_,
- InsertPacket(RtpPacketSender::kNormalPriority, kSsrc, kSeqNum,
- _, _, _));
- EXPECT_TRUE(rtp_sender_->SendToNetwork(std::move(packet),
- kAllowRetransmission,
- RtpPacketSender::kNormalPriority));
- // Immediately process send bucket and send packet.
- rtp_sender_->TimeToSendPacket(kSsrc, kSeqNum, capture_time_ms, false,
- PacedPacketInfo());
- } else {
EXPECT_CALL(
mock_paced_sender_,
EnqueuePacket(AllOf(
@@ -979,7 +910,6 @@
absl::make_unique<RtpPacketToSend>(*packet), kAllowRetransmission));
// Immediately process send bucket and send packet.
rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo());
- }
EXPECT_EQ(1, transport_.packets_sent());
@@ -989,16 +919,6 @@
EXPECT_CALL(mock_rtc_event_log_,
LogProxy(SameRtcEventTypeAs(RtcEvent::Type::RtpPacketOutgoing)));
- if (GetParam().pacer_references_packets) {
- EXPECT_CALL(mock_paced_sender_,
- InsertPacket(RtpPacketSender::kNormalPriority, kSsrc, kSeqNum,
- _, _, _));
- EXPECT_EQ(static_cast<int>(packet_size),
- rtp_sender_->ReSendPacket(kSeqNum));
- EXPECT_EQ(1, transport_.packets_sent());
- rtp_sender_->TimeToSendPacket(kSsrc, kSeqNum, capture_time_ms, true,
- PacedPacketInfo());
- } else {
packet->set_packet_type(RtpPacketToSend::Type::kRetransmission);
packet->set_retransmitted_sequence_number(kSeqNum);
EXPECT_CALL(
@@ -1010,7 +930,6 @@
rtp_sender_->ReSendPacket(kSeqNum));
EXPECT_EQ(1, transport_.packets_sent());
rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo());
- }
// Process send bucket. Packet should now be sent.
EXPECT_EQ(2, transport_.packets_sent());
@@ -1059,18 +978,6 @@
const int kStoredTimeInMs = 100;
// Packet should be stored in a send bucket.
- if (GetParam().pacer_references_packets) {
- EXPECT_CALL(mock_paced_sender_,
- InsertPacket(RtpPacketSender::kNormalPriority, kSsrc, kSeqNum,
- _, _, _));
- EXPECT_TRUE(rtp_sender_->SendToNetwork(std::move(packet),
- kAllowRetransmission,
- RtpPacketSender::kNormalPriority));
- EXPECT_EQ(total_packets_sent, transport_.packets_sent());
- fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs);
- rtp_sender_->TimeToSendPacket(kSsrc, seq_num++, capture_time_ms, false,
- PacedPacketInfo());
- } else {
EXPECT_CALL(
mock_paced_sender_,
EnqueuePacket(AllOf(
@@ -1084,7 +991,6 @@
fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs);
rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo());
++seq_num;
- }
// Packet should now be sent. This test doesn't verify the regular video
// packet, since it is tested in another test.
@@ -1127,17 +1033,6 @@
packet = BuildRtpPacket(kPayload, kMarkerBit, timestamp, capture_time_ms);
packet_size = packet->size();
- if (GetParam().pacer_references_packets) {
- EXPECT_CALL(mock_paced_sender_,
- InsertPacket(RtpPacketSender::kNormalPriority, kSsrc, seq_num,
- _, _, _));
- // Packet should be stored in a send bucket.
- EXPECT_TRUE(rtp_sender_->SendToNetwork(std::move(packet),
- kAllowRetransmission,
- RtpPacketSender::kNormalPriority));
- rtp_sender_->TimeToSendPacket(kSsrc, seq_num, capture_time_ms, false,
- PacedPacketInfo());
- } else {
packet->set_packet_type(RtpPacketToSend::Type::kVideo);
EXPECT_CALL(
mock_paced_sender_,
@@ -1147,7 +1042,6 @@
EXPECT_TRUE(rtp_sender_->SendToNetwork(
absl::make_unique<RtpPacketToSend>(*packet), kAllowRetransmission));
rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo());
- }
// Process send bucket.
EXPECT_EQ(++total_packets_sent, transport_.packets_sent());
@@ -1174,16 +1068,6 @@
OnSendPacket(kTransportSequenceNumber, _, _))
.Times(1);
- if (GetParam().pacer_references_packets) {
- const bool kIsRetransmit = false;
- EXPECT_CALL(mock_paced_sender_, InsertPacket(_, kSsrc, kSeqNum, _, _, _));
- SendGenericPacket(); // Packet passed to pacer.
- EXPECT_CALL(seq_num_allocator_, AllocateSequenceNumber())
- .WillOnce(::testing::Return(kTransportSequenceNumber));
- rtp_sender_->TimeToSendPacket(kSsrc, kSeqNum,
- fake_clock_.TimeInMilliseconds(),
- kIsRetransmit, PacedPacketInfo());
- } else {
EXPECT_CALL(
mock_paced_sender_,
EnqueuePacket(AllOf(
@@ -1193,7 +1077,6 @@
packet->set_packet_type(RtpPacketToSend::Type::kVideo);
packet->SetExtension<TransportSequenceNumber>(kTransportSequenceNumber);
rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo());
- }
EXPECT_EQ(1, transport_.packets_sent());
}
@@ -1206,16 +1089,6 @@
EXPECT_CALL(send_packet_observer_, OnSendPacket(_, _, _)).Times(0);
- if (GetParam().pacer_references_packets) {
- const bool kIsRetransmit = true;
- EXPECT_CALL(mock_paced_sender_, InsertPacket(_, kSsrc, kSeqNum, _, _, _));
- SendGenericPacket(); // Packet passed to pacer.
- EXPECT_CALL(seq_num_allocator_, AllocateSequenceNumber())
- .WillOnce(Return(kTransportSequenceNumber));
- rtp_sender_->TimeToSendPacket(kSsrc, kSeqNum,
- fake_clock_.TimeInMilliseconds(),
- kIsRetransmit, PacedPacketInfo());
- } else {
EXPECT_CALL(
mock_paced_sender_,
EnqueuePacket(AllOf(
@@ -1225,150 +1098,11 @@
packet->set_packet_type(RtpPacketToSend::Type::kRetransmission);
packet->SetExtension<TransportSequenceNumber>(kTransportSequenceNumber);
rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo());
- }
EXPECT_EQ(1, transport_.packets_sent());
EXPECT_TRUE(transport_.last_options_.is_retransmit);
}
-TEST_P(RtpSenderTest, OnSendPacketNotUpdatedWithoutSeqNumAllocator) {
- if (!GetParam().pacer_references_packets) {
- // When PacedSender owns packets, there is no
- // TransportSequenceNumberAllocator callback, so this test does not make any
- // sense.
- // TODO(bugs.webrtc.org/10633): Remove this test once old code is gone.
- return;
- }
-
- RtpRtcp::Configuration config;
- config.clock = &fake_clock_;
- config.outgoing_transport = &transport_;
- config.paced_sender = &mock_paced_sender_;
- config.local_media_ssrc = kSsrc;
- config.send_packet_observer = &send_packet_observer_;
- config.retransmission_rate_limiter = &retransmission_rate_limiter_;
- rtp_sender_ = absl::make_unique<RTPSender>(config);
-
- rtp_sender_->SetSequenceNumber(kSeqNum);
- EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
- kRtpExtensionTransportSequenceNumber,
- kTransportSequenceNumberExtensionId));
- rtp_sender_->SetSequenceNumber(kSeqNum);
- rtp_sender_->SetStorePacketsStatus(true, 10);
-
- EXPECT_CALL(send_packet_observer_, OnSendPacket(_, _, _)).Times(0);
-
- const bool kIsRetransmit = false;
- EXPECT_CALL(mock_paced_sender_, InsertPacket(_, kSsrc, kSeqNum, _, _, _));
- SendGenericPacket(); // Packet passed to pacer.
- rtp_sender_->TimeToSendPacket(kSsrc, kSeqNum,
- fake_clock_.TimeInMilliseconds(), kIsRetransmit,
- PacedPacketInfo());
-
- EXPECT_EQ(1, transport_.packets_sent());
-}
-
-TEST_P(RtpSenderTest, SendRedundantPayloads) {
- if (!GetParam().pacer_references_packets) {
- // If PacedSender owns the RTP packets, GeneratePadding() family of methods
- // will be called instead and this test makes no sense.
- return;
- }
-
- MockTransport transport;
- RtpRtcp::Configuration config;
- config.clock = &fake_clock_;
- config.outgoing_transport = &transport;
- config.paced_sender = &mock_paced_sender_;
- config.local_media_ssrc = kSsrc;
- config.rtx_send_ssrc = kRtxSsrc;
- config.event_log = &mock_rtc_event_log_;
- config.retransmission_rate_limiter = &retransmission_rate_limiter_;
- rtp_sender_ = absl::make_unique<RTPSender>(config);
-
- rtp_sender_->SetSequenceNumber(kSeqNum);
- rtp_sender_->SetRtxPayloadType(kRtxPayload, kPayload);
-
- uint16_t seq_num = kSeqNum;
- rtp_sender_->SetStorePacketsStatus(true, 10);
- int32_t rtp_header_len = kRtpHeaderSize;
- EXPECT_EQ(
- 0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime,
- kAbsoluteSendTimeExtensionId));
- rtp_header_len += 4; // 4 bytes extension.
- rtp_header_len += 4; // 4 extra bytes common to all extension headers.
-
- rtp_sender_->SetRtxStatus(kRtxRetransmitted | kRtxRedundantPayloads);
-
- const size_t kNumPayloadSizes = 10;
- const size_t kPayloadSizes[kNumPayloadSizes] = {500, 550, 600, 650, 700,
- 750, 800, 850, 900, 950};
- // Expect all packets go through the pacer.
- EXPECT_CALL(mock_rtc_event_log_,
- LogProxy(SameRtcEventTypeAs(RtcEvent::Type::RtpPacketOutgoing)))
- .Times(kNumPayloadSizes);
-
- // Send 10 packets of increasing size.
- for (size_t i = 0; i < kNumPayloadSizes; ++i) {
- int64_t capture_time_ms = fake_clock_.TimeInMilliseconds();
-
- EXPECT_CALL(transport, SendRtp(_, _, _)).WillOnce(::testing::Return(true));
-
- if (GetParam().pacer_references_packets) {
- EXPECT_CALL(mock_paced_sender_, InsertPacket(_, kSsrc, seq_num, _, _, _));
- SendPacket(capture_time_ms, kPayloadSizes[i]);
- rtp_sender_->TimeToSendPacket(kSsrc, seq_num,
- fake_clock_.TimeInMilliseconds(), false,
- PacedPacketInfo());
- } else {
- EXPECT_CALL(
- mock_paced_sender_,
- EnqueuePacket(AllOf(
- Pointee(Property(&RtpPacketToSend::Ssrc, kSsrc)),
- Pointee(Property(&RtpPacketToSend::SequenceNumber, seq_num)))));
- auto packet = SendPacket(capture_time_ms, kPayloadSizes[i]);
- packet->set_packet_type(RtpPacketToSend::Type::kVideo);
- rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo());
- }
-
- ++seq_num;
- fake_clock_.AdvanceTimeMilliseconds(33);
- }
-
- EXPECT_CALL(mock_rtc_event_log_,
- LogProxy(SameRtcEventTypeAs(RtcEvent::Type::RtpPacketOutgoing)))
- .Times(AtLeast(4));
-
- // The amount of padding to send it too small to send a payload packet.
- EXPECT_CALL(transport, SendRtp(_, kMaxPaddingSize + rtp_header_len, _))
- .WillOnce(Return(true));
- EXPECT_EQ(kMaxPaddingSize,
- rtp_sender_->TimeToSendPadding(49, PacedPacketInfo()));
-
- // Payload padding will prefer packets with lower transmit count first and
- // lower age second.
- EXPECT_CALL(transport, SendRtp(_,
- kPayloadSizes[kNumPayloadSizes - 1] +
- rtp_header_len + kRtxHeaderSize,
- Field(&PacketOptions::is_retransmit, true)))
- .WillOnce(Return(true));
- EXPECT_EQ(kPayloadSizes[kNumPayloadSizes - 1],
- rtp_sender_->TimeToSendPadding(500, PacedPacketInfo()));
-
- EXPECT_CALL(transport, SendRtp(_,
- kPayloadSizes[kNumPayloadSizes - 2] +
- rtp_header_len + kRtxHeaderSize,
- _))
- .WillOnce(Return(true));
-
- EXPECT_CALL(transport, SendRtp(_, kMaxPaddingSize + rtp_header_len,
- Field(&PacketOptions::is_retransmit, false)))
- .WillOnce(Return(true));
- EXPECT_EQ(kPayloadSizes[kNumPayloadSizes - 2] + kMaxPaddingSize,
- rtp_sender_->TimeToSendPadding(
- kPayloadSizes[kNumPayloadSizes - 2] + 49, PacedPacketInfo()));
-}
-
TEST_P(RtpSenderTestWithoutPacer, SendGenericVideo) {
const char payload_name[] = "GENERIC";
const uint8_t payload_type = 127;
@@ -1476,27 +1210,6 @@
uint16_t flexfec_seq_num;
RTPVideoHeader video_header;
- if (GetParam().pacer_references_packets) {
- EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kLowPriority,
- kSsrc, kSeqNum, _, _, false));
- EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kLowPriority,
- kFlexFecSsrc, _, _, _, false))
- .WillOnce(::testing::SaveArg<2>(&flexfec_seq_num));
-
- EXPECT_TRUE(rtp_sender_video.SendVideo(
- VideoFrameType::kVideoFrameKey, kMediaPayloadType, kTimestamp,
- fake_clock_.TimeInMilliseconds(), kPayloadData, sizeof(kPayloadData),
- nullptr, &video_header, kDefaultExpectedRetransmissionTimeMs));
-
- EXPECT_EQ(RtpPacketSendResult::kSuccess,
- rtp_sender_->TimeToSendPacket(kSsrc, kSeqNum,
- fake_clock_.TimeInMilliseconds(),
- false, PacedPacketInfo()));
- EXPECT_EQ(RtpPacketSendResult::kSuccess,
- rtp_sender_->TimeToSendPacket(kFlexFecSsrc, flexfec_seq_num,
- fake_clock_.TimeInMilliseconds(),
- false, PacedPacketInfo()));
- } else {
std::unique_ptr<RtpPacketToSend> media_packet;
std::unique_ptr<RtpPacketToSend> fec_packet;
@@ -1525,17 +1238,16 @@
flexfec_seq_num = fec_packet->SequenceNumber();
rtp_sender_->TrySendPacket(media_packet.get(), PacedPacketInfo());
rtp_sender_->TrySendPacket(fec_packet.get(), PacedPacketInfo());
- }
ASSERT_EQ(2, transport_.packets_sent());
- const RtpPacketReceived& media_packet = transport_.sent_packets_[0];
- EXPECT_EQ(kMediaPayloadType, media_packet.PayloadType());
- EXPECT_EQ(kSeqNum, media_packet.SequenceNumber());
- EXPECT_EQ(kSsrc, media_packet.Ssrc());
- const RtpPacketReceived& flexfec_packet = transport_.sent_packets_[1];
- EXPECT_EQ(kFlexfecPayloadType, flexfec_packet.PayloadType());
- EXPECT_EQ(flexfec_seq_num, flexfec_packet.SequenceNumber());
- EXPECT_EQ(kFlexFecSsrc, flexfec_packet.Ssrc());
+ const RtpPacketReceived& sent_media_packet = transport_.sent_packets_[0];
+ EXPECT_EQ(kMediaPayloadType, sent_media_packet.PayloadType());
+ EXPECT_EQ(kSeqNum, sent_media_packet.SequenceNumber());
+ EXPECT_EQ(kSsrc, sent_media_packet.Ssrc());
+ const RtpPacketReceived& sent_flexfec_packet = transport_.sent_packets_[1];
+ EXPECT_EQ(kFlexfecPayloadType, sent_flexfec_packet.PayloadType());
+ EXPECT_EQ(flexfec_seq_num, sent_flexfec_packet.SequenceNumber());
+ EXPECT_EQ(kFlexFecSsrc, sent_flexfec_packet.Ssrc());
}
// TODO(ilnik): because of webrtc:7859. Once FEC moved below pacer, this test
@@ -1591,23 +1303,6 @@
EXPECT_CALL(mock_rtc_event_log_,
LogProxy(SameRtcEventTypeAs(RtcEvent::Type::RtpPacketOutgoing)))
.Times(1);
- if (GetParam().pacer_references_packets) {
- EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kLowPriority,
- kSsrc, kSeqNum, _, _, false));
- EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kLowPriority,
- kFlexFecSsrc, _, _, _, false))
- .Times(0); // Not called because packet should not be protected.
-
- EXPECT_TRUE(rtp_sender_video.SendVideo(
- VideoFrameType::kVideoFrameKey, kMediaPayloadType, kTimestamp,
- kCaptureTimeMs, kPayloadData, sizeof(kPayloadData), nullptr,
- &video_header, kDefaultExpectedRetransmissionTimeMs));
-
- EXPECT_EQ(RtpPacketSendResult::kSuccess,
- rtp_sender_->TimeToSendPacket(kSsrc, kSeqNum,
- fake_clock_.TimeInMilliseconds(),
- false, PacedPacketInfo()));
- } else {
std::unique_ptr<RtpPacketToSend> rtp_packet;
EXPECT_CALL(
mock_paced_sender_,
@@ -1630,13 +1325,12 @@
EXPECT_TRUE(
rtp_sender_->TrySendPacket(rtp_packet.get(), PacedPacketInfo()));
- }
ASSERT_EQ(1, transport_.packets_sent());
- const RtpPacketReceived& media_packet = transport_.sent_packets_[0];
- EXPECT_EQ(kMediaPayloadType, media_packet.PayloadType());
- EXPECT_EQ(kSeqNum, media_packet.SequenceNumber());
- EXPECT_EQ(kSsrc, media_packet.Ssrc());
+ const RtpPacketReceived& sent_media_packet1 = transport_.sent_packets_[0];
+ EXPECT_EQ(kMediaPayloadType, sent_media_packet1.PayloadType());
+ EXPECT_EQ(kSeqNum, sent_media_packet1.SequenceNumber());
+ EXPECT_EQ(kSsrc, sent_media_packet1.Ssrc());
// Now try to send not a timing frame.
uint16_t flexfec_seq_num;
@@ -1644,65 +1338,42 @@
EXPECT_CALL(mock_rtc_event_log_,
LogProxy(SameRtcEventTypeAs(RtcEvent::Type::RtpPacketOutgoing)))
.Times(2);
- if (GetParam().pacer_references_packets) {
- EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kLowPriority,
- kFlexFecSsrc, _, _, _, false))
- .WillOnce(::testing::SaveArg<2>(&flexfec_seq_num));
- EXPECT_CALL(mock_paced_sender_,
- InsertPacket(RtpPacketSender::kLowPriority, kSsrc, kSeqNum + 1,
- _, _, false));
- video_header.video_timing.flags = VideoSendTiming::kInvalid;
- EXPECT_TRUE(rtp_sender_video.SendVideo(
- VideoFrameType::kVideoFrameKey, kMediaPayloadType, kTimestamp + 1,
- kCaptureTimeMs + 1, kPayloadData, sizeof(kPayloadData), nullptr,
- &video_header, kDefaultExpectedRetransmissionTimeMs));
+ std::unique_ptr<RtpPacketToSend> media_packet2;
+ std::unique_ptr<RtpPacketToSend> fec_packet;
- EXPECT_EQ(RtpPacketSendResult::kSuccess,
- rtp_sender_->TimeToSendPacket(kSsrc, kSeqNum + 1,
- fake_clock_.TimeInMilliseconds(),
- false, PacedPacketInfo()));
- EXPECT_EQ(RtpPacketSendResult::kSuccess,
- rtp_sender_->TimeToSendPacket(kFlexFecSsrc, flexfec_seq_num,
- fake_clock_.TimeInMilliseconds(),
- false, PacedPacketInfo()));
- } else {
- std::unique_ptr<RtpPacketToSend> media_packet;
- std::unique_ptr<RtpPacketToSend> fec_packet;
+ EXPECT_CALL(mock_paced_sender_, EnqueuePacket)
+ .Times(2)
+ .WillRepeatedly([&](std::unique_ptr<RtpPacketToSend> packet) {
+ if (packet->packet_type() == RtpPacketToSend::Type::kVideo) {
+ EXPECT_EQ(packet->Ssrc(), kSsrc);
+ EXPECT_EQ(packet->SequenceNumber(), kSeqNum + 1);
+ media_packet2 = std::move(packet);
+ } else {
+ EXPECT_EQ(packet->packet_type(),
+ RtpPacketToSend::Type::kForwardErrorCorrection);
+ EXPECT_EQ(packet->Ssrc(), kFlexFecSsrc);
+ fec_packet = std::move(packet);
+ }
+ });
- EXPECT_CALL(mock_paced_sender_, EnqueuePacket)
- .Times(2)
- .WillRepeatedly([&](std::unique_ptr<RtpPacketToSend> packet) {
- if (packet->packet_type() == RtpPacketToSend::Type::kVideo) {
- EXPECT_EQ(packet->Ssrc(), kSsrc);
- EXPECT_EQ(packet->SequenceNumber(), kSeqNum + 1);
- media_packet = std::move(packet);
- } else {
- EXPECT_EQ(packet->packet_type(),
- RtpPacketToSend::Type::kForwardErrorCorrection);
- EXPECT_EQ(packet->Ssrc(), kFlexFecSsrc);
- fec_packet = std::move(packet);
- }
- });
+ video_header.video_timing.flags = VideoSendTiming::kInvalid;
+ EXPECT_TRUE(rtp_sender_video.SendVideo(
+ VideoFrameType::kVideoFrameKey, kMediaPayloadType, kTimestamp + 1,
+ kCaptureTimeMs + 1, kPayloadData, sizeof(kPayloadData), nullptr,
+ &video_header, kDefaultExpectedRetransmissionTimeMs));
- video_header.video_timing.flags = VideoSendTiming::kInvalid;
- EXPECT_TRUE(rtp_sender_video.SendVideo(
- VideoFrameType::kVideoFrameKey, kMediaPayloadType, kTimestamp + 1,
- kCaptureTimeMs + 1, kPayloadData, sizeof(kPayloadData), nullptr,
- &video_header, kDefaultExpectedRetransmissionTimeMs));
+ ASSERT_TRUE(media_packet2 != nullptr);
+ ASSERT_TRUE(fec_packet != nullptr);
- ASSERT_TRUE(media_packet != nullptr);
- ASSERT_TRUE(fec_packet != nullptr);
-
- flexfec_seq_num = fec_packet->SequenceNumber();
- rtp_sender_->TrySendPacket(media_packet.get(), PacedPacketInfo());
- rtp_sender_->TrySendPacket(fec_packet.get(), PacedPacketInfo());
- }
+ flexfec_seq_num = fec_packet->SequenceNumber();
+ rtp_sender_->TrySendPacket(media_packet2.get(), PacedPacketInfo());
+ rtp_sender_->TrySendPacket(fec_packet.get(), PacedPacketInfo());
ASSERT_EQ(3, transport_.packets_sent());
- const RtpPacketReceived& media_packet2 = transport_.sent_packets_[1];
- EXPECT_EQ(kMediaPayloadType, media_packet2.PayloadType());
- EXPECT_EQ(kSeqNum + 1, media_packet2.SequenceNumber());
- EXPECT_EQ(kSsrc, media_packet2.Ssrc());
+ const RtpPacketReceived& sent_media_packet2 = transport_.sent_packets_[1];
+ EXPECT_EQ(kMediaPayloadType, sent_media_packet2.PayloadType());
+ EXPECT_EQ(kSeqNum + 1, sent_media_packet2.SequenceNumber());
+ EXPECT_EQ(kSsrc, sent_media_packet2.Ssrc());
const RtpPacketReceived& flexfec_packet = transport_.sent_packets_[2];
EXPECT_EQ(kFlexfecPayloadType, flexfec_packet.PayloadType());
EXPECT_EQ(flexfec_seq_num, flexfec_packet.SequenceNumber());
@@ -2018,13 +1689,8 @@
constexpr size_t kNumMediaPackets = 10;
constexpr size_t kNumFecPackets = kNumMediaPackets;
constexpr int64_t kTimeBetweenPacketsMs = 10;
- if (GetParam().pacer_references_packets) {
- EXPECT_CALL(mock_paced_sender_, InsertPacket(_, _, _, _, _, false))
- .Times(kNumMediaPackets + kNumFecPackets);
- } else {
EXPECT_CALL(mock_paced_sender_, EnqueuePacket)
.Times(kNumMediaPackets + kNumFecPackets);
- }
for (size_t i = 0; i < kNumMediaPackets; ++i) {
RTPVideoHeader video_header;
@@ -2812,24 +2478,6 @@
const uint32_t kTimestampTicksPerMs = 90;
const int64_t kOffsetMs = 10;
- if (GetParam().pacer_references_packets) {
- EXPECT_CALL(mock_paced_sender_, InsertPacket);
-
- auto packet =
- BuildRtpPacket(kPayload, kMarkerBit, fake_clock_.TimeInMilliseconds(),
- kMissingCaptureTimeMs);
- packet->set_packet_type(RtpPacketToSend::Type::kVideo);
- packet->ReserveExtension<TransmissionOffset>();
- packet->AllocatePayload(sizeof(kPayloadData));
- EXPECT_TRUE(
- rtp_sender_->SendToNetwork(std::move(packet), kAllowRetransmission));
-
- fake_clock_.AdvanceTimeMilliseconds(kOffsetMs);
-
- rtp_sender_->TimeToSendPacket(kSsrc, kSeqNum,
- fake_clock_.TimeInMilliseconds(), false,
- PacedPacketInfo());
- } else {
auto packet =
BuildRtpPacket(kPayload, kMarkerBit, fake_clock_.TimeInMilliseconds(),
kMissingCaptureTimeMs);
@@ -2850,7 +2498,6 @@
fake_clock_.AdvanceTimeMilliseconds(kOffsetMs);
rtp_sender_->TrySendPacket(packet_to_pace.get(), PacedPacketInfo());
- }
EXPECT_EQ(1, transport_.packets_sent());
absl::optional<int32_t> transmission_time_extension =
@@ -2862,13 +2509,6 @@
// original packet, so offset is delta from original packet to now.
fake_clock_.AdvanceTimeMilliseconds(kOffsetMs);
- if (GetParam().pacer_references_packets) {
- EXPECT_CALL(mock_paced_sender_, InsertPacket);
- EXPECT_GT(rtp_sender_->ReSendPacket(kSeqNum), 0);
- rtp_sender_->TimeToSendPacket(kSsrc, kSeqNum,
- fake_clock_.TimeInMilliseconds(), true,
- PacedPacketInfo());
- } else {
std::unique_ptr<RtpPacketToSend> rtx_packet_to_pace;
EXPECT_CALL(mock_paced_sender_, EnqueuePacket)
.WillOnce([&](std::unique_ptr<RtpPacketToSend> packet) {
@@ -2878,7 +2518,6 @@
EXPECT_GT(rtp_sender_->ReSendPacket(kSeqNum), 0);
rtp_sender_->TrySendPacket(rtx_packet_to_pace.get(), PacedPacketInfo());
- }
EXPECT_EQ(2, transport_.packets_sent());
transmission_time_extension =
@@ -2953,28 +2592,6 @@
rtp_sender_->SetRtt(kRtt);
// Send a packet so it is in the packet history.
- if (GetParam().pacer_references_packets) {
- EXPECT_CALL(mock_paced_sender_, InsertPacket);
- SendGenericPacket();
- rtp_sender_->TimeToSendPacket(kSsrc, kSeqNum,
- fake_clock_.TimeInMilliseconds(), false,
- PacedPacketInfo());
- ASSERT_EQ(1u, transport_.sent_packets_.size());
-
- // Disable media sending and try to retransmit the packet, it should be put
- // in the pacer queue.
- rtp_sender_->SetSendingMediaStatus(false);
- fake_clock_.AdvanceTimeMilliseconds(kRtt);
- EXPECT_CALL(mock_paced_sender_, InsertPacket);
- EXPECT_GT(rtp_sender_->ReSendPacket(kSeqNum), 0);
-
- // Time to send the retransmission. It should fail and the send packet
- // counter should not increase.
- rtp_sender_->TimeToSendPacket(kSsrc, kSeqNum,
- fake_clock_.TimeInMilliseconds(), true,
- PacedPacketInfo());
- ASSERT_EQ(1u, transport_.sent_packets_.size());
- } else {
std::unique_ptr<RtpPacketToSend> packet_to_pace;
EXPECT_CALL(mock_paced_sender_, EnqueuePacket)
.WillOnce([&](std::unique_ptr<RtpPacketToSend> packet) {
@@ -2990,19 +2607,16 @@
rtp_sender_->SetSendingMediaStatus(false);
fake_clock_.AdvanceTimeMilliseconds(kRtt);
EXPECT_LT(rtp_sender_->ReSendPacket(kSeqNum), 0);
- }
}
INSTANTIATE_TEST_SUITE_P(WithAndWithoutOverhead,
RtpSenderTest,
- ::testing::Values(TestConfig{false, false},
- TestConfig{false, true},
- TestConfig{true, false},
- TestConfig{true, true}));
+ ::testing::Values(TestConfig{false},
+ TestConfig{true}));
INSTANTIATE_TEST_SUITE_P(WithAndWithoutOverhead,
RtpSenderTestWithoutPacer,
- ::testing::Values(TestConfig{false, false},
- TestConfig{true, false}));
+ ::testing::Values(TestConfig{false},
+ TestConfig{true}));
} // namespace webrtc