Bladeren bron

fix(safari): Remove old remote tracks when a new track is received for an endpoint.

On Safari, MediaStream.onremovetrack is not fired when a remote desciption with a removed MSID is applied. As a result, new remote tracks for the same endpoint are not created causing issues where the video is not updated on Safari. Also, make sure local tracks on pc are updated when devices are changed while the user is in muted state.
dev1
Jaya Allamsetty 4 jaren geleden
bovenliggende
commit
ea33a70f9c
2 gewijzigde bestanden met toevoegingen van 25 en 13 verwijderingen
  1. 17
    10
      modules/RTC/TPCUtils.js
  2. 8
    3
      modules/RTC/TraceablePeerConnection.js

+ 17
- 10
modules/RTC/TPCUtils.js Bestand weergeven

@@ -1,7 +1,6 @@
1 1
 import { getLogger } from 'jitsi-meet-logger';
2 2
 import transform from 'sdp-transform';
3 3
 
4
-import * as JitsiTrackEvents from '../../JitsiTrackEvents';
5 4
 import * as MediaType from '../../service/RTC/MediaType';
6 5
 import RTCEvents from '../../service/RTC/RTCEvents';
7 6
 import browser from '../browser';
@@ -312,6 +311,17 @@ export class TPCUtils {
312 311
         if (oldTrack && newTrack) {
313 312
             const mediaType = newTrack.getType();
314 313
             const stream = newTrack.getOriginalStream();
314
+
315
+            // Ignore cases when the track is replaced while the device is in a muted state,like
316
+            // replacing camera when video muted or replacing mic when audio muted. These JitsiLocalTracks
317
+            // do not have a mediastream attached. Replace track will be called again when the device is
318
+            // unmuted and the track will be replaced on the peerconnection then.
319
+            if (!stream) {
320
+                this.pc.localTracks.delete(oldTrack.rtcId);
321
+                this.pc.localTracks.set(newTrack.rtcId, newTrack);
322
+
323
+                return Promise.resolve();
324
+            }
315 325
             const track = mediaType === MediaType.AUDIO
316 326
                 ? stream.getAudioTracks()[0]
317 327
                 : stream.getVideoTracks()[0];
@@ -339,23 +349,20 @@ export class TPCUtils {
339 349
                         this.pc._extractPrimarySSRC(ssrc));
340 350
                 });
341 351
         } else if (oldTrack && !newTrack) {
342
-            if (!this.removeTrackMute(oldTrack)) {
343
-                return Promise.reject(new Error('replace track failed'));
344
-            }
345
-            this.pc.localTracks.delete(oldTrack.rtcId);
346
-            this.pc.localSSRCs.delete(oldTrack.rtcId);
352
+            return this.removeTrackMute(oldTrack)
353
+                .then(() => {
354
+                    this.pc.localTracks.delete(oldTrack.rtcId);
355
+                    this.pc.localSSRCs.delete(oldTrack.rtcId);
356
+                });
347 357
         } else if (newTrack && !oldTrack) {
348 358
             const ssrc = this.pc.localSSRCs.get(newTrack.rtcId);
349 359
 
350
-            this.addTrackUnmute(newTrack)
360
+            return this.addTrackUnmute(newTrack)
351 361
                 .then(() => {
352
-                    newTrack.emit(JitsiTrackEvents.TRACK_MUTE_CHANGED, newTrack);
353 362
                     this.pc.localTracks.set(newTrack.rtcId, newTrack);
354 363
                     this.pc.localSSRCs.set(newTrack.rtcId, ssrc);
355 364
                 });
356 365
         }
357
-
358
-        return Promise.resolve();
359 366
     }
360 367
 
361 368
     /**

+ 8
- 3
modules/RTC/TraceablePeerConnection.js Bestand weergeven

@@ -916,6 +916,13 @@ TraceablePeerConnection.prototype._createRemoteTrack = function(
916 916
 
917 917
     const existingTrack = remoteTracksMap.get(mediaType);
918 918
 
919
+    // Delete the existing track and create the new one because of a known bug on Safari.
920
+    // RTCPeerConnection.ontrack fires when a new remote track is added but MediaStream.onremovetrack doesn't so
921
+    // it needs to be removed whenever a new track is received for the same endpoint id.
922
+    if (existingTrack && browser.isSafari()) {
923
+        this._remoteTrackRemoved(existingTrack.getOriginalStream(), existingTrack.getTrack());
924
+    }
925
+
919 926
     if (existingTrack && existingTrack.getTrack() === track) {
920 927
         // Ignore duplicated event which can originate either from
921 928
         // 'onStreamAdded' or 'onTrackAdded'.
@@ -925,9 +932,7 @@ TraceablePeerConnection.prototype._createRemoteTrack = function(
925 932
 
926 933
         return;
927 934
     } else if (existingTrack) {
928
-        logger.error(
929
-            `${this} overwriting remote track for`
930
-                + `${ownerEndpointId} ${mediaType}`);
935
+        logger.error(`${this} overwriting remote track for ${ownerEndpointId} ${mediaType}`);
931 936
     }
932 937
 
933 938
     const remoteTrack

Laden…
Annuleren
Opslaan