NTP Time Estimation based on RRTR/DLRR

Overview

The estimation of NTP time offset between a local system and a remote system using RTCP XR (Extended Reports) RRTR and DLRR blocks involves two main steps: Round-Trip Time (RTT) calculation and NTP Offset estimation.

1. RTT Calculation using RRTR/DLRR

The flow is as follows (RFC 3611):

  1. Local Receiver sends an RRTR (Receiver Reference Time Report) block containing its current NTP timestamp ($T_1$).
  2. Remote Sender receives the RRTR at $T_2$.
  3. Remote Sender prepares a DLRR (Delay since Last Receiver Report) block. It includes:
    • last_rr: The middle 32 bits of the $T_1$ timestamp from the received RRTR.
    • delay_since_last_rr: The time elapsed between receiving the RRTR and sending the DLRR ($D = T_3 - T_2$).
  4. Local Receiver receives the DLRR at $T_4$.

The RTT is calculated in RTCPReceiver::HandleXrDlrrReportBlock (in modules/rtp_rtcp/source/rtcp_receiver.cc) as: $$RTT = (T_4 - T_1) - ext{delay_since_last_rr}$$ In code, this uses compact NTP representation (1/2^16 seconds resolution).

2. NTP Offset Estimation

Once the RTT is known, it is used along with Sender Reports (SR) to estimate the NTP offset between the remote and local clocks. This logic is implemented in RemoteNtpTimeEstimator::UpdateRtcpTimestamp (in modules/rtp_rtcp/source/remote_ntp_time_estimator.cc).

  1. SR Data: The Sender Report provides the remote NTP time ($T_{ ext{remote_send}}$) and the corresponding RTP timestamp.
  2. Delivery Time Estimation: Assuming network symmetry, the one-way delivery time is estimated as: $$DeliverTime = RTT / 2$$
  3. Receiver Arrival Time: The local system records the NTP time when the SR was received ($T_{ ext{local_arrival}}$).
  4. Clock Offset Calculation: $$ ext{RemoteToLocalOffset} = (T_{ ext{local_arrival}} - T_{ ext{remote_send}}) - DeliverTime$$

This offset is inserted into a smoothing filter (ntp_clocks_offset_estimator_).

3. Usage

The estimated offset is used by:

  • RemoteNtpTimeEstimator::EstimateNtp: To convert RTP timestamps to receiver-local NTP time.
  • CaptureClockOffsetUpdater: To adjust Absolute Capture Time extensions in RTP packets, allowing the receiver to know the exact capture time in its own NTP clock.

Relevant Code Locations

  • modules/rtp_rtcp/source/rtcp_receiver.cc: HandleXrDlrrReportBlock - RTT calculation logic.
  • modules/rtp_rtcp/source/remote_ntp_time_estimator.cc: UpdateRtcpTimestamp - NTP offset estimation.
  • modules/rtp_rtcp/source/ntp_time_util.h: NTP conversion helpers like CompactNtp, ToNtpUnits, and CompactNtpRttToTimeDelta.