Drop the RTT as input to IsRetransmitOfOldPacket.

Bug: webrtc:7135
Change-Id: I532334934a757ba0ea6a2daf97b0f1cfd04246e6
Reviewed-on: https://webrtc-review.googlesource.com/12320
Reviewed-by: Danil Chapovalov <danilchap@webrtc.org>
Reviewed-by: Stefan Holmer <stefan@webrtc.org>
Commit-Queue: Niels Moller <nisse@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#23366}
This commit is contained in:
Niels Möller
2018-05-23 13:54:51 +02:00
committed by Commit Bot
parent 89ee4a6c8c
commit eda0087e57
5 changed files with 14 additions and 24 deletions

View File

@ -916,9 +916,7 @@ bool Channel::IsPacketRetransmitted(const RTPHeader& header,
if (!statistician) if (!statistician)
return false; return false;
// Check if this is a retransmission. // Check if this is a retransmission.
int64_t min_rtt = 0; return !in_order && statistician->IsRetransmitOfOldPacket(header);
_rtpRtcpModule->RTT(rtp_receiver_->SSRC(), NULL, NULL, &min_rtt, NULL);
return !in_order && statistician->IsRetransmitOfOldPacket(header, min_rtt);
} }
int32_t Channel::ReceivedRTCPPacket(const uint8_t* data, size_t length) { int32_t Channel::ReceivedRTCPPacket(const uint8_t* data, size_t length) {

View File

@ -49,8 +49,7 @@ class StreamStatistician {
// Returns true if the packet with RTP header |header| is likely to be a // Returns true if the packet with RTP header |header| is likely to be a
// retransmitted packet, false otherwise. // retransmitted packet, false otherwise.
virtual bool IsRetransmitOfOldPacket(const RTPHeader& header, virtual bool IsRetransmitOfOldPacket(const RTPHeader& header) const = 0;
int64_t min_rtt) const = 0;
// Returns true if |sequence_number| is received in order, false otherwise. // Returns true if |sequence_number| is received in order, false otherwise.
virtual bool IsPacketInOrder(uint16_t sequence_number) const = 0; virtual bool IsPacketInOrder(uint16_t sequence_number) const = 0;

View File

@ -301,7 +301,7 @@ uint32_t StreamStatisticianImpl::BitrateReceived() const {
} }
bool StreamStatisticianImpl::IsRetransmitOfOldPacket( bool StreamStatisticianImpl::IsRetransmitOfOldPacket(
const RTPHeader& header, int64_t min_rtt) const { const RTPHeader& header) const {
rtc::CritScope cs(&stream_lock_); rtc::CritScope cs(&stream_lock_);
if (InOrderPacketInternal(header.sequenceNumber)) { if (InOrderPacketInternal(header.sequenceNumber)) {
return false; return false;
@ -317,20 +317,17 @@ bool StreamStatisticianImpl::IsRetransmitOfOldPacket(
uint32_t rtp_time_stamp_diff_ms = timestamp_diff / frequency_khz; uint32_t rtp_time_stamp_diff_ms = timestamp_diff / frequency_khz;
int64_t max_delay_ms = 0; int64_t max_delay_ms = 0;
if (min_rtt == 0) {
// Jitter standard deviation in samples.
float jitter_std = sqrt(static_cast<float>(jitter_q4_ >> 4));
// 2 times the standard deviation => 95% confidence. // Jitter standard deviation in samples.
// And transform to milliseconds by dividing by the frequency in kHz. float jitter_std = sqrt(static_cast<float>(jitter_q4_ >> 4));
max_delay_ms = static_cast<int64_t>((2 * jitter_std) / frequency_khz);
// Min max_delay_ms is 1. // 2 times the standard deviation => 95% confidence.
if (max_delay_ms == 0) { // And transform to milliseconds by dividing by the frequency in kHz.
max_delay_ms = 1; max_delay_ms = static_cast<int64_t>((2 * jitter_std) / frequency_khz);
}
} else { // Min max_delay_ms is 1.
max_delay_ms = (min_rtt / 3) + 1; if (max_delay_ms == 0) {
max_delay_ms = 1;
} }
return time_diff_ms > rtp_time_stamp_diff_ms + max_delay_ms; return time_diff_ms > rtp_time_stamp_diff_ms + max_delay_ms;
} }

View File

@ -39,8 +39,7 @@ class StreamStatisticianImpl : public StreamStatistician {
void GetReceiveStreamDataCounters( void GetReceiveStreamDataCounters(
StreamDataCounters* data_counters) const override; StreamDataCounters* data_counters) const override;
uint32_t BitrateReceived() const override; uint32_t BitrateReceived() const override;
bool IsRetransmitOfOldPacket(const RTPHeader& header, bool IsRetransmitOfOldPacket(const RTPHeader& header) const override;
int64_t min_rtt) const override;
bool IsPacketInOrder(uint16_t sequence_number) const override; bool IsPacketInOrder(uint16_t sequence_number) const override;
void IncomingPacket(const RTPHeader& rtp_header, void IncomingPacket(const RTPHeader& rtp_header,

View File

@ -552,11 +552,8 @@ bool RtpVideoStreamReceiver::IsPacketRetransmitted(const RTPHeader& header,
rtp_receive_statistics_->GetStatistician(header.ssrc); rtp_receive_statistics_->GetStatistician(header.ssrc);
if (!statistician) if (!statistician)
return false; return false;
// Check if this is a retransmission.
int64_t min_rtt = 0;
rtp_rtcp_->RTT(config_.rtp.remote_ssrc, nullptr, nullptr, &min_rtt, nullptr);
return !in_order && return !in_order &&
statistician->IsRetransmitOfOldPacket(header, min_rtt); statistician->IsRetransmitOfOldPacket(header);
} }
void RtpVideoStreamReceiver::UpdateHistograms() { void RtpVideoStreamReceiver::UpdateHistograms() {