From e483cee662a10c4485e58ac48ad532d7d4a2eb01 Mon Sep 17 00:00:00 2001 From: Raja Subramanian Date: Mon, 3 Jun 2024 11:55:59 +0530 Subject: [PATCH] Prevent tracker override. (#2750) When relaying buffers are stopped and restarted. On a restart, the buffer adds a tracker. But, the tracker is not destroyed till the end. So, the old tracker and new tracker for the same layer stomp on each other and declare layer unavailable (the old tracker is not getting any packets). Fix by not creating a new tracker if one exists already. --- pkg/sfu/streamtrackermanager.go | 48 ++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/pkg/sfu/streamtrackermanager.go b/pkg/sfu/streamtrackermanager.go index 0158c55c7..5f12e85c2 100644 --- a/pkg/sfu/streamtrackermanager.go +++ b/pkg/sfu/streamtrackermanager.go @@ -168,35 +168,39 @@ func (s *StreamTrackerManager) AddDependencyDescriptorTrackers() { } func (s *StreamTrackerManager) AddTracker(layer int32) streamtracker.StreamTrackerWorker { + var tracker streamtracker.StreamTrackerWorker + s.lock.Lock() + if s.ddTracker != nil { + tracker = s.ddTracker.LayeredTracker(layer) + } else { + tracker = s.trackers[layer] + } + s.lock.Unlock() + if tracker != nil { + return tracker + } + bitrateInterval, ok := s.trackerConfig.BitrateReportInterval[layer] if !ok { return nil } - var tracker streamtracker.StreamTrackerWorker - s.lock.Lock() - if s.ddTracker != nil { - tracker = s.ddTracker.LayeredTracker(layer) + var trackerImpl streamtracker.StreamTrackerImpl + switch s.trackerConfig.StreamTrackerType { + case config.StreamTrackerTypePacket: + trackerImpl = s.createStreamTrackerPacket(layer) + case config.StreamTrackerTypeFrame: + trackerImpl = s.createStreamTrackerFrame(layer) + } + if trackerImpl == nil { + return nil } - s.lock.Unlock() - if tracker == nil { - var trackerImpl streamtracker.StreamTrackerImpl - switch s.trackerConfig.StreamTrackerType { - case config.StreamTrackerTypePacket: - trackerImpl = s.createStreamTrackerPacket(layer) - case config.StreamTrackerTypeFrame: - trackerImpl = s.createStreamTrackerFrame(layer) - } - if trackerImpl == nil { - return nil - } - tracker = streamtracker.NewStreamTracker(streamtracker.StreamTrackerParams{ - StreamTrackerImpl: trackerImpl, - BitrateReportInterval: bitrateInterval, - Logger: s.logger.WithValues("layer", layer), - }) - } + tracker = streamtracker.NewStreamTracker(streamtracker.StreamTrackerParams{ + StreamTrackerImpl: trackerImpl, + BitrateReportInterval: bitrateInterval, + Logger: s.logger.WithValues("layer", layer), + }) s.logger.Debugw("stream tracker add track", "layer", layer) tracker.OnStatusChanged(func(status streamtracker.StreamStatus) {