mirror of
https://github.com/livekit/livekit.git
synced 2026-10-23 23:52:57 +00:00
fix: count leftover upstream loss after RTX repairs (#4946)
This commit is contained in:
1 parent
c264da5b8a
commit
b07a53732d
2 files changed
+46
No files matched your search
@@ -299,6 +299,9 @@ func (cs *ConnectionStats) updateScoreAt(at time.Time) (float32, map[uint32]*buf
|
||||
mos, _ := cs.scorer.GetMOSAndQuality()
|
||||
return mos, streams, false
|
||||
}
|
||||
// upstream PacketsLost is already net of late arrivals (including RTX repairs),
|
||||
// so the scorer must not discount out-of-order packets again
|
||||
agg.PacketsOutOfOrder = 0
|
||||
return cs.updateScoreWithAggregate(agg, cs.params.ReceiverProvider.GetLastSenderReportTime(), at), streams, false
|
||||
}
|
||||
|
||||
|
||||
@@ -964,3 +964,46 @@ func TestPacketRateMode(t *testing.T) {
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestUpstreamLossAfterRTXRepair(t *testing.T) {
|
||||
// 1000 video packets, 100 lost, RTX repairs 70 in the same window, 30 (3%) never arrive
|
||||
r := rtpstats.NewRTPStatsReceiver(rtpstats.RTPStatsParams{})
|
||||
r.SetClockRate(90000)
|
||||
snapshotID := r.NewSnapshotId()
|
||||
|
||||
packetTime := time.Now().UnixNano()
|
||||
send := func(sn uint16) {
|
||||
packetTime += int64(5 * time.Millisecond)
|
||||
r.Update(packetTime, sn, uint32(sn)*450, false, 12, 1000, 0)
|
||||
}
|
||||
for sn := uint16(0); sn < 1000; sn++ {
|
||||
if sn == 300 {
|
||||
for repaired := uint16(100); repaired < 170; repaired++ {
|
||||
send(repaired)
|
||||
}
|
||||
}
|
||||
if sn < 100 || sn >= 200 {
|
||||
send(sn)
|
||||
}
|
||||
}
|
||||
|
||||
delta := r.DeltaInfo(snapshotID)
|
||||
require.Equal(t, uint32(1000), delta.Packets)
|
||||
require.Equal(t, uint32(30), delta.PacketsLost)
|
||||
require.Equal(t, uint32(70), delta.PacketsOutOfOrder)
|
||||
|
||||
trp := newTestReceiverProvider()
|
||||
trp.setStreams(map[uint32]*buffer.StreamStatsWithLayers{1: {RTPStats: delta}})
|
||||
cs := NewConnectionStats(ConnectionStatsParams{
|
||||
ReceiverProvider: trp,
|
||||
Logger: logger.GetLogger(),
|
||||
})
|
||||
now := time.Now()
|
||||
cs.StartAt(mime.MimeTypeVP8, false, now)
|
||||
cs.updateScoreAt(now.Add(5 * time.Second))
|
||||
|
||||
// packet score 100 - 3% * 10 = 70, smoothed 0.8 * 70 + 0.2 * 100 = 76
|
||||
score, quality := cs.scorer.GetScoreAndQuality()
|
||||
require.InDelta(t, 76.0, score, 0.01)
|
||||
require.Equal(t, livekit.ConnectionQuality_GOOD, quality)
|
||||
}
|
||||
Reference in new issue
Block a user