From 7f62d2b5643aea4fac1d37be283f1fa9ef6e8c4f Mon Sep 17 00:00:00 2001 From: ivanlukomskiy Date: Sat, 14 Feb 2026 18:31:33 +0400 Subject: [PATCH] fix memory leak #2 --- internal/rtpbuffer/rtpbuffer.go | 9 +++++++++ pkg/nack/responder_interceptor.go | 5 +++++ 2 files changed, 14 insertions(+) diff --git a/internal/rtpbuffer/rtpbuffer.go b/internal/rtpbuffer/rtpbuffer.go index 94c7adfe..697da06e 100644 --- a/internal/rtpbuffer/rtpbuffer.go +++ b/internal/rtpbuffer/rtpbuffer.go @@ -47,6 +47,15 @@ func NewRTPBuffer(size uint16) (*RTPBuffer, error) { }, nil } +// Reset clears the RTPBuffer of all packets and resets its state. +func (r *RTPBuffer) Reset() { + for i := range r.packets { + r.packets[i] = nil + } + r.highestAdded = 0 + r.started = false +} + // Add places the RetainablePacket in the RTPBuffer. func (r *RTPBuffer) Add(packet *RetainablePacket) { seq := packet.sequenceNumber diff --git a/pkg/nack/responder_interceptor.go b/pkg/nack/responder_interceptor.go index 8b5585ac..c12e6c00 100644 --- a/pkg/nack/responder_interceptor.go +++ b/pkg/nack/responder_interceptor.go @@ -139,6 +139,11 @@ func (n *ResponderInterceptor) BindLocalStream( // UnbindLocalStream is called when the Stream is removed. It can be used to clean up any data related to that track. func (n *ResponderInterceptor) UnbindLocalStream(info *interceptor.StreamInfo) { n.streamsMu.Lock() + if stream, ok := n.streams[info.SSRC]; ok { + stream.rtpBufferMutex.Lock() + stream.rtpBuffer.Reset() + stream.rtpBufferMutex.Unlock() + } delete(n.streams, info.SSRC) n.streamsMu.Unlock() }