diff --git a/pkg/sfu/buffer/buffer_base.go b/pkg/sfu/buffer/buffer_base.go index 95b855264..ec4cf8068 100644 --- a/pkg/sfu/buffer/buffer_base.go +++ b/pkg/sfu/buffer/buffer_base.go @@ -964,8 +964,6 @@ func (b *BufferBase) handleCodecChange(newPT uint8) { b.rtxPayloadType = rtxPt b.mime = mime.NormalizeMimeType(newCodec.MimeType) - b.restartStreamLocked("codec-change", true) - if f := b.onCodecChange; f != nil { go f(newCodec) } diff --git a/pkg/sfu/buffer/buffer_test.go b/pkg/sfu/buffer/buffer_test.go index 9b6e8b026..f0f307690 100644 --- a/pkg/sfu/buffer/buffer_test.go +++ b/pkg/sfu/buffer/buffer_test.go @@ -331,7 +331,6 @@ func TestCodecChange(t *testing.T) { buff := NewBuffer(123, 1, 1) require.NotNil(t, buff) changedCodec := make(chan webrtc.RTPCodecParameters, 1) - restartCleared := make(chan struct{}, 1) buff.OnCodecChange(func(rp webrtc.RTPCodecParameters) { select { case changedCodec <- rp: @@ -347,8 +346,6 @@ func TestCodecChange(t *testing.T) { extPkt, err := buff.ReadExtended(buf[:]) require.NoError(t, err) require.Nil(t, extPkt) - - restartCleared <- struct{}{} }) h265Pkt := rtp.Packet{ @@ -391,7 +388,6 @@ func TestCodecChange(t *testing.T) { case <-time.After(1 * time.Second): t.Fatalf("expected codec change") } - <-restartCleared // second codec change - writing VP8 packet after Bind should trigger another codec change vp8Pkt := rtp.Packet{ @@ -416,7 +412,6 @@ func TestCodecChange(t *testing.T) { t.Fatalf("expected codec change") } fmt.Printf("done second codec change\n") // REMOVE - <-restartCleared // out of order pkts can't cause codec change // rewrite the VP8 packet to start the sequence after a stream restart @@ -463,7 +458,6 @@ func TestCodecChange(t *testing.T) { case <-time.After(1 * time.Second): t.Fatalf("expected codec change") } - <-restartCleared } func BenchmarkMemcpu(b *testing.B) { diff --git a/pkg/sfu/codecmunger/vp8.go b/pkg/sfu/codecmunger/vp8.go index 8eb300814..71eace018 100644 --- a/pkg/sfu/codecmunger/vp8.go +++ b/pkg/sfu/codecmunger/vp8.go @@ -60,9 +60,14 @@ func NewVP8(logger logger.Logger) *VP8 { } } -func NewVP8FromNull(cm CodecMunger, logger logger.Logger) *VP8 { +func NewVP8FromOther(cm CodecMunger, logger logger.Logger) *VP8 { v := NewVP8(logger) - v.SeedState(cm.(*Null).GetSeededState()) + switch cm := cm.(type) { + case *Null: + v.SeedState(cm.GetSeededState()) + case *VP8: + v.SeedState(cm.GetState()) + } return v } @@ -79,9 +84,14 @@ func (v *VP8) GetState() any { } func (v *VP8) SeedState(seed any) { + var state *livekit.VP8MungerState switch cm := seed.(type) { case *livekit.RTPForwarderState_Vp8Munger: - state := cm.Vp8Munger + state = cm.Vp8Munger + case *livekit.VP8MungerState: + state = cm + } + if state != nil { v.extLastPictureId = state.ExtLastPictureId v.pictureIdUsed = state.PictureIdUsed v.lastTl0PicIdx = uint8(state.LastTl0PicIdx) diff --git a/pkg/sfu/forwarder.go b/pkg/sfu/forwarder.go index 497bce1f2..d52bcaa04 100644 --- a/pkg/sfu/forwarder.go +++ b/pkg/sfu/forwarder.go @@ -334,7 +334,7 @@ func (f *Forwarder) DetermineCodec(codec webrtc.RTPCodecCapability, extensions [ switch f.mime { case mime.MimeTypeVP8: - f.codecMunger = codecmunger.NewVP8FromNull(f.codecMunger, f.logger) + f.codecMunger = codecmunger.NewVP8FromOther(f.codecMunger, f.logger) if f.vls != nil { if vls := videolayerselector.NewSimulcastFromOther(f.vls); vls != nil { f.vls = vls @@ -347,6 +347,7 @@ func (f *Forwarder) DetermineCodec(codec webrtc.RTPCodecCapability, extensions [ f.vls.SetTemporalLayerSelector(temporallayerselector.NewVP8(f.logger)) case mime.MimeTypeH264, mime.MimeTypeH265: + f.codecMunger = codecmunger.NewNull(f.logger) if f.vls != nil { if vls := videolayerselector.NewSimulcastFromOther(f.vls); vls != nil { f.vls = vls @@ -358,6 +359,7 @@ func (f *Forwarder) DetermineCodec(codec webrtc.RTPCodecCapability, extensions [ } case mime.MimeTypeVP9: + f.codecMunger = codecmunger.NewNull(f.logger) if sfuutils.IsSimulcastMode(videoLayerMode) { if f.vls != nil { f.vls = videolayerselector.NewSimulcastFromOther(f.vls) @@ -382,6 +384,7 @@ func (f *Forwarder) DetermineCodec(codec webrtc.RTPCodecCapability, extensions [ } case mime.MimeTypeAV1: + f.codecMunger = codecmunger.NewNull(f.logger) if sfuutils.IsSimulcastMode(videoLayerMode) { if f.vls != nil { f.vls = videolayerselector.NewSimulcastFromOther(f.vls)