소스 검색

fix(TPC) Chain all RTCRtpSender.setParameters calls. (#2242)

master
Jaya Allamsetty 2 년 전
부모
커밋
9f3ed249a1
No account linked to committer's email address
2개의 변경된 파일27개의 추가작업 그리고 8개의 파일을 삭제
  1. 13
    2
      modules/RTC/TPCUtils.js
  2. 14
    6
      modules/RTC/TraceablePeerConnection.js

+ 13
- 2
modules/RTC/TPCUtils.js 파일 보기

467
             return Promise.resolve();
467
             return Promise.resolve();
468
         }
468
         }
469
         parameters.encodings = this._getStreamEncodings(track);
469
         parameters.encodings = this._getStreamEncodings(track);
470
+        const promise = transceiver.sender.setParameters(parameters);
470
 
471
 
471
-        return transceiver.sender.setParameters(parameters);
472
+        if (mediaType === MediaType.VIDEO) {
473
+            return this.pc._updateVideoSenderParameters(promise);
474
+        }
475
+
476
+        return promise;
472
     }
477
     }
473
 
478
 
474
     /**
479
     /**
493
                     encoding.active = enable;
498
                     encoding.active = enable;
494
                 }
499
                 }
495
             }
500
             }
496
-            promises.push(sender.setParameters(parameters));
501
+            const setActivePromise = sender.setParameters(parameters);
502
+
503
+            if (sender.track.kind === MediaType.VIDEO) {
504
+                promises.push(this.pc._updateVideoSenderParameters(setActivePromise));
505
+            } else {
506
+                promises.push(setActivePromise);
507
+            }
497
         }
508
         }
498
 
509
 
499
         return Promise.allSettled(promises)
510
         return Promise.allSettled(promises)

+ 14
- 6
modules/RTC/TraceablePeerConnection.js 파일 보기

2575
         return Promise.resolve();
2575
         return Promise.resolve();
2576
     }
2576
     }
2577
 
2577
 
2578
-    // Updating video sender parameters as wrapped-up promise to have ability
2579
-    // to chain promises sequentially later and avoid chrome problem with transaction id
2580
-    // which is reset at the end of video sender setParameters method and can affect
2581
-    // next on-fly update
2578
+    return this._updateVideoSenderParameters(this._updateVideoSenderEncodings(frameHeight, localVideoTrack));
2579
+};
2580
+
2581
+/**
2582
+ * Returns a wrapped-up promise so that the setParameters() call on the RTCRtpSender for video sources are chained.
2583
+ * This is needed on Chrome as it resets the transaction id after executing setParameters() and can affect the next on
2584
+ * the fly updates if they are not chained.
2585
+ * https://chromium.googlesource.com/external/webrtc/+/master/pc/rtp_sender.cc#340
2586
+ * @param {Promise} promise - The promise that needs to be chained.
2587
+ * @returns {Promise}
2588
+ */
2589
+TraceablePeerConnection.prototype._updateVideoSenderParameters = function(promise) {
2582
     const nextPromise = this._lastVideoSenderUpdatePromise
2590
     const nextPromise = this._lastVideoSenderUpdatePromise
2583
-        .finally(() => this._updateVideoSenderParameters(frameHeight, localVideoTrack));
2591
+        .finally(() => promise);
2584
 
2592
 
2585
     this._lastVideoSenderUpdatePromise = nextPromise;
2593
     this._lastVideoSenderUpdatePromise = nextPromise;
2586
 
2594
 
2594
  * @param {JitsiLocalTrack} - The local track for which the sender constraints have to be applied.
2602
  * @param {JitsiLocalTrack} - The local track for which the sender constraints have to be applied.
2595
  * @returns {Promise} promise that will be resolved when the operation is successful and rejected otherwise.
2603
  * @returns {Promise} promise that will be resolved when the operation is successful and rejected otherwise.
2596
  */
2604
  */
2597
-TraceablePeerConnection.prototype._updateVideoSenderParameters = function(frameHeight, localVideoTrack) {
2605
+TraceablePeerConnection.prototype._updateVideoSenderEncodings = function(frameHeight, localVideoTrack) {
2598
     const videoSender = this.findSenderForTrack(localVideoTrack.getTrack());
2606
     const videoSender = this.findSenderForTrack(localVideoTrack.getTrack());
2599
 
2607
 
2600
     if (!videoSender) {
2608
     if (!videoSender) {

Loading…
취소
저장