mirror of
https://github.com/livekit/livekit.git
synced 2026-10-23 19:32:41 +00:00
Send publisher max layer change info to telemetry (#748)
Signed-off-by: shishir gowda <shishir@livekit.io>
This commit is contained in:
1 parent
6ba034feae
commit
2927521b8b
3 files changed
+49
No files matched your search
@@ -188,6 +188,8 @@ func (t *MediaTrack) AddReceiver(receiver *webrtc.RTPReceiver, track *webrtc.Tra
|
||||
)
|
||||
}
|
||||
|
||||
newWR.OnMaxLayerChange(t.OnMaxLayerChange)
|
||||
|
||||
t.buffer = buff
|
||||
|
||||
t.MediaTrackReceiver.SetupReceiver(newWR, priority, mid)
|
||||
@@ -234,3 +236,17 @@ func (t *MediaTrack) SetRTT(rtt uint32) {
|
||||
func (t *MediaTrack) HasPendingCodec() bool {
|
||||
return len(t.params.TrackInfo.Codecs) > len(t.Receivers())
|
||||
}
|
||||
|
||||
func (t *MediaTrack) OnMaxLayerChange(maxLayer int32) {
|
||||
ti := &livekit.TrackInfo{
|
||||
Sid: t.trackInfo.Sid,
|
||||
Type: t.trackInfo.Type,
|
||||
}
|
||||
|
||||
if layer, ok := t.MediaTrackReceiver.layerDimensions[livekit.VideoQuality(maxLayer)]; ok {
|
||||
ti.Layers = []*livekit.VideoLayer{{Quality: livekit.VideoQuality(maxLayer), Width: layer.Width, Height: layer.Height}}
|
||||
} else if maxLayer == -1 {
|
||||
ti.Layers = []*livekit.VideoLayer{{Quality: livekit.VideoQuality_OFF}}
|
||||
}
|
||||
t.params.Telemetry.TrackPublishedUpdate(context.Background(), t.PublisherID(), ti)
|
||||
}
|
||||
@@ -97,6 +97,9 @@ type WebRTCReceiver struct {
|
||||
|
||||
// update stats
|
||||
onStatsUpdate func(w *WebRTCReceiver, stat *livekit.AnalyticsStat)
|
||||
|
||||
// update layer info
|
||||
onMaxLayerChange func(maxLayer int32)
|
||||
}
|
||||
|
||||
func RidToLayer(rid string) int32 {
|
||||
@@ -182,6 +185,7 @@ func NewWebRTCReceiver(
|
||||
isSVC: IsSvcCodec(track.Codec().MimeType),
|
||||
}
|
||||
|
||||
w.streamTrackerManager.OnMaxLayerChanged(w.onMaxLayerChange)
|
||||
w.streamTrackerManager.OnAvailableLayersChanged(w.downTrackLayerChange)
|
||||
w.streamTrackerManager.OnBitrateAvailabilityChanged(w.downTrackBitrateAvailabilityChange)
|
||||
|
||||
@@ -259,6 +263,10 @@ func (w *WebRTCReceiver) OnStatsUpdate(fn func(w *WebRTCReceiver, stat *livekit.
|
||||
w.onStatsUpdate = fn
|
||||
}
|
||||
|
||||
func (w *WebRTCReceiver) OnMaxLayerChange(fn func(maxLayer int32)) {
|
||||
w.streamTrackerManager.OnMaxLayerChanged(fn)
|
||||
}
|
||||
|
||||
func (w *WebRTCReceiver) GetConnectionScore() float32 {
|
||||
return w.connectionStats.GetScore()
|
||||
}
|
||||
|
||||
@@ -73,6 +73,7 @@ type StreamTrackerManager struct {
|
||||
|
||||
onAvailableLayersChanged func(availableLayers []int32)
|
||||
onBitrateAvailabilityChanged func()
|
||||
onMaxLayerChanged func(maxLayer int32)
|
||||
}
|
||||
|
||||
func NewStreamTrackerManager(logger logger.Logger, source livekit.TrackSource) *StreamTrackerManager {
|
||||
@@ -91,6 +92,10 @@ func (s *StreamTrackerManager) OnBitrateAvailabilityChanged(f func()) {
|
||||
s.onBitrateAvailabilityChanged = f
|
||||
}
|
||||
|
||||
func (s *StreamTrackerManager) OnMaxLayerChanged(f func(maxLayer int32)) {
|
||||
s.onMaxLayerChanged = f
|
||||
}
|
||||
|
||||
func (s *StreamTrackerManager) AddTracker(layer int32) *StreamTracker {
|
||||
var params StreamTrackerParams
|
||||
if s.source == livekit.TrackSource_SCREEN_SHARE {
|
||||
@@ -318,10 +323,20 @@ func (s *StreamTrackerManager) addAvailableLayer(layer int32) {
|
||||
if s.onAvailableLayersChanged != nil {
|
||||
s.onAvailableLayersChanged(layers)
|
||||
}
|
||||
|
||||
// check if new layer was the max layer
|
||||
if layers[len(layers)-1] == layer && s.onMaxLayerChanged != nil {
|
||||
s.onMaxLayerChanged(layer)
|
||||
}
|
||||
}
|
||||
|
||||
func (s *StreamTrackerManager) removeAvailableLayer(layer int32) {
|
||||
s.lock.Lock()
|
||||
prevMaxLayer := InvalidLayerSpatial
|
||||
if len(s.availableLayers) > 0 {
|
||||
prevMaxLayer = s.availableLayers[len(s.availableLayers)-1]
|
||||
}
|
||||
|
||||
newLayers := make([]int32, 0, DefaultMaxLayerSpatial+1)
|
||||
for _, l := range s.availableLayers {
|
||||
if l != layer {
|
||||
@@ -330,6 +345,11 @@ func (s *StreamTrackerManager) removeAvailableLayer(layer int32) {
|
||||
}
|
||||
sort.Slice(newLayers, func(i, j int) bool { return newLayers[i] < newLayers[j] })
|
||||
s.availableLayers = newLayers
|
||||
|
||||
curMaxLayer := InvalidLayerSpatial
|
||||
if len(s.availableLayers) > 0 {
|
||||
curMaxLayer = s.availableLayers[len(s.availableLayers)-1]
|
||||
}
|
||||
s.lock.Unlock()
|
||||
|
||||
s.logger.Debugw("available layers changed - layer gone", "removed", layer, "layers", newLayers)
|
||||
@@ -338,4 +358,9 @@ func (s *StreamTrackerManager) removeAvailableLayer(layer int32) {
|
||||
if s.onAvailableLayersChanged != nil {
|
||||
s.onAvailableLayersChanged(newLayers)
|
||||
}
|
||||
|
||||
// if maxLayer was removed, send the new maxLayer
|
||||
if curMaxLayer != prevMaxLayer && s.onMaxLayerChanged != nil {
|
||||
s.onMaxLayerChanged(curMaxLayer)
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user