From 1590b966869e52f38c992346f95bfad5331e10ea Mon Sep 17 00:00:00 2001 From: Raja Subramanian Date: Tue, 5 Sep 2023 12:00:00 +0530 Subject: [PATCH] Need to set reference layer when starting with dummy packets. (#2034) Dummy packets are used at start to trigger Pion's OnTrack. --- pkg/sfu/buffer/rtpstats.go | 4 +--- pkg/sfu/downtrack.go | 7 +++++-- pkg/sfu/forwarder.go | 9 +++++++++ 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/pkg/sfu/buffer/rtpstats.go b/pkg/sfu/buffer/rtpstats.go index 357b50902..9bacf08f7 100644 --- a/pkg/sfu/buffer/rtpstats.go +++ b/pkg/sfu/buffer/rtpstats.go @@ -644,8 +644,6 @@ func (r *RTPStats) UpdateFromReceiverReport(rr rtcp.ReceptionReport) (rtt uint32 if extHighestSNOverridden < r.sequenceNumber.GetExtendedStart() { // it is possible that the `LastSequenceNumber` in the receiver report is before the starting // sequence number when dummy packets are used to trigger Pion's OnTrack path. - r.lastRRTime = time.Now() - r.lastRR = rr return } @@ -1211,7 +1209,7 @@ func (r *RTPStats) DeltaInfo(snapshotId uint32) *RTPDeltaInfo { } func (r *RTPStats) DeltaInfoOverridden(snapshotId uint32) *RTPDeltaInfo { - if !r.params.IsReceiverReportDriven { + if !r.params.IsReceiverReportDriven || r.lastRRTime.IsZero() { return nil } diff --git a/pkg/sfu/downtrack.go b/pkg/sfu/downtrack.go index f126847bc..53e6f327e 100644 --- a/pkg/sfu/downtrack.go +++ b/pkg/sfu/downtrack.go @@ -1786,8 +1786,11 @@ func (d *DownTrack) sendSilentFrameOnMuteForOpus() { AbsSendTimeExtID: uint8(d.absSendTimeExtID), TransportWideExtID: uint8(d.transportWideExtID), WriteStream: d.writeStream, - Metadata: sendPacketMetadata{}, - OnSent: d.packetSent, + Metadata: sendPacketMetadata{ + // although this is using empty frames, mark as padding as these are used to trigger Pion OnTrack only + isPadding: true, + }, + OnSent: d.packetSent, }) } diff --git a/pkg/sfu/forwarder.go b/pkg/sfu/forwarder.go index 567465ce9..b64824ca9 100644 --- a/pkg/sfu/forwarder.go +++ b/pkg/sfu/forwarder.go @@ -1454,6 +1454,15 @@ func (f *Forwarder) processSourceSwitch(extPkt *buffer.ExtPacket, layer int32) e "referenceLayerSpatial", f.referenceLayerSpatial, ) return nil + } else if f.referenceLayerSpatial == buffer.InvalidLayerSpatial { + f.referenceLayerSpatial = layer + f.logger.Debugw( + "catch up forwarding", + "sequenceNumber", extPkt.Packet.SequenceNumber, + "timestamp", extPkt.Packet.Timestamp, + "layer", layer, + "referenceLayerSpatial", f.referenceLayerSpatial, + ) } logTransition := func(message string, extExpectedTS, extRefTS, extLastTS uint64, diffSeconds float64) {