From fc968a283c91cd4395b0ee8f232d29d566cc1316 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20Bostr=C3=B6m?= Date: Fri, 19 Feb 2016 16:14:37 +0100 Subject: [PATCH] Fix sequence-number replay race for padding. Prevents allocating sequence numbers for packets that go out on the network even though sending media is disabled. This race caused a replay of sequence numbers when GetRtpState() on a stopped stream would not return the last sequence number sent, since the pacer thread could request and send padding on a later sequence number before the modules are disconnected from the pacer. BUG=webrtc:5543 R=stefan@webrtc.org TEST=Repeating EndToEndTest.RestartingSendStreamPreservesRtpState 1000 times under TSan. Review URL: https://codereview.webrtc.org/1715703002 . Cr-Commit-Position: refs/heads/master@{#11685} --- webrtc/modules/rtp_rtcp/source/rtp_sender.cc | 9 ++++----- webrtc/video/end_to_end_tests.cc | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/webrtc/modules/rtp_rtcp/source/rtp_sender.cc b/webrtc/modules/rtp_rtcp/source/rtp_sender.cc index c831b5132a..97469ca35e 100644 --- a/webrtc/modules/rtp_rtcp/source/rtp_sender.cc +++ b/webrtc/modules/rtp_rtcp/source/rtp_sender.cc @@ -556,6 +556,8 @@ int32_t RTPSender::SendOutgoingData(FrameType frame_type, size_t RTPSender::TrySendRedundantPayloads(size_t bytes_to_send) { { rtc::CritScope lock(&send_critsect_); + if (!sending_media_) + return 0; if ((rtx_ & kRtxRedundantPayloads) == 0) return 0; } @@ -618,6 +620,8 @@ size_t RTPSender::SendPadData(size_t bytes, bool over_rtx; { rtc::CritScope lock(&send_critsect_); + if (!sending_media_) + return bytes_sent; if (!timestamp_provided) { timestamp = timestamp_; capture_time_ms = capture_time_ms_; @@ -1011,11 +1015,6 @@ bool RTPSender::IsFecPacket(const uint8_t* buffer, size_t RTPSender::TimeToSendPadding(size_t bytes) { if (audio_configured_ || bytes == 0) return 0; - { - rtc::CritScope lock(&send_critsect_); - if (!sending_media_) - return 0; - } size_t bytes_sent = TrySendRedundantPayloads(bytes); if (bytes_sent < bytes) bytes_sent += SendPadData(bytes - bytes_sent, false, 0, 0); diff --git a/webrtc/video/end_to_end_tests.cc b/webrtc/video/end_to_end_tests.cc index 6de9e483d8..1c804098e8 100644 --- a/webrtc/video/end_to_end_tests.cc +++ b/webrtc/video/end_to_end_tests.cc @@ -3148,7 +3148,7 @@ void EndToEndTest::TestRtpStatePreservation(bool use_rtx) { DestroyStreams(); } -TEST_F(EndToEndTest, DISABLED_RestartingSendStreamPreservesRtpState) { +TEST_F(EndToEndTest, RestartingSendStreamPreservesRtpState) { TestRtpStatePreservation(false); }