Don't increment transport sequence number on send failures.
Bug: webrtc:14130 Change-Id: Idee794445872f3db8ffae7c3e2cef5e72843ef25 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/265640 Reviewed-by: Danil Chapovalov <danilchap@webrtc.org> Commit-Queue: Erik Språng <sprang@webrtc.org> Cr-Commit-Position: refs/heads/main@{#37190}
This commit is contained in:

committed by
WebRTC LUCI CQ

parent
72b5dbc44b
commit
c62e1b8d10
@ -143,8 +143,11 @@ void PacketRouter::SendPacket(std::unique_ptr<RtpPacketToSend> packet,
|
|||||||
MutexLock lock(&modules_mutex_);
|
MutexLock lock(&modules_mutex_);
|
||||||
// With the new pacer code path, transport sequence numbers are only set here,
|
// With the new pacer code path, transport sequence numbers are only set here,
|
||||||
// on the pacer thread. Therefore we don't need atomics/synchronization.
|
// on the pacer thread. Therefore we don't need atomics/synchronization.
|
||||||
if (packet->HasExtension<TransportSequenceNumber>()) {
|
bool assign_transport_sequence_number =
|
||||||
packet->SetExtension<TransportSequenceNumber>((++transport_seq_) & 0xFFFF);
|
packet->HasExtension<TransportSequenceNumber>();
|
||||||
|
if (assign_transport_sequence_number) {
|
||||||
|
packet->SetExtension<TransportSequenceNumber>((transport_seq_ + 1) &
|
||||||
|
0xFFFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t ssrc = packet->Ssrc();
|
uint32_t ssrc = packet->Ssrc();
|
||||||
@ -163,6 +166,12 @@ void PacketRouter::SendPacket(std::unique_ptr<RtpPacketToSend> packet,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Sending succeeded.
|
||||||
|
|
||||||
|
if (assign_transport_sequence_number) {
|
||||||
|
++transport_seq_;
|
||||||
|
}
|
||||||
|
|
||||||
if (rtp_module->SupportsRtxPayloadPadding()) {
|
if (rtp_module->SupportsRtxPayloadPadding()) {
|
||||||
// This is now the last module to send media, and has the desired
|
// This is now the last module to send media, and has the desired
|
||||||
// properties needed for payload based padding. Cache it for later use.
|
// properties needed for payload based padding. Cache it for later use.
|
||||||
|
@ -399,6 +399,43 @@ TEST_F(PacketRouterTest, SendPacketAssignsTransportSequenceNumbers) {
|
|||||||
packet_router_.RemoveSendRtpModule(&rtp_2);
|
packet_router_.RemoveSendRtpModule(&rtp_2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(PacketRouterTest, DoesNotIncrementTransportSequenceNumberOnSendFailure) {
|
||||||
|
NiceMock<MockRtpRtcpInterface> rtp;
|
||||||
|
constexpr uint32_t kSsrc = 1234;
|
||||||
|
ON_CALL(rtp, SSRC).WillByDefault(Return(kSsrc));
|
||||||
|
packet_router_.AddSendRtpModule(&rtp, false);
|
||||||
|
|
||||||
|
// Transport sequence numbers start at 1, for historical reasons.
|
||||||
|
const uint16_t kStartTransportSequenceNumber = 1;
|
||||||
|
|
||||||
|
// Build and send a packet - it should be assigned the start sequence number.
|
||||||
|
// Return failure status code to make sure sequence number is not incremented.
|
||||||
|
auto packet = BuildRtpPacket(kSsrc);
|
||||||
|
EXPECT_TRUE(packet->ReserveExtension<TransportSequenceNumber>());
|
||||||
|
EXPECT_CALL(
|
||||||
|
rtp, TrySendPacket(
|
||||||
|
Property(&RtpPacketToSend::GetExtension<TransportSequenceNumber>,
|
||||||
|
kStartTransportSequenceNumber),
|
||||||
|
_))
|
||||||
|
.WillOnce(Return(false));
|
||||||
|
packet_router_.SendPacket(std::move(packet), PacedPacketInfo());
|
||||||
|
|
||||||
|
// Send another packet, verify transport sequence number is still at the
|
||||||
|
// start state.
|
||||||
|
packet = BuildRtpPacket(kSsrc);
|
||||||
|
EXPECT_TRUE(packet->ReserveExtension<TransportSequenceNumber>());
|
||||||
|
|
||||||
|
EXPECT_CALL(
|
||||||
|
rtp, TrySendPacket(
|
||||||
|
Property(&RtpPacketToSend::GetExtension<TransportSequenceNumber>,
|
||||||
|
kStartTransportSequenceNumber),
|
||||||
|
_))
|
||||||
|
.WillOnce(Return(true));
|
||||||
|
packet_router_.SendPacket(std::move(packet), PacedPacketInfo());
|
||||||
|
|
||||||
|
packet_router_.RemoveSendRtpModule(&rtp);
|
||||||
|
}
|
||||||
|
|
||||||
#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
|
#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
|
||||||
using PacketRouterDeathTest = PacketRouterTest;
|
using PacketRouterDeathTest = PacketRouterTest;
|
||||||
TEST_F(PacketRouterDeathTest, DoubleRegistrationOfSendModuleDisallowed) {
|
TEST_F(PacketRouterDeathTest, DoubleRegistrationOfSendModuleDisallowed) {
|
||||||
|
Reference in New Issue
Block a user