@remotion/renderer 3.3.28 → 3.3.32
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/compositor/compositor.d.ts +6 -3
- package/dist/compositor/compositor.js +21 -22
- package/dist/create-ffmpeg-complex-filter.d.ts +1 -4
- package/dist/determine-resize-params.d.ts +1 -4
- package/dist/get-compositions-from-bundle.d.ts +6 -1
- package/dist/get-compositions-from-bundle.js +2 -2
- package/dist/get-compositions-from-markup.d.ts +3 -0
- package/dist/get-compositions-from-markup.js +17 -0
- package/dist/get-compositions.js +9 -2
- package/dist/get-concurrency.d.ts +1 -1
- package/dist/get-concurrency.js +8 -1
- package/dist/get-video-signals.d.ts +2 -0
- package/dist/get-video-signals.js +28 -0
- package/dist/index.d.ts +17 -5
- package/dist/index.js +3 -3
- package/dist/make-comp-manager-context.d.ts +2 -0
- package/dist/make-comp-manager-context.js +45 -0
- package/dist/make-timeline-context-value.d.ts +2 -0
- package/dist/make-timeline-context-value.js +20 -0
- package/dist/prepare-server.d.ts +1 -1
- package/dist/prepare-server.js +5 -2
- package/dist/render-frames.d.ts +1 -1
- package/dist/render-frames.js +1 -1
- package/dist/render-media.d.ts +1 -1
- package/dist/render-on-server.js +11 -40
- package/dist/render-still.js +1 -1
- package/dist/render-svg.d.ts +8 -0
- package/dist/render-svg.js +13 -0
- package/dist/render-video-layer.d.ts +9 -0
- package/dist/render-video-layer.js +23 -0
- package/dist/render-web-frame.d.ts +9 -8
- package/dist/render-web-frame.js +36 -75
- package/dist/validate-concurrency.js +14 -9
- package/package.json +10 -10
|
@@ -1,9 +1,12 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { CompositorCommand, CompositorInitiatePayload } from './payloads';
|
|
2
2
|
export declare type Compositor = {
|
|
3
3
|
finishCommands: () => void;
|
|
4
|
-
executeCommand: (payload: Omit<
|
|
4
|
+
executeCommand: (payload: Omit<CompositorCommand, 'nonce'>) => Promise<void>;
|
|
5
5
|
waitForDone: () => Promise<void>;
|
|
6
6
|
};
|
|
7
|
-
export declare const spawnCompositorOrReuse: (renderId:
|
|
7
|
+
export declare const spawnCompositorOrReuse: ({ initiatePayload, renderId, }: {
|
|
8
|
+
initiatePayload: CompositorInitiatePayload;
|
|
9
|
+
renderId: string;
|
|
10
|
+
}) => Compositor;
|
|
8
11
|
export declare const releaseCompositorWithId: (renderId: string) => void;
|
|
9
12
|
export declare const waitForCompositorWithIdToQuit: (renderId: string) => Promise<void>;
|
|
@@ -5,9 +5,9 @@ const child_process_1 = require("child_process");
|
|
|
5
5
|
const truthy_1 = require("../truthy");
|
|
6
6
|
const get_executable_path_1 = require("./get-executable-path");
|
|
7
7
|
const compositorMap = {};
|
|
8
|
-
const spawnCompositorOrReuse = (renderId) => {
|
|
8
|
+
const spawnCompositorOrReuse = ({ initiatePayload, renderId, }) => {
|
|
9
9
|
if (!compositorMap[renderId]) {
|
|
10
|
-
compositorMap[renderId] = startCompositor();
|
|
10
|
+
compositorMap[renderId] = startCompositor(initiatePayload);
|
|
11
11
|
}
|
|
12
12
|
return compositorMap[renderId];
|
|
13
13
|
};
|
|
@@ -25,28 +25,31 @@ const waitForCompositorWithIdToQuit = (renderId) => {
|
|
|
25
25
|
return compositorMap[renderId].waitForDone();
|
|
26
26
|
};
|
|
27
27
|
exports.waitForCompositorWithIdToQuit = waitForCompositorWithIdToQuit;
|
|
28
|
-
const startCompositor = () => {
|
|
28
|
+
const startCompositor = (compositorInitiatePayload) => {
|
|
29
29
|
const bin = (0, get_executable_path_1.getExecutablePath)();
|
|
30
|
-
const child = (0, child_process_1.spawn)(bin);
|
|
31
|
-
const
|
|
32
|
-
|
|
30
|
+
const child = (0, child_process_1.spawn)(`${bin}`, [JSON.stringify(compositorInitiatePayload)]);
|
|
31
|
+
const stderrChunks = [];
|
|
32
|
+
let stdoutListeners = [];
|
|
33
|
+
let stderrListeners = [];
|
|
33
34
|
child.stderr.on('data', (d) => {
|
|
34
|
-
|
|
35
|
+
stderrChunks.push(d);
|
|
36
|
+
const str = d.toString('utf-8');
|
|
37
|
+
stderrListeners.forEach((s) => s(str));
|
|
35
38
|
});
|
|
36
39
|
child.stdout.on('data', (d) => {
|
|
37
|
-
|
|
40
|
+
const str = d.toString('utf-8');
|
|
41
|
+
stdoutListeners.forEach((s) => s(str));
|
|
38
42
|
});
|
|
39
43
|
let nonce = 0;
|
|
40
44
|
return {
|
|
41
45
|
waitForDone: () => {
|
|
42
46
|
return new Promise((resolve, reject) => {
|
|
43
47
|
child.on('exit', (code) => {
|
|
44
|
-
console.log({ code });
|
|
45
48
|
if (code === 0) {
|
|
46
49
|
resolve();
|
|
47
50
|
}
|
|
48
51
|
else {
|
|
49
|
-
reject(Buffer.concat(
|
|
52
|
+
reject(Buffer.concat(stderrChunks).toString('utf-8'));
|
|
50
53
|
}
|
|
51
54
|
});
|
|
52
55
|
});
|
|
@@ -62,10 +65,7 @@ const startCompositor = () => {
|
|
|
62
65
|
nonce++;
|
|
63
66
|
return new Promise((resolve, reject) => {
|
|
64
67
|
child.stdin.write(JSON.stringify(actualPayload) + '\n');
|
|
65
|
-
const
|
|
66
|
-
const onStderr = (d) => {
|
|
67
|
-
stderrChunks.push(d);
|
|
68
|
-
const message = Buffer.concat(stderrChunks).toString('utf-8');
|
|
68
|
+
const onStderr = (message) => {
|
|
69
69
|
let parsed = null;
|
|
70
70
|
try {
|
|
71
71
|
const content = JSON.parse(message);
|
|
@@ -81,12 +81,11 @@ const startCompositor = () => {
|
|
|
81
81
|
const err = new Error(parsed.error);
|
|
82
82
|
err.stack = parsed.error + '\n' + parsed.backtrace;
|
|
83
83
|
reject(err);
|
|
84
|
-
|
|
85
|
-
|
|
84
|
+
stdoutListeners = stdoutListeners.filter((s) => s !== onStdout);
|
|
85
|
+
stderrListeners = stderrListeners.filter((s) => s !== onStderr);
|
|
86
86
|
}
|
|
87
87
|
};
|
|
88
|
-
const onStdout = (
|
|
89
|
-
const str = d.toString('utf-8');
|
|
88
|
+
const onStdout = (str) => {
|
|
90
89
|
const lineSplit = str.split('\n');
|
|
91
90
|
for (const line of lineSplit.filter(truthy_1.truthy)) {
|
|
92
91
|
let parsed = null;
|
|
@@ -99,13 +98,13 @@ const startCompositor = () => {
|
|
|
99
98
|
catch (e) { }
|
|
100
99
|
if (parsed && parsed.nonce === actualPayload.nonce) {
|
|
101
100
|
resolve();
|
|
102
|
-
|
|
103
|
-
|
|
101
|
+
stdoutListeners = stdoutListeners.filter((s) => s !== onStdout);
|
|
102
|
+
stderrListeners = stderrListeners.filter((s) => s !== onStderr);
|
|
104
103
|
}
|
|
105
104
|
}
|
|
106
105
|
};
|
|
107
|
-
|
|
108
|
-
|
|
106
|
+
stdoutListeners.push(onStdout);
|
|
107
|
+
stderrListeners.push(onStderr);
|
|
109
108
|
});
|
|
110
109
|
},
|
|
111
110
|
};
|
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
import type { DownloadMap } from './assets/download-map';
|
|
2
2
|
export declare const createFfmpegComplexFilter: (filters: number, downloadMap: DownloadMap) => Promise<{
|
|
3
|
-
complexFilterFlag: [
|
|
4
|
-
string,
|
|
5
|
-
string
|
|
6
|
-
] | null;
|
|
3
|
+
complexFilterFlag: [string, string] | null;
|
|
7
4
|
cleanup: () => void;
|
|
8
5
|
}>;
|
|
@@ -1,2 +1,7 @@
|
|
|
1
|
+
import type { ComponentType } from 'react';
|
|
2
|
+
import type { TCompMetadata } from 'remotion';
|
|
1
3
|
import type { GetCompositionsConfig } from './get-compositions';
|
|
2
|
-
export declare const getCompositionsFromBundle: (bundle: string, options: GetCompositionsConfig) =>
|
|
4
|
+
export declare const getCompositionsFromBundle: (bundle: string, options: GetCompositionsConfig) => {
|
|
5
|
+
compositions: TCompMetadata[];
|
|
6
|
+
root: ComponentType;
|
|
7
|
+
};
|
|
@@ -48,8 +48,8 @@ const getCompositionsFromBundle = (bundle, options) => {
|
|
|
48
48
|
throw new Error('Did not call getRoot() in the bundle. Delaying the calling of getRoot() is not supported in server-side-rendering.');
|
|
49
49
|
}
|
|
50
50
|
const Comp = theRoot;
|
|
51
|
-
console.log({ Comp1: Comp });
|
|
52
51
|
const comps = (0, remotion_1.getCompositionsFromMarkup)(Comp);
|
|
53
|
-
|
|
52
|
+
remotion_1.Internals.clearRoot();
|
|
53
|
+
return { compositions: comps, root: Comp };
|
|
54
54
|
};
|
|
55
55
|
exports.getCompositionsFromBundle = getCompositionsFromBundle;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getCompositionsFromMarkup = void 0;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const server_1 = require("react-dom/server");
|
|
6
|
+
const getCompositionsFromMarkup = (Comp) => {
|
|
7
|
+
process.env.REMOTION_SERVER_RENDERING = 'true';
|
|
8
|
+
const str = (0, server_1.renderToString)((0, jsx_runtime_1.jsx)(Comp, {}));
|
|
9
|
+
const matches = str.matchAll(/<div>(.*?)<\/div>/g);
|
|
10
|
+
const metadata = [];
|
|
11
|
+
for (const match of matches) {
|
|
12
|
+
const json = JSON.parse(match[1]);
|
|
13
|
+
metadata.push(json);
|
|
14
|
+
}
|
|
15
|
+
return metadata;
|
|
16
|
+
};
|
|
17
|
+
exports.getCompositionsFromMarkup = getCompositionsFromMarkup;
|
package/dist/get-compositions.js
CHANGED
|
@@ -89,13 +89,20 @@ const getCompositions = async (serveUrlOrWebpackUrl, config) => {
|
|
|
89
89
|
close = closeServer;
|
|
90
90
|
return innerGetCompositions(serveUrl, page, config !== null && config !== void 0 ? config : {}, offthreadPort);
|
|
91
91
|
})
|
|
92
|
-
.then((comp) =>
|
|
92
|
+
.then((comp) => {
|
|
93
|
+
if (close) {
|
|
94
|
+
return Promise.all([comp, close(true)]);
|
|
95
|
+
}
|
|
96
|
+
return Promise.resolve([comp, null]);
|
|
97
|
+
})
|
|
98
|
+
.then(([comp]) => {
|
|
99
|
+
return resolve(comp);
|
|
100
|
+
})
|
|
93
101
|
.catch((err) => {
|
|
94
102
|
reject(err);
|
|
95
103
|
})
|
|
96
104
|
.finally(() => {
|
|
97
105
|
cleanup();
|
|
98
|
-
close === null || close === void 0 ? void 0 : close();
|
|
99
106
|
cleanupPageError();
|
|
100
107
|
// Clean download map if it was not passed in
|
|
101
108
|
if (!(config === null || config === void 0 ? void 0 : config.downloadMap)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const getActualConcurrency: (userPreference: number | null) => number;
|
|
1
|
+
export declare const getActualConcurrency: (userPreference: number | string | null) => number;
|
package/dist/get-concurrency.js
CHANGED
|
@@ -9,9 +9,16 @@ const getActualConcurrency = (userPreference) => {
|
|
|
9
9
|
if (userPreference === null) {
|
|
10
10
|
return Math.round(Math.min(8, Math.max(1, os_1.default.cpus().length / 2)));
|
|
11
11
|
}
|
|
12
|
-
const rounded = Math.floor(userPreference);
|
|
13
12
|
const max = os_1.default.cpus().length;
|
|
14
13
|
const min = 1;
|
|
14
|
+
let rounded;
|
|
15
|
+
if (typeof userPreference === 'string') {
|
|
16
|
+
const percentage = parseInt(userPreference.slice(0, -1), 10);
|
|
17
|
+
rounded = Math.floor((percentage / 100) * max);
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
rounded = Math.floor(userPreference);
|
|
21
|
+
}
|
|
15
22
|
if (rounded > max) {
|
|
16
23
|
throw new Error(`Maximum for --concurrency is ${max} (number of cores on this system)`);
|
|
17
24
|
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getNativeVideoSignals = void 0;
|
|
4
|
+
const getNativeVideoSignals = (layers) => {
|
|
5
|
+
const videoSignals = layers
|
|
6
|
+
.filter((l) => {
|
|
7
|
+
return l.type === 'VideoFrame';
|
|
8
|
+
})
|
|
9
|
+
.map((l) => {
|
|
10
|
+
if (l.type !== 'VideoFrame') {
|
|
11
|
+
throw new Error('Expected VideoFrame');
|
|
12
|
+
}
|
|
13
|
+
return { frame: l.params.frame, src: l.params.src };
|
|
14
|
+
});
|
|
15
|
+
const map = {};
|
|
16
|
+
// Return a map for each video source and the number of times each frame is expected to be used
|
|
17
|
+
for (const { src, frame } of videoSignals) {
|
|
18
|
+
if (!map[src]) {
|
|
19
|
+
map[src] = {};
|
|
20
|
+
}
|
|
21
|
+
if (!map[src][frame]) {
|
|
22
|
+
map[src][frame] = 0;
|
|
23
|
+
}
|
|
24
|
+
map[src][frame]++;
|
|
25
|
+
}
|
|
26
|
+
return map;
|
|
27
|
+
};
|
|
28
|
+
exports.getNativeVideoSignals = getNativeVideoSignals;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
1
2
|
import execa from 'execa';
|
|
2
3
|
import { SymbolicateableError } from './error-handling/symbolicateable-error';
|
|
3
4
|
import { mimeContentType, mimeLookup } from './mime-types';
|
|
@@ -8,7 +9,6 @@ export { Browser } from './browser';
|
|
|
8
9
|
export { BrowserExecutable } from './browser-executable';
|
|
9
10
|
export { BrowserLog } from './browser-log';
|
|
10
11
|
export { Codec, CodecOrUndefined } from './codec';
|
|
11
|
-
export { combineVideos } from './combine-videos';
|
|
12
12
|
export { Crf } from './crf';
|
|
13
13
|
export { ensureFfmpeg, EnsureFfmpegOptions, ensureFfprobe, } from './ensure-ffmpeg';
|
|
14
14
|
export { ErrorWithStackFrame } from './error-handling/handle-javascript-exception';
|
|
@@ -40,7 +40,7 @@ export declare const RenderInternals: {
|
|
|
40
40
|
feature: "enable-gpl" | "enable-libx265" | "enable-libvpx";
|
|
41
41
|
remotionRoot: string;
|
|
42
42
|
}) => Promise<boolean>;
|
|
43
|
-
getActualConcurrency: (userPreference: number | null) => number;
|
|
43
|
+
getActualConcurrency: (userPreference: string | number | null) => number;
|
|
44
44
|
validateFfmpeg: (customFfmpegBinary: string | null, remotionRoot: string, binary: "ffmpeg" | "ffprobe") => Promise<void>;
|
|
45
45
|
serveStatic: (path: string | null, options: {
|
|
46
46
|
port: number | null;
|
|
@@ -114,8 +114,8 @@ export declare const RenderInternals: {
|
|
|
114
114
|
validPixelFormats: readonly ["yuv420p", "yuva420p", "yuv422p", "yuv444p", "yuv420p10le", "yuv422p10le", "yuv444p10le", "yuva444p10le"];
|
|
115
115
|
DEFAULT_BROWSER: import("./browser").Browser;
|
|
116
116
|
validateFrameRange: (frameRange: import("./frame-range").FrameRange | null) => void;
|
|
117
|
-
DEFAULT_OPENGL_RENDERER: "
|
|
118
|
-
validateOpenGlRenderer: (option: "
|
|
117
|
+
DEFAULT_OPENGL_RENDERER: "swangle" | "angle" | "egl" | "swiftshader" | null;
|
|
118
|
+
validateOpenGlRenderer: (option: "swangle" | "angle" | "egl" | "swiftshader" | null) => "swangle" | "angle" | "egl" | "swiftshader" | null;
|
|
119
119
|
validImageFormats: readonly ["png", "jpeg", "none"];
|
|
120
120
|
validCodecs: readonly ["h264", "h265", "vp8", "vp9", "mp3", "aac", "wav", "prores", "h264-mkv", "gif"];
|
|
121
121
|
DEFAULT_PIXEL_FORMAT: "yuv420p" | "yuva420p" | "yuv422p" | "yuv444p" | "yuv420p10le" | "yuv422p10le" | "yuv444p10le" | "yuva444p10le";
|
|
@@ -125,7 +125,7 @@ export declare const RenderInternals: {
|
|
|
125
125
|
DEFAULT_CODEC: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif";
|
|
126
126
|
isAudioCodec: (codec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif" | undefined) => boolean;
|
|
127
127
|
logLevels: readonly ["verbose", "info", "warn", "error"];
|
|
128
|
-
isEqualOrBelowLogLevel: (currentLevel: "
|
|
128
|
+
isEqualOrBelowLogLevel: (currentLevel: "verbose" | "error" | "info" | "warn", level: "verbose" | "error" | "info" | "warn") => boolean;
|
|
129
129
|
isValidLogLevel: (level: string) => boolean;
|
|
130
130
|
perf: typeof perf;
|
|
131
131
|
makeDownloadMap: () => import("./assets/download-map").DownloadMap;
|
|
@@ -141,4 +141,16 @@ export declare const RenderInternals: {
|
|
|
141
141
|
ffmpegExecutable: string | null;
|
|
142
142
|
remotionRoot: string;
|
|
143
143
|
}) => Promise<import("./ffmpeg-flags").FfmpegVersion>;
|
|
144
|
+
combineVideos: (options: {
|
|
145
|
+
files: string[];
|
|
146
|
+
filelistDir: string;
|
|
147
|
+
output: string;
|
|
148
|
+
onProgress: (p: number) => void;
|
|
149
|
+
numberOfFrames: number;
|
|
150
|
+
codec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif";
|
|
151
|
+
fps: number;
|
|
152
|
+
numberOfGifLoops: number | null;
|
|
153
|
+
remotionRoot: string;
|
|
154
|
+
ffmpegExecutable: import("./ffmpeg-executable").FfmpegExecutable;
|
|
155
|
+
}) => Promise<void>;
|
|
144
156
|
};
|
package/dist/index.js
CHANGED
|
@@ -26,7 +26,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
26
26
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
27
|
};
|
|
28
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
-
exports.RenderInternals = exports.validateOutputFilename = exports.stitchFramesToVideo = exports.renderStill = exports.renderMedia = exports.renderFrames = exports.openBrowser = exports.makeCancelSignal = exports.validImageFormats = exports.validateSelectedPixelFormatAndImageFormatCombination = exports.getCompositions = exports.getCanExtractFramesFast = exports.ErrorWithStackFrame = exports.ensureFfprobe = exports.ensureFfmpeg =
|
|
29
|
+
exports.RenderInternals = exports.validateOutputFilename = exports.stitchFramesToVideo = exports.renderStill = exports.renderMedia = exports.renderFrames = exports.openBrowser = exports.makeCancelSignal = exports.validImageFormats = exports.validateSelectedPixelFormatAndImageFormatCombination = exports.getCompositions = exports.getCanExtractFramesFast = exports.ErrorWithStackFrame = exports.ensureFfprobe = exports.ensureFfmpeg = void 0;
|
|
30
30
|
const execa_1 = __importDefault(require("execa"));
|
|
31
31
|
const download_file_1 = require("./assets/download-file");
|
|
32
32
|
const download_map_1 = require("./assets/download-map");
|
|
@@ -35,6 +35,7 @@ const TimeoutSettings_1 = require("./browser/TimeoutSettings");
|
|
|
35
35
|
const can_use_parallel_encoding_1 = require("./can-use-parallel-encoding");
|
|
36
36
|
const check_apple_silicon_1 = require("./check-apple-silicon");
|
|
37
37
|
const codec_1 = require("./codec");
|
|
38
|
+
const combine_videos_1 = require("./combine-videos");
|
|
38
39
|
const convert_to_positive_frame_index_1 = require("./convert-to-positive-frame-index");
|
|
39
40
|
const delete_directory_1 = require("./delete-directory");
|
|
40
41
|
const ensure_output_directory_1 = require("./ensure-output-directory");
|
|
@@ -71,8 +72,6 @@ const validate_opengl_renderer_1 = require("./validate-opengl-renderer");
|
|
|
71
72
|
const validate_puppeteer_timeout_1 = require("./validate-puppeteer-timeout");
|
|
72
73
|
const validate_videobitrate_1 = require("./validate-videobitrate");
|
|
73
74
|
const wait_for_symbolication_error_to_be_done_1 = require("./wait-for-symbolication-error-to-be-done");
|
|
74
|
-
var combine_videos_1 = require("./combine-videos");
|
|
75
|
-
Object.defineProperty(exports, "combineVideos", { enumerable: true, get: function () { return combine_videos_1.combineVideos; } });
|
|
76
75
|
var ensure_ffmpeg_1 = require("./ensure-ffmpeg");
|
|
77
76
|
Object.defineProperty(exports, "ensureFfmpeg", { enumerable: true, get: function () { return ensure_ffmpeg_1.ensureFfmpeg; } });
|
|
78
77
|
Object.defineProperty(exports, "ensureFfprobe", { enumerable: true, get: function () { return ensure_ffmpeg_1.ensureFfprobe; } });
|
|
@@ -153,6 +152,7 @@ exports.RenderInternals = {
|
|
|
153
152
|
getExecutableBinary: ffmpeg_flags_1.getExecutableBinary,
|
|
154
153
|
validateBitrate: validate_videobitrate_1.validateBitrate,
|
|
155
154
|
getFfmpegVersion: ffmpeg_flags_1.getFfmpegVersion,
|
|
155
|
+
combineVideos: combine_videos_1.combineVideos,
|
|
156
156
|
};
|
|
157
157
|
// Warn of potential performance issues with Apple Silicon (M1 chip under Rosetta)
|
|
158
158
|
(0, check_apple_silicon_1.checkNodeVersionAndWarnAboutRosetta)();
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.makeCompManagerContext = void 0;
|
|
4
|
+
const makeCompManagerContext = (composition) => {
|
|
5
|
+
const memo = {
|
|
6
|
+
assets: [],
|
|
7
|
+
compositions: [composition],
|
|
8
|
+
currentComposition: composition.id,
|
|
9
|
+
currentCompositionMetadata: composition,
|
|
10
|
+
folders: [],
|
|
11
|
+
registerAsset: () => {
|
|
12
|
+
throw new Error('Not implemented');
|
|
13
|
+
},
|
|
14
|
+
registerComposition: () => {
|
|
15
|
+
throw new Error('Not implemented');
|
|
16
|
+
},
|
|
17
|
+
registerFolder: () => {
|
|
18
|
+
throw new Error('Not implemented');
|
|
19
|
+
},
|
|
20
|
+
setCurrentComposition: () => {
|
|
21
|
+
throw new Error('Not implemented');
|
|
22
|
+
},
|
|
23
|
+
registerSequence() {
|
|
24
|
+
throw new Error('Not implemented');
|
|
25
|
+
},
|
|
26
|
+
sequences: [],
|
|
27
|
+
setCurrentCompositionMetadata: () => {
|
|
28
|
+
throw new Error('Not implemented');
|
|
29
|
+
},
|
|
30
|
+
unregisterAsset: () => {
|
|
31
|
+
throw new Error('Not implemented');
|
|
32
|
+
},
|
|
33
|
+
unregisterComposition: () => {
|
|
34
|
+
throw new Error('Not implemented');
|
|
35
|
+
},
|
|
36
|
+
unregisterFolder: () => {
|
|
37
|
+
throw new Error('Not implemented');
|
|
38
|
+
},
|
|
39
|
+
unregisterSequence: () => {
|
|
40
|
+
throw new Error('Not implemented');
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
return memo;
|
|
44
|
+
};
|
|
45
|
+
exports.makeCompManagerContext = makeCompManagerContext;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.makeTimelineContextValue = void 0;
|
|
4
|
+
const makeTimelineContextValue = (composition, frame) => {
|
|
5
|
+
const value = {
|
|
6
|
+
audioAndVideoTags: { current: [] },
|
|
7
|
+
rootId: composition.id,
|
|
8
|
+
playing: false,
|
|
9
|
+
playbackRate: 1,
|
|
10
|
+
imperativePlaying: {
|
|
11
|
+
current: false,
|
|
12
|
+
},
|
|
13
|
+
frame,
|
|
14
|
+
setPlaybackRate: () => {
|
|
15
|
+
throw new Error('Not implemented');
|
|
16
|
+
},
|
|
17
|
+
};
|
|
18
|
+
return value;
|
|
19
|
+
};
|
|
20
|
+
exports.makeTimelineContextValue = makeTimelineContextValue;
|
package/dist/prepare-server.d.ts
CHANGED
|
@@ -12,6 +12,6 @@ export declare const prepareServer: ({ ffmpegExecutable, ffprobeExecutable, onDo
|
|
|
12
12
|
remotionRoot: string;
|
|
13
13
|
}) => Promise<{
|
|
14
14
|
serveUrl: string;
|
|
15
|
-
closeServer: () => Promise<unknown>;
|
|
15
|
+
closeServer: (force: boolean) => Promise<unknown>;
|
|
16
16
|
offthreadPort: number;
|
|
17
17
|
}>;
|
package/dist/prepare-server.js
CHANGED
|
@@ -44,8 +44,11 @@ const prepareServer = async ({ ffmpegExecutable, ffprobeExecutable, onDownload,
|
|
|
44
44
|
remotionRoot,
|
|
45
45
|
});
|
|
46
46
|
return Promise.resolve({
|
|
47
|
-
closeServer: () => {
|
|
48
|
-
|
|
47
|
+
closeServer: async (force) => {
|
|
48
|
+
if (!force) {
|
|
49
|
+
await (0, wait_for_symbolication_error_to_be_done_1.waitForSymbolicationToBeDone)();
|
|
50
|
+
}
|
|
51
|
+
return close();
|
|
49
52
|
},
|
|
50
53
|
serveUrl: `http://localhost:${serverPort}`,
|
|
51
54
|
offthreadPort: serverPort,
|
package/dist/render-frames.d.ts
CHANGED
|
@@ -21,7 +21,7 @@ declare type ConfigOrComposition = {
|
|
|
21
21
|
composition: SmallTCompMetadata;
|
|
22
22
|
};
|
|
23
23
|
declare type ConcurrencyOrParallelism = {
|
|
24
|
-
concurrency?: number | null;
|
|
24
|
+
concurrency?: number | string | null;
|
|
25
25
|
} | {
|
|
26
26
|
/**
|
|
27
27
|
* @deprecated This field has been renamed to `concurrency`
|
package/dist/render-frames.js
CHANGED
|
@@ -343,7 +343,7 @@ const renderFrames = (options) => {
|
|
|
343
343
|
const browserReplacer = (0, replace_browser_1.handleBrowserCrash)(puppeteerInstance);
|
|
344
344
|
const { stopCycling } = (0, cycle_browser_tabs_1.cycleBrowserTabs)(browserReplacer, actualConcurrency);
|
|
345
345
|
cleanup.push(stopCycling);
|
|
346
|
-
cleanup.push(closeServer);
|
|
346
|
+
cleanup.push(() => closeServer(false));
|
|
347
347
|
return innerRenderFrames({
|
|
348
348
|
...options,
|
|
349
349
|
puppeteerInstance,
|
package/dist/render-media.d.ts
CHANGED
|
@@ -71,7 +71,7 @@ export declare type RenderMediaOptions = {
|
|
|
71
71
|
disallowParallelEncoding?: boolean;
|
|
72
72
|
} & ServeUrlOrWebpackBundle & ConcurrencyOrParallelism;
|
|
73
73
|
declare type ConcurrencyOrParallelism = {
|
|
74
|
-
concurrency?: number | null;
|
|
74
|
+
concurrency?: number | string | null;
|
|
75
75
|
} | {
|
|
76
76
|
/**
|
|
77
77
|
* @deprecated This field has been renamed to `concurrency`
|
package/dist/render-on-server.js
CHANGED
|
@@ -13,51 +13,14 @@ const download_map_1 = require("./assets/download-map");
|
|
|
13
13
|
const compose_1 = require("./compositor/compose");
|
|
14
14
|
const compositor_1 = require("./compositor/compositor");
|
|
15
15
|
const get_frame_padded_index_1 = require("./get-frame-padded-index");
|
|
16
|
+
const make_comp_manager_context_1 = require("./make-comp-manager-context");
|
|
16
17
|
const pool_1 = require("./pool");
|
|
17
18
|
const renderOnServer = async (Comp, composition) => {
|
|
18
19
|
console.time('total');
|
|
19
20
|
console.time('frames');
|
|
20
21
|
process.env.REMOTION_SERVER_RENDERING = 'true';
|
|
21
|
-
process.env.SELECT_COMP_ID = composition.id;
|
|
22
22
|
// eslint-disable-next-line react/jsx-no-constructed-context-values
|
|
23
|
-
const memo =
|
|
24
|
-
assets: [],
|
|
25
|
-
compositions: [composition],
|
|
26
|
-
currentComposition: composition.id,
|
|
27
|
-
currentCompositionMetadata: composition,
|
|
28
|
-
folders: [],
|
|
29
|
-
registerAsset: () => {
|
|
30
|
-
throw new Error('Not implemented');
|
|
31
|
-
},
|
|
32
|
-
registerComposition: () => {
|
|
33
|
-
throw new Error('Not implemented');
|
|
34
|
-
},
|
|
35
|
-
registerFolder: () => {
|
|
36
|
-
throw new Error('Not implemented');
|
|
37
|
-
},
|
|
38
|
-
setCurrentComposition: () => {
|
|
39
|
-
throw new Error('Not implemented');
|
|
40
|
-
},
|
|
41
|
-
registerSequence() {
|
|
42
|
-
throw new Error('Not implemented');
|
|
43
|
-
},
|
|
44
|
-
sequences: [],
|
|
45
|
-
setCurrentCompositionMetadata: () => {
|
|
46
|
-
throw new Error('Not implemented');
|
|
47
|
-
},
|
|
48
|
-
unregisterAsset: () => {
|
|
49
|
-
throw new Error('Not implemented');
|
|
50
|
-
},
|
|
51
|
-
unregisterComposition: () => {
|
|
52
|
-
throw new Error('Not implemented');
|
|
53
|
-
},
|
|
54
|
-
unregisterFolder: () => {
|
|
55
|
-
throw new Error('Not implemented');
|
|
56
|
-
},
|
|
57
|
-
unregisterSequence: () => {
|
|
58
|
-
throw new Error('Not implemented');
|
|
59
|
-
},
|
|
60
|
-
};
|
|
23
|
+
const memo = (0, make_comp_manager_context_1.makeCompManagerContext)(composition);
|
|
61
24
|
const pool = new pool_1.Pool(new Array(4).fill(true).map((_, i) => i));
|
|
62
25
|
const downloadMap = (0, download_map_1.makeDownloadMap)();
|
|
63
26
|
const renderId = 'abc';
|
|
@@ -77,7 +40,7 @@ const renderOnServer = async (Comp, composition) => {
|
|
|
77
40
|
throw new Error('Not implemented');
|
|
78
41
|
},
|
|
79
42
|
};
|
|
80
|
-
const svg = (0, server_1.renderToStaticMarkup)((0, jsx_runtime_1.jsx)(remotion_1.Internals.Timeline.TimelineContext.Provider, { value: value, children: (0, jsx_runtime_1.jsx)(remotion_1.Internals.CompositionManager.Provider, { value: memo, children: (0, jsx_runtime_1.jsx)(Comp, {}) }) }));
|
|
43
|
+
const svg = (0, server_1.renderToStaticMarkup)((0, jsx_runtime_1.jsx)(remotion_1.Internals.SelectCompositionMode, { layer: 0, id: composition.id, children: (0, jsx_runtime_1.jsx)(remotion_1.Internals.Timeline.TimelineContext.Provider, { value: value, children: (0, jsx_runtime_1.jsx)(remotion_1.Internals.CompositionManager.Provider, { value: memo, children: (0, jsx_runtime_1.jsx)(Comp, {}) }) }) }));
|
|
81
44
|
const out = path_1.default.join(downloadMap.compositingDir, (0, get_frame_padded_index_1.getFrameOutputFileName)({
|
|
82
45
|
frame: i,
|
|
83
46
|
imageFormat: 'tiff',
|
|
@@ -105,6 +68,14 @@ const renderOnServer = async (Comp, composition) => {
|
|
|
105
68
|
],
|
|
106
69
|
output: out,
|
|
107
70
|
renderId,
|
|
71
|
+
compositorInitiatePayload: {
|
|
72
|
+
create_h264_queue: true,
|
|
73
|
+
duration_in_frames: 300,
|
|
74
|
+
fps: 30,
|
|
75
|
+
video_signals: {},
|
|
76
|
+
height: composition.height,
|
|
77
|
+
width: composition.width,
|
|
78
|
+
},
|
|
108
79
|
});
|
|
109
80
|
pool.release(frame);
|
|
110
81
|
}));
|
package/dist/render-still.js
CHANGED
|
@@ -208,7 +208,7 @@ const renderStill = (options) => {
|
|
|
208
208
|
if (!(options === null || options === void 0 ? void 0 : options.downloadMap)) {
|
|
209
209
|
(0, download_map_1.cleanDownloadMap)(downloadMap);
|
|
210
210
|
}
|
|
211
|
-
return close === null || close === void 0 ? void 0 : close();
|
|
211
|
+
return close === null || close === void 0 ? void 0 : close(false);
|
|
212
212
|
});
|
|
213
213
|
});
|
|
214
214
|
return Promise.race([
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ComponentType } from 'react';
|
|
2
|
+
import type { TCompMetadata } from 'remotion';
|
|
3
|
+
export declare const renderSvg: ({ composition, Comp, frame, layer, }: {
|
|
4
|
+
composition: TCompMetadata;
|
|
5
|
+
Comp: ComponentType;
|
|
6
|
+
frame: number;
|
|
7
|
+
layer: number;
|
|
8
|
+
}) => string;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.renderSvg = void 0;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const server_1 = require("react-dom/server");
|
|
6
|
+
const remotion_1 = require("remotion");
|
|
7
|
+
const make_comp_manager_context_1 = require("./make-comp-manager-context");
|
|
8
|
+
const make_timeline_context_value_1 = require("./make-timeline-context-value");
|
|
9
|
+
const renderSvg = ({ composition, Comp, frame, layer, }) => {
|
|
10
|
+
const svg = (0, server_1.renderToStaticMarkup)((0, jsx_runtime_1.jsx)(remotion_1.Internals.SelectCompositionMode, { layer: layer, id: composition.id, children: (0, jsx_runtime_1.jsx)(remotion_1.Internals.Timeline.TimelineContext.Provider, { value: (0, make_timeline_context_value_1.makeTimelineContextValue)(composition, frame), children: (0, jsx_runtime_1.jsx)(remotion_1.Internals.CompositionManager.Provider, { value: (0, make_comp_manager_context_1.makeCompManagerContext)(composition), children: (0, jsx_runtime_1.jsx)(Comp, {}) }) }) }));
|
|
11
|
+
return svg;
|
|
12
|
+
};
|
|
13
|
+
exports.renderSvg = renderSvg;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ComponentType } from 'react';
|
|
2
|
+
import type { TCompMetadata } from 'remotion';
|
|
3
|
+
import type { NativeVideoLayerInfo } from 'remotion/src/video/NativeVideoForRendering';
|
|
4
|
+
export declare const renderVideoLayer: ({ composition, Comp, frame, layer, }: {
|
|
5
|
+
composition: TCompMetadata;
|
|
6
|
+
Comp: ComponentType;
|
|
7
|
+
frame: number;
|
|
8
|
+
layer: number;
|
|
9
|
+
}) => NativeVideoLayerInfo | null;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.renderVideoLayer = void 0;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const server_1 = require("react-dom/server");
|
|
6
|
+
const remotion_1 = require("remotion");
|
|
7
|
+
const make_comp_manager_context_1 = require("./make-comp-manager-context");
|
|
8
|
+
const make_timeline_context_value_1 = require("./make-timeline-context-value");
|
|
9
|
+
const renderVideoLayer = ({ composition, Comp, frame, layer, }) => {
|
|
10
|
+
process.env.REMOTION_SERVER_RENDERING = 'true';
|
|
11
|
+
const markup = (0, server_1.renderToStaticMarkup)((0, jsx_runtime_1.jsx)(remotion_1.Internals.SelectCompositionMode, { layer: layer, id: composition.id, children: (0, jsx_runtime_1.jsx)(remotion_1.Internals.Timeline.TimelineContext.Provider, { value: (0, make_timeline_context_value_1.makeTimelineContextValue)(composition, frame), children: (0, jsx_runtime_1.jsx)(remotion_1.Internals.CompositionManager.Provider, { value: (0, make_comp_manager_context_1.makeCompManagerContext)(composition), children: (0, jsx_runtime_1.jsx)(Comp, {}) }) }) }));
|
|
12
|
+
const matches = markup.matchAll(/<div>(.*?)<\/div>/g);
|
|
13
|
+
let parsed = null;
|
|
14
|
+
for (const match of matches) {
|
|
15
|
+
if (parsed) {
|
|
16
|
+
throw new Error('cannot have more than one video layer');
|
|
17
|
+
}
|
|
18
|
+
const json = JSON.parse(match[1]);
|
|
19
|
+
parsed = json;
|
|
20
|
+
}
|
|
21
|
+
return parsed;
|
|
22
|
+
};
|
|
23
|
+
exports.renderVideoLayer = renderVideoLayer;
|
|
@@ -1,15 +1,16 @@
|
|
|
1
|
-
|
|
2
|
-
import type {
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import type { SmallTCompMetadata, TAsset } from 'remotion';
|
|
3
3
|
import type { DownloadMap } from './assets/download-map';
|
|
4
4
|
import type { BrowserExecutable } from './browser-executable';
|
|
5
5
|
import type { BrowserLog } from './browser-log';
|
|
6
6
|
import type { Page } from './browser/BrowserPage';
|
|
7
|
+
import type { CompositorLayer } from './compositor/payloads';
|
|
7
8
|
import type { CountType } from './get-frame-padded-index';
|
|
8
9
|
import type { ServeUrl } from './legacy-webpack-config';
|
|
9
10
|
import type { ChromiumOptions } from './open-browser';
|
|
10
11
|
import type { Pool } from './pool';
|
|
11
12
|
import type { BrowserReplacer } from './replace-browser';
|
|
12
|
-
export declare const renderWebFrameAndRetryTargetClose: ({ frame, index, retriesLeft, attempt, actualConcurrency, browserReplacer, poolPromise, composition, downloadMap, imageFormat, onFrameBuffer,
|
|
13
|
+
export declare const renderWebFrameAndRetryTargetClose: ({ frame, index, retriesLeft, attempt, actualConcurrency, browserReplacer, poolPromise, composition, downloadMap, imageFormat, onFrameBuffer, outputDir, stopState, countType, scale, quality, framesToRender, lastFrame, framesRendered, browserExecutable, chromiumOptions, dumpBrowserLogs, pagesArray, onBrowserLog, inputProps, envVariables, muted, proxyPort, realFrameRange, serveUrl, timeoutInMilliseconds, }: {
|
|
13
14
|
frame: number;
|
|
14
15
|
index: number;
|
|
15
16
|
retriesLeft: number;
|
|
@@ -21,12 +22,10 @@ export declare const renderWebFrameAndRetryTargetClose: ({ frame, index, retries
|
|
|
21
22
|
downloadMap: DownloadMap;
|
|
22
23
|
imageFormat: 'png' | 'jpeg' | 'none';
|
|
23
24
|
onFrameBuffer: ((buffer: Buffer, frame: number) => void) | undefined;
|
|
24
|
-
onFrameUpdate: (framesRendered: number, frameIndex: number, timeToRenderInMilliseconds: number) => void;
|
|
25
25
|
outputDir: string | null;
|
|
26
26
|
stopState: {
|
|
27
27
|
isStopped: boolean;
|
|
28
28
|
};
|
|
29
|
-
assets: TAsset[][];
|
|
30
29
|
countType: CountType;
|
|
31
30
|
scale: number;
|
|
32
31
|
quality: number | undefined;
|
|
@@ -47,9 +46,11 @@ export declare const renderWebFrameAndRetryTargetClose: ({ frame, index, retries
|
|
|
47
46
|
realFrameRange: [number, number];
|
|
48
47
|
serveUrl: ServeUrl;
|
|
49
48
|
timeoutInMilliseconds: number;
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
49
|
+
}) => Promise<{
|
|
50
|
+
layer: CompositorLayer | null;
|
|
51
|
+
buffer: Buffer | null;
|
|
52
|
+
assets: TAsset[];
|
|
53
|
+
}>;
|
|
53
54
|
export declare const makePage: ({ browserReplacer, pagesArray, composition, scale, onBrowserLog, inputProps, envVariables, serveUrl, realFrameRange, timeoutInMilliseconds, proxyPort, imageFormat, muted, }: {
|
|
54
55
|
browserReplacer: BrowserReplacer;
|
|
55
56
|
pagesArray: Page[];
|
package/dist/render-web-frame.js
CHANGED
|
@@ -5,11 +5,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.makeBrowser = exports.makePage = exports.renderWebFrameAndRetryTargetClose = void 0;
|
|
7
7
|
const path_1 = __importDefault(require("path"));
|
|
8
|
-
const download_and_map_assets_to_file_1 = require("./assets/download-and-map-assets-to-file");
|
|
9
8
|
const browser_1 = require("./browser");
|
|
10
|
-
const compress_assets_1 = require("./compress-assets");
|
|
11
9
|
const handle_javascript_exception_1 = require("./error-handling/handle-javascript-exception");
|
|
12
|
-
const get_frame_padded_index_1 = require("./get-frame-padded-index");
|
|
13
10
|
const make_cancel_signal_1 = require("./make-cancel-signal");
|
|
14
11
|
const open_browser_1 = require("./open-browser");
|
|
15
12
|
const perf_1 = require("./perf");
|
|
@@ -17,14 +14,13 @@ const puppeteer_evaluate_1 = require("./puppeteer-evaluate");
|
|
|
17
14
|
const seek_to_frame_1 = require("./seek-to-frame");
|
|
18
15
|
const set_props_and_env_1 = require("./set-props-and-env");
|
|
19
16
|
const take_frame_and_compose_1 = require("./take-frame-and-compose");
|
|
20
|
-
const
|
|
21
|
-
const renderFrameWithOptionToReject = async ({ frame, index, reject, width, height, poolPromise, stopState, outputDir, onFrameBuffer, imageFormat, downloadMap, onFrameUpdate, scale, assets, countType, quality, framesToRender, lastFrame, framesRendered, onDownload, onError, }) => {
|
|
17
|
+
const renderFrameWithOptionToReject = async ({ frame, index, reject, width, height, poolPromise, stopState, imageFormat, downloadMap, scale, quality, }) => {
|
|
22
18
|
const pool = await poolPromise;
|
|
23
19
|
const freePage = await pool.acquire();
|
|
24
20
|
if (stopState.isStopped) {
|
|
25
|
-
|
|
21
|
+
reject(new Error('Render was stopped'));
|
|
22
|
+
throw new Error('stopped');
|
|
26
23
|
}
|
|
27
|
-
const startTime = performance.now();
|
|
28
24
|
const errorCallbackOnFrame = (err) => {
|
|
29
25
|
reject(err);
|
|
30
26
|
};
|
|
@@ -35,58 +31,45 @@ const renderFrameWithOptionToReject = async ({ frame, index, reject, width, heig
|
|
|
35
31
|
});
|
|
36
32
|
freePage.on('error', errorCallbackOnFrame);
|
|
37
33
|
await (0, seek_to_frame_1.seekToFrame)({ frame, page: freePage });
|
|
38
|
-
if (!outputDir && !onFrameBuffer && imageFormat !== 'none') {
|
|
39
|
-
throw new Error('Called renderFrames() without specifying either `outputDir` or `onFrameBuffer`');
|
|
40
|
-
}
|
|
41
|
-
if (outputDir && onFrameBuffer && imageFormat !== 'none') {
|
|
42
|
-
throw new Error('Pass either `outputDir` or `onFrameBuffer` to renderFrames(), not both.');
|
|
43
|
-
}
|
|
44
34
|
const id = (0, perf_1.startPerfMeasure)('save');
|
|
45
|
-
const
|
|
46
|
-
const { buffer, collectedAssets } = await (0, take_frame_and_compose_1.
|
|
35
|
+
const output = path_1.default.join(downloadMap.compositingDir, `preframe-${index}.${imageFormat}`);
|
|
36
|
+
const { buffer, collectedAssets, clipRegion } = await (0, take_frame_and_compose_1.takeFrame)({
|
|
47
37
|
frame,
|
|
48
38
|
freePage,
|
|
49
39
|
height,
|
|
50
40
|
imageFormat,
|
|
51
|
-
output: path_1.default.join(frameDir, (0, get_frame_padded_index_1.getFrameOutputFileName)({
|
|
52
|
-
frame,
|
|
53
|
-
imageFormat,
|
|
54
|
-
index,
|
|
55
|
-
countType,
|
|
56
|
-
lastFrame,
|
|
57
|
-
totalFrames: framesToRender.length,
|
|
58
|
-
})),
|
|
59
41
|
quality,
|
|
60
42
|
width,
|
|
61
|
-
scale,
|
|
62
|
-
downloadMap,
|
|
63
|
-
wantsBuffer: Boolean(onFrameBuffer),
|
|
64
43
|
});
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
44
|
+
const needsComposing = clipRegion === null
|
|
45
|
+
? null
|
|
46
|
+
: {
|
|
47
|
+
tmpFile: path_1.default.join(downloadMap.compositingDir, `${frame}.${imageFormat}`),
|
|
48
|
+
finalOutfie: output !== null && output !== void 0 ? output : path_1.default.join(downloadMap.compositingDir, `${frame}-final.${imageFormat}`),
|
|
49
|
+
clipRegion: clipRegion,
|
|
50
|
+
};
|
|
51
|
+
const compositionLayer = !needsComposing || needsComposing.clipRegion === 'hide'
|
|
52
|
+
? null
|
|
53
|
+
: {
|
|
54
|
+
type: imageFormat === 'jpeg'
|
|
55
|
+
? 'JpgImage'
|
|
56
|
+
: 'PngImage',
|
|
57
|
+
params: {
|
|
58
|
+
height: needsComposing.clipRegion.height * scale,
|
|
59
|
+
width: needsComposing.clipRegion.width * scale,
|
|
60
|
+
src: needsComposing.tmpFile,
|
|
61
|
+
x: needsComposing.clipRegion.x * scale,
|
|
62
|
+
y: needsComposing.clipRegion.y * scale,
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
// TODO: Always return buffer
|
|
71
66
|
(0, perf_1.stopPerfMeasure)(id);
|
|
72
|
-
const compressedAssets = collectedAssets.map((asset) => (0, compress_assets_1.compressAsset)(assets.filter(truthy_1.truthy).flat(1), asset));
|
|
73
|
-
assets[index] = compressedAssets;
|
|
74
|
-
compressedAssets.forEach((asset) => {
|
|
75
|
-
(0, download_and_map_assets_to_file_1.downloadAndMapAssetsToFileUrl)({
|
|
76
|
-
asset,
|
|
77
|
-
onDownload,
|
|
78
|
-
downloadMap,
|
|
79
|
-
}).catch((err) => {
|
|
80
|
-
onError(new Error(`Error while downloading asset: ${err.stack}`));
|
|
81
|
-
});
|
|
82
|
-
});
|
|
83
|
-
framesRendered.frames++;
|
|
84
|
-
onFrameUpdate(framesRendered.frames, frame, performance.now() - startTime);
|
|
85
67
|
cleanupPageError();
|
|
86
68
|
freePage.off('error', errorCallbackOnFrame);
|
|
87
69
|
pool.release(freePage);
|
|
70
|
+
return { layer: compositionLayer, buffer, assets: collectedAssets };
|
|
88
71
|
};
|
|
89
|
-
const renderWebFrame = ({ frame, index, downloadMap, imageFormat,
|
|
72
|
+
const renderWebFrame = ({ frame, index, downloadMap, imageFormat, poolPromise, stopState, composition, scale, quality, }) => {
|
|
90
73
|
return new Promise((resolve, reject) => {
|
|
91
74
|
renderFrameWithOptionToReject({
|
|
92
75
|
frame,
|
|
@@ -96,53 +79,34 @@ const renderWebFrame = ({ frame, index, downloadMap, imageFormat, onFrameBuffer,
|
|
|
96
79
|
height: composition.height,
|
|
97
80
|
downloadMap,
|
|
98
81
|
imageFormat,
|
|
99
|
-
onFrameBuffer,
|
|
100
|
-
onFrameUpdate,
|
|
101
|
-
outputDir,
|
|
102
82
|
poolPromise,
|
|
103
83
|
stopState,
|
|
104
|
-
assets,
|
|
105
|
-
countType,
|
|
106
84
|
scale,
|
|
107
85
|
quality,
|
|
108
|
-
framesToRender,
|
|
109
|
-
lastFrame,
|
|
110
|
-
framesRendered,
|
|
111
|
-
onDownload,
|
|
112
|
-
onError,
|
|
113
86
|
})
|
|
114
|
-
.then(() => {
|
|
115
|
-
resolve();
|
|
87
|
+
.then((res) => {
|
|
88
|
+
resolve(res);
|
|
116
89
|
})
|
|
117
90
|
.catch((err) => {
|
|
118
91
|
reject(err);
|
|
119
92
|
});
|
|
120
93
|
});
|
|
121
94
|
};
|
|
122
|
-
const renderWebFrameAndRetryTargetClose = async ({ frame, index, retriesLeft, attempt, actualConcurrency, browserReplacer, poolPromise, composition, downloadMap, imageFormat, onFrameBuffer,
|
|
95
|
+
const renderWebFrameAndRetryTargetClose = async ({ frame, index, retriesLeft, attempt, actualConcurrency, browserReplacer, poolPromise, composition, downloadMap, imageFormat, onFrameBuffer, outputDir, stopState, countType, scale, quality, framesToRender, lastFrame, framesRendered, browserExecutable, chromiumOptions, dumpBrowserLogs, pagesArray, onBrowserLog, inputProps, envVariables, muted, proxyPort, realFrameRange, serveUrl, timeoutInMilliseconds, }) => {
|
|
123
96
|
var _a, _b;
|
|
124
97
|
try {
|
|
125
|
-
await renderWebFrame({
|
|
98
|
+
const returnval = await renderWebFrame({
|
|
126
99
|
frame,
|
|
127
100
|
index,
|
|
128
101
|
poolPromise,
|
|
129
102
|
composition,
|
|
130
103
|
downloadMap,
|
|
131
104
|
imageFormat,
|
|
132
|
-
onFrameBuffer,
|
|
133
|
-
onFrameUpdate,
|
|
134
|
-
outputDir,
|
|
135
105
|
stopState,
|
|
136
|
-
assets,
|
|
137
|
-
countType,
|
|
138
106
|
scale,
|
|
139
107
|
quality,
|
|
140
|
-
framesToRender,
|
|
141
|
-
lastFrame,
|
|
142
|
-
framesRendered,
|
|
143
|
-
onDownload,
|
|
144
|
-
onError,
|
|
145
108
|
});
|
|
109
|
+
return returnval;
|
|
146
110
|
}
|
|
147
111
|
catch (err) {
|
|
148
112
|
if (!((_a = err === null || err === void 0 ? void 0 : err.message) === null || _a === void 0 ? void 0 : _a.includes('Target closed')) &&
|
|
@@ -187,7 +151,7 @@ const renderWebFrameAndRetryTargetClose = async ({ frame, index, retriesLeft, at
|
|
|
187
151
|
pool.release(newPage);
|
|
188
152
|
}
|
|
189
153
|
});
|
|
190
|
-
await (0, exports.renderWebFrameAndRetryTargetClose)({
|
|
154
|
+
const fram = await (0, exports.renderWebFrameAndRetryTargetClose)({
|
|
191
155
|
frame,
|
|
192
156
|
index,
|
|
193
157
|
retriesLeft: retriesLeft - 1,
|
|
@@ -198,11 +162,9 @@ const renderWebFrameAndRetryTargetClose = async ({ frame, index, retriesLeft, at
|
|
|
198
162
|
downloadMap,
|
|
199
163
|
imageFormat,
|
|
200
164
|
onFrameBuffer,
|
|
201
|
-
onFrameUpdate,
|
|
202
165
|
outputDir,
|
|
203
166
|
poolPromise,
|
|
204
167
|
stopState,
|
|
205
|
-
assets,
|
|
206
168
|
countType,
|
|
207
169
|
scale,
|
|
208
170
|
quality,
|
|
@@ -221,9 +183,8 @@ const renderWebFrameAndRetryTargetClose = async ({ frame, index, retriesLeft, at
|
|
|
221
183
|
realFrameRange,
|
|
222
184
|
serveUrl,
|
|
223
185
|
timeoutInMilliseconds,
|
|
224
|
-
onDownload,
|
|
225
|
-
onError,
|
|
226
186
|
});
|
|
187
|
+
return fram;
|
|
227
188
|
}
|
|
228
189
|
};
|
|
229
190
|
exports.renderWebFrameAndRetryTargetClose = renderWebFrameAndRetryTargetClose;
|
|
@@ -8,17 +8,22 @@ const validateConcurrency = (value, setting) => {
|
|
|
8
8
|
if (value === null) {
|
|
9
9
|
return;
|
|
10
10
|
}
|
|
11
|
-
if (typeof value !== 'number') {
|
|
12
|
-
throw new Error(setting + ' must
|
|
11
|
+
if (typeof value !== 'number' && typeof value !== 'string') {
|
|
12
|
+
throw new Error(setting + ' must a number or a string but is ' + value);
|
|
13
13
|
}
|
|
14
|
-
if (value
|
|
15
|
-
|
|
14
|
+
if (typeof value === 'number') {
|
|
15
|
+
if (value % 1 !== 0) {
|
|
16
|
+
throw new Error(setting + ' must be an integer, but is ' + value);
|
|
17
|
+
}
|
|
18
|
+
if (value < 1) {
|
|
19
|
+
throw new Error(setting + ' must be at least 1, but is ' + value);
|
|
20
|
+
}
|
|
21
|
+
if (value > require('os').cpus().length) {
|
|
22
|
+
throw new Error(`${setting} is set higher than the amount of CPU cores available. Available CPU cores: ${require('os').cpus().length}, value set: ${value}`);
|
|
23
|
+
}
|
|
16
24
|
}
|
|
17
|
-
if (value
|
|
18
|
-
throw new Error(setting
|
|
19
|
-
}
|
|
20
|
-
if (value > require('os').cpus().length) {
|
|
21
|
-
throw new Error(`${setting} is set higher than the amount of CPU cores available. Available CPU cores: ${require('os').cpus().length}, value set: ${value}`);
|
|
25
|
+
else if (!/^\d+(\.\d+)?%$/.test(value)) {
|
|
26
|
+
throw new Error(`${setting} must be a number or percentage, but is ${JSON.stringify(value)}`);
|
|
22
27
|
}
|
|
23
28
|
};
|
|
24
29
|
exports.validateConcurrency = validateConcurrency;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@remotion/renderer",
|
|
3
|
-
"version": "3.3.
|
|
3
|
+
"version": "3.3.32",
|
|
4
4
|
"description": "Renderer for Remotion",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"dependencies": {
|
|
25
25
|
"execa": "5.1.1",
|
|
26
26
|
"extract-zip": "2.0.1",
|
|
27
|
-
"remotion": "3.3.
|
|
27
|
+
"remotion": "3.3.32",
|
|
28
28
|
"source-map": "^0.8.0-beta.0",
|
|
29
29
|
"ws": "8.7.0"
|
|
30
30
|
},
|
|
@@ -49,13 +49,13 @@
|
|
|
49
49
|
"vitest": "0.24.3"
|
|
50
50
|
},
|
|
51
51
|
"optionalDependencies": {
|
|
52
|
-
"@remotion/compositor-darwin-arm64": "3.3.
|
|
53
|
-
"@remotion/compositor-darwin-x64": "3.3.
|
|
54
|
-
"@remotion/compositor-linux-arm64-gnu": "3.3.
|
|
55
|
-
"@remotion/compositor-linux-arm64-musl": "3.3.
|
|
56
|
-
"@remotion/compositor-linux-x64-gnu": "3.3.
|
|
57
|
-
"@remotion/compositor-linux-x64-musl": "3.3.
|
|
58
|
-
"@remotion/compositor-win32-x64-msvc": "3.3.
|
|
52
|
+
"@remotion/compositor-darwin-arm64": "3.3.32",
|
|
53
|
+
"@remotion/compositor-darwin-x64": "3.3.32",
|
|
54
|
+
"@remotion/compositor-linux-arm64-gnu": "3.3.32",
|
|
55
|
+
"@remotion/compositor-linux-arm64-musl": "3.3.32",
|
|
56
|
+
"@remotion/compositor-linux-x64-gnu": "3.3.32",
|
|
57
|
+
"@remotion/compositor-linux-x64-musl": "3.3.32",
|
|
58
|
+
"@remotion/compositor-win32-x64-msvc": "3.3.32"
|
|
59
59
|
},
|
|
60
60
|
"keywords": [
|
|
61
61
|
"remotion",
|
|
@@ -67,5 +67,5 @@
|
|
|
67
67
|
"publishConfig": {
|
|
68
68
|
"access": "public"
|
|
69
69
|
},
|
|
70
|
-
"gitHead": "
|
|
70
|
+
"gitHead": "6b4f3514c801ddf2e7f957dd2e633271fbbc75f6"
|
|
71
71
|
}
|