Skip to content

Commit

Permalink
Fix connection quality in constrained up stream (#1521)
Browse files Browse the repository at this point in the history
A few things
1. Have to use expected layer in upstream distance to desired. Using
min(published, expected) means if expected is higher than published, it was not caught as a missed layer.
2. Forgot to remove layer transition update in one place. It was still constrained to screen share.
This caused quality to not pick up after constraint is released.
3. Switching to max layer cannot be marked on max published. Same as point #1 above. Otherwise,
dynacast would kick in and turn off highest layer.
  • Loading branch information
boks1971 committed Mar 15, 2023
1 parent 5bef98d commit 582adda
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 12 deletions.
13 changes: 9 additions & 4 deletions pkg/sfu/forwarder.go
Original file line number Diff line number Diff line change
Expand Up @@ -1452,7 +1452,7 @@ func (f *Forwarder) getTranslationParamsVideo(extPkt *buffer.ExtPacket, layer in
// if f.ddLayerSelector != nil {
// f.ddLayerSelector.SelectLayer(f.currentLayers)
// }
if f.currentLayers.Spatial >= f.maxLayers.Spatial || f.currentLayers.Spatial == f.maxPublishedLayer {
if f.currentLayers.Spatial >= f.maxLayers.Spatial {
tp.isSwitchingToMaxLayer = true
}
}
Expand Down Expand Up @@ -1517,10 +1517,9 @@ func (f *Forwarder) getTranslationParamsVideo(extPkt *buffer.ExtPacket, layer in
if found {
tp.isSwitchingToTargetLayer = true
f.clearParkedLayers()
if f.currentLayers.Spatial >= f.maxLayers.Spatial || f.currentLayers.Spatial == f.maxPublishedLayer {
if f.currentLayers.Spatial >= f.maxLayers.Spatial {
tp.isSwitchingToMaxLayer = true

// if maximum is attained, adjust target to enable fast path layer check in per-packet path
f.logger.Infow(
"reached max layer",
"current", f.currentLayers,
Expand All @@ -1531,6 +1530,9 @@ func (f *Forwarder) getTranslationParamsVideo(extPkt *buffer.ExtPacket, layer in
"maxPublished", f.maxPublishedLayer,
"feed", extPkt.Packet.SSRC,
)
}

if f.currentLayers.Spatial >= f.maxLayers.Spatial || f.currentLayers.Spatial == f.maxPublishedLayer {
f.targetLayers.Spatial = f.currentLayers.Spatial
}
}
Expand All @@ -1551,8 +1553,11 @@ func (f *Forwarder) getTranslationParamsVideo(extPkt *buffer.ExtPacket, layer in
)
f.currentLayers.Spatial = layer

if f.currentLayers.Spatial >= f.maxLayers.Spatial || f.currentLayers.Spatial == f.maxPublishedLayer {
if f.currentLayers.Spatial >= f.maxLayers.Spatial {
tp.isSwitchingToMaxLayer = true
}

if f.currentLayers.Spatial >= f.maxLayers.Spatial || f.currentLayers.Spatial == f.maxPublishedLayer {
f.targetLayers.Spatial = layer
}
}
Expand Down
4 changes: 1 addition & 3 deletions pkg/sfu/receiver.go
Original file line number Diff line number Diff line change
Expand Up @@ -440,9 +440,7 @@ func (w *WebRTCReceiver) OnBitrateReport(availableLayers []int32, bitrates Bitra
dt.UpTrackBitrateReport(availableLayers, bitrates)
}

if w.trackInfo.Source == livekit.TrackSource_SCREEN_SHARE {
w.connectionStats.AddLayerTransition(w.streamTrackerManager.DistanceToDesired(), time.Now())
}
w.connectionStats.AddLayerTransition(w.streamTrackerManager.DistanceToDesired(), time.Now())
}

func (w *WebRTCReceiver) GetLayeredBitrate() ([]int32, Bitrates) {
Expand Down
15 changes: 10 additions & 5 deletions pkg/sfu/streamtrackermanager.go
Original file line number Diff line number Diff line change
Expand Up @@ -286,7 +286,7 @@ func (s *StreamTrackerManager) DistanceToDesired() float64 {
s.lock.RLock()
defer s.lock.RUnlock()

if s.paused {
if s.paused || s.maxExpectedLayer < 0 || s.maxTemporalLayerSeen < 0 {
return 0
}

Expand All @@ -306,13 +306,18 @@ done:
}
}

if !maxLayers.IsValid() || s.maxTemporalLayerSeen < 0 {
return 0.0
adjustedMaxLayers := maxLayers
if !maxLayers.IsValid() {
adjustedMaxLayers = VideoLayers{Spatial: 0, Temporal: 0}
}

distance :=
((s.getMaxExpectedLayerLocked() - maxLayers.Spatial) * (s.maxTemporalLayerSeen + 1)) +
(s.maxTemporalLayerSeen - maxLayers.Temporal)
((s.maxExpectedLayer - adjustedMaxLayers.Spatial) * (s.maxTemporalLayerSeen + 1)) +
(s.maxTemporalLayerSeen - adjustedMaxLayers.Temporal)
if !maxLayers.IsValid() {
distance++
}

return float64(distance) / float64(s.maxTemporalLayerSeen+1)
}

Expand Down

0 comments on commit 582adda

Please sign in to comment.