Set layer state to stopped on pause. (#818)

* Set layer state to `stopped` on pause.

Previously, on pause, the worker was let run and declare
layer gone 1/2 a second (or whatever the stream tracker window
is set for) later.

But, when rapidly changing mute/unmute, the following cuold happen
and layer changes may be missed
- Available layers - 0, 1, 2
- Mute
- Before layer gone detected, unumute. Because of this layer gone
  is not reported and available layers stay at 0, 1, 2.
- Stream tracker is reset on unmute to enable quick detection of layer
  start.
- If all layers start back up, no issues.
- But, if the layers do not start back up, there is no layer start
  firing and the available layers are still 0, 1, 2 which is incorrect.

* exempt handling when paused
This commit is contained in:
Raja Subramanian authored and GitHub committed 2022-07-07 22:52:45 +05:30
1 parent 177061712c
commit 8315a547a8
2 files changed
+23 -7

No files matched your search

+10 -1
View File
@@ -165,13 +165,22 @@ func (s *StreamTracker) resetLocked() {
func (s *StreamTracker) SetPaused(paused bool) {
s.lock.Lock()
defer s.lock.Unlock()
s.paused = paused
status := s.status
changed := false
if !paused {
s.resetLocked()
} else {
// bump generation to trigger exit of current worker
s.generation.Inc()
status, changed = s.maybeSetStatus(StreamStatusStopped)
}
s.lock.Unlock()
s.maybeNotifyStatus(status, changed)
}
// Observe a packet that's received
+13 -6
View File
@@ -72,6 +72,7 @@ type StreamTrackerManager struct {
availableLayers []int32
maxExpectedLayer int32
paused bool
onAvailableLayersChanged func(availableLayers []int32)
onBitrateAvailabilityChanged func()
@@ -137,11 +138,15 @@ func (s *StreamTrackerManager) AddTracker(layer int32) *StreamTracker {
}
}
s.lock.RLock()
maxExpectedLayer := s.maxExpectedLayer
s.lock.RUnlock()
if exempt {
s.lock.RLock()
if layer > s.maxExpectedLayer || s.paused {
exempt = false
}
s.lock.RUnlock()
}
if !exempt || layer > maxExpectedLayer {
if !exempt {
s.removeAvailableLayer(layer)
} else {
s.logger.Debugw("not removing exempt layer", "layer", layer)
@@ -183,6 +188,7 @@ func (s *StreamTrackerManager) RemoveAllTrackers() {
}
s.availableLayers = make([]int32, 0)
s.maxExpectedLayer = DefaultMaxLayerSpatial
s.paused = false
s.lock.Unlock()
for _, tracker := range trackers {
@@ -200,9 +206,10 @@ func (s *StreamTrackerManager) GetTracker(layer int32) *StreamTracker {
}
func (s *StreamTrackerManager) SetPaused(paused bool) {
s.lock.RLock()
s.lock.Lock()
s.paused = paused
trackers := s.trackers
s.lock.RUnlock()
s.lock.Unlock()
for _, tracker := range trackers {
if tracker != nil {