Move MediaTrack ToProto out of media track receiver as remote needs a (#328)

different implementation.
This commit is contained in:
Raja Subramanian
2022-01-10 18:34:54 +05:30
committed by GitHub
parent ad5267705c
commit 02eb21c2ce
3 changed files with 34 additions and 25 deletions

View File

@@ -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)
}

View File

@@ -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()

View File

@@ -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