diff --git a/pkg/rtc/transport.go b/pkg/rtc/transport.go index d61af1e1e..a3785fac7 100644 --- a/pkg/rtc/transport.go +++ b/pkg/rtc/transport.go @@ -1009,7 +1009,7 @@ func (t *PCTransport) Negotiate(force bool) { // no op to cancel pending negotiation }) t.debouncePending = false - t.lastNegotiate = time.Now() + t.updateLastNeogitateLocked() postEvent = true } else { @@ -1017,7 +1017,7 @@ func (t *PCTransport) Negotiate(force bool) { t.debouncedNegotiate(func() { t.lock.Lock() t.debouncePending = false - t.lastNegotiate = time.Now() + t.updateLastNeogitateLocked() t.lock.Unlock() t.postEvent(event{ @@ -1036,6 +1036,12 @@ func (t *PCTransport) Negotiate(force bool) { } } +func (t *PCTransport) updateLastNeogitateLocked() { + if now := time.Now(); now.After(t.lastNegotiate) { + t.lastNegotiate = now + } +} + func (t *PCTransport) ICERestart() error { if t.pc.ConnectionState() == webrtc.PeerConnectionStateClosed { t.params.Logger.Warnw("trying to restart ICE on closed peer connection", nil) @@ -1234,6 +1240,10 @@ func (t *PCTransport) SetPreviousSdp(offer, answer *webrtc.SessionDescription) { } } } + // disable fast negotiation temporarily after migration to avoid sending offer + // contains part of subscribed tracks before migration (needs some time to resolve them). + // browser might have trouble to handle this kind of offer (To be confirmed). + t.lastNegotiate = time.Now().Add(iceFailedTimeoutTotal) t.lock.Unlock() }