@remotion/renderer 4.0.170 → 4.0.172

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/client.d.ts CHANGED
@@ -467,19 +467,19 @@ export declare const BrowserSafeApis: {
467
467
  cliFlag: "gl";
468
468
  docLink: string;
469
469
  name: string;
470
- type: "angle" | "swangle" | "egl" | "swiftshader" | "vulkan" | "angle-egl" | null;
470
+ type: "swangle" | "angle" | "egl" | "swiftshader" | "vulkan" | "angle-egl" | null;
471
471
  ssrName: string;
472
472
  description: () => import("react/jsx-runtime").JSX.Element;
473
473
  getValue: ({ commandLine }: {
474
474
  commandLine: Record<string, unknown>;
475
475
  }) => {
476
- value: "angle" | "swangle" | "egl" | "swiftshader" | "vulkan" | "angle-egl";
476
+ value: "swangle" | "angle" | "egl" | "swiftshader" | "vulkan" | "angle-egl";
477
477
  source: string;
478
478
  } | {
479
479
  value: null;
480
480
  source: string;
481
481
  };
482
- setConfig: (value: "angle" | "swangle" | "egl" | "swiftshader" | "vulkan" | "angle-egl" | null) => void;
482
+ setConfig: (value: "swangle" | "angle" | "egl" | "swiftshader" | "vulkan" | "angle-egl" | null) => void;
483
483
  };
484
484
  enableLambdaInsights: {
485
485
  name: string;
@@ -1,2 +1,3 @@
1
1
  import type { LogLevel } from './log-level';
2
+ export declare const maxLambdaMemory: () => number;
2
3
  export declare const getAvailableMemory: (logLevel: LogLevel) => number;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getAvailableMemory = void 0;
3
+ exports.getAvailableMemory = exports.maxLambdaMemory = void 0;
4
4
  const node_fs_1 = require("node:fs");
5
5
  const node_os_1 = require("node:os");
6
6
  const logger_1 = require("./logger");
@@ -32,16 +32,27 @@ const getFreeMemoryFromProcMeminfo = () => {
32
32
  throw new Error(`Unknown unit: ${unit}`);
33
33
  }
34
34
  };
35
+ const maxLambdaMemory = () => {
36
+ if (process.env.AWS_LAMBDA_FUNCTION_MEMORY_SIZE) {
37
+ return (parseInt(process.env.AWS_LAMBDA_FUNCTION_MEMORY_SIZE, 10) * 1024 * 1024);
38
+ }
39
+ return Infinity;
40
+ };
41
+ exports.maxLambdaMemory = maxLambdaMemory;
35
42
  const getAvailableMemory = (logLevel) => {
43
+ const maxMemory = (0, exports.maxLambdaMemory)();
36
44
  if ((0, node_fs_1.existsSync)('/proc/meminfo')) {
37
45
  try {
38
- getFreeMemoryFromProcMeminfo();
46
+ const val = getFreeMemoryFromProcMeminfo();
47
+ if (val !== null) {
48
+ return Math.min(val, maxMemory);
49
+ }
39
50
  }
40
51
  catch (err) {
41
52
  logger_1.Log.warn({ indent: false, logLevel }, 'Tried to get available memory from /proc/meminfo but failed. Falling back to os.freemem(). Error:');
42
53
  logger_1.Log.warn({ indent: false, logLevel }, err);
43
54
  }
44
55
  }
45
- return (0, node_os_1.freemem)();
56
+ return Math.min((0, node_os_1.freemem)(), maxMemory);
46
57
  };
47
58
  exports.getAvailableMemory = getAvailableMemory;
@@ -37,6 +37,7 @@ const innerGetCompositions = async ({ envVariables, serializedInputPropsWithCust
37
37
  videoEnabled: false,
38
38
  indent,
39
39
  logLevel,
40
+ onServeUrlVisited: () => undefined,
40
41
  });
41
42
  await (0, puppeteer_evaluate_1.puppeteerEvaluateWithCatch)({
42
43
  page,
package/dist/index.d.ts CHANGED
@@ -140,8 +140,8 @@ export declare const RenderInternals: {
140
140
  validPixelFormats: readonly ["yuv420p", "yuva420p", "yuv422p", "yuv444p", "yuv420p10le", "yuv422p10le", "yuv444p10le", "yuva444p10le"];
141
141
  DEFAULT_BROWSER: "chrome";
142
142
  validateFrameRange: (frameRange: import("./frame-range").FrameRange | null) => void;
143
- DEFAULT_OPENGL_RENDERER: "angle" | "swangle" | "egl" | "swiftshader" | "vulkan" | "angle-egl" | null;
144
- validateOpenGlRenderer: (option: unknown) => "angle" | "swangle" | "egl" | "swiftshader" | "vulkan" | "angle-egl" | null;
143
+ DEFAULT_OPENGL_RENDERER: "swangle" | "angle" | "egl" | "swiftshader" | "vulkan" | "angle-egl" | null;
144
+ validateOpenGlRenderer: (option: unknown) => "swangle" | "angle" | "egl" | "swiftshader" | "vulkan" | "angle-egl" | null;
145
145
  validCodecs: readonly ["h264", "h265", "vp8", "vp9", "mp3", "aac", "wav", "prores", "h264-mkv", "h264-ts", "gif"];
146
146
  DEFAULT_PIXEL_FORMAT: "yuv420p" | "yuva420p" | "yuv422p" | "yuv444p" | "yuv420p10le" | "yuv422p10le" | "yuv444p10le" | "yuva444p10le";
147
147
  validateJpegQuality: (q: unknown) => void;
@@ -337,7 +337,7 @@ export declare const RenderInternals: {
337
337
  makeFileExtensionMap: () => Record<string, ("h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "h264-ts" | "gif")[]>;
338
338
  defaultCodecsForFileExtension: Record<import("./file-extensions").FileExtension, "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "h264-ts" | "gif">;
339
339
  getExecutablePath: ({ indent, logLevel, type, binariesDirectory, }: {
340
- type: "ffmpeg" | "ffprobe" | "compositor";
340
+ type: "compositor" | "ffmpeg" | "ffprobe";
341
341
  indent: boolean;
342
342
  logLevel: "verbose" | "info" | "warn" | "error";
343
343
  binariesDirectory: string | null;
@@ -353,8 +353,8 @@ export declare const RenderInternals: {
353
353
  }) => execa.ExecaChildProcess<string>;
354
354
  validStillImageFormats: readonly ["png", "jpeg", "pdf", "webp"];
355
355
  validVideoImageFormats: readonly ["png", "jpeg", "none"];
356
- DEFAULT_STILL_IMAGE_FORMAT: "jpeg" | "png" | "webp" | "pdf";
357
- DEFAULT_VIDEO_IMAGE_FORMAT: "jpeg" | "png" | "none";
356
+ DEFAULT_STILL_IMAGE_FORMAT: "png" | "jpeg" | "pdf" | "webp";
357
+ DEFAULT_VIDEO_IMAGE_FORMAT: "png" | "jpeg" | "none";
358
358
  DEFAULT_JPEG_QUALITY: number;
359
359
  chalk: {
360
360
  enabled: () => boolean;
@@ -453,7 +453,7 @@ export declare const RenderInternals: {
453
453
  frame: number;
454
454
  serializedInputPropsWithCustomSchema: string;
455
455
  serializedResolvedPropsWithCustomSchema: string;
456
- imageFormat: "jpeg" | "png" | "webp" | "pdf";
456
+ imageFormat: "png" | "jpeg" | "pdf" | "webp";
457
457
  jpegQuality: number;
458
458
  puppeteerInstance: HeadlessBrowser | null;
459
459
  envVariables: Record<string, string>;
@@ -583,6 +583,7 @@ export declare const RenderInternals: {
583
583
  server: import("./prepare-server").RemotionServer | undefined;
584
584
  serveUrl: string;
585
585
  id: string;
586
+ onServeUrlVisited: () => void;
586
587
  } & import("./options/option").ToOptions<{
587
588
  readonly offthreadVideoCacheSizeInBytes: {
588
589
  name: string;
@@ -1,19 +1,19 @@
1
1
  export declare const validOpenGlRenderers: readonly ["swangle", "angle", "egl", "swiftshader", "vulkan", "angle-egl"];
2
2
  export type OpenGlRenderer = (typeof validOpenGlRenderers)[number];
3
3
  export declare const DEFAULT_OPENGL_RENDERER: OpenGlRenderer | null;
4
- export declare const getChromiumOpenGlRenderer: () => "angle" | "swangle" | "egl" | "swiftshader" | "vulkan" | "angle-egl" | null;
4
+ export declare const getChromiumOpenGlRenderer: () => "swangle" | "angle" | "egl" | "swiftshader" | "vulkan" | "angle-egl" | null;
5
5
  export declare const setChromiumOpenGlRenderer: (renderer: OpenGlRenderer) => void;
6
6
  export declare const glOption: {
7
7
  cliFlag: "gl";
8
8
  docLink: string;
9
9
  name: string;
10
- type: "angle" | "swangle" | "egl" | "swiftshader" | "vulkan" | "angle-egl" | null;
10
+ type: "swangle" | "angle" | "egl" | "swiftshader" | "vulkan" | "angle-egl" | null;
11
11
  ssrName: string;
12
12
  description: () => import("react/jsx-runtime").JSX.Element;
13
13
  getValue: ({ commandLine }: {
14
14
  commandLine: Record<string, unknown>;
15
15
  }) => {
16
- value: "angle" | "swangle" | "egl" | "swiftshader" | "vulkan" | "angle-egl";
16
+ value: "swangle" | "angle" | "egl" | "swiftshader" | "vulkan" | "angle-egl";
17
17
  source: string;
18
18
  } | {
19
19
  value: null;
@@ -245,19 +245,19 @@ export declare const allOptions: {
245
245
  cliFlag: "gl";
246
246
  docLink: string;
247
247
  name: string;
248
- type: "angle" | "swangle" | "egl" | "swiftshader" | "vulkan" | "angle-egl" | null;
248
+ type: "swangle" | "angle" | "egl" | "swiftshader" | "vulkan" | "angle-egl" | null;
249
249
  ssrName: string;
250
250
  description: () => import("react/jsx-runtime").JSX.Element;
251
251
  getValue: ({ commandLine }: {
252
252
  commandLine: Record<string, unknown>;
253
253
  }) => {
254
- value: "angle" | "swangle" | "egl" | "swiftshader" | "vulkan" | "angle-egl";
254
+ value: "swangle" | "angle" | "egl" | "swiftshader" | "vulkan" | "angle-egl";
255
255
  source: string;
256
256
  } | {
257
257
  value: null;
258
258
  source: string;
259
259
  };
260
- setConfig: (value: "angle" | "swangle" | "egl" | "swiftshader" | "vulkan" | "angle-egl" | null) => void;
260
+ setConfig: (value: "swangle" | "angle" | "egl" | "swiftshader" | "vulkan" | "angle-egl" | null) => void;
261
261
  };
262
262
  enableLambdaInsights: {
263
263
  name: string;
@@ -61,7 +61,7 @@ const preprocessAudioTrackUnlimited = async ({ outName, asset, fps, downloadMap,
61
61
  const utf8 = data.toString('utf8');
62
62
  const parsed = (0, parse_ffmpeg_progress_1.parseFfmpegProgress)(utf8, fps);
63
63
  if (parsed !== undefined) {
64
- onProgress(parsed / (chunkLengthInSeconds * fps));
64
+ onProgress((parsed - filter.actualTrimLeft * fps) / (chunkLengthInSeconds * fps));
65
65
  }
66
66
  });
67
67
  await task;
@@ -91,6 +91,7 @@ const innerRenderFrames = async ({ onFrameUpdate, outputDir, onStart, serialized
91
91
  videoEnabled: imageFormat !== 'none',
92
92
  indent,
93
93
  logLevel,
94
+ onServeUrlVisited: () => undefined,
94
95
  });
95
96
  await (0, puppeteer_evaluate_1.puppeteerEvaluateWithCatch)({
96
97
  // eslint-disable-next-line max-params
@@ -483,6 +484,11 @@ const internalRenderFramesRaw = ({ browserExecutable, cancelSignal, chromiumOpti
483
484
  }),
484
485
  ])
485
486
  .then((res) => {
487
+ server === null || server === void 0 ? void 0 : server.compositor.executeCommand('CloseAllVideos', {}).then(() => {
488
+ logger_1.Log.verbose({ indent, logLevel }, 'Freed memory from compositor');
489
+ }).catch((err) => {
490
+ logger_1.Log.verbose({ indent, logLevel }, 'Could not close compositor', err);
491
+ });
486
492
  return resolve(res);
487
493
  })
488
494
  .catch((err) => reject(err))
@@ -239,6 +239,7 @@ const internalRenderMediaRaw = ({ proResProfile, x264Preset, crf, composition, s
239
239
  throw new Error(preStitcher === null || preStitcher === void 0 ? void 0 : preStitcher.getLogs());
240
240
  }
241
241
  }
242
+ return { usesParallelEncoding: Boolean(stitcherFfmpeg) };
242
243
  };
243
244
  const mediaSupport = (0, codec_supports_media_1.codecSupportsMedia)(codec);
244
245
  const disableAudio = !mediaSupport.audio || muted;
@@ -149,6 +149,7 @@ const innerRenderStill = async ({ composition, imageFormat = image_format_1.DEFA
149
149
  videoEnabled: true,
150
150
  indent,
151
151
  logLevel,
152
+ onServeUrlVisited: () => undefined,
152
153
  });
153
154
  await (0, puppeteer_evaluate_1.puppeteerEvaluateWithCatch)({
154
155
  // eslint-disable-next-line max-params
@@ -19,6 +19,7 @@ type InternalSelectCompositionsConfig = {
19
19
  server: RemotionServer | undefined;
20
20
  serveUrl: string;
21
21
  id: string;
22
+ onServeUrlVisited: () => void;
22
23
  } & ToOptions<typeof optionsMap.selectComposition>;
23
24
  export type SelectCompositionOptions = RequiredInputPropsInV5 & {
24
25
  envVariables?: Record<string, string>;
@@ -14,7 +14,7 @@ const seek_to_frame_1 = require("./seek-to-frame");
14
14
  const set_props_and_env_1 = require("./set-props-and-env");
15
15
  const validate_puppeteer_timeout_1 = require("./validate-puppeteer-timeout");
16
16
  const wrap_with_error_handling_1 = require("./wrap-with-error-handling");
17
- const innerSelectComposition = async ({ page, onBrowserLog, serializedInputPropsWithCustomSchema, envVariables, serveUrl, timeoutInMilliseconds, port, id, indent, logLevel, }) => {
17
+ const innerSelectComposition = async ({ page, onBrowserLog, serializedInputPropsWithCustomSchema, envVariables, serveUrl, timeoutInMilliseconds, port, id, indent, logLevel, onServeUrlVisited, }) => {
18
18
  if (onBrowserLog) {
19
19
  page.on('console', (log) => {
20
20
  onBrowserLog({
@@ -38,6 +38,7 @@ const innerSelectComposition = async ({ page, onBrowserLog, serializedInputProps
38
38
  videoEnabled: false,
39
39
  indent,
40
40
  logLevel,
41
+ onServeUrlVisited,
41
42
  });
42
43
  await (0, puppeteer_evaluate_1.puppeteerEvaluateWithCatch)({
43
44
  page,
@@ -95,7 +96,7 @@ const innerSelectComposition = async ({ page, onBrowserLog, serializedInputProps
95
96
  };
96
97
  const internalSelectCompositionRaw = async (options) => {
97
98
  const cleanup = [];
98
- const { puppeteerInstance, browserExecutable, chromiumOptions, serveUrl: serveUrlOrWebpackUrl, logLevel, indent, port, envVariables, id, serializedInputPropsWithCustomSchema, onBrowserLog, server, timeoutInMilliseconds, offthreadVideoCacheSizeInBytes, binariesDirectory, onBrowserDownload, } = options;
99
+ const { puppeteerInstance, browserExecutable, chromiumOptions, serveUrl: serveUrlOrWebpackUrl, logLevel, indent, port, envVariables, id, serializedInputPropsWithCustomSchema, onBrowserLog, server, timeoutInMilliseconds, offthreadVideoCacheSizeInBytes, binariesDirectory, onBrowserDownload, onServeUrlVisited, } = options;
99
100
  const { page, cleanup: cleanupPage } = await (0, get_browser_instance_1.getPageAndCleanupFn)({
100
101
  passedInInstance: puppeteerInstance,
101
102
  browserExecutable,
@@ -148,6 +149,7 @@ const internalSelectCompositionRaw = async (options) => {
148
149
  offthreadVideoCacheSizeInBytes,
149
150
  binariesDirectory,
150
151
  onBrowserDownload,
152
+ onServeUrlVisited,
151
153
  });
152
154
  })
153
155
  .then((data) => {
@@ -202,6 +204,7 @@ const selectComposition = async (options) => {
202
204
  logLevel,
203
205
  api: 'selectComposition()',
204
206
  }),
207
+ onServeUrlVisited: () => undefined,
205
208
  });
206
209
  return data.metadata;
207
210
  };
@@ -13,6 +13,7 @@ type SetPropsAndEnv = {
13
13
  videoEnabled: boolean;
14
14
  indent: boolean;
15
15
  logLevel: LogLevel;
16
+ onServeUrlVisited: () => void;
16
17
  };
17
18
  export declare const setPropsAndEnv: (params: SetPropsAndEnv) => Promise<unknown>;
18
19
  export {};
@@ -8,7 +8,7 @@ const normalize_serve_url_1 = require("./normalize-serve-url");
8
8
  const puppeteer_evaluate_1 = require("./puppeteer-evaluate");
9
9
  const redirect_status_codes_1 = require("./redirect-status-codes");
10
10
  const validate_puppeteer_timeout_1 = require("./validate-puppeteer-timeout");
11
- const innerSetPropsAndEnv = async ({ serializedInputPropsWithCustomSchema, envVariables, page, serveUrl, initialFrame, timeoutInMilliseconds, proxyPort, retriesRemaining, audioEnabled, videoEnabled, indent, logLevel, }) => {
11
+ const innerSetPropsAndEnv = async ({ serializedInputPropsWithCustomSchema, envVariables, page, serveUrl, initialFrame, timeoutInMilliseconds, proxyPort, retriesRemaining, audioEnabled, videoEnabled, indent, logLevel, onServeUrlVisited, }) => {
12
12
  (0, validate_puppeteer_timeout_1.validatePuppeteerTimeout)(timeoutInMilliseconds);
13
13
  const actualTimeout = timeoutInMilliseconds !== null && timeoutInMilliseconds !== void 0 ? timeoutInMilliseconds : TimeoutSettings_1.DEFAULT_TIMEOUT;
14
14
  page.setDefaultTimeout(actualTimeout);
@@ -92,6 +92,7 @@ const innerSetPropsAndEnv = async ({ serializedInputPropsWithCustomSchema, envVa
92
92
  videoEnabled,
93
93
  indent,
94
94
  logLevel,
95
+ onServeUrlVisited,
95
96
  });
96
97
  };
97
98
  // S3 in rare occasions returns a 500 or 503 error code for GET operations.
@@ -102,6 +103,7 @@ const innerSetPropsAndEnv = async ({ serializedInputPropsWithCustomSchema, envVa
102
103
  if (!redirect_status_codes_1.redirectStatusCodes.every((code) => code !== status)) {
103
104
  throw new Error(`Error while getting compositions: Tried to go to ${urlToVisit} but the status code was ${status} instead of 200. Does the site you specified exist?`);
104
105
  }
106
+ onServeUrlVisited();
105
107
  const { value: isRemotionFn } = await (0, puppeteer_evaluate_1.puppeteerEvaluateWithCatch)({
106
108
  pageFunction: () => {
107
109
  return window.getStaticCompositions;
@@ -2,6 +2,7 @@ import type { AssetVolume, MediaAsset } from './assets/types';
2
2
  import type { LogLevel } from './log-level';
3
3
  export type FilterWithoutPaddingApplied = ProcessedTrack & {
4
4
  filter: string;
5
+ actualTrimLeft: number;
5
6
  };
6
7
  export type ProcessedTrack = {
7
8
  pad_start: string | null;
@@ -167,6 +167,7 @@ const stringifyFfmpegFilter = ({ channels, volume, fps, assetDuration, chunkLeng
167
167
  : `adelay=${new Array(channels + 1)
168
168
  .fill((startInVideoSeconds * 1000).toFixed(0))
169
169
  .join('|')}`,
170
+ actualTrimLeft,
170
171
  };
171
172
  };
172
173
  exports.stringifyFfmpegFilter = stringifyFfmpegFilter;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remotion/renderer",
3
- "version": "4.0.170",
3
+ "version": "4.0.172",
4
4
  "description": "Renderer for Remotion",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -18,7 +18,7 @@
18
18
  "extract-zip": "2.0.1",
19
19
  "source-map": "^0.8.0-beta.0",
20
20
  "ws": "8.7.0",
21
- "remotion": "4.0.170"
21
+ "remotion": "4.0.172"
22
22
  },
23
23
  "peerDependencies": {
24
24
  "react": ">=16.8.0",
@@ -41,16 +41,16 @@
41
41
  "react-dom": "18.3.1",
42
42
  "vitest": "0.31.1",
43
43
  "@types/ws": "8.5.10",
44
- "@remotion/streaming": "4.0.170"
44
+ "@remotion/streaming": "4.0.172"
45
45
  },
46
46
  "optionalDependencies": {
47
- "@remotion/compositor-darwin-arm64": "4.0.170",
48
- "@remotion/compositor-linux-arm64-gnu": "4.0.170",
49
- "@remotion/compositor-darwin-x64": "4.0.170",
50
- "@remotion/compositor-linux-x64-gnu": "4.0.170",
51
- "@remotion/compositor-linux-arm64-musl": "4.0.170",
52
- "@remotion/compositor-linux-x64-musl": "4.0.170",
53
- "@remotion/compositor-win32-x64-msvc": "4.0.170"
47
+ "@remotion/compositor-linux-arm64-gnu": "4.0.172",
48
+ "@remotion/compositor-darwin-arm64": "4.0.172",
49
+ "@remotion/compositor-linux-arm64-musl": "4.0.172",
50
+ "@remotion/compositor-darwin-x64": "4.0.172",
51
+ "@remotion/compositor-linux-x64-gnu": "4.0.172",
52
+ "@remotion/compositor-linux-x64-musl": "4.0.172",
53
+ "@remotion/compositor-win32-x64-msvc": "4.0.172"
54
54
  },
55
55
  "keywords": [
56
56
  "remotion",