@remotion/renderer 3.3.31 → 3.3.33
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/get-compositions-from-markup.d.ts +3 -0
- package/dist/get-compositions-from-markup.js +17 -0
- package/dist/get-port.d.ts +4 -1
- package/dist/get-port.js +8 -8
- package/dist/get-video-signals.d.ts +2 -0
- package/dist/get-video-signals.js +28 -0
- package/dist/index.d.ts +16 -2
- package/dist/index.js +3 -3
- package/dist/lock-port-selection.d.ts +2 -0
- package/dist/lock-port-selection.js +11 -0
- package/dist/locks.d.ts +7 -0
- package/dist/locks.js +44 -0
- package/dist/make-timeline-context-value.d.ts +2 -0
- package/dist/make-timeline-context-value.js +20 -0
- package/dist/render-on-server.js +8 -0
- package/dist/render-svg.js +2 -17
- package/dist/render-video-layer.d.ts +9 -0
- package/dist/render-video-layer.js +23 -0
- package/dist/render-web-frame.d.ts +3 -6
- package/dist/render-web-frame.js +4 -35
- package/dist/serve-static.js +4 -1
- package/dist/wait-for-symbolication-error-to-be-done.js +5 -31
- 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
|
};
|
|
@@ -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-port.d.ts
CHANGED
|
@@ -1 +1,4 @@
|
|
|
1
|
-
export declare const getDesiredPort: (desiredPort: number | undefined, from: number, to: number) => Promise<
|
|
1
|
+
export declare const getDesiredPort: (desiredPort: number | undefined, from: number, to: number) => Promise<{
|
|
2
|
+
port: number;
|
|
3
|
+
didUsePort: () => void;
|
|
4
|
+
}>;
|
package/dist/get-port.js
CHANGED
|
@@ -5,7 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.getDesiredPort = void 0;
|
|
7
7
|
const net_1 = __importDefault(require("net"));
|
|
8
|
-
const
|
|
8
|
+
const locks_1 = require("./locks");
|
|
9
9
|
const getAvailablePort = (portToTry) => new Promise((resolve) => {
|
|
10
10
|
let status = 'unavailable';
|
|
11
11
|
const host = '127.0.0.1';
|
|
@@ -35,21 +35,21 @@ const getPort = async (from, to) => {
|
|
|
35
35
|
}
|
|
36
36
|
throw new Error('No available ports found');
|
|
37
37
|
};
|
|
38
|
-
const
|
|
38
|
+
const portLocks = (0, locks_1.createLock)({ timeout: 10000 });
|
|
39
|
+
const getDesiredPort = async (desiredPort, from, to) => {
|
|
40
|
+
await portLocks.waitForAllToBeDone();
|
|
41
|
+
const lockPortSelection = portLocks.lock();
|
|
42
|
+
const didUsePort = () => portLocks.unlock(lockPortSelection);
|
|
39
43
|
if (typeof desiredPort !== 'undefined' &&
|
|
40
44
|
(await getAvailablePort(desiredPort)) === 'available') {
|
|
41
|
-
return desiredPort;
|
|
45
|
+
return { port: desiredPort, didUsePort };
|
|
42
46
|
}
|
|
43
47
|
const actualPort = await getPort(from, to);
|
|
44
48
|
// If did specify a port but did not get that one, fail hard.
|
|
45
49
|
if (desiredPort && desiredPort !== actualPort) {
|
|
46
50
|
throw new Error(`You specified port ${desiredPort} to be used for the HTTP server, but it is not available. Choose a different port or remove the setting to let Remotion automatically select a free port.`);
|
|
47
51
|
}
|
|
48
|
-
return actualPort;
|
|
49
|
-
};
|
|
50
|
-
const limit = (0, p_limit_1.pLimit)(1);
|
|
51
|
-
const getDesiredPort = (desiredPort, from, to) => {
|
|
52
|
-
return limit(() => getDesiredPortUnlimited(desiredPort, from, to));
|
|
52
|
+
return { port: actualPort, didUsePort };
|
|
53
53
|
};
|
|
54
54
|
exports.getDesiredPort = getDesiredPort;
|
|
55
55
|
const makeRange = (from, to) => {
|
|
@@ -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
|
@@ -9,7 +9,6 @@ export { Browser } from './browser';
|
|
|
9
9
|
export { BrowserExecutable } from './browser-executable';
|
|
10
10
|
export { BrowserLog } from './browser-log';
|
|
11
11
|
export { Codec, CodecOrUndefined } from './codec';
|
|
12
|
-
export { combineVideos } from './combine-videos';
|
|
13
12
|
export { Crf } from './crf';
|
|
14
13
|
export { ensureFfmpeg, EnsureFfmpegOptions, ensureFfprobe, } from './ensure-ffmpeg';
|
|
15
14
|
export { ErrorWithStackFrame } from './error-handling/handle-javascript-exception';
|
|
@@ -86,7 +85,10 @@ export declare const RenderInternals: {
|
|
|
86
85
|
SymbolicateableError: typeof SymbolicateableError;
|
|
87
86
|
getFramesToRender: (frameRange: [number, number], everyNthFrame: number) => number[];
|
|
88
87
|
getExtensionOfFilename: (filename: string | null) => string | null;
|
|
89
|
-
getDesiredPort: (desiredPort: number | undefined, from: number, to: number) => Promise<
|
|
88
|
+
getDesiredPort: (desiredPort: number | undefined, from: number, to: number) => Promise<{
|
|
89
|
+
port: number;
|
|
90
|
+
didUsePort: () => void;
|
|
91
|
+
}>;
|
|
90
92
|
isPathInside: (thePath: string, potentialParent: string) => boolean;
|
|
91
93
|
execa: {
|
|
92
94
|
(file: string, arguments?: readonly string[] | undefined, options?: execa.Options<string> | undefined): execa.ExecaChildProcess<string>;
|
|
@@ -142,4 +144,16 @@ export declare const RenderInternals: {
|
|
|
142
144
|
ffmpegExecutable: string | null;
|
|
143
145
|
remotionRoot: string;
|
|
144
146
|
}) => Promise<import("./ffmpeg-flags").FfmpegVersion>;
|
|
147
|
+
combineVideos: (options: {
|
|
148
|
+
files: string[];
|
|
149
|
+
filelistDir: string;
|
|
150
|
+
output: string;
|
|
151
|
+
onProgress: (p: number) => void;
|
|
152
|
+
numberOfFrames: number;
|
|
153
|
+
codec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif";
|
|
154
|
+
fps: number;
|
|
155
|
+
numberOfGifLoops: number | null;
|
|
156
|
+
remotionRoot: string;
|
|
157
|
+
ffmpegExecutable: import("./ffmpeg-executable").FfmpegExecutable;
|
|
158
|
+
}) => Promise<void>;
|
|
145
159
|
};
|
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,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.unlockPortSelection = exports.lockPortSelection = void 0;
|
|
4
|
+
const locks = [];
|
|
5
|
+
const waitForPortSelection = () => { };
|
|
6
|
+
const lockPortSelection = () => {
|
|
7
|
+
locks.push();
|
|
8
|
+
};
|
|
9
|
+
exports.lockPortSelection = lockPortSelection;
|
|
10
|
+
const unlockPortSelection = () => { };
|
|
11
|
+
exports.unlockPortSelection = unlockPortSelection;
|
package/dist/locks.d.ts
ADDED
package/dist/locks.js
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createLock = void 0;
|
|
4
|
+
const createLock = ({ timeout }) => {
|
|
5
|
+
let locks = [];
|
|
6
|
+
const waiters = [];
|
|
7
|
+
const lock = () => {
|
|
8
|
+
const id = Math.random();
|
|
9
|
+
locks.push(id);
|
|
10
|
+
return id;
|
|
11
|
+
};
|
|
12
|
+
const unlock = (id) => {
|
|
13
|
+
locks = locks.filter((l) => l !== id);
|
|
14
|
+
resolveWaiters();
|
|
15
|
+
};
|
|
16
|
+
const resolveWaiters = () => {
|
|
17
|
+
if (locks.length === 0) {
|
|
18
|
+
waiters.forEach((w) => w());
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
const waitForAllToBeDone = () => {
|
|
22
|
+
const success = new Promise((resolve) => {
|
|
23
|
+
waiters.push(() => {
|
|
24
|
+
resolve();
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
resolveWaiters();
|
|
28
|
+
if (timeout === null) {
|
|
29
|
+
return success;
|
|
30
|
+
}
|
|
31
|
+
const timeoutFn = new Promise((resolve) => {
|
|
32
|
+
setTimeout(() => {
|
|
33
|
+
return resolve();
|
|
34
|
+
}, timeout);
|
|
35
|
+
});
|
|
36
|
+
return Promise.race([success, timeoutFn]);
|
|
37
|
+
};
|
|
38
|
+
return {
|
|
39
|
+
lock,
|
|
40
|
+
unlock,
|
|
41
|
+
waitForAllToBeDone,
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
exports.createLock = createLock;
|
|
@@ -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/render-on-server.js
CHANGED
|
@@ -68,6 +68,14 @@ const renderOnServer = async (Comp, composition) => {
|
|
|
68
68
|
],
|
|
69
69
|
output: out,
|
|
70
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
|
+
},
|
|
71
79
|
});
|
|
72
80
|
pool.release(frame);
|
|
73
81
|
}));
|
package/dist/render-svg.js
CHANGED
|
@@ -5,24 +5,9 @@ const jsx_runtime_1 = require("react/jsx-runtime");
|
|
|
5
5
|
const server_1 = require("react-dom/server");
|
|
6
6
|
const remotion_1 = require("remotion");
|
|
7
7
|
const make_comp_manager_context_1 = require("./make-comp-manager-context");
|
|
8
|
-
const
|
|
9
|
-
const value = {
|
|
10
|
-
audioAndVideoTags: { current: [] },
|
|
11
|
-
rootId: composition.id,
|
|
12
|
-
playing: false,
|
|
13
|
-
playbackRate: 1,
|
|
14
|
-
imperativePlaying: {
|
|
15
|
-
current: false,
|
|
16
|
-
},
|
|
17
|
-
frame,
|
|
18
|
-
setPlaybackRate: () => {
|
|
19
|
-
throw new Error('Not implemented');
|
|
20
|
-
},
|
|
21
|
-
};
|
|
22
|
-
return value;
|
|
23
|
-
};
|
|
8
|
+
const make_timeline_context_value_1 = require("./make-timeline-context-value");
|
|
24
9
|
const renderSvg = ({ composition, Comp, frame, layer, }) => {
|
|
25
|
-
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: 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, {}) }) }) }));
|
|
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, {}) }) }) }));
|
|
26
11
|
return svg;
|
|
27
12
|
};
|
|
28
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,5 +1,5 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
1
2
|
import type { SmallTCompMetadata, TAsset } from 'remotion';
|
|
2
|
-
import type { RenderMediaOnDownload } from './assets/download-and-map-assets-to-file';
|
|
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';
|
|
@@ -10,7 +10,7 @@ import type { ServeUrl } from './legacy-webpack-config';
|
|
|
10
10
|
import type { ChromiumOptions } from './open-browser';
|
|
11
11
|
import type { Pool } from './pool';
|
|
12
12
|
import type { BrowserReplacer } from './replace-browser';
|
|
13
|
-
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, }: {
|
|
14
14
|
frame: number;
|
|
15
15
|
index: number;
|
|
16
16
|
retriesLeft: number;
|
|
@@ -22,12 +22,10 @@ export declare const renderWebFrameAndRetryTargetClose: ({ frame, index, retries
|
|
|
22
22
|
downloadMap: DownloadMap;
|
|
23
23
|
imageFormat: 'png' | 'jpeg' | 'none';
|
|
24
24
|
onFrameBuffer: ((buffer: Buffer, frame: number) => void) | undefined;
|
|
25
|
-
onFrameUpdate: (framesRendered: number, frameIndex: number, timeToRenderInMilliseconds: number) => void;
|
|
26
25
|
outputDir: string | null;
|
|
27
26
|
stopState: {
|
|
28
27
|
isStopped: boolean;
|
|
29
28
|
};
|
|
30
|
-
assets: TAsset[][];
|
|
31
29
|
countType: CountType;
|
|
32
30
|
scale: number;
|
|
33
31
|
quality: number | undefined;
|
|
@@ -48,11 +46,10 @@ export declare const renderWebFrameAndRetryTargetClose: ({ frame, index, retries
|
|
|
48
46
|
realFrameRange: [number, number];
|
|
49
47
|
serveUrl: ServeUrl;
|
|
50
48
|
timeoutInMilliseconds: number;
|
|
51
|
-
onDownload: RenderMediaOnDownload;
|
|
52
|
-
onError: (err: Error) => void;
|
|
53
49
|
}) => Promise<{
|
|
54
50
|
layer: CompositorLayer | null;
|
|
55
51
|
buffer: Buffer | null;
|
|
52
|
+
assets: TAsset[];
|
|
56
53
|
}>;
|
|
57
54
|
export declare const makePage: ({ browserReplacer, pagesArray, composition, scale, onBrowserLog, inputProps, envVariables, serveUrl, realFrameRange, timeoutInMilliseconds, proxyPort, imageFormat, muted, }: {
|
|
58
55
|
browserReplacer: BrowserReplacer;
|
package/dist/render-web-frame.js
CHANGED
|
@@ -5,9 +5,7 @@ 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
10
|
const make_cancel_signal_1 = require("./make-cancel-signal");
|
|
13
11
|
const open_browser_1 = require("./open-browser");
|
|
@@ -16,15 +14,13 @@ const puppeteer_evaluate_1 = require("./puppeteer-evaluate");
|
|
|
16
14
|
const seek_to_frame_1 = require("./seek-to-frame");
|
|
17
15
|
const set_props_and_env_1 = require("./set-props-and-env");
|
|
18
16
|
const take_frame_and_compose_1 = require("./take-frame-and-compose");
|
|
19
|
-
const
|
|
20
|
-
const renderFrameWithOptionToReject = async ({ frame, index, reject, width, height, poolPromise, stopState, imageFormat, downloadMap, onFrameUpdate, scale, assets, quality, framesRendered, onDownload, onError, }) => {
|
|
17
|
+
const renderFrameWithOptionToReject = async ({ frame, index, reject, width, height, poolPromise, stopState, imageFormat, downloadMap, scale, quality, }) => {
|
|
21
18
|
const pool = await poolPromise;
|
|
22
19
|
const freePage = await pool.acquire();
|
|
23
20
|
if (stopState.isStopped) {
|
|
24
21
|
reject(new Error('Render was stopped'));
|
|
25
22
|
throw new Error('stopped');
|
|
26
23
|
}
|
|
27
|
-
const startTime = performance.now();
|
|
28
24
|
const errorCallbackOnFrame = (err) => {
|
|
29
25
|
reject(err);
|
|
30
26
|
};
|
|
@@ -68,25 +64,12 @@ const renderFrameWithOptionToReject = async ({ frame, index, reject, width, heig
|
|
|
68
64
|
};
|
|
69
65
|
// TODO: Always return buffer
|
|
70
66
|
(0, perf_1.stopPerfMeasure)(id);
|
|
71
|
-
const compressedAssets = collectedAssets.map((asset) => (0, compress_assets_1.compressAsset)(assets.filter(truthy_1.truthy).flat(1), asset));
|
|
72
|
-
assets[index] = compressedAssets;
|
|
73
|
-
compressedAssets.forEach((asset) => {
|
|
74
|
-
(0, download_and_map_assets_to_file_1.downloadAndMapAssetsToFileUrl)({
|
|
75
|
-
asset,
|
|
76
|
-
onDownload,
|
|
77
|
-
downloadMap,
|
|
78
|
-
}).catch((err) => {
|
|
79
|
-
onError(new Error(`Error while downloading asset: ${err.stack}`));
|
|
80
|
-
});
|
|
81
|
-
});
|
|
82
|
-
framesRendered.frames++;
|
|
83
|
-
onFrameUpdate(framesRendered.frames, frame, performance.now() - startTime);
|
|
84
67
|
cleanupPageError();
|
|
85
68
|
freePage.off('error', errorCallbackOnFrame);
|
|
86
69
|
pool.release(freePage);
|
|
87
|
-
return { layer: compositionLayer, buffer };
|
|
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,15 +79,10 @@ const renderWebFrame = ({ frame, index, downloadMap, imageFormat, onFrameUpdate,
|
|
|
96
79
|
height: composition.height,
|
|
97
80
|
downloadMap,
|
|
98
81
|
imageFormat,
|
|
99
|
-
onFrameUpdate,
|
|
100
82
|
poolPromise,
|
|
101
83
|
stopState,
|
|
102
|
-
assets,
|
|
103
84
|
scale,
|
|
104
85
|
quality,
|
|
105
|
-
framesRendered,
|
|
106
|
-
onDownload,
|
|
107
|
-
onError,
|
|
108
86
|
})
|
|
109
87
|
.then((res) => {
|
|
110
88
|
resolve(res);
|
|
@@ -114,7 +92,7 @@ const renderWebFrame = ({ frame, index, downloadMap, imageFormat, onFrameUpdate,
|
|
|
114
92
|
});
|
|
115
93
|
});
|
|
116
94
|
};
|
|
117
|
-
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, }) => {
|
|
118
96
|
var _a, _b;
|
|
119
97
|
try {
|
|
120
98
|
const returnval = await renderWebFrame({
|
|
@@ -124,14 +102,9 @@ const renderWebFrameAndRetryTargetClose = async ({ frame, index, retriesLeft, at
|
|
|
124
102
|
composition,
|
|
125
103
|
downloadMap,
|
|
126
104
|
imageFormat,
|
|
127
|
-
onFrameUpdate,
|
|
128
105
|
stopState,
|
|
129
|
-
assets,
|
|
130
106
|
scale,
|
|
131
107
|
quality,
|
|
132
|
-
framesRendered,
|
|
133
|
-
onDownload,
|
|
134
|
-
onError,
|
|
135
108
|
});
|
|
136
109
|
return returnval;
|
|
137
110
|
}
|
|
@@ -189,11 +162,9 @@ const renderWebFrameAndRetryTargetClose = async ({ frame, index, retriesLeft, at
|
|
|
189
162
|
downloadMap,
|
|
190
163
|
imageFormat,
|
|
191
164
|
onFrameBuffer,
|
|
192
|
-
onFrameUpdate,
|
|
193
165
|
outputDir,
|
|
194
166
|
poolPromise,
|
|
195
167
|
stopState,
|
|
196
|
-
assets,
|
|
197
168
|
countType,
|
|
198
169
|
scale,
|
|
199
170
|
quality,
|
|
@@ -212,8 +183,6 @@ const renderWebFrameAndRetryTargetClose = async ({ frame, index, retriesLeft, at
|
|
|
212
183
|
realFrameRange,
|
|
213
184
|
serveUrl,
|
|
214
185
|
timeoutInMilliseconds,
|
|
215
|
-
onDownload,
|
|
216
|
-
onError,
|
|
217
186
|
});
|
|
218
187
|
return fram;
|
|
219
188
|
}
|
package/dist/serve-static.js
CHANGED
|
@@ -10,7 +10,7 @@ const offthread_video_server_1 = require("./offthread-video-server");
|
|
|
10
10
|
const serve_handler_1 = require("./serve-handler");
|
|
11
11
|
const serveStatic = async (path, options) => {
|
|
12
12
|
var _a;
|
|
13
|
-
const port = await (0, get_port_1.getDesiredPort)((_a = options === null || options === void 0 ? void 0 : options.port) !== null && _a !== void 0 ? _a : undefined, 3000, 3100);
|
|
13
|
+
const { port, didUsePort } = await (0, get_port_1.getDesiredPort)((_a = options === null || options === void 0 ? void 0 : options.port) !== null && _a !== void 0 ? _a : undefined, 3000, 3100);
|
|
14
14
|
const offthreadRequest = (0, offthread_video_server_1.startOffthreadVideoServer)({
|
|
15
15
|
ffmpegExecutable: options.ffmpegExecutable,
|
|
16
16
|
ffprobeExecutable: options.ffprobeExecutable,
|
|
@@ -47,6 +47,9 @@ const serveStatic = async (path, options) => {
|
|
|
47
47
|
delete connections[key];
|
|
48
48
|
});
|
|
49
49
|
});
|
|
50
|
+
server.on('listening', () => {
|
|
51
|
+
didUsePort();
|
|
52
|
+
});
|
|
50
53
|
const destroyConnections = function () {
|
|
51
54
|
for (const key in connections)
|
|
52
55
|
connections[key].destroy();
|
|
@@ -1,34 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.waitForSymbolicationToBeDone = exports.unlockErrorSymbolicationLock = exports.registerErrorSymbolicationLock = void 0;
|
|
4
|
-
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
return id;
|
|
10
|
-
};
|
|
11
|
-
exports.registerErrorSymbolicationLock = registerErrorSymbolicationLock;
|
|
12
|
-
const unlockErrorSymbolicationLock = (id) => {
|
|
13
|
-
locks = locks.filter((l) => l !== id);
|
|
14
|
-
resolveWaiters();
|
|
15
|
-
};
|
|
16
|
-
exports.unlockErrorSymbolicationLock = unlockErrorSymbolicationLock;
|
|
17
|
-
const resolveWaiters = () => {
|
|
18
|
-
if (locks.length === 0) {
|
|
19
|
-
waiters.forEach((w) => w());
|
|
20
|
-
}
|
|
21
|
-
};
|
|
22
|
-
const waitForSymbolicationToBeDone = () => {
|
|
23
|
-
const success = new Promise((resolve) => {
|
|
24
|
-
waiters.push(() => {
|
|
25
|
-
resolve();
|
|
26
|
-
});
|
|
27
|
-
});
|
|
28
|
-
const timeout = new Promise((resolve) => {
|
|
29
|
-
setTimeout(() => resolve(), 5000);
|
|
30
|
-
});
|
|
31
|
-
resolveWaiters();
|
|
32
|
-
return Promise.all([success, timeout]);
|
|
33
|
-
};
|
|
34
|
-
exports.waitForSymbolicationToBeDone = waitForSymbolicationToBeDone;
|
|
4
|
+
const locks_1 = require("./locks");
|
|
5
|
+
const { lock, unlock, waitForAllToBeDone } = (0, locks_1.createLock)({ timeout: 50000 });
|
|
6
|
+
exports.registerErrorSymbolicationLock = lock;
|
|
7
|
+
exports.unlockErrorSymbolicationLock = unlock;
|
|
8
|
+
exports.waitForSymbolicationToBeDone = waitForAllToBeDone;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@remotion/renderer",
|
|
3
|
-
"version": "3.3.
|
|
3
|
+
"version": "3.3.33",
|
|
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.33",
|
|
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.33",
|
|
53
|
+
"@remotion/compositor-darwin-x64": "3.3.33",
|
|
54
|
+
"@remotion/compositor-linux-arm64-gnu": "3.3.33",
|
|
55
|
+
"@remotion/compositor-linux-arm64-musl": "3.3.33",
|
|
56
|
+
"@remotion/compositor-linux-x64-gnu": "3.3.33",
|
|
57
|
+
"@remotion/compositor-linux-x64-musl": "3.3.33",
|
|
58
|
+
"@remotion/compositor-win32-x64-msvc": "3.3.33"
|
|
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": "0356b9108673ac98c41990f192b101f7a6574ed0"
|
|
71
71
|
}
|