Fix issues with RestartingSendStreamPreservesRtpStatesWithRtx
double check rtp_sender in sending mode when altering sequence_number adjust test to skip validating timestamp on rtx streams fix test by waiting for all 3 media streams instead of 3 out 6 media and rtx streams. BUG=webrtc:4332 Review-Url: https://codereview.webrtc.org/2177523002 Cr-Commit-Position: refs/heads/master@{#13587}
This commit is contained in:
parent
95e756035e
commit
32cd2c4103
@ -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(
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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/
|
||||
|
||||
@ -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<uint32_t, std::list<int64_t>> last_observed_seq_numbers_;
|
||||
std::map<uint32_t, uint32_t> last_observed_timestamp_;
|
||||
std::map<uint32_t, bool> configured_ssrcs_;
|
||||
std::map<uint32_t, bool> 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);
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user