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.
This commit is contained in:
Raja Subramanian
2024-06-03 11:55:59 +05:30
committed by GitHub
parent b99650aaf6
commit e483cee662
+26 -22
View File
@@ -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) {