@remotion/renderer 3.3.28 → 3.3.32

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.
@@ -1,9 +1,12 @@
1
- import type { CliInput } from './payloads';
1
+ import type { CompositorCommand, CompositorInitiatePayload } from './payloads';
2
2
  export declare type Compositor = {
3
3
  finishCommands: () => void;
4
- executeCommand: (payload: Omit<CliInput, 'nonce'>) => Promise<void>;
4
+ executeCommand: (payload: Omit<CompositorCommand, 'nonce'>) => Promise<void>;
5
5
  waitForDone: () => Promise<void>;
6
6
  };
7
- export declare const spawnCompositorOrReuse: (renderId: string) => Compositor;
7
+ export declare const spawnCompositorOrReuse: ({ initiatePayload, renderId, }: {
8
+ initiatePayload: CompositorInitiatePayload;
9
+ renderId: string;
10
+ }) => Compositor;
8
11
  export declare const releaseCompositorWithId: (renderId: string) => void;
9
12
  export declare const waitForCompositorWithIdToQuit: (renderId: string) => Promise<void>;
@@ -5,9 +5,9 @@ const child_process_1 = require("child_process");
5
5
  const truthy_1 = require("../truthy");
6
6
  const get_executable_path_1 = require("./get-executable-path");
7
7
  const compositorMap = {};
8
- const spawnCompositorOrReuse = (renderId) => {
8
+ const spawnCompositorOrReuse = ({ initiatePayload, renderId, }) => {
9
9
  if (!compositorMap[renderId]) {
10
- compositorMap[renderId] = startCompositor();
10
+ compositorMap[renderId] = startCompositor(initiatePayload);
11
11
  }
12
12
  return compositorMap[renderId];
13
13
  };
@@ -25,28 +25,31 @@ const waitForCompositorWithIdToQuit = (renderId) => {
25
25
  return compositorMap[renderId].waitForDone();
26
26
  };
27
27
  exports.waitForCompositorWithIdToQuit = waitForCompositorWithIdToQuit;
28
- const startCompositor = () => {
28
+ const startCompositor = (compositorInitiatePayload) => {
29
29
  const bin = (0, get_executable_path_1.getExecutablePath)();
30
- const child = (0, child_process_1.spawn)(bin);
31
- const _stderrChunks = [];
32
- const stdoutChunks = [];
30
+ const child = (0, child_process_1.spawn)(`${bin}`, [JSON.stringify(compositorInitiatePayload)]);
31
+ const stderrChunks = [];
32
+ let stdoutListeners = [];
33
+ let stderrListeners = [];
33
34
  child.stderr.on('data', (d) => {
34
- _stderrChunks.push(d);
35
+ stderrChunks.push(d);
36
+ const str = d.toString('utf-8');
37
+ stderrListeners.forEach((s) => s(str));
35
38
  });
36
39
  child.stdout.on('data', (d) => {
37
- stdoutChunks.push(d);
40
+ const str = d.toString('utf-8');
41
+ stdoutListeners.forEach((s) => s(str));
38
42
  });
39
43
  let nonce = 0;
40
44
  return {
41
45
  waitForDone: () => {
42
46
  return new Promise((resolve, reject) => {
43
47
  child.on('exit', (code) => {
44
- console.log({ code });
45
48
  if (code === 0) {
46
49
  resolve();
47
50
  }
48
51
  else {
49
- reject(Buffer.concat(_stderrChunks).toString('utf-8'));
52
+ reject(Buffer.concat(stderrChunks).toString('utf-8'));
50
53
  }
51
54
  });
52
55
  });
@@ -62,10 +65,7 @@ const startCompositor = () => {
62
65
  nonce++;
63
66
  return new Promise((resolve, reject) => {
64
67
  child.stdin.write(JSON.stringify(actualPayload) + '\n');
65
- const stderrChunks = [];
66
- const onStderr = (d) => {
67
- stderrChunks.push(d);
68
- const message = Buffer.concat(stderrChunks).toString('utf-8');
68
+ const onStderr = (message) => {
69
69
  let parsed = null;
70
70
  try {
71
71
  const content = JSON.parse(message);
@@ -81,12 +81,11 @@ const startCompositor = () => {
81
81
  const err = new Error(parsed.error);
82
82
  err.stack = parsed.error + '\n' + parsed.backtrace;
83
83
  reject(err);
84
- child.stderr.off('data', onStderr);
85
- child.stdout.off('data', onStdout);
84
+ stdoutListeners = stdoutListeners.filter((s) => s !== onStdout);
85
+ stderrListeners = stderrListeners.filter((s) => s !== onStderr);
86
86
  }
87
87
  };
88
- const onStdout = (d) => {
89
- const str = d.toString('utf-8');
88
+ const onStdout = (str) => {
90
89
  const lineSplit = str.split('\n');
91
90
  for (const line of lineSplit.filter(truthy_1.truthy)) {
92
91
  let parsed = null;
@@ -99,13 +98,13 @@ const startCompositor = () => {
99
98
  catch (e) { }
100
99
  if (parsed && parsed.nonce === actualPayload.nonce) {
101
100
  resolve();
102
- child.stderr.off('data', onStderr);
103
- child.stdout.off('data', onStdout);
101
+ stdoutListeners = stdoutListeners.filter((s) => s !== onStdout);
102
+ stderrListeners = stderrListeners.filter((s) => s !== onStderr);
104
103
  }
105
104
  }
106
105
  };
107
- child.stderr.on('data', onStderr);
108
- child.stdout.on('data', onStdout);
106
+ stdoutListeners.push(onStdout);
107
+ stderrListeners.push(onStderr);
109
108
  });
110
109
  },
111
110
  };
@@ -1,8 +1,5 @@
1
1
  import type { DownloadMap } from './assets/download-map';
2
2
  export declare const createFfmpegComplexFilter: (filters: number, downloadMap: DownloadMap) => Promise<{
3
- complexFilterFlag: [
4
- string,
5
- string
6
- ] | null;
3
+ complexFilterFlag: [string, string] | null;
7
4
  cleanup: () => void;
8
5
  }>;
@@ -1,4 +1 @@
1
- export declare const determineResizeParams: (needsResize: [
2
- number,
3
- number
4
- ] | null) => string[];
1
+ export declare const determineResizeParams: (needsResize: [number, number] | null) => string[];
@@ -1,2 +1,7 @@
1
+ import type { ComponentType } from 'react';
2
+ import type { TCompMetadata } from 'remotion';
1
3
  import type { GetCompositionsConfig } from './get-compositions';
2
- export declare const getCompositionsFromBundle: (bundle: string, options: GetCompositionsConfig) => import("remotion/src").TCompMetadata[];
4
+ export declare const getCompositionsFromBundle: (bundle: string, options: GetCompositionsConfig) => {
5
+ compositions: TCompMetadata[];
6
+ root: ComponentType;
7
+ };
@@ -48,8 +48,8 @@ const getCompositionsFromBundle = (bundle, options) => {
48
48
  throw new Error('Did not call getRoot() in the bundle. Delaying the calling of getRoot() is not supported in server-side-rendering.');
49
49
  }
50
50
  const Comp = theRoot;
51
- console.log({ Comp1: Comp });
52
51
  const comps = (0, remotion_1.getCompositionsFromMarkup)(Comp);
53
- return comps;
52
+ remotion_1.Internals.clearRoot();
53
+ return { compositions: comps, root: Comp };
54
54
  };
55
55
  exports.getCompositionsFromBundle = getCompositionsFromBundle;
@@ -0,0 +1,3 @@
1
+ import type { ComponentType } from 'react';
2
+ import type { TCompMetadata } from 'remotion';
3
+ export declare const getCompositionsFromMarkup: (Comp: ComponentType) => TCompMetadata[];
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getCompositionsFromMarkup = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const server_1 = require("react-dom/server");
6
+ const getCompositionsFromMarkup = (Comp) => {
7
+ process.env.REMOTION_SERVER_RENDERING = 'true';
8
+ const str = (0, server_1.renderToString)((0, jsx_runtime_1.jsx)(Comp, {}));
9
+ const matches = str.matchAll(/<div>(.*?)<\/div>/g);
10
+ const metadata = [];
11
+ for (const match of matches) {
12
+ const json = JSON.parse(match[1]);
13
+ metadata.push(json);
14
+ }
15
+ return metadata;
16
+ };
17
+ exports.getCompositionsFromMarkup = getCompositionsFromMarkup;
@@ -89,13 +89,20 @@ const getCompositions = async (serveUrlOrWebpackUrl, config) => {
89
89
  close = closeServer;
90
90
  return innerGetCompositions(serveUrl, page, config !== null && config !== void 0 ? config : {}, offthreadPort);
91
91
  })
92
- .then((comp) => resolve(comp))
92
+ .then((comp) => {
93
+ if (close) {
94
+ return Promise.all([comp, close(true)]);
95
+ }
96
+ return Promise.resolve([comp, null]);
97
+ })
98
+ .then(([comp]) => {
99
+ return resolve(comp);
100
+ })
93
101
  .catch((err) => {
94
102
  reject(err);
95
103
  })
96
104
  .finally(() => {
97
105
  cleanup();
98
- close === null || close === void 0 ? void 0 : close();
99
106
  cleanupPageError();
100
107
  // Clean download map if it was not passed in
101
108
  if (!(config === null || config === void 0 ? void 0 : config.downloadMap)) {
@@ -1 +1 @@
1
- export declare const getActualConcurrency: (userPreference: number | null) => number;
1
+ export declare const getActualConcurrency: (userPreference: number | string | null) => number;
@@ -9,9 +9,16 @@ const getActualConcurrency = (userPreference) => {
9
9
  if (userPreference === null) {
10
10
  return Math.round(Math.min(8, Math.max(1, os_1.default.cpus().length / 2)));
11
11
  }
12
- const rounded = Math.floor(userPreference);
13
12
  const max = os_1.default.cpus().length;
14
13
  const min = 1;
14
+ let rounded;
15
+ if (typeof userPreference === 'string') {
16
+ const percentage = parseInt(userPreference.slice(0, -1), 10);
17
+ rounded = Math.floor((percentage / 100) * max);
18
+ }
19
+ else {
20
+ rounded = Math.floor(userPreference);
21
+ }
15
22
  if (rounded > max) {
16
23
  throw new Error(`Maximum for --concurrency is ${max} (number of cores on this system)`);
17
24
  }
@@ -0,0 +1,2 @@
1
+ import type { CompositorLayer } from './compositor/payloads';
2
+ export declare const getNativeVideoSignals: (layers: CompositorLayer[]) => Record<string, Record<number, number>>;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getNativeVideoSignals = void 0;
4
+ const getNativeVideoSignals = (layers) => {
5
+ const videoSignals = layers
6
+ .filter((l) => {
7
+ return l.type === 'VideoFrame';
8
+ })
9
+ .map((l) => {
10
+ if (l.type !== 'VideoFrame') {
11
+ throw new Error('Expected VideoFrame');
12
+ }
13
+ return { frame: l.params.frame, src: l.params.src };
14
+ });
15
+ const map = {};
16
+ // Return a map for each video source and the number of times each frame is expected to be used
17
+ for (const { src, frame } of videoSignals) {
18
+ if (!map[src]) {
19
+ map[src] = {};
20
+ }
21
+ if (!map[src][frame]) {
22
+ map[src][frame] = 0;
23
+ }
24
+ map[src][frame]++;
25
+ }
26
+ return map;
27
+ };
28
+ exports.getNativeVideoSignals = getNativeVideoSignals;
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ /// <reference types="node" />
1
2
  import execa from 'execa';
2
3
  import { SymbolicateableError } from './error-handling/symbolicateable-error';
3
4
  import { mimeContentType, mimeLookup } from './mime-types';
@@ -8,7 +9,6 @@ export { Browser } from './browser';
8
9
  export { BrowserExecutable } from './browser-executable';
9
10
  export { BrowserLog } from './browser-log';
10
11
  export { Codec, CodecOrUndefined } from './codec';
11
- export { combineVideos } from './combine-videos';
12
12
  export { Crf } from './crf';
13
13
  export { ensureFfmpeg, EnsureFfmpegOptions, ensureFfprobe, } from './ensure-ffmpeg';
14
14
  export { ErrorWithStackFrame } from './error-handling/handle-javascript-exception';
@@ -40,7 +40,7 @@ export declare const RenderInternals: {
40
40
  feature: "enable-gpl" | "enable-libx265" | "enable-libvpx";
41
41
  remotionRoot: string;
42
42
  }) => Promise<boolean>;
43
- getActualConcurrency: (userPreference: number | null) => number;
43
+ getActualConcurrency: (userPreference: string | number | null) => number;
44
44
  validateFfmpeg: (customFfmpegBinary: string | null, remotionRoot: string, binary: "ffmpeg" | "ffprobe") => Promise<void>;
45
45
  serveStatic: (path: string | null, options: {
46
46
  port: number | null;
@@ -114,8 +114,8 @@ export declare const RenderInternals: {
114
114
  validPixelFormats: readonly ["yuv420p", "yuva420p", "yuv422p", "yuv444p", "yuv420p10le", "yuv422p10le", "yuv444p10le", "yuva444p10le"];
115
115
  DEFAULT_BROWSER: import("./browser").Browser;
116
116
  validateFrameRange: (frameRange: import("./frame-range").FrameRange | null) => void;
117
- DEFAULT_OPENGL_RENDERER: "angle" | "swangle" | "egl" | "swiftshader" | null;
118
- validateOpenGlRenderer: (option: "angle" | "swangle" | "egl" | "swiftshader" | null) => "angle" | "swangle" | "egl" | "swiftshader" | null;
117
+ DEFAULT_OPENGL_RENDERER: "swangle" | "angle" | "egl" | "swiftshader" | null;
118
+ validateOpenGlRenderer: (option: "swangle" | "angle" | "egl" | "swiftshader" | null) => "swangle" | "angle" | "egl" | "swiftshader" | null;
119
119
  validImageFormats: readonly ["png", "jpeg", "none"];
120
120
  validCodecs: readonly ["h264", "h265", "vp8", "vp9", "mp3", "aac", "wav", "prores", "h264-mkv", "gif"];
121
121
  DEFAULT_PIXEL_FORMAT: "yuv420p" | "yuva420p" | "yuv422p" | "yuv444p" | "yuv420p10le" | "yuv422p10le" | "yuv444p10le" | "yuva444p10le";
@@ -125,7 +125,7 @@ export declare const RenderInternals: {
125
125
  DEFAULT_CODEC: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif";
126
126
  isAudioCodec: (codec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif" | undefined) => boolean;
127
127
  logLevels: readonly ["verbose", "info", "warn", "error"];
128
- isEqualOrBelowLogLevel: (currentLevel: "error" | "verbose" | "info" | "warn", level: "error" | "verbose" | "info" | "warn") => boolean;
128
+ isEqualOrBelowLogLevel: (currentLevel: "verbose" | "error" | "info" | "warn", level: "verbose" | "error" | "info" | "warn") => boolean;
129
129
  isValidLogLevel: (level: string) => boolean;
130
130
  perf: typeof perf;
131
131
  makeDownloadMap: () => import("./assets/download-map").DownloadMap;
@@ -141,4 +141,16 @@ export declare const RenderInternals: {
141
141
  ffmpegExecutable: string | null;
142
142
  remotionRoot: string;
143
143
  }) => Promise<import("./ffmpeg-flags").FfmpegVersion>;
144
+ combineVideos: (options: {
145
+ files: string[];
146
+ filelistDir: string;
147
+ output: string;
148
+ onProgress: (p: number) => void;
149
+ numberOfFrames: number;
150
+ codec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif";
151
+ fps: number;
152
+ numberOfGifLoops: number | null;
153
+ remotionRoot: string;
154
+ ffmpegExecutable: import("./ffmpeg-executable").FfmpegExecutable;
155
+ }) => Promise<void>;
144
156
  };
package/dist/index.js CHANGED
@@ -26,7 +26,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
26
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
27
27
  };
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.RenderInternals = exports.validateOutputFilename = exports.stitchFramesToVideo = exports.renderStill = exports.renderMedia = exports.renderFrames = exports.openBrowser = exports.makeCancelSignal = exports.validImageFormats = exports.validateSelectedPixelFormatAndImageFormatCombination = exports.getCompositions = exports.getCanExtractFramesFast = exports.ErrorWithStackFrame = exports.ensureFfprobe = exports.ensureFfmpeg = exports.combineVideos = void 0;
29
+ exports.RenderInternals = exports.validateOutputFilename = exports.stitchFramesToVideo = exports.renderStill = exports.renderMedia = exports.renderFrames = exports.openBrowser = exports.makeCancelSignal = exports.validImageFormats = exports.validateSelectedPixelFormatAndImageFormatCombination = exports.getCompositions = exports.getCanExtractFramesFast = exports.ErrorWithStackFrame = exports.ensureFfprobe = exports.ensureFfmpeg = void 0;
30
30
  const execa_1 = __importDefault(require("execa"));
31
31
  const download_file_1 = require("./assets/download-file");
32
32
  const download_map_1 = require("./assets/download-map");
@@ -35,6 +35,7 @@ const TimeoutSettings_1 = require("./browser/TimeoutSettings");
35
35
  const can_use_parallel_encoding_1 = require("./can-use-parallel-encoding");
36
36
  const check_apple_silicon_1 = require("./check-apple-silicon");
37
37
  const codec_1 = require("./codec");
38
+ const combine_videos_1 = require("./combine-videos");
38
39
  const convert_to_positive_frame_index_1 = require("./convert-to-positive-frame-index");
39
40
  const delete_directory_1 = require("./delete-directory");
40
41
  const ensure_output_directory_1 = require("./ensure-output-directory");
@@ -71,8 +72,6 @@ const validate_opengl_renderer_1 = require("./validate-opengl-renderer");
71
72
  const validate_puppeteer_timeout_1 = require("./validate-puppeteer-timeout");
72
73
  const validate_videobitrate_1 = require("./validate-videobitrate");
73
74
  const wait_for_symbolication_error_to_be_done_1 = require("./wait-for-symbolication-error-to-be-done");
74
- var combine_videos_1 = require("./combine-videos");
75
- Object.defineProperty(exports, "combineVideos", { enumerable: true, get: function () { return combine_videos_1.combineVideos; } });
76
75
  var ensure_ffmpeg_1 = require("./ensure-ffmpeg");
77
76
  Object.defineProperty(exports, "ensureFfmpeg", { enumerable: true, get: function () { return ensure_ffmpeg_1.ensureFfmpeg; } });
78
77
  Object.defineProperty(exports, "ensureFfprobe", { enumerable: true, get: function () { return ensure_ffmpeg_1.ensureFfprobe; } });
@@ -153,6 +152,7 @@ exports.RenderInternals = {
153
152
  getExecutableBinary: ffmpeg_flags_1.getExecutableBinary,
154
153
  validateBitrate: validate_videobitrate_1.validateBitrate,
155
154
  getFfmpegVersion: ffmpeg_flags_1.getFfmpegVersion,
155
+ combineVideos: combine_videos_1.combineVideos,
156
156
  };
157
157
  // Warn of potential performance issues with Apple Silicon (M1 chip under Rosetta)
158
158
  (0, check_apple_silicon_1.checkNodeVersionAndWarnAboutRosetta)();
@@ -0,0 +1,2 @@
1
+ import type { CompositionManagerContext, TCompMetadata } from 'remotion';
2
+ export declare const makeCompManagerContext: (composition: TCompMetadata) => CompositionManagerContext;
@@ -0,0 +1,45 @@
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;
@@ -0,0 +1,2 @@
1
+ import type { SmallTCompMetadata, TimelineContextValue } from 'remotion';
2
+ export declare const makeTimelineContextValue: (composition: SmallTCompMetadata, frame: number) => TimelineContextValue;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeTimelineContextValue = void 0;
4
+ const makeTimelineContextValue = (composition, frame) => {
5
+ const value = {
6
+ audioAndVideoTags: { current: [] },
7
+ rootId: composition.id,
8
+ playing: false,
9
+ playbackRate: 1,
10
+ imperativePlaying: {
11
+ current: false,
12
+ },
13
+ frame,
14
+ setPlaybackRate: () => {
15
+ throw new Error('Not implemented');
16
+ },
17
+ };
18
+ return value;
19
+ };
20
+ exports.makeTimelineContextValue = makeTimelineContextValue;
@@ -12,6 +12,6 @@ export declare const prepareServer: ({ ffmpegExecutable, ffprobeExecutable, onDo
12
12
  remotionRoot: string;
13
13
  }) => Promise<{
14
14
  serveUrl: string;
15
- closeServer: () => Promise<unknown>;
15
+ closeServer: (force: boolean) => Promise<unknown>;
16
16
  offthreadPort: number;
17
17
  }>;
@@ -44,8 +44,11 @@ const prepareServer = async ({ ffmpegExecutable, ffprobeExecutable, onDownload,
44
44
  remotionRoot,
45
45
  });
46
46
  return Promise.resolve({
47
- closeServer: () => {
48
- return (0, wait_for_symbolication_error_to_be_done_1.waitForSymbolicationToBeDone)().then(() => close());
47
+ closeServer: async (force) => {
48
+ if (!force) {
49
+ await (0, wait_for_symbolication_error_to_be_done_1.waitForSymbolicationToBeDone)();
50
+ }
51
+ return close();
49
52
  },
50
53
  serveUrl: `http://localhost:${serverPort}`,
51
54
  offthreadPort: serverPort,
@@ -21,7 +21,7 @@ declare type ConfigOrComposition = {
21
21
  composition: SmallTCompMetadata;
22
22
  };
23
23
  declare type ConcurrencyOrParallelism = {
24
- concurrency?: number | null;
24
+ concurrency?: number | string | null;
25
25
  } | {
26
26
  /**
27
27
  * @deprecated This field has been renamed to `concurrency`
@@ -343,7 +343,7 @@ const renderFrames = (options) => {
343
343
  const browserReplacer = (0, replace_browser_1.handleBrowserCrash)(puppeteerInstance);
344
344
  const { stopCycling } = (0, cycle_browser_tabs_1.cycleBrowserTabs)(browserReplacer, actualConcurrency);
345
345
  cleanup.push(stopCycling);
346
- cleanup.push(closeServer);
346
+ cleanup.push(() => closeServer(false));
347
347
  return innerRenderFrames({
348
348
  ...options,
349
349
  puppeteerInstance,
@@ -71,7 +71,7 @@ export declare type RenderMediaOptions = {
71
71
  disallowParallelEncoding?: boolean;
72
72
  } & ServeUrlOrWebpackBundle & ConcurrencyOrParallelism;
73
73
  declare type ConcurrencyOrParallelism = {
74
- concurrency?: number | null;
74
+ concurrency?: number | string | null;
75
75
  } | {
76
76
  /**
77
77
  * @deprecated This field has been renamed to `concurrency`
@@ -13,51 +13,14 @@ const download_map_1 = require("./assets/download-map");
13
13
  const compose_1 = require("./compositor/compose");
14
14
  const compositor_1 = require("./compositor/compositor");
15
15
  const get_frame_padded_index_1 = require("./get-frame-padded-index");
16
+ const make_comp_manager_context_1 = require("./make-comp-manager-context");
16
17
  const pool_1 = require("./pool");
17
18
  const renderOnServer = async (Comp, composition) => {
18
19
  console.time('total');
19
20
  console.time('frames');
20
21
  process.env.REMOTION_SERVER_RENDERING = 'true';
21
- process.env.SELECT_COMP_ID = composition.id;
22
22
  // eslint-disable-next-line react/jsx-no-constructed-context-values
23
- const memo = {
24
- assets: [],
25
- compositions: [composition],
26
- currentComposition: composition.id,
27
- currentCompositionMetadata: composition,
28
- folders: [],
29
- registerAsset: () => {
30
- throw new Error('Not implemented');
31
- },
32
- registerComposition: () => {
33
- throw new Error('Not implemented');
34
- },
35
- registerFolder: () => {
36
- throw new Error('Not implemented');
37
- },
38
- setCurrentComposition: () => {
39
- throw new Error('Not implemented');
40
- },
41
- registerSequence() {
42
- throw new Error('Not implemented');
43
- },
44
- sequences: [],
45
- setCurrentCompositionMetadata: () => {
46
- throw new Error('Not implemented');
47
- },
48
- unregisterAsset: () => {
49
- throw new Error('Not implemented');
50
- },
51
- unregisterComposition: () => {
52
- throw new Error('Not implemented');
53
- },
54
- unregisterFolder: () => {
55
- throw new Error('Not implemented');
56
- },
57
- unregisterSequence: () => {
58
- throw new Error('Not implemented');
59
- },
60
- };
23
+ const memo = (0, make_comp_manager_context_1.makeCompManagerContext)(composition);
61
24
  const pool = new pool_1.Pool(new Array(4).fill(true).map((_, i) => i));
62
25
  const downloadMap = (0, download_map_1.makeDownloadMap)();
63
26
  const renderId = 'abc';
@@ -77,7 +40,7 @@ const renderOnServer = async (Comp, composition) => {
77
40
  throw new Error('Not implemented');
78
41
  },
79
42
  };
80
- const svg = (0, server_1.renderToStaticMarkup)((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, {}) }) }));
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, {}) }) }) }));
81
44
  const out = path_1.default.join(downloadMap.compositingDir, (0, get_frame_padded_index_1.getFrameOutputFileName)({
82
45
  frame: i,
83
46
  imageFormat: 'tiff',
@@ -105,6 +68,14 @@ const renderOnServer = async (Comp, composition) => {
105
68
  ],
106
69
  output: out,
107
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
+ },
108
79
  });
109
80
  pool.release(frame);
110
81
  }));
@@ -208,7 +208,7 @@ const renderStill = (options) => {
208
208
  if (!(options === null || options === void 0 ? void 0 : options.downloadMap)) {
209
209
  (0, download_map_1.cleanDownloadMap)(downloadMap);
210
210
  }
211
- return close === null || close === void 0 ? void 0 : close();
211
+ return close === null || close === void 0 ? void 0 : close(false);
212
212
  });
213
213
  });
214
214
  return Promise.race([
@@ -0,0 +1,8 @@
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;
@@ -0,0 +1,13 @@
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;
@@ -0,0 +1,9 @@
1
+ import type { ComponentType } from 'react';
2
+ import type { TCompMetadata } from 'remotion';
3
+ import type { NativeVideoLayerInfo } from 'remotion/src/video/NativeVideoForRendering';
4
+ export declare const renderVideoLayer: ({ composition, Comp, frame, layer, }: {
5
+ composition: TCompMetadata;
6
+ Comp: ComponentType;
7
+ frame: number;
8
+ layer: number;
9
+ }) => NativeVideoLayerInfo | null;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.renderVideoLayer = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const server_1 = require("react-dom/server");
6
+ const remotion_1 = require("remotion");
7
+ const make_comp_manager_context_1 = require("./make-comp-manager-context");
8
+ const make_timeline_context_value_1 = require("./make-timeline-context-value");
9
+ const renderVideoLayer = ({ composition, Comp, frame, layer, }) => {
10
+ process.env.REMOTION_SERVER_RENDERING = 'true';
11
+ const markup = (0, server_1.renderToStaticMarkup)((0, jsx_runtime_1.jsx)(remotion_1.Internals.SelectCompositionMode, { layer: layer, id: composition.id, children: (0, jsx_runtime_1.jsx)(remotion_1.Internals.Timeline.TimelineContext.Provider, { value: (0, make_timeline_context_value_1.makeTimelineContextValue)(composition, frame), children: (0, jsx_runtime_1.jsx)(remotion_1.Internals.CompositionManager.Provider, { value: (0, make_comp_manager_context_1.makeCompManagerContext)(composition), children: (0, jsx_runtime_1.jsx)(Comp, {}) }) }) }));
12
+ const matches = markup.matchAll(/<div>(.*?)<\/div>/g);
13
+ let parsed = null;
14
+ for (const match of matches) {
15
+ if (parsed) {
16
+ throw new Error('cannot have more than one video layer');
17
+ }
18
+ const json = JSON.parse(match[1]);
19
+ parsed = json;
20
+ }
21
+ return parsed;
22
+ };
23
+ exports.renderVideoLayer = renderVideoLayer;
@@ -1,15 +1,16 @@
1
- import type { SmallTCompMetadata, TAsset } from 'remotion/src';
2
- import type { RenderMediaOnDownload } from './assets/download-and-map-assets-to-file';
1
+ /// <reference types="node" />
2
+ import type { SmallTCompMetadata, TAsset } from 'remotion';
3
3
  import type { DownloadMap } from './assets/download-map';
4
4
  import type { BrowserExecutable } from './browser-executable';
5
5
  import type { BrowserLog } from './browser-log';
6
6
  import type { Page } from './browser/BrowserPage';
7
+ import type { CompositorLayer } from './compositor/payloads';
7
8
  import type { CountType } from './get-frame-padded-index';
8
9
  import type { ServeUrl } from './legacy-webpack-config';
9
10
  import type { ChromiumOptions } from './open-browser';
10
11
  import type { Pool } from './pool';
11
12
  import type { BrowserReplacer } from './replace-browser';
12
- export declare const renderWebFrameAndRetryTargetClose: ({ frame, index, retriesLeft, attempt, actualConcurrency, browserReplacer, poolPromise, composition, downloadMap, imageFormat, onFrameBuffer, onFrameUpdate, outputDir, stopState, assets, countType, scale, quality, framesToRender, lastFrame, framesRendered, browserExecutable, chromiumOptions, dumpBrowserLogs, pagesArray, onBrowserLog, inputProps, envVariables, muted, proxyPort, realFrameRange, serveUrl, timeoutInMilliseconds, onDownload, onError, }: {
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, }: {
13
14
  frame: number;
14
15
  index: number;
15
16
  retriesLeft: number;
@@ -21,12 +22,10 @@ export declare const renderWebFrameAndRetryTargetClose: ({ frame, index, retries
21
22
  downloadMap: DownloadMap;
22
23
  imageFormat: 'png' | 'jpeg' | 'none';
23
24
  onFrameBuffer: ((buffer: Buffer, frame: number) => void) | undefined;
24
- onFrameUpdate: (framesRendered: number, frameIndex: number, timeToRenderInMilliseconds: number) => void;
25
25
  outputDir: string | null;
26
26
  stopState: {
27
27
  isStopped: boolean;
28
28
  };
29
- assets: TAsset[][];
30
29
  countType: CountType;
31
30
  scale: number;
32
31
  quality: number | undefined;
@@ -47,9 +46,11 @@ export declare const renderWebFrameAndRetryTargetClose: ({ frame, index, retries
47
46
  realFrameRange: [number, number];
48
47
  serveUrl: ServeUrl;
49
48
  timeoutInMilliseconds: number;
50
- onDownload: RenderMediaOnDownload;
51
- onError: (err: Error) => void;
52
- }) => Promise<void>;
49
+ }) => Promise<{
50
+ layer: CompositorLayer | null;
51
+ buffer: Buffer | null;
52
+ assets: TAsset[];
53
+ }>;
53
54
  export declare const makePage: ({ browserReplacer, pagesArray, composition, scale, onBrowserLog, inputProps, envVariables, serveUrl, realFrameRange, timeoutInMilliseconds, proxyPort, imageFormat, muted, }: {
54
55
  browserReplacer: BrowserReplacer;
55
56
  pagesArray: Page[];
@@ -5,11 +5,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.makeBrowser = exports.makePage = exports.renderWebFrameAndRetryTargetClose = void 0;
7
7
  const path_1 = __importDefault(require("path"));
8
- const download_and_map_assets_to_file_1 = require("./assets/download-and-map-assets-to-file");
9
8
  const browser_1 = require("./browser");
10
- const compress_assets_1 = require("./compress-assets");
11
9
  const handle_javascript_exception_1 = require("./error-handling/handle-javascript-exception");
12
- const get_frame_padded_index_1 = require("./get-frame-padded-index");
13
10
  const make_cancel_signal_1 = require("./make-cancel-signal");
14
11
  const open_browser_1 = require("./open-browser");
15
12
  const perf_1 = require("./perf");
@@ -17,14 +14,13 @@ const puppeteer_evaluate_1 = require("./puppeteer-evaluate");
17
14
  const seek_to_frame_1 = require("./seek-to-frame");
18
15
  const set_props_and_env_1 = require("./set-props-and-env");
19
16
  const take_frame_and_compose_1 = require("./take-frame-and-compose");
20
- const truthy_1 = require("./truthy");
21
- const renderFrameWithOptionToReject = async ({ frame, index, reject, width, height, poolPromise, stopState, outputDir, onFrameBuffer, imageFormat, downloadMap, onFrameUpdate, scale, assets, countType, quality, framesToRender, lastFrame, framesRendered, onDownload, onError, }) => {
17
+ const renderFrameWithOptionToReject = async ({ frame, index, reject, width, height, poolPromise, stopState, imageFormat, downloadMap, scale, quality, }) => {
22
18
  const pool = await poolPromise;
23
19
  const freePage = await pool.acquire();
24
20
  if (stopState.isStopped) {
25
- return reject(new Error('Render was stopped'));
21
+ reject(new Error('Render was stopped'));
22
+ throw new Error('stopped');
26
23
  }
27
- const startTime = performance.now();
28
24
  const errorCallbackOnFrame = (err) => {
29
25
  reject(err);
30
26
  };
@@ -35,58 +31,45 @@ const renderFrameWithOptionToReject = async ({ frame, index, reject, width, heig
35
31
  });
36
32
  freePage.on('error', errorCallbackOnFrame);
37
33
  await (0, seek_to_frame_1.seekToFrame)({ frame, page: freePage });
38
- if (!outputDir && !onFrameBuffer && imageFormat !== 'none') {
39
- throw new Error('Called renderFrames() without specifying either `outputDir` or `onFrameBuffer`');
40
- }
41
- if (outputDir && onFrameBuffer && imageFormat !== 'none') {
42
- throw new Error('Pass either `outputDir` or `onFrameBuffer` to renderFrames(), not both.');
43
- }
44
34
  const id = (0, perf_1.startPerfMeasure)('save');
45
- const frameDir = outputDir !== null && outputDir !== void 0 ? outputDir : downloadMap.compositingDir;
46
- const { buffer, collectedAssets } = await (0, take_frame_and_compose_1.takeFrameAndCompose)({
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)({
47
37
  frame,
48
38
  freePage,
49
39
  height,
50
40
  imageFormat,
51
- output: path_1.default.join(frameDir, (0, get_frame_padded_index_1.getFrameOutputFileName)({
52
- frame,
53
- imageFormat,
54
- index,
55
- countType,
56
- lastFrame,
57
- totalFrames: framesToRender.length,
58
- })),
59
41
  quality,
60
42
  width,
61
- scale,
62
- downloadMap,
63
- wantsBuffer: Boolean(onFrameBuffer),
64
43
  });
65
- if (onFrameBuffer) {
66
- if (!buffer) {
67
- throw new Error('unexpected null buffer');
68
- }
69
- onFrameBuffer(buffer, frame);
70
- }
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
71
66
  (0, perf_1.stopPerfMeasure)(id);
72
- const compressedAssets = collectedAssets.map((asset) => (0, compress_assets_1.compressAsset)(assets.filter(truthy_1.truthy).flat(1), asset));
73
- assets[index] = compressedAssets;
74
- compressedAssets.forEach((asset) => {
75
- (0, download_and_map_assets_to_file_1.downloadAndMapAssetsToFileUrl)({
76
- asset,
77
- onDownload,
78
- downloadMap,
79
- }).catch((err) => {
80
- onError(new Error(`Error while downloading asset: ${err.stack}`));
81
- });
82
- });
83
- framesRendered.frames++;
84
- onFrameUpdate(framesRendered.frames, frame, performance.now() - startTime);
85
67
  cleanupPageError();
86
68
  freePage.off('error', errorCallbackOnFrame);
87
69
  pool.release(freePage);
70
+ return { layer: compositionLayer, buffer, assets: collectedAssets };
88
71
  };
89
- const renderWebFrame = ({ frame, index, downloadMap, imageFormat, onFrameBuffer, onFrameUpdate, outputDir, poolPromise, stopState, composition, assets, countType, scale, quality, lastFrame, framesToRender, framesRendered, onDownload, onError, }) => {
72
+ const renderWebFrame = ({ frame, index, downloadMap, imageFormat, poolPromise, stopState, composition, scale, quality, }) => {
90
73
  return new Promise((resolve, reject) => {
91
74
  renderFrameWithOptionToReject({
92
75
  frame,
@@ -96,53 +79,34 @@ const renderWebFrame = ({ frame, index, downloadMap, imageFormat, onFrameBuffer,
96
79
  height: composition.height,
97
80
  downloadMap,
98
81
  imageFormat,
99
- onFrameBuffer,
100
- onFrameUpdate,
101
- outputDir,
102
82
  poolPromise,
103
83
  stopState,
104
- assets,
105
- countType,
106
84
  scale,
107
85
  quality,
108
- framesToRender,
109
- lastFrame,
110
- framesRendered,
111
- onDownload,
112
- onError,
113
86
  })
114
- .then(() => {
115
- resolve();
87
+ .then((res) => {
88
+ resolve(res);
116
89
  })
117
90
  .catch((err) => {
118
91
  reject(err);
119
92
  });
120
93
  });
121
94
  };
122
- const renderWebFrameAndRetryTargetClose = async ({ frame, index, retriesLeft, attempt, actualConcurrency, browserReplacer, poolPromise, composition, downloadMap, imageFormat, onFrameBuffer, onFrameUpdate, outputDir, stopState, assets, countType, scale, quality, framesToRender, lastFrame, framesRendered, browserExecutable, chromiumOptions, dumpBrowserLogs, pagesArray, onBrowserLog, inputProps, envVariables, muted, proxyPort, realFrameRange, serveUrl, timeoutInMilliseconds, onDownload, onError, }) => {
95
+ const renderWebFrameAndRetryTargetClose = async ({ frame, index, retriesLeft, attempt, actualConcurrency, browserReplacer, poolPromise, composition, downloadMap, imageFormat, onFrameBuffer, outputDir, stopState, countType, scale, quality, framesToRender, lastFrame, framesRendered, browserExecutable, chromiumOptions, dumpBrowserLogs, pagesArray, onBrowserLog, inputProps, envVariables, muted, proxyPort, realFrameRange, serveUrl, timeoutInMilliseconds, }) => {
123
96
  var _a, _b;
124
97
  try {
125
- await renderWebFrame({
98
+ const returnval = await renderWebFrame({
126
99
  frame,
127
100
  index,
128
101
  poolPromise,
129
102
  composition,
130
103
  downloadMap,
131
104
  imageFormat,
132
- onFrameBuffer,
133
- onFrameUpdate,
134
- outputDir,
135
105
  stopState,
136
- assets,
137
- countType,
138
106
  scale,
139
107
  quality,
140
- framesToRender,
141
- lastFrame,
142
- framesRendered,
143
- onDownload,
144
- onError,
145
108
  });
109
+ return returnval;
146
110
  }
147
111
  catch (err) {
148
112
  if (!((_a = err === null || err === void 0 ? void 0 : err.message) === null || _a === void 0 ? void 0 : _a.includes('Target closed')) &&
@@ -187,7 +151,7 @@ const renderWebFrameAndRetryTargetClose = async ({ frame, index, retriesLeft, at
187
151
  pool.release(newPage);
188
152
  }
189
153
  });
190
- await (0, exports.renderWebFrameAndRetryTargetClose)({
154
+ const fram = await (0, exports.renderWebFrameAndRetryTargetClose)({
191
155
  frame,
192
156
  index,
193
157
  retriesLeft: retriesLeft - 1,
@@ -198,11 +162,9 @@ const renderWebFrameAndRetryTargetClose = async ({ frame, index, retriesLeft, at
198
162
  downloadMap,
199
163
  imageFormat,
200
164
  onFrameBuffer,
201
- onFrameUpdate,
202
165
  outputDir,
203
166
  poolPromise,
204
167
  stopState,
205
- assets,
206
168
  countType,
207
169
  scale,
208
170
  quality,
@@ -221,9 +183,8 @@ const renderWebFrameAndRetryTargetClose = async ({ frame, index, retriesLeft, at
221
183
  realFrameRange,
222
184
  serveUrl,
223
185
  timeoutInMilliseconds,
224
- onDownload,
225
- onError,
226
186
  });
187
+ return fram;
227
188
  }
228
189
  };
229
190
  exports.renderWebFrameAndRetryTargetClose = renderWebFrameAndRetryTargetClose;
@@ -8,17 +8,22 @@ const validateConcurrency = (value, setting) => {
8
8
  if (value === null) {
9
9
  return;
10
10
  }
11
- if (typeof value !== 'number') {
12
- throw new Error(setting + ' must be a number but is ' + value);
11
+ if (typeof value !== 'number' && typeof value !== 'string') {
12
+ throw new Error(setting + ' must a number or a string but is ' + value);
13
13
  }
14
- if (value % 1 !== 0) {
15
- throw new Error(setting + ' must be an integer, but is ' + value);
14
+ if (typeof value === 'number') {
15
+ if (value % 1 !== 0) {
16
+ throw new Error(setting + ' must be an integer, but is ' + value);
17
+ }
18
+ if (value < 1) {
19
+ throw new Error(setting + ' must be at least 1, but is ' + value);
20
+ }
21
+ if (value > require('os').cpus().length) {
22
+ throw new Error(`${setting} is set higher than the amount of CPU cores available. Available CPU cores: ${require('os').cpus().length}, value set: ${value}`);
23
+ }
16
24
  }
17
- if (value < 1) {
18
- throw new Error(setting + ' must be at least 1, but is ' + value);
19
- }
20
- if (value > require('os').cpus().length) {
21
- throw new Error(`${setting} is set higher than the amount of CPU cores available. Available CPU cores: ${require('os').cpus().length}, value set: ${value}`);
25
+ else if (!/^\d+(\.\d+)?%$/.test(value)) {
26
+ throw new Error(`${setting} must be a number or percentage, but is ${JSON.stringify(value)}`);
22
27
  }
23
28
  };
24
29
  exports.validateConcurrency = validateConcurrency;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remotion/renderer",
3
- "version": "3.3.28",
3
+ "version": "3.3.32",
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.28",
27
+ "remotion": "3.3.32",
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.28",
53
- "@remotion/compositor-darwin-x64": "3.3.28",
54
- "@remotion/compositor-linux-arm64-gnu": "3.3.28",
55
- "@remotion/compositor-linux-arm64-musl": "3.3.28",
56
- "@remotion/compositor-linux-x64-gnu": "3.3.28",
57
- "@remotion/compositor-linux-x64-musl": "3.3.28",
58
- "@remotion/compositor-win32-x64-msvc": "3.3.28"
52
+ "@remotion/compositor-darwin-arm64": "3.3.32",
53
+ "@remotion/compositor-darwin-x64": "3.3.32",
54
+ "@remotion/compositor-linux-arm64-gnu": "3.3.32",
55
+ "@remotion/compositor-linux-arm64-musl": "3.3.32",
56
+ "@remotion/compositor-linux-x64-gnu": "3.3.32",
57
+ "@remotion/compositor-linux-x64-musl": "3.3.32",
58
+ "@remotion/compositor-win32-x64-msvc": "3.3.32"
59
59
  },
60
60
  "keywords": [
61
61
  "remotion",
@@ -67,5 +67,5 @@
67
67
  "publishConfig": {
68
68
  "access": "public"
69
69
  },
70
- "gitHead": "0caa0bec583b5e4c2b12b7375c365e02c2378eeb"
70
+ "gitHead": "6b4f3514c801ddf2e7f957dd2e633271fbbc75f6"
71
71
  }