@pexip/media-processor 20.3.5 → 22.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 (201) hide show
  1. package/CHANGELOG.md +109 -0
  2. package/README.md +17 -10
  3. package/api-docs/README.mdx +69 -23
  4. package/api-docs/functions/assertMediaStreamVideoTrack.mdx +13 -0
  5. package/api-docs/functions/createBenchmark.mdx +17 -5
  6. package/api-docs/functions/createFrameCallbackRequest.mdx +8 -2
  7. package/api-docs/functions/createMediaStreamTrackInputProcessAdaptor.mdx +10 -0
  8. package/api-docs/functions/createReadWritableStreamFallbackInputProcessAdaptor.mdx +17 -0
  9. package/api-docs/functions/createReadWritableStreamInputProcessAdaptor.mdx +10 -0
  10. package/api-docs/functions/createVideoProcessor.mdx +3 -3
  11. package/api-docs/functions/createWindowedStats.mdx +23 -0
  12. package/api-docs/functions/getDefaultInputProcessAdaptor.mdx +17 -0
  13. package/api-docs/functions/iou.mdx +19 -0
  14. package/api-docs/functions/isMediaStreamVideoTrack.mdx +13 -0
  15. package/api-docs/functions/labelComponents.mdx +20 -0
  16. package/api-docs/functions/nearestPowerOfTwo.mdx +21 -0
  17. package/api-docs/functions/playVideo.mdx +16 -0
  18. package/api-docs/functions/scoreComponent.mdx +22 -0
  19. package/api-docs/functions/setVideoElementSrc.mdx +14 -0
  20. package/api-docs/interfaces/Analyzer.mdx +4 -0
  21. package/api-docs/interfaces/Benchmark.mdx +26 -2
  22. package/api-docs/interfaces/FrameTransformStats.mdx +9 -0
  23. package/api-docs/interfaces/Gain.mdx +4 -0
  24. package/api-docs/interfaces/ImageSegmenterOptions.mdx +0 -2
  25. package/api-docs/interfaces/InputProcessAdaptor.mdx +28 -0
  26. package/api-docs/interfaces/Process.mdx +8 -3
  27. package/api-docs/interfaces/ProcessEventMute.mdx +6 -0
  28. package/api-docs/interfaces/ProcessWorkerEventOpened.mdx +7 -0
  29. package/api-docs/interfaces/ProcessWorkerEventStats.mdx +6 -0
  30. package/api-docs/interfaces/ProcessWorkerEventUpdated.mdx +7 -0
  31. package/api-docs/interfaces/ProcessorEvent.mdx +1 -1
  32. package/api-docs/interfaces/ProcessorOptions.mdx +0 -1
  33. package/api-docs/interfaces/ProcessorProcessOptions.mdx +3 -1
  34. package/api-docs/interfaces/ProcessorUpdateOptions.mdx +15 -0
  35. package/api-docs/interfaces/ReadWritableStream.mdx +12 -0
  36. package/api-docs/interfaces/Renderer.mdx +2 -2
  37. package/api-docs/interfaces/RendererOptions.mdx +25 -12
  38. package/api-docs/interfaces/Segmenter.mdx +89 -10
  39. package/api-docs/interfaces/SegmenterOptions.mdx +0 -1
  40. package/api-docs/interfaces/SelectionOptions.mdx +15 -0
  41. package/api-docs/interfaces/Stats.mdx +11 -0
  42. package/api-docs/interfaces/VideoProcessor.mdx +49 -5
  43. package/api-docs/interfaces/Weights.mdx +12 -0
  44. package/api-docs/type-aliases/OptionalKeys.mdx +10 -0
  45. package/api-docs/type-aliases/ProcessEvents.mdx +1 -0
  46. package/api-docs/type-aliases/ProcessInputType.mdx +3 -1
  47. package/api-docs/type-aliases/ProcessWorkerEvents.mdx +6 -4
  48. package/api-docs/type-aliases/ProcessorWorkerEvents.mdx +1 -1
  49. package/api-docs/type-aliases/Struct.mdx +9 -0
  50. package/api-docs/variables/BACKGROUND_THRESHOLD.mdx +3 -0
  51. package/api-docs/variables/DOWN_SAMPLE_FACTOR.mdx +3 -0
  52. package/api-docs/variables/EDGE_BLUR_AMOUNT.mdx +1 -1
  53. package/api-docs/variables/EXCLUDE_BYSTANDERS.mdx +3 -0
  54. package/api-docs/variables/FOREGROUND_THRESHOLD.mdx +1 -1
  55. package/api-docs/variables/FRAME_RATE.mdx +1 -1
  56. package/api-docs/variables/ImageFetchError.mdx +3 -0
  57. package/api-docs/variables/LIGHT_WRAP_BLUR_AMOUNT.mdx +3 -0
  58. package/api-docs/variables/LIGHT_WRAP_EDGE_BAND.mdx +3 -0
  59. package/api-docs/variables/LIGHT_WRAP_INTENSITY.mdx +3 -0
  60. package/api-docs/variables/LIGHT_WRAP_TIGHTNESS.mdx +3 -0
  61. package/api-docs/variables/MASK_COMBINE_RATIO.mdx +1 -1
  62. package/api-docs/variables/MORPH_DILATE_RADIUS_PX.mdx +3 -0
  63. package/api-docs/variables/MORPH_ERODE_RADIUS_PX.mdx +3 -0
  64. package/api-docs/variables/MORPH_PASS.mdx +3 -0
  65. package/api-docs/variables/MediaStreamTrackTransferable.mdx +5 -0
  66. package/api-docs/variables/PERSON_CENTER.mdx +3 -0
  67. package/api-docs/variables/RENDERER_OPTIONS_STRUCT.mdx +3 -0
  68. package/api-docs/variables/SIGMA_RANGE.mdx +3 -0
  69. package/api-docs/variables/SIGMA_SPACE.mdx +3 -0
  70. package/api-docs/variables/STRONG_EDGE_BLUR_AMOUNT.mdx +3 -0
  71. package/api-docs/variables/cloneImageRecord.mdx +19 -0
  72. package/api-docs/variables/compareImageRecords.mdx +18 -0
  73. package/api-docs/variables/createRemoteImageBitmap.mdx +1 -1
  74. package/api-docs/variables/getCanvasRenderingContext2D.mdx +14 -0
  75. package/api-docs/variables/getImageSize.mdx +13 -0
  76. package/api-docs/variables/isRenderOptionsKey.mdx +13 -0
  77. package/api-docs/variables/isValidGpuAPI.mdx +13 -0
  78. package/dist/common/backends/webgl/binaryMask.d.ts +8 -0
  79. package/dist/common/backends/webgl/binaryMask.js +95 -0
  80. package/dist/common/backends/webgl/blender.d.ts +2 -1
  81. package/dist/common/backends/webgl/blender.js +18 -15
  82. package/dist/common/backends/webgl/blur.d.ts +1 -1
  83. package/dist/common/backends/webgl/blur.js +23 -16
  84. package/dist/common/backends/webgl/canvas.js +9 -4
  85. package/dist/common/backends/webgl/diffAbsMask.d.ts +10 -0
  86. package/dist/common/backends/webgl/diffAbsMask.js +103 -0
  87. package/dist/common/backends/webgl/geodesicReconstruction.d.ts +13 -0
  88. package/dist/common/backends/webgl/geodesicReconstruction.js +176 -0
  89. package/dist/common/backends/webgl/jointBilateralFilter.d.ts +12 -0
  90. package/dist/common/backends/webgl/jointBilateralFilter.js +108 -0
  91. package/dist/common/backends/webgl/morphErode.d.ts +13 -0
  92. package/dist/common/backends/webgl/morphErode.js +121 -0
  93. package/dist/common/backends/webgl/renderer.js +194 -44
  94. package/dist/common/backends/webgl/replace.d.ts +17 -0
  95. package/dist/common/backends/webgl/replace.js +126 -0
  96. package/dist/common/backends/webgl/selectComponent.d.ts +15 -0
  97. package/dist/common/backends/webgl/selectComponent.js +102 -0
  98. package/dist/common/backends/webgl/smoothingMask.d.ts +3 -3
  99. package/dist/common/backends/webgl/smoothingMask.js +22 -21
  100. package/dist/common/backends/webgl/tentBlur.d.ts +9 -0
  101. package/dist/common/backends/webgl/tentBlur.js +118 -0
  102. package/dist/common/backends/webgl/texture.d.ts +2 -3
  103. package/dist/common/backends/webgl/texture.js +21 -19
  104. package/dist/common/backends/webgl/textureToTexture.d.ts +1 -1
  105. package/dist/common/backends/webgl/textureToTexture.js +19 -16
  106. package/dist/common/backends/webgl/webglUtils.d.ts +7 -1
  107. package/dist/common/backends/webgl/webglUtils.js +72 -10
  108. package/dist/common/backends/webgpu/blender.d.ts +6 -1
  109. package/dist/common/backends/webgpu/blender.js +96 -51
  110. package/dist/common/backends/webgpu/constants.js +1 -1
  111. package/dist/common/backends/webgpu/dualFilterBlur.d.ts +2 -3
  112. package/dist/common/backends/webgpu/dualFilterBlur.js +146 -140
  113. package/dist/common/backends/webgpu/jointBilateralFilter.d.ts +7 -0
  114. package/dist/common/backends/webgpu/jointBilateralFilter.js +162 -0
  115. package/dist/common/backends/webgpu/renderer.js +205 -43
  116. package/dist/common/backends/webgpu/replace.d.ts +11 -0
  117. package/dist/common/backends/webgpu/replace.js +175 -0
  118. package/dist/common/backends/webgpu/resize.d.ts +4 -0
  119. package/dist/common/backends/webgpu/resize.js +76 -0
  120. package/dist/common/backends/webgpu/smoothingMask.d.ts +2 -2
  121. package/dist/common/backends/webgpu/smoothingMask.js +74 -40
  122. package/dist/common/backends/webgpu/tentBlur.d.ts +5 -0
  123. package/dist/common/backends/webgpu/tentBlur.js +131 -0
  124. package/dist/common/backends/webgpu/texture.d.ts +2 -3
  125. package/dist/common/backends/webgpu/texture.js +29 -20
  126. package/dist/common/backends/webgpu/textureToTexture.d.ts +1 -1
  127. package/dist/common/backends/webgpu/textureToTexture.js +28 -15
  128. package/dist/common/backends/webgpu/types.d.ts +2 -0
  129. package/dist/common/backends/webgpu/webgpuUtils.d.ts +24 -4
  130. package/dist/common/backends/webgpu/webgpuUtils.js +60 -11
  131. package/dist/common/constants.d.ts +22 -5
  132. package/dist/common/constants.js +23 -5
  133. package/dist/common/index.d.ts +2 -0
  134. package/dist/common/index.js +2 -0
  135. package/dist/common/tsconfig.tsbuildinfo +1 -1
  136. package/dist/common/typeGuards.d.ts +2 -0
  137. package/dist/common/typeGuards.js +7 -0
  138. package/dist/common/types/media.d.ts +5 -1
  139. package/dist/common/types/messageEvents.d.ts +31 -4
  140. package/dist/common/types/processor.d.ts +6 -4
  141. package/dist/common/types/render.d.ts +147 -15
  142. package/dist/common/types/render.js +23 -1
  143. package/dist/common/types/segmentation.d.ts +0 -12
  144. package/dist/common/types/utils.d.ts +21 -0
  145. package/dist/common/utils.d.ts +29 -2
  146. package/dist/common/utils.js +206 -10
  147. package/dist/main/audio.js +3 -3
  148. package/dist/main/benchUtils.d.ts +35 -3
  149. package/dist/main/benchUtils.js +149 -15
  150. package/dist/main/index.d.ts +1 -1
  151. package/dist/main/index.js +1 -1
  152. package/dist/main/tsconfig.tsbuildinfo +1 -1
  153. package/dist/main/types.d.ts +0 -6
  154. package/dist/main/utils.d.ts +4 -0
  155. package/dist/main/utils.js +31 -0
  156. package/dist/main/video/constants.d.ts +1 -4
  157. package/dist/main/video/constants.js +1 -5
  158. package/dist/main/video/index.d.ts +3 -4
  159. package/dist/main/video/index.js +3 -4
  160. package/dist/main/video/inputProcessAdaptor.d.ts +30 -0
  161. package/dist/main/video/inputProcessAdaptor.js +198 -0
  162. package/dist/main/video/segmenter.d.ts +35 -0
  163. package/dist/main/video/{segmenters/mediapipe.js → segmenter.js} +93 -53
  164. package/dist/main/video/typeGuards.d.ts +2 -0
  165. package/dist/main/video/typeGuards.js +8 -1
  166. package/dist/main/video/types.d.ts +36 -16
  167. package/dist/main/video/utils.d.ts +5 -4
  168. package/dist/main/video/utils.js +49 -44
  169. package/dist/main/video/video.d.ts +29 -7
  170. package/dist/main/video/video.js +323 -28
  171. package/dist/workers/mediaWorker.js +35 -162
  172. package/dist/workers/tsconfig.tsbuildinfo +1 -1
  173. package/dist/worklets/tsconfig.tsbuildinfo +1 -1
  174. package/package.json +13 -12
  175. package/api-docs/functions/createCanvasTransform.mdx +0 -14
  176. package/api-docs/functions/createVideoTrackProcessor.mdx +0 -9
  177. package/api-docs/functions/createVideoTrackProcessorWithFallback.mdx +0 -15
  178. package/api-docs/interfaces/Detector.mdx +0 -81
  179. package/api-docs/interfaces/SegmentationParams.mdx +0 -18
  180. package/api-docs/interfaces/Transform.mdx +0 -62
  181. package/api-docs/type-aliases/ProcessVideoTrack.mdx +0 -15
  182. package/api-docs/type-aliases/SegmentationTransform.mdx +0 -3
  183. package/dist/common/backends/webgl/shaders/blendFragmentShader.d.ts +0 -1
  184. package/dist/common/backends/webgl/shaders/blendFragmentShader.js +0 -21
  185. package/dist/common/backends/webgl/shaders/dualFilterBlurFragmentShader.d.ts +0 -1
  186. package/dist/common/backends/webgl/shaders/dualFilterBlurFragmentShader.js +0 -45
  187. package/dist/common/backends/webgl/shaders/smoothingMaskFragmentShader.d.ts +0 -1
  188. package/dist/common/backends/webgl/shaders/smoothingMaskFragmentShader.js +0 -57
  189. package/dist/common/backends/webgl/shaders/textureFragmentShader.d.ts +0 -1
  190. package/dist/common/backends/webgl/shaders/textureFragmentShader.js +0 -16
  191. package/dist/common/backends/webgl/shaders/vertexShader.d.ts +0 -1
  192. package/dist/common/backends/webgl/shaders/vertexShader.js +0 -19
  193. package/dist/main/transformer.d.ts +0 -1
  194. package/dist/main/transformer.js +0 -4
  195. package/dist/main/video/canvasTransform.d.ts +0 -17
  196. package/dist/main/video/canvasTransform.js +0 -253
  197. package/dist/main/video/segmenters/mediapipe.d.ts +0 -22
  198. package/dist/main/video/transformer.d.ts +0 -9
  199. package/dist/main/video/transformer.js +0 -68
  200. package/dist/main/video/videoStreamTrackProcessor.d.ts +0 -20
  201. package/dist/main/video/videoStreamTrackProcessor.js +0 -86
@@ -0,0 +1,12 @@
1
+ ## Extended by
2
+
3
+ - [`SelectionOptions`](SelectionOptions.mdx)
4
+
5
+ ## Properties
6
+
7
+ | Property | Type |
8
+ | ------ | ------ |
9
+ | <a id="iou"></a> `iou` | `number` |
10
+ | <a id="area"></a> `area` | `number` |
11
+ | <a id="height"></a> `height` | `number` |
12
+ | <a id="center"></a> `center` | `number` |
@@ -0,0 +1,10 @@
1
+ ```ts
2
+ type OptionalKeys<T, K> = Omit<T, K> & Partial<Pick<T, K>>;
3
+ ```
4
+
5
+ ## Type Parameters
6
+
7
+ | Type Parameter |
8
+ | ------ |
9
+ | `T` |
10
+ | `K` *extends* keyof `T` |
@@ -4,6 +4,7 @@ type ProcessEvents<T, I> =
4
4
  | ProcessEventProcess<I>
5
5
  | ProcessEventUpdate<T>
6
6
  | ProcessEventClose
7
+ | ProcessEventMute
7
8
  | ProcessEventDestroy;
8
9
  ```
9
10
 
@@ -1,3 +1,5 @@
1
1
  ```ts
2
- type ProcessInputType = VideoFrame | ImageData | OffscreenCanvas | ImageBitmap;
2
+ type ProcessInputType =
3
+ | MediaStreamTrack
4
+ | ReadWritableStream<VideoFrame>;
3
5
  ```
@@ -1,10 +1,11 @@
1
1
  ```ts
2
- type ProcessWorkerEvents<T, E, D> =
2
+ type ProcessWorkerEvents<T, E, D, U> =
3
3
  | ProcessWorkerEventProcessed<T>
4
- | ProcessWorkerEventOpened
5
- | ProcessWorkerEventUpdated
4
+ | ProcessWorkerEventOpened<U>
5
+ | ProcessWorkerEventUpdated<U>
6
6
  | ProcessWorkerEvent<E>
7
- | ProcessWorkerEventDebug<D>;
7
+ | ProcessWorkerEventDebug<D>
8
+ | ProcessWorkerEventStats;
8
9
  ```
9
10
 
10
11
  Message events returned from the processor
@@ -16,3 +17,4 @@ Message events returned from the processor
16
17
  | `T` |
17
18
  | `E` |
18
19
  | `D` |
20
+ | `U` |
@@ -1,3 +1,3 @@
1
1
  ```ts
2
- type ProcessorWorkerEvents = ProcessWorkerEvents<VideoFrameLike, ProcessorEvent, ProcessWorkerDebugMessage>;
2
+ type ProcessorWorkerEvents = ProcessWorkerEvents<MediaStreamTrack, ProcessorEvent, ProcessWorkerDebugMessage, Partial<RendererOptions>>;
3
3
  ```
@@ -0,0 +1,9 @@
1
+ ```ts
2
+ type Struct<Type> = { [Key in keyof Type]: "number" | "boolean" | "string" | "object" };
3
+ ```
4
+
5
+ ## Type Parameters
6
+
7
+ | Type Parameter |
8
+ | ------ |
9
+ | `Type` |
@@ -0,0 +1,3 @@
1
+ ```ts
2
+ const BACKGROUND_THRESHOLD: 0.35 = 0.35;
3
+ ```
@@ -0,0 +1,3 @@
1
+ ```ts
2
+ const DOWN_SAMPLE_FACTOR: 2 = 2;
3
+ ```
@@ -1,3 +1,3 @@
1
1
  ```ts
2
- const EDGE_BLUR_AMOUNT: 3 = 3;
2
+ const EDGE_BLUR_AMOUNT: 4 = 4;
3
3
  ```
@@ -0,0 +1,3 @@
1
+ ```ts
2
+ const EXCLUDE_BYSTANDERS: false = false;
3
+ ```
@@ -1,3 +1,3 @@
1
1
  ```ts
2
- const FOREGROUND_THRESHOLD: 0.5 = 0.5;
2
+ const FOREGROUND_THRESHOLD: 0.85 = 0.85;
3
3
  ```
@@ -1,3 +1,3 @@
1
1
  ```ts
2
- const FRAME_RATE: 20 = 20;
2
+ const FRAME_RATE: 30 = 30;
3
3
  ```
@@ -0,0 +1,3 @@
1
+ ```ts
2
+ const ImageFetchError: "ImageFetchError" = "ImageFetchError";
3
+ ```
@@ -0,0 +1,3 @@
1
+ ```ts
2
+ const LIGHT_WRAP_BLUR_AMOUNT: 1 = 1;
3
+ ```
@@ -0,0 +1,3 @@
1
+ ```ts
2
+ const LIGHT_WRAP_EDGE_BAND: 0.25 = 0.25;
3
+ ```
@@ -0,0 +1,3 @@
1
+ ```ts
2
+ const LIGHT_WRAP_INTENSITY: 0.8 = 0.8;
3
+ ```
@@ -0,0 +1,3 @@
1
+ ```ts
2
+ const LIGHT_WRAP_TIGHTNESS: 1 = 1;
3
+ ```
@@ -1,3 +1,3 @@
1
1
  ```ts
2
- const MASK_COMBINE_RATIO: 0.5 = 0.5;
2
+ const MASK_COMBINE_RATIO: 0.8 = 0.8;
3
3
  ```
@@ -0,0 +1,3 @@
1
+ ```ts
2
+ const MORPH_DILATE_RADIUS_PX: 6 = 6;
3
+ ```
@@ -0,0 +1,3 @@
1
+ ```ts
2
+ const MORPH_ERODE_RADIUS_PX: 5 = 5;
3
+ ```
@@ -0,0 +1,3 @@
1
+ ```ts
2
+ const MORPH_PASS: 4 = 4;
3
+ ```
@@ -0,0 +1,5 @@
1
+ ```ts
2
+ const MediaStreamTrackTransferable: boolean;
3
+ ```
4
+
5
+ Result of the feature detection if `MediaStreamTrack` is `Transferable`
@@ -0,0 +1,3 @@
1
+ ```ts
2
+ const PERSON_CENTER: [number, number];
3
+ ```
@@ -0,0 +1,3 @@
1
+ ```ts
2
+ const RENDERER_OPTIONS_STRUCT: Struct<RendererOptions>;
3
+ ```
@@ -0,0 +1,3 @@
1
+ ```ts
2
+ const SIGMA_RANGE: [number, number];
3
+ ```
@@ -0,0 +1,3 @@
1
+ ```ts
2
+ const SIGMA_SPACE: 5 = 5;
3
+ ```
@@ -0,0 +1,3 @@
1
+ ```ts
2
+ const STRONG_EDGE_BLUR_AMOUNT: 2 = 2;
3
+ ```
@@ -0,0 +1,19 @@
1
+ ```ts
2
+ const cloneImageRecord: (image) => Promise<{
3
+ image: ImageBitmap;
4
+ key: string;
5
+ }>;
6
+ ```
7
+
8
+ ## Parameters
9
+
10
+ | Parameter | Type |
11
+ | ------ | ------ |
12
+ | `image` | [`ImageRecord`](../interfaces/ImageRecord.mdx) |
13
+
14
+ ## Returns
15
+
16
+ `Promise`\<\{
17
+ `image`: `ImageBitmap`;
18
+ `key`: `string`;
19
+ \}\>
@@ -0,0 +1,18 @@
1
+ ```ts
2
+ const compareImageRecords: (a, b) => boolean;
3
+ ```
4
+
5
+ Compare provided ImageRecord
6
+
7
+ ## Parameters
8
+
9
+ | Parameter | Type |
10
+ | ------ | ------ |
11
+ | `a` | [`ImageRecord`](../interfaces/ImageRecord.mdx) |
12
+ | `b` | [`ImageRecord`](../interfaces/ImageRecord.mdx) \| `undefined` |
13
+
14
+ ## Returns
15
+
16
+ `boolean`
17
+
18
+ true if the two records have the same key and image, false otherwise
@@ -14,7 +14,7 @@ const createRemoteImageBitmap: (map?) => object;
14
14
 
15
15
  | Name | Type |
16
16
  | ------ | ------ |
17
- | `tryFetchingImage()` | (`uri`) => `Promise`\<`ImageBitmap` \| `null`\> |
17
+ | `tryFetchingImage()` | (`uri`, `abortSignal`) => `Promise`\<`ImageBitmap` \| `null` \| `undefined`\> |
18
18
  | `setImage()` | (`uri`, `image`) => `void` |
19
19
  | `getImage()` | (`uri`) => `ImageBitmap` \| `null` |
20
20
  | `removeImage()` | (`uri`) => `boolean` |
@@ -0,0 +1,14 @@
1
+ ```ts
2
+ const getCanvasRenderingContext2D: (canvas, options?) => OffscreenCanvasRenderingContext2D;
3
+ ```
4
+
5
+ ## Parameters
6
+
7
+ | Parameter | Type |
8
+ | ------ | ------ |
9
+ | `canvas` | `OffscreenCanvas` |
10
+ | `options?` | `CanvasRenderingContext2DOptions` |
11
+
12
+ ## Returns
13
+
14
+ `OffscreenCanvasRenderingContext2D`
@@ -0,0 +1,13 @@
1
+ ```ts
2
+ const getImageSize: (image) => Size;
3
+ ```
4
+
5
+ ## Parameters
6
+
7
+ | Parameter | Type |
8
+ | ------ | ------ |
9
+ | `image` | `CanvasImageSource` |
10
+
11
+ ## Returns
12
+
13
+ `Size`
@@ -0,0 +1,13 @@
1
+ ```ts
2
+ const isRenderOptionsKey: (k) => k is keyof RendererOptions;
3
+ ```
4
+
5
+ ## Parameters
6
+
7
+ | Parameter | Type |
8
+ | ------ | ------ |
9
+ | `k` | `unknown` |
10
+
11
+ ## Returns
12
+
13
+ `k is keyof RendererOptions`
@@ -0,0 +1,13 @@
1
+ ```ts
2
+ const isValidGpuAPI: (t) => t is RenderBackend;
3
+ ```
4
+
5
+ ## Parameters
6
+
7
+ | Parameter | Type |
8
+ | ------ | ------ |
9
+ | `t` | `unknown` |
10
+
11
+ ## Returns
12
+
13
+ `t is RenderBackend`
@@ -0,0 +1,8 @@
1
+ import type { TextureInfo } from './types';
2
+ /**
3
+ * Create a binary mask renderer based on the provided threshold
4
+ */
5
+ export declare const createBinaryMaskRenderer: (processor: OffscreenCanvas, width: number, height: number) => {
6
+ render: (mask: TextureInfo, threshold: number) => TextureInfo;
7
+ release: () => void;
8
+ };
@@ -0,0 +1,95 @@
1
+ import { assert } from '@pexip/utils';
2
+ import { m3 } from '../../m3';
3
+ import { RENDERING_EVENTS } from '../../constants';
4
+ import { createGLProgram, createMaskTexture, createFrameBuffer, } from './webglUtils';
5
+ import vertexSrc from './shaders/matrix.vert';
6
+ import fragmentSrc from './shaders/binaryMask.frag';
7
+ /**
8
+ * Create a binary mask renderer based on the provided threshold
9
+ */
10
+ export const createBinaryMaskRenderer = (processor, width, height) => {
11
+ const { gl, program, attribLocations, uniformLocations, floatFullChannelSupported, floatSingleChannelSupported, release, } = createGLProgram(processor, {
12
+ attribs: {
13
+ position: 'a_position',
14
+ texCoord: 'a_texCoord',
15
+ },
16
+ uniforms: {
17
+ matrix: 'u_matrix',
18
+ mask: 'u_mask',
19
+ size: 'u_size',
20
+ threshold: 'u_threshold',
21
+ },
22
+ vertexSrc,
23
+ fragmentSrc,
24
+ });
25
+ const vao = gl.createVertexArray();
26
+ gl.bindVertexArray(vao);
27
+ // Position
28
+ const positionBuffer = gl.createBuffer();
29
+ gl.enableVertexAttribArray(attribLocations.position);
30
+ gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
31
+ gl.vertexAttribPointer(attribLocations.position, 2, gl.FLOAT, false, 0, 0);
32
+ gl.bufferData(gl.ARRAY_BUFFER,
33
+ // prettier-ignore
34
+ new Float32Array([
35
+ 0, 0,
36
+ 0, 1,
37
+ 1, 0,
38
+ 1, 0,
39
+ 0, 1,
40
+ 1, 1,
41
+ ]), gl.STATIC_DRAW);
42
+ // Texture coordinates for the rectangle
43
+ const texCoordBuffer = gl.createBuffer();
44
+ gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer);
45
+ gl.bufferData(gl.ARRAY_BUFFER,
46
+ // prettier-ignore
47
+ new Float32Array([
48
+ 0, 0,
49
+ 0, 1,
50
+ 1, 0,
51
+ 1, 0,
52
+ 0, 1,
53
+ 1, 1,
54
+ ]), gl.STATIC_DRAW);
55
+ gl.enableVertexAttribArray(attribLocations.texCoord);
56
+ gl.vertexAttribPointer(attribLocations.texCoord, 2, gl.FLOAT, false, 0, 0);
57
+ const outputTexture = createMaskTexture(gl, width, height, false, floatSingleChannelSupported, floatFullChannelSupported);
58
+ const frameBuffer = createFrameBuffer(gl, outputTexture);
59
+ return {
60
+ render: (mask, threshold) => {
61
+ assert(!gl.isContextLost(), RENDERING_EVENTS.ContextLost);
62
+ gl.clearColor(0, 0, 0, 0);
63
+ gl.clear(gl.COLOR_BUFFER_BIT);
64
+ gl.useProgram(program);
65
+ gl.bindVertexArray(vao);
66
+ gl.bindFramebuffer(gl.FRAMEBUFFER, frameBuffer);
67
+ gl.viewport(0, 0, width, height);
68
+ // Textures
69
+ gl.activeTexture(gl.TEXTURE0);
70
+ gl.uniform1i(uniformLocations.mask, 0);
71
+ gl.bindTexture(gl.TEXTURE_2D, mask.texture);
72
+ gl.uniform2i(uniformLocations.size, mask.width, mask.height);
73
+ gl.uniform1f(uniformLocations.threshold, threshold);
74
+ // No Flip Y Coordinate for drawing on the frame buffer
75
+ // Project, position and scale to full-size of the canvas
76
+ const matrix = m3.projection(1, 1, 1);
77
+ gl.uniformMatrix3fv(uniformLocations.matrix, false, matrix);
78
+ gl.drawArrays(gl.TRIANGLES, 0, 6);
79
+ // Cleanup
80
+ gl.bindBuffer(gl.ARRAY_BUFFER, null);
81
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
82
+ gl.bindTexture(gl.TEXTURE_2D, null);
83
+ gl.bindVertexArray(null);
84
+ return { texture: outputTexture, width, height };
85
+ },
86
+ release: () => {
87
+ gl.deleteBuffer(positionBuffer);
88
+ gl.deleteBuffer(texCoordBuffer);
89
+ gl.deleteTexture(outputTexture);
90
+ gl.deleteFramebuffer(frameBuffer);
91
+ gl.deleteVertexArray(vao);
92
+ release();
93
+ },
94
+ };
95
+ };
@@ -1,3 +1,4 @@
1
+ import type { RendererOptions } from '../../types/render';
1
2
  import type { TextureInfo } from './types';
2
3
  /**
3
4
  * Blend foreground and background according to the mask
@@ -7,6 +8,6 @@ export declare const createBlendRenderer: (processor: OffscreenCanvas) => {
7
8
  mask: TextureInfo;
8
9
  foreground: TextureInfo;
9
10
  background: TextureInfo;
10
- }) => TextureInfo;
11
+ }, options: RendererOptions) => TextureInfo;
11
12
  release: () => void;
12
13
  };
@@ -1,26 +1,27 @@
1
1
  import { assert } from '@pexip/utils';
2
2
  import { RENDERING_EVENTS } from '../../constants';
3
3
  import { m3 } from '../../m3';
4
- import { createGLProgram, createAndSetupTexture } from './webglUtils';
5
- import { vertexShaderSource } from './shaders/vertexShader';
6
- import { blendFragmentShaderSource } from './shaders/blendFragmentShader';
4
+ import { createFrameBuffer, createGLProgram, createRGBAFrameTexture, } from './webglUtils';
5
+ import vertexSrc from './shaders/matrix.vert';
6
+ import fragmentSrc from './shaders/blend.frag';
7
7
  /**
8
8
  * Blend foreground and background according to the mask
9
9
  */
10
10
  export const createBlendRenderer = (processor) => {
11
- const { gl, program, attribLocations, uniformLocations, release } = createGLProgram(processor, {
11
+ const { gl, program, attribLocations, floatFullChannelSupported, uniformLocations, release, } = createGLProgram(processor, {
12
12
  attribs: {
13
13
  position: 'a_position',
14
14
  texCoord: 'a_texCoord',
15
15
  },
16
16
  uniforms: {
17
17
  matrix: 'u_matrix',
18
+ mask: 'u_mask',
18
19
  frameBackground: 'u_frame_background',
19
20
  frameForeground: 'u_frame_foreground',
20
- mask: 'u_mask',
21
+ confidenceThresholds: 'u_confidence_thresholds',
21
22
  },
22
- vertexSrc: vertexShaderSource,
23
- fragmentSrc: blendFragmentShaderSource,
23
+ vertexSrc,
24
+ fragmentSrc,
24
25
  });
25
26
  gl.enable(gl.BLEND);
26
27
  const vao = gl.createVertexArray();
@@ -55,18 +56,16 @@ export const createBlendRenderer = (processor) => {
55
56
  ]), gl.STATIC_DRAW);
56
57
  gl.enableVertexAttribArray(attribLocations.texCoord);
57
58
  gl.vertexAttribPointer(attribLocations.texCoord, 2, gl.FLOAT, false, 0, 0);
58
- const outputTexture = createAndSetupTexture(gl);
59
- gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, processor.width, processor.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
60
- const frameBuffer = gl.createFramebuffer();
61
- gl.bindFramebuffer(gl.FRAMEBUFFER, frameBuffer);
62
- gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, outputTexture, 0);
59
+ const outputTexture = createRGBAFrameTexture(gl, processor.width, processor.height, true, floatFullChannelSupported);
60
+ const frameBuffer = createFrameBuffer(gl, outputTexture);
63
61
  return {
64
- render: ({ mask, foreground, background, }) => {
62
+ render: ({ mask, foreground, background, }, options) => {
65
63
  assert(!gl.isContextLost(), RENDERING_EVENTS.ContextLost);
64
+ gl.useProgram(program);
66
65
  gl.bindFramebuffer(gl.FRAMEBUFFER, frameBuffer);
67
66
  gl.viewport(0, 0, processor.width, processor.height);
68
- gl.useProgram(program);
69
67
  gl.bindVertexArray(vao);
68
+ gl.uniform2f(uniformLocations.confidenceThresholds, options.backgroundThreshold, options.foregroundThreshold);
70
69
  // Textures
71
70
  gl.activeTexture(gl.TEXTURE0);
72
71
  gl.uniform1i(uniformLocations.frameForeground, 0);
@@ -82,7 +81,11 @@ export const createBlendRenderer = (processor) => {
82
81
  const matrix = m3.projection(1, 1, 1);
83
82
  gl.uniformMatrix3fv(uniformLocations.matrix, false, matrix);
84
83
  gl.drawArrays(gl.TRIANGLES, 0, 6);
85
- assert(outputTexture);
84
+ // Cleanup
85
+ gl.bindBuffer(gl.ARRAY_BUFFER, null);
86
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
87
+ gl.bindTexture(gl.TEXTURE_2D, null);
88
+ gl.bindVertexArray(null);
86
89
  return {
87
90
  texture: outputTexture,
88
91
  width: processor.width,
@@ -2,7 +2,7 @@ import type { TextureInfo } from './types';
2
2
  /**
3
3
  * Blur provided frame
4
4
  */
5
- export declare const createBlurRenderer: (processor: OffscreenCanvas, pass: number) => {
5
+ export declare const createBlurRenderer: (processor: OffscreenCanvas, pass: number, redOnly?: boolean) => {
6
6
  render: (frame: TextureInfo, pass: number) => TextureInfo;
7
7
  release: () => void;
8
8
  };
@@ -2,15 +2,15 @@ import { assert } from '@pexip/utils';
2
2
  import { clamping } from '../../utils';
3
3
  import { RENDERING_EVENTS } from '../../constants';
4
4
  import { m3 } from '../../m3';
5
- import { createAndSetupTexture, createGLProgram } from './webglUtils';
6
- import { vertexShaderSource } from './shaders/vertexShader';
7
- import { dualFilterBlurFragmentShaderSource } from './shaders/dualFilterBlurFragmentShader';
5
+ import { createFrameBuffer, createGLProgram, createMaskTexture, createRGBAFrameTexture, } from './webglUtils';
6
+ import vertexSrc from './shaders/matrix.vert';
7
+ import fragmentSrc from './shaders/dualFilterBlur.frag';
8
8
  const clampBlurAmount = clamping(1, 9);
9
9
  /**
10
10
  * Blur provided frame
11
11
  */
12
- export const createBlurRenderer = (processor, pass) => {
13
- const { gl, program, attribLocations, uniformLocations, release } = createGLProgram(processor, {
12
+ export const createBlurRenderer = (processor, pass, redOnly = false) => {
13
+ const { gl, program, attribLocations, uniformLocations, floatSingleChannelSupported, floatFullChannelSupported, release, } = createGLProgram(processor, {
14
14
  attribs: {
15
15
  position: 'a_position',
16
16
  texCoord: 'a_texCoord',
@@ -20,8 +20,8 @@ export const createBlurRenderer = (processor, pass) => {
20
20
  downsampling: 'u_downsampling',
21
21
  frame: 'u_frame',
22
22
  },
23
- vertexSrc: vertexShaderSource,
24
- fragmentSrc: dualFilterBlurFragmentShaderSource,
23
+ vertexSrc,
24
+ fragmentSrc,
25
25
  });
26
26
  const vao = gl.createVertexArray();
27
27
  gl.bindVertexArray(vao);
@@ -61,18 +61,13 @@ export const createBlurRenderer = (processor, pass) => {
61
61
  gl.viewport(0, 0, width, height);
62
62
  };
63
63
  const createFramebufferAndTexture = (idx) => {
64
- const texture = createAndSetupTexture(gl);
65
- assert(texture);
66
64
  // Avoid fractional value
67
65
  const width = Math.trunc(processor.width / 2 ** idx);
68
66
  const height = Math.trunc(processor.height / 2 ** idx);
69
- gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
70
- const frameBuffer = gl.createFramebuffer();
71
- assert(frameBuffer);
72
- gl.bindFramebuffer(gl.FRAMEBUFFER, frameBuffer);
73
- // Attach a texture to it.
74
- const attachmentPoint = gl.COLOR_ATTACHMENT0;
75
- gl.framebufferTexture2D(gl.FRAMEBUFFER, attachmentPoint, gl.TEXTURE_2D, texture, 0);
67
+ const texture = redOnly
68
+ ? createMaskTexture(gl, width, height, true, floatSingleChannelSupported, floatFullChannelSupported)
69
+ : createRGBAFrameTexture(gl, width, height, true, floatFullChannelSupported);
70
+ const frameBuffer = createFrameBuffer(gl, texture);
76
71
  return { texture, frameBuffer, width, height };
77
72
  };
78
73
  const generateBlurBuffers = (pass, offset = 0) => {
@@ -87,6 +82,13 @@ export const createBlurRenderer = (processor, pass) => {
87
82
  return {
88
83
  render: (frame, pass) => {
89
84
  assert(!gl.isContextLost(), RENDERING_EVENTS.ContextLost);
85
+ if (!pass) {
86
+ return {
87
+ texture: frame.texture,
88
+ width: frame.width,
89
+ height: frame.height,
90
+ };
91
+ }
90
92
  gl.useProgram(program);
91
93
  gl.bindVertexArray(vao);
92
94
  // Frame texture
@@ -153,6 +155,11 @@ export const createBlurRenderer = (processor, pass) => {
153
155
  // for the next draw, use the texture we just rendered to.
154
156
  gl.bindTexture(gl.TEXTURE_2D, texture);
155
157
  }
158
+ // Cleanup
159
+ gl.bindBuffer(gl.ARRAY_BUFFER, null);
160
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
161
+ gl.bindTexture(gl.TEXTURE_2D, null);
162
+ gl.bindVertexArray(null);
156
163
  return {
157
164
  texture: blurBuffers[0]?.texture ?? frame.texture,
158
165
  width: blurBuffers[0]?.width ?? frame.width,
@@ -2,8 +2,8 @@ import { assert } from '@pexip/utils';
2
2
  import { m3 } from '../../m3';
3
3
  import { RENDERING_EVENTS } from '../../constants';
4
4
  import { createGLProgram } from './webglUtils';
5
- import { vertexShaderSource } from './shaders/vertexShader';
6
- import { textureFragmentShaderSource } from './shaders/textureFragmentShader';
5
+ import vertexSrc from './shaders/matrix.vert';
6
+ import fragmentSrc from './shaders/texture.frag';
7
7
  /**
8
8
  * Render texture to the processing canvas framebuffer
9
9
  */
@@ -17,8 +17,8 @@ export const createCanvasRenderer = (processor) => {
17
17
  matrix: 'u_matrix',
18
18
  texture: 'u_texture',
19
19
  },
20
- vertexSrc: vertexShaderSource,
21
- fragmentSrc: textureFragmentShaderSource,
20
+ vertexSrc,
21
+ fragmentSrc,
22
22
  });
23
23
  const vao = gl.createVertexArray();
24
24
  gl.bindVertexArray(vao);
@@ -72,6 +72,11 @@ export const createCanvasRenderer = (processor) => {
72
72
  gl.activeTexture(gl.TEXTURE0);
73
73
  gl.bindTexture(gl.TEXTURE_2D, texture.texture);
74
74
  gl.drawArrays(gl.TRIANGLES, 0, 6);
75
+ // Cleanup
76
+ gl.bindBuffer(gl.ARRAY_BUFFER, null);
77
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
78
+ gl.bindTexture(gl.TEXTURE_2D, null);
79
+ gl.bindVertexArray(null);
75
80
  },
76
81
  release: () => {
77
82
  gl.deleteBuffer(positionBuffer);
@@ -0,0 +1,10 @@
1
+ import type { TextureInfo } from './types';
2
+ /**
3
+ * Create absulute difference renderer to caculate the difference between 2 textures
4
+ */
5
+ export declare const createDiffAbsRenderer: (processor: OffscreenCanvas, width: number, height: number) => {
6
+ render: (textureA: TextureInfo, textureB: TextureInfo) => TextureInfo & {
7
+ frameBuffer: WebGLFramebuffer;
8
+ };
9
+ release: () => void;
10
+ };