@pexip/media-processor 20.3.5 → 21.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/api-docs/README.mdx +33 -6
  3. package/api-docs/functions/createBenchmark.mdx +17 -5
  4. package/api-docs/functions/createWindowedStats.mdx +23 -0
  5. package/api-docs/functions/iou.mdx +19 -0
  6. package/api-docs/functions/labelComponents.mdx +20 -0
  7. package/api-docs/functions/nearestPowerOfTwo.mdx +21 -0
  8. package/api-docs/functions/playVideo.mdx +16 -0
  9. package/api-docs/functions/scoreComponent.mdx +22 -0
  10. package/api-docs/functions/setVideoElementSrc.mdx +14 -0
  11. package/api-docs/interfaces/Benchmark.mdx +12 -0
  12. package/api-docs/interfaces/RendererOptions.mdx +26 -9
  13. package/api-docs/interfaces/SegmentationParams.mdx +29 -12
  14. package/api-docs/interfaces/SelectionOptions.mdx +15 -0
  15. package/api-docs/interfaces/Stats.mdx +11 -0
  16. package/api-docs/interfaces/Weights.mdx +12 -0
  17. package/api-docs/type-aliases/OptionalKeys.mdx +10 -0
  18. package/api-docs/variables/BACKGROUND_THRESHOLD.mdx +3 -0
  19. package/api-docs/variables/DOWN_SAMPLE_FACTOR.mdx +3 -0
  20. package/api-docs/variables/EDGE_BLUR_AMOUNT.mdx +1 -1
  21. package/api-docs/variables/EXCLUDE_BYSTANDERS.mdx +3 -0
  22. package/api-docs/variables/FOREGROUND_THRESHOLD.mdx +1 -1
  23. package/api-docs/variables/LIGHT_WRAP_BLUR_AMOUNT.mdx +3 -0
  24. package/api-docs/variables/LIGHT_WRAP_EDGE_BAND.mdx +3 -0
  25. package/api-docs/variables/LIGHT_WRAP_INTENSITY.mdx +3 -0
  26. package/api-docs/variables/LIGHT_WRAP_TIGHTNESS.mdx +3 -0
  27. package/api-docs/variables/MASK_COMBINE_RATIO.mdx +1 -1
  28. package/api-docs/variables/MORPH_DILATE_RADIUS_PX.mdx +3 -0
  29. package/api-docs/variables/MORPH_ERODE_RADIUS_PX.mdx +3 -0
  30. package/api-docs/variables/MORPH_PASS.mdx +3 -0
  31. package/api-docs/variables/PERSON_CENTER.mdx +3 -0
  32. package/api-docs/variables/SIGMA_RANGE.mdx +3 -0
  33. package/api-docs/variables/SIGMA_SPACE.mdx +3 -0
  34. package/api-docs/variables/STRONG_EDGE_BLUR_AMOUNT.mdx +3 -0
  35. package/api-docs/variables/getCanvasRenderingContext2D.mdx +14 -0
  36. package/api-docs/variables/getImageSize.mdx +13 -0
  37. package/dist/common/backends/webgl/binaryMask.d.ts +8 -0
  38. package/dist/common/backends/webgl/binaryMask.js +95 -0
  39. package/dist/common/backends/webgl/blender.d.ts +2 -1
  40. package/dist/common/backends/webgl/blender.js +18 -15
  41. package/dist/common/backends/webgl/blur.d.ts +1 -1
  42. package/dist/common/backends/webgl/blur.js +23 -16
  43. package/dist/common/backends/webgl/canvas.js +9 -4
  44. package/dist/common/backends/webgl/diffAbsMask.d.ts +10 -0
  45. package/dist/common/backends/webgl/diffAbsMask.js +103 -0
  46. package/dist/common/backends/webgl/geodesicReconstruction.d.ts +13 -0
  47. package/dist/common/backends/webgl/geodesicReconstruction.js +176 -0
  48. package/dist/common/backends/webgl/jointBilateralFilter.d.ts +12 -0
  49. package/dist/common/backends/webgl/jointBilateralFilter.js +108 -0
  50. package/dist/common/backends/webgl/morphErode.d.ts +13 -0
  51. package/dist/common/backends/webgl/morphErode.js +121 -0
  52. package/dist/common/backends/webgl/renderer.js +194 -34
  53. package/dist/common/backends/webgl/replace.d.ts +17 -0
  54. package/dist/common/backends/webgl/replace.js +126 -0
  55. package/dist/common/backends/webgl/selectComponent.d.ts +15 -0
  56. package/dist/common/backends/webgl/selectComponent.js +102 -0
  57. package/dist/common/backends/webgl/smoothingMask.d.ts +3 -3
  58. package/dist/common/backends/webgl/smoothingMask.js +22 -21
  59. package/dist/common/backends/webgl/tentBlur.d.ts +9 -0
  60. package/dist/common/backends/webgl/tentBlur.js +118 -0
  61. package/dist/common/backends/webgl/texture.d.ts +1 -1
  62. package/dist/common/backends/webgl/texture.js +19 -17
  63. package/dist/common/backends/webgl/textureToTexture.d.ts +1 -1
  64. package/dist/common/backends/webgl/textureToTexture.js +19 -16
  65. package/dist/common/backends/webgl/webglUtils.d.ts +7 -1
  66. package/dist/common/backends/webgl/webglUtils.js +64 -6
  67. package/dist/common/backends/webgpu/blender.d.ts +6 -1
  68. package/dist/common/backends/webgpu/blender.js +96 -51
  69. package/dist/common/backends/webgpu/constants.js +1 -1
  70. package/dist/common/backends/webgpu/dualFilterBlur.d.ts +2 -3
  71. package/dist/common/backends/webgpu/dualFilterBlur.js +146 -140
  72. package/dist/common/backends/webgpu/jointBilateralFilter.d.ts +7 -0
  73. package/dist/common/backends/webgpu/jointBilateralFilter.js +162 -0
  74. package/dist/common/backends/webgpu/renderer.js +211 -39
  75. package/dist/common/backends/webgpu/replace.d.ts +11 -0
  76. package/dist/common/backends/webgpu/replace.js +175 -0
  77. package/dist/common/backends/webgpu/resize.d.ts +4 -0
  78. package/dist/common/backends/webgpu/resize.js +76 -0
  79. package/dist/common/backends/webgpu/smoothingMask.d.ts +2 -2
  80. package/dist/common/backends/webgpu/smoothingMask.js +74 -40
  81. package/dist/common/backends/webgpu/tentBlur.d.ts +5 -0
  82. package/dist/common/backends/webgpu/tentBlur.js +131 -0
  83. package/dist/common/backends/webgpu/texture.d.ts +2 -2
  84. package/dist/common/backends/webgpu/texture.js +24 -19
  85. package/dist/common/backends/webgpu/textureToTexture.d.ts +1 -1
  86. package/dist/common/backends/webgpu/textureToTexture.js +28 -15
  87. package/dist/common/backends/webgpu/types.d.ts +2 -0
  88. package/dist/common/backends/webgpu/webgpuUtils.d.ts +24 -4
  89. package/dist/common/backends/webgpu/webgpuUtils.js +60 -11
  90. package/dist/common/constants.d.ts +19 -5
  91. package/dist/common/constants.js +19 -5
  92. package/dist/common/index.d.ts +1 -0
  93. package/dist/common/index.js +1 -0
  94. package/dist/common/tsconfig.tsbuildinfo +1 -1
  95. package/dist/common/types/render.d.ts +142 -13
  96. package/dist/common/types/utils.d.ts +21 -0
  97. package/dist/common/utils.d.ts +16 -0
  98. package/dist/common/utils.js +152 -0
  99. package/dist/main/benchUtils.d.ts +33 -1
  100. package/dist/main/benchUtils.js +145 -11
  101. package/dist/main/tsconfig.tsbuildinfo +1 -1
  102. package/dist/main/video/canvasTransform.d.ts +1 -1
  103. package/dist/main/video/canvasTransform.js +135 -47
  104. package/dist/main/video/index.d.ts +1 -1
  105. package/dist/main/video/index.js +1 -1
  106. package/dist/workers/mediaWorker.js +35 -162
  107. package/dist/workers/tsconfig.tsbuildinfo +1 -1
  108. package/package.json +8 -7
  109. package/dist/common/backends/webgl/shaders/blendFragmentShader.d.ts +0 -1
  110. package/dist/common/backends/webgl/shaders/blendFragmentShader.js +0 -21
  111. package/dist/common/backends/webgl/shaders/dualFilterBlurFragmentShader.d.ts +0 -1
  112. package/dist/common/backends/webgl/shaders/dualFilterBlurFragmentShader.js +0 -45
  113. package/dist/common/backends/webgl/shaders/smoothingMaskFragmentShader.d.ts +0 -1
  114. package/dist/common/backends/webgl/shaders/smoothingMaskFragmentShader.js +0 -57
  115. package/dist/common/backends/webgl/shaders/textureFragmentShader.d.ts +0 -1
  116. package/dist/common/backends/webgl/shaders/textureFragmentShader.js +0 -16
  117. package/dist/common/backends/webgl/shaders/vertexShader.d.ts +0 -1
  118. package/dist/common/backends/webgl/shaders/vertexShader.js +0 -19
@@ -1,27 +1,43 @@
1
- import { PROCESSING_HEIGHT, PROCESSING_WIDTH, FOREGROUND_THRESHOLD, BACKGROUND_BLUR_AMOUNT, EDGE_BLUR_AMOUNT, MASK_COMBINE_RATIO, } from '../../common/constants';
1
+ import { PROCESSING_HEIGHT, PROCESSING_WIDTH, FOREGROUND_THRESHOLD, BACKGROUND_THRESHOLD, BACKGROUND_BLUR_AMOUNT, EDGE_BLUR_AMOUNT, MASK_COMBINE_RATIO, SIGMA_RANGE, SIGMA_SPACE, PERSON_CENTER, EXCLUDE_BYSTANDERS, MORPH_PASS, MORPH_DILATE_RADIUS_PX, MORPH_ERODE_RADIUS_PX, LIGHT_WRAP_INTENSITY, DOWN_SAMPLE_FACTOR, LIGHT_WRAP_TIGHTNESS, LIGHT_WRAP_BLUR_AMOUNT, LIGHT_WRAP_EDGE_BAND, } from '../../common/constants';
2
2
  import { createCanvasRenderUtils } from '../../common/canvasRenderUtils';
3
- import { clamping, createObjectUpdater } from '../../common/utils';
3
+ import { clamping, createObjectUpdater, nearestPowerOfTwo, } from '../../common/utils';
4
4
  import { assert } from '@pexip/utils';
5
5
  const clampInRangeFrom0To1 = clamping(0, 1);
6
6
  const clampInRangeFrom0To9 = clamping(0, 9);
7
- export const createTransform = (segmenter, { width = PROCESSING_WIDTH, height = PROCESSING_HEIGHT, foregroundThreshold = FOREGROUND_THRESHOLD, backgroundBlurAmount = BACKGROUND_BLUR_AMOUNT, edgeBlurAmount = EDGE_BLUR_AMOUNT, maskCombineRatio = MASK_COMBINE_RATIO, backgroundImageUrl = '', effects = 'none', backend = 'webgl', selfManageSegmenter, ...options } = {}) => {
7
+ export const createTransform = (segmenter, { width = PROCESSING_WIDTH, height = PROCESSING_HEIGHT, foregroundThreshold = FOREGROUND_THRESHOLD, backgroundThreshold = BACKGROUND_THRESHOLD, backgroundBlurAmount = BACKGROUND_BLUR_AMOUNT, edgeBlurAmount = EDGE_BLUR_AMOUNT, maskCombineRatio = MASK_COMBINE_RATIO, backgroundImageUrl = '', sigmaSpace = SIGMA_SPACE, sigmaRangeLo = SIGMA_RANGE[0], sigmaRangeHi = SIGMA_RANGE[1], effects = 'none', backend = 'webgl', selfManageSegmenter, personCenter = PERSON_CENTER, excludeBystanders = EXCLUDE_BYSTANDERS, morphPass = MORPH_PASS, morphErodeRadiusPx = MORPH_ERODE_RADIUS_PX, morphDilateRadiusPx = MORPH_DILATE_RADIUS_PX, lightWrapIntensity = LIGHT_WRAP_INTENSITY, downSampleFactor = DOWN_SAMPLE_FACTOR, lightWrapTightness = LIGHT_WRAP_TIGHTNESS, lightWrapBlurAmount = LIGHT_WRAP_BLUR_AMOUNT, lightWrapEdgeBand = LIGHT_WRAP_EDGE_BAND, ...options } = {}) => {
8
8
  const props = {
9
9
  segmenter,
10
10
  processingWidth: width,
11
11
  processingHeight: height,
12
- foregroundThreshold,
13
- backgroundBlurAmount,
14
- edgeBlurAmount,
15
- utils: undefined,
16
- effects,
17
- maskCombineRatio,
18
12
  backgroundImage: options.backgroundImage,
19
13
  status: 'new',
20
- backgroundImageUrl,
21
14
  outputCanvas: options.outputCanvas,
22
15
  outputDelegate: options.outputDelegate,
23
- backend,
24
16
  unsubscribe: null,
17
+ utils: undefined,
18
+ renderOptions: {
19
+ foregroundThreshold,
20
+ backgroundThreshold,
21
+ backgroundBlurAmount,
22
+ edgeBlurAmount,
23
+ backgroundImageUrl,
24
+ effects,
25
+ backend,
26
+ maskCombineRatio,
27
+ sigmaRangeHi,
28
+ sigmaRangeLo,
29
+ sigmaSpace,
30
+ personCenter,
31
+ excludeBystanders,
32
+ morphPass,
33
+ morphErodeRadiusPx,
34
+ morphDilateRadiusPx,
35
+ lightWrapIntensity,
36
+ downSampleFactor,
37
+ lightWrapTightness,
38
+ lightWrapBlurAmount,
39
+ lightWrapEdgeBand,
40
+ },
25
41
  };
26
42
  const updateProps = createObjectUpdater(props);
27
43
  const handleContextRestored = () => {
@@ -47,15 +63,6 @@ export const createTransform = (segmenter, { width = PROCESSING_WIDTH, height =
47
63
  };
48
64
  };
49
65
  const processInput = async (input) => {
50
- const renderOptions = {
51
- foregroundThreshold: props.foregroundThreshold,
52
- backgroundBlurAmount: props.backgroundBlurAmount,
53
- edgeBlurAmount: props.edgeBlurAmount,
54
- maskCombineRatio: props.maskCombineRatio,
55
- backgroundImageUrl: props.backgroundImageUrl,
56
- effects: props.effects,
57
- backend: props.backend,
58
- };
59
66
  if (props.segmenter.status === 'new' ||
60
67
  props.segmenter.status === 'closed') {
61
68
  await props.segmenter.open({
@@ -63,7 +70,7 @@ export const createTransform = (segmenter, { width = PROCESSING_WIDTH, height =
63
70
  processingWidth: props.processingWidth,
64
71
  processingHeight: props.processingHeight,
65
72
  backgroundImage: props.backgroundImage,
66
- renderOptions,
73
+ renderOptions: props.renderOptions,
67
74
  });
68
75
  }
69
76
  if (!props.utils) {
@@ -73,7 +80,7 @@ export const createTransform = (segmenter, { width = PROCESSING_WIDTH, height =
73
80
  return undefined;
74
81
  }
75
82
  const inputFrame = toVideoFrameLike(input);
76
- return props.segmenter.process(inputFrame, renderOptions);
83
+ return props.segmenter.process(inputFrame, props.renderOptions);
77
84
  };
78
85
  const canUpdate = () => props.segmenter.status !== 'new' &&
79
86
  props.segmenter.status !== 'closed' &&
@@ -103,43 +110,132 @@ export const createTransform = (segmenter, { width = PROCESSING_WIDTH, height =
103
110
  return props.status;
104
111
  },
105
112
  get foregroundThreshold() {
106
- return props.foregroundThreshold;
113
+ return props.renderOptions.foregroundThreshold;
114
+ },
115
+ get backgroundThreshold() {
116
+ return props.renderOptions.backgroundThreshold;
107
117
  },
108
118
  get backgroundBlurAmount() {
109
- return props.backgroundBlurAmount;
119
+ return props.renderOptions.backgroundBlurAmount;
110
120
  },
111
121
  get edgeBlurAmount() {
112
- return props.edgeBlurAmount;
122
+ return props.renderOptions.edgeBlurAmount;
113
123
  },
114
124
  get effects() {
115
- return props.effects;
125
+ return props.renderOptions.effects;
116
126
  },
117
127
  get maskCombineRatio() {
118
- return props.maskCombineRatio;
128
+ return props.renderOptions.maskCombineRatio;
119
129
  },
120
130
  get backend() {
121
- return props.backend;
131
+ return props.renderOptions.backend;
132
+ },
133
+ get sigmaSpace() {
134
+ return props.renderOptions.sigmaSpace;
135
+ },
136
+ get sigmaRangeLo() {
137
+ return props.renderOptions.sigmaRangeLo;
138
+ },
139
+ get sigmaRangeHi() {
140
+ return props.renderOptions.sigmaRangeHi;
141
+ },
142
+ get personCenter() {
143
+ return props.renderOptions.personCenter;
144
+ },
145
+ get excludeBystanders() {
146
+ return props.renderOptions.excludeBystanders;
147
+ },
148
+ get morphPass() {
149
+ return props.renderOptions.morphPass;
150
+ },
151
+ get morphErodeRadiusPx() {
152
+ return props.renderOptions.morphErodeRadiusPx;
153
+ },
154
+ get morphDilateRadiusPx() {
155
+ return props.renderOptions.morphDilateRadiusPx;
156
+ },
157
+ get lightWrapIntensity() {
158
+ return props.renderOptions.lightWrapIntensity;
159
+ },
160
+ get lightWrapTightness() {
161
+ return props.renderOptions.lightWrapTightness;
162
+ },
163
+ get lightWrapBlurAmount() {
164
+ return props.renderOptions.lightWrapBlurAmount;
165
+ },
166
+ get lightWrapEdgeBand() {
167
+ return props.renderOptions.lightWrapEdgeBand;
168
+ },
169
+ get downSampleFactor() {
170
+ return props.renderOptions.downSampleFactor;
171
+ },
172
+ set morphPass(value) {
173
+ props.renderOptions.morphPass = value;
174
+ },
175
+ set morphErodeRadiusPx(value) {
176
+ props.renderOptions.morphErodeRadiusPx = value;
177
+ },
178
+ set morphDilateRadiusPx(value) {
179
+ props.renderOptions.morphDilateRadiusPx = value;
180
+ },
181
+ set personCenter(value) {
182
+ props.renderOptions.personCenter = value;
183
+ },
184
+ set excludeBystanders(value) {
185
+ props.renderOptions.excludeBystanders = value;
122
186
  },
123
187
  set foregroundThreshold(value) {
124
- props.foregroundThreshold = clampInRangeFrom0To1(value);
188
+ assert(value >= props.renderOptions.backgroundThreshold);
189
+ props.renderOptions.foregroundThreshold =
190
+ clampInRangeFrom0To1(value);
191
+ },
192
+ set backgroundThreshold(value) {
193
+ assert(value <= props.renderOptions.foregroundThreshold);
194
+ props.renderOptions.backgroundThreshold =
195
+ clampInRangeFrom0To1(value);
125
196
  },
126
197
  set backgroundBlurAmount(value) {
127
- props.backgroundBlurAmount = clampInRangeFrom0To9(value);
198
+ props.renderOptions.backgroundBlurAmount =
199
+ clampInRangeFrom0To9(value);
128
200
  },
129
201
  set edgeBlurAmount(value) {
130
- props.edgeBlurAmount = clampInRangeFrom0To9(value);
202
+ props.renderOptions.edgeBlurAmount = clampInRangeFrom0To9(value);
131
203
  },
132
204
  set effects(value) {
133
- props.effects = value;
205
+ props.renderOptions.effects = value;
134
206
  },
135
207
  set backgroundImageUrl(value) {
136
- props.backgroundImageUrl = value;
208
+ props.renderOptions.backgroundImageUrl = value;
137
209
  },
138
210
  get backgroundImageUrl() {
139
- return props.backgroundImageUrl;
211
+ return props.renderOptions.backgroundImageUrl;
140
212
  },
141
213
  set maskCombineRatio(value) {
142
- props.maskCombineRatio = clampInRangeFrom0To1(value);
214
+ props.renderOptions.maskCombineRatio = clampInRangeFrom0To1(value);
215
+ },
216
+ set sigmaRangeLo(value) {
217
+ props.renderOptions.sigmaRangeLo = value;
218
+ },
219
+ set sigmaRangeHi(value) {
220
+ props.renderOptions.sigmaRangeHi = value;
221
+ },
222
+ set sigmaSpace(value) {
223
+ props.renderOptions.sigmaSpace = value;
224
+ },
225
+ set lightWrapIntensity(value) {
226
+ props.renderOptions.lightWrapIntensity = value;
227
+ },
228
+ set lightWrapTightness(value) {
229
+ props.renderOptions.lightWrapTightness = value;
230
+ },
231
+ set lightWrapBlurAmount(value) {
232
+ props.renderOptions.lightWrapBlurAmount = value;
233
+ },
234
+ set lightWrapEdgeBand(value) {
235
+ props.renderOptions.lightWrapEdgeBand = value;
236
+ },
237
+ set downSampleFactor(value) {
238
+ props.renderOptions.downSampleFactor = nearestPowerOfTwo(value, 0, 2);
143
239
  },
144
240
  get outputCanvas() {
145
241
  return props.outputCanvas;
@@ -175,21 +271,13 @@ export const createTransform = (segmenter, { width = PROCESSING_WIDTH, height =
175
271
  }
176
272
  },
177
273
  set backend(value) {
178
- if (value === props.backend) {
274
+ if (value === props.renderOptions.backend) {
179
275
  return;
180
276
  }
181
- props.backend = value;
277
+ props.renderOptions.backend = value;
182
278
  if (canUpdate()) {
183
279
  segmenter.update({
184
- renderOptions: {
185
- backend: props.backend,
186
- backgroundImageUrl: props.backgroundImageUrl,
187
- foregroundThreshold: props.foregroundThreshold,
188
- backgroundBlurAmount: props.backgroundBlurAmount,
189
- edgeBlurAmount: props.edgeBlurAmount,
190
- maskCombineRatio: props.maskCombineRatio,
191
- effects: props.effects,
192
- },
280
+ renderOptions: props.renderOptions,
193
281
  });
194
282
  }
195
283
  },
@@ -208,7 +296,7 @@ export const createTransform = (segmenter, { width = PROCESSING_WIDTH, height =
208
296
  }
209
297
  },
210
298
  transform: async (videoFrame, controller) => {
211
- switch (props.effects) {
299
+ switch (props.renderOptions.effects) {
212
300
  case 'overlay':
213
301
  case 'blur': {
214
302
  const result = await processInput(videoFrame);
@@ -3,7 +3,7 @@ export * from './video';
3
3
  export * from './types';
4
4
  export { createTransform as createCanvasTransform } from './canvasTransform';
5
5
  export * from './videoStreamTrackProcessor';
6
- export { createFrameCallbackRequest, createCanvas } from './utils';
6
+ export { createCanvas, createFrameCallbackRequest, playVideo, setVideoElementSrc, } from './utils';
7
7
  export * from './typeGuards';
8
8
  export * from './constants';
9
9
  export * from './segmenters/mediapipe';
@@ -3,7 +3,7 @@ export * from './video';
3
3
  export * from './types';
4
4
  export { createTransform as createCanvasTransform } from './canvasTransform';
5
5
  export * from './videoStreamTrackProcessor';
6
- export { createFrameCallbackRequest, createCanvas } from './utils';
6
+ export { createCanvas, createFrameCallbackRequest, playVideo, setVideoElementSrc, } from './utils';
7
7
  export * from './typeGuards';
8
8
  export * from './constants';
9
9
  export * from './segmenters/mediapipe';