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 d65b04c8ab00405aeee884a646baa075375cabdb..e8a943f23eecaacb7889137feb98ba9719a2aff2 100644 |
--- a/webrtc/modules/rtp_rtcp/source/rtcp_receiver.cc |
+++ b/webrtc/modules/rtp_rtcp/source/rtcp_receiver.cc |
@@ -21,6 +21,8 @@ |
#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h" |
#include "webrtc/modules/rtp_rtcp/source/rtcp_utility.h" |
#include "webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.h" |
+#include "webrtc/modules/rtp_rtcp/source/time_util.h" |
+#include "webrtc/system_wrappers/include/ntp_time.h" |
namespace webrtc { |
using RTCPHelp::RTCPPacketInformation; |
@@ -487,13 +489,6 @@ void RTCPReceiver::HandleReportBlock( |
return; |
} |
- // To avoid problem with acquiring _criticalSectionRTCPSender while holding |
- // _criticalSectionRTCPReceiver. |
- _criticalSectionRTCPReceiver->Leave(); |
- int64_t sendTimeMS = |
- _rtpRtcp.SendTimeOfSendReport(rtcpPacket.ReportBlockItem.LastSR); |
- _criticalSectionRTCPReceiver->Enter(); |
- |
RTCPReportBlockInformation* reportBlock = |
CreateOrGetReportBlockInformation(remoteSSRC, |
rtcpPacket.ReportBlockItem.SSRC); |
@@ -526,60 +521,48 @@ void RTCPReceiver::HandleReportBlock( |
reportBlock->remoteMaxJitter = rtcpPacket.ReportBlockItem.Jitter; |
} |
- uint32_t delaySinceLastSendReport = |
- rtcpPacket.ReportBlockItem.DelayLastSR; |
- |
- // local NTP time when we received this |
- uint32_t lastReceivedRRNTPsecs = 0; |
- uint32_t lastReceivedRRNTPfrac = 0; |
- |
- _clock->CurrentNtp(lastReceivedRRNTPsecs, lastReceivedRRNTPfrac); |
+ uint32_t send_time = rtcpPacket.ReportBlockItem.LastSR; |
+ uint32_t rtt = 0; |
- // time when we received this in MS |
- int64_t receiveTimeMS = Clock::NtpToMs(lastReceivedRRNTPsecs, |
- lastReceivedRRNTPfrac); |
+ if (send_time > 0) { |
+ uint32_t delay = rtcpPacket.ReportBlockItem.DelayLastSR; |
+ // Local NTP time. |
+ uint32_t receive_time = CompactNtp(NtpTime(*_clock)); |
- // Estimate RTT |
- uint32_t d = (delaySinceLastSendReport & 0x0000ffff) * 1000; |
- d /= 65536; |
- d += ((delaySinceLastSendReport & 0xffff0000) >> 16) * 1000; |
- |
- int64_t RTT = 0; |
- |
- if (sendTimeMS > 0) { |
- RTT = receiveTimeMS - d - sendTimeMS; |
- if (RTT <= 0) { |
- RTT = 1; |
- } |
- if (RTT > reportBlock->maxRTT) { |
- // store max RTT |
- reportBlock->maxRTT = RTT; |
+ // 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); |
+ if (rtt > reportBlock->maxRTT) { |
+ // Store max RTT. |
+ reportBlock->maxRTT = rtt; |
} |
if (reportBlock->minRTT == 0) { |
- // first RTT |
- reportBlock->minRTT = RTT; |
- } else if (RTT < reportBlock->minRTT) { |
- // Store min RTT |
- reportBlock->minRTT = RTT; |
+ // First RTT. |
+ reportBlock->minRTT = rtt; |
+ } else if (rtt < reportBlock->minRTT) { |
+ // Store min RTT. |
+ reportBlock->minRTT = rtt; |
} |
- // store last RTT |
- reportBlock->RTT = RTT; |
+ // Store last RTT. |
+ reportBlock->RTT = rtt; |
// store average RTT |
if (reportBlock->numAverageCalcs != 0) { |
float ac = static_cast<float>(reportBlock->numAverageCalcs); |
float newAverage = |
- ((ac / (ac + 1)) * reportBlock->avgRTT) + ((1 / (ac + 1)) * RTT); |
+ ((ac / (ac + 1)) * reportBlock->avgRTT) + ((1 / (ac + 1)) * rtt); |
reportBlock->avgRTT = static_cast<int64_t>(newAverage + 0.5f); |
} else { |
- // first RTT |
- reportBlock->avgRTT = RTT; |
+ // First RTT. |
+ reportBlock->avgRTT = rtt; |
} |
reportBlock->numAverageCalcs++; |
} |
TRACE_COUNTER_ID1(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "RR_RTT", rb.SSRC, |
- RTT); |
+ rtt); |
rtcpPacketInformation.AddReportInfo(*reportBlock); |
} |
@@ -934,28 +917,19 @@ void RTCPReceiver::HandleXrDlrrReportBlockItem( |
rtcpPacketInformation.xr_dlrr_item = true; |
- // To avoid problem with acquiring _criticalSectionRTCPSender while holding |
- // _criticalSectionRTCPReceiver. |
- _criticalSectionRTCPReceiver->Leave(); |
- |
- int64_t send_time_ms; |
- bool found = _rtpRtcp.SendTimeOfXrRrReport( |
- packet.XRDLRRReportBlockItem.LastRR, &send_time_ms); |
- |
- _criticalSectionRTCPReceiver->Enter(); |
- |
- if (!found) { |
+ // 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: |
+ // If no such block has been received, the field is set to zero. |
+ if (send_time == 0) |
return; |
- } |
- |
- // The DelayLastRR field is in units of 1/65536 sec. |
- uint32_t delay_rr_ms = |
- (((packet.XRDLRRReportBlockItem.DelayLastRR & 0x0000ffff) * 1000) >> 16) + |
- (((packet.XRDLRRReportBlockItem.DelayLastRR & 0xffff0000) >> 16) * 1000); |
- int64_t rtt = _clock->CurrentNtpInMilliseconds() - delay_rr_ms - send_time_ms; |
+ uint32_t delay_rr = packet.XRDLRRReportBlockItem.DelayLastRR; |
+ uint32_t now = CompactNtp(NtpTime(*_clock)); |
- xr_rr_rtt_ms_ = std::max<int64_t>(rtt, 1); |
+ 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); |
rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpXrDlrrReportBlock; |
} |