@remotion/renderer 4.0.255 → 4.0.257
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/browser/Browser.d.ts +23 -6
- package/dist/browser/Browser.js +22 -12
- package/dist/browser/BrowserPage.d.ts +5 -2
- package/dist/browser/BrowserPage.js +4 -2
- package/dist/browser/Launcher.js +1 -1
- package/dist/browser/Target.d.ts +7 -1
- package/dist/browser/Target.js +6 -1
- package/dist/browser/mitt/index.js +3 -3
- package/dist/browser-instances.js +1 -1
- package/dist/can-use-parallel-encoding.d.ts +1 -0
- package/dist/can-use-parallel-encoding.js +9 -1
- package/dist/client.d.ts +2 -2
- package/dist/cycle-browser-tabs.d.ts +6 -1
- package/dist/cycle-browser-tabs.js +2 -2
- package/dist/get-browser-instance.d.ts +2 -1
- package/dist/get-browser-instance.js +14 -4
- package/dist/get-codec-name.d.ts +1 -1
- package/dist/get-compositions.js +1 -0
- package/dist/index.d.ts +3 -3
- package/dist/make-page.d.ts +27 -0
- package/dist/make-page.js +71 -0
- package/dist/next-frame-to-render.d.ts +10 -0
- package/dist/next-frame-to-render.js +35 -0
- package/dist/open-browser.js +3 -3
- package/dist/options/gl.d.ts +1 -1
- package/dist/options/index.d.ts +2 -2
- package/dist/options/metadata.d.ts +1 -1
- package/dist/options/webhook-custom-data.d.ts +1 -1
- package/dist/pool.d.ts +7 -6
- package/dist/render-frame-and-retry-target-close.d.ts +50 -0
- package/dist/render-frame-and-retry-target-close.js +165 -0
- package/dist/render-frame-with-option-to-reject.d.ts +43 -0
- package/dist/render-frame-with-option-to-reject.js +136 -0
- package/dist/render-frame.d.ts +43 -0
- package/dist/render-frame.js +46 -0
- package/dist/render-frames.js +86 -312
- package/dist/render-partitions.d.ts +7 -0
- package/dist/render-partitions.js +50 -0
- package/dist/render-still.js +7 -2
- package/dist/replace-browser.js +1 -1
- package/dist/select-composition.js +1 -0
- package/dist/test-gpu.js +1 -0
- package/package.json +12 -12
package/dist/render-frames.js
CHANGED
|
@@ -6,37 +6,29 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.renderFrames = exports.internalRenderFrames = void 0;
|
|
7
7
|
const node_fs_1 = __importDefault(require("node:fs"));
|
|
8
8
|
const node_path_1 = __importDefault(require("node:path"));
|
|
9
|
-
const perf_hooks_1 = require("perf_hooks");
|
|
10
9
|
const no_react_1 = require("remotion/no-react");
|
|
11
|
-
const download_and_map_assets_to_file_1 = require("./assets/download-and-map-assets-to-file");
|
|
12
10
|
const browser_1 = require("./browser");
|
|
13
11
|
const TimeoutSettings_1 = require("./browser/TimeoutSettings");
|
|
14
12
|
const browser_download_progress_bar_1 = require("./browser/browser-download-progress-bar");
|
|
15
13
|
const flaky_errors_1 = require("./browser/flaky-errors");
|
|
16
|
-
const
|
|
14
|
+
const can_use_parallel_encoding_1 = require("./can-use-parallel-encoding");
|
|
17
15
|
const cycle_browser_tabs_1 = require("./cycle-browser-tabs");
|
|
18
|
-
const handle_javascript_exception_1 = require("./error-handling/handle-javascript-exception");
|
|
19
|
-
const filter_asset_types_1 = require("./filter-asset-types");
|
|
20
16
|
const find_closest_package_json_1 = require("./find-closest-package-json");
|
|
21
17
|
const get_concurrency_1 = require("./get-concurrency");
|
|
22
18
|
const get_duration_from_frame_range_1 = require("./get-duration-from-frame-range");
|
|
23
19
|
const get_extra_frames_to_capture_1 = require("./get-extra-frames-to-capture");
|
|
24
20
|
const get_frame_padded_index_1 = require("./get-frame-padded-index");
|
|
25
21
|
const get_frame_to_render_1 = require("./get-frame-to-render");
|
|
26
|
-
const is_delay_render_error_with_retry_1 = require("./is-delay-render-error-with-retry");
|
|
27
22
|
const jpeg_quality_1 = require("./jpeg-quality");
|
|
28
23
|
const logger_1 = require("./logger");
|
|
29
24
|
const make_cancel_signal_1 = require("./make-cancel-signal");
|
|
25
|
+
const make_page_1 = require("./make-page");
|
|
26
|
+
const next_frame_to_render_1 = require("./next-frame-to-render");
|
|
30
27
|
const open_browser_1 = require("./open-browser");
|
|
31
|
-
const perf_1 = require("./perf");
|
|
32
28
|
const pool_1 = require("./pool");
|
|
33
29
|
const prepare_server_1 = require("./prepare-server");
|
|
34
|
-
const
|
|
30
|
+
const render_frame_and_retry_target_close_1 = require("./render-frame-and-retry-target-close");
|
|
35
31
|
const replace_browser_1 = require("./replace-browser");
|
|
36
|
-
const seek_to_frame_1 = require("./seek-to-frame");
|
|
37
|
-
const set_props_and_env_1 = require("./set-props-and-env");
|
|
38
|
-
const take_frame_1 = require("./take-frame");
|
|
39
|
-
const truthy_1 = require("./truthy");
|
|
40
32
|
const validate_1 = require("./validate");
|
|
41
33
|
const validate_scale_1 = require("./validate-scale");
|
|
42
34
|
const wrap_with_error_handling_1 = require("./wrap-with-error-handling");
|
|
@@ -59,76 +51,34 @@ const innerRenderFrames = async ({ onFrameUpdate, outputDir, onStart, serialized
|
|
|
59
51
|
});
|
|
60
52
|
const framesToRender = (0, get_duration_from_frame_range_1.getFramesToRender)(realFrameRange, everyNthFrame);
|
|
61
53
|
const lastFrame = framesToRender[framesToRender.length - 1];
|
|
62
|
-
const
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
width: composition.width,
|
|
69
|
-
height: composition.height,
|
|
70
|
-
deviceScaleFactor: scale,
|
|
71
|
-
});
|
|
72
|
-
const logCallback = (log) => {
|
|
73
|
-
onBrowserLog === null || onBrowserLog === void 0 ? void 0 : onBrowserLog({
|
|
74
|
-
stackTrace: log.stackTrace(),
|
|
75
|
-
text: log.text,
|
|
76
|
-
type: log.type,
|
|
77
|
-
});
|
|
78
|
-
};
|
|
79
|
-
if (onBrowserLog) {
|
|
80
|
-
page.on('console', logCallback);
|
|
81
|
-
}
|
|
82
|
-
await (0, set_props_and_env_1.setPropsAndEnv)({
|
|
83
|
-
serializedInputPropsWithCustomSchema,
|
|
84
|
-
envVariables,
|
|
85
|
-
page,
|
|
86
|
-
serveUrl,
|
|
87
|
-
initialFrame,
|
|
88
|
-
timeoutInMilliseconds,
|
|
89
|
-
proxyPort,
|
|
90
|
-
retriesRemaining: 2,
|
|
91
|
-
audioEnabled: !muted,
|
|
92
|
-
videoEnabled: imageFormat !== 'none',
|
|
54
|
+
const concurrencyOrFramesToRender = Math.min(framesToRender.length, resolvedConcurrency);
|
|
55
|
+
const makeNewPage = (frame, pageIndex) => {
|
|
56
|
+
return (0, make_page_1.makePage)({
|
|
57
|
+
context: sourceMapGetter,
|
|
58
|
+
initialFrame: frame,
|
|
59
|
+
browserReplacer,
|
|
93
60
|
indent,
|
|
94
61
|
logLevel,
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
compositionHeight: height,
|
|
107
|
-
compositionWidth: width,
|
|
108
|
-
compositionDefaultCodec: defaultCodec,
|
|
109
|
-
});
|
|
110
|
-
},
|
|
111
|
-
args: [
|
|
112
|
-
composition.id,
|
|
113
|
-
serializedResolvedPropsWithCustomSchema,
|
|
114
|
-
composition.durationInFrames,
|
|
115
|
-
composition.fps,
|
|
116
|
-
composition.height,
|
|
117
|
-
composition.width,
|
|
118
|
-
composition.defaultCodec,
|
|
119
|
-
],
|
|
120
|
-
frame: null,
|
|
121
|
-
page,
|
|
62
|
+
onBrowserLog,
|
|
63
|
+
pagesArray,
|
|
64
|
+
scale,
|
|
65
|
+
composition,
|
|
66
|
+
envVariables,
|
|
67
|
+
imageFormat,
|
|
68
|
+
muted,
|
|
69
|
+
proxyPort,
|
|
70
|
+
serializedInputPropsWithCustomSchema,
|
|
71
|
+
serializedResolvedPropsWithCustomSchema,
|
|
72
|
+
serveUrl,
|
|
122
73
|
timeoutInMilliseconds,
|
|
74
|
+
pageIndex,
|
|
123
75
|
});
|
|
124
|
-
page.off('console', logCallback);
|
|
125
|
-
return page;
|
|
126
76
|
};
|
|
127
|
-
const
|
|
128
|
-
const getPool = async (context) => {
|
|
77
|
+
const getPool = async () => {
|
|
129
78
|
const pages = new Array(concurrencyOrFramesToRender)
|
|
130
79
|
.fill(true)
|
|
131
|
-
|
|
80
|
+
// TODO: Change different initial frame
|
|
81
|
+
.map((_, i) => makeNewPage(framesToRender[i], i));
|
|
132
82
|
const puppeteerPages = await Promise.all(pages);
|
|
133
83
|
const pool = new pool_1.Pool(puppeteerPages);
|
|
134
84
|
return pool;
|
|
@@ -141,258 +91,77 @@ const innerRenderFrames = async ({ onFrameUpdate, outputDir, onStart, serialized
|
|
|
141
91
|
totalFrames: framesToRender.length,
|
|
142
92
|
countType,
|
|
143
93
|
});
|
|
144
|
-
|
|
145
|
-
|
|
94
|
+
const framesRenderedObj = {
|
|
95
|
+
count: 0,
|
|
96
|
+
};
|
|
97
|
+
const poolPromise = getPool();
|
|
146
98
|
onStart === null || onStart === void 0 ? void 0 : onStart({
|
|
147
99
|
frameCount: framesToRender.length,
|
|
148
100
|
parallelEncoding: parallelEncodingEnabled,
|
|
149
101
|
resolvedConcurrency,
|
|
150
102
|
});
|
|
151
103
|
const assets = [];
|
|
152
|
-
|
|
104
|
+
const stoppedSignal = { stopped: false };
|
|
153
105
|
cancelSignal === null || cancelSignal === void 0 ? void 0 : cancelSignal(() => {
|
|
154
|
-
stopped = true;
|
|
106
|
+
stoppedSignal.stopped = true;
|
|
155
107
|
});
|
|
156
108
|
const frameDir = outputDir !== null && outputDir !== void 0 ? outputDir : downloadMap.compositingDir;
|
|
157
|
-
const renderFrameWithOptionToReject = async ({ frame, index, reject, width, height, compId, assetsOnly, attempt, }) => {
|
|
158
|
-
const pool = await poolPromise;
|
|
159
|
-
const freePage = await pool.acquire();
|
|
160
|
-
if (stopped) {
|
|
161
|
-
return reject(new Error('Render was stopped'));
|
|
162
|
-
}
|
|
163
|
-
const startTime = perf_hooks_1.performance.now();
|
|
164
|
-
const errorCallbackOnFrame = (err) => {
|
|
165
|
-
reject(err);
|
|
166
|
-
};
|
|
167
|
-
const cleanupPageError = (0, handle_javascript_exception_1.handleJavascriptException)({
|
|
168
|
-
page: freePage,
|
|
169
|
-
onError: errorCallbackOnFrame,
|
|
170
|
-
frame,
|
|
171
|
-
});
|
|
172
|
-
freePage.on('error', errorCallbackOnFrame);
|
|
173
|
-
const startSeeking = Date.now();
|
|
174
|
-
await (0, seek_to_frame_1.seekToFrame)({
|
|
175
|
-
frame,
|
|
176
|
-
page: freePage,
|
|
177
|
-
composition: compId,
|
|
178
|
-
timeoutInMilliseconds,
|
|
179
|
-
indent,
|
|
180
|
-
logLevel,
|
|
181
|
-
attempt,
|
|
182
|
-
});
|
|
183
|
-
const timeToSeek = Date.now() - startSeeking;
|
|
184
|
-
if (timeToSeek > 1000) {
|
|
185
|
-
logger_1.Log.verbose({ indent, logLevel }, `Seeking to frame ${frame} took ${timeToSeek}ms`);
|
|
186
|
-
}
|
|
187
|
-
if (!outputDir && !onFrameBuffer && imageFormat !== 'none') {
|
|
188
|
-
throw new Error('Called renderFrames() without specifying either `outputDir` or `onFrameBuffer`');
|
|
189
|
-
}
|
|
190
|
-
if (outputDir && onFrameBuffer && imageFormat !== 'none') {
|
|
191
|
-
throw new Error('Pass either `outputDir` or `onFrameBuffer` to renderFrames(), not both.');
|
|
192
|
-
}
|
|
193
|
-
const id = (0, perf_1.startPerfMeasure)('save');
|
|
194
|
-
const { buffer, collectedAssets } = await (0, take_frame_1.takeFrame)({
|
|
195
|
-
frame,
|
|
196
|
-
freePage,
|
|
197
|
-
height,
|
|
198
|
-
imageFormat: assetsOnly ? 'none' : imageFormat,
|
|
199
|
-
output: index === null
|
|
200
|
-
? null
|
|
201
|
-
: node_path_1.default.join(frameDir, (0, get_frame_padded_index_1.getFrameOutputFileName)({
|
|
202
|
-
frame,
|
|
203
|
-
imageFormat,
|
|
204
|
-
index,
|
|
205
|
-
countType,
|
|
206
|
-
lastFrame,
|
|
207
|
-
totalFrames: framesToRender.length,
|
|
208
|
-
})),
|
|
209
|
-
jpegQuality,
|
|
210
|
-
width,
|
|
211
|
-
scale,
|
|
212
|
-
wantsBuffer: Boolean(onFrameBuffer),
|
|
213
|
-
timeoutInMilliseconds,
|
|
214
|
-
});
|
|
215
|
-
if (onFrameBuffer && !assetsOnly) {
|
|
216
|
-
if (!buffer) {
|
|
217
|
-
throw new Error('unexpected null buffer');
|
|
218
|
-
}
|
|
219
|
-
onFrameBuffer(buffer, frame);
|
|
220
|
-
}
|
|
221
|
-
(0, perf_1.stopPerfMeasure)(id);
|
|
222
|
-
const previousAudioRenderAssets = assets
|
|
223
|
-
.filter(truthy_1.truthy)
|
|
224
|
-
.map((a) => a.audioAndVideoAssets)
|
|
225
|
-
.flat(2);
|
|
226
|
-
const previousArtifactAssets = assets
|
|
227
|
-
.filter(truthy_1.truthy)
|
|
228
|
-
.map((a) => a.artifactAssets)
|
|
229
|
-
.flat(2);
|
|
230
|
-
const audioAndVideoAssets = (0, filter_asset_types_1.onlyAudioAndVideoAssets)(collectedAssets);
|
|
231
|
-
const artifactAssets = (0, filter_asset_types_1.onlyArtifact)(collectedAssets);
|
|
232
|
-
for (const artifact of artifactAssets) {
|
|
233
|
-
for (const previousArtifact of previousArtifactAssets) {
|
|
234
|
-
if (artifact.filename === previousArtifact.filename) {
|
|
235
|
-
reject(new Error(`An artifact with output "${artifact.filename}" was already registered at frame ${previousArtifact.frame}, but now registered again at frame ${artifact.frame}. Artifacts must have unique names. https://remotion.dev/docs/artifacts`));
|
|
236
|
-
return;
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
onArtifact === null || onArtifact === void 0 ? void 0 : onArtifact(artifact);
|
|
240
|
-
}
|
|
241
|
-
const compressedAssets = audioAndVideoAssets.map((asset) => {
|
|
242
|
-
return (0, compress_assets_1.compressAsset)(previousAudioRenderAssets, asset);
|
|
243
|
-
});
|
|
244
|
-
assets.push({
|
|
245
|
-
audioAndVideoAssets: compressedAssets,
|
|
246
|
-
frame,
|
|
247
|
-
artifactAssets: artifactAssets.map((a) => {
|
|
248
|
-
return {
|
|
249
|
-
frame: a.frame,
|
|
250
|
-
filename: a.filename,
|
|
251
|
-
};
|
|
252
|
-
}),
|
|
253
|
-
});
|
|
254
|
-
for (const renderAsset of compressedAssets) {
|
|
255
|
-
(0, download_and_map_assets_to_file_1.downloadAndMapAssetsToFileUrl)({
|
|
256
|
-
renderAsset,
|
|
257
|
-
onDownload,
|
|
258
|
-
downloadMap,
|
|
259
|
-
indent,
|
|
260
|
-
logLevel,
|
|
261
|
-
binariesDirectory,
|
|
262
|
-
cancelSignalForAudioAnalysis: cancelSignal,
|
|
263
|
-
shouldAnalyzeAudioImmediately: true,
|
|
264
|
-
}).catch((err) => {
|
|
265
|
-
const truncateWithEllipsis = renderAsset.src.substring(0, 1000) +
|
|
266
|
-
(renderAsset.src.length > 1000 ? '...' : '');
|
|
267
|
-
onError(new Error(`Error while downloading ${truncateWithEllipsis}: ${err.stack}`));
|
|
268
|
-
});
|
|
269
|
-
}
|
|
270
|
-
if (!assetsOnly) {
|
|
271
|
-
framesRendered++;
|
|
272
|
-
onFrameUpdate === null || onFrameUpdate === void 0 ? void 0 : onFrameUpdate(framesRendered, frame, perf_hooks_1.performance.now() - startTime);
|
|
273
|
-
}
|
|
274
|
-
cleanupPageError();
|
|
275
|
-
freePage.off('error', errorCallbackOnFrame);
|
|
276
|
-
pool.release(freePage);
|
|
277
|
-
};
|
|
278
|
-
const renderFrame = ({ frame, index, assetsOnly, attempt, }) => {
|
|
279
|
-
return new Promise((resolve, reject) => {
|
|
280
|
-
renderFrameWithOptionToReject({
|
|
281
|
-
frame,
|
|
282
|
-
index,
|
|
283
|
-
reject,
|
|
284
|
-
width: composition.width,
|
|
285
|
-
height: composition.height,
|
|
286
|
-
compId: composition.id,
|
|
287
|
-
assetsOnly,
|
|
288
|
-
attempt,
|
|
289
|
-
})
|
|
290
|
-
.then(() => {
|
|
291
|
-
resolve();
|
|
292
|
-
})
|
|
293
|
-
.catch((err) => {
|
|
294
|
-
reject(err);
|
|
295
|
-
});
|
|
296
|
-
});
|
|
297
|
-
};
|
|
298
|
-
const renderFrameAndRetryTargetClose = async ({ frame, index, retriesLeft, attempt, assetsOnly, }) => {
|
|
299
|
-
var _a;
|
|
300
|
-
try {
|
|
301
|
-
await Promise.race([
|
|
302
|
-
renderFrame({ frame, index, assetsOnly, attempt }),
|
|
303
|
-
new Promise((_, reject) => {
|
|
304
|
-
cancelSignal === null || cancelSignal === void 0 ? void 0 : cancelSignal(() => {
|
|
305
|
-
reject(new Error(make_cancel_signal_1.cancelErrorMessages.renderFrames));
|
|
306
|
-
});
|
|
307
|
-
}),
|
|
308
|
-
]);
|
|
309
|
-
}
|
|
310
|
-
catch (err) {
|
|
311
|
-
const isTargetClosedError = (0, flaky_errors_1.isTargetClosedErr)(err);
|
|
312
|
-
const shouldRetryError = (_a = err.stack) === null || _a === void 0 ? void 0 : _a.includes(no_react_1.NoReactInternals.DELAY_RENDER_RETRY_TOKEN);
|
|
313
|
-
const flakyNetworkError = (0, flaky_errors_1.isFlakyNetworkError)(err);
|
|
314
|
-
if ((0, make_cancel_signal_1.isUserCancelledRender)(err) && !shouldRetryError) {
|
|
315
|
-
throw err;
|
|
316
|
-
}
|
|
317
|
-
if (!isTargetClosedError && !shouldRetryError && !flakyNetworkError) {
|
|
318
|
-
throw err;
|
|
319
|
-
}
|
|
320
|
-
if (stopped) {
|
|
321
|
-
return;
|
|
322
|
-
}
|
|
323
|
-
if (retriesLeft === 0) {
|
|
324
|
-
logger_1.Log.warn({
|
|
325
|
-
indent,
|
|
326
|
-
logLevel,
|
|
327
|
-
}, `The browser crashed ${attempt} times while rendering frame ${frame}. Not retrying anymore. Learn more about this error under https://www.remotion.dev/docs/target-closed`);
|
|
328
|
-
throw err;
|
|
329
|
-
}
|
|
330
|
-
if (shouldRetryError) {
|
|
331
|
-
const pool = await poolPromise;
|
|
332
|
-
// Replace the closed page
|
|
333
|
-
const newPage = await makePage(sourceMapGetter, frame);
|
|
334
|
-
pool.release(newPage);
|
|
335
|
-
logger_1.Log.warn({ indent, logLevel }, `delayRender() timed out while rendering frame ${frame}: ${err.message}`);
|
|
336
|
-
const actualRetriesLeft = (0, is_delay_render_error_with_retry_1.getRetriesLeftFromError)(err);
|
|
337
|
-
return renderFrameAndRetryTargetClose({
|
|
338
|
-
frame,
|
|
339
|
-
index,
|
|
340
|
-
retriesLeft: actualRetriesLeft,
|
|
341
|
-
attempt: attempt + 1,
|
|
342
|
-
assetsOnly,
|
|
343
|
-
});
|
|
344
|
-
}
|
|
345
|
-
logger_1.Log.warn({ indent, logLevel }, `The browser crashed while rendering frame ${frame}, retrying ${retriesLeft} more times. Learn more about this error under https://www.remotion.dev/docs/target-closed`);
|
|
346
|
-
// Replace the entire browser
|
|
347
|
-
await browserReplacer.replaceBrowser(makeBrowser, async () => {
|
|
348
|
-
const pages = new Array(concurrencyOrFramesToRender)
|
|
349
|
-
.fill(true)
|
|
350
|
-
.map(() => makePage(sourceMapGetter, frame));
|
|
351
|
-
const puppeteerPages = await Promise.all(pages);
|
|
352
|
-
const pool = await poolPromise;
|
|
353
|
-
for (const newPage of puppeteerPages) {
|
|
354
|
-
pool.release(newPage);
|
|
355
|
-
}
|
|
356
|
-
});
|
|
357
|
-
await renderFrameAndRetryTargetClose({
|
|
358
|
-
frame,
|
|
359
|
-
index,
|
|
360
|
-
retriesLeft: retriesLeft - 1,
|
|
361
|
-
attempt: attempt + 1,
|
|
362
|
-
assetsOnly,
|
|
363
|
-
});
|
|
364
|
-
}
|
|
365
|
-
};
|
|
366
109
|
// Render the extra frames at the beginning of the video first,
|
|
367
110
|
// then the regular frames, then the extra frames at the end of the video.
|
|
368
111
|
// While the order technically doesn't matter, components such as <Video> are
|
|
369
112
|
// not always frame perfect and give a flicker.
|
|
370
113
|
// We reduce the chance of flicker by rendering the frames in order.
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
});
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
114
|
+
const allFramesAndExtraFrames = [
|
|
115
|
+
...extraFramesToCaptureAssetsFrontend,
|
|
116
|
+
...framesToRender,
|
|
117
|
+
...extraFramesToCaptureAssetsBackend,
|
|
118
|
+
];
|
|
119
|
+
const shouldUsePartitionedRendering = (0, can_use_parallel_encoding_1.getShouldUsePartitionedRendering)();
|
|
120
|
+
if (shouldUsePartitionedRendering) {
|
|
121
|
+
logger_1.Log.info({ indent, logLevel }, 'Experimental: Using partitioned rendering (https://github.com/remotion-dev/remotion/pull/4830)');
|
|
122
|
+
}
|
|
123
|
+
const nextFrameToRender = shouldUsePartitionedRendering
|
|
124
|
+
? (0, next_frame_to_render_1.partitionedNextFrameToRenderState)({
|
|
125
|
+
allFramesAndExtraFrames,
|
|
126
|
+
concurrencyOrFramesToRender,
|
|
127
|
+
})
|
|
128
|
+
: (0, next_frame_to_render_1.nextFrameToRenderState)({
|
|
129
|
+
allFramesAndExtraFrames,
|
|
130
|
+
concurrencyOrFramesToRender,
|
|
387
131
|
});
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
return renderFrameAndRetryTargetClose({
|
|
391
|
-
frame,
|
|
392
|
-
index: null,
|
|
132
|
+
await Promise.all(allFramesAndExtraFrames.map(() => {
|
|
133
|
+
return (0, render_frame_and_retry_target_close_1.renderFrameAndRetryTargetClose)({
|
|
393
134
|
retriesLeft: MAX_RETRIES_PER_FRAME,
|
|
394
135
|
attempt: 1,
|
|
395
|
-
|
|
136
|
+
assets,
|
|
137
|
+
binariesDirectory,
|
|
138
|
+
cancelSignal,
|
|
139
|
+
composition,
|
|
140
|
+
countType,
|
|
141
|
+
downloadMap,
|
|
142
|
+
frameDir,
|
|
143
|
+
framesToRender,
|
|
144
|
+
imageFormat,
|
|
145
|
+
indent,
|
|
146
|
+
jpegQuality,
|
|
147
|
+
logLevel,
|
|
148
|
+
onArtifact,
|
|
149
|
+
onDownload,
|
|
150
|
+
onError,
|
|
151
|
+
outputDir,
|
|
152
|
+
poolPromise,
|
|
153
|
+
scale,
|
|
154
|
+
stoppedSignal,
|
|
155
|
+
timeoutInMilliseconds,
|
|
156
|
+
makeBrowser,
|
|
157
|
+
browserReplacer,
|
|
158
|
+
concurrencyOrFramesToRender,
|
|
159
|
+
framesRenderedObj,
|
|
160
|
+
lastFrame,
|
|
161
|
+
makeNewPage,
|
|
162
|
+
onFrameBuffer,
|
|
163
|
+
onFrameUpdate,
|
|
164
|
+
nextFrameToRender,
|
|
396
165
|
});
|
|
397
166
|
}));
|
|
398
167
|
const firstFrameIndex = countType === 'from-zero' ? 0 : framesToRender[0];
|
|
@@ -466,7 +235,12 @@ const internalRenderFramesRaw = ({ browserExecutable, cancelSignal, chromiumOpti
|
|
|
466
235
|
]).then(([{ server: openedServer, cleanupServer }, pInstance]) => {
|
|
467
236
|
const { serveUrl, offthreadPort, sourceMap, downloadMap } = openedServer;
|
|
468
237
|
const browserReplacer = (0, replace_browser_1.handleBrowserCrash)(pInstance, logLevel, indent);
|
|
469
|
-
const cycle = (0, cycle_browser_tabs_1.cycleBrowserTabs)(
|
|
238
|
+
const cycle = (0, cycle_browser_tabs_1.cycleBrowserTabs)({
|
|
239
|
+
puppeteerInstance: browserReplacer,
|
|
240
|
+
concurrency: resolvedConcurrency,
|
|
241
|
+
logLevel,
|
|
242
|
+
indent,
|
|
243
|
+
});
|
|
470
244
|
cleanup.push(() => {
|
|
471
245
|
cycle.stopCycling();
|
|
472
246
|
return Promise.resolve();
|
|
@@ -536,7 +310,7 @@ const internalRenderFramesRaw = ({ browserExecutable, cancelSignal, chromiumOpti
|
|
|
536
310
|
else {
|
|
537
311
|
Promise.resolve(browserInstance)
|
|
538
312
|
.then((instance) => {
|
|
539
|
-
return instance.close(true
|
|
313
|
+
return instance.close({ silent: true });
|
|
540
314
|
})
|
|
541
315
|
.catch((err) => {
|
|
542
316
|
if (!(err === null || err === void 0 ? void 0 : err.message.includes('Target closed'))) {
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.renderPartitions = void 0;
|
|
4
|
+
const renderPartitions = ({ frames, concurrency, }) => {
|
|
5
|
+
const partitions = [];
|
|
6
|
+
let start = 0;
|
|
7
|
+
for (let i = 0; i < concurrency; i++) {
|
|
8
|
+
const end = start + Math.ceil((frames.length - start) / (concurrency - i));
|
|
9
|
+
partitions.push(frames.slice(start, end));
|
|
10
|
+
start = end;
|
|
11
|
+
}
|
|
12
|
+
return {
|
|
13
|
+
partitions,
|
|
14
|
+
getNextFrame: (pageIndex) => {
|
|
15
|
+
if (partitions[pageIndex].length === 0) {
|
|
16
|
+
const partitionLengths = partitions.map((p) => p.length);
|
|
17
|
+
if (partitionLengths.every((p) => p === 0)) {
|
|
18
|
+
throw new Error('No more frames to render');
|
|
19
|
+
}
|
|
20
|
+
let longestRemainingPartitionIndex = -1;
|
|
21
|
+
for (let i = 0; i < partitions.length; i++) {
|
|
22
|
+
if (longestRemainingPartitionIndex === -1) {
|
|
23
|
+
longestRemainingPartitionIndex = i;
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
if (partitions[i].length >
|
|
27
|
+
partitions[longestRemainingPartitionIndex].length) {
|
|
28
|
+
longestRemainingPartitionIndex = i;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
if (longestRemainingPartitionIndex === -1) {
|
|
32
|
+
throw new Error('No more frames to render');
|
|
33
|
+
}
|
|
34
|
+
// Round up - let's say only one frame is left to render, we should take this one
|
|
35
|
+
const slicePoint = Math.ceil(partitions[longestRemainingPartitionIndex].length / 2) -
|
|
36
|
+
// but don't forget it's zero indexed :)
|
|
37
|
+
1;
|
|
38
|
+
partitions[pageIndex] =
|
|
39
|
+
partitions[longestRemainingPartitionIndex].slice(slicePoint);
|
|
40
|
+
partitions[longestRemainingPartitionIndex] = partitions[longestRemainingPartitionIndex].slice(0, slicePoint);
|
|
41
|
+
}
|
|
42
|
+
const value = partitions[pageIndex].shift();
|
|
43
|
+
if (value === undefined) {
|
|
44
|
+
throw new Error('No more frames to render');
|
|
45
|
+
}
|
|
46
|
+
return value;
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
};
|
|
50
|
+
exports.renderPartitions = renderPartitions;
|
package/dist/render-still.js
CHANGED
|
@@ -99,7 +99,12 @@ const innerRenderStill = async ({ composition, imageFormat = image_format_1.DEFA
|
|
|
99
99
|
onBrowserDownload,
|
|
100
100
|
chromeMode,
|
|
101
101
|
}));
|
|
102
|
-
const page = await browserInstance.newPage(
|
|
102
|
+
const page = await browserInstance.newPage({
|
|
103
|
+
context: sourceMapGetter,
|
|
104
|
+
logLevel,
|
|
105
|
+
indent,
|
|
106
|
+
pageIndex: 0,
|
|
107
|
+
});
|
|
103
108
|
await page.setViewport({
|
|
104
109
|
width: composition.width,
|
|
105
110
|
height: composition.height,
|
|
@@ -128,7 +133,7 @@ const innerRenderStill = async ({ composition, imageFormat = image_format_1.DEFA
|
|
|
128
133
|
await page.close();
|
|
129
134
|
}
|
|
130
135
|
else {
|
|
131
|
-
browserInstance.close(true
|
|
136
|
+
browserInstance.close({ silent: true }).catch((err) => {
|
|
132
137
|
logger_1.Log.error({ indent, logLevel }, 'Unable to close browser', err);
|
|
133
138
|
});
|
|
134
139
|
}
|
package/dist/replace-browser.js
CHANGED
|
@@ -21,7 +21,7 @@ const handleBrowserCrash = (instance, logLevel, indent) => {
|
|
|
21
21
|
try {
|
|
22
22
|
replacing = true;
|
|
23
23
|
await _instance
|
|
24
|
-
.close(true
|
|
24
|
+
.close({ silent: true })
|
|
25
25
|
.then(() => {
|
|
26
26
|
logger_1.Log.info({ indent, logLevel }, 'Killed previous browser and making new one');
|
|
27
27
|
})
|
package/dist/test-gpu.js
CHANGED
|
@@ -13,6 +13,7 @@ const getChromiumGpuInformation = async ({ browserExecutable, indent, logLevel,
|
|
|
13
13
|
logLevel,
|
|
14
14
|
onBrowserDownload,
|
|
15
15
|
chromeMode,
|
|
16
|
+
pageIndex: 0,
|
|
16
17
|
});
|
|
17
18
|
await page.goto({ url: 'chrome://gpu', timeout: 12000 });
|
|
18
19
|
const { value } = await (0, puppeteer_evaluate_1.puppeteerEvaluateWithCatch)({
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"url": "https://github.com/remotion-dev/remotion/tree/main/packages/renderer"
|
|
4
4
|
},
|
|
5
5
|
"name": "@remotion/renderer",
|
|
6
|
-
"version": "4.0.
|
|
6
|
+
"version": "4.0.257",
|
|
7
7
|
"description": "Render Remotion videos using Node.js or Bun",
|
|
8
8
|
"main": "dist/index.js",
|
|
9
9
|
"types": "dist/index.d.ts",
|
|
@@ -18,8 +18,8 @@
|
|
|
18
18
|
"extract-zip": "2.0.1",
|
|
19
19
|
"source-map": "^0.8.0-beta.0",
|
|
20
20
|
"ws": "8.17.1",
|
|
21
|
-
"remotion": "4.0.
|
|
22
|
-
"@remotion/streaming": "4.0.
|
|
21
|
+
"remotion": "4.0.257",
|
|
22
|
+
"@remotion/streaming": "4.0.257"
|
|
23
23
|
},
|
|
24
24
|
"peerDependencies": {
|
|
25
25
|
"react": ">=16.8.0",
|
|
@@ -33,17 +33,17 @@
|
|
|
33
33
|
"react-dom": "19.0.0",
|
|
34
34
|
"@types/ws": "8.5.10",
|
|
35
35
|
"eslint": "9.14.0",
|
|
36
|
-
"@remotion/
|
|
37
|
-
"@remotion/
|
|
36
|
+
"@remotion/example-videos": "4.0.257",
|
|
37
|
+
"@remotion/eslint-config-internal": "4.0.257"
|
|
38
38
|
},
|
|
39
39
|
"optionalDependencies": {
|
|
40
|
-
"@remotion/compositor-darwin-arm64": "4.0.
|
|
41
|
-
"@remotion/compositor-
|
|
42
|
-
"@remotion/compositor-linux-arm64-
|
|
43
|
-
"@remotion/compositor-linux-
|
|
44
|
-
"@remotion/compositor-linux-x64-gnu": "4.0.
|
|
45
|
-
"@remotion/compositor-
|
|
46
|
-
"@remotion/compositor-
|
|
40
|
+
"@remotion/compositor-darwin-arm64": "4.0.257",
|
|
41
|
+
"@remotion/compositor-darwin-x64": "4.0.257",
|
|
42
|
+
"@remotion/compositor-linux-arm64-gnu": "4.0.257",
|
|
43
|
+
"@remotion/compositor-linux-arm64-musl": "4.0.257",
|
|
44
|
+
"@remotion/compositor-linux-x64-gnu": "4.0.257",
|
|
45
|
+
"@remotion/compositor-linux-x64-musl": "4.0.257",
|
|
46
|
+
"@remotion/compositor-win32-x64-msvc": "4.0.257"
|
|
47
47
|
},
|
|
48
48
|
"keywords": [
|
|
49
49
|
"remotion",
|