瀏覽代碼

fix(connection-quality) Trigger ramp up on codec and session changes.

dev0
Jaya Allamsetty 6 月之前
父節點
當前提交
102907eb41

+ 13
- 0
JitsiConference.js 查看文件

@@ -41,6 +41,7 @@ import { getJitterDelay } from './modules/util/Retry';
41 41
 import ComponentsVersions from './modules/version/ComponentsVersions';
42 42
 import VideoSIPGW from './modules/videosipgw/VideoSIPGW';
43 43
 import * as VideoSIPGWConstants from './modules/videosipgw/VideoSIPGWConstants';
44
+import MediaSessionEvents from './modules/xmpp/MediaSessionEvents';
44 45
 import SignalingLayerImpl from './modules/xmpp/SignalingLayerImpl';
45 46
 import {
46 47
     FEATURE_E2EE,
@@ -2279,6 +2280,10 @@ JitsiConference.prototype._acceptJvbIncomingCall = function(jingleSession, jingl
2279 2280
                 if (!this.isP2PActive()) {
2280 2281
                     this.eventEmitter.emit(JitsiConferenceEvents._MEDIA_SESSION_ACTIVE_CHANGED, jingleSession);
2281 2282
                 }
2283
+
2284
+                jingleSession.addEventListener(MediaSessionEvents.VIDEO_CODEC_CHANGED, () => {
2285
+                    this.eventEmitter.emit(JitsiConferenceEvents.VIDEO_CODEC_CHANGED);
2286
+                });
2282 2287
             },
2283 2288
             error => {
2284 2289
                 logger.error('Failed to accept incoming Jingle session', error);
@@ -2998,6 +3003,10 @@ JitsiConference.prototype._acceptP2PIncomingCall = function(jingleSession, jingl
2998 3003
             this.eventEmitter.emit(
2999 3004
                 JitsiConferenceEvents._MEDIA_SESSION_STARTED,
3000 3005
                 jingleSession);
3006
+
3007
+            jingleSession.addEventListener(MediaSessionEvents.VIDEO_CODEC_CHANGED, () => {
3008
+                this.eventEmitter.emit(JitsiConferenceEvents.VIDEO_CODEC_CHANGED);
3009
+            });
3001 3010
         },
3002 3011
         error => {
3003 3012
             logger.error(
@@ -3347,6 +3356,10 @@ JitsiConference.prototype._startP2PSession = function(remoteJid) {
3347 3356
     const localTracks = this.getLocalTracks();
3348 3357
 
3349 3358
     this.p2pJingleSession.invite(localTracks);
3359
+
3360
+    this.p2pJingleSession.addEventListener(MediaSessionEvents.VIDEO_CODEC_CHANGED, () => {
3361
+        this.eventEmitter.emit(JitsiConferenceEvents.VIDEO_CODEC_CHANGED);
3362
+    });
3350 3363
 };
3351 3364
 
3352 3365
 /**

+ 2
- 0
JitsiConferenceEvents.spec.ts 查看文件

@@ -52,6 +52,7 @@ describe( "/JitsiConferenceEvents members", () => {
52 52
         PHONE_NUMBER_CHANGED,
53 53
         PROPERTIES_CHANGED,
54 54
         RECORDER_STATE_CHANGED,
55
+        VIDEO_CODEC_CHANGED,
55 56
         VIDEO_SIP_GW_AVAILABILITY_CHANGED,
56 57
         VIDEO_SIP_GW_SESSION_STATE_CHANGED,
57 58
         START_MUTED_POLICY_CHANGED,
@@ -136,6 +137,7 @@ describe( "/JitsiConferenceEvents members", () => {
136 137
         expect( PHONE_NUMBER_CHANGED ).toBe( 'conference.phoneNumberChanged' );
137 138
         expect( PROPERTIES_CHANGED ).toBe( 'conference.propertiesChanged' );
138 139
         expect( RECORDER_STATE_CHANGED ).toBe( 'conference.recorderStateChanged' );
140
+        expect( VIDEO_CODEC_CHANGED ).toBe( 'conference.videoCodecChanged' );
139 141
         expect( VIDEO_SIP_GW_AVAILABILITY_CHANGED ).toBe( 'conference.videoSIPGWAvailabilityChanged' );
140 142
         expect( VIDEO_SIP_GW_SESSION_STATE_CHANGED ).toBe( 'conference.videoSIPGWSessionStateChanged' );
141 143
         expect( VISITORS_SUPPORTED_CHANGED ).toBe( 'conference.visitorsSupported' );

+ 6
- 0
JitsiConferenceEvents.ts 查看文件

@@ -448,6 +448,11 @@ export enum JitsiConferenceEvents {
448 448
      */
449 449
     USER_STATUS_CHANGED = 'conference.statusChanged',
450 450
 
451
+    /**
452
+     * Indicates that the video codec of the local video track has changed.
453
+     */
454
+    VIDEO_CODEC_CHANGED = 'conference.videoCodecChanged',
455
+
451 456
     /**
452 457
      * Indicates that video SIP GW state changed.
453 458
      * @param {VideoSIPGWConstants} status.
@@ -579,6 +584,7 @@ export const USER_JOINED = JitsiConferenceEvents.USER_JOINED;
579 584
 export const USER_LEFT = JitsiConferenceEvents.USER_LEFT;
580 585
 export const USER_ROLE_CHANGED = JitsiConferenceEvents.USER_ROLE_CHANGED;
581 586
 export const USER_STATUS_CHANGED = JitsiConferenceEvents.USER_STATUS_CHANGED;
587
+export const VIDEO_CODEC_CHANGED = JitsiConferenceEvents.VIDEO_CODEC_CHANGED;
582 588
 export const VIDEO_SIP_GW_AVAILABILITY_CHANGED = JitsiConferenceEvents.VIDEO_SIP_GW_AVAILABILITY_CHANGED;
583 589
 export const VIDEO_SIP_GW_SESSION_STATE_CHANGED = JitsiConferenceEvents.VIDEO_SIP_GW_SESSION_STATE_CHANGED;
584 590
 export const VIDEO_UNMUTE_PERMISSIONS_CHANGED = JitsiConferenceEvents.VIDEO_UNMUTE_PERMISSIONS_CHANGED;

+ 9
- 3
modules/RTC/TraceablePeerConnection.js 查看文件

@@ -1424,11 +1424,13 @@ TraceablePeerConnection.prototype.setDesktopSharingFrameRate = function(maxFps)
1424 1424
  *
1425 1425
  * @param {Array<CodecMimeType>} codecList - Preferred codecs for video.
1426 1426
  * @param {CodecMimeType} screenshareCodec - The preferred codec for screenshare.
1427
- * @returns {void}
1427
+ * @returns {boolean} - Returns true if the codec settings were updated, false otherwise.
1428 1428
  */
1429 1429
 TraceablePeerConnection.prototype.setVideoCodecs = function(codecList, screenshareCodec) {
1430
+    let updated = false;
1431
+
1430 1432
     if (!this.codecSettings || !codecList?.length) {
1431
-        return;
1433
+        return updated;
1432 1434
     }
1433 1435
 
1434 1436
     this.codecSettings.codecList = codecList;
@@ -1437,7 +1439,7 @@ TraceablePeerConnection.prototype.setVideoCodecs = function(codecList, screensha
1437 1439
     }
1438 1440
 
1439 1441
     if (!this.usesCodecSelectionAPI()) {
1440
-        return;
1442
+        return updated;
1441 1443
     }
1442 1444
 
1443 1445
     for (const track of this.getLocalVideoTracks()) {
@@ -1445,10 +1447,14 @@ TraceablePeerConnection.prototype.setVideoCodecs = function(codecList, screensha
1445 1447
 
1446 1448
         if (screenshareCodec && track.getVideoType() === VideoType.DESKTOP && screenshareCodec !== currentCodec) {
1447 1449
             this.configureVideoSenderEncodings(track, screenshareCodec);
1450
+            updated = true;
1448 1451
         } else if (currentCodec !== codecList[0]) {
1449 1452
             this.configureVideoSenderEncodings(track);
1453
+            updated = true;
1450 1454
         }
1451 1455
     }
1456
+
1457
+    return updated;
1452 1458
 };
1453 1459
 
1454 1460
 /**

+ 16
- 0
modules/connectivity/ConnectionQuality.js 查看文件

@@ -209,6 +209,11 @@ export default class ConnectionQuality {
209 209
                     this._maybeUpdateUnmuteTime();
210 210
                 }
211 211
             });
212
+
213
+        conference.on(ConferenceEvents.VIDEO_CODEC_CHANGED, this._resetVideoUnmuteTime.bind(this));
214
+
215
+        conference.on(ConferenceEvents._MEDIA_SESSION_ACTIVE_CHANGED, this._resetVideoUnmuteTime.bind(this));
216
+
212 217
         conference.rtc.on(
213 218
             RTCEvents.LOCAL_TRACK_MAX_ENABLED_RESOLUTION_CHANGED,
214 219
             track => {
@@ -230,6 +235,17 @@ export default class ConnectionQuality {
230 235
         );
231 236
     }
232 237
 
238
+    /**
239
+     * Resets the time video was unmuted and triggers a new ramp-up.
240
+     *
241
+     * @private
242
+     * @returns {void}
243
+     */
244
+    _resetVideoUnmuteTime() {
245
+        this._timeVideoUnmuted = -1;
246
+        this._maybeUpdateUnmuteTime();
247
+    }
248
+
233 249
     /**
234 250
      * Sets _timeVideoUnmuted if it was previously unset. If it was already set,
235 251
      * doesn't change it.

+ 6
- 1
modules/xmpp/JingleSessionPC.js 查看文件

@@ -2284,7 +2284,11 @@ export default class JingleSessionPC extends JingleSession {
2284 2284
      */
2285 2285
     setVideoCodecs(codecList, screenshareCodec) {
2286 2286
         if (this._assertNotEnded()) {
2287
-            this.peerconnection.setVideoCodecs(codecList, screenshareCodec);
2287
+            const updated = this.peerconnection.setVideoCodecs(codecList, screenshareCodec);
2288
+
2289
+            if (updated) {
2290
+                this.eventEmitter.emit(MediaSessionEvents.VIDEO_CODEC_CHANGED);
2291
+            }
2288 2292
 
2289 2293
             // Browser throws an error when H.264 is set on the encodings. Therefore, munge the SDP when H.264 needs to
2290 2294
             // be selected.
@@ -2300,6 +2304,7 @@ export default class JingleSessionPC extends JingleSession {
2300 2304
                 return;
2301 2305
             }
2302 2306
 
2307
+            this.eventEmitter.emit(MediaSessionEvents.VIDEO_CODEC_CHANGED);
2303 2308
             Statistics.sendAnalytics(
2304 2309
                 VIDEO_CODEC_CHANGED,
2305 2310
                 {

+ 2
- 0
modules/xmpp/MediaSessionEvents.spec.ts 查看文件

@@ -5,11 +5,13 @@ import { default as exported } from "./MediaSessionEvents";
5 5
 describe( "/modules/xmpp/MediaSessionEvents members", () => {
6 6
     const {
7 7
         REMOTE_SOURCE_CONSTRAINTS_CHANGED,
8
+        VIDEO_CODEC_CHANGED,
8 9
         ...others
9 10
     } = exported;
10 11
 
11 12
     it( "known members", () => {
12 13
         expect( REMOTE_SOURCE_CONSTRAINTS_CHANGED ).toBe( 'media_session.REMOTE_SOURCE_CONSTRAINTS_CHANGED' );
14
+        expect( VIDEO_CODEC_CHANGED ).toBe( 'media_session.VIDEO_CODEC_CHANGED' );
13 15
     } );
14 16
 
15 17
     it( "unknown members", () => {

+ 6
- 1
modules/xmpp/MediaSessionEvents.ts 查看文件

@@ -3,7 +3,12 @@ enum MediaSessionEvents {
3 3
     /**
4 4
      * Event triggered when the remote party signals video max frame heights for its local sources.
5 5
      */
6
-    REMOTE_SOURCE_CONSTRAINTS_CHANGED = 'media_session.REMOTE_SOURCE_CONSTRAINTS_CHANGED'
6
+    REMOTE_SOURCE_CONSTRAINTS_CHANGED = 'media_session.REMOTE_SOURCE_CONSTRAINTS_CHANGED',
7
+
8
+    /**
9
+     * Event triggered when the video codec of the local video track has changed.
10
+     */
11
+    VIDEO_CODEC_CHANGED = 'media_session.VIDEO_CODEC_CHANGED'
7 12
 }
8 13
 
9 14
 export default MediaSessionEvents;

Loading…
取消
儲存