mirror of
https://github.com/livekit/livekit.git
synced 2026-04-05 05:55:45 +00:00
Move MediaTrack ToProto out of media track receiver as remote needs a (#328)
different implementation.
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user