diff --git a/pkg/sfu/buffer/rtpstats_base.go b/pkg/sfu/buffer/rtpstats_base.go index 7fc6a5797..8cc73db9d 100644 --- a/pkg/sfu/buffer/rtpstats_base.go +++ b/pkg/sfu/buffer/rtpstats_base.go @@ -19,6 +19,7 @@ import ( "sync" "time" + "go.uber.org/zap/zapcore" "google.golang.org/protobuf/types/known/timestamppb" "github.com/livekit/mediatransportutil" @@ -123,6 +124,18 @@ func (r *RTCPSenderReportData) ToString() string { return fmt.Sprintf("ntp: %s, rtp: %d, extRtp: %d, at: %s", r.NTPTimestamp.Time().String(), r.RTPTimestamp, r.RTPTimestampExt, r.At.String()) } +func (r *RTCPSenderReportData) MarshalLogObject(e zapcore.ObjectEncoder) error { + if r == nil { + return nil + } + + e.AddTime("NTPTimestamp", r.NTPTimestamp.Time()) + e.AddUint32("RTPTimestamp", r.RTPTimestamp) + e.AddUint64("RTPTimestampExt", r.RTPTimestampExt) + e.AddTime("At", r.At) + return nil +} + // ------------------------------------------------------------------ type RTPStatsParams struct { diff --git a/pkg/sfu/buffer/rtpstats_receiver.go b/pkg/sfu/buffer/rtpstats_receiver.go index 347f98103..12ab315af 100644 --- a/pkg/sfu/buffer/rtpstats_receiver.go +++ b/pkg/sfu/buffer/rtpstats_receiver.go @@ -252,8 +252,9 @@ func (r *RTPStatsReceiver) SetRtcpSenderReportData(srData *RTCPSenderReportData) if r.srNewest != nil && r.srNewest.NTPTimestamp > srData.NTPTimestamp { r.logger.Infow( "received anachronous sender report", - "last", r.srNewest.ToString(), - "current", srData.ToString(), + "first", r.srFirst, + "last", r.srNewest, + "current", srData, ) return } @@ -264,6 +265,12 @@ func (r *RTPStatsReceiver) SetRtcpSenderReportData(srData *RTCPSenderReportData) if (srData.RTPTimestamp-r.srNewest.RTPTimestamp) < (1<<31) && srData.RTPTimestamp < r.srNewest.RTPTimestamp { tsCycles += (1 << 32) } + + if tsCycles >= (1 << 32) { + if (srData.RTPTimestamp-r.srNewest.RTPTimestamp) >= (1<<31) && srData.RTPTimestamp > r.srNewest.RTPTimestamp { + tsCycles -= (1 << 32) + } + } } srDataCopy := *srData @@ -279,8 +286,9 @@ func (r *RTPStatsReceiver) SetRtcpSenderReportData(srData *RTCPSenderReportData) if r.outOfOrderSsenderReportCount%10 == 0 { r.logger.Infow( "received sender report, out-of-order, resetting", - "last", r.srNewest.ToString(), - "current", srDataCopy.ToString(), + "first", r.srFirst, + "last", r.srNewest, + "current", &srDataCopy, "count", r.outOfOrderSsenderReportCount, ) } @@ -304,9 +312,9 @@ func (r *RTPStatsReceiver) SetRtcpSenderReportData(srData *RTCPSenderReportData) if r.clockSkewCount%100 == 0 { r.logger.Infow( "clock rate skew", - "first", r.srFirst.ToString(), - "last", r.srNewest.ToString(), - "current", srDataCopy.ToString(), + "first", r.srFirst, + "last", r.srNewest, + "current", &srDataCopy, "timeSinceFirst", timeSinceFirst, "rtpDiffSinceFirst", rtpDiffSinceFirst, "calculatedFirst", calculatedClockRateFromFirst, diff --git a/pkg/sfu/buffer/rtpstats_sender.go b/pkg/sfu/buffer/rtpstats_sender.go index 33a22afbf..7e8b22510 100644 --- a/pkg/sfu/buffer/rtpstats_sender.go +++ b/pkg/sfu/buffer/rtpstats_sender.go @@ -682,11 +682,11 @@ func (r *RTPStatsSender) GetRtcpSenderReport(ssrc uint32, calculatedClockRate ui if r.clockSkewCount%10 == 0 { r.logger.Infow( "sending sender report, clock skew", - "first", r.srFirst.ToString(), - "last", r.srNewest.ToString(), - "curr", srData.ToString(), - "firstFeed", r.srFeedFirst.ToString(), - "lastFeed", r.srFeedNewest.ToString(), + "first", r.srFirst, + "last", r.srNewest, + "curr", srData, + "firstFeed", r.srFeedFirst, + "lastFeed", r.srFeedNewest, "timeNow", time.Now().String(), "extStartTS", r.extStartTS, "extHighestTS", r.extHighestTS, @@ -722,11 +722,11 @@ func (r *RTPStatsSender) GetRtcpSenderReport(ssrc uint32, calculatedClockRate ui if r.outOfOrderSenderReportCount%10 == 0 { r.logger.Infow( "sending sender report, out-of-order, repairing", - "first", r.srFirst.ToString(), - "last", r.srNewest.ToString(), - "curr", srData.ToString(), - "firstFeed", r.srFeedFirst.ToString(), - "lastFeed", r.srFeedNewest.ToString(), + "first", r.srFirst, + "last", r.srNewest, + "curr", srData, + "firstFeed", r.srFeedFirst, + "lastFeed", r.srFeedNewest, "timeNow", time.Now().String(), "extStartTS", r.extStartTS, "extHighestTS", r.extHighestTS,