From d341ee1ce86c943e032f249f1b1ff8950aaa0ad6 Mon Sep 17 00:00:00 2001 From: Raja Subramanian Date: Fri, 25 Oct 2024 11:50:59 +0530 Subject: [PATCH] Maintain RTT marker for calculations. (#3139) * Maintain RTT marker for calculations. Restore the drift logging change. * remove unnecessary cast --- pkg/sfu/rtpstats/rtpstats_sender.go | 51 ++++++++++++++++++++++------- 1 file changed, 39 insertions(+), 12 deletions(-) diff --git a/pkg/sfu/rtpstats/rtpstats_sender.go b/pkg/sfu/rtpstats/rtpstats_sender.go index c78e513e6..0c76f4352 100644 --- a/pkg/sfu/rtpstats/rtpstats_sender.go +++ b/pkg/sfu/rtpstats/rtpstats_sender.go @@ -26,6 +26,7 @@ import ( "github.com/livekit/mediatransportutil" "github.com/livekit/protocol/livekit" + "github.com/livekit/protocol/utils/mono" ) const ( @@ -137,6 +138,15 @@ type senderSnapshot struct { intervalStats intervalStats } +// ------------------------------------------------------------------- + +type rttMarker struct { + ntpTime mediatransportutil.NtpTime + sentAt time.Time +} + +// ------------------------------------------------------------------- + type RTPStatsSender struct { *rtpStatsBase @@ -144,6 +154,8 @@ type RTPStatsSender struct { extHighestSN uint64 extHighestSNFromRR uint64 + rttMarker rttMarker + lastRRTime time.Time lastRR rtcp.ReceptionReport @@ -190,6 +202,8 @@ func (r *RTPStatsSender) Seed(from *RTPStatsSender) { r.extHighestSN = from.extHighestSN r.extHighestSNFromRR = from.extHighestSNFromRR + r.rttMarker = from.rttMarker + r.lastRRTime = from.lastRRTime r.lastRR = from.lastRR @@ -493,7 +507,7 @@ func (r *RTPStatsSender) UpdateFromReceiverReport(rr rtcp.ReceptionReport) (rtt if r.srNewest != nil { var err error - rtt, err = mediatransportutil.GetRttMs(&rr, mediatransportutil.NtpTime(r.srNewest.NtpTimestamp), time.Unix(0, r.srNewest.At)) + rtt, err = mediatransportutil.GetRttMs(&rr, r.rttMarker.ntpTime, r.rttMarker.sentAt) if err == nil { isRttChanged = rtt != r.rtt } else { @@ -630,17 +644,24 @@ func (r *RTPStatsSender) GetRtcpSenderReport(ssrc uint32, publisherSRData *livek return nil } - timeSincePublisherSRAdjusted := time.Since(time.Unix(0, publisherSRData.AtAdjusted)) - now := publisherSRData.AtAdjusted + timeSincePublisherSRAdjusted.Nanoseconds() var ( - nowNTP mediatransportutil.NtpTime - nowRTPExt uint64 + reportTime int64 + reportTimeAdjusted int64 + nowNTP mediatransportutil.NtpTime + nowRTPExt uint64 ) if passThrough { + reportTime = publisherSRData.At + reportTimeAdjusted = publisherSRData.AtAdjusted + nowNTP = mediatransportutil.NtpTime(publisherSRData.NtpTimestamp) nowRTPExt = publisherSRData.RtpTimestampExt - tsOffset } else { - nowNTP = mediatransportutil.ToNtpTime(time.Unix(0, now)) + timeSincePublisherSRAdjusted := time.Since(time.Unix(0, publisherSRData.AtAdjusted)) + reportTimeAdjusted = publisherSRData.AtAdjusted + timeSincePublisherSRAdjusted.Nanoseconds() + reportTime = reportTimeAdjusted + + nowNTP = mediatransportutil.ToNtpTime(time.Unix(0, reportTime)) nowRTPExt = publisherSRData.RtpTimestampExt - tsOffset + uint64(timeSincePublisherSRAdjusted.Nanoseconds()*int64(r.params.ClockRate)/1e9) } @@ -650,8 +671,8 @@ func (r *RTPStatsSender) GetRtcpSenderReport(ssrc uint32, publisherSRData *livek NtpTimestamp: uint64(nowNTP), RtpTimestamp: uint32(nowRTPExt), RtpTimestampExt: nowRTPExt, - At: now, - AtAdjusted: now, + At: reportTime, + AtAdjusted: reportTimeAdjusted, Packets: packetCount, Octets: octetCount, } @@ -661,10 +682,11 @@ func (r *RTPStatsSender) GetRtcpSenderReport(ssrc uint32, publisherSRData *livek "feed", WrappedRTCPSenderReportStateLogger{publisherSRData}, "tsOffset", tsOffset, "timeNow", time.Now(), - "now", time.Unix(0, now), - "timeSinceHighest", time.Duration(now-r.highestTime), - "timeSinceFirst", time.Duration(now-r.firstTime), - "timeSincePublisherSRAdjusted", timeSincePublisherSRAdjusted, + "reportTime", time.Unix(0, reportTime), + "reportTimeAdjusted", time.Unix(0, reportTimeAdjusted), + "timeSinceHighest", time.Since(time.Unix(0, r.highestTime)), + "timeSinceFirst", time.Since(time.Unix(0, r.firstTime)), + "timeSincePublisherSRAdjusted", time.Since(time.Unix(0, publisherSRData.AtAdjusted)), "timeSincePublisherSR", time.Since(time.Unix(0, publisherSRData.At)), "nowRTPExt", nowRTPExt, "rtpStats", lockedRTPStatsSenderLogEncoder{r}, @@ -700,6 +722,11 @@ func (r *RTPStatsSender) GetRtcpSenderReport(ssrc uint32, publisherSRData *livek r.srFirst = r.srNewest } + r.rttMarker = rttMarker{ + ntpTime: nowNTP, + sentAt: mono.Now(), + } + return &rtcp.SenderReport{ SSRC: ssrc, NTPTime: uint64(nowNTP),