From bfd937feba377f0346eae0bf5888826f3c8e49f3 Mon Sep 17 00:00:00 2001 From: Oto Dusek Date: Tue, 29 Oct 2024 17:23:56 +0100 Subject: [PATCH 1/2] Increment rtx rtp packet sequence number only when trasmitted --- internal/rtpbuffer/packet_factory.go | 7 +++++-- pkg/nack/responder_interceptor.go | 1 + 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/internal/rtpbuffer/packet_factory.go b/internal/rtpbuffer/packet_factory.go index d3f5a12d..06687058 100644 --- a/internal/rtpbuffer/packet_factory.go +++ b/internal/rtpbuffer/packet_factory.go @@ -17,6 +17,7 @@ const rtxSsrcByteLength = 2 // The NoOpPacketFactory doesn't copy packets, while the RetainablePacket will take a copy before adding type PacketFactory interface { NewPacket(header *rtp.Header, payload []byte, rtxSsrc uint32, rtxPayloadType uint8) (*RetainablePacket, error) + FillSequenceNumber(packet *RetainablePacket) } // PacketFactoryCopy is PacketFactory that takes a copy of packets when added to the RTPBuffer @@ -94,8 +95,6 @@ func (m *PacketFactoryCopy) NewPacket(header *rtp.Header, payload []byte, rtxSsr p.header.SSRC = rtxSsrc // Rewrite the payload type. p.header.PayloadType = rtxPayloadType - // Rewrite the sequence number. - p.header.SequenceNumber = m.rtxSequencer.NextSequenceNumber() // Remove padding if present. if p.header.Padding && p.payload != nil && len(p.payload) > 0 { paddingLength := int(p.payload[len(p.payload)-1]) @@ -107,6 +106,10 @@ func (m *PacketFactoryCopy) NewPacket(header *rtp.Header, payload []byte, rtxSsr return p, nil } +func (m *PacketFactoryCopy) FillSequenceNumber(packet *RetainablePacket) { + packet.header.SequenceNumber = m.rtxSequencer.NextSequenceNumber() +} + func (m *PacketFactoryCopy) releasePacket(header *rtp.Header, payload *[]byte) { m.headerPool.Put(header) if payload != nil { diff --git a/pkg/nack/responder_interceptor.go b/pkg/nack/responder_interceptor.go index 58e34301..49bcf381 100644 --- a/pkg/nack/responder_interceptor.go +++ b/pkg/nack/responder_interceptor.go @@ -147,6 +147,7 @@ func (n *ResponderInterceptor) resendPackets(nack *rtcp.TransportLayerNack) { defer stream.rtpBufferMutex.Unlock() if p := stream.rtpBuffer.Get(seq); p != nil { + n.packetFactory.FillSequenceNumber(p) if _, err := stream.rtpWriter.Write(p.Header(), p.Payload(), interceptor.Attributes{}); err != nil { n.log.Warnf("failed resending nacked packet: %+v", err) } From d7734aa53671ca02a7b3e4bf3843ea8315678f0e Mon Sep 17 00:00:00 2001 From: Oto Dusek Date: Wed, 30 Oct 2024 15:04:10 +0100 Subject: [PATCH 2/2] Fix test --- internal/rtpbuffer/packet_factory.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/internal/rtpbuffer/packet_factory.go b/internal/rtpbuffer/packet_factory.go index 06687058..a73d72fb 100644 --- a/internal/rtpbuffer/packet_factory.go +++ b/internal/rtpbuffer/packet_factory.go @@ -131,6 +131,9 @@ func (f *PacketFactoryNoOp) NewPacket(header *rtp.Header, payload []byte, _ uint }, nil } +func (m *PacketFactoryNoOp) FillSequenceNumber(packet *RetainablePacket) { +} + func (f *PacketFactoryNoOp) releasePacket(_ *rtp.Header, _ *[]byte) { // no-op }