@remotion/webcodecs 4.0.251 → 4.0.253
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/audio-decoder.d.ts +3 -2
- package/dist/audio-decoder.js +11 -9
- package/dist/audio-encoder.d.ts +4 -3
- package/dist/audio-encoder.js +10 -9
- package/dist/auto-select-writer.d.ts +1 -1
- package/dist/can-copy-video-track.js +2 -1
- package/dist/choose-correct-hevc-profile.d.ts +5 -0
- package/dist/choose-correct-hevc-profile.js +42 -0
- package/dist/controller.d.ts +16 -0
- package/dist/controller.js +16 -0
- package/dist/convert-media.d.ts +6 -6
- package/dist/convert-media.js +53 -21
- package/dist/create/iso-base-media/codec-specific/create-codec-specific-data.d.ts +11 -0
- package/dist/create/iso-base-media/codec-specific/create-codec-specific-data.js +29 -11
- package/dist/create/iso-base-media/codec-specific/hvc1.d.ts +2 -0
- package/dist/create/iso-base-media/codec-specific/hvc1.js +48 -0
- package/dist/create/iso-base-media/create-iso-base-media.js +8 -4
- package/dist/create/iso-base-media/serialize-track.js +3 -1
- package/dist/create/iso-base-media/trak/mdia/minf/stbl/stsd/create-hvcc.d.ts +1 -0
- package/dist/create/iso-base-media/trak/mdia/minf/stbl/stsd/create-hvcc.js +16 -0
- package/dist/create/matroska/cluster.d.ts +1 -1
- package/dist/create/matroska/create-matroska-media.js +8 -4
- package/dist/create/matroska/matroska-trackentry.js +3 -0
- package/dist/create/matroska/matroska-utils.d.ts +1 -1
- package/dist/create/media-fn.d.ts +2 -3
- package/dist/create/wav/create-wav.js +8 -4
- package/dist/emitter.d.ts +20 -0
- package/dist/emitter.js +29 -0
- package/dist/esm/buffer.mjs +5 -22
- package/dist/esm/index.mjs +633 -159
- package/dist/esm/web-fs.mjs +4 -22
- package/dist/get-available-containers.d.ts +1 -2
- package/dist/get-available-containers.js +3 -3
- package/dist/get-available-video-codecs.d.ts +1 -2
- package/dist/get-available-video-codecs.js +3 -4
- package/dist/get-codec-string.d.ts +7 -0
- package/dist/get-codec-string.js +21 -0
- package/dist/hevc-levels.d.ts +13 -0
- package/dist/hevc-levels.js +233 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +3 -1
- package/dist/io-manager/io-synchronizer.d.ts +4 -3
- package/dist/io-manager/io-synchronizer.js +19 -14
- package/dist/io-manager/make-timeout-promise.d.ts +6 -1
- package/dist/io-manager/make-timeout-promise.js +23 -5
- package/dist/on-audio-track.d.ts +2 -2
- package/dist/on-audio-track.js +13 -16
- package/dist/on-video-track.d.ts +2 -2
- package/dist/on-video-track.js +10 -14
- package/dist/select-container-creator.d.ts +1 -1
- package/dist/test/remux-serverside.test.js +2 -2
- package/dist/throttled-state-update.d.ts +1 -1
- package/dist/throttled-state-update.js +2 -2
- package/dist/video-decoder.d.ts +3 -2
- package/dist/video-decoder.js +10 -8
- package/dist/video-encoder-config.js +4 -6
- package/dist/video-encoder.d.ts +4 -3
- package/dist/video-encoder.js +13 -8
- package/dist/wav-audio-encoder.d.ts +1 -1
- package/dist/wav-audio-encoder.js +2 -2
- package/dist/webcodecs-controller.d.ts +16 -0
- package/dist/webcodecs-controller.js +16 -0
- package/dist/writers/buffer-implementation/writer.d.ts +1 -1
- package/dist/writers/buffer-implementation/writer.js +5 -4
- package/dist/writers/buffer.d.ts +1 -1
- package/dist/writers/web-fs.d.ts +1 -1
- package/dist/writers/web-fs.js +4 -4
- package/package.json +5 -5
package/dist/esm/web-fs.mjs
CHANGED
|
@@ -1,21 +1,3 @@
|
|
|
1
|
-
var __create = Object.create;
|
|
2
|
-
var __getProtoOf = Object.getPrototypeOf;
|
|
3
|
-
var __defProp = Object.defineProperty;
|
|
4
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
-
var __toESM = (mod, isNodeMode, target) => {
|
|
7
|
-
target = mod != null ? __create(__getProtoOf(mod)) : {};
|
|
8
|
-
const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
|
|
9
|
-
for (let key of __getOwnPropNames(mod))
|
|
10
|
-
if (!__hasOwnProp.call(to, key))
|
|
11
|
-
__defProp(to, key, {
|
|
12
|
-
get: () => mod[key],
|
|
13
|
-
enumerable: true
|
|
14
|
-
});
|
|
15
|
-
return to;
|
|
16
|
-
};
|
|
17
|
-
var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
|
|
18
|
-
|
|
19
1
|
// src/writers/web-fs.ts
|
|
20
2
|
var createContent = async ({ filename }) => {
|
|
21
3
|
const directoryHandle = await navigator.storage.getDirectory();
|
|
@@ -49,11 +31,14 @@ var createContent = async ({ filename }) => {
|
|
|
49
31
|
writPromise = writPromise.then(() => write(arr));
|
|
50
32
|
return writPromise;
|
|
51
33
|
},
|
|
52
|
-
|
|
34
|
+
finish: async () => {
|
|
35
|
+
await writPromise;
|
|
53
36
|
try {
|
|
54
37
|
await writable.close();
|
|
55
38
|
} catch {
|
|
56
39
|
}
|
|
40
|
+
},
|
|
41
|
+
async getBlob() {
|
|
57
42
|
const newHandle = await directoryHandle.getFileHandle(actualFilename, {
|
|
58
43
|
create: true
|
|
59
44
|
});
|
|
@@ -65,9 +50,6 @@ var createContent = async ({ filename }) => {
|
|
|
65
50
|
writPromise = writPromise.then(() => updateDataAt(position, data));
|
|
66
51
|
return writPromise;
|
|
67
52
|
},
|
|
68
|
-
waitForFinish: async () => {
|
|
69
|
-
await writPromise;
|
|
70
|
-
},
|
|
71
53
|
remove
|
|
72
54
|
};
|
|
73
55
|
return writer;
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
declare const availableContainers: readonly ["webm", "mp4", "wav"];
|
|
1
|
+
export declare const availableContainers: readonly ["webm", "mp4", "wav"];
|
|
2
2
|
export type ConvertMediaContainer = (typeof availableContainers)[number];
|
|
3
3
|
export declare const getAvailableContainers: () => readonly ConvertMediaContainer[];
|
|
4
|
-
export {};
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getAvailableContainers = void 0;
|
|
4
|
-
|
|
3
|
+
exports.getAvailableContainers = exports.availableContainers = void 0;
|
|
4
|
+
exports.availableContainers = ['webm', 'mp4', 'wav'];
|
|
5
5
|
const getAvailableContainers = () => {
|
|
6
|
-
return availableContainers;
|
|
6
|
+
return exports.availableContainers;
|
|
7
7
|
};
|
|
8
8
|
exports.getAvailableContainers = getAvailableContainers;
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import type { ConvertMediaContainer } from './get-available-containers';
|
|
2
|
-
declare const availableVideoCodecs: readonly ["vp8", "vp9", "h264"];
|
|
2
|
+
export declare const availableVideoCodecs: readonly ["vp8", "vp9", "h264", "h265"];
|
|
3
3
|
export type ConvertMediaVideoCodec = (typeof availableVideoCodecs)[number];
|
|
4
4
|
export declare const getAvailableVideoCodecs: ({ container, }: {
|
|
5
5
|
container: ConvertMediaContainer;
|
|
6
6
|
}) => ConvertMediaVideoCodec[];
|
|
7
|
-
export {};
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getAvailableVideoCodecs = void 0;
|
|
4
|
-
|
|
5
|
-
const availableVideoCodecs = ['vp8', 'vp9', 'h264'];
|
|
3
|
+
exports.getAvailableVideoCodecs = exports.availableVideoCodecs = void 0;
|
|
4
|
+
exports.availableVideoCodecs = ['vp8', 'vp9', 'h264', 'h265'];
|
|
6
5
|
const getAvailableVideoCodecs = ({ container, }) => {
|
|
7
6
|
if (container === 'mp4') {
|
|
8
|
-
return ['h264'];
|
|
7
|
+
return ['h264', 'h265'];
|
|
9
8
|
}
|
|
10
9
|
if (container === 'webm') {
|
|
11
10
|
return ['vp8', 'vp9'];
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getCodecStringForEncoder = void 0;
|
|
4
|
+
const choose_correct_avc1_profile_1 = require("./choose-correct-avc1-profile");
|
|
5
|
+
const choose_correct_hevc_profile_1 = require("./choose-correct-hevc-profile");
|
|
6
|
+
const getCodecStringForEncoder = ({ codec, fps, height, width, }) => {
|
|
7
|
+
if (codec === 'h264') {
|
|
8
|
+
return (0, choose_correct_avc1_profile_1.chooseCorrectAvc1Profile)({ fps, height, width });
|
|
9
|
+
}
|
|
10
|
+
if (codec === 'h265') {
|
|
11
|
+
return (0, choose_correct_hevc_profile_1.chooseCorrectHevcProfile)({ fps, height, width });
|
|
12
|
+
}
|
|
13
|
+
if (codec === 'vp8') {
|
|
14
|
+
return 'vp8';
|
|
15
|
+
}
|
|
16
|
+
if (codec === 'vp9') {
|
|
17
|
+
return 'vp09.00.10.08';
|
|
18
|
+
}
|
|
19
|
+
throw new Error(`Unknown codec: ${codec}`);
|
|
20
|
+
};
|
|
21
|
+
exports.getCodecStringForEncoder = getCodecStringForEncoder;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
type MaxRes = {
|
|
2
|
+
width: number;
|
|
3
|
+
height: number;
|
|
4
|
+
fps: number;
|
|
5
|
+
};
|
|
6
|
+
interface HEVCLevel {
|
|
7
|
+
level: string;
|
|
8
|
+
maxBitrateMainTier: number;
|
|
9
|
+
maxBitrateHighTier: number | null;
|
|
10
|
+
maxResolutionsAndFrameRates: MaxRes[];
|
|
11
|
+
}
|
|
12
|
+
export declare const hevcLevels: HEVCLevel[];
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.hevcLevels = void 0;
|
|
4
|
+
exports.hevcLevels = [
|
|
5
|
+
{
|
|
6
|
+
level: '3.1',
|
|
7
|
+
maxBitrateMainTier: 10000,
|
|
8
|
+
maxBitrateHighTier: null,
|
|
9
|
+
maxResolutionsAndFrameRates: [
|
|
10
|
+
{
|
|
11
|
+
width: 720,
|
|
12
|
+
height: 480,
|
|
13
|
+
fps: 84.3,
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
width: 720,
|
|
17
|
+
height: 576,
|
|
18
|
+
fps: 75,
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
width: 960,
|
|
22
|
+
height: 540,
|
|
23
|
+
fps: 60,
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
width: 1280,
|
|
27
|
+
height: 720,
|
|
28
|
+
fps: 33.7,
|
|
29
|
+
},
|
|
30
|
+
],
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
level: '4',
|
|
34
|
+
maxBitrateMainTier: 12000,
|
|
35
|
+
maxBitrateHighTier: 30000,
|
|
36
|
+
maxResolutionsAndFrameRates: [
|
|
37
|
+
{
|
|
38
|
+
width: 1280,
|
|
39
|
+
height: 720,
|
|
40
|
+
fps: 68,
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
width: 1920,
|
|
44
|
+
height: 1080,
|
|
45
|
+
fps: 32,
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
width: 2048,
|
|
49
|
+
height: 1080,
|
|
50
|
+
fps: 30,
|
|
51
|
+
},
|
|
52
|
+
],
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
level: '4.1',
|
|
56
|
+
maxBitrateMainTier: 20000,
|
|
57
|
+
maxBitrateHighTier: 50000,
|
|
58
|
+
maxResolutionsAndFrameRates: [
|
|
59
|
+
{
|
|
60
|
+
width: 1280,
|
|
61
|
+
height: 720,
|
|
62
|
+
fps: 136,
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
width: 1920,
|
|
66
|
+
height: 1080,
|
|
67
|
+
fps: 64,
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
width: 2048,
|
|
71
|
+
height: 1080,
|
|
72
|
+
fps: 60,
|
|
73
|
+
},
|
|
74
|
+
],
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
level: '5',
|
|
78
|
+
maxBitrateMainTier: 25000,
|
|
79
|
+
maxBitrateHighTier: 100000,
|
|
80
|
+
maxResolutionsAndFrameRates: [
|
|
81
|
+
{
|
|
82
|
+
width: 1920,
|
|
83
|
+
height: 1080,
|
|
84
|
+
fps: 128,
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
width: 2048,
|
|
88
|
+
height: 1080,
|
|
89
|
+
fps: 120,
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
width: 3840,
|
|
93
|
+
height: 2160,
|
|
94
|
+
fps: 32,
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
width: 4096,
|
|
98
|
+
height: 2160,
|
|
99
|
+
fps: 30,
|
|
100
|
+
},
|
|
101
|
+
],
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
level: '5.1',
|
|
105
|
+
maxBitrateMainTier: 40000,
|
|
106
|
+
maxBitrateHighTier: 160000,
|
|
107
|
+
maxResolutionsAndFrameRates: [
|
|
108
|
+
{
|
|
109
|
+
width: 1920,
|
|
110
|
+
height: 1080,
|
|
111
|
+
fps: 256,
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
width: 2048,
|
|
115
|
+
height: 1080,
|
|
116
|
+
fps: 240,
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
width: 3840,
|
|
120
|
+
height: 2160,
|
|
121
|
+
fps: 64,
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
width: 4096,
|
|
125
|
+
height: 2160,
|
|
126
|
+
fps: 60,
|
|
127
|
+
},
|
|
128
|
+
],
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
level: '5.2',
|
|
132
|
+
maxBitrateMainTier: 60000,
|
|
133
|
+
maxBitrateHighTier: 240000,
|
|
134
|
+
maxResolutionsAndFrameRates: [
|
|
135
|
+
{
|
|
136
|
+
width: 2048,
|
|
137
|
+
height: 1080,
|
|
138
|
+
fps: 300,
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
width: 3840,
|
|
142
|
+
height: 2160,
|
|
143
|
+
fps: 128,
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
width: 4096,
|
|
147
|
+
height: 2160,
|
|
148
|
+
fps: 120,
|
|
149
|
+
},
|
|
150
|
+
],
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
level: '6',
|
|
154
|
+
maxBitrateMainTier: 60000,
|
|
155
|
+
maxBitrateHighTier: 240000,
|
|
156
|
+
maxResolutionsAndFrameRates: [
|
|
157
|
+
{
|
|
158
|
+
width: 3840,
|
|
159
|
+
height: 2160,
|
|
160
|
+
fps: 128,
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
width: 4096,
|
|
164
|
+
height: 2160,
|
|
165
|
+
fps: 120,
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
width: 7680,
|
|
169
|
+
height: 4320,
|
|
170
|
+
fps: 32,
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
width: 8192,
|
|
174
|
+
height: 4320,
|
|
175
|
+
fps: 30,
|
|
176
|
+
},
|
|
177
|
+
],
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
level: '6.1',
|
|
181
|
+
maxBitrateMainTier: 120000,
|
|
182
|
+
maxBitrateHighTier: 480000,
|
|
183
|
+
maxResolutionsAndFrameRates: [
|
|
184
|
+
{
|
|
185
|
+
width: 3840,
|
|
186
|
+
height: 2160,
|
|
187
|
+
fps: 256,
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
width: 4096,
|
|
191
|
+
height: 2160,
|
|
192
|
+
fps: 240,
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
width: 7680,
|
|
196
|
+
height: 4320,
|
|
197
|
+
fps: 64,
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
width: 8192,
|
|
201
|
+
height: 4320,
|
|
202
|
+
fps: 60,
|
|
203
|
+
},
|
|
204
|
+
],
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
level: '6.2',
|
|
208
|
+
maxBitrateMainTier: 240000,
|
|
209
|
+
maxBitrateHighTier: 800000,
|
|
210
|
+
maxResolutionsAndFrameRates: [
|
|
211
|
+
{
|
|
212
|
+
width: 3840,
|
|
213
|
+
height: 2160,
|
|
214
|
+
fps: 512,
|
|
215
|
+
},
|
|
216
|
+
{
|
|
217
|
+
width: 4096,
|
|
218
|
+
height: 2160,
|
|
219
|
+
fps: 480,
|
|
220
|
+
},
|
|
221
|
+
{
|
|
222
|
+
width: 7680,
|
|
223
|
+
height: 4320,
|
|
224
|
+
fps: 128,
|
|
225
|
+
},
|
|
226
|
+
{
|
|
227
|
+
width: 8192,
|
|
228
|
+
height: 4320,
|
|
229
|
+
fps: 120,
|
|
230
|
+
},
|
|
231
|
+
],
|
|
232
|
+
},
|
|
233
|
+
];
|
package/dist/index.d.ts
CHANGED
|
@@ -17,7 +17,7 @@ export { ConvertMediaOnVideoTrackHandler, VideoOperation, } from './on-video-tra
|
|
|
17
17
|
export type { ResizeOperation } from './resizing/mode';
|
|
18
18
|
export { createVideoDecoder, WebCodecsVideoDecoder } from './video-decoder';
|
|
19
19
|
export { createVideoEncoder, WebCodecsVideoEncoder } from './video-encoder';
|
|
20
|
-
export {
|
|
20
|
+
export { webcodecsController, WebCodecsController } from './webcodecs-controller';
|
|
21
21
|
export declare const WebCodecsInternals: {
|
|
22
22
|
rotateAndResizeVideoFrame: ({ frame, rotation, videoCodec, resizeOperation, }: {
|
|
23
23
|
frame: VideoFrame;
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.WebCodecsInternals = exports.createVideoEncoder = exports.createVideoDecoder = exports.getDefaultVideoCodec = exports.getDefaultAudioCodec = exports.getAvailableVideoCodecs = exports.getAvailableContainers = exports.getAvailableAudioCodecs = exports.defaultOnVideoTrackHandler = exports.defaultOnAudioTrackHandler = exports.convertMedia = exports.canReencodeVideoTrack = exports.canReencodeAudioTrack = exports.canCopyVideoTrack = exports.canCopyAudioTrack = exports.createAudioEncoder = exports.createAudioDecoder = void 0;
|
|
3
|
+
exports.WebCodecsInternals = exports.webcodecsController = exports.createVideoEncoder = exports.createVideoDecoder = exports.getDefaultVideoCodec = exports.getDefaultAudioCodec = exports.getAvailableVideoCodecs = exports.getAvailableContainers = exports.getAvailableAudioCodecs = exports.defaultOnVideoTrackHandler = exports.defaultOnAudioTrackHandler = exports.convertMedia = exports.canReencodeVideoTrack = exports.canReencodeAudioTrack = exports.canCopyVideoTrack = exports.canCopyAudioTrack = exports.createAudioEncoder = exports.createAudioDecoder = void 0;
|
|
4
4
|
const rotate_and_resize_video_frame_1 = require("./rotate-and-resize-video-frame");
|
|
5
5
|
const rotation_1 = require("./rotation");
|
|
6
6
|
const set_remotion_imported_1 = require("./set-remotion-imported");
|
|
@@ -36,6 +36,8 @@ var video_decoder_1 = require("./video-decoder");
|
|
|
36
36
|
Object.defineProperty(exports, "createVideoDecoder", { enumerable: true, get: function () { return video_decoder_1.createVideoDecoder; } });
|
|
37
37
|
var video_encoder_1 = require("./video-encoder");
|
|
38
38
|
Object.defineProperty(exports, "createVideoEncoder", { enumerable: true, get: function () { return video_encoder_1.createVideoEncoder; } });
|
|
39
|
+
var webcodecs_controller_1 = require("./webcodecs-controller");
|
|
40
|
+
Object.defineProperty(exports, "webcodecsController", { enumerable: true, get: function () { return webcodecs_controller_1.webcodecsController; } });
|
|
39
41
|
exports.WebCodecsInternals = {
|
|
40
42
|
rotateAndResizeVideoFrame: rotate_and_resize_video_frame_1.rotateAndResizeVideoFrame,
|
|
41
43
|
normalizeVideoRotation: rotate_and_resize_video_frame_1.normalizeVideoRotation,
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { ProgressTracker } from '../create/progress-tracker';
|
|
2
2
|
import type { LogLevel } from '../log';
|
|
3
|
+
import type { WebCodecsController } from '../webcodecs-controller';
|
|
3
4
|
export declare const makeIoSynchronizer: ({ logLevel, label, progress, }: {
|
|
4
5
|
logLevel: LogLevel;
|
|
5
6
|
label: string;
|
|
@@ -7,13 +8,13 @@ export declare const makeIoSynchronizer: ({ logLevel, label, progress, }: {
|
|
|
7
8
|
}) => {
|
|
8
9
|
inputItem: (timestamp: number, keyFrame: boolean) => void;
|
|
9
10
|
onOutput: (timestamp: number) => void;
|
|
10
|
-
waitFor: ({ unprocessed, unemitted, minimumProgress,
|
|
11
|
+
waitFor: ({ unprocessed, unemitted, minimumProgress, controller, }: {
|
|
11
12
|
unemitted: number;
|
|
12
13
|
unprocessed: number;
|
|
13
14
|
minimumProgress: number | null;
|
|
14
|
-
|
|
15
|
+
controller: WebCodecsController;
|
|
15
16
|
}) => Promise<void>;
|
|
16
|
-
waitForFinish: (
|
|
17
|
+
waitForFinish: (controller: WebCodecsController) => Promise<void>;
|
|
17
18
|
onProcessed: () => void;
|
|
18
19
|
getUnprocessed: () => number;
|
|
19
20
|
};
|
|
@@ -69,17 +69,22 @@ const makeIoSynchronizer = ({ logLevel, label, progress, }) => {
|
|
|
69
69
|
eventEmitter.addEventListener('processed', on);
|
|
70
70
|
return promise;
|
|
71
71
|
};
|
|
72
|
-
const waitFor = async ({ unprocessed, unemitted, minimumProgress,
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
72
|
+
const waitFor = async ({ unprocessed, unemitted, minimumProgress, controller, }) => {
|
|
73
|
+
await controller._internals.checkForAbortAndPause();
|
|
74
|
+
const { timeoutPromise, clear } = (0, make_timeout_promise_1.makeTimeoutPromise)({
|
|
75
|
+
label: () => [
|
|
76
|
+
`Waited too long for ${label} to finish:`,
|
|
77
|
+
`${getUnemittedItems()} unemitted items`,
|
|
78
|
+
`${getUnprocessed()} unprocessed items: ${JSON.stringify(_unprocessed)}`,
|
|
79
|
+
`smallest progress: ${progress.getSmallestProgress()}`,
|
|
80
|
+
`inputs: ${JSON.stringify(inputs)}`,
|
|
81
|
+
`last output: ${lastOutput}`,
|
|
82
|
+
`wanted: ${unemitted} unemitted items, ${unprocessed} unprocessed items, minimum progress ${minimumProgress}`,
|
|
83
|
+
].join('\n'),
|
|
84
|
+
ms: 10000,
|
|
85
|
+
controller,
|
|
86
|
+
});
|
|
87
|
+
controller._internals.signal.addEventListener('abort', clear);
|
|
83
88
|
await Promise.race([
|
|
84
89
|
timeoutPromise,
|
|
85
90
|
Promise.all([
|
|
@@ -102,14 +107,14 @@ const makeIoSynchronizer = ({ logLevel, label, progress, }) => {
|
|
|
102
107
|
})(),
|
|
103
108
|
]),
|
|
104
109
|
]).finally(() => clear());
|
|
105
|
-
signal.removeEventListener('abort', clear);
|
|
110
|
+
controller._internals.signal.removeEventListener('abort', clear);
|
|
106
111
|
};
|
|
107
|
-
const waitForFinish = async (
|
|
112
|
+
const waitForFinish = async (controller) => {
|
|
108
113
|
await waitFor({
|
|
109
114
|
unprocessed: 0,
|
|
110
115
|
unemitted: 0,
|
|
111
116
|
minimumProgress: null,
|
|
112
|
-
|
|
117
|
+
controller,
|
|
113
118
|
});
|
|
114
119
|
};
|
|
115
120
|
const onProcessed = () => {
|
|
@@ -1,4 +1,9 @@
|
|
|
1
|
-
|
|
1
|
+
import type { WebCodecsController } from '../webcodecs-controller';
|
|
2
|
+
export declare const makeTimeoutPromise: ({ label, ms, controller, }: {
|
|
3
|
+
label: () => string;
|
|
4
|
+
ms: number;
|
|
5
|
+
controller: WebCodecsController;
|
|
6
|
+
}) => {
|
|
2
7
|
timeoutPromise: Promise<void>;
|
|
3
8
|
clear: () => void;
|
|
4
9
|
};
|
|
@@ -2,16 +2,34 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.makeTimeoutPromise = void 0;
|
|
4
4
|
const with_resolvers_1 = require("../create/with-resolvers");
|
|
5
|
-
const makeTimeoutPromise = (label, ms) => {
|
|
5
|
+
const makeTimeoutPromise = ({ label, ms, controller, }) => {
|
|
6
6
|
const { promise, reject, resolve } = (0, with_resolvers_1.withResolvers)();
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
let timeout = null;
|
|
8
|
+
const set = () => {
|
|
9
|
+
timeout = setTimeout(() => {
|
|
10
|
+
reject(new Error(`${label()} (timed out after ${ms}ms)`));
|
|
11
|
+
}, ms);
|
|
12
|
+
};
|
|
13
|
+
set();
|
|
14
|
+
const onPause = () => {
|
|
15
|
+
if (timeout) {
|
|
16
|
+
clearTimeout(timeout);
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
const onResume = () => {
|
|
20
|
+
set();
|
|
21
|
+
};
|
|
22
|
+
controller.addEventListener('pause', onPause);
|
|
23
|
+
controller.addEventListener('resume', onResume);
|
|
10
24
|
return {
|
|
11
25
|
timeoutPromise: promise,
|
|
12
26
|
clear: () => {
|
|
13
|
-
|
|
27
|
+
if (timeout) {
|
|
28
|
+
clearTimeout(timeout);
|
|
29
|
+
}
|
|
14
30
|
resolve();
|
|
31
|
+
controller.removeEventListener('pause', onPause);
|
|
32
|
+
controller.removeEventListener('resume', onResume);
|
|
15
33
|
},
|
|
16
34
|
};
|
|
17
35
|
};
|
package/dist/on-audio-track.d.ts
CHANGED
|
@@ -2,15 +2,15 @@ import { type LogLevel, type OnAudioTrack } from '@remotion/media-parser';
|
|
|
2
2
|
import type { ConvertMediaOnAudioData } from './convert-media';
|
|
3
3
|
import type { MediaFn } from './create/media-fn';
|
|
4
4
|
import type { ProgressTracker } from './create/progress-tracker';
|
|
5
|
-
import Error from './error-cause';
|
|
6
5
|
import type { ConvertMediaAudioCodec } from './get-available-audio-codecs';
|
|
7
6
|
import type { ConvertMediaContainer } from './get-available-containers';
|
|
8
7
|
import type { ConvertMediaOnAudioTrackHandler } from './on-audio-track-handler';
|
|
9
8
|
import type { ConvertMediaProgressFn } from './throttled-state-update';
|
|
9
|
+
import type { WebCodecsController } from './webcodecs-controller';
|
|
10
10
|
export declare const makeAudioTrackHandler: ({ state, defaultAudioCodec: audioCodec, controller, abortConversion, onMediaStateUpdate, onAudioTrack, logLevel, outputContainer, progressTracker, onAudioData, }: {
|
|
11
11
|
state: MediaFn;
|
|
12
12
|
defaultAudioCodec: ConvertMediaAudioCodec | null;
|
|
13
|
-
controller:
|
|
13
|
+
controller: WebCodecsController;
|
|
14
14
|
abortConversion: (errCause: Error) => void;
|
|
15
15
|
onMediaStateUpdate: null | ConvertMediaProgressFn;
|
|
16
16
|
onAudioTrack: ConvertMediaOnAudioTrackHandler | null;
|
package/dist/on-audio-track.js
CHANGED
|
@@ -1,7 +1,4 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
3
|
exports.makeAudioTrackHandler = void 0;
|
|
7
4
|
const media_parser_1 = require("@remotion/media-parser");
|
|
@@ -12,7 +9,6 @@ const audio_encoder_config_1 = require("./audio-encoder-config");
|
|
|
12
9
|
const can_copy_audio_track_1 = require("./can-copy-audio-track");
|
|
13
10
|
const convert_encoded_chunk_1 = require("./convert-encoded-chunk");
|
|
14
11
|
const default_on_audio_track_handler_1 = require("./default-on-audio-track-handler");
|
|
15
|
-
const error_cause_1 = __importDefault(require("./error-cause"));
|
|
16
12
|
const get_default_audio_codec_1 = require("./get-default-audio-codec");
|
|
17
13
|
const log_1 = require("./log");
|
|
18
14
|
const makeAudioTrackHandler = ({ state, defaultAudioCodec: audioCodec, controller, abortConversion, onMediaStateUpdate, onAudioTrack, logLevel, outputContainer, progressTracker, onAudioData, }) => async ({ track, container: inputContainer }) => {
|
|
@@ -33,7 +29,7 @@ const makeAudioTrackHandler = ({ state, defaultAudioCodec: audioCodec, controlle
|
|
|
33
29
|
return null;
|
|
34
30
|
}
|
|
35
31
|
if (audioOperation.type === 'fail') {
|
|
36
|
-
throw new
|
|
32
|
+
throw new Error(`Audio track with ID ${track.trackId} resolved with {"type": "fail"}. This could mean that this audio track could neither be copied to the output container or re-encoded. You have the option to drop the track instead of failing it: https://remotion.dev/docs/webcodecs/track-transformation`);
|
|
37
33
|
}
|
|
38
34
|
if (audioOperation.type === 'copy') {
|
|
39
35
|
const addedTrack = await state.addTrack({
|
|
@@ -73,11 +69,11 @@ const makeAudioTrackHandler = ({ state, defaultAudioCodec: audioCodec, controlle
|
|
|
73
69
|
description: track.description,
|
|
74
70
|
});
|
|
75
71
|
if (!audioEncoderConfig) {
|
|
76
|
-
abortConversion(new
|
|
72
|
+
abortConversion(new Error(`Could not configure audio encoder of track ${track.trackId}`));
|
|
77
73
|
return null;
|
|
78
74
|
}
|
|
79
75
|
if (!audioDecoderConfig) {
|
|
80
|
-
abortConversion(new
|
|
76
|
+
abortConversion(new Error(`Could not configure audio decoder of track ${track.trackId}`));
|
|
81
77
|
return null;
|
|
82
78
|
}
|
|
83
79
|
const codecPrivate = audioOperation.audioCodec === 'aac'
|
|
@@ -85,6 +81,7 @@ const makeAudioTrackHandler = ({ state, defaultAudioCodec: audioCodec, controlle
|
|
|
85
81
|
audioObjectType: 2,
|
|
86
82
|
sampleRate: track.sampleRate,
|
|
87
83
|
channelConfiguration: track.numberOfChannels,
|
|
84
|
+
codecPrivate: null,
|
|
88
85
|
})
|
|
89
86
|
: null;
|
|
90
87
|
const { trackNumber } = await state.addTrack({
|
|
@@ -120,12 +117,12 @@ const makeAudioTrackHandler = ({ state, defaultAudioCodec: audioCodec, controlle
|
|
|
120
117
|
});
|
|
121
118
|
},
|
|
122
119
|
onError: (err) => {
|
|
123
|
-
abortConversion(new
|
|
120
|
+
abortConversion(new Error(`Audio encoder of ${track.trackId} failed (see .cause of this error)`, {
|
|
124
121
|
cause: err,
|
|
125
122
|
}));
|
|
126
123
|
},
|
|
127
124
|
codec: audioOperation.audioCodec,
|
|
128
|
-
|
|
125
|
+
controller,
|
|
129
126
|
config: audioEncoderConfig,
|
|
130
127
|
logLevel,
|
|
131
128
|
progressTracker,
|
|
@@ -137,19 +134,19 @@ const makeAudioTrackHandler = ({ state, defaultAudioCodec: audioCodec, controlle
|
|
|
137
134
|
: audioData;
|
|
138
135
|
if (newAudioData !== audioData) {
|
|
139
136
|
if (newAudioData.duration !== audioData.duration) {
|
|
140
|
-
throw new
|
|
137
|
+
throw new Error(`onAudioData returned a different duration than the input audio data. Original duration: ${audioData.duration}, new duration: ${newAudioData.duration}`);
|
|
141
138
|
}
|
|
142
139
|
if (newAudioData.numberOfChannels !== audioData.numberOfChannels) {
|
|
143
|
-
throw new
|
|
140
|
+
throw new Error(`onAudioData returned a different number of channels than the input audio data. Original channels: ${audioData.numberOfChannels}, new channels: ${newAudioData.numberOfChannels}`);
|
|
144
141
|
}
|
|
145
142
|
if (newAudioData.sampleRate !== audioData.sampleRate) {
|
|
146
|
-
throw new
|
|
143
|
+
throw new Error(`onAudioData returned a different sample rate than the input audio data. Original sample rate: ${audioData.sampleRate}, new sample rate: ${newAudioData.sampleRate}`);
|
|
147
144
|
}
|
|
148
145
|
if (newAudioData.format !== audioData.format) {
|
|
149
|
-
throw new
|
|
146
|
+
throw new Error(`onAudioData returned a different format than the input audio data. Original format: ${audioData.format}, new format: ${newAudioData.format}`);
|
|
150
147
|
}
|
|
151
148
|
if (newAudioData.timestamp !== audioData.timestamp) {
|
|
152
|
-
throw new
|
|
149
|
+
throw new Error(`onAudioData returned a different timestamp than the input audio data. Original timestamp: ${audioData.timestamp}, new timestamp: ${newAudioData.timestamp}`);
|
|
153
150
|
}
|
|
154
151
|
audioData.close();
|
|
155
152
|
}
|
|
@@ -163,11 +160,11 @@ const makeAudioTrackHandler = ({ state, defaultAudioCodec: audioCodec, controlle
|
|
|
163
160
|
newAudioData.close();
|
|
164
161
|
},
|
|
165
162
|
onError(error) {
|
|
166
|
-
abortConversion(new
|
|
163
|
+
abortConversion(new Error(`Audio decoder of track ${track.trackId} failed. Config: ${JSON.stringify(audioDecoderConfig)} (see .cause of this error)`, {
|
|
167
164
|
cause: error,
|
|
168
165
|
}));
|
|
169
166
|
},
|
|
170
|
-
|
|
167
|
+
controller,
|
|
171
168
|
config: audioDecoderConfig,
|
|
172
169
|
logLevel,
|
|
173
170
|
track,
|