Avoid locking when flushing DownTrack (#594)

This commit is contained in:
David Zhao
2022-04-05 23:45:51 -07:00
committed by GitHub
parent 1471830990
commit 8fbe00edb3
2 changed files with 18 additions and 7 deletions
+5 -6
View File
@@ -49,15 +49,14 @@ func (u *UpTrackManager) Start() {
func (u *UpTrackManager) Close() {
u.lock.Lock()
u.closed = true
// remove all subscribers
for _, t := range u.publishedTracks {
t.RemoveAllSubscribers()
}
notify := len(u.publishedTracks) == 0
u.lock.Unlock()
// remove all subscribers
for _, t := range u.GetPublishedTracks() {
t.RemoveAllSubscribers()
}
if notify && u.onClose != nil {
u.onClose()
}
+13 -1
View File
@@ -45,6 +45,7 @@ const (
keyFrameIntervalMin = 200
keyFrameIntervalMax = 1000
flushTimeout = 1 * time.Second
)
var (
@@ -569,7 +570,18 @@ func (d *DownTrack) CloseWithFlush(flush bool) {
// display buffer and there could be a brief moment where the previous stream is displayed.
d.logger.Infow("close down track", "peerID", d.peerID, "trackID", d.id, "flushBlankFrame", flush)
if flush {
_ = d.writeBlankFrameRTP()
doneFlushing := make(chan struct{})
go func() {
defer close(doneFlushing)
_ = d.writeBlankFrameRTP()
}()
// wait a limited time to flush
timer := time.NewTimer(flushTimeout)
select {
case <-doneFlushing:
case <-timer.C:
}
}
d.closeOnce.Do(func() {