mirror of
https://github.com/livekit/livekit.git
synced 2026-05-24 23:26:11 +00:00
Reduce chances of metadata cache overflow. (#3369)
This commit is contained in:
@@ -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(
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user