Quellcode durchsuchen

feat(BworserCapabilities): Allow newer Safari to use video

dev1
Alexander Mishurov vor 7 Jahren
Ursprung
Commit
9659b4e413

+ 1
- 0
modules/RTC/RTCUtils.js Datei anzeigen

179
     // @see https://github.com/jitsi/lib-jitsi-meet/pull/136
179
     // @see https://github.com/jitsi/lib-jitsi-meet/pull/136
180
     const isNewStyleConstraintsSupported
180
     const isNewStyleConstraintsSupported
181
         = browser.isFirefox()
181
         = browser.isFirefox()
182
+            || browser.isSafariWithVP8()
182
             || browser.isEdge()
183
             || browser.isEdge()
183
             || browser.isReactNative();
184
             || browser.isReactNative();
184
 
185
 

+ 11
- 11
modules/RTC/TraceablePeerConnection.js Datei anzeigen

1435
  * @param {MediaStream} mediaStream
1435
  * @param {MediaStream} mediaStream
1436
  */
1436
  */
1437
 TraceablePeerConnection.prototype._removeStream = function(mediaStream) {
1437
 TraceablePeerConnection.prototype._removeStream = function(mediaStream) {
1438
-    if (browser.isFirefox()) {
1439
-        this._handleFirefoxRemoveStream(mediaStream);
1438
+    if (browser.supportsRtpSender()) {
1439
+        this._handleSenderRemoveStream(mediaStream);
1440
     } else {
1440
     } else {
1441
         this.peerconnection.removeStream(mediaStream);
1441
         this.peerconnection.removeStream(mediaStream);
1442
     }
1442
     }
1500
     this.localSSRCs.delete(localTrack.rtcId);
1500
     this.localSSRCs.delete(localTrack.rtcId);
1501
 
1501
 
1502
     if (webRtcStream) {
1502
     if (webRtcStream) {
1503
-        if (browser.isFirefox()) {
1504
-            this._handleFirefoxRemoveStream(webRtcStream);
1503
+        if (browser.supportsRtpSender()) {
1504
+            this._handleSenderRemoveStream(webRtcStream);
1505
         } else {
1505
         } else {
1506
             this.peerconnection.removeStream(webRtcStream);
1506
             this.peerconnection.removeStream(webRtcStream);
1507
         }
1507
         }
1541
  * renegotiation will be needed. Otherwise no renegotiation is needed.
1541
  * renegotiation will be needed. Otherwise no renegotiation is needed.
1542
  */
1542
  */
1543
 TraceablePeerConnection.prototype.replaceTrack = function(oldTrack, newTrack) {
1543
 TraceablePeerConnection.prototype.replaceTrack = function(oldTrack, newTrack) {
1544
-    if (browser.isFirefox() && oldTrack && newTrack) {
1544
+    if (browser.supportsRtpSender() && oldTrack && newTrack) {
1545
         // Add and than remove stream in FF leads to wrong local SDP. In order
1545
         // Add and than remove stream in FF leads to wrong local SDP. In order
1546
         // to workaround the issue we need to use sender.replaceTrack().
1546
         // to workaround the issue we need to use sender.replaceTrack().
1547
         const sender = this.findSenderByStream(oldTrack.getOriginalStream());
1547
         const sender = this.findSenderByStream(oldTrack.getOriginalStream());
1628
 };
1628
 };
1629
 
1629
 
1630
 /**
1630
 /**
1631
- * Remove stream handling for firefox
1631
+ * Remove stream handling for browsers supporting RTPSender
1632
  * @param stream: webrtc media stream
1632
  * @param stream: webrtc media stream
1633
  */
1633
  */
1634
-TraceablePeerConnection.prototype._handleFirefoxRemoveStream = function(
1634
+TraceablePeerConnection.prototype._handleSenderRemoveStream = function(
1635
         stream) {
1635
         stream) {
1636
     if (!stream) {
1636
     if (!stream) {
1637
         // There is nothing to be changed
1637
         // There is nothing to be changed
1924
 
1924
 
1925
     // Safari WebRTC errors when no supported video codec is found in the offer.
1925
     // Safari WebRTC errors when no supported video codec is found in the offer.
1926
     // To prevent the error, inject H264 into the video mLine.
1926
     // To prevent the error, inject H264 into the video mLine.
1927
-    if (browser.isSafariWithWebrtc()) {
1927
+    if (browser.isSafariWithWebrtc() && !browser.isSafariWithVP8()) {
1928
         logger.debug('Maybe injecting H264 into the remote description');
1928
         logger.debug('Maybe injecting H264 into the remote description');
1929
 
1929
 
1930
         // eslint-disable-next-line no-param-reassign
1930
         // eslint-disable-next-line no-param-reassign
2160
 };
2160
 };
2161
 
2161
 
2162
 TraceablePeerConnection.prototype.createAnswer = function(constraints) {
2162
 TraceablePeerConnection.prototype.createAnswer = function(constraints) {
2163
-    if (browser.supportsRtpSender() && this.isSimulcastOn()) {
2163
+    if (browser.isFirefox() && this.isSimulcastOn()) {
2164
         const videoSender
2164
         const videoSender
2165
             = this.peerconnection.getSenders().find(sender =>
2165
             = this.peerconnection.getSenders().find(sender =>
2166
-                sender.track.kind === 'video');
2166
+                sender.track !== null && sender.track.kind === 'video');
2167
         const simParams = {
2167
         const simParams = {
2168
             encodings: [
2168
             encodings: [
2169
                 {
2169
                 {
2227
              *  after that, when we try and go back to unified plan it will
2227
              *  after that, when we try and go back to unified plan it will
2228
              *  complain about unmapped ssrcs)
2228
              *  complain about unmapped ssrcs)
2229
              */
2229
              */
2230
-            if (!browser.isFirefox()) {
2230
+            if (!browser.usesUnifiedPlan()) {
2231
                 // If there are no local video tracks, then a "recvonly"
2231
                 // If there are no local video tracks, then a "recvonly"
2232
                 // SSRC needs to be generated
2232
                 // SSRC needs to be generated
2233
                 if (!this.hasAnyTracksOfType(MediaType.VIDEO)
2233
                 if (!this.hasAnyTracksOfType(MediaType.VIDEO)

+ 37
- 10
modules/browser/BrowserCapabilities.js Datei anzeigen

77
             && !this.isVersionLessThan('11');
77
             && !this.isVersionLessThan('11');
78
     }
78
     }
79
 
79
 
80
+    /**
81
+     * Checks if current browser is a Safari and a version of Safari that
82
+     * supports VP8.
83
+     *
84
+     * @returns {boolean}
85
+     */
86
+    isSafariWithVP8() {
87
+        return this.isSafari()
88
+            && !this.isVersionLessThan('12.1');
89
+    }
90
+
80
     /**
91
     /**
81
      * Checks if the current browser is supported.
92
      * Checks if the current browser is supported.
82
      *
93
      *
97
      * otherwise.
108
      * otherwise.
98
      */
109
      */
99
     supportsVideoMuteOnConnInterrupted() {
110
     supportsVideoMuteOnConnInterrupted() {
100
-        return this.isChromiumBased() || this.isReactNative();
111
+        return this.isChromiumBased() || this.isReactNative()
112
+            || this.isSafariWithVP8();
101
     }
113
     }
102
 
114
 
103
     /**
115
     /**
161
      * candidates through the legacy getStats() API.
173
      * candidates through the legacy getStats() API.
162
      */
174
      */
163
     supportsLocalCandidateRttStatistics() {
175
     supportsLocalCandidateRttStatistics() {
164
-        return this.isChromiumBased() || this.isReactNative();
176
+        return this.isChromiumBased() || this.isReactNative()
177
+            || this.isSafariWithVP8();
165
     }
178
     }
166
 
179
 
167
     /**
180
     /**
187
      * @returns {boolean}
200
      * @returns {boolean}
188
      */
201
      */
189
     supportsRtpSender() {
202
     supportsRtpSender() {
190
-        return this.isFirefox();
203
+        return this.isFirefox() || this.isSafariWithVP8();
191
     }
204
     }
192
 
205
 
193
     /**
206
     /**
196
      * @returns {boolean}
209
      * @returns {boolean}
197
      */
210
      */
198
     supportsRtx() {
211
     supportsRtx() {
199
-        return !this.isFirefox();
212
+        return !this.isFirefox() && !this.usesUnifiedPlan();
200
     }
213
     }
201
 
214
 
202
     /**
215
     /**
204
      * @returns {boolean}
217
      * @returns {boolean}
205
      */
218
      */
206
     supportsSimulcast() {
219
     supportsSimulcast() {
207
-        return this.isChromiumBased()
208
-            || this.isFirefox() || this.isReactNative();
220
+        return this.isChromiumBased() || this.isFirefox()
221
+            || this.isSafariWithVP8() || this.isReactNative();
209
     }
222
     }
210
 
223
 
211
     /**
224
     /**
218
         // FIXME: Check if we can use supportsVideoOut and supportsVideoIn. I
231
         // FIXME: Check if we can use supportsVideoOut and supportsVideoIn. I
219
         // leave the old implementation here in order not to brake something.
232
         // leave the old implementation here in order not to brake something.
220
 
233
 
221
-        // Currently Safari using webrtc/adapter does not support video due in
222
-        // part to Safari only supporting H264 and the bridge sending VP8.
223
-        return !this.isSafariWithWebrtc();
234
+        // Older versions of Safari using webrtc/adapter do not support video
235
+        // due in part to Safari only supporting H264 and the bridge sending VP8
236
+        // Newer Safari support VP8 and other WebRTC features.
237
+        return !this.isSafariWithWebrtc()
238
+            || (this.isSafariWithVP8() && this.usesPlanB());
224
     }
239
     }
225
 
240
 
226
     /**
241
     /**
238
      * @returns {boolean}
253
      * @returns {boolean}
239
      */
254
      */
240
     usesUnifiedPlan() {
255
     usesUnifiedPlan() {
241
-        return this.isFirefox();
256
+        if (this.isFirefox()) {
257
+            return true;
258
+        }
259
+
260
+        if (this.isSafariWithVP8()) {
261
+            // eslint-disable-next-line max-len
262
+            // https://trac.webkit.org/changeset/236144/webkit/trunk/LayoutTests/webrtc/video-addLegacyTransceiver.html
263
+            // eslint-disable-next-line no-undef
264
+            return Object.keys(RTCRtpTransceiver.prototype)
265
+                   .indexOf('currentDirection') > -1;
266
+        }
267
+
268
+        return false;
242
     }
269
     }
243
 
270
 
244
     /**
271
     /**

+ 13
- 28
package-lock.json Datei anzeigen

1113
       }
1113
       }
1114
     },
1114
     },
1115
     "@jitsi/sdp-interop": {
1115
     "@jitsi/sdp-interop": {
1116
-      "version": "0.1.13",
1117
-      "resolved": "https://registry.npmjs.org/@jitsi/sdp-interop/-/sdp-interop-0.1.13.tgz",
1118
-      "integrity": "sha512-U/UI1W9NULZj7PgP9GVzWfvIQ4T2LJBvMj4dNKclHqLMXIZ9aSuWEeYe/Q9jB+J7vot+M9ofALtO4w5xifffoQ==",
1116
+      "version": "0.1.14",
1117
+      "resolved": "https://registry.npmjs.org/@jitsi/sdp-interop/-/sdp-interop-0.1.14.tgz",
1118
+      "integrity": "sha512-v60VAtBx9LO46c9In9oMNY+Ho5993UMOLHBg6VcrcyoVTIWIeqs/9YjjmrQ3Sf4I5aMRABNl7HTby/1lHcqFJw==",
1119
       "requires": {
1119
       "requires": {
1120
         "sdp-transform": "2.3.0"
1120
         "sdp-transform": "2.3.0"
1121
       }
1121
       }
5331
             "ansi-regex": {
5331
             "ansi-regex": {
5332
               "version": "2.1.1",
5332
               "version": "2.1.1",
5333
               "bundled": true,
5333
               "bundled": true,
5334
-              "dev": true,
5335
-              "optional": true
5334
+              "dev": true
5336
             },
5335
             },
5337
             "aproba": {
5336
             "aproba": {
5338
               "version": "1.2.0",
5337
               "version": "1.2.0",
5375
             "code-point-at": {
5374
             "code-point-at": {
5376
               "version": "1.1.0",
5375
               "version": "1.1.0",
5377
               "bundled": true,
5376
               "bundled": true,
5378
-              "dev": true,
5379
-              "optional": true
5377
+              "dev": true
5380
             },
5378
             },
5381
             "concat-map": {
5379
             "concat-map": {
5382
               "version": "0.0.1",
5380
               "version": "0.0.1",
5387
             "console-control-strings": {
5385
             "console-control-strings": {
5388
               "version": "1.1.0",
5386
               "version": "1.1.0",
5389
               "bundled": true,
5387
               "bundled": true,
5390
-              "dev": true,
5391
-              "optional": true
5388
+              "dev": true
5392
             },
5389
             },
5393
             "core-util-is": {
5390
             "core-util-is": {
5394
               "version": "1.0.2",
5391
               "version": "1.0.2",
5505
             "inherits": {
5502
             "inherits": {
5506
               "version": "2.0.3",
5503
               "version": "2.0.3",
5507
               "bundled": true,
5504
               "bundled": true,
5508
-              "dev": true,
5509
-              "optional": true
5505
+              "dev": true
5510
             },
5506
             },
5511
             "ini": {
5507
             "ini": {
5512
               "version": "1.3.5",
5508
               "version": "1.3.5",
5518
               "version": "1.0.0",
5514
               "version": "1.0.0",
5519
               "bundled": true,
5515
               "bundled": true,
5520
               "dev": true,
5516
               "dev": true,
5521
-              "optional": true,
5522
               "requires": {
5517
               "requires": {
5523
                 "number-is-nan": "^1.0.0"
5518
                 "number-is-nan": "^1.0.0"
5524
               }
5519
               }
5541
             "minimist": {
5536
             "minimist": {
5542
               "version": "0.0.8",
5537
               "version": "0.0.8",
5543
               "bundled": true,
5538
               "bundled": true,
5544
-              "dev": true,
5545
-              "optional": true
5539
+              "dev": true
5546
             },
5540
             },
5547
             "minipass": {
5541
             "minipass": {
5548
               "version": "2.2.4",
5542
               "version": "2.2.4",
5549
               "bundled": true,
5543
               "bundled": true,
5550
               "dev": true,
5544
               "dev": true,
5551
-              "optional": true,
5552
               "requires": {
5545
               "requires": {
5553
                 "safe-buffer": "^5.1.1",
5546
                 "safe-buffer": "^5.1.1",
5554
                 "yallist": "^3.0.0"
5547
                 "yallist": "^3.0.0"
5567
               "version": "0.5.1",
5560
               "version": "0.5.1",
5568
               "bundled": true,
5561
               "bundled": true,
5569
               "dev": true,
5562
               "dev": true,
5570
-              "optional": true,
5571
               "requires": {
5563
               "requires": {
5572
                 "minimist": "0.0.8"
5564
                 "minimist": "0.0.8"
5573
               }
5565
               }
5648
             "number-is-nan": {
5640
             "number-is-nan": {
5649
               "version": "1.0.1",
5641
               "version": "1.0.1",
5650
               "bundled": true,
5642
               "bundled": true,
5651
-              "dev": true,
5652
-              "optional": true
5643
+              "dev": true
5653
             },
5644
             },
5654
             "object-assign": {
5645
             "object-assign": {
5655
               "version": "4.1.1",
5646
               "version": "4.1.1",
5661
               "version": "1.4.0",
5652
               "version": "1.4.0",
5662
               "bundled": true,
5653
               "bundled": true,
5663
               "dev": true,
5654
               "dev": true,
5664
-              "optional": true,
5665
               "requires": {
5655
               "requires": {
5666
                 "wrappy": "1"
5656
                 "wrappy": "1"
5667
               }
5657
               }
5747
             "safe-buffer": {
5737
             "safe-buffer": {
5748
               "version": "5.1.1",
5738
               "version": "5.1.1",
5749
               "bundled": true,
5739
               "bundled": true,
5750
-              "dev": true,
5751
-              "optional": true
5740
+              "dev": true
5752
             },
5741
             },
5753
             "safer-buffer": {
5742
             "safer-buffer": {
5754
               "version": "2.1.2",
5743
               "version": "2.1.2",
5784
               "version": "1.0.2",
5773
               "version": "1.0.2",
5785
               "bundled": true,
5774
               "bundled": true,
5786
               "dev": true,
5775
               "dev": true,
5787
-              "optional": true,
5788
               "requires": {
5776
               "requires": {
5789
                 "code-point-at": "^1.0.0",
5777
                 "code-point-at": "^1.0.0",
5790
                 "is-fullwidth-code-point": "^1.0.0",
5778
                 "is-fullwidth-code-point": "^1.0.0",
5804
               "version": "3.0.1",
5792
               "version": "3.0.1",
5805
               "bundled": true,
5793
               "bundled": true,
5806
               "dev": true,
5794
               "dev": true,
5807
-              "optional": true,
5808
               "requires": {
5795
               "requires": {
5809
                 "ansi-regex": "^2.0.0"
5796
                 "ansi-regex": "^2.0.0"
5810
               }
5797
               }
5848
             "wrappy": {
5835
             "wrappy": {
5849
               "version": "1.0.2",
5836
               "version": "1.0.2",
5850
               "bundled": true,
5837
               "bundled": true,
5851
-              "dev": true,
5852
-              "optional": true
5838
+              "dev": true
5853
             },
5839
             },
5854
             "yallist": {
5840
             "yallist": {
5855
               "version": "3.0.2",
5841
               "version": "3.0.2",
5856
               "bundled": true,
5842
               "bundled": true,
5857
-              "dev": true,
5858
-              "optional": true
5843
+              "dev": true
5859
             }
5844
             }
5860
           }
5845
           }
5861
         },
5846
         },
6010
     },
5995
     },
6011
     "karma-webpack": {
5996
     "karma-webpack": {
6012
       "version": "3.0.0",
5997
       "version": "3.0.0",
6013
-      "resolved": "https://registry.npmjs.org/karma-webpack/-/karma-webpack-3.0.0.tgz",
5998
+      "resolved": "http://registry.npmjs.org/karma-webpack/-/karma-webpack-3.0.0.tgz",
6014
       "integrity": "sha512-Ja1o9LLoqWaJyUNhTKaXjWiEH9y7a9H3mzP8pYB30SBsgoF5KBS/65NeHFd+QPuT9ITrym8xFt8BZeGbcOfujA==",
5999
       "integrity": "sha512-Ja1o9LLoqWaJyUNhTKaXjWiEH9y7a9H3mzP8pYB30SBsgoF5KBS/65NeHFd+QPuT9ITrym8xFt8BZeGbcOfujA==",
6015
       "dev": true,
6000
       "dev": true,
6016
       "requires": {
6001
       "requires": {

+ 1
- 1
package.json Datei anzeigen

16
   "author": "",
16
   "author": "",
17
   "readmeFilename": "README.md",
17
   "readmeFilename": "README.md",
18
   "dependencies": {
18
   "dependencies": {
19
-    "@jitsi/sdp-interop": "0.1.13",
19
+    "@jitsi/sdp-interop": "0.1.14",
20
     "@jitsi/sdp-simulcast": "0.2.1",
20
     "@jitsi/sdp-simulcast": "0.2.1",
21
     "async": "0.9.0",
21
     "async": "0.9.0",
22
     "current-executing-script": "0.1.3",
22
     "current-executing-script": "0.1.3",

Laden…
Abbrechen
Speichern