diff --git a/pkg/sfu/downtrack.go b/pkg/sfu/downtrack.go index fed9c5d6a..7bd43f0fc 100644 --- a/pkg/sfu/downtrack.go +++ b/pkg/sfu/downtrack.go @@ -368,12 +368,18 @@ func NewDownTrack(params DowntrackParams) (*DownTrack, error) { "subscriberID", d.SubscriberID(), ) + var mdCacheSize, mdCacheSizeRTX int + if d.kind == webrtc.RTPCodecTypeVideo { + mdCacheSize, mdCacheSizeRTX = 32768, 4096 + } else { + mdCacheSize, mdCacheSizeRTX = 8192, 1024 + } d.rtpStats = rtpstats.NewRTPStatsSender(rtpstats.RTPStatsParams{ ClockRate: d.codec.ClockRate, Logger: d.params.Logger.WithValues( "stream", "primary", ), - }, 4096) + }, mdCacheSize) d.deltaStatsSenderSnapshotId = d.rtpStats.NewSenderSnapshotId() d.rtpStatsRTX = rtpstats.NewRTPStatsSender(rtpstats.RTPStatsParams{ @@ -381,7 +387,7 @@ func NewDownTrack(params DowntrackParams) (*DownTrack, error) { Logger: d.params.Logger.WithValues( "stream", "rtx", ), - }, 1024) + }, mdCacheSizeRTX) d.deltaStatsRTXSenderSnapshotId = d.rtpStatsRTX.NewSenderSnapshotId() d.forwarder = NewForwarder( diff --git a/pkg/sfu/rtpstats/rtpstats_sender.go b/pkg/sfu/rtpstats/rtpstats_sender.go index c38116eaa..8e37f8163 100644 --- a/pkg/sfu/rtpstats/rtpstats_sender.go +++ b/pkg/sfu/rtpstats/rtpstats_sender.go @@ -553,7 +553,7 @@ func (r *RTPStatsSender) UpdateFromReceiverReport(rr rtcp.ReceptionReport) (rtt } if r.lastRRTime != 0 && r.extHighestSNFromRR > extHighestSNFromRR { - r.logger.Debugw( + r.logger.Infow( fmt.Sprintf("receiver report potentially out of order, highestSN: existing: %d, received: %d", r.extHighestSNFromRR, extHighestSNFromRR), "sinceLastRR", time.Duration(mono.UnixNano()-r.lastRRTime), "receivedRR", rr, @@ -600,6 +600,21 @@ func (r *RTPStatsSender) UpdateFromReceiverReport(rr rtcp.ReceptionReport) (rtt } extReceivedRRSN := r.extHighestSNFromRR + (r.extStartSN & 0xFFFF_FFFF_FFFF_0000) + // there are cases where remote does not send RTCP Receiver Report for extended periods of time, + // some times several minutes, in that interval the sequence number rolls over, + // check for a gap higher than sequence number range and adjust + for r.extHighestSN > extReceivedRRSN && (r.extHighestSN-extReceivedRRSN) > 65536 { + r.extHighestSNFromRR += 65536 + r.logger.Infow( + "receiver report potentially received after a long time, adjusting", + "sinceLastRR", time.Duration(mono.UnixNano()-r.lastRRTime), + "receivedRR", rr, + "extReceivedRRSN", extReceivedRRSN, + "rtpStats", lockedRTPStatsSenderLogEncoder{r}, + ) + extReceivedRRSN = r.extHighestSNFromRR + (r.extStartSN & 0xFFFF_FFFF_FFFF_0000) + } + for i := uint32(0); i < r.nextSenderSnapshotID-cFirstSnapshotID; i++ { s := &r.senderSnapshots[i] if isRttChanged && rtt > s.maxRtt {