@remotion/webcodecs 4.0.216 → 4.0.218
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/package.json +2 -2
- package/dist/create-audio-decoder.d.ts +0 -7
- package/dist/create-audio-decoder.js +0 -18
- package/dist/create-encoder.d.ts +0 -9
- package/dist/create-encoder.js +0 -46
- package/dist/create-video-decoder.d.ts +0 -6
- package/dist/create-video-decoder.js +0 -18
- package/dist/get-config.d.ts +0 -2
- package/dist/get-config.js +0 -39
- package/dist/get-description.d.ts +0 -6
- package/dist/get-description.js +0 -20
- package/dist/get-samples.d.ts +0 -6
- package/dist/get-samples.js +0 -24
- package/dist/load-mp4-file.d.ts +0 -8
- package/dist/load-mp4-file.js +0 -37
- package/dist/reencode-video.d.ts +0 -1
- package/dist/reencode-video.js +0 -68
- package/dist/video-parser.d.ts +0 -1
- package/dist/video-parser.js +0 -51
- package/dist/wait-for-dequeue.d.ts +0 -5
- package/dist/wait-for-dequeue.js +0 -49
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@remotion/webcodecs",
|
|
3
|
-
"version": "4.0.
|
|
3
|
+
"version": "4.0.218",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
6
6
|
"module": "dist/esm/index.mjs",
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"author": "Jonny Burger <jonny@remotion.dev>",
|
|
18
18
|
"license": "SEE LICENSE IN LICENSE.md",
|
|
19
19
|
"dependencies": {
|
|
20
|
-
"@remotion/media-parser": "4.0.
|
|
20
|
+
"@remotion/media-parser": "4.0.218"
|
|
21
21
|
},
|
|
22
22
|
"peerDependencies": {},
|
|
23
23
|
"devDependencies": {
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.createAudioDecoder = void 0;
|
|
4
|
-
const createAudioDecoder = ({ onProgress, onFrame, }) => {
|
|
5
|
-
let decodedFrames = 0;
|
|
6
|
-
const decoder = new AudioDecoder({
|
|
7
|
-
output(inputFrame) {
|
|
8
|
-
onFrame(inputFrame);
|
|
9
|
-
inputFrame.close();
|
|
10
|
-
onProgress(++decodedFrames);
|
|
11
|
-
},
|
|
12
|
-
error(error) {
|
|
13
|
-
console.error(error);
|
|
14
|
-
},
|
|
15
|
-
});
|
|
16
|
-
return { decoder };
|
|
17
|
-
};
|
|
18
|
-
exports.createAudioDecoder = createAudioDecoder;
|
package/dist/create-encoder.d.ts
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
/// <reference path="../src/types/mp4box.d.ts" />
|
|
2
|
-
export declare const createEncoder: ({ width, height, onProgress, }: {
|
|
3
|
-
width: number;
|
|
4
|
-
height: number;
|
|
5
|
-
onProgress: (encoded: number) => void;
|
|
6
|
-
}) => {
|
|
7
|
-
encoder: VideoEncoder;
|
|
8
|
-
outputMp4: import("mp4box").MP4File;
|
|
9
|
-
};
|
package/dist/create-encoder.js
DELETED
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.createEncoder = void 0;
|
|
4
|
-
const mp4box_1 = require("mp4box");
|
|
5
|
-
const timescale = 90000;
|
|
6
|
-
const createEncoder = ({ width, height, onProgress, }) => {
|
|
7
|
-
let trackID = null;
|
|
8
|
-
let encodedFrames = 0;
|
|
9
|
-
const outputMp4 = (0, mp4box_1.createFile)();
|
|
10
|
-
const encoder = new VideoEncoder({
|
|
11
|
-
output(chunk, metadata) {
|
|
12
|
-
const uint8 = new Uint8Array(chunk.byteLength);
|
|
13
|
-
chunk.copyTo(uint8);
|
|
14
|
-
if (trackID === null) {
|
|
15
|
-
trackID = outputMp4.addTrack({
|
|
16
|
-
width,
|
|
17
|
-
height,
|
|
18
|
-
timescale,
|
|
19
|
-
avcDecoderConfigRecord: metadata.decoderConfig.description,
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
|
-
if (chunk.duration === null) {
|
|
23
|
-
throw new Error('No duration in the chunk');
|
|
24
|
-
}
|
|
25
|
-
const sampleDuration = chunk.duration / (1000000 / timescale);
|
|
26
|
-
outputMp4.addSample(trackID, uint8, {
|
|
27
|
-
duration: sampleDuration,
|
|
28
|
-
is_sync: chunk.type === 'key',
|
|
29
|
-
});
|
|
30
|
-
encodedFrames++;
|
|
31
|
-
onProgress(encodedFrames);
|
|
32
|
-
},
|
|
33
|
-
error(error) {
|
|
34
|
-
console.error(error);
|
|
35
|
-
},
|
|
36
|
-
});
|
|
37
|
-
encoder.configure({
|
|
38
|
-
codec: 'avc1.4d0034',
|
|
39
|
-
width,
|
|
40
|
-
height,
|
|
41
|
-
hardwareAcceleration: 'prefer-hardware',
|
|
42
|
-
bitrate: 20000000,
|
|
43
|
-
});
|
|
44
|
-
return { encoder, outputMp4 };
|
|
45
|
-
};
|
|
46
|
-
exports.createEncoder = createEncoder;
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.createVideoDecoder = void 0;
|
|
4
|
-
const createVideoDecoder = ({ onProgress, onFrame, }) => {
|
|
5
|
-
let decodedFrames = 0;
|
|
6
|
-
const decoder = new VideoDecoder({
|
|
7
|
-
output(inputFrame) {
|
|
8
|
-
onFrame(inputFrame);
|
|
9
|
-
inputFrame.close();
|
|
10
|
-
onProgress(++decodedFrames);
|
|
11
|
-
},
|
|
12
|
-
error(error) {
|
|
13
|
-
console.error(error);
|
|
14
|
-
},
|
|
15
|
-
});
|
|
16
|
-
return { decoder };
|
|
17
|
-
};
|
|
18
|
-
exports.createVideoDecoder = createVideoDecoder;
|
package/dist/get-config.d.ts
DELETED
package/dist/get-config.js
DELETED
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getVideoEncoderConfigWithHardwareAcceleration = exports.getVideoDecoderConfigWithHardwareAcceleration = void 0;
|
|
4
|
-
const getVideoDecoderConfigWithHardwareAcceleration = async (config) => {
|
|
5
|
-
const hardware = {
|
|
6
|
-
...config,
|
|
7
|
-
hardwareAcceleration: 'prefer-hardware',
|
|
8
|
-
};
|
|
9
|
-
if ((await VideoDecoder.isConfigSupported(hardware)).supported) {
|
|
10
|
-
return hardware;
|
|
11
|
-
}
|
|
12
|
-
const software = {
|
|
13
|
-
...config,
|
|
14
|
-
hardwareAcceleration: 'prefer-software',
|
|
15
|
-
};
|
|
16
|
-
if ((await VideoDecoder.isConfigSupported(software)).supported) {
|
|
17
|
-
return software;
|
|
18
|
-
}
|
|
19
|
-
return null;
|
|
20
|
-
};
|
|
21
|
-
exports.getVideoDecoderConfigWithHardwareAcceleration = getVideoDecoderConfigWithHardwareAcceleration;
|
|
22
|
-
const getVideoEncoderConfigWithHardwareAcceleration = async (config) => {
|
|
23
|
-
const hardware = {
|
|
24
|
-
...config,
|
|
25
|
-
hardwareAcceleration: 'prefer-hardware',
|
|
26
|
-
};
|
|
27
|
-
if ((await VideoEncoder.isConfigSupported(hardware)).supported) {
|
|
28
|
-
return hardware;
|
|
29
|
-
}
|
|
30
|
-
const software = {
|
|
31
|
-
...config,
|
|
32
|
-
hardwareAcceleration: 'prefer-software',
|
|
33
|
-
};
|
|
34
|
-
if ((await VideoEncoder.isConfigSupported(software)).supported) {
|
|
35
|
-
return software;
|
|
36
|
-
}
|
|
37
|
-
return null;
|
|
38
|
-
};
|
|
39
|
-
exports.getVideoEncoderConfigWithHardwareAcceleration = getVideoEncoderConfigWithHardwareAcceleration;
|
package/dist/get-description.js
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getDescription = void 0;
|
|
4
|
-
const mp4box_1 = require("mp4box");
|
|
5
|
-
const getDescription = ({ mp4File, track, }) => {
|
|
6
|
-
const trak = mp4File.getTrackById(track.id);
|
|
7
|
-
for (const entry of trak.mdia.minf.stbl.stsd.entries) {
|
|
8
|
-
if (entry.avcC || entry.hvcC) {
|
|
9
|
-
const stream = new mp4box_1.DataStream(undefined, 0, mp4box_1.DataStream.BIG_ENDIAN);
|
|
10
|
-
if (entry.avcC) {
|
|
11
|
-
entry.avcC.write(stream);
|
|
12
|
-
}
|
|
13
|
-
else if (entry.hvcC) {
|
|
14
|
-
entry.hvcC.write(stream);
|
|
15
|
-
}
|
|
16
|
-
return new Uint8Array(stream.buffer, 8); // Remove the box header.
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
};
|
|
20
|
-
exports.getDescription = getDescription;
|
package/dist/get-samples.d.ts
DELETED
package/dist/get-samples.js
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getSamples = void 0;
|
|
4
|
-
const getSamples = ({ mp4File, track, }) => {
|
|
5
|
-
mp4File.setExtractionOptions(track.id, null, {
|
|
6
|
-
nbSamples: Infinity,
|
|
7
|
-
});
|
|
8
|
-
return new Promise((resolve, reject) => {
|
|
9
|
-
mp4File.onSamples = (track_id, _ref, samples) => {
|
|
10
|
-
if (track_id === track.id) {
|
|
11
|
-
resolve(samples);
|
|
12
|
-
mp4File.onSamples = undefined;
|
|
13
|
-
mp4File.onError = undefined;
|
|
14
|
-
}
|
|
15
|
-
};
|
|
16
|
-
mp4File.onError = (e) => {
|
|
17
|
-
reject(e);
|
|
18
|
-
mp4File.onSamples = undefined;
|
|
19
|
-
mp4File.onError = undefined;
|
|
20
|
-
};
|
|
21
|
-
mp4File.start();
|
|
22
|
-
});
|
|
23
|
-
};
|
|
24
|
-
exports.getSamples = getSamples;
|
package/dist/load-mp4-file.d.ts
DELETED
package/dist/load-mp4-file.js
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.loadMp4File = void 0;
|
|
4
|
-
const mp4box_1 = require("mp4box");
|
|
5
|
-
const readFile = (file) => {
|
|
6
|
-
return new Promise((resolve, reject) => {
|
|
7
|
-
const reader = new FileReader();
|
|
8
|
-
reader.onload = () => {
|
|
9
|
-
reader.result.fileStart = 0;
|
|
10
|
-
resolve(reader.result);
|
|
11
|
-
reader.onerror = null;
|
|
12
|
-
reader.onload = null;
|
|
13
|
-
};
|
|
14
|
-
reader.onerror = (error) => {
|
|
15
|
-
reject(error);
|
|
16
|
-
reader.onerror = null;
|
|
17
|
-
reader.onload = null;
|
|
18
|
-
};
|
|
19
|
-
reader.readAsArrayBuffer(file);
|
|
20
|
-
});
|
|
21
|
-
};
|
|
22
|
-
const loadMp4File = async (file) => {
|
|
23
|
-
const mp4File = (0, mp4box_1.createFile)();
|
|
24
|
-
const arrayBuffer = await readFile(file);
|
|
25
|
-
const prom = new Promise((resolve, reject) => {
|
|
26
|
-
mp4File.onError = (error) => {
|
|
27
|
-
reject(error);
|
|
28
|
-
};
|
|
29
|
-
mp4File.onReady = (info) => {
|
|
30
|
-
resolve({ mp4File, info });
|
|
31
|
-
};
|
|
32
|
-
});
|
|
33
|
-
mp4File.appendBuffer(arrayBuffer);
|
|
34
|
-
mp4File.flush();
|
|
35
|
-
return prom;
|
|
36
|
-
};
|
|
37
|
-
exports.loadMp4File = loadMp4File;
|
package/dist/reencode-video.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare const reencodeVideo: (file: File) => Promise<void>;
|
package/dist/reencode-video.js
DELETED
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.reencodeVideo = void 0;
|
|
4
|
-
const create_encoder_1 = require("./create-encoder");
|
|
5
|
-
const create_video_decoder_1 = require("./create-video-decoder");
|
|
6
|
-
const get_description_1 = require("./get-description");
|
|
7
|
-
const get_samples_1 = require("./get-samples");
|
|
8
|
-
const load_mp4_file_1 = require("./load-mp4-file");
|
|
9
|
-
const reencodeVideo = async (file) => {
|
|
10
|
-
const { info, mp4File } = await (0, load_mp4_file_1.loadMp4File)(file);
|
|
11
|
-
const track = info.videoTracks[0];
|
|
12
|
-
if (!track) {
|
|
13
|
-
throw new Error('No video track found in the file');
|
|
14
|
-
}
|
|
15
|
-
const { encoder, outputMp4 } = (0, create_encoder_1.createEncoder)({
|
|
16
|
-
width: track.track_width,
|
|
17
|
-
height: track.track_height,
|
|
18
|
-
onProgress: (encoded) => {
|
|
19
|
-
const encodingProgress = Math.round((100 * encoded) / track.nb_samples);
|
|
20
|
-
console.log(`Encoding frame ${encoded} (${encodingProgress}%)`);
|
|
21
|
-
},
|
|
22
|
-
});
|
|
23
|
-
let nextKeyFrameTimestamp = 0;
|
|
24
|
-
let keyFrame = false;
|
|
25
|
-
const keyFrameEveryHowManySeconds = 2;
|
|
26
|
-
const { decoder } = (0, create_video_decoder_1.createVideoDecoder)({
|
|
27
|
-
onFrame: (frame) => {
|
|
28
|
-
if (frame.timestamp >= nextKeyFrameTimestamp) {
|
|
29
|
-
keyFrame = true;
|
|
30
|
-
nextKeyFrameTimestamp =
|
|
31
|
-
frame.timestamp + keyFrameEveryHowManySeconds * 1e6;
|
|
32
|
-
}
|
|
33
|
-
encoder.encode(frame, { keyFrame });
|
|
34
|
-
frame.close();
|
|
35
|
-
},
|
|
36
|
-
onProgress: (decoded) => {
|
|
37
|
-
const decodingProgress = Math.round((100 * decoded) / track.nb_samples);
|
|
38
|
-
console.log(`Decoding frame ${decoded} (${decodingProgress}%)`);
|
|
39
|
-
},
|
|
40
|
-
});
|
|
41
|
-
decoder.configure({
|
|
42
|
-
codec: track.codec,
|
|
43
|
-
codedWidth: track.track_width,
|
|
44
|
-
codedHeight: track.track_height,
|
|
45
|
-
// TODO: Check first if hardware acceleration is supported
|
|
46
|
-
hardwareAcceleration: 'prefer-hardware',
|
|
47
|
-
description: (0, get_description_1.getDescription)({ mp4File, track }),
|
|
48
|
-
});
|
|
49
|
-
const samples = await (0, get_samples_1.getSamples)({ mp4File, track });
|
|
50
|
-
console.log(samples);
|
|
51
|
-
for (const sample of samples) {
|
|
52
|
-
const duration = (sample.duration * 1000000) / sample.timescale;
|
|
53
|
-
const timestamp = (sample.cts * 1000000) / sample.timescale;
|
|
54
|
-
const chunk = new EncodedVideoChunk({
|
|
55
|
-
type: sample.is_sync ? 'key' : 'delta',
|
|
56
|
-
timestamp,
|
|
57
|
-
duration,
|
|
58
|
-
data: sample.data,
|
|
59
|
-
});
|
|
60
|
-
decoder.decode(chunk);
|
|
61
|
-
}
|
|
62
|
-
await decoder.flush();
|
|
63
|
-
await encoder.flush();
|
|
64
|
-
encoder.close();
|
|
65
|
-
decoder.close();
|
|
66
|
-
outputMp4.save('mp4box.mp4');
|
|
67
|
-
};
|
|
68
|
-
exports.reencodeVideo = reencodeVideo;
|
package/dist/video-parser.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare const parseVideo: (file: File) => Promise<void>;
|
package/dist/video-parser.js
DELETED
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.parseVideo = void 0;
|
|
4
|
-
const media_parser_1 = require("@remotion/media-parser");
|
|
5
|
-
const web_file_1 = require("@remotion/media-parser/web-file");
|
|
6
|
-
const parseVideo = async (file) => {
|
|
7
|
-
const videoDecoder = new VideoDecoder({
|
|
8
|
-
output(inputFrame) {
|
|
9
|
-
console.log('frame', inputFrame);
|
|
10
|
-
inputFrame.close();
|
|
11
|
-
},
|
|
12
|
-
error(error) {
|
|
13
|
-
console.error(error);
|
|
14
|
-
},
|
|
15
|
-
});
|
|
16
|
-
await (0, media_parser_1.parseMedia)({
|
|
17
|
-
src: file,
|
|
18
|
-
reader: web_file_1.webFileReader,
|
|
19
|
-
onVideoTrack: (track) => {
|
|
20
|
-
videoDecoder.configure({
|
|
21
|
-
...track,
|
|
22
|
-
hardwareAcceleration: 'no-preference',
|
|
23
|
-
});
|
|
24
|
-
return (chunk) => {
|
|
25
|
-
videoDecoder.decode(new EncodedVideoChunk(chunk));
|
|
26
|
-
};
|
|
27
|
-
},
|
|
28
|
-
onAudioTrack: (track) => {
|
|
29
|
-
const audioDecoder = new AudioDecoder({
|
|
30
|
-
output(inputFrame) {
|
|
31
|
-
console.log('audio frame', inputFrame);
|
|
32
|
-
inputFrame.close();
|
|
33
|
-
},
|
|
34
|
-
error(error) {
|
|
35
|
-
console.error(error);
|
|
36
|
-
},
|
|
37
|
-
});
|
|
38
|
-
audioDecoder.configure({
|
|
39
|
-
codec: track.codec,
|
|
40
|
-
sampleRate: track.sampleRate,
|
|
41
|
-
numberOfChannels: track.numberOfChannels,
|
|
42
|
-
description: track.description,
|
|
43
|
-
});
|
|
44
|
-
console.log('audio track', track);
|
|
45
|
-
return (audioSample) => {
|
|
46
|
-
audioDecoder.decode(new EncodedAudioChunk(audioSample));
|
|
47
|
-
};
|
|
48
|
-
},
|
|
49
|
-
});
|
|
50
|
-
};
|
|
51
|
-
exports.parseVideo = parseVideo;
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
/// <reference types="dom-webcodecs" />
|
|
2
|
-
export declare const decoderWaitForDequeue: (videoDecoder: VideoDecoder | AudioDecoder) => Promise<void>;
|
|
3
|
-
export declare const decoderWaitForFinish: (videoDecoder: VideoDecoder | AudioDecoder) => Promise<void>;
|
|
4
|
-
export declare const encoderWaitForDequeue: (videoEncoder: VideoEncoder | AudioEncoder) => Promise<void>;
|
|
5
|
-
export declare const encoderWaitForFinish: (videoEncoder: VideoEncoder | AudioEncoder) => Promise<void>;
|
package/dist/wait-for-dequeue.js
DELETED
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.encoderWaitForFinish = exports.encoderWaitForDequeue = exports.decoderWaitForFinish = exports.decoderWaitForDequeue = void 0;
|
|
4
|
-
const decoderWaitForDequeue = async (videoDecoder) => {
|
|
5
|
-
while (videoDecoder.decodeQueueSize > 10) {
|
|
6
|
-
await new Promise((r) => {
|
|
7
|
-
// @ts-expect-error exists
|
|
8
|
-
videoDecoder.addEventListener('dequeue', () => r(), {
|
|
9
|
-
once: true,
|
|
10
|
-
});
|
|
11
|
-
});
|
|
12
|
-
}
|
|
13
|
-
};
|
|
14
|
-
exports.decoderWaitForDequeue = decoderWaitForDequeue;
|
|
15
|
-
const decoderWaitForFinish = async (videoDecoder) => {
|
|
16
|
-
while (videoDecoder.decodeQueueSize > 0) {
|
|
17
|
-
await new Promise((r) => {
|
|
18
|
-
// @ts-expect-error exists
|
|
19
|
-
videoDecoder.addEventListener('dequeue', () => r(), {
|
|
20
|
-
once: true,
|
|
21
|
-
});
|
|
22
|
-
});
|
|
23
|
-
}
|
|
24
|
-
};
|
|
25
|
-
exports.decoderWaitForFinish = decoderWaitForFinish;
|
|
26
|
-
// Queue goes way higher but this will eat more memory right?
|
|
27
|
-
// But if not done this way, quality is worse
|
|
28
|
-
const encoderWaitForDequeue = async (videoEncoder) => {
|
|
29
|
-
while (videoEncoder.encodeQueueSize > 10) {
|
|
30
|
-
await new Promise((r) => {
|
|
31
|
-
// @ts-expect-error exists
|
|
32
|
-
videoEncoder.addEventListener('dequeue', () => r(), {
|
|
33
|
-
once: true,
|
|
34
|
-
});
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
};
|
|
38
|
-
exports.encoderWaitForDequeue = encoderWaitForDequeue;
|
|
39
|
-
const encoderWaitForFinish = async (videoEncoder) => {
|
|
40
|
-
while (videoEncoder.encodeQueueSize > 0) {
|
|
41
|
-
await new Promise((r) => {
|
|
42
|
-
// @ts-expect-error exists
|
|
43
|
-
videoEncoder.addEventListener('dequeue', () => r(), {
|
|
44
|
-
once: true,
|
|
45
|
-
});
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
};
|
|
49
|
-
exports.encoderWaitForFinish = encoderWaitForFinish;
|