From bb00c86489653e41749f725085f4589d3630a75e Mon Sep 17 00:00:00 2001 From: Raja Subramanian Date: Sat, 27 Dec 2025 03:42:23 +0530 Subject: [PATCH] Restart API on receiver. (#4200) Can be used when track moves forward/backward. --- pkg/rtc/wrappedreceiver.go | 6 ++++++ pkg/sfu/receiver_base.go | 11 +++++++++++ 2 files changed, 17 insertions(+) diff --git a/pkg/rtc/wrappedreceiver.go b/pkg/rtc/wrappedreceiver.go index 12784771a..ad3a3b9ab 100644 --- a/pkg/rtc/wrappedreceiver.go +++ b/pkg/rtc/wrappedreceiver.go @@ -501,6 +501,12 @@ func (d *DummyReceiver) VideoSizes() []buffer.VideoSize { return nil } +func (d *DummyReceiver) Restart(reason string) { + if receiver := d.getReceiver(); receiver != nil { + receiver.Restart(reason) + } +} + func (d *DummyReceiver) getReceiver() sfu.TrackReceiver { if receiver, ok := d.receiver.Load().(sfu.TrackReceiver); ok { return receiver diff --git a/pkg/sfu/receiver_base.go b/pkg/sfu/receiver_base.go index 541c5bf6d..d91143974 100644 --- a/pkg/sfu/receiver_base.go +++ b/pkg/sfu/receiver_base.go @@ -151,6 +151,10 @@ type TrackReceiver interface { // VideoSizes returns the video size parsed from rtp packet for each spatial layer. VideoSizes() []buffer.VideoSize + + // closes all associated buffers and issues a resync to all attached downtracks so that + // they can resync and have proper sequncing without gaps in sequence numbers / timestamps + Restart(reason string) } // -------------------------------------- @@ -350,6 +354,13 @@ func (r *ReceiverBase) UpdateTrackInfo(ti *livekit.TrackInfo) { r.streamTrackerManager.UpdateTrackInfo(ti) } +func (r *ReceiverBase) Restart(reason string) { + r.bufferMu.Lock() + defer r.bufferMu.Unlock() + + r.resyncLocked(reason) +} + func (r *ReceiverBase) resyncLocked(reason string) { // resync to avoid gaps in the forwarded sequence number r.params.Logger.Debugw("resync receiver", "reason", reason)