diff --git a/pkg/service/roommanager_service.go b/pkg/service/roommanager_service.go index 0b5ce6d79..5986fa997 100644 --- a/pkg/service/roommanager_service.go +++ b/pkg/service/roommanager_service.go @@ -12,6 +12,7 @@ import ( "github.com/livekit/livekit-server/pkg/routing" "github.com/livekit/livekit-server/pkg/rtc/types" + "github.com/livekit/livekit-server/pkg/sfu/rtpstats" "github.com/livekit/livekit-server/pkg/telemetry/prometheus" "github.com/livekit/protocol/livekit" "github.com/livekit/protocol/logger" @@ -204,52 +205,73 @@ func (s whipService) sendConnectionNotify(ctx context.Context, participant types } func getMediaStateForParticipant(participant types.Participant) (*livekit.InputVideoState, *livekit.InputAudioState) { - pParticipant := participant.ToProto() - var video *livekit.InputVideoState var audio *livekit.InputAudioState - for _, v := range pParticipant.Tracks { - if v == nil { + for _, t := range participant.GetPublishedTracks() { + if t == nil { continue } - if v.Type != livekit.TrackType_VIDEO { + ti := t.ToProto() + if ti == nil { continue } - video = &livekit.InputVideoState{} + switch t.Kind() { + case livekit.TrackType_VIDEO: + if video != nil { + continue + } - video.MimeType = v.MimeType - video.Height = v.Height - video.Width = v.Width + video = &livekit.InputVideoState{ + MimeType: ti.MimeType, + Width: ti.Width, + Height: ti.Height, + AverageBitrate: trackAverageBitrate(t), + } - break - } + case livekit.TrackType_AUDIO: + if audio != nil { + continue + } - for _, a := range pParticipant.Tracks { - if a == nil { - continue + channels := uint32(1) + if ti.Stereo { + channels = 2 + } + + audio = &livekit.InputAudioState{ + MimeType: ti.MimeType, + Channels: channels, + AverageBitrate: trackAverageBitrate(t), + } } - - if a.Type != livekit.TrackType_AUDIO { - continue - } - - audio = &livekit.InputAudioState{} - - audio.MimeType = a.MimeType - audio.Channels = 1 - if a.Stereo { - audio.Channels = 2 - } - - break } return video, audio } +func trackAverageBitrate(t types.MediaTrack) uint32 { + var allStats []*livekit.RTPStats + for _, r := range t.Receivers() { + if r == nil { + continue + } + + if s := r.GetTrackStats(); s != nil { + allStats = append(allStats, s) + } + } + + agg := rtpstats.AggregateRTPStats(allStats) + if agg == nil { + return 0 + } + + return uint32(agg.Bitrate) +} + // ------------------------------------------- type whipParticipantService struct {