Browse Source

fix(TPC): ignore "ontrackadded" for existing track

Until M69 Chrome used to consistently emit "onstreamadded" when
audio/video stream is added for the first time and then emit track
events only if the stream is modified afterwards (video track replaced).

However it looks like now it can first emit "onstreamadded" and then
additional "ontrackadded" for the MediaStreamTrack that was already
included in the MediaStream signalled by the "onstremadded" event. I
have not managed to figure out what is causing this and the only
difference in the SDP is the fact that the remote peer (JVB) includes
IPv6 candidates. Anyway it doesn't hurt to have such a safeguard.
dev1
paweldomas 7 years ago
parent
commit
34f728456e
1 changed files with 27 additions and 8 deletions
  1. 27
    8
      modules/RTC/TraceablePeerConnection.js

+ 27
- 8
modules/RTC/TraceablePeerConnection.js View File

@@ -728,11 +728,6 @@ TraceablePeerConnection.prototype._createRemoteTrack = function(
728 728
         videoType,
729 729
         ssrc,
730 730
         muted) {
731
-    const remoteTrack
732
-        = new JitsiRemoteTrack(
733
-            this.rtc, this.rtc.conference,
734
-            ownerEndpointId,
735
-            stream, track, mediaType, videoType, ssrc, muted, this.isP2P);
736 731
     let remoteTracksMap = this.remoteTracks.get(ownerEndpointId);
737 732
 
738 733
     if (!remoteTracksMap) {
@@ -740,11 +735,35 @@ TraceablePeerConnection.prototype._createRemoteTrack = function(
740 735
         this.remoteTracks.set(ownerEndpointId, remoteTracksMap);
741 736
     }
742 737
 
743
-    if (remoteTracksMap.has(mediaType)) {
738
+    const existingTrack = remoteTracksMap.get(mediaType);
739
+
740
+    if (existingTrack && existingTrack.getTrack() === track) {
741
+        // Ignore duplicated event which can originate either from
742
+        // 'onStreamAdded' or 'onTrackAdded'.
743
+        logger.info(
744
+            `${this} ignored duplicated remote track added event for: `
745
+                + `${ownerEndpointId}, ${mediaType}`);
746
+
747
+        return;
748
+    } else if (existingTrack) {
744 749
         logger.error(
745
-            `${this} overwriting remote track! ${remoteTrack}`,
746
-            ownerEndpointId, mediaType);
750
+            `${this} overwriting remote track for`
751
+                + `${ownerEndpointId} ${mediaType}`);
747 752
     }
753
+
754
+    const remoteTrack
755
+        = new JitsiRemoteTrack(
756
+                this.rtc,
757
+                this.rtc.conference,
758
+                ownerEndpointId,
759
+                stream,
760
+                track,
761
+                mediaType,
762
+                videoType,
763
+                ssrc,
764
+                muted,
765
+                this.isP2P);
766
+
748 767
     remoteTracksMap.set(mediaType, remoteTrack);
749 768
 
750 769
     this.eventEmitter.emit(RTCEvents.REMOTE_TRACK_ADDED, remoteTrack);

Loading…
Cancel
Save