From 2c48eafd6ee63df7194c3e5c430ca525e42e9ee4 Mon Sep 17 00:00:00 2001 From: Raja Subramanian Date: Wed, 29 Jun 2022 14:48:06 +0530 Subject: [PATCH] Retain previous audio score if number of packets is low (#793) * Retain previous audio score if number of packets is low * better comment and correct spelling --- pkg/sfu/connectionquality/connectionstats.go | 20 ++++++++++++++++---- pkg/sfu/connectionquality/mos.go | 4 ++-- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/pkg/sfu/connectionquality/connectionstats.go b/pkg/sfu/connectionquality/connectionstats.go index 82df48afd..8ba958a7d 100644 --- a/pkg/sfu/connectionquality/connectionstats.go +++ b/pkg/sfu/connectionquality/connectionstats.go @@ -14,7 +14,8 @@ import ( ) const ( - UpdateInterval = 2 * time.Second + UpdateInterval = 2 * time.Second + audioPacketRateThreshold = float64(25.0) ) type ConnectionStatsParams struct { @@ -118,11 +119,18 @@ func (cs *ConnectionStats) updateScore(streams map[uint32]*buffer.StreamStatsWit params.IsReducedQuality = cs.params.GetIsReducedQuality() } cs.score = ScreenshareTrackScore(params) + case cs.params.CodecType == webrtc.RTPCodecTypeAudio: - if cs.params.IsDtxDisabled != nil { - params.DtxDisabled = cs.params.IsDtxDisabled() + packetRate := float64(params.PacketsExpected) / maxAvailableLayerStats.Duration.Seconds() + if packetRate > audioPacketRateThreshold { + // With DTX, it is possible to have fewer packets per second. + // A loss with reduced packet rate has amplified negative effect on quality. + // Opus uses 20 ms packetisation (50 pps). Calculate score only if packet rate is at least half of that. + if cs.params.IsDtxDisabled != nil { + params.DtxDisabled = cs.params.IsDtxDisabled() + } + cs.score = AudioTrackScore(params) } - cs.score = AudioTrackScore(params) case cs.params.CodecType == webrtc.RTPCodecTypeVideo: // See note below about muxed tracks quality calculation challenged. @@ -156,6 +164,10 @@ func (cs *ConnectionStats) updateScore(streams map[uint32]*buffer.StreamStatsWit cs.score = VideoTrackScore(params) } + if cs.score < 4.0 { + cs.params.Logger.Infow("low score", "score", cs.score, "params", params) + } + return cs.score } diff --git a/pkg/sfu/connectionquality/mos.go b/pkg/sfu/connectionquality/mos.go index fb173d734..9c40c5654 100644 --- a/pkg/sfu/connectionquality/mos.go +++ b/pkg/sfu/connectionquality/mos.go @@ -67,8 +67,8 @@ func getRtcMosStat(params TrackScoreParams) rtcmos.Stat { func AudioTrackScore(params TrackScoreParams) float32 { stat := getRtcMosStat(params) stat.AudioConfig = &rtcmos.AudioConfig{} - if params.DtxDisabled { - flag := false + if !params.DtxDisabled { + flag := true stat.AudioConfig.Dtx = &flag }