From 7018e485f295da1b6e6bcc73c1bb3ab67e6f6ff2 Mon Sep 17 00:00:00 2001 From: Raja Subramanian Date: Thu, 8 Aug 2024 23:15:04 +0530 Subject: [PATCH] Do not start forwarding on an out-of-order packet. (#2917) It is possible that old packets arrive on receiver. If subscriber starts on that, the first packet time would be incorrect. Do not start forwarding on out-of-order packets. --- pkg/sfu/buffer/buffer.go | 2 ++ pkg/sfu/downtrack.go | 5 +++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/pkg/sfu/buffer/buffer.go b/pkg/sfu/buffer/buffer.go index 505ddd694..ccaf9cd4c 100644 --- a/pkg/sfu/buffer/buffer.go +++ b/pkg/sfu/buffer/buffer.go @@ -66,6 +66,7 @@ type ExtPacket struct { RawPacket []byte DependencyDescriptor *ExtDependencyDescriptor AbsCaptureTimeExt *act.AbsCaptureTime + IsOutOfOrder bool } // Buffer contains all packets @@ -763,6 +764,7 @@ func (b *Buffer) getExtPacket(rtpPacket *rtp.Packet, arrivalTime int64, flowStat Spatial: InvalidLayerSpatial, Temporal: InvalidLayerTemporal, }, + IsOutOfOrder: flowState.IsOutOfOrder, } if len(rtpPacket.Payload) == 0 { diff --git a/pkg/sfu/downtrack.go b/pkg/sfu/downtrack.go index 54c56714c..b94cd308d 100644 --- a/pkg/sfu/downtrack.go +++ b/pkg/sfu/downtrack.go @@ -745,7 +745,8 @@ func (d *DownTrack) maxLayerNotifierWorker() { // WriteRTP writes an RTP Packet to the DownTrack func (d *DownTrack) WriteRTP(extPkt *buffer.ExtPacket, layer int32) error { - if !d.writable.Load() { + if !d.writable.Load() || (extPkt.IsOutOfOrder && !d.rtpStats.IsActive()) { + // do not start on an out-of-order packet return nil } @@ -801,7 +802,7 @@ func (d *DownTrack) WriteRTP(extPkt *buffer.ExtPacket, layer int32) error { // the corresponding sequence number is received. // The extreme case is all packets containing the play out delay are lost and // all of them retransmitted and an RTCP Receiver Report received for those - // retransmited sequence numbers. But, that is highly improbable, if not impossible. + // retransmitted sequence numbers. But, that is highly improbable, if not impossible. } } var actBytes []byte