From ae284089cc58eca51faa7f14ae0977e0f73a1f4f Mon Sep 17 00:00:00 2001 From: philipel Date: Mon, 9 May 2016 12:14:29 +0200 Subject: [PATCH] Jitter delay now depend on protection mode (FEC/NACK). R=stefan@webrtc.org Review URL: https://codereview.webrtc.org/1942683003 . Cr-Commit-Position: refs/heads/master@{#12661} --- webrtc/modules/video_coding/jitter_buffer.cc | 5 ++++- webrtc/modules/video_coding/media_opt_util.h | 4 ++++ webrtc/modules/video_coding/video_receiver.cc | 4 +++- webrtc/video/rtp_stream_receiver.cc | 4 ++++ webrtc/video/video_stream_decoder.cc | 10 ++++++++-- 5 files changed, 23 insertions(+), 4 deletions(-) diff --git a/webrtc/modules/video_coding/jitter_buffer.cc b/webrtc/modules/video_coding/jitter_buffer.cc index b70f44f1df..9c50a94519 100644 --- a/webrtc/modules/video_coding/jitter_buffer.cc +++ b/webrtc/modules/video_coding/jitter_buffer.cc @@ -601,7 +601,8 @@ VCMEncodedFrame* VCMJitterBuffer::ExtractAndSetDecode(uint32_t timestamp) { // Frame pulled out from jitter buffer, update the jitter estimate. const bool retransmitted = (frame->GetNackCount() > 0); if (retransmitted) { - jitter_estimate_.FrameNacked(); + if (WaitForRetransmissions()) + jitter_estimate_.FrameNacked(); } else if (frame->Length() > 0) { // Ignore retransmitted and empty frames. if (waiting_for_completion_.latest_packet_time >= 0) { @@ -958,6 +959,8 @@ void VCMJitterBuffer::UpdateRtt(int64_t rtt_ms) { jitter_estimate_.UpdateRtt(rtt_ms); if (nack_module_) nack_module_->UpdateRtt(rtt_ms); + if (!WaitForRetransmissions()) + jitter_estimate_.ResetNackCount(); } void VCMJitterBuffer::SetNackMode(VCMNackMode mode, diff --git a/webrtc/modules/video_coding/media_opt_util.h b/webrtc/modules/video_coding/media_opt_util.h index 1501f72ef6..a8455cb65c 100644 --- a/webrtc/modules/video_coding/media_opt_util.h +++ b/webrtc/modules/video_coding/media_opt_util.h @@ -45,6 +45,10 @@ enum FilterPacketLossMode { // common to media optimization and the jitter buffer. const int64_t kLowRttNackMs = 20; +// If the RTT is higher than this an extra RTT wont be added to to the jitter +// buffer delay. +const int kMaxRttDelayThreshold = 500; + struct VCMProtectionParameters { VCMProtectionParameters() : rtt(0), diff --git a/webrtc/modules/video_coding/video_receiver.cc b/webrtc/modules/video_coding/video_receiver.cc index 721c35d2bd..a832e2180b 100644 --- a/webrtc/modules/video_coding/video_receiver.cc +++ b/webrtc/modules/video_coding/video_receiver.cc @@ -168,7 +168,9 @@ int32_t VideoReceiver::SetVideoProtection(VCMVideoProtection videoProtection, case kProtectionNackFEC: { rtc::CritScope cs(&receive_crit_); RTC_DCHECK(enable); - _receiver.SetNackMode(kNack, media_optimization::kLowRttNackMs, -1); + _receiver.SetNackMode(kNack, + media_optimization::kLowRttNackMs, + media_optimization::kMaxRttDelayThreshold); _receiver.SetDecodeErrorMode(kNoErrors); break; } diff --git a/webrtc/video/rtp_stream_receiver.cc b/webrtc/video/rtp_stream_receiver.cc index 4d5402f7d9..5eeaa1bf5d 100644 --- a/webrtc/video/rtp_stream_receiver.cc +++ b/webrtc/video/rtp_stream_receiver.cc @@ -176,6 +176,10 @@ RtpStreamReceiver::RtpStreamReceiver( config_.rtp.fec.red_rtx_payload_type, config_.rtp.fec.red_payload_type); } + + rtp_rtcp_->SetGenericFECStatus(true, + config_.rtp.fec.red_payload_type, + config_.rtp.fec.ulpfec_payload_type); } if (config.rtp.rtcp_xr.receiver_reference_time_report) diff --git a/webrtc/video/video_stream_decoder.cc b/webrtc/video/video_stream_decoder.cc index 0cb0b9d474..5aab7b246c 100644 --- a/webrtc/video/video_stream_decoder.cc +++ b/webrtc/video/video_stream_decoder.cc @@ -54,8 +54,14 @@ VideoStreamDecoder::VideoStreamDecoder( static const int kDefaultRenderDelayMs = 10; video_receiver_->SetRenderDelay(kDefaultRenderDelayMs); - VCMVideoProtection video_protection = enable_nack ? kProtectionNack - : kProtectionNone; + VCMVideoProtection video_protection = kProtectionNone; + if (enable_nack) { + if (enable_fec) + video_protection = kProtectionNackFEC; + else + video_protection = kProtectionNack; + } + VCMDecodeErrorMode decode_error_mode = enable_nack ? kNoErrors : kWithErrors; video_receiver_->SetVideoProtection(video_protection, true); video_receiver_->SetDecodeErrorMode(decode_error_mode);