@remotion/renderer 3.3.45 → 3.3.52

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.
Files changed (35) hide show
  1. package/dist/client.d.ts +43 -42
  2. package/dist/client.js +1 -0
  3. package/dist/file-extensions.js +2 -2
  4. package/dist/index.d.ts +3 -4
  5. package/dist/index.js +0 -2
  6. package/dist/render-still.js +1 -2
  7. package/package.json +10 -10
  8. package/dist/browser/is-target-closed-err.d.ts +0 -1
  9. package/dist/browser/is-target-closed-err.js +0 -9
  10. package/dist/compositor/compositor.d.ts +0 -12
  11. package/dist/compositor/compositor.js +0 -96
  12. package/dist/determine-vcodec-ffmepg-flags.d.ts +0 -2
  13. package/dist/determine-vcodec-ffmepg-flags.js +0 -13
  14. package/dist/get-compositions-from-bundle.d.ts +0 -7
  15. package/dist/get-compositions-from-bundle.js +0 -55
  16. package/dist/get-compositions-from-markup.d.ts +0 -3
  17. package/dist/get-compositions-from-markup.js +0 -17
  18. package/dist/get-compositions-on-server.d.ts +0 -3
  19. package/dist/get-compositions-on-server.js +0 -18
  20. package/dist/get-video-signals.d.ts +0 -2
  21. package/dist/get-video-signals.js +0 -28
  22. package/dist/lock-port-selection.d.ts +0 -2
  23. package/dist/lock-port-selection.js +0 -11
  24. package/dist/make-comp-manager-context.d.ts +0 -2
  25. package/dist/make-comp-manager-context.js +0 -45
  26. package/dist/make-timeline-context-value.d.ts +0 -2
  27. package/dist/make-timeline-context-value.js +0 -20
  28. package/dist/render-on-server.d.ts +0 -3
  29. package/dist/render-on-server.js +0 -90
  30. package/dist/render-svg.d.ts +0 -8
  31. package/dist/render-svg.js +0 -13
  32. package/dist/render-video-layer.d.ts +0 -9
  33. package/dist/render-video-layer.js +0 -23
  34. package/dist/render-web-frame.d.ts +0 -74
  35. package/dist/render-web-frame.js +0 -260
package/dist/client.d.ts CHANGED
@@ -1,9 +1,9 @@
1
1
  export declare const BrowserSafeApis: {
2
- getFileExtensionFromCodec: <T extends "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif">(codec: T, audioCodec: "mp3" | "aac" | "pcm-16" | "opus" | null) => import("./file-extensions").FileExtension;
2
+ getFileExtensionFromCodec: <T extends "aac" | "mp3" | "gif" | "wav" | "h264" | "h265" | "vp8" | "vp9" | "prores" | "h264-mkv">(codec: T, audioCodec: "aac" | "pcm-16" | "mp3" | "opus" | null) => import("./file-extensions").FileExtension;
3
3
  validCodecs: readonly ["h264", "h265", "vp8", "vp9", "mp3", "aac", "wav", "prores", "h264-mkv", "gif"];
4
- getDefaultCrfForCodec: (codec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif") => number;
5
- getValidCrfRanges: (codec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif") => [number, number];
6
- isAudioCodec: (codec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif" | undefined) => boolean;
4
+ getDefaultCrfForCodec: (codec: "aac" | "mp3" | "gif" | "wav" | "h264" | "h265" | "vp8" | "vp9" | "prores" | "h264-mkv") => number;
5
+ getValidCrfRanges: (codec: "aac" | "mp3" | "gif" | "wav" | "h264" | "h265" | "vp8" | "vp9" | "prores" | "h264-mkv") => [number, number];
6
+ isAudioCodec: (codec: "aac" | "mp3" | "gif" | "wav" | "h264" | "h265" | "vp8" | "vp9" | "prores" | "h264-mkv" | undefined) => boolean;
7
7
  validPixelFormats: readonly ["yuv420p", "yuva420p", "yuv422p", "yuv444p", "yuv420p10le", "yuv422p10le", "yuv444p10le", "yuva444p10le"];
8
8
  DEFAULT_PIXEL_FORMAT: "yuv420p" | "yuva420p" | "yuv422p" | "yuv444p" | "yuv420p10le" | "yuv422p10le" | "yuv444p10le" | "yuva444p10le";
9
9
  supportedAudioCodecs: {
@@ -19,7 +19,7 @@ export declare const BrowserSafeApis: {
19
19
  readonly wav: readonly ["pcm-16"];
20
20
  };
21
21
  defaultFileExtensionMap: {
22
- h264: {
22
+ aac: {
23
23
  default: import("./file-extensions").FileExtension;
24
24
  forAudioCodec: {
25
25
  aac: {
@@ -32,49 +32,49 @@ export declare const BrowserSafeApis: {
32
32
  };
33
33
  };
34
34
  };
35
- h265: {
35
+ mp3: {
36
36
  default: import("./file-extensions").FileExtension;
37
37
  forAudioCodec: {
38
- aac: {
38
+ "pcm-16": {
39
39
  possible: import("./file-extensions").FileExtension[];
40
40
  default: import("./file-extensions").FileExtension;
41
41
  };
42
- "pcm-16": {
42
+ mp3: {
43
43
  possible: import("./file-extensions").FileExtension[];
44
44
  default: import("./file-extensions").FileExtension;
45
45
  };
46
46
  };
47
47
  };
48
- vp8: {
48
+ gif: {
49
+ default: import("./file-extensions").FileExtension;
50
+ forAudioCodec: {};
51
+ };
52
+ wav: {
49
53
  default: import("./file-extensions").FileExtension;
50
54
  forAudioCodec: {
51
55
  "pcm-16": {
52
56
  possible: import("./file-extensions").FileExtension[];
53
57
  default: import("./file-extensions").FileExtension;
54
58
  };
55
- opus: {
56
- possible: import("./file-extensions").FileExtension[];
57
- default: import("./file-extensions").FileExtension;
58
- };
59
59
  };
60
60
  };
61
- vp9: {
61
+ h264: {
62
62
  default: import("./file-extensions").FileExtension;
63
63
  forAudioCodec: {
64
- "pcm-16": {
64
+ aac: {
65
65
  possible: import("./file-extensions").FileExtension[];
66
66
  default: import("./file-extensions").FileExtension;
67
67
  };
68
- opus: {
68
+ "pcm-16": {
69
69
  possible: import("./file-extensions").FileExtension[];
70
70
  default: import("./file-extensions").FileExtension;
71
71
  };
72
72
  };
73
73
  };
74
- mp3: {
74
+ h265: {
75
75
  default: import("./file-extensions").FileExtension;
76
76
  forAudioCodec: {
77
- mp3: {
77
+ aac: {
78
78
  possible: import("./file-extensions").FileExtension[];
79
79
  default: import("./file-extensions").FileExtension;
80
80
  };
@@ -84,26 +84,30 @@ export declare const BrowserSafeApis: {
84
84
  };
85
85
  };
86
86
  };
87
- aac: {
87
+ vp8: {
88
88
  default: import("./file-extensions").FileExtension;
89
89
  forAudioCodec: {
90
- aac: {
90
+ "pcm-16": {
91
91
  possible: import("./file-extensions").FileExtension[];
92
92
  default: import("./file-extensions").FileExtension;
93
93
  };
94
- "pcm-16": {
94
+ opus: {
95
95
  possible: import("./file-extensions").FileExtension[];
96
96
  default: import("./file-extensions").FileExtension;
97
97
  };
98
98
  };
99
99
  };
100
- wav: {
100
+ vp9: {
101
101
  default: import("./file-extensions").FileExtension;
102
102
  forAudioCodec: {
103
103
  "pcm-16": {
104
104
  possible: import("./file-extensions").FileExtension[];
105
105
  default: import("./file-extensions").FileExtension;
106
106
  };
107
+ opus: {
108
+ possible: import("./file-extensions").FileExtension[];
109
+ default: import("./file-extensions").FileExtension;
110
+ };
107
111
  };
108
112
  };
109
113
  prores: {
@@ -128,12 +132,24 @@ export declare const BrowserSafeApis: {
128
132
  };
129
133
  };
130
134
  };
131
- gif: {
132
- default: import("./file-extensions").FileExtension;
133
- forAudioCodec: {};
134
- };
135
135
  };
136
136
  defaultAudioCodecs: {
137
+ aac: {
138
+ compressed: "aac" | "pcm-16" | null;
139
+ lossless: "aac" | "pcm-16" | null;
140
+ };
141
+ mp3: {
142
+ compressed: "pcm-16" | "mp3" | null;
143
+ lossless: "pcm-16" | "mp3" | null;
144
+ };
145
+ gif: {
146
+ compressed: null;
147
+ lossless: null;
148
+ };
149
+ wav: {
150
+ compressed: "pcm-16" | null;
151
+ lossless: "pcm-16" | null;
152
+ };
137
153
  h264: {
138
154
  compressed: "aac" | "pcm-16" | null;
139
155
  lossless: "aac" | "pcm-16" | null;
@@ -150,18 +166,6 @@ export declare const BrowserSafeApis: {
150
166
  compressed: "pcm-16" | "opus" | null;
151
167
  lossless: "pcm-16" | "opus" | null;
152
168
  };
153
- mp3: {
154
- compressed: "mp3" | "pcm-16" | null;
155
- lossless: "mp3" | "pcm-16" | null;
156
- };
157
- aac: {
158
- compressed: "aac" | "pcm-16" | null;
159
- lossless: "aac" | "pcm-16" | null;
160
- };
161
- wav: {
162
- compressed: "pcm-16" | null;
163
- lossless: "pcm-16" | null;
164
- };
165
169
  prores: {
166
170
  compressed: "aac" | "pcm-16" | null;
167
171
  lossless: "aac" | "pcm-16" | null;
@@ -170,9 +174,6 @@ export declare const BrowserSafeApis: {
170
174
  compressed: "pcm-16" | null;
171
175
  lossless: "pcm-16" | null;
172
176
  };
173
- gif: {
174
- compressed: null;
175
- lossless: null;
176
- };
177
177
  };
178
+ defaultCodecsForFileExtension: Record<import("./file-extensions").FileExtension, "aac" | "mp3" | "gif" | "wav" | "h264" | "h265" | "vp8" | "vp9" | "prores" | "h264-mkv">;
178
179
  };
package/dist/client.js CHANGED
@@ -19,4 +19,5 @@ exports.BrowserSafeApis = {
19
19
  supportedAudioCodecs: file_extensions_1.supportedAudioCodecs,
20
20
  defaultFileExtensionMap: file_extensions_1.defaultFileExtensionMap,
21
21
  defaultAudioCodecs: audio_codec_1.defaultAudioCodecs,
22
+ defaultCodecsForFileExtension: get_extension_from_codec_1.defaultCodecsForFileExtension,
22
23
  };
@@ -40,8 +40,8 @@ exports.defaultFileExtensionMap = {
40
40
  h264: {
41
41
  default: 'mp4',
42
42
  forAudioCodec: {
43
- 'pcm-16': { possible: ['mkv'], default: 'mkv' },
44
- aac: { possible: ['mp4', 'mkv'], default: 'mp4' },
43
+ 'pcm-16': { possible: ['mkv', 'mov'], default: 'mkv' },
44
+ aac: { possible: ['mp4', 'mkv', 'mov'], default: 'mp4' },
45
45
  },
46
46
  },
47
47
  h265: {
package/dist/index.d.ts CHANGED
@@ -119,18 +119,17 @@ export declare const RenderInternals: {
119
119
  validPixelFormats: readonly ["yuv420p", "yuva420p", "yuv422p", "yuv444p", "yuv420p10le", "yuv422p10le", "yuv444p10le", "yuva444p10le"];
120
120
  DEFAULT_BROWSER: import("./browser").Browser;
121
121
  validateFrameRange: (frameRange: import("./frame-range").FrameRange | null) => void;
122
- DEFAULT_OPENGL_RENDERER: "swangle" | "angle" | "egl" | "swiftshader" | null;
123
- validateOpenGlRenderer: (option: "swangle" | "angle" | "egl" | "swiftshader" | null) => "swangle" | "angle" | "egl" | "swiftshader" | null;
122
+ DEFAULT_OPENGL_RENDERER: "angle" | "swangle" | "egl" | "swiftshader" | null;
123
+ validateOpenGlRenderer: (option: "angle" | "swangle" | "egl" | "swiftshader" | null) => "angle" | "swangle" | "egl" | "swiftshader" | null;
124
124
  validImageFormats: readonly ["png", "jpeg", "none"];
125
125
  validCodecs: readonly ["h264", "h265", "vp8", "vp9", "mp3", "aac", "wav", "prores", "h264-mkv", "gif"];
126
126
  DEFAULT_PIXEL_FORMAT: "yuv420p" | "yuva420p" | "yuv422p" | "yuv444p" | "yuv420p10le" | "yuv422p10le" | "yuv444p10le" | "yuva444p10le";
127
127
  validateQuality: (q: number | undefined) => void;
128
- validateFrame: (frame: number, durationInFrames: number) => void;
129
128
  DEFAULT_TIMEOUT: number;
130
129
  DEFAULT_CODEC: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif";
131
130
  isAudioCodec: (codec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif" | undefined) => boolean;
132
131
  logLevels: readonly ["verbose", "info", "warn", "error"];
133
- isEqualOrBelowLogLevel: (currentLevel: "verbose" | "error" | "info" | "warn", level: "verbose" | "error" | "info" | "warn") => boolean;
132
+ isEqualOrBelowLogLevel: (currentLevel: "error" | "verbose" | "info" | "warn", level: "error" | "verbose" | "info" | "warn") => boolean;
134
133
  isValidLogLevel: (level: string) => boolean;
135
134
  perf: typeof perf;
136
135
  makeDownloadMap: () => import("./assets/download-map").DownloadMap;
package/dist/index.js CHANGED
@@ -69,7 +69,6 @@ const tmp_dir_1 = require("./tmp-dir");
69
69
  const validate_concurrency_1 = require("./validate-concurrency");
70
70
  const validate_even_dimensions_with_codec_1 = require("./validate-even-dimensions-with-codec");
71
71
  const validate_ffmpeg_1 = require("./validate-ffmpeg");
72
- const validate_frame_1 = require("./validate-frame");
73
72
  const validate_opengl_renderer_1 = require("./validate-opengl-renderer");
74
73
  const validate_puppeteer_timeout_1 = require("./validate-puppeteer-timeout");
75
74
  const validate_videobitrate_1 = require("./validate-videobitrate");
@@ -139,7 +138,6 @@ exports.RenderInternals = {
139
138
  validCodecs: codec_1.validCodecs,
140
139
  DEFAULT_PIXEL_FORMAT: pixel_format_1.DEFAULT_PIXEL_FORMAT,
141
140
  validateQuality: quality_1.validateQuality,
142
- validateFrame: validate_frame_1.validateFrame,
143
141
  DEFAULT_TIMEOUT: TimeoutSettings_1.DEFAULT_TIMEOUT,
144
142
  DEFAULT_CODEC: codec_1.DEFAULT_CODEC,
145
143
  isAudioCodec: is_audio_codec_1.isAudioCodec,
@@ -46,7 +46,6 @@ const quality_1 = require("./quality");
46
46
  const seek_to_frame_1 = require("./seek-to-frame");
47
47
  const set_props_and_env_1 = require("./set-props-and-env");
48
48
  const take_frame_and_compose_1 = require("./take-frame-and-compose");
49
- const validate_frame_1 = require("./validate-frame");
50
49
  const validate_puppeteer_timeout_1 = require("./validate-puppeteer-timeout");
51
50
  const validate_scale_1 = require("./validate-scale");
52
51
  const innerRenderStill = async ({ composition, quality, imageFormat = 'png', serveUrl, puppeteerInstance, dumpBrowserLogs = false, onError, inputProps, envVariables, output, frame = 0, overwrite = true, browserExecutable, timeoutInMilliseconds, chromiumOptions, scale = 1, proxyPort, cancelSignal, downloadMap, }) => {
@@ -55,7 +54,7 @@ const innerRenderStill = async ({ composition, quality, imageFormat = 'png', ser
55
54
  remotion_1.Internals.validateFps(composition.fps, 'in the `config` object of `renderStill()`', false);
56
55
  remotion_1.Internals.validateDurationInFrames(composition.durationInFrames, 'in the `config` object passed to `renderStill()`');
57
56
  (0, image_format_1.validateNonNullImageFormat)(imageFormat);
58
- (0, validate_frame_1.validateFrame)(frame, composition.durationInFrames);
57
+ remotion_1.Internals.validateFrame(frame, composition.durationInFrames);
59
58
  const stillFrame = (0, convert_to_positive_frame_index_1.convertToPositiveFrameIndex)({
60
59
  durationInFrames: composition.durationInFrames,
61
60
  frame,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remotion/renderer",
3
- "version": "3.3.45",
3
+ "version": "3.3.52",
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.45",
27
+ "remotion": "3.3.52",
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.45",
53
- "@remotion/compositor-darwin-x64": "3.3.45",
54
- "@remotion/compositor-linux-arm64-gnu": "3.3.45",
55
- "@remotion/compositor-linux-arm64-musl": "3.3.45",
56
- "@remotion/compositor-linux-x64-gnu": "3.3.45",
57
- "@remotion/compositor-linux-x64-musl": "3.3.45",
58
- "@remotion/compositor-win32-x64-msvc": "3.3.45"
52
+ "@remotion/compositor-darwin-arm64": "3.3.52",
53
+ "@remotion/compositor-darwin-x64": "3.3.52",
54
+ "@remotion/compositor-linux-arm64-gnu": "3.3.52",
55
+ "@remotion/compositor-linux-arm64-musl": "3.3.52",
56
+ "@remotion/compositor-linux-x64-gnu": "3.3.52",
57
+ "@remotion/compositor-linux-x64-musl": "3.3.52",
58
+ "@remotion/compositor-win32-x64-msvc": "3.3.52"
59
59
  },
60
60
  "keywords": [
61
61
  "remotion",
@@ -67,5 +67,5 @@
67
67
  "publishConfig": {
68
68
  "access": "public"
69
69
  },
70
- "gitHead": "75c028236b43ff2fd0f3f3772f9f79cfde069e36"
70
+ "gitHead": "b48dff6c96081c924ae3bbc37f2f00bdd53e6e1f"
71
71
  }
@@ -1 +0,0 @@
1
- export declare const isTargetClosedErr: (error: Error | undefined) => boolean | undefined;
@@ -1,9 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isTargetClosedErr = void 0;
4
- const isTargetClosedErr = (error) => {
5
- var _a, _b;
6
- return (((_a = error === null || error === void 0 ? void 0 : error.message) === null || _a === void 0 ? void 0 : _a.includes('Target closed')) ||
7
- ((_b = error === null || error === void 0 ? void 0 : error.message) === null || _b === void 0 ? void 0 : _b.includes('Session closed')));
8
- };
9
- exports.isTargetClosedErr = isTargetClosedErr;
@@ -1,12 +0,0 @@
1
- import type { CompositorCommand, CompositorInitiatePayload } from './payloads';
2
- export declare type Compositor = {
3
- finishCommands: () => void;
4
- executeCommand: (payload: Omit<CompositorCommand, 'nonce'>) => Promise<void>;
5
- waitForDone: () => Promise<void>;
6
- };
7
- export declare const spawnCompositorOrReuse: ({ initiatePayload, renderId, }: {
8
- initiatePayload: CompositorInitiatePayload;
9
- renderId: string;
10
- }) => Compositor;
11
- export declare const releaseCompositorWithId: (renderId: string) => void;
12
- export declare const waitForCompositorWithIdToQuit: (renderId: string) => Promise<void>;
@@ -1,96 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.waitForCompositorWithIdToQuit = exports.releaseCompositorWithId = exports.spawnCompositorOrReuse = void 0;
4
- const child_process_1 = require("child_process");
5
- const get_executable_path_1 = require("./get-executable-path");
6
- const compositorMap = {};
7
- const spawnCompositorOrReuse = ({ initiatePayload, renderId, }) => {
8
- if (!compositorMap[renderId]) {
9
- compositorMap[renderId] = startCompositor(initiatePayload);
10
- }
11
- return compositorMap[renderId];
12
- };
13
- exports.spawnCompositorOrReuse = spawnCompositorOrReuse;
14
- const releaseCompositorWithId = (renderId) => {
15
- if (compositorMap[renderId]) {
16
- compositorMap[renderId].finishCommands();
17
- }
18
- };
19
- exports.releaseCompositorWithId = releaseCompositorWithId;
20
- const waitForCompositorWithIdToQuit = (renderId) => {
21
- if (!compositorMap[renderId]) {
22
- throw new TypeError('No compositor with that id');
23
- }
24
- return compositorMap[renderId].waitForDone();
25
- };
26
- exports.waitForCompositorWithIdToQuit = waitForCompositorWithIdToQuit;
27
- const startCompositor = (compositorInitiatePayload) => {
28
- const bin = (0, get_executable_path_1.getExecutablePath)();
29
- const child = (0, child_process_1.spawn)(`${bin}`, [JSON.stringify(compositorInitiatePayload)]);
30
- const stderrChunks = [];
31
- let stdoutListeners = [];
32
- // TODO: Without this the render gets stuck!! :O
33
- child.stderr.on('data', (d) => {
34
- console.log('stderr', d.toString('utf-8'));
35
- });
36
- child.stdout.on('data', (d) => {
37
- const str = d.toString('utf-8');
38
- try {
39
- const payloads = str
40
- .split('--debug-end--')
41
- .map((t) => t.trim())
42
- .filter(Boolean);
43
- for (const payload of payloads) {
44
- const p = JSON.parse(payload.replace('--debug-start--', ''));
45
- if (p.msg_type === 'debug') {
46
- console.log('Rust debug', p.msg);
47
- }
48
- stdoutListeners.forEach((s) => s(p));
49
- }
50
- }
51
- catch (e) {
52
- console.log({ str });
53
- }
54
- });
55
- let nonce = 0;
56
- return {
57
- waitForDone: () => {
58
- return new Promise((resolve, reject) => {
59
- child.on('exit', (code) => {
60
- if (code === 0) {
61
- resolve();
62
- }
63
- else {
64
- reject(Buffer.concat(stderrChunks).toString('utf-8'));
65
- }
66
- });
67
- });
68
- },
69
- finishCommands: () => {
70
- child.stdin.write('EOF\n');
71
- },
72
- executeCommand: (payload) => {
73
- const actualPayload = {
74
- ...payload,
75
- nonce,
76
- };
77
- nonce++;
78
- return new Promise((resolve, reject) => {
79
- child.stdin.write(JSON.stringify(actualPayload) + '\n');
80
- const onStdout = (p) => {
81
- if (p.msg_type === 'finish' && p.nonce === actualPayload.nonce) {
82
- resolve();
83
- stdoutListeners = stdoutListeners.filter((s) => s !== onStdout);
84
- }
85
- if (p.msg_type === 'error') {
86
- const err = new Error(p.error);
87
- err.stack = p.error + '\n' + p.backtrace;
88
- reject(err);
89
- stdoutListeners = stdoutListeners.filter((s) => s !== onStdout);
90
- }
91
- };
92
- stdoutListeners.push(onStdout);
93
- });
94
- },
95
- };
96
- };
@@ -1,2 +0,0 @@
1
- import type { SpecialVCodecForTransparency } from './assets/download-map';
2
- export declare const determineVcodecFfmepgFlags: (vcodecFlag: SpecialVCodecForTransparency) => string[];
@@ -1,13 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.determineVcodecFfmepgFlags = void 0;
4
- const truthy_1 = require("./truthy");
5
- const determineVcodecFfmepgFlags = (vcodecFlag) => {
6
- return [
7
- vcodecFlag === 'vp9' ? '-vcodec' : null,
8
- vcodecFlag === 'vp9' ? 'libvpx-vp9' : null,
9
- vcodecFlag === 'vp8' ? '-vcodec' : null,
10
- vcodecFlag === 'vp8' ? 'libvpx' : null,
11
- ].filter(truthy_1.truthy);
12
- };
13
- exports.determineVcodecFfmepgFlags = determineVcodecFfmepgFlags;
@@ -1,7 +0,0 @@
1
- import type { ComponentType } from 'react';
2
- import type { TCompMetadata } from 'remotion';
3
- import type { GetCompositionsConfig } from './get-compositions';
4
- export declare const getCompositionsFromBundle: (bundle: string, options: GetCompositionsConfig) => {
5
- compositions: TCompMetadata[];
6
- root: ComponentType;
7
- };
@@ -1,55 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.getCompositionsFromBundle = void 0;
7
- const fs_1 = __importDefault(require("fs"));
8
- const path_1 = __importDefault(require("path"));
9
- const remotion_1 = require("remotion");
10
- const vm_1 = __importDefault(require("vm"));
11
- const is_serve_url_1 = require("./is-serve-url");
12
- const getCompositionsFromBundle = (bundle, options) => {
13
- const bundleFile = path_1.default.join(bundle, 'bundle.js');
14
- if ((0, is_serve_url_1.isServeUrl)(bundle)) {
15
- throw new Error('Can only use getCompositionFromBundle from a local file');
16
- }
17
- const content = fs_1.default.readFileSync(bundleFile, 'utf-8');
18
- // @ts-éxpect-error
19
- process.env.REMOTION_SERVER_RENDERING = 'true';
20
- const context = {
21
- window: {
22
- remotion_envVariables: options.envVariables,
23
- },
24
- clearTimeout: () => {
25
- console.trace('clearTimeout() called inside a server-side bundle. This is not supported.');
26
- },
27
- setTimeout: () => {
28
- console.trace('setTimeout() called inside a server-side bundle. This is not supported.');
29
- },
30
- process: {
31
- env: {
32
- REMOTION_SERVER_RENDERING: true,
33
- },
34
- },
35
- require,
36
- Buffer,
37
- console,
38
- };
39
- const vmContext = vm_1.default.createContext(context);
40
- // TODO: Set props and env
41
- const code = content;
42
- vm_1.default.runInContext(code, vmContext, {
43
- filename: bundleFile,
44
- breakOnSigint: true,
45
- });
46
- const theRoot = remotion_1.Internals.getRoot();
47
- if (!theRoot) {
48
- throw new Error('Did not call getRoot() in the bundle. Delaying the calling of getRoot() is not supported in server-side-rendering.');
49
- }
50
- const Comp = theRoot;
51
- const comps = (0, remotion_1.getCompositionsFromMarkup)(Comp);
52
- remotion_1.Internals.clearRoot();
53
- return { compositions: comps, root: Comp };
54
- };
55
- exports.getCompositionsFromBundle = getCompositionsFromBundle;
@@ -1,3 +0,0 @@
1
- import type { ComponentType } from 'react';
2
- import type { TCompMetadata } from 'remotion';
3
- export declare const getCompositionsFromMarkup: (Comp: ComponentType) => TCompMetadata[];
@@ -1,17 +0,0 @@
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;
@@ -1,3 +0,0 @@
1
- import type { ComponentType } from 'react';
2
- import type { TCompMetadata } from 'remotion';
3
- export declare const getCompositionsFromMarkup: (Comp: ComponentType) => TCompMetadata[];
@@ -1,18 +0,0 @@
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
- console.log({ str }, (0, jsx_runtime_1.jsx)(Comp, {}));
10
- const matches = str.matchAll(/<div>(.*?)<\/div>/g);
11
- const metadata = [];
12
- for (const match of matches) {
13
- const json = JSON.parse(match[1]);
14
- metadata.push(json);
15
- }
16
- return metadata;
17
- };
18
- exports.getCompositionsFromMarkup = getCompositionsFromMarkup;
@@ -1,2 +0,0 @@
1
- import type { CompositorLayer } from './compositor/payloads';
2
- export declare const getNativeVideoSignals: (layers: CompositorLayer[]) => Record<string, Record<number, number>>;
@@ -1,28 +0,0 @@
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;
@@ -1,2 +0,0 @@
1
- export declare const lockPortSelection: () => void;
2
- export declare const unlockPortSelection: () => void;
@@ -1,11 +0,0 @@
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;
@@ -1,2 +0,0 @@
1
- import type { CompositionManagerContext, TCompMetadata } from 'remotion';
2
- export declare const makeCompManagerContext: (composition: TCompMetadata) => CompositionManagerContext;
@@ -1,45 +0,0 @@
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;
@@ -1,2 +0,0 @@
1
- import type { SmallTCompMetadata, TimelineContextValue } from 'remotion';
2
- export declare const makeTimelineContextValue: (composition: SmallTCompMetadata, frame: number) => TimelineContextValue;
@@ -1,20 +0,0 @@
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;
@@ -1,3 +0,0 @@
1
- import type { ComponentType } from 'react';
2
- import type { TCompMetadata } from 'remotion';
3
- export declare const renderOnServer: (Comp: ComponentType, composition: TCompMetadata) => Promise<void>;
@@ -1,90 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.renderOnServer = void 0;
7
- const jsx_runtime_1 = require("react/jsx-runtime");
8
- const execa_1 = __importDefault(require("execa"));
9
- const path_1 = __importDefault(require("path"));
10
- const server_1 = require("react-dom/server");
11
- const remotion_1 = require("remotion");
12
- const download_map_1 = require("./assets/download-map");
13
- const compose_1 = require("./compositor/compose");
14
- const compositor_1 = require("./compositor/compositor");
15
- const get_frame_padded_index_1 = require("./get-frame-padded-index");
16
- const make_comp_manager_context_1 = require("./make-comp-manager-context");
17
- const pool_1 = require("./pool");
18
- const renderOnServer = async (Comp, composition) => {
19
- console.time('total');
20
- console.time('frames');
21
- process.env.REMOTION_SERVER_RENDERING = 'true';
22
- // eslint-disable-next-line react/jsx-no-constructed-context-values
23
- const memo = (0, make_comp_manager_context_1.makeCompManagerContext)(composition);
24
- const pool = new pool_1.Pool(new Array(4).fill(true).map((_, i) => i));
25
- const downloadMap = (0, download_map_1.makeDownloadMap)();
26
- const renderId = 'abc';
27
- await Promise.all(new Array(composition.durationInFrames).fill(true).map(async (_, i) => {
28
- const frame = await pool.acquire();
29
- // eslint-disable-next-line react/jsx-no-constructed-context-values
30
- const value = {
31
- audioAndVideoTags: { current: [] },
32
- rootId: composition.id,
33
- playing: false,
34
- playbackRate: 1,
35
- imperativePlaying: {
36
- current: false,
37
- },
38
- frame: i,
39
- setPlaybackRate: () => {
40
- throw new Error('Not implemented');
41
- },
42
- };
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, {}) }) }) }));
44
- const out = path_1.default.join(downloadMap.compositingDir, (0, get_frame_padded_index_1.getFrameOutputFileName)({
45
- frame: i,
46
- imageFormat: 'tiff',
47
- index: i,
48
- countType: 'from-zero',
49
- lastFrame: composition.durationInFrames - 1,
50
- totalFrames: composition.durationInFrames,
51
- }));
52
- await (0, compose_1.compose)({
53
- height: composition.height,
54
- width: composition.width,
55
- downloadMap,
56
- imageFormat: 'AddToH264',
57
- layers: [
58
- {
59
- type: 'SvgImage',
60
- params: {
61
- height: composition.height,
62
- width: composition.width,
63
- markup: svg,
64
- x: 0,
65
- y: 0,
66
- },
67
- },
68
- ],
69
- output: out,
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
- },
79
- });
80
- pool.release(frame);
81
- }));
82
- (0, compositor_1.releaseCompositorWithId)(renderId);
83
- console.timeEnd('frames');
84
- await (0, compositor_1.waitForCompositorWithIdToQuit)(renderId);
85
- console.time('convert');
86
- await (0, execa_1.default)('ffmpeg', ['-i', 'fade.h264', '-c', 'copy', 'fade.mp4', '-y']);
87
- console.timeEnd('convert');
88
- console.timeEnd('total');
89
- };
90
- exports.renderOnServer = renderOnServer;
@@ -1,8 +0,0 @@
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;
@@ -1,13 +0,0 @@
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;
@@ -1,9 +0,0 @@
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;
@@ -1,23 +0,0 @@
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,74 +0,0 @@
1
- /// <reference types="node" />
2
- import type { SmallTCompMetadata, TAsset } from 'remotion';
3
- import type { DownloadMap } from './assets/download-map';
4
- import type { BrowserExecutable } from './browser-executable';
5
- import type { BrowserLog } from './browser-log';
6
- import type { Page } from './browser/BrowserPage';
7
- import type { CompositorLayer } from './compositor/payloads';
8
- import type { CountType } from './get-frame-padded-index';
9
- import type { ServeUrl } from './legacy-webpack-config';
10
- import type { ChromiumOptions } from './open-browser';
11
- import type { Pool } from './pool';
12
- import type { BrowserReplacer } from './replace-browser';
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
- frame: number;
15
- index: number;
16
- retriesLeft: number;
17
- attempt: number;
18
- actualConcurrency: number;
19
- browserReplacer: BrowserReplacer | null;
20
- poolPromise: Promise<Pool<Page>>;
21
- composition: SmallTCompMetadata;
22
- downloadMap: DownloadMap;
23
- imageFormat: 'png' | 'jpeg' | 'none';
24
- onFrameBuffer: ((buffer: Buffer, frame: number) => void) | undefined;
25
- outputDir: string | null;
26
- stopState: {
27
- isStopped: boolean;
28
- };
29
- countType: CountType;
30
- scale: number;
31
- quality: number | undefined;
32
- framesToRender: number[];
33
- lastFrame: number;
34
- framesRendered: {
35
- frames: number;
36
- };
37
- browserExecutable?: BrowserExecutable | undefined;
38
- chromiumOptions?: ChromiumOptions | undefined;
39
- dumpBrowserLogs?: boolean | undefined;
40
- pagesArray: Page[];
41
- onBrowserLog?: ((log: BrowserLog) => void) | undefined;
42
- inputProps: unknown;
43
- envVariables?: Record<string, string> | undefined;
44
- muted: boolean;
45
- proxyPort: number;
46
- realFrameRange: [number, number];
47
- serveUrl: ServeUrl;
48
- timeoutInMilliseconds: number;
49
- }) => Promise<{
50
- layer: CompositorLayer | null;
51
- buffer: Buffer | null;
52
- assets: TAsset[];
53
- }>;
54
- export declare const makePage: ({ browserReplacer, pagesArray, composition, scale, onBrowserLog, inputProps, envVariables, serveUrl, realFrameRange, timeoutInMilliseconds, proxyPort, imageFormat, muted, }: {
55
- browserReplacer: BrowserReplacer;
56
- pagesArray: Page[];
57
- composition: SmallTCompMetadata;
58
- scale?: number | undefined;
59
- onBrowserLog?: ((log: BrowserLog) => void) | undefined;
60
- inputProps: unknown;
61
- envVariables?: Record<string, string> | undefined;
62
- serveUrl: ServeUrl;
63
- realFrameRange: [number, number];
64
- timeoutInMilliseconds: number | undefined;
65
- proxyPort: number;
66
- imageFormat: 'png' | 'jpeg' | 'none';
67
- muted: boolean;
68
- }) => Promise<Page>;
69
- export declare const makeBrowser: ({ dumpBrowserLogs, browserExecutable, chromiumOptions, scale, }: {
70
- dumpBrowserLogs?: boolean | undefined;
71
- browserExecutable?: BrowserExecutable | undefined;
72
- chromiumOptions?: ChromiumOptions | undefined;
73
- scale?: number | undefined;
74
- }) => Promise<import("./browser/Browser").Browser>;
@@ -1,260 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.makeBrowser = exports.makePage = exports.renderWebFrameAndRetryTargetClose = void 0;
7
- const path_1 = __importDefault(require("path"));
8
- const browser_1 = require("./browser");
9
- const handle_javascript_exception_1 = require("./error-handling/handle-javascript-exception");
10
- const make_cancel_signal_1 = require("./make-cancel-signal");
11
- const open_browser_1 = require("./open-browser");
12
- const perf_1 = require("./perf");
13
- const puppeteer_evaluate_1 = require("./puppeteer-evaluate");
14
- const seek_to_frame_1 = require("./seek-to-frame");
15
- const set_props_and_env_1 = require("./set-props-and-env");
16
- const take_frame_and_compose_1 = require("./take-frame-and-compose");
17
- const renderFrameWithOptionToReject = async ({ frame, index, reject, width, height, poolPromise, stopState, imageFormat, downloadMap, scale, quality, }) => {
18
- const pool = await poolPromise;
19
- const freePage = await pool.acquire();
20
- if (stopState.isStopped) {
21
- reject(new Error('Render was stopped'));
22
- throw new Error('stopped');
23
- }
24
- const errorCallbackOnFrame = (err) => {
25
- reject(err);
26
- };
27
- const cleanupPageError = (0, handle_javascript_exception_1.handleJavascriptException)({
28
- page: freePage,
29
- onError: errorCallbackOnFrame,
30
- frame,
31
- });
32
- freePage.on('error', errorCallbackOnFrame);
33
- await (0, seek_to_frame_1.seekToFrame)({ frame, page: freePage });
34
- const id = (0, perf_1.startPerfMeasure)('save');
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)({
37
- frame,
38
- freePage,
39
- height,
40
- imageFormat,
41
- quality,
42
- width,
43
- });
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
66
- (0, perf_1.stopPerfMeasure)(id);
67
- cleanupPageError();
68
- freePage.off('error', errorCallbackOnFrame);
69
- pool.release(freePage);
70
- return { layer: compositionLayer, buffer, assets: collectedAssets };
71
- };
72
- const renderWebFrame = ({ frame, index, downloadMap, imageFormat, poolPromise, stopState, composition, scale, quality, }) => {
73
- return new Promise((resolve, reject) => {
74
- renderFrameWithOptionToReject({
75
- frame,
76
- index,
77
- reject,
78
- width: composition.width,
79
- height: composition.height,
80
- downloadMap,
81
- imageFormat,
82
- poolPromise,
83
- stopState,
84
- scale,
85
- quality,
86
- })
87
- .then((res) => {
88
- resolve(res);
89
- })
90
- .catch((err) => {
91
- reject(err);
92
- });
93
- });
94
- };
95
- // TODO: Bring fixes for retrying here
96
- 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, }) => {
97
- var _a, _b;
98
- try {
99
- const returnval = await renderWebFrame({
100
- frame,
101
- index,
102
- poolPromise,
103
- composition,
104
- downloadMap,
105
- imageFormat,
106
- stopState,
107
- scale,
108
- quality,
109
- });
110
- return returnval;
111
- }
112
- catch (err) {
113
- if (!((_a = err === null || err === void 0 ? void 0 : err.message) === null || _a === void 0 ? void 0 : _a.includes('Target closed')) &&
114
- !((_b = err === null || err === void 0 ? void 0 : err.message) === null || _b === void 0 ? void 0 : _b.includes('Session closed'))) {
115
- throw err;
116
- }
117
- if ((0, make_cancel_signal_1.isUserCancelledRender)(err)) {
118
- throw err;
119
- }
120
- if (retriesLeft === 0) {
121
- console.warn(err, `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`);
122
- throw err;
123
- }
124
- console.warn(`The browser crashed while rendering frame ${frame}, retrying ${retriesLeft} more times. Learn more about this error under https://www.remotion.dev/docs/target-closed`);
125
- if (!browserReplacer) {
126
- throw new Error('Did not have browser replacer for web frame');
127
- }
128
- await browserReplacer.replaceBrowser(() => (0, exports.makeBrowser)({
129
- browserExecutable,
130
- chromiumOptions,
131
- dumpBrowserLogs,
132
- scale,
133
- }), async () => {
134
- const pages = new Array(actualConcurrency).fill(true).map(() => (0, exports.makePage)({
135
- browserReplacer,
136
- composition,
137
- pagesArray,
138
- onBrowserLog,
139
- scale,
140
- inputProps,
141
- envVariables,
142
- imageFormat,
143
- muted,
144
- proxyPort,
145
- realFrameRange,
146
- serveUrl,
147
- timeoutInMilliseconds,
148
- }));
149
- const puppeteerPages = await Promise.all(pages);
150
- const pool = await poolPromise;
151
- for (const newPage of puppeteerPages) {
152
- pool.release(newPage);
153
- }
154
- });
155
- const fram = await (0, exports.renderWebFrameAndRetryTargetClose)({
156
- frame,
157
- index,
158
- retriesLeft: retriesLeft - 1,
159
- attempt: attempt + 1,
160
- actualConcurrency,
161
- browserReplacer,
162
- composition,
163
- downloadMap,
164
- imageFormat,
165
- onFrameBuffer,
166
- outputDir,
167
- poolPromise,
168
- stopState,
169
- countType,
170
- scale,
171
- quality,
172
- framesToRender,
173
- lastFrame,
174
- framesRendered,
175
- inputProps,
176
- pagesArray,
177
- browserExecutable,
178
- chromiumOptions,
179
- dumpBrowserLogs,
180
- envVariables,
181
- muted,
182
- onBrowserLog,
183
- proxyPort,
184
- realFrameRange,
185
- serveUrl,
186
- timeoutInMilliseconds,
187
- });
188
- return fram;
189
- }
190
- };
191
- exports.renderWebFrameAndRetryTargetClose = renderWebFrameAndRetryTargetClose;
192
- const makePage = async ({ browserReplacer, pagesArray, composition, scale, onBrowserLog, inputProps, envVariables, serveUrl, realFrameRange, timeoutInMilliseconds, proxyPort, imageFormat, muted, }) => {
193
- if (!browserReplacer) {
194
- throw new Error('canonot make page without browser replacer');
195
- }
196
- const page = await browserReplacer.getBrowser().newPage();
197
- pagesArray.push(page);
198
- await page.setViewport({
199
- width: composition.width,
200
- height: composition.height,
201
- deviceScaleFactor: scale !== null && scale !== void 0 ? scale : 1,
202
- });
203
- const logCallback = (log) => {
204
- onBrowserLog === null || onBrowserLog === void 0 ? void 0 : onBrowserLog({
205
- stackTrace: log.stackTrace(),
206
- text: log.text,
207
- type: log.type,
208
- });
209
- };
210
- if (onBrowserLog) {
211
- page.on('console', logCallback);
212
- }
213
- const initialFrame = realFrameRange[0];
214
- await (0, set_props_and_env_1.setPropsAndEnv)({
215
- inputProps,
216
- envVariables,
217
- page,
218
- serveUrl,
219
- initialFrame,
220
- timeoutInMilliseconds,
221
- proxyPort,
222
- retriesRemaining: 2,
223
- audioEnabled: !muted,
224
- videoEnabled: imageFormat !== 'none',
225
- });
226
- await (0, puppeteer_evaluate_1.puppeteerEvaluateWithCatch)({
227
- // eslint-disable-next-line max-params
228
- pageFunction: (id, defaultProps, durationInFrames, fps, height, width) => {
229
- window.setBundleMode({
230
- type: 'composition',
231
- compositionName: id,
232
- compositionDefaultProps: defaultProps,
233
- compositionDurationInFrames: durationInFrames,
234
- compositionFps: fps,
235
- compositionHeight: height,
236
- compositionWidth: width,
237
- });
238
- },
239
- args: [
240
- composition.id,
241
- composition.defaultProps,
242
- composition.durationInFrames,
243
- composition.fps,
244
- composition.height,
245
- composition.width,
246
- ],
247
- frame: null,
248
- page,
249
- });
250
- page.off('console', logCallback);
251
- return page;
252
- };
253
- exports.makePage = makePage;
254
- const makeBrowser = ({ dumpBrowserLogs, browserExecutable, chromiumOptions, scale, }) => (0, open_browser_1.openBrowser)(browser_1.DEFAULT_BROWSER, {
255
- shouldDumpIo: dumpBrowserLogs,
256
- browserExecutable,
257
- chromiumOptions,
258
- forceDeviceScaleFactor: scale !== null && scale !== void 0 ? scale : 1,
259
- });
260
- exports.makeBrowser = makeBrowser;