Ver código fonte

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

dev0
Jaya Allamsetty 6 meses atrás
pai
commit
102907eb41

+ 13
- 0
JitsiConference.js Ver arquivo

41
 import ComponentsVersions from './modules/version/ComponentsVersions';
41
 import ComponentsVersions from './modules/version/ComponentsVersions';
42
 import VideoSIPGW from './modules/videosipgw/VideoSIPGW';
42
 import VideoSIPGW from './modules/videosipgw/VideoSIPGW';
43
 import * as VideoSIPGWConstants from './modules/videosipgw/VideoSIPGWConstants';
43
 import * as VideoSIPGWConstants from './modules/videosipgw/VideoSIPGWConstants';
44
+import MediaSessionEvents from './modules/xmpp/MediaSessionEvents';
44
 import SignalingLayerImpl from './modules/xmpp/SignalingLayerImpl';
45
 import SignalingLayerImpl from './modules/xmpp/SignalingLayerImpl';
45
 import {
46
 import {
46
     FEATURE_E2EE,
47
     FEATURE_E2EE,
2279
                 if (!this.isP2PActive()) {
2280
                 if (!this.isP2PActive()) {
2280
                     this.eventEmitter.emit(JitsiConferenceEvents._MEDIA_SESSION_ACTIVE_CHANGED, jingleSession);
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
             error => {
2288
             error => {
2284
                 logger.error('Failed to accept incoming Jingle session', error);
2289
                 logger.error('Failed to accept incoming Jingle session', error);
2998
             this.eventEmitter.emit(
3003
             this.eventEmitter.emit(
2999
                 JitsiConferenceEvents._MEDIA_SESSION_STARTED,
3004
                 JitsiConferenceEvents._MEDIA_SESSION_STARTED,
3000
                 jingleSession);
3005
                 jingleSession);
3006
+
3007
+            jingleSession.addEventListener(MediaSessionEvents.VIDEO_CODEC_CHANGED, () => {
3008
+                this.eventEmitter.emit(JitsiConferenceEvents.VIDEO_CODEC_CHANGED);
3009
+            });
3001
         },
3010
         },
3002
         error => {
3011
         error => {
3003
             logger.error(
3012
             logger.error(
3347
     const localTracks = this.getLocalTracks();
3356
     const localTracks = this.getLocalTracks();
3348
 
3357
 
3349
     this.p2pJingleSession.invite(localTracks);
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 Ver arquivo

52
         PHONE_NUMBER_CHANGED,
52
         PHONE_NUMBER_CHANGED,
53
         PROPERTIES_CHANGED,
53
         PROPERTIES_CHANGED,
54
         RECORDER_STATE_CHANGED,
54
         RECORDER_STATE_CHANGED,
55
+        VIDEO_CODEC_CHANGED,
55
         VIDEO_SIP_GW_AVAILABILITY_CHANGED,
56
         VIDEO_SIP_GW_AVAILABILITY_CHANGED,
56
         VIDEO_SIP_GW_SESSION_STATE_CHANGED,
57
         VIDEO_SIP_GW_SESSION_STATE_CHANGED,
57
         START_MUTED_POLICY_CHANGED,
58
         START_MUTED_POLICY_CHANGED,
136
         expect( PHONE_NUMBER_CHANGED ).toBe( 'conference.phoneNumberChanged' );
137
         expect( PHONE_NUMBER_CHANGED ).toBe( 'conference.phoneNumberChanged' );
137
         expect( PROPERTIES_CHANGED ).toBe( 'conference.propertiesChanged' );
138
         expect( PROPERTIES_CHANGED ).toBe( 'conference.propertiesChanged' );
138
         expect( RECORDER_STATE_CHANGED ).toBe( 'conference.recorderStateChanged' );
139
         expect( RECORDER_STATE_CHANGED ).toBe( 'conference.recorderStateChanged' );
140
+        expect( VIDEO_CODEC_CHANGED ).toBe( 'conference.videoCodecChanged' );
139
         expect( VIDEO_SIP_GW_AVAILABILITY_CHANGED ).toBe( 'conference.videoSIPGWAvailabilityChanged' );
141
         expect( VIDEO_SIP_GW_AVAILABILITY_CHANGED ).toBe( 'conference.videoSIPGWAvailabilityChanged' );
140
         expect( VIDEO_SIP_GW_SESSION_STATE_CHANGED ).toBe( 'conference.videoSIPGWSessionStateChanged' );
142
         expect( VIDEO_SIP_GW_SESSION_STATE_CHANGED ).toBe( 'conference.videoSIPGWSessionStateChanged' );
141
         expect( VISITORS_SUPPORTED_CHANGED ).toBe( 'conference.visitorsSupported' );
143
         expect( VISITORS_SUPPORTED_CHANGED ).toBe( 'conference.visitorsSupported' );

+ 6
- 0
JitsiConferenceEvents.ts Ver arquivo

448
      */
448
      */
449
     USER_STATUS_CHANGED = 'conference.statusChanged',
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
      * Indicates that video SIP GW state changed.
457
      * Indicates that video SIP GW state changed.
453
      * @param {VideoSIPGWConstants} status.
458
      * @param {VideoSIPGWConstants} status.
579
 export const USER_LEFT = JitsiConferenceEvents.USER_LEFT;
584
 export const USER_LEFT = JitsiConferenceEvents.USER_LEFT;
580
 export const USER_ROLE_CHANGED = JitsiConferenceEvents.USER_ROLE_CHANGED;
585
 export const USER_ROLE_CHANGED = JitsiConferenceEvents.USER_ROLE_CHANGED;
581
 export const USER_STATUS_CHANGED = JitsiConferenceEvents.USER_STATUS_CHANGED;
586
 export const USER_STATUS_CHANGED = JitsiConferenceEvents.USER_STATUS_CHANGED;
587
+export const VIDEO_CODEC_CHANGED = JitsiConferenceEvents.VIDEO_CODEC_CHANGED;
582
 export const VIDEO_SIP_GW_AVAILABILITY_CHANGED = JitsiConferenceEvents.VIDEO_SIP_GW_AVAILABILITY_CHANGED;
588
 export const VIDEO_SIP_GW_AVAILABILITY_CHANGED = JitsiConferenceEvents.VIDEO_SIP_GW_AVAILABILITY_CHANGED;
583
 export const VIDEO_SIP_GW_SESSION_STATE_CHANGED = JitsiConferenceEvents.VIDEO_SIP_GW_SESSION_STATE_CHANGED;
589
 export const VIDEO_SIP_GW_SESSION_STATE_CHANGED = JitsiConferenceEvents.VIDEO_SIP_GW_SESSION_STATE_CHANGED;
584
 export const VIDEO_UNMUTE_PERMISSIONS_CHANGED = JitsiConferenceEvents.VIDEO_UNMUTE_PERMISSIONS_CHANGED;
590
 export const VIDEO_UNMUTE_PERMISSIONS_CHANGED = JitsiConferenceEvents.VIDEO_UNMUTE_PERMISSIONS_CHANGED;

+ 9
- 3
modules/RTC/TraceablePeerConnection.js Ver arquivo

1424
  *
1424
  *
1425
  * @param {Array<CodecMimeType>} codecList - Preferred codecs for video.
1425
  * @param {Array<CodecMimeType>} codecList - Preferred codecs for video.
1426
  * @param {CodecMimeType} screenshareCodec - The preferred codec for screenshare.
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
 TraceablePeerConnection.prototype.setVideoCodecs = function(codecList, screenshareCodec) {
1429
 TraceablePeerConnection.prototype.setVideoCodecs = function(codecList, screenshareCodec) {
1430
+    let updated = false;
1431
+
1430
     if (!this.codecSettings || !codecList?.length) {
1432
     if (!this.codecSettings || !codecList?.length) {
1431
-        return;
1433
+        return updated;
1432
     }
1434
     }
1433
 
1435
 
1434
     this.codecSettings.codecList = codecList;
1436
     this.codecSettings.codecList = codecList;
1437
     }
1439
     }
1438
 
1440
 
1439
     if (!this.usesCodecSelectionAPI()) {
1441
     if (!this.usesCodecSelectionAPI()) {
1440
-        return;
1442
+        return updated;
1441
     }
1443
     }
1442
 
1444
 
1443
     for (const track of this.getLocalVideoTracks()) {
1445
     for (const track of this.getLocalVideoTracks()) {
1445
 
1447
 
1446
         if (screenshareCodec && track.getVideoType() === VideoType.DESKTOP && screenshareCodec !== currentCodec) {
1448
         if (screenshareCodec && track.getVideoType() === VideoType.DESKTOP && screenshareCodec !== currentCodec) {
1447
             this.configureVideoSenderEncodings(track, screenshareCodec);
1449
             this.configureVideoSenderEncodings(track, screenshareCodec);
1450
+            updated = true;
1448
         } else if (currentCodec !== codecList[0]) {
1451
         } else if (currentCodec !== codecList[0]) {
1449
             this.configureVideoSenderEncodings(track);
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 Ver arquivo

209
                     this._maybeUpdateUnmuteTime();
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
         conference.rtc.on(
217
         conference.rtc.on(
213
             RTCEvents.LOCAL_TRACK_MAX_ENABLED_RESOLUTION_CHANGED,
218
             RTCEvents.LOCAL_TRACK_MAX_ENABLED_RESOLUTION_CHANGED,
214
             track => {
219
             track => {
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
      * Sets _timeVideoUnmuted if it was previously unset. If it was already set,
250
      * Sets _timeVideoUnmuted if it was previously unset. If it was already set,
235
      * doesn't change it.
251
      * doesn't change it.

+ 6
- 1
modules/xmpp/JingleSessionPC.js Ver arquivo

2284
      */
2284
      */
2285
     setVideoCodecs(codecList, screenshareCodec) {
2285
     setVideoCodecs(codecList, screenshareCodec) {
2286
         if (this._assertNotEnded()) {
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
             // Browser throws an error when H.264 is set on the encodings. Therefore, munge the SDP when H.264 needs to
2293
             // Browser throws an error when H.264 is set on the encodings. Therefore, munge the SDP when H.264 needs to
2290
             // be selected.
2294
             // be selected.
2300
                 return;
2304
                 return;
2301
             }
2305
             }
2302
 
2306
 
2307
+            this.eventEmitter.emit(MediaSessionEvents.VIDEO_CODEC_CHANGED);
2303
             Statistics.sendAnalytics(
2308
             Statistics.sendAnalytics(
2304
                 VIDEO_CODEC_CHANGED,
2309
                 VIDEO_CODEC_CHANGED,
2305
                 {
2310
                 {

+ 2
- 0
modules/xmpp/MediaSessionEvents.spec.ts Ver arquivo

5
 describe( "/modules/xmpp/MediaSessionEvents members", () => {
5
 describe( "/modules/xmpp/MediaSessionEvents members", () => {
6
     const {
6
     const {
7
         REMOTE_SOURCE_CONSTRAINTS_CHANGED,
7
         REMOTE_SOURCE_CONSTRAINTS_CHANGED,
8
+        VIDEO_CODEC_CHANGED,
8
         ...others
9
         ...others
9
     } = exported;
10
     } = exported;
10
 
11
 
11
     it( "known members", () => {
12
     it( "known members", () => {
12
         expect( REMOTE_SOURCE_CONSTRAINTS_CHANGED ).toBe( 'media_session.REMOTE_SOURCE_CONSTRAINTS_CHANGED' );
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
     it( "unknown members", () => {
17
     it( "unknown members", () => {

+ 6
- 1
modules/xmpp/MediaSessionEvents.ts Ver arquivo

3
     /**
3
     /**
4
      * Event triggered when the remote party signals video max frame heights for its local sources.
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
 export default MediaSessionEvents;
14
 export default MediaSessionEvents;

Carregando…
Cancelar
Salvar