From 26c2f7cd9a1217852a8c61afd827ed7f856800db Mon Sep 17 00:00:00 2001 From: Raja Subramanian Date: Fri, 3 May 2024 18:56:01 +0530 Subject: [PATCH] Do not use LastTS for dummy offset. (#2700) * Do not use LastTS for dummy offset. LastTS could be random when using dummy start. That should not be used in calculating offsets. Also, do not push padding into sequence before init. Could have heppened with dummy start. * apply dummy offset before comparing to last * refresh ref TS * initialize codec munger on catch up forwarding --- pkg/sfu/forwarder.go | 13 +++++++++---- pkg/sfu/sequencer.go | 2 +- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/pkg/sfu/forwarder.go b/pkg/sfu/forwarder.go index 6b8415972..9fb66e020 100644 --- a/pkg/sfu/forwarder.go +++ b/pkg/sfu/forwarder.go @@ -1589,6 +1589,7 @@ func (f *Forwarder) processSourceSwitch(extPkt *buffer.ExtPacket, layer int32) e return nil } else if f.referenceLayerSpatial == buffer.InvalidLayerSpatial { f.referenceLayerSpatial = layer + f.codecMunger.SetLast(extPkt) f.logger.Debugw( "catch up forwarding", "sequenceNumber", extPkt.Packet.SequenceNumber, @@ -1641,8 +1642,9 @@ func (f *Forwarder) processSourceSwitch(extPkt *buffer.ExtPacket, layer int32) e } // adjust extRefTS to current packet's timestamp mapped to that of reference layer's - extRefTS = (extRefTS & 0xFFFF_FFFF_0000_0000) + uint64(refTS) + extRefTS = (extRefTS & 0xFFFF_FFFF_0000_0000) + uint64(refTS) + f.dummyStartTSOffset lastTS := uint32(extLastTS) + refTS = uint32(extRefTS) if (refTS-lastTS) < 1<<31 && refTS < lastTS { extRefTS += (1 << 32) } @@ -1660,21 +1662,23 @@ func (f *Forwarder) processSourceSwitch(extPkt *buffer.ExtPacket, layer int32) e rtpDiff := uint64(timeSinceFirst.Nanoseconds() * int64(f.codec.ClockRate) / 1e9) extExpectedTS = f.extFirstTS + rtpDiff if f.dummyStartTSOffset == 0 { - f.dummyStartTSOffset = extExpectedTS - extRefTS + f.dummyStartTSOffset = extExpectedTS - uint64(refTS) + extRefTS = extExpectedTS f.logger.Infow( "calculating dummyStartTSOffset", "preStartTime", f.preStartTime.String(), "extFirstTS", f.extFirstTS, - "timeSinceFirst", timeSinceFirst, + "timeSinceFirst", timeSinceFirst.String(), "rtpDiff", rtpDiff, "extRefTS", extRefTS, + "incomingTS", extPkt.Packet.Timestamp, + "referenceLayerSpatial", f.referenceLayerSpatial, "dummyStartTSOffset", f.dummyStartTSOffset, ) } } } } - extRefTS += f.dummyStartTSOffset var extNextTS uint64 if f.lastSSRC == 0 { @@ -1759,6 +1763,7 @@ func (f *Forwarder) processSourceSwitch(extPkt *buffer.ExtPacket, layer int32) e "switchingAt", switchingAt.String(), "layer", layer, "extLastTS", extLastTS, + "lastMarker", rtpMungerState.LastMarker, "extRefTS", extRefTS, "dummyStartTSOffset", f.dummyStartTSOffset, "referenceLayerSpatial", f.referenceLayerSpatial, diff --git a/pkg/sfu/sequencer.go b/pkg/sfu/sequencer.go index a78b23eb6..c876b63c9 100644 --- a/pkg/sfu/sequencer.go +++ b/pkg/sfu/sequencer.go @@ -237,7 +237,7 @@ func (s *sequencer) pushPadding(extStartSNInclusive uint64, extEndSNInclusive ui s.Lock() defer s.Unlock() - if s.snRangeMap == nil { + if s.snRangeMap == nil || !s.initialized { return }