From 00b456451fb3ca0594147cac933d568deb9635bc Mon Sep 17 00:00:00 2001 From: Edoardo Liverani Date: Wed, 30 Jun 2021 10:45:11 +0200 Subject: [PATCH] Fix AddTrack transceiver reuse per W3C specs According to W3C specifications, the transceiver can be reused if "The sender has never been used to send. More precisely, the [[CurrentDirection]] slot of the RTCRtpTransceiver associated with the sender has never had a value of "sendrecv" or "sendonly"". Current implementation does not have CurrentDirection slot, so the flag usedToSend is set on setDirection change. This fixes #1843 and maybe other issues. --- peerconnection.go | 2 +- rtptransceiver.go | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/peerconnection.go b/peerconnection.go index 8eb0cb8eae5..b8d87d50233 100644 --- a/peerconnection.go +++ b/peerconnection.go @@ -1197,7 +1197,7 @@ func (pc *PeerConnection) AddTrack(track *Track) (*RTPSender, error) { var transceiver *RTPTransceiver for _, t := range pc.GetTransceivers() { - if !t.stopped && t.kind == track.Kind() && t.Sender() == nil { + if !t.stopped && t.kind == track.Kind() && t.Sender() == nil && t.usedToSend.Load() != true { transceiver = t break } diff --git a/rtptransceiver.go b/rtptransceiver.go index af094bf6992..5b89a792148 100644 --- a/rtptransceiver.go +++ b/rtptransceiver.go @@ -14,6 +14,8 @@ type RTPTransceiver struct { receiver atomic.Value // *RTPReceiver direction atomic.Value // RTPTransceiverDirection + usedToSend atomic.Value // track if direction has never had a value of "sendrecv" or "sendonly" + stopped bool kind RTPCodecType } @@ -89,6 +91,9 @@ func (t *RTPTransceiver) setReceiver(r *RTPReceiver) { } func (t *RTPTransceiver) setDirection(d RTPTransceiverDirection) { + if d == RTPTransceiverDirectionSendrecv || d == RTPTransceiverDirectionSendonly { + t.usedToSend.Store(true) + } t.direction.Store(d) }