fix keyFrameRequestGeneration not exit after close (#527)

* fix keyFrameRequestGeneration not exit after close

* change to bound check

* Refactor stop key frame requester into a function

* Remove redundant key frame requester stop

Co-authored-by: boks1971 <raja.gobi@tutanota.com>
This commit is contained in:
cnderrauber
2022-03-17 18:50:07 +08:00
committed by GitHub
parent dc6b3369f4
commit c6a35d3ff1
+11 -6
View File
@@ -236,6 +236,7 @@ func (d *DownTrack) Bind(t webrtc.TrackLocalContext) (webrtc.RTPCodecParameters,
d.bound.Store(true)
d.connectionStats.Start()
d.logger.Debugw("binded")
return codec, nil
}
@@ -297,14 +298,18 @@ func (d *DownTrack) maybeStartKeyFrameRequester() {
// or paused due to bandwidth constraints. A new key frame requester is
// started if a layer lock is required.
//
gen := d.keyFrameRequestGeneration.Inc()
d.stopKeyFrameRequester()
locked, layer := d.forwarder.CheckSync()
if !locked {
go d.keyFrameRequester(gen, layer)
go d.keyFrameRequester(d.keyFrameRequestGeneration.Load(), layer)
}
}
func (d *DownTrack) stopKeyFrameRequester() {
d.keyFrameRequestGeneration.Inc()
}
func (d *DownTrack) keyFrameRequester(generation uint32, layer int32) {
interval := 2 * d.rtpStats.GetRtt()
if interval < keyFrameIntervalMin {
@@ -320,7 +325,8 @@ func (d *DownTrack) keyFrameRequester(generation uint32, layer int32) {
d.rtpStats.UpdateLayerLockPliAndTime(1)
<-ticker.C
if generation != d.keyFrameRequestGeneration.Load() {
if generation != d.keyFrameRequestGeneration.Load() || !d.bound.Load() {
return
}
}
@@ -396,8 +402,7 @@ func (d *DownTrack) WriteRTP(extPkt *buffer.ExtPacket, layer int32) error {
locked, _ := d.forwarder.CheckSync()
if locked {
// move generator to stop key frame requester
d.keyFrameRequestGeneration.Inc()
d.stopKeyFrameRequester()
}
}
@@ -577,7 +582,7 @@ func (d *DownTrack) CloseWithFlush(flush bool) {
}
d.callbacksQueue.Stop()
d.keyFrameRequestGeneration.Inc()
d.stopKeyFrameRequester()
})
}