Add ability to abort retransmissions.

In some upcoming use cases we might wish to flush pending
retransmissions from the pacer queue. In order to not make those packets
forever inaccessible this CL adds a way to clear their "pending" status
from the packet history.

Bug: webrtc:11340
Change-Id: I9aac44125899a7f1e5a5e5be3390ac07b1e661ad
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/274600
Reviewed-by: Danil Chapovalov <danilchap@webrtc.org>
Commit-Queue: Erik Språng <sprang@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#38037}
This commit is contained in:
Erik Språng
2022-09-08 16:53:06 +02:00
committed by WebRTC LUCI CQ
parent 7c323ad47c
commit 5045949490
9 changed files with 68 additions and 0 deletions

View File

@ -97,6 +97,10 @@ class MockRtpRtcpInterface : public RtpRtcpInterface {
FetchFecPackets,
(),
(override));
MOCK_METHOD(void,
OnAbortedRetransmissions,
(rtc::ArrayView<const uint16_t>),
(override));
MOCK_METHOD(void,
OnPacketsAcknowledged,
(rtc::ArrayView<const uint16_t>),

View File

@ -400,6 +400,12 @@ ModuleRtpRtcpImpl::FetchFecPackets() {
return {};
}
void ModuleRtpRtcpImpl::OnAbortedRetransmissions(
rtc::ArrayView<const uint16_t> sequence_numbers) {
RTC_DCHECK_NOTREACHED()
<< "Stream flushing not supported with legacy rtp modules.";
}
void ModuleRtpRtcpImpl::OnPacketsAcknowledged(
rtc::ArrayView<const uint16_t> sequence_numbers) {
RTC_DCHECK(rtp_sender_);

View File

@ -139,6 +139,9 @@ class ModuleRtpRtcpImpl : public RtpRtcp, public RTCPReceiver::ModuleRtpRtcp {
std::vector<std::unique_ptr<RtpPacketToSend>> FetchFecPackets() override;
void OnAbortedRetransmissions(
rtc::ArrayView<const uint16_t> sequence_numbers) override;
void OnPacketsAcknowledged(
rtc::ArrayView<const uint16_t> sequence_numbers) override;

View File

@ -368,6 +368,13 @@ ModuleRtpRtcpImpl2::FetchFecPackets() {
return rtp_sender_->packet_sender.FetchFecPackets();
}
void ModuleRtpRtcpImpl2::OnAbortedRetransmissions(
rtc::ArrayView<const uint16_t> sequence_numbers) {
RTC_DCHECK(rtp_sender_);
RTC_DCHECK_RUN_ON(&rtp_sender_->sequencing_checker);
rtp_sender_->packet_sender.OnAbortedRetransmissions(sequence_numbers);
}
void ModuleRtpRtcpImpl2::OnPacketsAcknowledged(
rtc::ArrayView<const uint16_t> sequence_numbers) {
RTC_DCHECK(rtp_sender_);

View File

@ -154,6 +154,9 @@ class ModuleRtpRtcpImpl2 final : public RtpRtcpInterface,
std::vector<std::unique_ptr<RtpPacketToSend>> FetchFecPackets() override;
void OnAbortedRetransmissions(
rtc::ArrayView<const uint16_t> sequence_numbers) override;
void OnPacketsAcknowledged(
rtc::ArrayView<const uint16_t> sequence_numbers) override;

View File

@ -331,6 +331,9 @@ class RtpRtcpInterface : public RtcpFeedbackSenderInterface {
// returned from the FEC generator.
virtual std::vector<std::unique_ptr<RtpPacketToSend>> FetchFecPackets() = 0;
virtual void OnAbortedRetransmissions(
rtc::ArrayView<const uint16_t> sequence_numbers) = 0;
virtual void OnPacketsAcknowledged(
rtc::ArrayView<const uint16_t> sequence_numbers) = 0;

View File

@ -390,6 +390,17 @@ RtpSenderEgress::FetchFecPackets() {
return {};
}
void RtpSenderEgress::OnAbortedRetransmissions(
rtc::ArrayView<const uint16_t> sequence_numbers) {
RTC_DCHECK_RUN_ON(&pacer_checker_);
// Mark aborted retransmissions as sent, rather than leaving them in
// a 'pending' state - otherwise they can not be requested again and
// will not be cleared until the history has reached its max size.
for (uint16_t seq_no : sequence_numbers) {
packet_history_->MarkPacketAsSent(seq_no);
}
}
bool RtpSenderEgress::HasCorrectSsrc(const RtpPacketToSend& packet) const {
switch (*packet.packet_type()) {
case RtpPacketMediaType::kAudio:

View File

@ -91,6 +91,10 @@ class RtpSenderEgress {
const FecProtectionParams& key_params);
std::vector<std::unique_ptr<RtpPacketToSend>> FetchFecPackets();
// Clears pending status for these sequence numbers in the packet history.
void OnAbortedRetransmissions(
rtc::ArrayView<const uint16_t> sequence_numbers);
private:
// Maps capture time in milliseconds to send-side delay in milliseconds.
// Send-side delay is the difference between transmission time and capture

View File

@ -963,6 +963,33 @@ TEST_P(RtpSenderEgressTest, TransportFeedbackObserverFec) {
sender->SendPacket(fec_packet.get(), PacedPacketInfo());
}
TEST_P(RtpSenderEgressTest, SupportsAbortingRetransmissions) {
std::unique_ptr<RtpSenderEgress> sender = CreateRtpSenderEgress();
packet_history_.SetStorePacketsStatus(
RtpPacketHistory::StorageMode::kStoreAndCull, 10);
// Create a packet and send it so it is put in the history.
std::unique_ptr<RtpPacketToSend> media_packet = BuildRtpPacket();
media_packet->set_packet_type(RtpPacketMediaType::kVideo);
media_packet->set_allow_retransmission(true);
const uint16_t media_sequence_number = media_packet->SequenceNumber();
sender->SendPacket(media_packet.get(), PacedPacketInfo());
// Fetch a retranmission packet from the history, this should mark the
// media packets as pending so it is not available to grab again.
std::unique_ptr<RtpPacketToSend> retransmission_packet =
packet_history_.GetPacketAndMarkAsPending(media_sequence_number);
ASSERT_TRUE(retransmission_packet);
EXPECT_FALSE(
packet_history_.GetPacketAndMarkAsPending(media_sequence_number));
// Mark retransmission as aborted, fetching packet is possible again.
retransmission_packet.reset();
uint16_t kAbortedSequenceNumbers[] = {media_sequence_number};
sender->OnAbortedRetransmissions(kAbortedSequenceNumbers);
EXPECT_TRUE(packet_history_.GetPacketAndMarkAsPending(media_sequence_number));
}
INSTANTIATE_TEST_SUITE_P(WithAndWithoutOverhead,
RtpSenderEgressTest,
::testing::Values(TestConfig(false),