@remotion/webcodecs 4.0.210 → 4.0.212
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/dist/codec-id.d.ts +1 -1
- package/dist/convert-media.js +2 -2
- package/dist/esm/index.mjs +10 -7
- package/dist/get-config.d.ts +1 -0
- package/dist/get-config.js +19 -1
- package/dist/on-audio-track.js +2 -2
- package/dist/on-video-track.js +3 -3
- package/dist/resolve-video-action.js +3 -0
- package/dist/wait-for-dequeue.js +0 -2
- package/package.json +2 -2
- package/dist/create-decoder.d.ts +0 -6
- package/dist/create-decoder.js +0 -32
- package/dist/decoder.d.ts +0 -7
- package/dist/decoder.js +0 -44
- package/dist/encoder.d.ts +0 -7
- package/dist/encoder.js +0 -43
package/dist/codec-id.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export type ConvertMediaVideoCodec = 'vp8';
|
|
1
|
+
export type ConvertMediaVideoCodec = 'vp8' | 'vp9';
|
|
2
2
|
export type ConvertMediaAudioCodec = 'opus';
|
package/dist/convert-media.js
CHANGED
|
@@ -20,8 +20,8 @@ const convertMedia = async ({ src, onVideoFrame, onMediaStateUpdate, audioCodec,
|
|
|
20
20
|
if (audioCodec !== 'opus') {
|
|
21
21
|
return Promise.reject(new TypeError('Only `audioCodec: "opus"` is supported currently'));
|
|
22
22
|
}
|
|
23
|
-
if (videoCodec !== 'vp8') {
|
|
24
|
-
return Promise.reject(new TypeError('Only `videoCodec: "vp8"`
|
|
23
|
+
if (videoCodec !== 'vp8' && videoCodec !== 'vp9') {
|
|
24
|
+
return Promise.reject(new TypeError('Only `videoCodec: "vp8"` and `videoCodec: "vp9"` are supported currently'));
|
|
25
25
|
}
|
|
26
26
|
const { promise, resolve, reject } = (0, with_resolvers_1.withResolvers)();
|
|
27
27
|
const controller = new AbortController();
|
package/dist/esm/index.mjs
CHANGED
|
@@ -280,7 +280,7 @@ var makeAudioTrackHandler = ({
|
|
|
280
280
|
codecPrivate: track.codecPrivate
|
|
281
281
|
});
|
|
282
282
|
return async (audioSample) => {
|
|
283
|
-
await state.addSample(new EncodedAudioChunk(audioSample), addedTrack.trackNumber);
|
|
283
|
+
await state.addSample(new EncodedAudioChunk(audioSample), addedTrack.trackNumber, false);
|
|
284
284
|
convertMediaState.encodedAudioFrames++;
|
|
285
285
|
onMediaStateUpdate?.({ ...convertMediaState });
|
|
286
286
|
};
|
|
@@ -302,7 +302,7 @@ var makeAudioTrackHandler = ({
|
|
|
302
302
|
});
|
|
303
303
|
const audioEncoder = createAudioEncoder({
|
|
304
304
|
onChunk: async (chunk) => {
|
|
305
|
-
await state.addSample(chunk, trackNumber);
|
|
305
|
+
await state.addSample(chunk, trackNumber, false);
|
|
306
306
|
convertMediaState.encodedAudioFrames++;
|
|
307
307
|
onMediaStateUpdate?.({ ...convertMediaState });
|
|
308
308
|
},
|
|
@@ -346,6 +346,9 @@ var canCopyVideoTrack = (inputCodec, outputCodec) => {
|
|
|
346
346
|
if (outputCodec === "vp8") {
|
|
347
347
|
return inputCodec === "vp8";
|
|
348
348
|
}
|
|
349
|
+
if (outputCodec === "vp9") {
|
|
350
|
+
return inputCodec === "vp9";
|
|
351
|
+
}
|
|
349
352
|
throw new Error(`Unhandled codec: ${outputCodec}`);
|
|
350
353
|
};
|
|
351
354
|
var defaultResolveVideoAction = ({
|
|
@@ -609,7 +612,7 @@ var makeVideoTrackHandler = ({
|
|
|
609
612
|
onVideoTrack
|
|
610
613
|
}) => async (track) => {
|
|
611
614
|
const videoEncoderConfig = await getVideoEncoderConfig({
|
|
612
|
-
codec: videoCodec,
|
|
615
|
+
codec: videoCodec === "vp9" ? "vp09.00.10.08" : videoCodec,
|
|
613
616
|
height: track.displayAspectHeight,
|
|
614
617
|
width: track.displayAspectWidth
|
|
615
618
|
});
|
|
@@ -634,7 +637,7 @@ var makeVideoTrackHandler = ({
|
|
|
634
637
|
codecPrivate: track.codecPrivate
|
|
635
638
|
});
|
|
636
639
|
return (sample) => {
|
|
637
|
-
state.addSample(new EncodedVideoChunk(sample), videoTrack.trackNumber);
|
|
640
|
+
state.addSample(new EncodedVideoChunk(sample), videoTrack.trackNumber, true);
|
|
638
641
|
convertMediaState.decodedVideoFrames++;
|
|
639
642
|
onMediaStateUpdate?.({ ...convertMediaState });
|
|
640
643
|
};
|
|
@@ -657,7 +660,7 @@ var makeVideoTrackHandler = ({
|
|
|
657
660
|
});
|
|
658
661
|
const videoEncoder = createVideoEncoder({
|
|
659
662
|
onChunk: async (chunk) => {
|
|
660
|
-
await state.addSample(chunk, trackNumber);
|
|
663
|
+
await state.addSample(chunk, trackNumber, true);
|
|
661
664
|
convertMediaState.encodedVideoFrames++;
|
|
662
665
|
onMediaStateUpdate?.({ ...convertMediaState });
|
|
663
666
|
},
|
|
@@ -725,8 +728,8 @@ var convertMedia = async ({
|
|
|
725
728
|
if (audioCodec !== "opus") {
|
|
726
729
|
return Promise.reject(new TypeError('Only `audioCodec: "opus"` is supported currently'));
|
|
727
730
|
}
|
|
728
|
-
if (videoCodec !== "vp8") {
|
|
729
|
-
return Promise.reject(new TypeError('Only `videoCodec: "vp8"`
|
|
731
|
+
if (videoCodec !== "vp8" && videoCodec !== "vp9") {
|
|
732
|
+
return Promise.reject(new TypeError('Only `videoCodec: "vp8"` and `videoCodec: "vp9"` are supported currently'));
|
|
730
733
|
}
|
|
731
734
|
const { promise, resolve, reject } = withResolvers();
|
|
732
735
|
const controller = new AbortController;
|
package/dist/get-config.d.ts
CHANGED
package/dist/get-config.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getVideoDecoderConfigWithHardwareAcceleration = void 0;
|
|
3
|
+
exports.getVideoEncoderConfigWithHardwareAcceleration = exports.getVideoDecoderConfigWithHardwareAcceleration = void 0;
|
|
4
4
|
const getVideoDecoderConfigWithHardwareAcceleration = async (config) => {
|
|
5
5
|
const hardware = {
|
|
6
6
|
...config,
|
|
@@ -19,3 +19,21 @@ const getVideoDecoderConfigWithHardwareAcceleration = async (config) => {
|
|
|
19
19
|
return null;
|
|
20
20
|
};
|
|
21
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/on-audio-track.js
CHANGED
|
@@ -42,7 +42,7 @@ const makeAudioTrackHandler = ({ state, audioCodec, convertMediaState, controlle
|
|
|
42
42
|
codecPrivate: track.codecPrivate,
|
|
43
43
|
});
|
|
44
44
|
return async (audioSample) => {
|
|
45
|
-
await state.addSample(new EncodedAudioChunk(audioSample), addedTrack.trackNumber);
|
|
45
|
+
await state.addSample(new EncodedAudioChunk(audioSample), addedTrack.trackNumber, false);
|
|
46
46
|
convertMediaState.encodedAudioFrames++;
|
|
47
47
|
onMediaStateUpdate === null || onMediaStateUpdate === void 0 ? void 0 : onMediaStateUpdate({ ...convertMediaState });
|
|
48
48
|
};
|
|
@@ -64,7 +64,7 @@ const makeAudioTrackHandler = ({ state, audioCodec, convertMediaState, controlle
|
|
|
64
64
|
});
|
|
65
65
|
const audioEncoder = (0, audio_encoder_1.createAudioEncoder)({
|
|
66
66
|
onChunk: async (chunk) => {
|
|
67
|
-
await state.addSample(chunk, trackNumber);
|
|
67
|
+
await state.addSample(chunk, trackNumber, false);
|
|
68
68
|
convertMediaState.encodedAudioFrames++;
|
|
69
69
|
onMediaStateUpdate === null || onMediaStateUpdate === void 0 ? void 0 : onMediaStateUpdate({ ...convertMediaState });
|
|
70
70
|
},
|
package/dist/on-video-track.js
CHANGED
|
@@ -12,7 +12,7 @@ const video_encoder_1 = require("./video-encoder");
|
|
|
12
12
|
const video_encoder_config_1 = require("./video-encoder-config");
|
|
13
13
|
const makeVideoTrackHandler = ({ state, onVideoFrame, onMediaStateUpdate, abortConversion, convertMediaState, controller, videoCodec, onVideoTrack, }) => async (track) => {
|
|
14
14
|
const videoEncoderConfig = await (0, video_encoder_config_1.getVideoEncoderConfig)({
|
|
15
|
-
codec: videoCodec,
|
|
15
|
+
codec: videoCodec === 'vp9' ? 'vp09.00.10.08' : videoCodec,
|
|
16
16
|
height: track.displayAspectHeight,
|
|
17
17
|
width: track.displayAspectWidth,
|
|
18
18
|
});
|
|
@@ -37,7 +37,7 @@ const makeVideoTrackHandler = ({ state, onVideoFrame, onMediaStateUpdate, abortC
|
|
|
37
37
|
codecPrivate: track.codecPrivate,
|
|
38
38
|
});
|
|
39
39
|
return (sample) => {
|
|
40
|
-
state.addSample(new EncodedVideoChunk(sample), videoTrack.trackNumber);
|
|
40
|
+
state.addSample(new EncodedVideoChunk(sample), videoTrack.trackNumber, true);
|
|
41
41
|
convertMediaState.decodedVideoFrames++;
|
|
42
42
|
onMediaStateUpdate === null || onMediaStateUpdate === void 0 ? void 0 : onMediaStateUpdate({ ...convertMediaState });
|
|
43
43
|
};
|
|
@@ -60,7 +60,7 @@ const makeVideoTrackHandler = ({ state, onVideoFrame, onMediaStateUpdate, abortC
|
|
|
60
60
|
});
|
|
61
61
|
const videoEncoder = (0, video_encoder_1.createVideoEncoder)({
|
|
62
62
|
onChunk: async (chunk) => {
|
|
63
|
-
await state.addSample(chunk, trackNumber);
|
|
63
|
+
await state.addSample(chunk, trackNumber, true);
|
|
64
64
|
convertMediaState.encodedVideoFrames++;
|
|
65
65
|
onMediaStateUpdate === null || onMediaStateUpdate === void 0 ? void 0 : onMediaStateUpdate({ ...convertMediaState });
|
|
66
66
|
},
|
|
@@ -5,6 +5,9 @@ const canCopyVideoTrack = (inputCodec, outputCodec) => {
|
|
|
5
5
|
if (outputCodec === 'vp8') {
|
|
6
6
|
return inputCodec === 'vp8';
|
|
7
7
|
}
|
|
8
|
+
if (outputCodec === 'vp9') {
|
|
9
|
+
return inputCodec === 'vp9';
|
|
10
|
+
}
|
|
8
11
|
throw new Error(`Unhandled codec: ${outputCodec}`);
|
|
9
12
|
};
|
|
10
13
|
const defaultResolveVideoAction = ({ canReencode, canCopy, }) => {
|
package/dist/wait-for-dequeue.js
CHANGED
|
@@ -21,7 +21,6 @@ const decoderWaitForFinish = async (videoDecoder) => {
|
|
|
21
21
|
});
|
|
22
22
|
});
|
|
23
23
|
}
|
|
24
|
-
await videoDecoder.flush();
|
|
25
24
|
};
|
|
26
25
|
exports.decoderWaitForFinish = decoderWaitForFinish;
|
|
27
26
|
// Queue goes way higher but this will eat more memory right?
|
|
@@ -46,6 +45,5 @@ const encoderWaitForFinish = async (videoEncoder) => {
|
|
|
46
45
|
});
|
|
47
46
|
});
|
|
48
47
|
}
|
|
49
|
-
await videoEncoder.flush();
|
|
50
48
|
};
|
|
51
49
|
exports.encoderWaitForFinish = encoderWaitForFinish;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@remotion/webcodecs",
|
|
3
|
-
"version": "4.0.
|
|
3
|
+
"version": "4.0.212",
|
|
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.212"
|
|
21
21
|
},
|
|
22
22
|
"peerDependencies": {},
|
|
23
23
|
"devDependencies": {
|
package/dist/create-decoder.d.ts
DELETED
package/dist/create-decoder.js
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.createDecoder = void 0;
|
|
4
|
-
const createDecoder = ({ onProgress, onFrame, }) => {
|
|
5
|
-
let decodedFrames = 0;
|
|
6
|
-
let nextKeyFrameTimestamp = 0;
|
|
7
|
-
const decoder = new VideoDecoder({
|
|
8
|
-
async output(inputFrame) {
|
|
9
|
-
const bitmap = await createImageBitmap(inputFrame);
|
|
10
|
-
const keyFrameEveryHowManySeconds = 2;
|
|
11
|
-
let keyFrame = false;
|
|
12
|
-
if (inputFrame.timestamp >= nextKeyFrameTimestamp) {
|
|
13
|
-
keyFrame = true;
|
|
14
|
-
nextKeyFrameTimestamp =
|
|
15
|
-
inputFrame.timestamp + keyFrameEveryHowManySeconds * 1e6;
|
|
16
|
-
}
|
|
17
|
-
const outputFrame = new VideoFrame(bitmap, {
|
|
18
|
-
timestamp: inputFrame.timestamp,
|
|
19
|
-
duration: inputFrame.duration,
|
|
20
|
-
});
|
|
21
|
-
onFrame(outputFrame, keyFrame);
|
|
22
|
-
inputFrame.close();
|
|
23
|
-
decodedFrames++;
|
|
24
|
-
onProgress(decodedFrames);
|
|
25
|
-
},
|
|
26
|
-
error(error) {
|
|
27
|
-
console.error(error);
|
|
28
|
-
},
|
|
29
|
-
});
|
|
30
|
-
return { decoder };
|
|
31
|
-
};
|
|
32
|
-
exports.createDecoder = createDecoder;
|
package/dist/decoder.d.ts
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import type { VideoSample, VideoTrack } from '@remotion/media-parser';
|
|
2
|
-
export declare const createDecoder: ({ track, onFrame, }: {
|
|
3
|
-
track: VideoTrack;
|
|
4
|
-
onFrame: (frame: VideoFrame) => Promise<void>;
|
|
5
|
-
}) => Promise<{
|
|
6
|
-
processSample: (sample: VideoSample) => Promise<void>;
|
|
7
|
-
} | null>;
|
package/dist/decoder.js
DELETED
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.createDecoder = void 0;
|
|
4
|
-
const wait_for_dequeue_1 = require("./wait-for-dequeue");
|
|
5
|
-
const createDecoder = async ({ track, onFrame, }) => {
|
|
6
|
-
if (typeof VideoDecoder === 'undefined') {
|
|
7
|
-
return null;
|
|
8
|
-
}
|
|
9
|
-
const actualConfig = {
|
|
10
|
-
...track,
|
|
11
|
-
hardwareAcceleration: 'prefer-hardware',
|
|
12
|
-
};
|
|
13
|
-
const { supported } = await VideoDecoder.isConfigSupported(actualConfig);
|
|
14
|
-
if (!supported) {
|
|
15
|
-
return null;
|
|
16
|
-
}
|
|
17
|
-
const videoDecoder = new VideoDecoder({
|
|
18
|
-
async output(inputFrame) {
|
|
19
|
-
await onFrame(inputFrame);
|
|
20
|
-
},
|
|
21
|
-
error(error) {
|
|
22
|
-
console.error(error);
|
|
23
|
-
},
|
|
24
|
-
});
|
|
25
|
-
videoDecoder.configure(actualConfig);
|
|
26
|
-
const processSample = async (sample) => {
|
|
27
|
-
if (videoDecoder.state === 'closed') {
|
|
28
|
-
return;
|
|
29
|
-
}
|
|
30
|
-
await (0, wait_for_dequeue_1.decoderWaitForDequeue)(videoDecoder);
|
|
31
|
-
if (sample.type === 'key') {
|
|
32
|
-
await videoDecoder.flush();
|
|
33
|
-
}
|
|
34
|
-
videoDecoder.decode(new EncodedVideoChunk(sample));
|
|
35
|
-
};
|
|
36
|
-
let queue = Promise.resolve();
|
|
37
|
-
return {
|
|
38
|
-
processSample: (sample) => {
|
|
39
|
-
queue = queue.then(() => processSample(sample));
|
|
40
|
-
return queue;
|
|
41
|
-
},
|
|
42
|
-
};
|
|
43
|
-
};
|
|
44
|
-
exports.createDecoder = createDecoder;
|
package/dist/encoder.d.ts
DELETED
package/dist/encoder.js
DELETED
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.createEncoder = void 0;
|
|
4
|
-
const get_config_1 = require("./get-config");
|
|
5
|
-
const wait_for_dequeue_1 = require("./wait-for-dequeue");
|
|
6
|
-
const createEncoder = async ({ width, height, onChunk, }) => {
|
|
7
|
-
if (typeof VideoEncoder === 'undefined') {
|
|
8
|
-
return Promise.resolve(null);
|
|
9
|
-
}
|
|
10
|
-
const encoder = new VideoEncoder({
|
|
11
|
-
error(error) {
|
|
12
|
-
console.error(error);
|
|
13
|
-
},
|
|
14
|
-
async output(chunk) {
|
|
15
|
-
await onChunk(chunk);
|
|
16
|
-
},
|
|
17
|
-
});
|
|
18
|
-
const config = await (0, get_config_1.getVideoEncoderConfigWithHardwareAcceleration)({
|
|
19
|
-
codec: 'vp8',
|
|
20
|
-
height,
|
|
21
|
-
width,
|
|
22
|
-
});
|
|
23
|
-
if (!config) {
|
|
24
|
-
return null;
|
|
25
|
-
}
|
|
26
|
-
encoder.configure(config);
|
|
27
|
-
let framesProcessed = 0;
|
|
28
|
-
const encodeFrame = async (frame) => {
|
|
29
|
-
await (0, wait_for_dequeue_1.encoderWaitForDequeue)(encoder);
|
|
30
|
-
encoder.encode(frame, {
|
|
31
|
-
keyFrame: framesProcessed % 40 === 0,
|
|
32
|
-
});
|
|
33
|
-
framesProcessed++;
|
|
34
|
-
};
|
|
35
|
-
let queue = Promise.resolve();
|
|
36
|
-
return {
|
|
37
|
-
encodeFrame: (frame) => {
|
|
38
|
-
queue = queue.then(() => encodeFrame(frame));
|
|
39
|
-
return queue;
|
|
40
|
-
},
|
|
41
|
-
};
|
|
42
|
-
};
|
|
43
|
-
exports.createEncoder = createEncoder;
|