From 502c57d78740d2392f282e0d45aa14498cf925f0 Mon Sep 17 00:00:00 2001 From: Raja Subramanian Date: Fri, 17 Dec 2021 15:45:04 +0530 Subject: [PATCH] Fix forwarding status deduction (#267) * Fix forwarding status deduction - When muted OR when there are no available layers, declare optimal - When target layer is the maximum it can achieve taking available layers into account even if they are not the maximum subscribed layer, it is still optimal as there is nothing better available. * Fix and add more tests for forwarding status --- pkg/sfu/forwarder.go | 6 +++++- pkg/sfu/forwarder_test.go | 20 +++++++++++++++++++- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/pkg/sfu/forwarder.go b/pkg/sfu/forwarder.go index ebf1bdc63..4d9089962 100644 --- a/pkg/sfu/forwarder.go +++ b/pkg/sfu/forwarder.go @@ -287,11 +287,15 @@ func (f *Forwarder) GetForwardingStatus() ForwardingStatus { f.lock.RLock() defer f.lock.RUnlock() + if f.muted || len(f.availableLayers) == 0 { + return ForwardingStatusOptimal + } + if f.targetLayers == InvalidLayers { return ForwardingStatusOff } - if f.targetLayers.spatial < f.maxLayers.spatial { + if f.targetLayers.spatial < f.maxLayers.spatial && f.targetLayers.spatial < int32(f.availableLayers[len(f.availableLayers)-1]) { return ForwardingStatusPartial } diff --git a/pkg/sfu/forwarder_test.go b/pkg/sfu/forwarder_test.go index 167b2e6ad..56a947c01 100644 --- a/pkg/sfu/forwarder_test.go +++ b/pkg/sfu/forwarder_test.go @@ -90,12 +90,30 @@ func TestForwarderLayersVideo(t *testing.T) { func TestForwarderGetForwardingStatus(t *testing.T) { f := NewForwarder(testutils.TestVP8Codec, webrtc.RTPCodecTypeVideo) + // no available layers, should be optimal + require.Equal(t, ForwardingStatusOptimal, f.GetForwardingStatus()) + + // with available layers, should be off + availableLayers := []uint16{0, 1, 2} + f.UptrackLayersChange(availableLayers) require.Equal(t, ForwardingStatusOff, f.GetForwardingStatus()) + // when muted, should be optimal + f.Mute(true) + require.Equal(t, ForwardingStatusOptimal, f.GetForwardingStatus()) + + // when target is the max, should be optimal + f.Mute(false) + f.targetLayers.spatial = DefaultMaxLayerSpatial + require.Equal(t, ForwardingStatusOptimal, f.GetForwardingStatus()) + + // when target is less than max subscribed and max available, should be partial f.targetLayers.spatial = DefaultMaxLayerSpatial - 1 require.Equal(t, ForwardingStatusPartial, f.GetForwardingStatus()) - f.targetLayers.spatial = DefaultMaxLayerSpatial + // when available layers are lower than max subscribed, optimal as long as target is at max available + availableLayers = []uint16{0, 1} + f.UptrackLayersChange(availableLayers) require.Equal(t, ForwardingStatusOptimal, f.GetForwardingStatus()) }