Fix our-of-order twcc fb cause by rtx blocked

Fix #2830. The TrackRemote.Read could block in
readRTP if the buffer is empty then rtx packets
arrival before next media rtp packet will be
readed after the next media rtp packet and cause
out-of-order fb and mess up remote peer's
bandwidth estimation.
This commit is contained in:
cnderrauber
2024-07-26 09:52:44 +08:00
committed by Sean DuBois
parent 69cd4e4907
commit 2364173ced

View File

@@ -424,7 +424,7 @@ func (r *RTPReceiver) receiveForRtx(ssrc SSRC, rsid string, streamInfo *intercep
track.repairInterceptor = rtpInterceptor
track.repairRtcpReadStream = rtcpReadStream
track.repairRtcpInterceptor = rtcpInterceptor
track.repairStreamChannel = make(chan rtxPacketWithAttributes)
track.repairStreamChannel = make(chan rtxPacketWithAttributes, 50)
go func() {
for {
@@ -474,6 +474,8 @@ func (r *RTPReceiver) receiveForRtx(ssrc SSRC, rsid string, streamInfo *intercep
r.rtxPool.Put(b) // nolint:staticcheck
return
case track.repairStreamChannel <- rtxPacketWithAttributes{pkt: b[:i-2], attributes: attributes, pool: &r.rtxPool}:
default:
// skip the RTX packet if the repair stream channel is full, could be blocked in the application's read loop
}
}
}()