From 02eb21c2cededd787d9910f1553849464c4f39ce Mon Sep 17 00:00:00 2001 From: Raja Subramanian Date: Mon, 10 Jan 2022 18:34:54 +0530 Subject: [PATCH] Move MediaTrack ToProto out of media track receiver as remote needs a (#328) different implementation. --- pkg/rtc/localparticipant.go | 2 +- pkg/rtc/mediatrack.go | 23 +++++++++++++++++++++++ pkg/rtc/mediatrackreceiver.go | 34 ++++++++++------------------------ 3 files changed, 34 insertions(+), 25 deletions(-) diff --git a/pkg/rtc/localparticipant.go b/pkg/rtc/localparticipant.go index 1ee98b804..d2e9a481f 100644 --- a/pkg/rtc/localparticipant.go +++ b/pkg/rtc/localparticipant.go @@ -229,7 +229,7 @@ func (l *LocalParticipant) MediaTrackReceived(track *webrtc.TrackRemote, rtpRece SubscriberConfig: l.params.Config.Subscriber, }) - for ssrc,info :=range l.params.SimTracks { + for ssrc, info := range l.params.SimTracks { if info.Mid == mid { mt.TrySetSimulcastSSRC(uint8(sfu.RidToLayer(info.Rid)), ssrc) } diff --git a/pkg/rtc/mediatrack.go b/pkg/rtc/mediatrack.go index c2dbc7ee2..0a7e7e856 100644 --- a/pkg/rtc/mediatrack.go +++ b/pkg/rtc/mediatrack.go @@ -32,6 +32,8 @@ type MediaTrack struct { numUpTracks uint32 buffer *buffer.Buffer + layerSsrcs [livekit.VideoQuality_HIGH + 1]uint32 + audioLevelMu sync.RWMutex audioLevel *AudioLevel @@ -108,6 +110,21 @@ func (t *MediaTrack) SdpCid() string { return t.params.SdpCid } +func (t *MediaTrack) ToProto() *livekit.TrackInfo { + info := t.params.TrackInfo + info.Muted = t.IsMuted() + info.Simulcast = t.IsSimulcast() + layers := t.MediaTrackReceiver.GetVideoLayers() + for _, layer := range layers { + if int(layer.Quality) < len(t.layerSsrcs) { + layer.Ssrc = t.layerSsrcs[layer.Quality] + } + } + info.Layers = layers + + return info +} + func (t *MediaTrack) publishLossPercentage() uint32 { return FixedPointToPercent(uint8(atomic.LoadUint32(&t.currentUpFracLost))) } @@ -221,6 +238,12 @@ func (t *MediaTrack) AddReceiver(receiver *webrtc.RTPReceiver, track *webrtc.Tra }) } +func (t *MediaTrack) TrySetSimulcastSSRC(layer uint8, ssrc uint32) { + if int(layer) < len(t.layerSsrcs) && t.layerSsrcs[layer] == 0 { + t.layerSsrcs[layer] = ssrc + } +} + func (t *MediaTrack) GetAudioLevel() (level uint8, active bool) { t.audioLevelMu.RLock() defer t.audioLevelMu.RUnlock() diff --git a/pkg/rtc/mediatrackreceiver.go b/pkg/rtc/mediatrackreceiver.go index 0a8d793e7..ff22ef0ef 100644 --- a/pkg/rtc/mediatrackreceiver.go +++ b/pkg/rtc/mediatrackreceiver.go @@ -31,7 +31,6 @@ type MediaTrackReceiver struct { lock sync.RWMutex receiver sfu.TrackReceiver layerDimensions sync.Map // livekit.VideoQuality => *livekit.VideoLayer - layerSsrcs [livekit.VideoQuality_HIGH + 1]uint32 // track audio fraction lost downFracLostLock sync.Mutex @@ -195,25 +194,6 @@ func (t *MediaTrackReceiver) AddSubscriber(sub types.Participant) error { return nil } -func (t *MediaTrackReceiver) ToProto() *livekit.TrackInfo { - info := t.params.TrackInfo - info.Muted = t.IsMuted() - info.Simulcast = t.IsSimulcast() - layers := make([]*livekit.VideoLayer, 0) - t.layerDimensions.Range(func(_, val interface{}) bool { - if layer, ok := val.(*livekit.VideoLayer); ok { - if int(layer.Quality) < len(t.layerSsrcs) { - layer.Ssrc = t.layerSsrcs[layer.Quality] - } - layers = append(layers, layer) - } - return true - }) - info.Layers = layers - - return info -} - func (t *MediaTrackReceiver) UpdateVideoLayers(layers []*livekit.VideoLayer) { for _, layer := range layers { t.layerDimensions.Store(layer.Quality, layer) @@ -224,10 +204,16 @@ func (t *MediaTrackReceiver) UpdateVideoLayers(layers []*livekit.VideoLayer) { // TODO: this might need to trigger a participant update for clients to pick up dimension change } -func (t *MediaTrackReceiver) TrySetSimulcastSSRC(layer uint8, ssrc uint32) { - if int(layer) < len(t.layerSsrcs) && t.layerSsrcs[layer] == 0 { - t.layerSsrcs[layer] = ssrc - } +func (t *MediaTrackReceiver) GetVideoLayers() []*livekit.VideoLayer { + layers := make([]*livekit.VideoLayer, 0) + t.layerDimensions.Range(func(q, val interface{}) bool { + if layer, ok := val.(*livekit.VideoLayer); ok { + layers = append(layers, layer) + } + return true + }) + + return layers } // GetQualityForDimension finds the closest quality to use for desired dimensions