瀏覽代碼

fix(TPC): Make sure all RTCRtpSender:setParameters calls are sequential.

Recommit 17ade96a70 with the jvb leak fix.
release-8443
Jaya Allamsetty 2 年之前
父節點
當前提交
10ebc8434a
共有 2 個檔案被更改,包括 28 行新增18 行删除
  1. 23
    14
      modules/RTC/TPCUtils.js
  2. 5
    4
      modules/RTC/TraceablePeerConnection.js

+ 23
- 14
modules/RTC/TPCUtils.js 查看文件

@@ -108,6 +108,25 @@ export class TPCUtils {
108 108
         ];
109 109
     }
110 110
 
111
+    /**
112
+     * Updates the sender parameters in the stream encodings.
113
+     *
114
+     * @param {RTCRtpSender} sender - the sender associated with a MediaStreamTrack.
115
+     * @param {boolean} enable - whether the streams needs to be enabled or disabled.
116
+     * @returns {Promise} - A promise that resolves when the operation is successful, rejected otherwise.
117
+     */
118
+    _updateSenderEncodings(sender, enable) {
119
+        const parameters = sender.getParameters();
120
+
121
+        if (parameters?.encodings?.length) {
122
+            for (const encoding of parameters.encodings) {
123
+                encoding.active = enable;
124
+            }
125
+        }
126
+
127
+        return sender.setParameters(parameters);
128
+    }
129
+
111 130
     /**
112 131
      * Ensures that the ssrcs associated with a FID ssrc-group appear in the correct order, i.e.,
113 132
      * the primary ssrc first and the secondary rtx ssrc later. This is important for unified
@@ -485,13 +504,12 @@ export class TPCUtils {
485 504
             return Promise.resolve();
486 505
         }
487 506
         parameters.encodings = this._getStreamEncodings(track);
488
-        const promise = transceiver.sender.setParameters(parameters);
489 507
 
490 508
         if (mediaType === MediaType.VIDEO) {
491
-            return this.pc._updateVideoSenderParameters(promise);
509
+            return this.pc._updateVideoSenderParameters(() => transceiver.sender.setParameters(parameters));
492 510
         }
493 511
 
494
-        return promise;
512
+        return transceiver.sender.setParameters(parameters);
495 513
     }
496 514
 
497 515
     /**
@@ -512,19 +530,10 @@ export class TPCUtils {
512 530
         const promises = [];
513 531
 
514 532
         for (const sender of senders) {
515
-            const parameters = sender.getParameters();
516
-
517
-            if (parameters?.encodings?.length) {
518
-                for (const encoding of parameters.encodings) {
519
-                    encoding.active = enable;
520
-                }
521
-            }
522
-            const setActivePromise = sender.setParameters(parameters);
523
-
524 533
             if (sender.track.kind === MediaType.VIDEO) {
525
-                promises.push(this.pc._updateVideoSenderParameters(setActivePromise));
534
+                promises.push(this.pc._updateVideoSenderParameters(() => this._updateSenderEncodings(sender, enable)));
526 535
             } else {
527
-                promises.push(setActivePromise);
536
+                promises.push(this._updateSenderEncodings(sender, enable));
528 537
             }
529 538
         }
530 539
 

+ 5
- 4
modules/RTC/TraceablePeerConnection.js 查看文件

@@ -2671,7 +2671,8 @@ TraceablePeerConnection.prototype.setSenderVideoConstraints = function(frameHeig
2671 2671
 
2672 2672
     this._senderMaxHeights.set(sourceName, frameHeight);
2673 2673
 
2674
-    return this._updateVideoSenderParameters(this._updateVideoSenderEncodings(frameHeight, localVideoTrack));
2674
+    return this._updateVideoSenderParameters(
2675
+        () => this._updateVideoSenderEncodings(frameHeight, localVideoTrack));
2675 2676
 };
2676 2677
 
2677 2678
 /**
@@ -2679,12 +2680,12 @@ TraceablePeerConnection.prototype.setSenderVideoConstraints = function(frameHeig
2679 2680
  * This is needed on Chrome as it resets the transaction id after executing setParameters() and can affect the next on
2680 2681
  * the fly updates if they are not chained.
2681 2682
  * https://chromium.googlesource.com/external/webrtc/+/master/pc/rtp_sender.cc#340
2682
- * @param {Promise} promise - The promise that needs to be chained.
2683
+ * @param {Function} nextFunction - The function to be called when the last video sender update promise is settled.
2683 2684
  * @returns {Promise}
2684 2685
  */
2685
-TraceablePeerConnection.prototype._updateVideoSenderParameters = function(promise) {
2686
+TraceablePeerConnection.prototype._updateVideoSenderParameters = function(nextFunction) {
2686 2687
     const nextPromise = this._lastVideoSenderUpdatePromise
2687
-        .finally(() => promise);
2688
+        .finally(nextFunction);
2688 2689
 
2689 2690
     this._lastVideoSenderUpdatePromise = nextPromise;
2690 2691
 

Loading…
取消
儲存