Browse Source

feat(multi-stream-support) Configure the senders based on SenderVideoConstraintsV2.

The encodings for local video tracks are confiugured based on the SenderVideoConstraintsV2 constraints received from the bridge. The constraints are sourceName based. Also ignore enableLayerSuspension flag since it has been deprecated and layer suspension has been enabled by default. Also having it off makes screensharing on Chrome in unified plan not work as expected.
dev1
Jaya Allamsetty 3 years ago
parent
commit
b749b0e4e7

+ 8
- 0
JitsiConference.js View File

@@ -882,6 +882,14 @@ JitsiConference.prototype.getLocalVideoTrack = function() {
882 882
     return this.rtc ? this.rtc.getLocalVideoTrack() : null;
883 883
 };
884 884
 
885
+/**
886
+ * Returns all the local video tracks.
887
+ * @returns {Array<JitsiLocalTrack>}
888
+ */
889
+JitsiConference.prototype.getLocalVideoTracks = function() {
890
+    return this.rtc ? this.rtc.getLocalVideoTracks() : null;
891
+};
892
+
885 893
 /**
886 894
  * Obtains the performance statistics.
887 895
  * @returns {Object|null}

+ 20
- 0
modules/RTC/BridgeChannel.js View File

@@ -2,6 +2,7 @@ import { getLogger } from '@jitsi/logger';
2 2
 
3 3
 import RTCEvents from '../../service/RTC/RTCEvents';
4 4
 import { createBridgeChannelClosedEvent } from '../../service/statistics/AnalyticsEvents';
5
+import FeatureFlags from '../flags/FeatureFlags';
5 6
 import Statistics from '../statistics/statistics';
6 7
 import GlobalOnErrorHandler from '../util/GlobalOnErrorHandler';
7 8
 
@@ -375,6 +376,25 @@ export default class BridgeChannel {
375 376
                 }
376 377
                 break;
377 378
             }
379
+            case 'SenderVideoConstraintsV2': {
380
+                if (FeatureFlags.isSourceNameSignalingEnabled()) {
381
+                    const { sourceName, idealHeight } = obj;
382
+
383
+                    if (typeof sourceName === 'string' && typeof idealHeight === 'number') {
384
+                        // eslint-disable-next-line object-property-newline
385
+                        logger.info(`SenderVideoConstraintsV2: ${JSON.stringify({ sourceName, idealHeight })}`);
386
+                        emitter.emit(
387
+                            RTCEvents.SENDER_VIDEO_CONSTRAINTS_CHANGED, {
388
+                                sourceName,
389
+                                idealHeight
390
+                            }
391
+                        );
392
+                    } else {
393
+                        logger.error(`Invalid SenderVideoConstraintsV2: ${JSON.stringify(obj)}`);
394
+                    }
395
+                }
396
+                break;
397
+            }
378 398
             case 'ServerHello': {
379 399
                 logger.info(`Received ServerHello, version=${obj.version}.`);
380 400
                 break;

+ 8
- 0
modules/RTC/RTC.js View File

@@ -561,6 +561,14 @@ export default class RTC extends Listenable {
561 561
         return localVideo.length ? localVideo[0] : undefined;
562 562
     }
563 563
 
564
+    /**
565
+     * Returns all the local video tracks.
566
+     * @returns {Array<JitsiLocalTrack>}
567
+     */
568
+    getLocalVideoTracks() {
569
+        return this.getLocalTracks(MediaType.VIDEO);
570
+    }
571
+
564 572
     /**
565 573
      * Get local audio track.
566 574
      * @returns {JitsiLocalTrack|undefined}

+ 38
- 6
modules/RTC/TraceablePeerConnection.js View File

@@ -297,6 +297,12 @@ export default function TraceablePeerConnection(
297 297
      */
298 298
     this._senderVideoMaxHeight = 2160;
299 299
 
300
+    /**
301
+     * The height constraints to be applied on the sender per local video source (source name as the key).
302
+     * @type {Map<string, number>}
303
+     */
304
+    this._senderMaxHeights = new Map();
305
+
300 306
     // override as desired
301 307
     this.trace = (what, info) => {
302 308
         logger.debug(what, info);
@@ -2249,10 +2255,32 @@ TraceablePeerConnection.prototype._initializeDtlsTransport = function() {
2249 2255
 /**
2250 2256
  * Configures the stream encodings depending on the video type and the bitrates configured.
2251 2257
  *
2258
+ * @param {JitsiLocalTrack} - The local track for which the sender encodings have to configured.
2252 2259
  * @returns {Promise} promise that will be resolved when the operation is successful and rejected otherwise.
2253 2260
  */
2254
-TraceablePeerConnection.prototype.configureSenderVideoEncodings = function() {
2255
-    return this.setSenderVideoConstraints(this._senderVideoMaxHeight);
2261
+TraceablePeerConnection.prototype.configureSenderVideoEncodings = function(localVideoTrack = null) {
2262
+    if (FeatureFlags.isSourceNameSignalingEnabled()) {
2263
+        if (localVideoTrack) {
2264
+            return this.setSenderVideoConstraints(
2265
+                this._senderMaxHeights.get(localVideoTrack.getSourceName()),
2266
+                localVideoTrack);
2267
+        }
2268
+        const promises = [];
2269
+
2270
+        for (const track of this.getLocalVideoTracks()) {
2271
+            promises.push(this.setSenderVideoConstraints(this._senderMaxHeights.get(track.getSourceName()), track));
2272
+        }
2273
+
2274
+        return Promise.allSettled(promises);
2275
+    }
2276
+
2277
+    let localTrack = localVideoTrack;
2278
+
2279
+    if (!localTrack) {
2280
+        localTrack = this.getLocalVideoTracks()[0];
2281
+    }
2282
+
2283
+    return this.setSenderVideoConstraints(this._senderVideoMaxHeight, localTrack);
2256 2284
 };
2257 2285
 
2258 2286
 TraceablePeerConnection.prototype.setLocalDescription = function(description) {
@@ -2395,9 +2423,10 @@ TraceablePeerConnection.prototype.setRemoteDescription = function(description) {
2395 2423
  * bitrates on the send stream.
2396 2424
  *
2397 2425
  * @param {number} frameHeight - The max frame height to be imposed on the outgoing video stream.
2426
+ * @param {JitsiLocalTrack} - The local track for which the sender constraints have to be applied.
2398 2427
  * @returns {Promise} promise that will be resolved when the operation is successful and rejected otherwise.
2399 2428
  */
2400
-TraceablePeerConnection.prototype.setSenderVideoConstraints = function(frameHeight) {
2429
+TraceablePeerConnection.prototype.setSenderVideoConstraints = function(frameHeight, localVideoTrack) {
2401 2430
     if (frameHeight < 0) {
2402 2431
         throw new Error(`Invalid frameHeight: ${frameHeight}`);
2403 2432
     }
@@ -2407,13 +2436,16 @@ TraceablePeerConnection.prototype.setSenderVideoConstraints = function(frameHeig
2407 2436
         return Promise.resolve();
2408 2437
     }
2409 2438
 
2410
-    this._senderVideoMaxHeight = frameHeight;
2411
-    const localVideoTrack = this.getLocalVideoTracks()[0];
2439
+    if (FeatureFlags.isSourceNameSignalingEnabled()) {
2440
+        this._senderMaxHeights.set(localVideoTrack.getSourceName(), frameHeight);
2441
+    } else {
2442
+        this._senderVideoMaxHeight = frameHeight;
2443
+    }
2412 2444
 
2413 2445
     if (!localVideoTrack || localVideoTrack.isMuted()) {
2414 2446
         return Promise.resolve();
2415 2447
     }
2416
-    const videoSender = this.findSenderByKind(MediaType.VIDEO);
2448
+    const videoSender = this.findSenderForTrack(localVideoTrack.getTrack());
2417 2449
 
2418 2450
     if (!videoSender) {
2419 2451
         return Promise.resolve();

+ 53
- 25
modules/qualitycontrol/SendVideoController.js View File

@@ -1,5 +1,6 @@
1 1
 import * as JitsiConferenceEvents from '../../JitsiConferenceEvents';
2 2
 import RTCEvents from '../../service/RTC/RTCEvents';
3
+import FeatureFlags from '../flags/FeatureFlags';
3 4
 import MediaSessionEvents from '../xmpp/MediaSessionEvents';
4 5
 
5 6
 /**
@@ -18,24 +19,24 @@ export default class SendVideoController {
18 19
      * @param {RTC} rtc - the rtc instance that is responsible for sending the messages on the bridge channel.
19 20
      */
20 21
     constructor(conference, rtc) {
21
-        this.conference = conference;
22
-        this.layerSuspensionEnabled = conference.options?.config?.enableLayerSuspension ?? true;
23
-        this.rtc = rtc;
24
-        this.conference.on(
22
+        this._conference = conference;
23
+        this._rtc = rtc;
24
+
25
+        /**
26
+         * Source name based sender constraints.
27
+         * @type {Map<string, number>};
28
+         */
29
+
30
+        this._sourceSenderConstraints = new Map();
31
+        this._conference.on(
25 32
             JitsiConferenceEvents._MEDIA_SESSION_STARTED,
26 33
             session => this._onMediaSessionStarted(session));
27
-        this.conference.on(
34
+        this._conference.on(
28 35
             JitsiConferenceEvents._MEDIA_SESSION_ACTIVE_CHANGED,
29 36
             () => this._propagateSendMaxFrameHeight());
30
-        this.rtc.on(
37
+        this._rtc.on(
31 38
             RTCEvents.SENDER_VIDEO_CONSTRAINTS_CHANGED,
32
-            videoConstraints => {
33
-                // Propagate the sender constraint only if it has changed.
34
-                if (this._senderVideoConstraints?.idealHeight !== videoConstraints.idealHeight) {
35
-                    this._senderVideoConstraints = videoConstraints;
36
-                    this._propagateSendMaxFrameHeight();
37
-                }
38
-            });
39
+            videoConstraints => this._onSenderConstraintsReceived(videoConstraints));
39 40
     }
40 41
 
41 42
     /**
@@ -50,26 +51,52 @@ export default class SendVideoController {
50 51
         mediaSession.addListener(
51 52
             MediaSessionEvents.REMOTE_VIDEO_CONSTRAINTS_CHANGED,
52 53
             session => {
53
-                if (session === this.conference.getActiveMediaSession()) {
54
+                if (session === this._conference.getActiveMediaSession()) {
54 55
                     this._propagateSendMaxFrameHeight();
55 56
                 }
56 57
             });
57 58
     }
58 59
 
60
+    /**
61
+     * Propagates the video constraints if they have changed.
62
+     *
63
+     * @param {Object} videoConstraints - The sender video constraints received from the bridge.
64
+     */
65
+    _onSenderConstraintsReceived(videoConstraints) {
66
+        if (FeatureFlags.isSourceNameSignalingEnabled()) {
67
+            const { idealHeight, sourceName } = videoConstraints;
68
+            const localVideoTracks = this._conference.getLocalVideoTracks() ?? [];
69
+
70
+            for (const track of localVideoTracks) {
71
+                // Propagate the sender constraint only if it has changed.
72
+                if (track.getSourceName() === sourceName
73
+                    && (!this._sourceSenderConstraints.has(sourceName)
74
+                    || this._sourceSenderConstraints.get(sourceName) !== idealHeight)) {
75
+                    this._sourceSenderConstraints.set(sourceName, idealHeight);
76
+                    this._propagateSendMaxFrameHeight(sourceName);
77
+                }
78
+            }
79
+        } else if (this._senderVideoConstraints?.idealHeight !== videoConstraints.idealHeight) {
80
+            this._senderVideoConstraints = videoConstraints;
81
+            this._propagateSendMaxFrameHeight();
82
+        }
83
+    }
84
+
59 85
     /**
60 86
      * Figures out the send video constraint as specified by {@link selectSendMaxFrameHeight} and sets it on all media
61 87
      * sessions for the reasons mentioned in this class description.
62 88
      *
89
+     * @param {string} sourceName - The source for which sender constraints have changed.
63 90
      * @returns {Promise<void[]>}
64 91
      * @private
65 92
      */
66
-    _propagateSendMaxFrameHeight() {
67
-        const sendMaxFrameHeight = this.selectSendMaxFrameHeight();
93
+    _propagateSendMaxFrameHeight(sourceName = null) {
94
+        const sendMaxFrameHeight = this.selectSendMaxFrameHeight(sourceName);
68 95
         const promises = [];
69 96
 
70 97
         if (sendMaxFrameHeight >= 0) {
71
-            for (const session of this.conference.getMediaSessions()) {
72
-                promises.push(session.setSenderVideoConstraint(sendMaxFrameHeight));
98
+            for (const session of this._conference.getMediaSessions()) {
99
+                promises.push(session.setSenderVideoConstraint(sendMaxFrameHeight, sourceName));
73 100
             }
74 101
         }
75 102
 
@@ -80,23 +107,24 @@ export default class SendVideoController {
80 107
      * Selects the lowest common value for the local video send constraint by looking at local user's preference and
81 108
      * the active media session's receive preference set by the remote party.
82 109
      *
110
+     * @param {string} sourceName - The source for which sender constraints have changed.
83 111
      * @returns {number|undefined}
84 112
      */
85
-    selectSendMaxFrameHeight() {
86
-        const activeMediaSession = this.conference.getActiveMediaSession();
113
+    selectSendMaxFrameHeight(sourceName = null) {
114
+        const activeMediaSession = this._conference.getActiveMediaSession();
87 115
         const remoteRecvMaxFrameHeight = activeMediaSession
88 116
             ? activeMediaSession.isP2P
89 117
                 ? activeMediaSession.getRemoteRecvMaxFrameHeight()
90
-                : this.layerSuspensionEnabled ? this._senderVideoConstraints?.idealHeight : undefined
118
+                : sourceName ? this._sourceSenderConstraints.get(sourceName) : this._senderVideoConstraints?.idealHeight
91 119
             : undefined;
92 120
 
93
-        if (this.preferredSendMaxFrameHeight >= 0 && remoteRecvMaxFrameHeight >= 0) {
94
-            return Math.min(this.preferredSendMaxFrameHeight, remoteRecvMaxFrameHeight);
121
+        if (this._preferredSendMaxFrameHeight >= 0 && remoteRecvMaxFrameHeight >= 0) {
122
+            return Math.min(this._preferredSendMaxFrameHeight, remoteRecvMaxFrameHeight);
95 123
         } else if (remoteRecvMaxFrameHeight >= 0) {
96 124
             return remoteRecvMaxFrameHeight;
97 125
         }
98 126
 
99
-        return this.preferredSendMaxFrameHeight;
127
+        return this._preferredSendMaxFrameHeight;
100 128
     }
101 129
 
102 130
     /**
@@ -106,7 +134,7 @@ export default class SendVideoController {
106 134
      * @returns {Promise<void[]>} - resolved when the operation is complete.
107 135
      */
108 136
     setPreferredSendMaxFrameHeight(maxFrameHeight) {
109
-        this.preferredSendMaxFrameHeight = maxFrameHeight;
137
+        this._preferredSendMaxFrameHeight = maxFrameHeight;
110 138
 
111 139
         return this._propagateSendMaxFrameHeight();
112 140
     }

+ 6
- 0
modules/qualitycontrol/SendVideoController.spec.js View File

@@ -1,5 +1,6 @@
1 1
 import * as JitsiConferenceEvents from '../../JitsiConferenceEvents';
2 2
 import RTCEvents from '../../service/RTC/RTCEvents';
3
+import FeatureFlags from '../flags/FeatureFlags';
3 4
 import Listenable from '../util/Listenable';
4 5
 import MediaSessionEvents from '../xmpp/MediaSessionEvents';
5 6
 
@@ -78,6 +79,10 @@ class MockConference extends Listenable {
78 79
         return this.activeMediaSession;
79 80
     }
80 81
 
82
+    getLocalVideoTracks() {
83
+        return [];
84
+    }
85
+
81 86
     getMediaSessions() {
82 87
         return this.mediaSessions;
83 88
     }
@@ -108,6 +113,7 @@ describe('SendVideoController', () => {
108 113
     beforeEach(() => {
109 114
         conference = new MockConference();
110 115
         rtc = new MockRTC();
116
+        FeatureFlags.init({ sourceNameSignaling: false });
111 117
         sendVideoController = new SendVideoController(conference, rtc);
112 118
         jvbConnection = new MockJingleSessionPC(rtc, false /* isP2P */);
113 119
         p2pConnection = new MockJingleSessionPC(rtc, true /* isP2P */);

+ 9
- 8
modules/xmpp/JingleSessionPC.js View File

@@ -1506,12 +1506,13 @@ export default class JingleSessionPC extends JingleSession {
1506 1506
     /**
1507 1507
      * Sets the resolution constraint on the local camera track.
1508 1508
      * @param {number} maxFrameHeight - The user preferred max frame height.
1509
+     * @param {string} sourceName - The source name of the track.
1509 1510
      * @returns {Promise} promise that will be resolved when the operation is
1510 1511
      * successful and rejected otherwise.
1511 1512
      */
1512
-    setSenderVideoConstraint(maxFrameHeight) {
1513
+    setSenderVideoConstraint(maxFrameHeight, sourceName = null) {
1513 1514
         if (this._assertNotEnded()) {
1514
-            logger.info(`${this} setSenderVideoConstraint: ${maxFrameHeight}`);
1515
+            logger.info(`${this} setSenderVideoConstraint: ${maxFrameHeight}, sourceName: ${sourceName}`);
1515 1516
 
1516 1517
             // RN doesn't support RTCRtpSenders yet, aggresive layer suspension on RN is implemented
1517 1518
             // by changing the media direction in the SDP. This is applicable to jvb sessions only.
@@ -1521,11 +1522,11 @@ export default class JingleSessionPC extends JingleSession {
1521 1522
                 return this.setMediaTransferActive(true, videoActive);
1522 1523
             }
1523 1524
 
1524
-            const promise = typeof maxFrameHeight === 'undefined'
1525
-                ? this.peerconnection.configureSenderVideoEncodings()
1526
-                : this.peerconnection.setSenderVideoConstraints(maxFrameHeight);
1525
+            const jitsiLocalTrack = sourceName
1526
+                ? this.rtc.getLocalVideoTracks().find(track => track.getSourceName() === sourceName)
1527
+                : this.rtc.getLocalVideoTrack();
1527 1528
 
1528
-            return promise;
1529
+            return this.peerconnection.setSenderVideoConstraints(maxFrameHeight, jitsiLocalTrack);
1529 1530
         }
1530 1531
 
1531 1532
         return Promise.resolve();
@@ -2151,7 +2152,7 @@ export default class JingleSessionPC extends JingleSession {
2151 2152
                             logger.debug(`${this} replaceTrack worker: configuring video stream`);
2152 2153
 
2153 2154
                             // Configure the video encodings after the track is replaced.
2154
-                            return this.peerconnection.configureSenderVideoEncodings();
2155
+                            return this.peerconnection.configureSenderVideoEncodings(newTrack);
2155 2156
                         }
2156 2157
                     });
2157 2158
                 })
@@ -2299,7 +2300,7 @@ export default class JingleSessionPC extends JingleSession {
2299 2300
                 // Configure the video encodings after the track is unmuted. If the user joins the call muted and
2300 2301
                 // unmutes it the first time, all the parameters need to be configured.
2301 2302
                 if (track.isVideoTrack()) {
2302
-                    return this.peerconnection.configureSenderVideoEncodings();
2303
+                    return this.peerconnection.configureSenderVideoEncodings(track);
2303 2304
                 }
2304 2305
             });
2305 2306
     }

+ 5
- 0
types/auto/JitsiConference.d.ts View File

@@ -316,6 +316,11 @@ declare class JitsiConference {
316 316
      * @return {JitsiLocalTrack|null}
317 317
      */
318 318
     getLocalVideoTrack(): any | null;
319
+    /**
320
+     * Returns all the local video tracks.
321
+     * @returns {Array<JitsiLocalTrack>}
322
+     */
323
+    getLocalVideoTracks(): Array<any>;
319 324
     /**
320 325
      * Obtains the performance statistics.
321 326
      * @returns {Object|null}

+ 5
- 0
types/auto/modules/RTC/RTC.d.ts View File

@@ -345,6 +345,11 @@ export default class RTC extends Listenable {
345 345
      * @returns {JitsiLocalTrack|undefined}
346 346
      */
347 347
     getLocalVideoTrack(): JitsiLocalTrack | undefined;
348
+    /**
349
+     * Returns all the local video tracks.
350
+     * @returns {Array<JitsiLocalTrack>}
351
+     */
352
+    getLocalVideoTracks(): Array<JitsiLocalTrack>;
348 353
     /**
349 354
      * Get local audio track.
350 355
      * @returns {JitsiLocalTrack|undefined}

+ 9
- 2
types/auto/modules/RTC/TraceablePeerConnection.d.ts View File

@@ -254,6 +254,11 @@ export default class TraceablePeerConnection {
254 254
      * explicitly disabled.
255 255
      */
256 256
     _senderVideoMaxHeight: number;
257
+    /**
258
+     * The height constraints to be applied on the sender per local video source (source name as the key).
259
+     * @type {Map<string, number>}
260
+     */
261
+    _senderMaxHeights: Map<string, number>;
257 262
     trace: (what: any, info: any) => void;
258 263
     onicecandidate: any;
259 264
     onTrack: (evt: any) => void;
@@ -628,9 +633,10 @@ export default class TraceablePeerConnection {
628 633
     /**
629 634
      * Configures the stream encodings depending on the video type and the bitrates configured.
630 635
      *
636
+     * @param {JitsiLocalTrack} - The local track for which the sender encodings have to configured.
631 637
      * @returns {Promise} promise that will be resolved when the operation is successful and rejected otherwise.
632 638
      */
633
-    configureSenderVideoEncodings(): Promise<any>;
639
+    configureSenderVideoEncodings(localVideoTrack?: any): Promise<any>;
634 640
     setLocalDescription(description: any): Promise<any>;
635 641
     /**
636 642
      * Enables/disables audio media transmission on this peer connection. When
@@ -653,9 +659,10 @@ export default class TraceablePeerConnection {
653 659
      * bitrates on the send stream.
654 660
      *
655 661
      * @param {number} frameHeight - The max frame height to be imposed on the outgoing video stream.
662
+     * @param {JitsiLocalTrack} - The local track for which the sender constraints have to be applied.
656 663
      * @returns {Promise} promise that will be resolved when the operation is successful and rejected otherwise.
657 664
      */
658
-    setSenderVideoConstraints(frameHeight: number): Promise<any>;
665
+    setSenderVideoConstraints(frameHeight: number, localVideoTrack: any): Promise<any>;
659 666
     encodingsEnabledState: boolean[];
660 667
     /**
661 668
      * Enables/disables video media transmission on this peer connection. When

+ 18
- 6
types/auto/modules/qualitycontrol/SendVideoController.d.ts View File

@@ -14,10 +14,13 @@ export default class SendVideoController {
14 14
      * @param {RTC} rtc - the rtc instance that is responsible for sending the messages on the bridge channel.
15 15
      */
16 16
     constructor(conference: any, rtc: any);
17
-    conference: any;
18
-    layerSuspensionEnabled: any;
19
-    rtc: any;
20
-    _senderVideoConstraints: any;
17
+    _conference: any;
18
+    _rtc: any;
19
+    /**
20
+     * Source name based sender constraints.
21
+     * @type {Map<string, number>};
22
+     */
23
+    _sourceSenderConstraints: Map<string, number>;
21 24
     /**
22 25
      * Handles the {@link JitsiConferenceEvents.MEDIA_SESSION_STARTED}, that is when the conference creates new media
23 26
      * session. It doesn't mean it's already active though. For example the JVB connection may be created after
@@ -27,10 +30,18 @@ export default class SendVideoController {
27 30
      * @private
28 31
      */
29 32
     private _onMediaSessionStarted;
33
+    /**
34
+     * Propagates the video constraints if they have changed.
35
+     *
36
+     * @param {Object} videoConstraints - The sender video constraints received from the bridge.
37
+     */
38
+    _onSenderConstraintsReceived(videoConstraints: any): void;
39
+    _senderVideoConstraints: any;
30 40
     /**
31 41
      * Figures out the send video constraint as specified by {@link selectSendMaxFrameHeight} and sets it on all media
32 42
      * sessions for the reasons mentioned in this class description.
33 43
      *
44
+     * @param {string} sourceName - The source for which sender constraints have changed.
34 45
      * @returns {Promise<void[]>}
35 46
      * @private
36 47
      */
@@ -39,9 +50,10 @@ export default class SendVideoController {
39 50
      * Selects the lowest common value for the local video send constraint by looking at local user's preference and
40 51
      * the active media session's receive preference set by the remote party.
41 52
      *
53
+     * @param {string} sourceName - The source for which sender constraints have changed.
42 54
      * @returns {number|undefined}
43 55
      */
44
-    selectSendMaxFrameHeight(): number | undefined;
56
+    selectSendMaxFrameHeight(sourceName?: string): number | undefined;
45 57
     /**
46 58
      * Sets local preference for max send video frame height.
47 59
      *
@@ -49,5 +61,5 @@ export default class SendVideoController {
49 61
      * @returns {Promise<void[]>} - resolved when the operation is complete.
50 62
      */
51 63
     setPreferredSendMaxFrameHeight(maxFrameHeight: number): Promise<void[]>;
52
-    preferredSendMaxFrameHeight: number;
64
+    _preferredSendMaxFrameHeight: number;
53 65
 }

+ 2
- 1
types/auto/modules/xmpp/JingleSessionPC.d.ts View File

@@ -355,10 +355,11 @@ export default class JingleSessionPC extends JingleSession {
355 355
     /**
356 356
      * Sets the resolution constraint on the local camera track.
357 357
      * @param {number} maxFrameHeight - The user preferred max frame height.
358
+     * @param {string} sourceName - The source name of the track.
358 359
      * @returns {Promise} promise that will be resolved when the operation is
359 360
      * successful and rejected otherwise.
360 361
      */
361
-    setSenderVideoConstraint(maxFrameHeight: number): Promise<any>;
362
+    setSenderVideoConstraint(maxFrameHeight: number, sourceName?: string): Promise<any>;
362 363
     /**
363 364
      *
364 365
      * @param reasonCondition

Loading…
Cancel
Save