Просмотр исходного кода

feat(virtual-background): Desktop share as virtual background

master
tudordan7 4 лет назад
Родитель
Сommit
99f61ca2cd

+ 1
- 0
react/features/app/middlewares.web.js Просмотреть файл

14
 import '../remote-control/middleware';
14
 import '../remote-control/middleware';
15
 import '../shared-video/middleware';
15
 import '../shared-video/middleware';
16
 import '../talk-while-muted/middleware';
16
 import '../talk-while-muted/middleware';
17
+import '../virtual-background/middleware';
17
 
18
 
18
 import './middlewares.any';
19
 import './middlewares.any';

+ 3
- 17
react/features/stream-effects/virtual-background/JitsiStreamBackgroundEffect.js Просмотреть файл

1
 // @flow
1
 // @flow
2
-import { JitsiTrackEvents } from '../../base/lib-jitsi-meet';
3
 
2
 
4
 import {
3
 import {
5
     CLEAR_TIMEOUT,
4
     CLEAR_TIMEOUT,
16
 export default class JitsiStreamBackgroundEffect {
15
 export default class JitsiStreamBackgroundEffect {
17
     _model: Object;
16
     _model: Object;
18
     _options: Object;
17
     _options: Object;
19
-    _screenSharing: Object;
20
     _segmentationPixelCount: number;
18
     _segmentationPixelCount: number;
21
     _inputVideoElement: HTMLVideoElement;
19
     _inputVideoElement: HTMLVideoElement;
22
     _onMaskFrameTimer: Function;
20
     _onMaskFrameTimer: Function;
39
      * @class
37
      * @class
40
      * @param {Object} model - Meet model.
38
      * @param {Object} model - Meet model.
41
      * @param {Object} options - Segmentation dimensions.
39
      * @param {Object} options - Segmentation dimensions.
42
-     * @param {Object} screenSharing - Desktop track for displaying desktop share as virtual background.
43
      */
40
      */
44
-    constructor(model: Object, options: Object, screenSharing: Object) {
41
+    constructor(model: Object, options: Object) {
45
         this._options = options;
42
         this._options = options;
46
-        this._screenSharing = screenSharing;
47
 
43
 
48
         if (this._options.virtualBackground.backgroundType === 'image') {
44
         if (this._options.virtualBackground.backgroundType === 'image') {
49
             this._virtualImage = document.createElement('img');
45
             this._virtualImage = document.createElement('img');
50
             this._virtualImage.crossOrigin = 'anonymous';
46
             this._virtualImage.crossOrigin = 'anonymous';
51
             this._virtualImage.src = this._options.virtualBackground.virtualSource;
47
             this._virtualImage.src = this._options.virtualBackground.virtualSource;
52
         }
48
         }
53
-        if (this._options.virtualBackground.backgroundType === 'desktop-share' && this._screenSharing) {
49
+        if (this._options.virtualBackground.backgroundType === 'desktop-share') {
54
             this._virtualVideo = document.createElement('video');
50
             this._virtualVideo = document.createElement('video');
55
             this._virtualVideo.autoplay = true;
51
             this._virtualVideo.autoplay = true;
56
-            this._virtualVideo.srcObject = this._screenSharing.stream;
52
+            this._virtualVideo.srcObject = this._options?.virtualBackground?.virtualSource?.stream;
57
         }
53
         }
58
         this._model = model;
54
         this._model = model;
59
         this._options = options;
55
         this._options = options;
252
         this._inputVideoElement.height = parseInt(height, 10);
248
         this._inputVideoElement.height = parseInt(height, 10);
253
         this._inputVideoElement.autoplay = true;
249
         this._inputVideoElement.autoplay = true;
254
         this._inputVideoElement.srcObject = stream;
250
         this._inputVideoElement.srcObject = stream;
255
-        this._screenSharing && this._screenSharing.on(
256
-            JitsiTrackEvents.LOCAL_TRACK_STOPPED,
257
-            () => {
258
-                this._options.virtualBackground.enabled = false;
259
-                this._options.virtualBackground.backgroundType = 'none';
260
-                this._options.virtualBackground.selectedThumbnail = 'none';
261
-                this._options.virtualBackground.backgroundEffectEnabled = false;
262
-                this._options.virtualBackground.enabled = false;
263
-            });
264
         this._inputVideoElement.onloadeddata = () => {
251
         this._inputVideoElement.onloadeddata = () => {
265
             this._maskFrameTimerWorker.postMessage({
252
             this._maskFrameTimerWorker.postMessage({
266
                 id: SET_TIMEOUT,
253
                 id: SET_TIMEOUT,
282
         });
269
         });
283
 
270
 
284
         this._maskFrameTimerWorker.terminate();
271
         this._maskFrameTimerWorker.terminate();
285
-        this._screenSharing && this._screenSharing.dispose();
286
     }
272
     }
287
 }
273
 }

+ 1
- 8
react/features/stream-effects/virtual-background/index.js Просмотреть файл

2
 
2
 
3
 import * as wasmCheck from 'wasm-check';
3
 import * as wasmCheck from 'wasm-check';
4
 
4
 
5
-import { createLocalTrack } from '../../base/lib-jitsi-meet/functions';
6
-
7
 import JitsiStreamBackgroundEffect from './JitsiStreamBackgroundEffect';
5
 import JitsiStreamBackgroundEffect from './JitsiStreamBackgroundEffect';
8
 import createTFLiteModule from './vendor/tflite/tflite';
6
 import createTFLiteModule from './vendor/tflite/tflite';
9
 import createTFLiteSIMDModule from './vendor/tflite/tflite-simd';
7
 import createTFLiteSIMDModule from './vendor/tflite/tflite-simd';
37
         throw new Error('JitsiStreamBackgroundEffect not supported!');
35
         throw new Error('JitsiStreamBackgroundEffect not supported!');
38
     }
36
     }
39
     let tflite;
37
     let tflite;
40
-    let screenSharing;
41
 
38
 
42
     if (wasmCheck.feature.simd) {
39
     if (wasmCheck.feature.simd) {
43
         tflite = await createTFLiteSIMDModule();
40
         tflite = await createTFLiteSIMDModule();
58
 
55
 
59
     tflite._loadModel(model.byteLength);
56
     tflite._loadModel(model.byteLength);
60
 
57
 
61
-    if (virtualBackground.backgroundType === 'desktop-share') {
62
-        screenSharing = await createLocalTrack('desktop', '');
63
-    }
64
-
65
     const options = {
58
     const options = {
66
         ...wasmCheck.feature.simd ? segmentationDimensions.model144 : segmentationDimensions.model96,
59
         ...wasmCheck.feature.simd ? segmentationDimensions.model144 : segmentationDimensions.model96,
67
         virtualBackground
60
         virtualBackground
68
     };
61
     };
69
 
62
 
70
-    return new JitsiStreamBackgroundEffect(tflite, options, screenSharing);
63
+    return new JitsiStreamBackgroundEffect(tflite, options);
71
 }
64
 }

+ 5
- 1
react/features/virtual-background/components/VirtualBackgroundDialog.js Просмотреть файл

8
 import { Dialog, hideDialog } from '../../base/dialog';
8
 import { Dialog, hideDialog } from '../../base/dialog';
9
 import { translate } from '../../base/i18n';
9
 import { translate } from '../../base/i18n';
10
 import { Icon, IconCloseSmall, IconPlusCircle, IconShareDesktop } from '../../base/icons';
10
 import { Icon, IconCloseSmall, IconPlusCircle, IconShareDesktop } from '../../base/icons';
11
+import { createLocalTrack } from '../../base/lib-jitsi-meet/functions';
11
 import { connect } from '../../base/redux';
12
 import { connect } from '../../base/redux';
12
 import { getLocalVideoTrack } from '../../base/tracks';
13
 import { getLocalVideoTrack } from '../../base/tracks';
13
 import { toggleBackgroundEffect } from '../actions';
14
 import { toggleBackgroundEffect } from '../actions';
120
     };
121
     };
121
 
122
 
122
     const shareDesktop = async selection => {
123
     const shareDesktop = async selection => {
124
+        const url = await createLocalTrack('desktop', '');
125
+
123
         setOptions({
126
         setOptions({
124
             backgroundType: 'desktop-share',
127
             backgroundType: 'desktop-share',
125
             enabled: true,
128
             enabled: true,
126
-            selectedThumbnail: selection
129
+            selectedThumbnail: selection,
130
+            url
127
         });
131
         });
128
     };
132
     };
129
 
133
 

+ 35
- 0
react/features/virtual-background/middleware.js Просмотреть файл

1
+import { JitsiTrackEvents } from '../base/lib-jitsi-meet';
2
+import { MiddlewareRegistry } from '../base/redux';
3
+import { getLocalVideoTrack } from '../base/tracks';
4
+
5
+import { toggleBackgroundEffect } from './actions';
6
+
7
+/**
8
+ * Middleware which intercepts the desktop video type on
9
+ * virtual background. If the user stops the screen share
10
+ * then the default virtual background is set to 'none' option
11
+ *
12
+ * @param {Store} store - The redux store.
13
+ * @returns {Function}
14
+ */
15
+MiddlewareRegistry.register(store => next => action => {
16
+    const { dispatch, getState } = store;
17
+    const virtualSource = getState()['features/virtual-background'].virtualSource;
18
+    const currentLocalTrack = getLocalVideoTrack(getState()['features/base/tracks']);
19
+
20
+    if (virtualSource?.videoType === 'desktop') {
21
+        const noneOptions = {
22
+            enabled: false,
23
+            backgroundType: 'none',
24
+            selectedThumbnail: 'none',
25
+            backgroundEffectEnabled: false
26
+        };
27
+
28
+        virtualSource
29
+            && virtualSource.on(JitsiTrackEvents.LOCAL_TRACK_STOPPED, () => {
30
+                dispatch(toggleBackgroundEffect(noneOptions, currentLocalTrack.jitsiTrack));
31
+            });
32
+    }
33
+
34
+    return next(action);
35
+});

Загрузка…
Отмена
Сохранить