From 8eb81388e6920410ed92b35fecdb302feff5c062 Mon Sep 17 00:00:00 2001 From: Raja Subramanian Date: Tue, 18 Mar 2025 07:41:30 +0530 Subject: [PATCH] Use a generation to counter to stop key frame seeder on codec change (#3531) --- pkg/sfu/buffer/buffer.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/pkg/sfu/buffer/buffer.go b/pkg/sfu/buffer/buffer.go index 6a1dd1124..945203809 100644 --- a/pkg/sfu/buffer/buffer.go +++ b/pkg/sfu/buffer/buffer.go @@ -145,6 +145,8 @@ type Buffer struct { rtxPktBuf []byte absCaptureTimeExtID uint8 + + keyFrameSeederGeneration atomic.Int32 } // NewBuffer constructs a new Buffer @@ -308,7 +310,7 @@ func (b *Buffer) Bind(params webrtc.RTPParameters, codec webrtc.RTPCodecCapabili b.bound = true if mime.IsMimeTypeVideo(b.mime) { - go b.seedKeyFrame() + go b.seedKeyFrame(b.keyFrameSeederGeneration.Inc()) } } @@ -810,7 +812,7 @@ func (b *Buffer) handleCodecChange(newPT uint8) { } if mime.IsMimeTypeVideo(b.mime) { - go b.seedKeyFrame() + go b.seedKeyFrame(b.keyFrameSeederGeneration.Inc()) } } @@ -1239,7 +1241,7 @@ func (b *Buffer) GetTemporalLayerFpsForSpatial(layer int32) []float32 { return nil } -func (b *Buffer) seedKeyFrame() { +func (b *Buffer) seedKeyFrame(keyFrameSeederGeneration int32) { // a key frame is needed especially when using Dependency Descriptor // to get the DD structure which is used in parsing subsequent packets, // till then packets are dropped which results in stream tracker not @@ -1255,7 +1257,7 @@ func (b *Buffer) seedKeyFrame() { defer ticker.Stop() for { - if b.closed.Load() { + if b.closed.Load() || b.keyFrameSeederGeneration.Load() != keyFrameSeederGeneration { return }