@remotion/renderer 4.0.169 → 4.0.171

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.
@@ -37,6 +37,9 @@ const gLibCErrorMessage = (libCString) => {
37
37
  };
38
38
  exports.gLibCErrorMessage = gLibCErrorMessage;
39
39
  const checkLibCRequirement = (logLevel, indent) => {
40
+ if (process.platform === 'win32' || process.platform === 'darwin') {
41
+ return;
42
+ }
40
43
  const { report } = process;
41
44
  if (report) {
42
45
  const rep = report.getReport();
package/dist/client.d.ts CHANGED
@@ -10,10 +10,10 @@ export declare const BrowserSafeApis: {
10
10
  x264PresetOptions: readonly ["ultrafast", "superfast", "veryfast", "faster", "fast", "medium", "slow", "slower", "veryslow", "placebo"];
11
11
  validPixelFormats: readonly ["yuv420p", "yuva420p", "yuv422p", "yuv444p", "yuv420p10le", "yuv422p10le", "yuv444p10le", "yuva444p10le"];
12
12
  validOpenGlRenderers: readonly ["swangle", "angle", "egl", "swiftshader", "vulkan", "angle-egl"];
13
- validPixelFormatsForCodec: (codec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "h264-ts" | "gif") => readonly ["yuv420p", "yuva420p", "yuv422p", "yuv444p", "yuv420p10le", "yuv422p10le", "yuv444p10le", "yuva444p10le"] | ("yuv420p" | "yuva420p" | "yuv422p" | "yuv444p" | "yuv420p10le" | "yuv422p10le" | "yuv444p10le" | "yuva444p10le")[];
13
+ validPixelFormatsForCodec: (codec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "h264-ts" | "gif") => readonly ["yuv420p", "yuva420p", "yuv422p", "yuv444p", "yuv420p10le", "yuv422p10le", "yuv444p10le", "yuva444p10le"] | ("yuv420p" | "yuv422p" | "yuv444p" | "yuva420p" | "yuv420p10le" | "yuv422p10le" | "yuv444p10le" | "yuva444p10le")[];
14
14
  validVideoImageFormats: readonly ["png", "jpeg", "none"];
15
15
  validStillImageFormats: readonly ["png", "jpeg", "pdf", "webp"];
16
- DEFAULT_PIXEL_FORMAT: "yuv420p" | "yuva420p" | "yuv422p" | "yuv444p" | "yuv420p10le" | "yuv422p10le" | "yuv444p10le" | "yuva444p10le";
16
+ DEFAULT_PIXEL_FORMAT: "yuv420p" | "yuv422p" | "yuv444p" | "yuva420p" | "yuv420p10le" | "yuv422p10le" | "yuv444p10le" | "yuva444p10le";
17
17
  DEFAULT_TIMEOUT: number;
18
18
  DEFAULT_JPEG_QUALITY: number;
19
19
  DEFAULT_COLOR_SPACE: "default";
@@ -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;
@@ -4,6 +4,9 @@ export declare const createFfmpegComplexFilter: ({ filters, downloadMap, }: {
4
4
  filters: PreprocessedAudioTrack[];
5
5
  downloadMap: DownloadMap;
6
6
  }) => Promise<{
7
- complexFilterFlag: [string, string] | null;
7
+ complexFilterFlag: [
8
+ string,
9
+ string
10
+ ] | null;
8
11
  cleanup: () => void;
9
12
  }>;
@@ -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;
@@ -12,7 +12,7 @@ const getRealFrameRange = (durationInFrames, frameRange) => {
12
12
  return [frameRange, frameRange];
13
13
  }
14
14
  if (frameRange[1] >= durationInFrames || frameRange[0] < 0) {
15
- throw new Error(`Frame range ${frameRange.join('-')} is not inbetween 0-${durationInFrames - 1}`);
15
+ throw new Error(`The "durationInFrames" of the <Composition /> was evaluated to be ${durationInFrames}, but frame range ${frameRange.join('-')} is not inbetween 0-${durationInFrames - 1}`);
16
16
  }
17
17
  return frameRange;
18
18
  };
package/dist/index.d.ts CHANGED
@@ -140,10 +140,10 @@ 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
- DEFAULT_PIXEL_FORMAT: "yuv420p" | "yuva420p" | "yuv422p" | "yuv444p" | "yuv420p10le" | "yuv422p10le" | "yuv444p10le" | "yuva444p10le";
146
+ DEFAULT_PIXEL_FORMAT: "yuv420p" | "yuv422p" | "yuv444p" | "yuva420p" | "yuv420p10le" | "yuv422p10le" | "yuv444p10le" | "yuva444p10le";
147
147
  validateJpegQuality: (q: unknown) => void;
148
148
  DEFAULT_TIMEOUT: number;
149
149
  DEFAULT_CODEC: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "h264-ts" | "gif";
@@ -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>;
@@ -784,7 +784,7 @@ export declare const RenderInternals: {
784
784
  assetsInfo: import("./assets/download-map").RenderAssetInfo | null;
785
785
  enforceAudioTrack: boolean;
786
786
  muted: boolean;
787
- }) => "yes" | "maybe" | "no";
787
+ }) => "no" | "yes" | "maybe";
788
788
  codecSupportsMedia: (codec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "h264-ts" | "gif") => {
789
789
  video: boolean;
790
790
  audio: boolean;
@@ -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;
@@ -2,5 +2,5 @@ import type { Codec } from './codec';
2
2
  export declare const validPixelFormats: readonly ["yuv420p", "yuva420p", "yuv422p", "yuv444p", "yuv420p10le", "yuv422p10le", "yuv444p10le", "yuva444p10le"];
3
3
  export type PixelFormat = (typeof validPixelFormats)[number];
4
4
  export declare const DEFAULT_PIXEL_FORMAT: PixelFormat;
5
- export declare const validPixelFormatsForCodec: (codec: Codec) => readonly ["yuv420p", "yuva420p", "yuv422p", "yuv444p", "yuv420p10le", "yuv422p10le", "yuv444p10le", "yuva444p10le"] | ("yuv420p" | "yuva420p" | "yuv422p" | "yuv444p" | "yuv420p10le" | "yuv422p10le" | "yuv444p10le" | "yuva444p10le")[];
5
+ export declare const validPixelFormatsForCodec: (codec: Codec) => readonly ["yuv420p", "yuva420p", "yuv422p", "yuv444p", "yuv420p10le", "yuv422p10le", "yuv444p10le", "yuva444p10le"] | ("yuv420p" | "yuv422p" | "yuv444p" | "yuva420p" | "yuv420p10le" | "yuv422p10le" | "yuv444p10le" | "yuva444p10le")[];
6
6
  export declare const validateSelectedPixelFormatAndCodecCombination: (pixelFormat: PixelFormat | undefined, codec: Codec) => undefined;
@@ -1,11 +1,11 @@
1
1
  /// <reference types="node" />
2
+ /// <reference types="node" />
2
3
  /// <reference types="bun-types" />
3
4
  /// <reference types="node" />
4
5
  /// <reference types="node" />
5
6
  /// <reference types="node" />
6
7
  /// <reference types="bun-types" />
7
8
  /// <reference types="bun-types" />
8
- /// <reference types="node" />
9
9
  import type { NetworkInterfaceInfo } from 'os';
10
10
  import os from 'os';
11
11
  type PortConfig = {
@@ -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;
@@ -483,6 +483,11 @@ const internalRenderFramesRaw = ({ browserExecutable, cancelSignal, chromiumOpti
483
483
  }),
484
484
  ])
485
485
  .then((res) => {
486
+ server === null || server === void 0 ? void 0 : server.compositor.executeCommand('CloseAllVideos', {}).then(() => {
487
+ logger_1.Log.verbose({ indent, logLevel }, 'Freed memory from compositor');
488
+ }).catch((err) => {
489
+ logger_1.Log.verbose({ indent, logLevel }, 'Could not close compositor', err);
490
+ });
486
491
  return resolve(res);
487
492
  })
488
493
  .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;
@@ -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.169",
3
+ "version": "4.0.171",
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.169"
21
+ "remotion": "4.0.171"
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.169"
44
+ "@remotion/streaming": "4.0.171"
45
45
  },
46
46
  "optionalDependencies": {
47
- "@remotion/compositor-darwin-x64": "4.0.169",
48
- "@remotion/compositor-linux-arm64-musl": "4.0.169",
49
- "@remotion/compositor-linux-arm64-gnu": "4.0.169",
50
- "@remotion/compositor-linux-x64-gnu": "4.0.169",
51
- "@remotion/compositor-linux-x64-musl": "4.0.169",
52
- "@remotion/compositor-win32-x64-msvc": "4.0.169",
53
- "@remotion/compositor-darwin-arm64": "4.0.169"
47
+ "@remotion/compositor-linux-arm64-gnu": "4.0.171",
48
+ "@remotion/compositor-darwin-arm64": "4.0.171",
49
+ "@remotion/compositor-darwin-x64": "4.0.171",
50
+ "@remotion/compositor-linux-arm64-musl": "4.0.171",
51
+ "@remotion/compositor-win32-x64-msvc": "4.0.171",
52
+ "@remotion/compositor-linux-x64-gnu": "4.0.171",
53
+ "@remotion/compositor-linux-x64-musl": "4.0.171"
54
54
  },
55
55
  "keywords": [
56
56
  "remotion",