@livedigital/client 3.11.0 → 3.11.1
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.
- package/README.md +8 -7
- package/dist/engine/media/streamEffects/video/virtual-background/TensorFlowLoader.d.ts +13 -0
- package/dist/engine/media/streamEffects/video/virtual-background/TrackProcessor.d.ts +16 -0
- package/dist/engine/media/streamEffects/video/virtual-background/constants.d.ts +7 -0
- package/dist/engine/media/streamEffects/video/virtual-background/helpers/buildTimerWorker.d.ts +5 -0
- package/dist/engine/media/streamEffects/video/virtual-background/pipelines/canvas2d/canvas2dPipeline.d.ts +13 -0
- package/dist/engine/media/streamEffects/video/virtual-background/pipelines/helpers/webglHelper.d.ts +8 -0
- package/dist/engine/media/streamEffects/video/virtual-background/pipelines/webgl2/backgroundBlurStage.d.ts +6 -0
- package/dist/engine/media/streamEffects/video/virtual-background/pipelines/webgl2/backgroundImageStage.d.ts +9 -0
- package/dist/engine/media/streamEffects/video/virtual-background/pipelines/webgl2/buildJointBilateralFilterStage.d.ts +7 -0
- package/dist/engine/media/streamEffects/video/virtual-background/pipelines/webgl2/buildLoadSegmentationStage.d.ts +5 -0
- package/dist/engine/media/streamEffects/video/virtual-background/pipelines/webgl2/buildResizingStage.d.ts +5 -0
- package/dist/engine/media/streamEffects/video/virtual-background/pipelines/webgl2/buildSoftmaxStage.d.ts +5 -0
- package/dist/engine/media/streamEffects/video/virtual-background/pipelines/webgl2/webgl2Pipeline.d.ts +14 -0
- package/dist/engine/media/streamEffects/video/virtual-background/types.d.ts +81 -0
- package/dist/engine/media/tracks/DefaultVideoTrack.d.ts +3 -7
- package/dist/index.es.js +226 -2
- package/dist/index.js +226 -2
- package/dist/types/common.d.ts +0 -2
- package/dist/types/media.d.ts +2 -7
- package/package.json +2 -2
- package/src/engine/index.ts +2 -2
- package/src/engine/media/index.ts +2 -2
- package/src/engine/media/streamEffects/video/virtual-background/TensorFlowLoader.ts +89 -0
- package/src/engine/media/streamEffects/video/virtual-background/TrackProcessor.ts +161 -0
- package/src/engine/media/streamEffects/video/virtual-background/constants.ts +62 -0
- package/src/engine/media/streamEffects/video/virtual-background/helpers/buildTimerWorker.ts +42 -0
- package/src/engine/media/streamEffects/video/virtual-background/pipelines/canvas2d/canvas2dPipeline.ts +159 -0
- package/src/engine/media/streamEffects/video/virtual-background/pipelines/helpers/webglHelper.ts +133 -0
- package/src/engine/media/streamEffects/video/virtual-background/pipelines/webgl2/backgroundBlurStage.ts +292 -0
- package/src/engine/media/streamEffects/video/virtual-background/pipelines/webgl2/backgroundImageStage.ts +221 -0
- package/src/engine/media/streamEffects/video/virtual-background/pipelines/webgl2/buildJointBilateralFilterStage.ts +158 -0
- package/src/engine/media/streamEffects/video/virtual-background/pipelines/webgl2/buildLoadSegmentationStage.ts +103 -0
- package/src/engine/media/streamEffects/video/virtual-background/pipelines/webgl2/buildResizingStage.ts +111 -0
- package/src/engine/media/streamEffects/video/virtual-background/pipelines/webgl2/buildSoftmaxStage.ts +106 -0
- package/src/engine/media/streamEffects/video/virtual-background/pipelines/webgl2/webgl2Pipeline.ts +217 -0
- package/src/engine/media/streamEffects/video/virtual-background/types.ts +94 -0
- package/src/engine/media/tracks/DefaultVideoTrack.ts +35 -27
- package/src/types/common.ts +0 -2
- package/src/types/media.ts +2 -7
- package/dist/engine/media/streamEffects/video/esdk/TrackProcessor.d.ts +0 -47
- package/dist/engine/media/streamEffects/video/esdk/types.d.ts +0 -3
- package/src/engine/media/streamEffects/video/esdk/TrackProcessor.ts +0 -309
- package/src/engine/media/streamEffects/video/esdk/components/component.d.ts +0 -33
- package/src/engine/media/streamEffects/video/esdk/components/countdown/countdown.d.ts +0 -29
- package/src/engine/media/streamEffects/video/esdk/components/lower-third/collection/doubleSlideRect.d.ts +0 -34
- package/src/engine/media/streamEffects/video/esdk/components/lower-third/collection/horizontalMirror.d.ts +0 -30
- package/src/engine/media/streamEffects/video/esdk/components/lower-third/collection/leftTextbox.d.ts +0 -32
- package/src/engine/media/streamEffects/video/esdk/components/lower-third/collection/slideBold.d.ts +0 -42
- package/src/engine/media/streamEffects/video/esdk/components/lower-third/collection/twoSideRects/animatedBox.d.ts +0 -59
- package/src/engine/media/streamEffects/video/esdk/components/lower-third/collection/twoSideRects/twoSlideRects.d.ts +0 -28
- package/src/engine/media/streamEffects/video/esdk/components/lower-third/lowerThird.d.ts +0 -86
- package/src/engine/media/streamEffects/video/esdk/components/overlay-screen/overlayScreen.d.ts +0 -43
- package/src/engine/media/streamEffects/video/esdk/components/stickers/stickerSprite.d.ts +0 -49
- package/src/engine/media/streamEffects/video/esdk/components/stickers/stickers.d.ts +0 -59
- package/src/engine/media/streamEffects/video/esdk/components/waterMark/waterMark.d.ts +0 -17
- package/src/engine/media/streamEffects/video/esdk/tsvb.d.ts +0 -173
- package/src/engine/media/streamEffects/video/esdk/types.ts +0 -3
- package/src/engine/media/streamEffects/video/esdk/utils/errorBus.d.ts +0 -42
package/README.md
CHANGED
|
@@ -19,9 +19,10 @@ const client = new Client();
|
|
|
19
19
|
|
|
20
20
|
## Plugins
|
|
21
21
|
Now you can use the noise reduction and virtual backgrounds functionality. To do this, copy all the files from the
|
|
22
|
-
/files directory to the root directory of your project, and add
|
|
22
|
+
/files directory to the root directory of your project, and add tflite loader scripts to your index.html
|
|
23
23
|
```
|
|
24
|
-
<script src="%PUBLIC_URL%/
|
|
24
|
+
<script src="%PUBLIC_URL%/tflite/tflite.js"></script>
|
|
25
|
+
<script src="%PUBLIC_URL%/tflite/tflite-simd.js"></script>
|
|
25
26
|
```
|
|
26
27
|
|
|
27
28
|
## Debugging
|
|
@@ -30,17 +31,17 @@ LiveDigital client uses the [debug](https://www.npmjs.com/package/debug) module
|
|
|
30
31
|
|
|
31
32
|
There are three log severities:
|
|
32
33
|
|
|
33
|
-
- **debug**: verbose information logged to console.info
|
|
34
|
-
- **warn**: warning messages logged to console.warn
|
|
35
|
-
- **error**: error messages logged to console.error
|
|
34
|
+
- **debug**: verbose information logged to console.info
|
|
35
|
+
- **warn**: warning messages logged to console.warn
|
|
36
|
+
- **error**: error messages logged to console.error
|
|
36
37
|
|
|
37
38
|
All the logs generated by LiveDigital client have a namespace starting with “LiveDigital”
|
|
38
39
|
plus colon, followed by the log severity in upper case plus colon (just if “warn” or “error”),
|
|
39
|
-
and followed by the internal component name (if any) and the log message.
|
|
40
|
+
and followed by the internal component name (if any) and the log message.
|
|
40
41
|
|
|
41
42
|
### Enable Logging
|
|
42
43
|
By default, logging is turned off. In order to enable it, the debug key in the browser's
|
|
43
|
-
localStorage must be set.
|
|
44
|
+
localStorage must be set.
|
|
44
45
|
>Check the [debug](https://www.npmjs.com/package/debug) module documentation for further information regarding how to filter specific log messages based on namespace matching rules.
|
|
45
46
|
|
|
46
47
|
### Example
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { LogLevel } from '../../../../../types/common';
|
|
2
|
+
import { SegmentationConfig, TFLite } from './types';
|
|
3
|
+
export default class TensorFlowLoader {
|
|
4
|
+
#private;
|
|
5
|
+
constructor(logLevel: LogLevel);
|
|
6
|
+
get isLoaded(): boolean;
|
|
7
|
+
get tfliteModule(): TFLite | undefined;
|
|
8
|
+
loadTFLite(): Promise<void>;
|
|
9
|
+
loadTFLiteModel(segmentationConfig: SegmentationConfig): Promise<void>;
|
|
10
|
+
private loadTFLiteRegular;
|
|
11
|
+
private loadTFLiteSIMD;
|
|
12
|
+
private static getTFLiteModelFileName;
|
|
13
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { GetProcessedTrackParams } from './types';
|
|
2
|
+
import { LogLevel } from '../../../../../types/common';
|
|
3
|
+
interface VideoTrackProcessorParams {
|
|
4
|
+
logLevel: LogLevel;
|
|
5
|
+
}
|
|
6
|
+
export default class TrackProcessor {
|
|
7
|
+
#private;
|
|
8
|
+
constructor(params: VideoTrackProcessorParams);
|
|
9
|
+
get isProcessing(): boolean;
|
|
10
|
+
processTrack(params: GetProcessedTrackParams): Promise<MediaStreamTrack>;
|
|
11
|
+
stopProcessing(): void;
|
|
12
|
+
private static buildWebGL2Pipeline;
|
|
13
|
+
private static buildCanvas2dPipeline;
|
|
14
|
+
private static buildSourcePlayback;
|
|
15
|
+
}
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { InputResolution, PipeLineConfig } from './types';
|
|
2
|
+
export declare const INPUT_RESOLUTIONS: {
|
|
3
|
+
[resolution in InputResolution]: [number, number];
|
|
4
|
+
};
|
|
5
|
+
export declare const BLUR_PIPELINE_CONFIG: PipeLineConfig;
|
|
6
|
+
export declare const BLUR_IN_BACKGROUND_TASK_PIPELINE_CONFIG: PipeLineConfig;
|
|
7
|
+
export declare const SAFARI_BLUR_PIPELINE_CONFIG: PipeLineConfig;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { BackgroundConfig, SourcePlayback, PostProcessingConfig, SegmentationConfig, TFLite } from '../../types';
|
|
2
|
+
export interface BuildCanvas2dPipeLineParams {
|
|
3
|
+
sourcePlayback: SourcePlayback;
|
|
4
|
+
backgroundConfig: BackgroundConfig;
|
|
5
|
+
segmentationConfig: SegmentationConfig;
|
|
6
|
+
canvas: HTMLCanvasElement;
|
|
7
|
+
tflite: TFLite;
|
|
8
|
+
}
|
|
9
|
+
export default function buildCanvas2dPipeline({ sourcePlayback, backgroundConfig, segmentationConfig, canvas, tflite, }: BuildCanvas2dPipeLineParams): {
|
|
10
|
+
render: () => Promise<void>;
|
|
11
|
+
updatePostProcessingConfig: (newPostProcessingConfig: PostProcessingConfig) => void;
|
|
12
|
+
cleanUp: () => void;
|
|
13
|
+
};
|
package/dist/engine/media/streamEffects/video/virtual-background/pipelines/helpers/webglHelper.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare const glsl: (template: {
|
|
2
|
+
raw: readonly string[] | ArrayLike<string>;
|
|
3
|
+
}, ...substitutions: any[]) => string;
|
|
4
|
+
export declare function createProgram(gl: WebGL2RenderingContext, vertexShader: WebGLShader, fragmentShader: WebGLShader): WebGLProgram;
|
|
5
|
+
export declare function compileShader(gl: WebGL2RenderingContext, shaderType: number, shaderSource: string): WebGLShader;
|
|
6
|
+
export declare function createTexture(gl: WebGL2RenderingContext, internalformat: number, width: number, height: number, minFilter?: number, magFilter?: number): WebGLTexture | null;
|
|
7
|
+
export declare function readPixelsAsync(gl: WebGL2RenderingContext, x: number, y: number, width: number, height: number, format: number, type: number, dest: ArrayBufferView): Promise<ArrayBufferView>;
|
|
8
|
+
export declare function createPiplelineStageProgram(gl: WebGL2RenderingContext, vertexShader: WebGLShader, fragmentShader: WebGLShader, positionBuffer: WebGLBuffer, texCoordBuffer: WebGLBuffer): WebGLProgram;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare type BackgroundBlurStage = {
|
|
2
|
+
render(): void;
|
|
3
|
+
updateCoverage(coverage: [number, number]): void;
|
|
4
|
+
cleanUp(): void;
|
|
5
|
+
};
|
|
6
|
+
export declare function buildBackgroundBlurStage(gl: WebGL2RenderingContext, vertexShader: WebGLShader, positionBuffer: WebGLBuffer, texCoordBuffer: WebGLBuffer, personMaskTexture: WebGLTexture, canvas: HTMLCanvasElement): BackgroundBlurStage;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { BlendMode } from '../../types';
|
|
2
|
+
export declare type BackgroundImageStage = {
|
|
3
|
+
render(): void;
|
|
4
|
+
updateCoverage(coverage: [number, number]): void;
|
|
5
|
+
updateLightWrapping(lightWrapping: number): void;
|
|
6
|
+
updateBlendMode(blendMode: BlendMode): void;
|
|
7
|
+
cleanUp(): void;
|
|
8
|
+
};
|
|
9
|
+
export declare function buildBackgroundImageStage(gl: WebGL2RenderingContext, positionBuffer: WebGLBuffer, texCoordBuffer: WebGLBuffer, personMaskTexture: WebGLTexture, backgroundImage: HTMLImageElement | null, canvas: HTMLCanvasElement): BackgroundImageStage;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { SegmentationConfig } from '../../types';
|
|
2
|
+
export default function buildJointBilateralFilterStage(gl: WebGL2RenderingContext, vertexShader: WebGLShader, positionBuffer: WebGLBuffer, texCoordBuffer: WebGLBuffer, inputTexture: WebGLTexture, segmentationConfig: SegmentationConfig, outputTexture: WebGLTexture, canvas: HTMLCanvasElement): {
|
|
3
|
+
render: () => void;
|
|
4
|
+
updateSigmaSpace: (sigmaSpace: number) => void;
|
|
5
|
+
updateSigmaColor: (sigmaColor: number) => void;
|
|
6
|
+
cleanUp: () => void;
|
|
7
|
+
};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { SegmentationConfig, TFLite } from '../../types';
|
|
2
|
+
export default function buildLoadSegmentationStage(gl: WebGL2RenderingContext, vertexShader: WebGLShader, positionBuffer: WebGLBuffer, texCoordBuffer: WebGLBuffer, segmentationConfig: SegmentationConfig, tflite: TFLite, outputTexture: WebGLTexture): {
|
|
3
|
+
render: () => void;
|
|
4
|
+
cleanUp: () => void;
|
|
5
|
+
};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { SegmentationConfig, TFLite } from '../../types';
|
|
2
|
+
export default function buildResizingStage(gl: WebGL2RenderingContext, vertexShader: WebGLShader, positionBuffer: WebGLBuffer, texCoordBuffer: WebGLBuffer, segmentationConfig: SegmentationConfig, tflite: TFLite): {
|
|
3
|
+
render: () => Promise<void>;
|
|
4
|
+
cleanUp: () => void;
|
|
5
|
+
};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { SegmentationConfig, TFLite } from '../../types';
|
|
2
|
+
export default function buildSoftmaxStage(gl: WebGL2RenderingContext, vertexShader: WebGLShader, positionBuffer: WebGLBuffer, texCoordBuffer: WebGLBuffer, segmentationConfig: SegmentationConfig, tflite: TFLite, outputTexture: WebGLTexture): {
|
|
3
|
+
render: () => void;
|
|
4
|
+
cleanUp: () => void;
|
|
5
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { SourcePlayback, BackgroundConfig, PostProcessingConfig, SegmentationConfig, TFLite } from '../../types';
|
|
2
|
+
export interface BuildWebGL2PipeLineParams {
|
|
3
|
+
sourcePlayback: SourcePlayback;
|
|
4
|
+
backgroundImage: HTMLImageElement | null;
|
|
5
|
+
backgroundConfig: BackgroundConfig;
|
|
6
|
+
segmentationConfig: SegmentationConfig;
|
|
7
|
+
canvas: HTMLCanvasElement;
|
|
8
|
+
tflite: TFLite;
|
|
9
|
+
}
|
|
10
|
+
export default function buildWebGL2Pipeline({ sourcePlayback, backgroundImage, backgroundConfig, segmentationConfig, canvas, tflite, }: BuildWebGL2PipeLineParams): {
|
|
11
|
+
render: () => Promise<void>;
|
|
12
|
+
updatePostProcessingConfig: (postProcessingConfig: PostProcessingConfig) => void;
|
|
13
|
+
cleanUp: () => void;
|
|
14
|
+
};
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/// <reference types="emscripten" />
|
|
2
|
+
export interface TFLite extends EmscriptenModule {
|
|
3
|
+
_getModelBufferMemoryOffset(): number;
|
|
4
|
+
_getInputMemoryOffset(): number;
|
|
5
|
+
_getInputHeight(): number;
|
|
6
|
+
_getInputWidth(): number;
|
|
7
|
+
_getInputChannelCount(): number;
|
|
8
|
+
_getOutputMemoryOffset(): number;
|
|
9
|
+
_getOutputHeight(): number;
|
|
10
|
+
_getOutputWidth(): number;
|
|
11
|
+
_getOutputChannelCount(): number;
|
|
12
|
+
_loadModel(bufferSize: number): number;
|
|
13
|
+
_runInference(): number;
|
|
14
|
+
}
|
|
15
|
+
export declare type BlendMode = 'screen' | 'linearDodge';
|
|
16
|
+
export interface TimerWorker {
|
|
17
|
+
setTimeout: (callback: () => void, timeoutMs: number) => number;
|
|
18
|
+
clearTimeout: (callbackId: number) => void;
|
|
19
|
+
terminate: () => void;
|
|
20
|
+
}
|
|
21
|
+
export declare type PostProcessingConfig = {
|
|
22
|
+
smoothSegmentationMask: boolean;
|
|
23
|
+
jointBilateralFilter: JointBilateralFilterConfig;
|
|
24
|
+
coverage: [number, number];
|
|
25
|
+
lightWrapping: number;
|
|
26
|
+
blendMode: BlendMode;
|
|
27
|
+
};
|
|
28
|
+
export declare type JointBilateralFilterConfig = {
|
|
29
|
+
sigmaSpace: number;
|
|
30
|
+
sigmaColor: number;
|
|
31
|
+
};
|
|
32
|
+
export declare type SourcePlayback = {
|
|
33
|
+
htmlElement: HTMLImageElement | HTMLVideoElement;
|
|
34
|
+
width: number;
|
|
35
|
+
height: number;
|
|
36
|
+
};
|
|
37
|
+
export declare type BackgroundConfig = {
|
|
38
|
+
type: 'none' | 'blur' | 'image';
|
|
39
|
+
url?: string;
|
|
40
|
+
imageSource: HTMLImageElement | null;
|
|
41
|
+
};
|
|
42
|
+
export declare type PipelineType = 'canvas2dCpu' | 'webgl2';
|
|
43
|
+
export declare type SegmentationModel = 'meet' | 'mlkit';
|
|
44
|
+
export declare type SegmentationBackend = 'webgl' | 'wasm' | 'wasmSimd';
|
|
45
|
+
export declare type InputResolution = '640x360' | '256x256' | '256x144' | '160x96';
|
|
46
|
+
export declare type SegmentationConfig = {
|
|
47
|
+
model: SegmentationModel;
|
|
48
|
+
backend: SegmentationBackend;
|
|
49
|
+
inputResolution: InputResolution;
|
|
50
|
+
pipeline: PipelineType;
|
|
51
|
+
targetFps: number;
|
|
52
|
+
deferInputResizing: boolean;
|
|
53
|
+
};
|
|
54
|
+
export interface PipeLine {
|
|
55
|
+
render: () => Promise<void>;
|
|
56
|
+
updatePostProcessingConfig: (postProcessingConfig: PostProcessingConfig) => void;
|
|
57
|
+
cleanUp: () => void;
|
|
58
|
+
}
|
|
59
|
+
export interface PipeLineConfig {
|
|
60
|
+
backgroundConfig: BackgroundConfig;
|
|
61
|
+
segmentationConfig: SegmentationConfig;
|
|
62
|
+
postprocessingConfig: PostProcessingConfig;
|
|
63
|
+
}
|
|
64
|
+
export interface BuildPipeLineConfig {
|
|
65
|
+
config: PipeLineConfig;
|
|
66
|
+
sourcePlayback: SourcePlayback;
|
|
67
|
+
destinationPlayback: HTMLCanvasElement;
|
|
68
|
+
tflite: TFLite;
|
|
69
|
+
}
|
|
70
|
+
export interface TrackProcessingContext {
|
|
71
|
+
pipeline: PipeLine;
|
|
72
|
+
source: HTMLVideoElement | HTMLImageElement;
|
|
73
|
+
destination: HTMLCanvasElement;
|
|
74
|
+
track: MediaStreamTrack;
|
|
75
|
+
timerWorker: TimerWorker;
|
|
76
|
+
timerId: number;
|
|
77
|
+
}
|
|
78
|
+
export declare type GetProcessedTrackParams = {
|
|
79
|
+
track: MediaStreamTrack;
|
|
80
|
+
pipelineConfig: PipeLineConfig;
|
|
81
|
+
};
|
|
@@ -2,7 +2,6 @@ import { ProducerCodecOptions } from 'mediasoup-client/lib/Producer';
|
|
|
2
2
|
import { RtpEncodingParameters } from 'mediasoup-client/lib/RtpParameters';
|
|
3
3
|
import { VideoCodec, VideoEncoderConfig } from '../../../types/common';
|
|
4
4
|
import DefaultBaseTrack from './DefaultBaseTrack';
|
|
5
|
-
import type { Effects } from '../streamEffects/video/esdk/TrackProcessor';
|
|
6
5
|
import { BaseTrackParams, VideoTrack, VideoTrackPublishParams } from '../../../types/media';
|
|
7
6
|
declare class DefaultVideoTrack extends DefaultBaseTrack implements VideoTrack {
|
|
8
7
|
#private;
|
|
@@ -16,13 +15,10 @@ declare class DefaultVideoTrack extends DefaultBaseTrack implements VideoTrack {
|
|
|
16
15
|
setTransformParams(transformParams: {}): void;
|
|
17
16
|
setMaxSpatialLayer(spatialLayer: number): Promise<void>;
|
|
18
17
|
getMaxSpatialLayer(): number | undefined;
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
enableBlur(): Promise<void>;
|
|
19
|
+
disableBlur(): Promise<void>;
|
|
21
20
|
publish(params?: VideoTrackPublishParams): Promise<void>;
|
|
22
21
|
private watchOrientation;
|
|
23
|
-
|
|
24
|
-
resetEffects(): Promise<void>;
|
|
25
|
-
onEffectReady(callback: () => void): void;
|
|
26
|
-
get effectReadyProgress(): number;
|
|
22
|
+
private watchDocumentVisibility;
|
|
27
23
|
}
|
|
28
24
|
export default DefaultVideoTrack;
|