From fe673bb257fe0120c6d89baf23e07b67ffa4b4d4 Mon Sep 17 00:00:00 2001 From: Raja Subramanian Date: Tue, 18 Mar 2025 12:46:24 +0530 Subject: [PATCH] Send regressed codec upstream stats to analytics. (#3532) * Send regressed codec upstream stats to analytics. There is more work to do for analytics for simulcast codec, i. e. when both codecs are published. Shorter term, ensure that analytics are sent for regressed codec if active. * lock access to regressed codec received --- pkg/rtc/mediatrack.go | 29 ++++++++++++++++++++--------- pkg/telemetry/statsworker.go | 1 + 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/pkg/rtc/mediatrack.go b/pkg/rtc/mediatrack.go index 186e37b1f..be58fea81 100644 --- a/pkg/rtc/mediatrack.go +++ b/pkg/rtc/mediatrack.go @@ -312,15 +312,30 @@ func (t *MediaTrack) AddReceiver(receiver *webrtc.RTPReceiver, track sfu.TrackRe } } }) + // SIMULCAST-CODEC-TODO: these need to be receiver/mime aware, setting it up only for primary now - if priority == 0 { - newWR.OnStatsUpdate(func(_ *sfu.WebRTCReceiver, stat *livekit.AnalyticsStat) { + newWR.OnStatsUpdate(func(_ *sfu.WebRTCReceiver, stat *livekit.AnalyticsStat) { + // send for only one codec, either primary (priority == 0) OR regressed codec + t.lock.RLock() + regressionTargetCodecReceived := t.regressionTargetCodecReceived + t.lock.RUnlock() + if priority == 0 || regressionTargetCodecReceived { key := telemetry.StatsKeyForTrack(livekit.StreamType_UPSTREAM, t.PublisherID(), t.ID(), ti.Source, ti.Type) t.params.Telemetry.TrackStats(key, stat) - }) + } + }) + + newWR.OnMaxLayerChange(func(maxLayer int32) { + // send for only one codec, either primary (priority == 0) OR regressed codec + t.lock.RLock() + regressionTargetCodecReceived := t.regressionTargetCodecReceived + t.lock.RUnlock() + if priority == 0 || regressionTargetCodecReceived { + t.MediaTrackReceiver.NotifyMaxLayerChange(maxLayer) + } + }) + // SIMULCAST-CODEC-TODO END: these need to be receiver/mime aware, setting it up only for primary now - newWR.OnMaxLayerChange(t.onMaxLayerChange) - } if t.PrimaryReceiver() == nil { // primary codec published, set potential codecs potentialCodecs := make([]webrtc.RTPCodecParameters, 0, len(ti.Codecs)) @@ -447,10 +462,6 @@ func (t *MediaTrack) HasPendingCodec() bool { return t.MediaTrackReceiver.PrimaryReceiver() == nil } -func (t *MediaTrack) onMaxLayerChange(maxLayer int32) { - t.MediaTrackReceiver.NotifyMaxLayerChange(maxLayer) -} - func (t *MediaTrack) Restart() { t.MediaTrackReceiver.Restart() diff --git a/pkg/telemetry/statsworker.go b/pkg/telemetry/statsworker.go index a72ceaf8c..0dec2c5c7 100644 --- a/pkg/telemetry/statsworker.go +++ b/pkg/telemetry/statsworker.go @@ -255,6 +255,7 @@ func coalesce(stats []*livekit.AnalyticsStat) *livekit.AnalyticsStat { MinScore: minScore, MedianScore: utils.MedianFloat32(scores), Streams: []*livekit.AnalyticsStream{coalescedStream}, + Mime: stats[len(stats)-1].Mime, // use the latest Mime } numScores := len(scores) if numScores > 0 {