@remotion/renderer 4.0.0-fastlambda.8 → 4.0.0-lambda.3

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 (191) hide show
  1. package/dist/assets/cleanup-assets.d.ts +2 -0
  2. package/dist/assets/cleanup-assets.js +2 -0
  3. package/dist/assets/download-and-map-assets-to-file.d.ts +6 -0
  4. package/dist/assets/download-and-map-assets-to-file.js +46 -19
  5. package/dist/assets/ffmpeg-volume-expression.d.ts +2 -1
  6. package/dist/assets/ffmpeg-volume-expression.js +15 -12
  7. package/dist/assets/get-audio-channels.d.ts +5 -2
  8. package/dist/assets/get-audio-channels.js +15 -4
  9. package/dist/browser/Accessibility.d.ts +175 -0
  10. package/dist/browser/Accessibility.js +423 -0
  11. package/dist/browser/AriaQueryHandler.d.ts +20 -0
  12. package/dist/browser/AriaQueryHandler.js +108 -0
  13. package/dist/browser/Browser.d.ts +209 -0
  14. package/dist/browser/Browser.js +402 -0
  15. package/dist/browser/BrowserConnector.d.ts +26 -0
  16. package/dist/browser/BrowserConnector.js +49 -0
  17. package/dist/browser/BrowserFetcher.d.ts +89 -0
  18. package/dist/browser/BrowserFetcher.js +512 -0
  19. package/dist/browser/BrowserRunner.d.ts +39 -0
  20. package/dist/browser/BrowserRunner.js +308 -0
  21. package/dist/browser/Connection.d.ts +49 -0
  22. package/dist/browser/Connection.js +262 -0
  23. package/dist/browser/ConnectionTransport.d.ts +21 -0
  24. package/dist/browser/ConnectionTransport.js +17 -0
  25. package/dist/browser/ConsoleMessage.d.ts +55 -0
  26. package/dist/browser/ConsoleMessage.js +75 -0
  27. package/dist/browser/Coverage.d.ts +180 -0
  28. package/dist/browser/Coverage.js +371 -0
  29. package/dist/browser/DOMWorld.d.ts +50 -0
  30. package/dist/browser/DOMWorld.js +280 -0
  31. package/dist/browser/Debug.d.ts +19 -0
  32. package/dist/browser/Debug.js +42 -0
  33. package/dist/browser/DeviceDescriptors.d.ts +40 -0
  34. package/dist/browser/DeviceDescriptors.js +1407 -0
  35. package/dist/browser/EmulationManager.d.ts +7 -0
  36. package/dist/browser/EmulationManager.js +40 -0
  37. package/dist/browser/Errors.d.ts +25 -0
  38. package/dist/browser/Errors.js +35 -0
  39. package/dist/browser/EvalTypes.d.ts +27 -0
  40. package/dist/browser/EvalTypes.js +17 -0
  41. package/dist/browser/EventEmitter.d.ts +70 -0
  42. package/dist/browser/EventEmitter.js +102 -0
  43. package/dist/browser/ExecutionContext.d.ts +35 -0
  44. package/dist/browser/ExecutionContext.js +190 -0
  45. package/dist/browser/FileChooser.d.ts +56 -0
  46. package/dist/browser/FileChooser.js +86 -0
  47. package/dist/browser/FrameManager.d.ts +96 -0
  48. package/dist/browser/FrameManager.js +512 -0
  49. package/dist/browser/HTTPRequest.d.ts +42 -0
  50. package/dist/browser/HTTPRequest.js +82 -0
  51. package/dist/browser/HTTPResponse.d.ts +100 -0
  52. package/dist/browser/HTTPResponse.js +196 -0
  53. package/dist/browser/Input.d.ts +355 -0
  54. package/dist/browser/Input.js +592 -0
  55. package/dist/browser/JSHandle.d.ts +36 -0
  56. package/dist/browser/JSHandle.js +93 -0
  57. package/dist/browser/LaunchOptions.d.ts +117 -0
  58. package/dist/browser/LaunchOptions.js +17 -0
  59. package/dist/browser/Launcher.d.ts +9 -0
  60. package/dist/browser/Launcher.js +602 -0
  61. package/dist/browser/LifecycleWatcher.d.ts +29 -0
  62. package/dist/browser/LifecycleWatcher.js +193 -0
  63. package/dist/browser/NetworkConditions.d.ts +26 -0
  64. package/dist/browser/NetworkConditions.js +33 -0
  65. package/dist/browser/NetworkEventManager.d.ts +35 -0
  66. package/dist/browser/NetworkEventManager.js +128 -0
  67. package/dist/browser/NetworkManager.d.ts +36 -0
  68. package/dist/browser/NetworkManager.js +284 -0
  69. package/dist/browser/NodeWebSocketTransport.d.ts +11 -0
  70. package/dist/browser/NodeWebSocketTransport.js +90 -0
  71. package/dist/browser/PDFOptions.d.ts +165 -0
  72. package/dist/browser/PDFOptions.js +34 -0
  73. package/dist/browser/PipeTransport.d.ts +10 -0
  74. package/dist/browser/PipeTransport.js +86 -0
  75. package/dist/browser/Product.d.ts +16 -0
  76. package/dist/browser/Product.js +17 -0
  77. package/dist/browser/Puppeteer.d.ts +35 -0
  78. package/dist/browser/Puppeteer.js +17 -0
  79. package/dist/browser/PuppeteerNode.d.ts +92 -0
  80. package/dist/browser/PuppeteerNode.js +143 -0
  81. package/dist/browser/PuppeteerViewport.d.ts +5 -0
  82. package/dist/browser/PuppeteerViewport.js +2 -0
  83. package/dist/browser/QueryHandler.d.ts +64 -0
  84. package/dist/browser/QueryHandler.js +183 -0
  85. package/dist/browser/ScreenshotOptions.d.ts +14 -0
  86. package/dist/browser/ScreenshotOptions.js +2 -0
  87. package/dist/browser/SecurityDetails.d.ts +55 -0
  88. package/dist/browser/SecurityDetails.js +95 -0
  89. package/dist/browser/Target.d.ts +61 -0
  90. package/dist/browser/Target.js +146 -0
  91. package/dist/browser/TaskQueue.d.ts +20 -0
  92. package/dist/browser/TaskQueue.js +47 -0
  93. package/dist/browser/TimeoutSettings.d.ts +23 -0
  94. package/dist/browser/TimeoutSettings.js +62 -0
  95. package/dist/browser/Tracing.d.ts +45 -0
  96. package/dist/browser/Tracing.js +136 -0
  97. package/dist/browser/USKeyboardLayout.d.ts +39 -0
  98. package/dist/browser/USKeyboardLayout.js +406 -0
  99. package/dist/browser/WebWorker.d.ts +96 -0
  100. package/dist/browser/WebWorker.js +122 -0
  101. package/dist/browser/assert.d.ts +21 -0
  102. package/dist/browser/assert.js +29 -0
  103. package/dist/browser/compat.d.ts +2 -0
  104. package/dist/browser/compat.js +17 -0
  105. package/dist/browser/create-browser-fetcher.d.ts +17 -0
  106. package/dist/browser/create-browser-fetcher.js +140 -0
  107. package/dist/browser/dialog.d.ts +70 -0
  108. package/dist/browser/dialog.js +114 -0
  109. package/dist/browser/environment.d.ts +16 -0
  110. package/dist/browser/environment.js +19 -0
  111. package/dist/browser/fetch.d.ts +16 -0
  112. package/dist/browser/fetch.js +46 -0
  113. package/dist/browser/find-up.d.ts +4 -0
  114. package/dist/browser/find-up.js +85 -0
  115. package/dist/browser/get-download-destination.d.ts +1 -0
  116. package/dist/browser/get-download-destination.js +38 -0
  117. package/dist/browser/mitt/index.d.ts +22 -0
  118. package/dist/browser/mitt/index.js +49 -0
  119. package/dist/browser/node.d.ts +2 -0
  120. package/dist/browser/node.js +9 -0
  121. package/dist/browser/page.d.ts +78 -0
  122. package/dist/browser/page.js +277 -0
  123. package/dist/browser/pkg-dir.d.ts +3 -0
  124. package/dist/browser/pkg-dir.js +13 -0
  125. package/dist/browser/revisions.d.ts +21 -0
  126. package/dist/browser/revisions.js +22 -0
  127. package/dist/browser/util.d.ts +46 -0
  128. package/dist/browser/util.js +161 -0
  129. package/dist/calculate-ffmpeg-filters.js +2 -2
  130. package/dist/combine-videos.d.ts +2 -1
  131. package/dist/combine-videos.js +8 -1
  132. package/dist/cycle-browser-tabs.d.ts +2 -1
  133. package/dist/cycle-browser-tabs.js +9 -2
  134. package/dist/ensure-presentation-timestamp.d.ts +1 -0
  135. package/dist/ensure-presentation-timestamp.js +57 -0
  136. package/dist/extract-frame-from-video.d.ts +11 -0
  137. package/dist/extract-frame-from-video.js +197 -0
  138. package/dist/frame-to-ffmpeg-timestamp.d.ts +1 -0
  139. package/dist/frame-to-ffmpeg-timestamp.js +8 -0
  140. package/dist/get-compositions.d.ts +5 -2
  141. package/dist/get-compositions.js +23 -5
  142. package/dist/get-duration-of-asset.d.ts +7 -0
  143. package/dist/get-duration-of-asset.js +36 -0
  144. package/dist/get-port.js +26 -24
  145. package/dist/index.d.ts +33 -9
  146. package/dist/index.js +14 -5
  147. package/dist/is-beyond-last-frame.d.ts +2 -0
  148. package/dist/is-beyond-last-frame.js +12 -0
  149. package/dist/last-frame-from-video-cache.d.ts +10 -0
  150. package/dist/last-frame-from-video-cache.js +50 -0
  151. package/dist/make-assets-download-dir.js +6 -1
  152. package/dist/make-cancel-signal.d.ts +7 -0
  153. package/dist/make-cancel-signal.js +25 -0
  154. package/dist/merge-audio-track.js +2 -2
  155. package/dist/offthread-video-server.d.ts +14 -0
  156. package/dist/offthread-video-server.js +67 -0
  157. package/dist/open-browser.d.ts +6 -6
  158. package/dist/open-browser.js +24 -20
  159. package/dist/prepare-server.d.ts +13 -2
  160. package/dist/prepare-server.js +35 -5
  161. package/dist/preprocess-audio-track.d.ts +1 -0
  162. package/dist/preprocess-audio-track.js +2 -2
  163. package/dist/prespawn-ffmpeg.d.ts +2 -0
  164. package/dist/prespawn-ffmpeg.js +10 -9
  165. package/dist/provide-screenshot.js +1 -1
  166. package/dist/puppeteer-screenshot.js +5 -1
  167. package/dist/render-frames.d.ts +6 -1
  168. package/dist/render-frames.js +96 -37
  169. package/dist/render-media.d.ts +12 -2
  170. package/dist/render-media.js +127 -54
  171. package/dist/render-still.d.ts +14 -4
  172. package/dist/render-still.js +58 -19
  173. package/dist/serve-handler/glob-slash.d.ts +1 -0
  174. package/dist/serve-handler/glob-slash.js +12 -0
  175. package/dist/serve-handler/index.d.ts +4 -0
  176. package/dist/serve-handler/index.js +205 -0
  177. package/dist/serve-handler/is-path-inside.d.ts +1 -0
  178. package/dist/serve-handler/is-path-inside.js +27 -0
  179. package/dist/serve-handler/range-parser.d.ts +13 -0
  180. package/dist/serve-handler/range-parser.js +57 -0
  181. package/dist/serve-static.d.ts +10 -3
  182. package/dist/serve-static.js +22 -4
  183. package/dist/set-props-and-env.d.ts +3 -1
  184. package/dist/set-props-and-env.js +28 -6
  185. package/dist/stitch-frames-to-video.d.ts +4 -1
  186. package/dist/stitch-frames-to-video.js +36 -15
  187. package/dist/stringify-ffmpeg-filter.js +3 -0
  188. package/dist/tmp-dir.js +5 -1
  189. package/dist/validate-fps-for-gif.d.ts +2 -0
  190. package/dist/validate-fps-for-gif.js +9 -0
  191. package/package.json +6 -7
@@ -10,11 +10,17 @@ const path_1 = __importDefault(require("path"));
10
10
  const puppeteer_core_1 = __importDefault(require("puppeteer-core"));
11
11
  const remotion_1 = require("remotion");
12
12
  const get_local_browser_executable_1 = require("./get-local-browser-executable");
13
- const validRenderers = ['angle', 'egl', 'swiftshader'];
13
+ const validRenderers = ['swangle', 'angle', 'egl', 'swiftshader'];
14
14
  const getOpenGlRenderer = (option) => {
15
15
  const renderer = option !== null && option !== void 0 ? option : remotion_1.Internals.DEFAULT_OPENGL_RENDERER;
16
16
  remotion_1.Internals.validateOpenGlRenderer(renderer);
17
- return renderer;
17
+ if (renderer === 'swangle') {
18
+ return [`--use-gl=angle`, `--use-angle=swiftshader`];
19
+ }
20
+ if (renderer === null) {
21
+ return [];
22
+ }
23
+ return [`--use-gl=${renderer}`];
18
24
  };
19
25
  const browserInstances = [];
20
26
  const killAllBrowsers = async () => {
@@ -27,7 +33,7 @@ const killAllBrowsers = async () => {
27
33
  };
28
34
  exports.killAllBrowsers = killAllBrowsers;
29
35
  const openBrowser = async (browser, options) => {
30
- var _a, _b, _c, _d, _e, _f, _g;
36
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
31
37
  if (browser === 'firefox' && !remotion_1.Internals.FEATURE_FLAG_FIREFOX_SUPPORT) {
32
38
  throw new TypeError('Firefox supported is not yet turned on. Stay tuned for the future.');
33
39
  }
@@ -38,13 +44,9 @@ const openBrowser = async (browser, options) => {
38
44
  executablePath,
39
45
  product: browser,
40
46
  dumpio: (_e = options === null || options === void 0 ? void 0 : options.shouldDumpIo) !== null && _e !== void 0 ? _e : false,
41
- headless: false,
42
47
  ignoreDefaultArgs: true,
43
- defaultViewport: {
44
- width: 1920,
45
- height: 1080,
46
- },
47
48
  args: [
49
+ 'about:blank',
48
50
  '--allow-pre-commit-input',
49
51
  '--disable-background-networking',
50
52
  '--enable-features=NetworkService,NetworkServiceInProcess',
@@ -56,9 +58,11 @@ const openBrowser = async (browser, options) => {
56
58
  '--disable-default-apps',
57
59
  '--disable-dev-shm-usage',
58
60
  '--disable-extensions',
61
+ '--no-proxy-server',
62
+ "--proxy-server='direct://'",
63
+ '--proxy-bypass-list=*',
59
64
  // TODO: remove AvoidUnnecessaryBeforeUnloadCheckSync below
60
65
  // once crbug.com/1324138 is fixed and released.
61
- '--disable-features=Translate,BackForwardCache,AvoidUnnecessaryBeforeUnloadCheckSync',
62
66
  '--disable-hang-monitor',
63
67
  '--disable-ipc-flooding-protection',
64
68
  '--disable-popup-blocking',
@@ -72,36 +76,36 @@ const openBrowser = async (browser, options) => {
72
76
  '--enable-automation',
73
77
  '--password-store=basic',
74
78
  '--use-mock-keychain',
75
- (options === null || options === void 0 ? void 0 : options.forceDeviceScaleFactor)
76
- ? `--force-device-scale-factor=${options.forceDeviceScaleFactor}`
77
- : null,
78
79
  // TODO(sadym): remove '--enable-blink-features=IdleDetection'
79
80
  // once IdleDetection is turned on by default.
80
81
  '--enable-blink-features=IdleDetection',
81
82
  '--export-tagged-pdf',
82
83
  '--intensive-wake-up-throttling-policy=0',
83
- '--headless',
84
+ ((_g = (_f = options === null || options === void 0 ? void 0 : options.chromiumOptions) === null || _f === void 0 ? void 0 : _f.headless) !== null && _g !== void 0 ? _g : true) ? '--headless' : null,
84
85
  '--no-sandbox',
85
86
  '--disable-setuid-sandbox',
86
- '--disable-dev-shm-usage',
87
- customGlRenderer ? `--use-gl=${customGlRenderer}` : null,
87
+ ...customGlRenderer,
88
88
  '--disable-background-media-suspend',
89
89
  process.platform === 'linux' ? '--single-process' : null,
90
90
  '--allow-running-insecure-content',
91
91
  '--disable-component-update',
92
92
  '--disable-domain-reliability',
93
- '--disable-features=AudioServiceOutOfProcess,IsolateOrigins,site-per-process',
93
+ '--disable-features=AudioServiceOutOfProcess,IsolateOrigins,site-per-process,Translate,BackForwardCache,AvoidUnnecessaryBeforeUnloadCheckSync,IntensiveWakeUpThrottling',
94
94
  '--disable-print-preview',
95
95
  '--disable-site-isolation-trials',
96
- '--disk-cache-size=33554432',
96
+ '--disk-cache-size=268435456',
97
97
  '--hide-scrollbars',
98
98
  '--no-default-browser-check',
99
99
  '--no-pings',
100
+ '--font-render-hinting=none',
100
101
  '--no-zygote',
101
- ((_f = options === null || options === void 0 ? void 0 : options.chromiumOptions) === null || _f === void 0 ? void 0 : _f.ignoreCertificateErrors)
102
+ (options === null || options === void 0 ? void 0 : options.forceDeviceScaleFactor)
103
+ ? `--force-device-scale-factor=${options.forceDeviceScaleFactor}`
104
+ : null,
105
+ ((_h = options === null || options === void 0 ? void 0 : options.chromiumOptions) === null || _h === void 0 ? void 0 : _h.ignoreCertificateErrors)
102
106
  ? '--ignore-certificate-errors'
103
107
  : null,
104
- ...(((_g = options === null || options === void 0 ? void 0 : options.chromiumOptions) === null || _g === void 0 ? void 0 : _g.disableWebSecurity)
108
+ ...(((_j = options === null || options === void 0 ? void 0 : options.chromiumOptions) === null || _j === void 0 ? void 0 : _j.disableWebSecurity)
105
109
  ? [
106
110
  '--disable-web-security',
107
111
  '--user-data-dir=' +
@@ -111,7 +115,7 @@ const openBrowser = async (browser, options) => {
111
115
  ].filter(Boolean),
112
116
  });
113
117
  const pages = await browserInstance.pages();
114
- pages.forEach((p) => p.close());
118
+ await pages[0].close();
115
119
  browserInstances.push(browserInstance);
116
120
  return browserInstance;
117
121
  };
@@ -1,4 +1,15 @@
1
- export declare const prepareServer: (webpackConfigOrServeUrl: string) => Promise<{
1
+ import { FfmpegExecutable } from 'remotion';
2
+ import { RenderMediaOnDownload } from './assets/download-and-map-assets-to-file';
3
+ export declare const prepareServer: ({ downloadDir, ffmpegExecutable, ffprobeExecutable, onDownload, onError, webpackConfigOrServeUrl, port, }: {
4
+ webpackConfigOrServeUrl: string;
5
+ downloadDir: string;
6
+ onDownload: RenderMediaOnDownload;
7
+ onError: (err: Error) => void;
8
+ ffmpegExecutable: FfmpegExecutable;
9
+ ffprobeExecutable: FfmpegExecutable;
10
+ port: number | null;
11
+ }) => Promise<{
2
12
  serveUrl: string;
3
- closeServer: () => Promise<void>;
13
+ closeServer: () => Promise<unknown>;
14
+ offthreadPort: number;
4
15
  }>;
@@ -1,19 +1,49 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  exports.prepareServer = void 0;
7
+ const fs_1 = require("fs");
8
+ const path_1 = __importDefault(require("path"));
4
9
  const is_serve_url_1 = require("./is-serve-url");
5
10
  const serve_static_1 = require("./serve-static");
6
- const prepareServer = async (webpackConfigOrServeUrl) => {
11
+ const prepareServer = async ({ downloadDir, ffmpegExecutable, ffprobeExecutable, onDownload, onError, webpackConfigOrServeUrl, port, }) => {
7
12
  if ((0, is_serve_url_1.isServeUrl)(webpackConfigOrServeUrl)) {
13
+ const { port: offthreadPort, close: closeProxy } = await (0, serve_static_1.serveStatic)(null, {
14
+ downloadDir,
15
+ onDownload,
16
+ onError,
17
+ ffmpegExecutable,
18
+ ffprobeExecutable,
19
+ port,
20
+ });
8
21
  return Promise.resolve({
9
22
  serveUrl: webpackConfigOrServeUrl,
10
- closeServer: () => Promise.resolve(undefined),
23
+ closeServer: () => closeProxy(),
24
+ offthreadPort,
11
25
  });
12
26
  }
13
- const { port, close } = await (0, serve_static_1.serveStatic)(webpackConfigOrServeUrl);
27
+ // Check if the path has a `index.html` file
28
+ const indexFile = path_1.default.join(webpackConfigOrServeUrl, 'index.html');
29
+ const exists = (0, fs_1.existsSync)(indexFile);
30
+ if (!exists) {
31
+ throw new Error(`Tried to serve the Webpack bundle on a HTTP server, but the file ${indexFile} does not exist. Is this a valid path to a Webpack bundle?`);
32
+ }
33
+ const { port: serverPort, close } = await (0, serve_static_1.serveStatic)(webpackConfigOrServeUrl, {
34
+ downloadDir,
35
+ onDownload,
36
+ onError,
37
+ ffmpegExecutable,
38
+ ffprobeExecutable,
39
+ port,
40
+ });
14
41
  return Promise.resolve({
15
- closeServer: () => close(),
16
- serveUrl: `http://localhost:${port}`,
42
+ closeServer: () => {
43
+ return close();
44
+ },
45
+ serveUrl: `http://localhost:${serverPort}`,
46
+ offthreadPort: serverPort,
17
47
  });
18
48
  };
19
49
  exports.prepareServer = prepareServer;
@@ -2,6 +2,7 @@ import { FfmpegExecutable } from 'remotion';
2
2
  import { MediaAsset } from './assets/types';
3
3
  declare type Options = {
4
4
  ffmpegExecutable: FfmpegExecutable;
5
+ ffprobeExecutable: FfmpegExecutable;
5
6
  outName: string;
6
7
  asset: MediaAsset;
7
8
  expectedFrames: number;
@@ -10,8 +10,8 @@ const calculate_ffmpeg_filters_1 = require("./calculate-ffmpeg-filters");
10
10
  const ffmpeg_filter_file_1 = require("./ffmpeg-filter-file");
11
11
  const p_limit_1 = require("./p-limit");
12
12
  const resolve_asset_src_1 = require("./resolve-asset-src");
13
- const preprocessAudioTrackUnlimited = async ({ ffmpegExecutable, outName, asset, expectedFrames, fps, }) => {
14
- const { channels, duration } = await (0, get_audio_channels_1.getAudioChannelsAndDuration)((0, resolve_asset_src_1.resolveAssetSrc)(asset.src));
13
+ const preprocessAudioTrackUnlimited = async ({ ffmpegExecutable, ffprobeExecutable, outName, asset, expectedFrames, fps, }) => {
14
+ const { channels, duration } = await (0, get_audio_channels_1.getAudioChannelsAndDuration)((0, resolve_asset_src_1.resolveAssetSrc)(asset.src), ffprobeExecutable);
15
15
  const filter = (0, calculate_ffmpeg_filters_1.calculateFfmpegFilter)({
16
16
  asset,
17
17
  durationInFrames: expectedFrames,
@@ -1,5 +1,6 @@
1
1
  import execa from 'execa';
2
2
  import { Codec, FfmpegExecutable, ImageFormat, PixelFormat, ProResProfile } from 'remotion';
3
+ import { CancelSignal } from './make-cancel-signal';
3
4
  declare type PreSticherOptions = {
4
5
  fps: number;
5
6
  width: number;
@@ -13,6 +14,7 @@ declare type PreSticherOptions = {
13
14
  verbose: boolean;
14
15
  ffmpegExecutable: FfmpegExecutable | undefined;
15
16
  imageFormat: ImageFormat;
17
+ signal: CancelSignal;
16
18
  };
17
19
  export declare const prespawnFfmpeg: (options: PreSticherOptions) => Promise<{
18
20
  task: execa.ExecaChildProcess<string>;
@@ -57,15 +57,13 @@ const prespawnFfmpeg = async (options) => {
57
57
  // -c:v is the same as -vcodec as -codec:video
58
58
  // and specified the video codec.
59
59
  ['-c:v', encoderName],
60
- ...[
61
- proResProfileName ? ['-profile:v', proResProfileName] : null,
62
- supportsCrf ? ['-crf', String(crf)] : null,
63
- ['-pix_fmt', pixelFormat],
64
- // Without explicitly disabling auto-alt-ref,
65
- // transparent WebM generation doesn't work
66
- pixelFormat === 'yuva420p' ? ['-auto-alt-ref', '0'] : null,
67
- ['-b:v', '1M'],
68
- ],
60
+ proResProfileName ? ['-profile:v', proResProfileName] : null,
61
+ supportsCrf ? ['-crf', String(crf)] : null,
62
+ ['-pix_fmt', pixelFormat],
63
+ // Without explicitly disabling auto-alt-ref,
64
+ // transparent WebM generation doesn't work
65
+ pixelFormat === 'yuva420p' ? ['-auto-alt-ref', '0'] : null,
66
+ ['-b:v', '1M'],
69
67
  '-y',
70
68
  options.outputLocation,
71
69
  ];
@@ -75,6 +73,9 @@ const prespawnFfmpeg = async (options) => {
75
73
  }
76
74
  const ffmpegString = ffmpegArgs.flat(2).filter(Boolean);
77
75
  const task = (0, execa_1.default)((_f = options.ffmpegExecutable) !== null && _f !== void 0 ? _f : 'ffmpeg', ffmpegString);
76
+ options.signal(() => {
77
+ task.kill();
78
+ });
78
79
  let ffmpegOutput = '';
79
80
  (_g = task.stderr) === null || _g === void 0 ? void 0 : _g.on('data', (data) => {
80
81
  const str = data.toString();
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.provideScreenshot = void 0;
4
4
  const screenshot_dom_element_1 = require("./screenshot-dom-element");
5
- const provideScreenshot = async ({ page, imageFormat, options, quality, }) => {
5
+ const provideScreenshot = ({ page, imageFormat, options, quality, }) => {
6
6
  return (0, screenshot_dom_element_1.screenshotDOMElement)({
7
7
  page,
8
8
  opts: {
@@ -1,7 +1,11 @@
1
1
  "use strict";
2
2
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
3
  if (k2 === undefined) k2 = k;
4
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
5
9
  }) : (function(o, m, k, k2) {
6
10
  if (k2 === undefined) k2 = k;
7
11
  o[k2] = m[k];
@@ -1,9 +1,10 @@
1
1
  /// <reference types="node" />
2
2
  import { Browser as PuppeteerBrowser } from 'puppeteer-core';
3
- import { BrowserExecutable, FrameRange, ImageFormat, SmallTCompMetadata } from 'remotion';
3
+ import { BrowserExecutable, FfmpegExecutable, FrameRange, ImageFormat, SmallTCompMetadata } from 'remotion';
4
4
  import { RenderMediaOnDownload } from './assets/download-and-map-assets-to-file';
5
5
  import { BrowserLog } from './browser-log';
6
6
  import { ServeUrlOrWebpackBundle } from './legacy-webpack-config';
7
+ import { CancelSignal } from './make-cancel-signal';
7
8
  import { ChromiumOptions } from './open-browser';
8
9
  import { OnStartData, RenderFramesOutput } from './types';
9
10
  declare type ConfigOrComposition = {
@@ -33,6 +34,10 @@ declare type RenderFramesOptions = {
33
34
  timeoutInMilliseconds?: number;
34
35
  chromiumOptions?: ChromiumOptions;
35
36
  scale?: number;
37
+ ffmpegExecutable?: FfmpegExecutable;
38
+ ffprobeExecutable?: FfmpegExecutable;
39
+ port?: number | null;
40
+ cancelSignal?: CancelSignal;
36
41
  } & ConfigOrComposition & ServeUrlOrWebpackBundle;
37
42
  export declare const renderFrames: (options: RenderFramesOptions) => Promise<RenderFramesOutput>;
38
43
  export {};
@@ -33,9 +33,14 @@ const getComposition = (others) => {
33
33
  }
34
34
  return undefined;
35
35
  };
36
- const innerRenderFrames = async ({ onFrameUpdate, outputDir, onStart, inputProps, quality, imageFormat = image_format_1.DEFAULT_IMAGE_FORMAT, frameRange, puppeteerInstance, onError, envVariables, onBrowserLog, onFrameBuffer, onDownload, pagesArray, serveUrl, composition, timeoutInMilliseconds, scale, actualParallelism, }) => {
36
+ const getPool = async (pages) => {
37
+ const puppeteerPages = await Promise.all(pages);
38
+ const pool = new pool_1.Pool(puppeteerPages);
39
+ return pool;
40
+ };
41
+ const innerRenderFrames = ({ onFrameUpdate, outputDir, onStart, inputProps, quality, imageFormat = image_format_1.DEFAULT_IMAGE_FORMAT, frameRange, puppeteerInstance, onError, envVariables, onBrowserLog, onFrameBuffer, onDownload, pagesArray, serveUrl, composition, timeoutInMilliseconds, scale, actualParallelism, downloadDir, proxyPort, cancelSignal, }) => {
37
42
  if (!puppeteerInstance) {
38
- throw new Error('weird');
43
+ throw new Error('no puppeteer instance passed to innerRenderFrames - internal error');
39
44
  }
40
45
  if (outputDir) {
41
46
  if (!fs_1.default.existsSync(outputDir)) {
@@ -49,7 +54,7 @@ const innerRenderFrames = async ({ onFrameUpdate, outputDir, onStart, inputProps
49
54
  const pages = new Array(actualParallelism).fill(true).map(async () => {
50
55
  const page = await puppeteerInstance.newPage();
51
56
  pagesArray.push(page);
52
- page.setViewport({
57
+ await page.setViewport({
53
58
  width: composition.width,
54
59
  height: composition.height,
55
60
  deviceScaleFactor: scale !== null && scale !== void 0 ? scale : 1,
@@ -76,6 +81,8 @@ const innerRenderFrames = async ({ onFrameUpdate, outputDir, onStart, inputProps
76
81
  serveUrl,
77
82
  initialFrame,
78
83
  timeoutInMilliseconds,
84
+ proxyPort,
85
+ retriesRemaining: 2,
79
86
  });
80
87
  await (0, puppeteer_evaluate_1.puppeteerEvaluateWithCatch)({
81
88
  pageFunction: (id) => {
@@ -91,24 +98,30 @@ const innerRenderFrames = async ({ onFrameUpdate, outputDir, onStart, inputProps
91
98
  page.off('console', logCallback);
92
99
  return page;
93
100
  });
94
- const puppeteerPages = await Promise.all(pages);
95
- const pool = new pool_1.Pool(puppeteerPages);
96
101
  const [firstFrameIndex, lastFrameIndex] = realFrameRange;
97
102
  // Substract one because 100 frames will be 00-99
98
103
  // --> 2 digits
99
104
  const filePadLength = String(lastFrameIndex).length;
100
105
  let framesRendered = 0;
106
+ const poolPromise = getPool(pages);
101
107
  onStart({
102
108
  frameCount,
103
109
  });
104
- const downloadDir = (0, make_assets_download_dir_1.makeAssetsDownloadTmpDir)();
105
110
  const assets = new Array(frameCount).fill(undefined);
106
- await Promise.all(new Array(frameCount)
111
+ let stopped = false;
112
+ cancelSignal === null || cancelSignal === void 0 ? void 0 : cancelSignal(() => {
113
+ stopped = true;
114
+ });
115
+ const progress = Promise.all(new Array(frameCount)
107
116
  .fill(Boolean)
108
- .map((x, i) => i)
117
+ .map((_x, i) => i)
109
118
  .map(async (index) => {
110
119
  const frame = realFrameRange[0] + index;
120
+ const pool = await poolPromise;
111
121
  const freePage = await pool.acquire();
122
+ if (stopped) {
123
+ throw new Error('Render was stopped');
124
+ }
112
125
  const paddedIndex = String(frame).padStart(filePadLength, '0');
113
126
  const errorCallbackOnFrame = (err) => {
114
127
  onError(err);
@@ -122,6 +135,7 @@ const innerRenderFrames = async ({ onFrameUpdate, outputDir, onStart, inputProps
122
135
  await (0, seek_to_frame_1.seekToFrame)({ frame, page: freePage });
123
136
  if (imageFormat !== 'none') {
124
137
  if (onFrameBuffer) {
138
+ const id = remotion_1.Internals.perf.startPerfMeasure('save');
125
139
  const buffer = await (0, provide_screenshot_1.provideScreenshot)({
126
140
  page: freePage,
127
141
  imageFormat,
@@ -131,6 +145,7 @@ const innerRenderFrames = async ({ onFrameUpdate, outputDir, onStart, inputProps
131
145
  output: undefined,
132
146
  },
133
147
  });
148
+ remotion_1.Internals.perf.stopPerfMeasure(id);
134
149
  onFrameBuffer(buffer, frame);
135
150
  }
136
151
  else {
@@ -163,7 +178,7 @@ const innerRenderFrames = async ({ onFrameUpdate, outputDir, onStart, inputProps
163
178
  (0, download_and_map_assets_to_file_1.downloadAndMapAssetsToFileUrl)({
164
179
  asset,
165
180
  downloadDir,
166
- onDownload: onDownload !== null && onDownload !== void 0 ? onDownload : (() => () => undefined),
181
+ onDownload,
167
182
  }).catch((err) => {
168
183
  onError(new Error(`Error while downloading asset: ${err.stack}`));
169
184
  });
@@ -175,19 +190,29 @@ const innerRenderFrames = async ({ onFrameUpdate, outputDir, onStart, inputProps
175
190
  freePage.off('error', errorCallbackOnFrame);
176
191
  return compressedAssets;
177
192
  }));
178
- const returnValue = {
179
- assetsInfo: {
180
- assets,
181
- downloadDir,
182
- firstFrameIndex,
183
- imageSequenceName: `element-%0${filePadLength}d.${imageFormat}`,
184
- },
185
- frameCount,
186
- };
187
- return returnValue;
193
+ const happyPath = progress.then(() => {
194
+ const returnValue = {
195
+ assetsInfo: {
196
+ assets,
197
+ downloadDir,
198
+ firstFrameIndex,
199
+ imageSequenceName: `element-%0${filePadLength}d.${imageFormat}`,
200
+ },
201
+ frameCount,
202
+ };
203
+ return returnValue;
204
+ });
205
+ return Promise.race([
206
+ happyPath,
207
+ new Promise((_resolve, reject) => {
208
+ cancelSignal === null || cancelSignal === void 0 ? void 0 : cancelSignal(() => {
209
+ reject(new Error('renderFrames() got cancelled'));
210
+ });
211
+ }),
212
+ ]);
188
213
  };
189
- const renderFrames = async (options) => {
190
- var _a, _b, _c;
214
+ const renderFrames = (options) => {
215
+ var _a, _b, _c, _d;
191
216
  const composition = getComposition(options);
192
217
  if (!composition) {
193
218
  throw new Error('No `composition` option has been specified for renderFrames()');
@@ -202,25 +227,54 @@ const renderFrames = async (options) => {
202
227
  const selectedServeUrl = (0, legacy_webpack_config_1.getServeUrlWithFallback)(options);
203
228
  remotion_1.Internals.validateQuality(options.quality);
204
229
  (0, validate_scale_1.validateScale)(options.scale);
205
- const { closeServer, serveUrl } = await (0, prepare_server_1.prepareServer)(selectedServeUrl);
206
- const browserInstance = (_a = options.puppeteerInstance) !== null && _a !== void 0 ? _a : (await (0, open_browser_1.openBrowser)(remotion_1.Internals.DEFAULT_BROWSER, {
230
+ const browserInstance = (_a = options.puppeteerInstance) !== null && _a !== void 0 ? _a : (0, open_browser_1.openBrowser)(remotion_1.Internals.DEFAULT_BROWSER, {
207
231
  shouldDumpIo: options.dumpBrowserLogs,
208
232
  browserExecutable: options.browserExecutable,
209
233
  chromiumOptions: options.chromiumOptions,
210
234
  forceDeviceScaleFactor: (_b = options.scale) !== null && _b !== void 0 ? _b : 1,
211
- }));
212
- const actualParallelism = (0, get_concurrency_1.getActualConcurrency)((_c = options.parallelism) !== null && _c !== void 0 ? _c : null);
213
- const { stopCycling } = (0, cycle_browser_tabs_1.cycleBrowserTabs)(browserInstance, actualParallelism);
235
+ });
236
+ const downloadDir = (0, make_assets_download_dir_1.makeAssetsDownloadTmpDir)();
237
+ const onDownload = (_c = options.onDownload) !== null && _c !== void 0 ? _c : (() => () => undefined);
238
+ const actualParallelism = (0, get_concurrency_1.getActualConcurrency)((_d = options.parallelism) !== null && _d !== void 0 ? _d : null);
214
239
  const openedPages = [];
215
240
  return new Promise((resolve, reject) => {
216
- innerRenderFrames({
217
- ...options,
218
- puppeteerInstance: browserInstance,
219
- onError: (err) => reject(err),
220
- pagesArray: openedPages,
221
- serveUrl,
222
- composition,
223
- actualParallelism,
241
+ var _a, _b, _c;
242
+ const cleanup = [];
243
+ const onError = (err) => reject(err);
244
+ Promise.all([
245
+ (0, prepare_server_1.prepareServer)({
246
+ webpackConfigOrServeUrl: selectedServeUrl,
247
+ downloadDir,
248
+ onDownload,
249
+ onError,
250
+ ffmpegExecutable: (_a = options.ffmpegExecutable) !== null && _a !== void 0 ? _a : null,
251
+ ffprobeExecutable: (_b = options.ffprobeExecutable) !== null && _b !== void 0 ? _b : null,
252
+ port: (_c = options.port) !== null && _c !== void 0 ? _c : null,
253
+ }),
254
+ browserInstance,
255
+ ])
256
+ .then(([{ serveUrl, closeServer, offthreadPort }, puppeteerInstance]) => {
257
+ var _a;
258
+ const { stopCycling } = (0, cycle_browser_tabs_1.cycleBrowserTabs)(puppeteerInstance, actualParallelism);
259
+ cleanup.push(stopCycling);
260
+ (_a = options.cancelSignal) === null || _a === void 0 ? void 0 : _a.call(options, () => {
261
+ stopCycling();
262
+ closeServer();
263
+ });
264
+ cleanup.push(closeServer);
265
+ const renderFramesProm = innerRenderFrames({
266
+ ...options,
267
+ puppeteerInstance,
268
+ onError,
269
+ pagesArray: openedPages,
270
+ serveUrl,
271
+ composition,
272
+ actualParallelism,
273
+ onDownload,
274
+ downloadDir,
275
+ proxyPort: offthreadPort,
276
+ });
277
+ return renderFramesProm;
224
278
  })
225
279
  .then((res) => resolve(res))
226
280
  .catch((err) => reject(err))
@@ -234,12 +288,17 @@ const renderFrames = async (options) => {
234
288
  });
235
289
  }
236
290
  else {
237
- browserInstance.close().catch((err) => {
291
+ Promise.resolve(browserInstance)
292
+ .then((puppeteerInstance) => {
293
+ return puppeteerInstance.close();
294
+ })
295
+ .catch((err) => {
238
296
  console.log('Unable to close browser', err);
239
297
  });
240
298
  }
241
- stopCycling();
242
- closeServer();
299
+ cleanup.forEach((c) => {
300
+ c();
301
+ });
243
302
  });
244
303
  });
245
304
  };
@@ -1,8 +1,9 @@
1
1
  import type { Browser as PuppeteerBrowser } from 'puppeteer-core';
2
- import { Codec, FfmpegExecutable, FrameRange, PixelFormat, ProResProfile, SmallTCompMetadata } from 'remotion';
2
+ import { BrowserExecutable, Codec, FfmpegExecutable, FrameRange, PixelFormat, ProResProfile, SmallTCompMetadata } from 'remotion';
3
3
  import { RenderMediaOnDownload } from './assets/download-and-map-assets-to-file';
4
4
  import { BrowserLog } from './browser-log';
5
5
  import { ServeUrlOrWebpackBundle } from './legacy-webpack-config';
6
+ import { CancelSignal } from './make-cancel-signal';
6
7
  import { ChromiumOptions } from './open-browser';
7
8
  import { OnStartData } from './types';
8
9
  export declare type StitchingState = 'encoding' | 'muxing';
@@ -22,6 +23,7 @@ export declare type RenderMediaOptions = {
22
23
  crf?: number | null;
23
24
  imageFormat?: 'png' | 'jpeg' | 'none';
24
25
  ffmpegExecutable?: FfmpegExecutable;
26
+ ffprobeExecutable?: FfmpegExecutable;
25
27
  pixelFormat?: PixelFormat;
26
28
  envVariables?: Record<string, string>;
27
29
  quality?: number;
@@ -37,5 +39,13 @@ export declare type RenderMediaOptions = {
37
39
  timeoutInMilliseconds?: number;
38
40
  chromiumOptions?: ChromiumOptions;
39
41
  scale?: number;
42
+ port?: number | null;
43
+ cancelSignal?: CancelSignal;
44
+ browserExecutable?: BrowserExecutable;
40
45
  } & ServeUrlOrWebpackBundle;
41
- export declare const renderMedia: ({ parallelism, proResProfile, crf, composition, imageFormat, ffmpegExecutable, inputProps, pixelFormat, codec, envVariables, quality, frameRange, puppeteerInstance, outputLocation, onProgress, overwrite, onDownload, dumpBrowserLogs, onBrowserLog, onStart, timeoutInMilliseconds, chromiumOptions, scale, ...options }: RenderMediaOptions) => Promise<void>;
46
+ /**
47
+ *
48
+ * @description Render a video from a composition
49
+ * @link https://www.remotion.dev/docs/renderer/render-media
50
+ */
51
+ export declare const renderMedia: ({ parallelism, proResProfile, crf, composition, imageFormat, ffmpegExecutable, ffprobeExecutable, inputProps, pixelFormat, codec, envVariables, quality, frameRange, puppeteerInstance, outputLocation, onProgress, overwrite, onDownload, dumpBrowserLogs, onBrowserLog, onStart, timeoutInMilliseconds, chromiumOptions, scale, browserExecutable, port, cancelSignal, ...options }: RenderMediaOptions) => Promise<void>;