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:
committed by
WebRTC LUCI CQ
parent
7c323ad47c
commit
5045949490
@ -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>),
|
||||
|
||||
@ -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_);
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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_);
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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:
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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),
|
||||
|
||||
Reference in New Issue
Block a user