diff --git a/webrtc/modules/rtp_rtcp/source/rtp_sender.cc b/webrtc/modules/rtp_rtcp/source/rtp_sender.cc index 0afc8d2438..2fe80ae90f 100644 --- a/webrtc/modules/rtp_rtcp/source/rtp_sender.cc +++ b/webrtc/modules/rtp_rtcp/source/rtp_sender.cc @@ -850,7 +850,8 @@ bool RTPSender::PrepareAndSendPacket(uint8_t* buffer, uint8_t data_buffer_rtx[IP_PACKET_SIZE]; if (send_over_rtx) { - BuildRtxPacket(buffer, &length, data_buffer_rtx); + if (!BuildRtxPacket(buffer, &length, data_buffer_rtx)) + return false; buffer_to_send_ptr = data_buffer_rtx; } @@ -1154,6 +1155,8 @@ int32_t RTPSender::BuildRtpHeader(uint8_t* data_buffer, int64_t capture_time_ms) { assert(payload_type >= 0); rtc::CritScope lock(&send_critsect_); + if (!sending_media_) + return -1; timestamp_ = start_timestamp_ + capture_timestamp; last_timestamp_time_ms_ = clock_->TimeInMilliseconds(); @@ -1793,9 +1796,12 @@ int32_t RTPSender::SetFecParameters( return 0; } -void RTPSender::BuildRtxPacket(uint8_t* buffer, size_t* length, +bool RTPSender::BuildRtxPacket(uint8_t* buffer, + size_t* length, uint8_t* buffer_rtx) { rtc::CritScope lock(&send_critsect_); + if (!sending_media_) + return false; uint8_t* data_buffer_rtx = buffer_rtx; // Add RTX header. RtpUtility::RtpHeaderParser rtp_parser( @@ -1836,6 +1842,7 @@ void RTPSender::BuildRtxPacket(uint8_t* buffer, size_t* length, memcpy(ptr, buffer + rtp_header.headerLength, *length - rtp_header.headerLength); *length += 2; + return true; } void RTPSender::RegisterRtpStatisticsCallback( diff --git a/webrtc/modules/rtp_rtcp/source/rtp_sender.h b/webrtc/modules/rtp_rtcp/source/rtp_sender.h index 467dd74086..a7fab0f860 100644 --- a/webrtc/modules/rtp_rtcp/source/rtp_sender.h +++ b/webrtc/modules/rtp_rtcp/source/rtp_sender.h @@ -373,8 +373,7 @@ class RTPSender : public RTPSenderInterface { size_t header_length, size_t padding_length); - void BuildRtxPacket(uint8_t* buffer, size_t* length, - uint8_t* buffer_rtx); + bool BuildRtxPacket(uint8_t* buffer, size_t* length, uint8_t* buffer_rtx); bool SendPacketToNetwork(const uint8_t* packet, size_t size, diff --git a/webrtc/modules/rtp_rtcp/source/rtp_sender_audio.cc b/webrtc/modules/rtp_rtcp/source/rtp_sender_audio.cc index 2df548efd5..4ff61ab484 100644 --- a/webrtc/modules/rtp_rtcp/source/rtp_sender_audio.cc +++ b/webrtc/modules/rtp_rtcp/source/rtp_sender_audio.cc @@ -418,8 +418,11 @@ int32_t RTPSenderAudio::SendTelephoneEventPacket(bool ended, } do { // Send DTMF data - rtp_sender_->BuildRtpHeader(dtmfbuffer, dtmf_payload_type, marker_bit, - dtmf_timestamp, clock_->TimeInMilliseconds()); + int32_t header_length = rtp_sender_->BuildRtpHeader( + dtmfbuffer, dtmf_payload_type, marker_bit, dtmf_timestamp, + clock_->TimeInMilliseconds()); + if (header_length <= 0) + return -1; // reset CSRC and X bit dtmfbuffer[0] &= 0xe0; diff --git a/webrtc/modules/rtp_rtcp/source/rtp_sender_video.cc b/webrtc/modules/rtp_rtcp/source/rtp_sender_video.cc index 9757e52e80..5364a9b831 100644 --- a/webrtc/modules/rtp_rtcp/source/rtp_sender_video.cc +++ b/webrtc/modules/rtp_rtcp/source/rtp_sender_video.cc @@ -266,8 +266,10 @@ int32_t RTPSenderVideo::SendVideo(RtpVideoCodecTypes video_type, } // Write RTP header. - rtp_sender_->BuildRtpHeader(dataBuffer, payload_type, last, - capture_timestamp, capture_time_ms); + int32_t header_length = rtp_sender_->BuildRtpHeader( + dataBuffer, payload_type, last, capture_timestamp, capture_time_ms); + if (header_length <= 0) + return -1; // According to // http://www.etsi.org/deliver/etsi_ts/126100_126199/126114/12.07.00_60/ diff --git a/webrtc/video/end_to_end_tests.cc b/webrtc/video/end_to_end_tests.cc index b2a29d2c61..528338defe 100644 --- a/webrtc/video/end_to_end_tests.cc +++ b/webrtc/video/end_to_end_tests.cc @@ -3062,9 +3062,9 @@ void EndToEndTest::TestRtpStatePreservation(bool use_rtx, : test::RtpRtcpObserver(kDefaultTimeoutMs), ssrcs_to_observe_(kNumSsrcs) { for (size_t i = 0; i < kNumSsrcs; ++i) { - configured_ssrcs_[kVideoSendSsrcs[i]] = true; + ssrc_is_rtx_[kVideoSendSsrcs[i]] = false; if (use_rtx) - configured_ssrcs_[kSendRtxSsrcs[i]] = true; + ssrc_is_rtx_[kSendRtxSsrcs[i]] = true; } } @@ -3107,7 +3107,7 @@ void EndToEndTest::TestRtpStatePreservation(bool use_rtx, const bool only_padding = header.headerLength + header.paddingLength == length; - EXPECT_TRUE(configured_ssrcs_[ssrc]) + EXPECT_TRUE(ssrc_is_rtx_.find(ssrc) != ssrc_is_rtx_.end()) << "Received SSRC that wasn't configured: " << ssrc; static const int64_t kMaxSequenceNumberGap = 100; @@ -3133,14 +3133,16 @@ void EndToEndTest::TestRtpStatePreservation(bool use_rtx, } } - rtc::CritScope lock(&crit_); - ValidateTimestampGap(ssrc, timestamp, only_padding); + if (!ssrc_is_rtx_[ssrc]) { + rtc::CritScope lock(&crit_); + ValidateTimestampGap(ssrc, timestamp, only_padding); - // Wait for media packets on all ssrcs. - if (!ssrc_observed_[ssrc] && !only_padding) { - ssrc_observed_[ssrc] = true; - if (--ssrcs_to_observe_ == 0) - observation_complete_.Set(); + // Wait for media packets on all ssrcs. + if (!ssrc_observed_[ssrc] && !only_padding) { + ssrc_observed_[ssrc] = true; + if (--ssrcs_to_observe_ == 0) + observation_complete_.Set(); + } } return SEND_PACKET; @@ -3162,7 +3164,7 @@ void EndToEndTest::TestRtpStatePreservation(bool use_rtx, SequenceNumberUnwrapper seq_numbers_unwrapper_; std::map> last_observed_seq_numbers_; std::map last_observed_timestamp_; - std::map configured_ssrcs_; + std::map ssrc_is_rtx_; rtc::CriticalSection crit_; size_t ssrcs_to_observe_ GUARDED_BY(crit_); @@ -3272,14 +3274,11 @@ TEST_F(EndToEndTest, RestartingSendStreamPreservesRtpState) { TestRtpStatePreservation(false, false); } -// These tests are flaky. See: -// https://bugs.chromium.org/p/webrtc/issues/detail?id=4332 -TEST_F(EndToEndTest, DISABLED_RestartingSendStreamPreservesRtpStatesWithRtx) { +TEST_F(EndToEndTest, RestartingSendStreamPreservesRtpStatesWithRtx) { TestRtpStatePreservation(true, false); } -TEST_F(EndToEndTest, - DISABLED_RestartingSendStreamKeepsRtpAndRtcpTimestampsSynced) { +TEST_F(EndToEndTest, RestartingSendStreamKeepsRtpAndRtcpTimestampsSynced) { TestRtpStatePreservation(true, true); }