| Index: webrtc/modules/rtp_rtcp/source/rtcp_receiver.cc
|
| diff --git a/webrtc/modules/rtp_rtcp/source/rtcp_receiver.cc b/webrtc/modules/rtp_rtcp/source/rtcp_receiver.cc
|
| index 0259b73ff4e12fd666fda20d4b986df85d9d22bd..0873254f6346f92c824fb62945a87ec1b7249bf0 100644
|
| --- a/webrtc/modules/rtp_rtcp/source/rtcp_receiver.cc
|
| +++ b/webrtc/modules/rtp_rtcp/source/rtcp_receiver.cc
|
| @@ -13,8 +13,6 @@
|
| #include <assert.h>
|
| #include <string.h>
|
|
|
| -#include <algorithm>
|
| -
|
| #include "webrtc/base/checks.h"
|
| #include "webrtc/base/logging.h"
|
| #include "webrtc/base/trace_event.h"
|
| @@ -66,6 +64,7 @@ RTCPReceiver::RTCPReceiver(
|
| _lastReceivedSRNTPfrac(0),
|
| _lastReceivedXRNTPsecs(0),
|
| _lastReceivedXRNTPfrac(0),
|
| + xr_rrtr_status_(false),
|
| xr_rr_rtt_ms_(0),
|
| _receivedInfoMap(),
|
| _lastReceivedRrMs(0),
|
| @@ -191,6 +190,11 @@ int32_t RTCPReceiver::RTT(uint32_t remoteSSRC,
|
| return 0;
|
| }
|
|
|
| +void RTCPReceiver::SetRtcpXrRrtrStatus(bool enable) {
|
| + CriticalSectionScoped lock(_criticalSectionRTCPReceiver);
|
| + xr_rrtr_status_ = enable;
|
| +}
|
| +
|
| bool RTCPReceiver::GetAndResetXrRrRtt(int64_t* rtt_ms) {
|
| assert(rtt_ms);
|
| CriticalSectionScoped lock(_criticalSectionRTCPReceiver);
|
| @@ -520,10 +524,13 @@ void RTCPReceiver::HandleReportBlock(
|
| reportBlock->remoteMaxJitter = rtcpPacket.ReportBlockItem.Jitter;
|
| }
|
|
|
| + int64_t rtt = 0;
|
| uint32_t send_time = rtcpPacket.ReportBlockItem.LastSR;
|
| - uint32_t rtt = 0;
|
| -
|
| - if (send_time > 0) {
|
| + // RFC3550, section 6.4.1, LSR field discription states:
|
| + // If no SR has been received yet, the field is set to zero.
|
| + // Receiver rtp_rtcp module is not expected to calculate rtt using
|
| + // Sender Reports even if it accidentally can.
|
| + if (!receiver_only_ && send_time != 0) {
|
| uint32_t delay = rtcpPacket.ReportBlockItem.DelayLastSR;
|
| // Local NTP time.
|
| uint32_t receive_time = CompactNtp(NtpTime(*_clock));
|
| @@ -531,8 +538,7 @@ void RTCPReceiver::HandleReportBlock(
|
| // RTT in 1/(2^16) seconds.
|
| uint32_t rtt_ntp = receive_time - delay - send_time;
|
| // Convert to 1/1000 seconds (milliseconds).
|
| - uint32_t rtt_ms = CompactNtpIntervalToMs(rtt_ntp);
|
| - rtt = std::max<uint32_t>(rtt_ms, 1);
|
| + rtt = CompactNtpRttToMs(rtt_ntp);
|
| if (rtt > reportBlock->maxRTT) {
|
| // Store max RTT.
|
| reportBlock->maxRTT = rtt;
|
| @@ -916,9 +922,13 @@ void RTCPReceiver::HandleXrDlrrReportBlockItem(
|
|
|
| rtcpPacketInformation.xr_dlrr_item = true;
|
|
|
| + // Caller should explicitly enable rtt calculation using extended reports.
|
| + if (!xr_rrtr_status_)
|
| + return;
|
| +
|
| // The send_time and delay_rr fields are in units of 1/2^16 sec.
|
| uint32_t send_time = packet.XRDLRRReportBlockItem.LastRR;
|
| - // RFC3411, section 4.5, LRR field discription states:
|
| + // RFC3611, section 4.5, LRR field discription states:
|
| // If no such block has been received, the field is set to zero.
|
| if (send_time == 0)
|
| return;
|
| @@ -927,8 +937,7 @@ void RTCPReceiver::HandleXrDlrrReportBlockItem(
|
| uint32_t now = CompactNtp(NtpTime(*_clock));
|
|
|
| uint32_t rtt_ntp = now - delay_rr - send_time;
|
| - uint32_t rtt_ms = CompactNtpIntervalToMs(rtt_ntp);
|
| - xr_rr_rtt_ms_ = std::max<uint32_t>(rtt_ms, 1);
|
| + xr_rr_rtt_ms_ = CompactNtpRttToMs(rtt_ntp);
|
|
|
| rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpXrDlrrReportBlock;
|
| }
|
|
|