Reduce chances of metadata cache overflow. (#3369)

This commit is contained in:
Raja Subramanian
2025-01-27 18:14:57 +05:30
committed by GitHub
parent db75092aa6
commit 2b5ee12f9b
2 changed files with 24 additions and 3 deletions
+8 -2
View File
@@ -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(
+16 -1
View File
@@ -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 {