浏览代码

Fix the WebGL memory leak for Blur effect in Chrome 77 and up (#4652)

master
Jaya Allamsetty 5 年前
父节点
当前提交
d40fce741a

+ 28
- 64
package-lock.json 查看文件

4007
       }
4007
       }
4008
     },
4008
     },
4009
     "@tensorflow-models/body-pix": {
4009
     "@tensorflow-models/body-pix": {
4010
-      "version": "1.1.1",
4011
-      "resolved": "https://registry.npmjs.org/@tensorflow-models/body-pix/-/body-pix-1.1.1.tgz",
4012
-      "integrity": "sha512-l9bd+b3QI7OzJjw/OuhEfeGRb5l2lRivgDHGMvQbT2Snn8nV7odHSRW55NzhU7Khl7vga00TWo5QDuVnkevQmQ=="
4010
+      "version": "1.1.2",
4011
+      "resolved": "https://registry.npmjs.org/@tensorflow-models/body-pix/-/body-pix-1.1.2.tgz",
4012
+      "integrity": "sha512-moCCTlP77v20HMg1e/Hs1LehCDLAKS32e6OUeI1MA/4HrRRO1Dq9engVCLFZUMO2+mJXdQeBdzexcFg0WQox7w=="
4013
     },
4013
     },
4014
     "@tensorflow/tfjs": {
4014
     "@tensorflow/tfjs": {
4015
-      "version": "1.2.2",
4016
-      "resolved": "https://registry.npmjs.org/@tensorflow/tfjs/-/tfjs-1.2.2.tgz",
4017
-      "integrity": "sha512-HfhSzL2eTWhlT0r/A5wmo+u3bHe+an16p5wsnFH3ujn21fQ8QtGpSfDHQZjWx1kVFaQnV6KBG+17MOrRHoHlLA==",
4015
+      "version": "1.2.9",
4016
+      "resolved": "https://registry.npmjs.org/@tensorflow/tfjs/-/tfjs-1.2.9.tgz",
4017
+      "integrity": "sha512-9UAQnSp638FyM5eedYEM+j2R7VcNajiFmkeT5EXtf7YIurmMFNEm1sbajKJx7/ckz31YcYrVoUPc/iLhhDQl2A==",
4018
       "requires": {
4018
       "requires": {
4019
-        "@tensorflow/tfjs-converter": "1.2.2",
4020
-        "@tensorflow/tfjs-core": "1.2.2",
4021
-        "@tensorflow/tfjs-data": "1.2.2",
4022
-        "@tensorflow/tfjs-layers": "1.2.2"
4019
+        "@tensorflow/tfjs-converter": "1.2.9",
4020
+        "@tensorflow/tfjs-core": "1.2.9",
4021
+        "@tensorflow/tfjs-data": "1.2.9",
4022
+        "@tensorflow/tfjs-layers": "1.2.9"
4023
       }
4023
       }
4024
     },
4024
     },
4025
     "@tensorflow/tfjs-converter": {
4025
     "@tensorflow/tfjs-converter": {
4026
-      "version": "1.2.2",
4027
-      "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-converter/-/tfjs-converter-1.2.2.tgz",
4028
-      "integrity": "sha512-NM2NcPRHpCNeJdBxHcYpmW9ZHTQ2lJFJgmgGpQ8CxSC9CtQB05bFONs3SKcwMNDE/69QBRVom5DYqLCVUg+A+g=="
4026
+      "version": "1.2.9",
4027
+      "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-converter/-/tfjs-converter-1.2.9.tgz",
4028
+      "integrity": "sha512-OKmiuZicIgadT3Bv9BvM+oom7wRz9eC5rTglQnuv7VN9H0syFVuhf5oD1Ff70tGDhJjJgL+cPz01fZRxTXjRWA=="
4029
     },
4029
     },
4030
     "@tensorflow/tfjs-core": {
4030
     "@tensorflow/tfjs-core": {
4031
-      "version": "1.2.2",
4032
-      "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-core/-/tfjs-core-1.2.2.tgz",
4033
-      "integrity": "sha512-2hCHMKjh3UNpLEjbAEaurrTGJyj/KpLtMSAraWgHA1vGY0kmk50BBSbgCDmXWUVm7lyh/SkCq4/GrGDZktEs3g==",
4031
+      "version": "1.2.9",
4032
+      "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-core/-/tfjs-core-1.2.9.tgz",
4033
+      "integrity": "sha512-s0hHZSx6rGTlkkB8u8gs5n7sIPv1GXDNHmISRy+kqGzmlpkfI2kr6WXqOWQy6wFgjzopRD8cJQjBZ9USPZnYTQ==",
4034
       "requires": {
4034
       "requires": {
4035
         "@types/offscreencanvas": "~2019.3.0",
4035
         "@types/offscreencanvas": "~2019.3.0",
4036
         "@types/seedrandom": "2.4.27",
4036
         "@types/seedrandom": "2.4.27",
4037
         "@types/webgl-ext": "0.0.30",
4037
         "@types/webgl-ext": "0.0.30",
4038
         "@types/webgl2": "0.0.4",
4038
         "@types/webgl2": "0.0.4",
4039
         "node-fetch": "~2.1.2",
4039
         "node-fetch": "~2.1.2",
4040
-        "rollup-plugin-visualizer": "~1.1.1",
4041
         "seedrandom": "2.4.3"
4040
         "seedrandom": "2.4.3"
4042
       },
4041
       },
4043
       "dependencies": {
4042
       "dependencies": {
4049
       }
4048
       }
4050
     },
4049
     },
4051
     "@tensorflow/tfjs-data": {
4050
     "@tensorflow/tfjs-data": {
4052
-      "version": "1.2.2",
4053
-      "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-data/-/tfjs-data-1.2.2.tgz",
4054
-      "integrity": "sha512-oHGBoGdnCl2RyouLKplQqo+iil0iJgPbi/aoHizhpO77UBuJXlKMblH8w5GbxVAw3hKxWlqzYpxPo6rVRgehNA==",
4051
+      "version": "1.2.9",
4052
+      "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-data/-/tfjs-data-1.2.9.tgz",
4053
+      "integrity": "sha512-Ti9Cj3pte9butuEsK5OPq0Lcqdi4wVUdtQXm0o7iYOZ0umseRzfbIb6zbdqucc2MQzOMTnRoxN+FL7LZmncsHg==",
4055
       "requires": {
4054
       "requires": {
4056
         "@types/node-fetch": "^2.1.2",
4055
         "@types/node-fetch": "^2.1.2",
4057
         "node-fetch": "~2.1.2"
4056
         "node-fetch": "~2.1.2"
4065
       }
4064
       }
4066
     },
4065
     },
4067
     "@tensorflow/tfjs-layers": {
4066
     "@tensorflow/tfjs-layers": {
4068
-      "version": "1.2.2",
4069
-      "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-layers/-/tfjs-layers-1.2.2.tgz",
4070
-      "integrity": "sha512-yzWZaZrCVpEyTkSrzMe4OOP4aGUfaaROE/zR9fPsPGGF8wLlbLNZUJjeYUmjy3G3pXGaM0mQUbLR5Vd707CVtQ=="
4067
+      "version": "1.2.9",
4068
+      "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-layers/-/tfjs-layers-1.2.9.tgz",
4069
+      "integrity": "sha512-OlXYaIb1rCk5dYmpaNsPEkO7R+T0oxfS3vQGIztNJB+YxrN8mwCu3hqgpbdKhAITiP+jxO0o+7bny8MsOCkOSQ=="
4071
     },
4070
     },
4072
     "@types/istanbul-lib-coverage": {
4071
     "@types/istanbul-lib-coverage": {
4073
       "version": "2.0.1",
4072
       "version": "2.0.1",
4092
       }
4091
       }
4093
     },
4092
     },
4094
     "@types/node": {
4093
     "@types/node": {
4095
-      "version": "12.0.10",
4096
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-12.0.10.tgz",
4097
-      "integrity": "sha512-LcsGbPomWsad6wmMNv7nBLw7YYYyfdYcz6xryKYQhx89c3XXan+8Q6AJ43G5XDIaklaVkK3mE4fCb0SBvMiPSQ=="
4094
+      "version": "12.7.5",
4095
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-12.7.5.tgz",
4096
+      "integrity": "sha512-9fq4jZVhPNW8r+UYKnxF1e2HkDWOWKM5bC2/7c9wPV835I0aOrVbS/Hw/pWPk2uKrNXQqg9Z959Kz+IYDd5p3w=="
4098
     },
4097
     },
4099
     "@types/node-fetch": {
4098
     "@types/node-fetch": {
4100
-      "version": "2.3.7",
4101
-      "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.3.7.tgz",
4102
-      "integrity": "sha512-+bKtuxhj/TYSSP1r4CZhfmyA0vm/aDRQNo7vbAgf6/cZajn0SAniGGST07yvI4Q+q169WTa2/x9gEHfJrkcALw==",
4099
+      "version": "2.5.2",
4100
+      "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.2.tgz",
4101
+      "integrity": "sha512-djYYKmdNRSBtL1x4CiE9UJb9yZhwtI1VC+UxZD0psNznrUj80ywsxKlEGAE+QL1qvLjPbfb24VosjkYM6W4RSQ==",
4103
       "requires": {
4102
       "requires": {
4104
         "@types/node": "*"
4103
         "@types/node": "*"
4105
       }
4104
       }
16442
         "inherits": "^2.0.1"
16441
         "inherits": "^2.0.1"
16443
       }
16442
       }
16444
     },
16443
     },
16445
-    "rollup-plugin-visualizer": {
16446
-      "version": "1.1.1",
16447
-      "resolved": "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-1.1.1.tgz",
16448
-      "integrity": "sha512-7xkSKp+dyJmSC7jg2LXqViaHuOnF1VvIFCnsZEKjrgT5ZVyiLLSbeszxFcQSfNJILphqgAEmWAUz0Z4xYScrRw==",
16449
-      "optional": true,
16450
-      "requires": {
16451
-        "mkdirp": "^0.5.1",
16452
-        "opn": "^5.4.0",
16453
-        "source-map": "^0.7.3",
16454
-        "typeface-oswald": "0.0.54"
16455
-      },
16456
-      "dependencies": {
16457
-        "opn": {
16458
-          "version": "5.5.0",
16459
-          "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz",
16460
-          "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==",
16461
-          "optional": true,
16462
-          "requires": {
16463
-            "is-wsl": "^1.1.0"
16464
-          }
16465
-        },
16466
-        "source-map": {
16467
-          "version": "0.7.3",
16468
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
16469
-          "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
16470
-          "optional": true
16471
-        }
16472
-      }
16473
-    },
16474
     "rsvp": {
16444
     "rsvp": {
16475
       "version": "4.8.5",
16445
       "version": "4.8.5",
16476
       "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz",
16446
       "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz",
18460
       "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
18430
       "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
18461
       "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
18431
       "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
18462
     },
18432
     },
18463
-    "typeface-oswald": {
18464
-      "version": "0.0.54",
18465
-      "resolved": "https://registry.npmjs.org/typeface-oswald/-/typeface-oswald-0.0.54.tgz",
18466
-      "integrity": "sha512-U1WMNp4qfy4/3khIfHMVAIKnNu941MXUfs3+H9R8PFgnoz42Hh9pboSFztWr86zut0eXC8byalmVhfkiKON/8Q==",
18467
-      "optional": true
18468
-    },
18469
     "ua-parser-js": {
18433
     "ua-parser-js": {
18470
       "version": "0.7.17",
18434
       "version": "0.7.17",
18471
       "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.17.tgz",
18435
       "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.17.tgz",

+ 2
- 2
package.json 查看文件

37
     "@react-native-community/async-storage": "1.3.4",
37
     "@react-native-community/async-storage": "1.3.4",
38
     "@react-native-community/netinfo": "4.1.5",
38
     "@react-native-community/netinfo": "4.1.5",
39
     "@svgr/webpack": "4.3.2",
39
     "@svgr/webpack": "4.3.2",
40
-    "@tensorflow-models/body-pix": "^1.0.1",
41
-    "@tensorflow/tfjs": "^1.1.2",
40
+    "@tensorflow-models/body-pix": "1.1.2",
41
+    "@tensorflow/tfjs": "1.2.9",
42
     "@webcomponents/url": "0.7.1",
42
     "@webcomponents/url": "0.7.1",
43
     "amplitude-js": "4.5.2",
43
     "amplitude-js": "4.5.2",
44
     "bc-css-flags": "3.0.0",
44
     "bc-css-flags": "3.0.0",

+ 6
- 1
react/features/stream-effects/blur/JitsiStreamBlurEffect.js 查看文件

100
         });
100
         });
101
         this._maskFrameTimerWorker.postMessage({
101
         this._maskFrameTimerWorker.postMessage({
102
             id: SET_INTERVAL,
102
             id: SET_INTERVAL,
103
-            timeMs: 200
103
+            timeMs: 50
104
         });
104
         });
105
 
105
 
106
         return this._outputCanvasElement.captureStream(this._frameRate);
106
         return this._outputCanvasElement.captureStream(this._frameRate);
136
                 7, // Constant for background blur, integer values between 0-20
136
                 7, // Constant for background blur, integer values between 0-20
137
                 7 // Constant for edge blur, integer values between 0-20
137
                 7 // Constant for edge blur, integer values between 0-20
138
             );
138
             );
139
+
140
+            // Make sure we clear this buffer before feeding the segmentation data
141
+            // to drawBokehEffect for creating the blur. This fixes the memory leak
142
+            // that started happening in WebGL in Chrome 77 and up.
143
+            this._segmentationData = null;
139
         }
144
         }
140
     }
145
     }
141
 
146
 

+ 21
- 2
react/features/stream-effects/blur/index.js 查看文件

1
 // @flow
1
 // @flow
2
 
2
 
3
 import { load } from '@tensorflow-models/body-pix';
3
 import { load } from '@tensorflow-models/body-pix';
4
-
4
+import * as tfc from '@tensorflow/tfjs-core';
5
 import JitsiStreamBlurEffect from './JitsiStreamBlurEffect';
5
 import JitsiStreamBlurEffect from './JitsiStreamBlurEffect';
6
 
6
 
7
 /**
7
 /**
11
  */
11
  */
12
 const bpModelPromise = load(0.25);
12
 const bpModelPromise = load(0.25);
13
 
13
 
14
+/**
15
+ * Configure the Tensor Flow model to use the webgl backend which is the
16
+ * most powerful backend for the browser.
17
+ */
18
+const webGlBackend = 'webgl';
19
+
14
 /**
20
 /**
15
  * Creates a new instance of JitsiStreamBlurEffect.
21
  * Creates a new instance of JitsiStreamBlurEffect.
16
  *
22
  *
21
         return Promise.reject(new Error('JitsiStreamBlurEffect not supported!'));
27
         return Promise.reject(new Error('JitsiStreamBlurEffect not supported!'));
22
     }
28
     }
23
 
29
 
24
-    return bpModelPromise.then(bpmodel => new JitsiStreamBlurEffect(bpmodel));
30
+    const setBackendPromise = new Promise((resolve, reject) => {
31
+        if (tfc.getBackend() === webGlBackend) {
32
+            resolve();
33
+
34
+            return;
35
+        }
36
+
37
+        return tfc.setBackend(webGlBackend)
38
+            .then(resolve, reject);
39
+    });
40
+
41
+    return setBackendPromise
42
+        .then(() => bpModelPromise)
43
+        .then(bpmodel => new JitsiStreamBlurEffect(bpmodel));
25
 }
44
 }

正在加载...
取消
保存