mirror of
https://github.com/livekit/livekit.git
synced 2026-10-23 04:22:30 +00:00
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:
1 parent
177061712c
commit
8315a547a8
2 files changed
+23
-7
No files matched your search
@@ -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
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in new issue
Block a user