@remotion/cli 4.0.40 → 4.0.42

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 (37) hide show
  1. package/dist/config/chromium-flags.d.ts +3 -1
  2. package/dist/config/chromium-flags.js +8 -1
  3. package/dist/config/image-format.d.ts +1 -1
  4. package/dist/config/index.d.ts +12 -4
  5. package/dist/config/index.js +2 -0
  6. package/dist/editor/components/Modals.js +1 -1
  7. package/dist/editor/components/NewComposition/RemInput.d.ts +1 -1
  8. package/dist/editor/components/NewComposition/RemInputTypeColor.d.ts +1 -1
  9. package/dist/editor/components/NewComposition/RemTextarea.d.ts +1 -1
  10. package/dist/editor/components/QuickSwitcher/QuickSwitcherContent.js +1 -1
  11. package/dist/editor/components/RenderButton.js +1 -0
  12. package/dist/editor/components/RenderModal/RenderModal.d.ts +1 -0
  13. package/dist/editor/components/RenderModal/RenderModal.js +43 -6
  14. package/dist/editor/components/RenderModal/RenderModalAdvanced.d.ts +2 -0
  15. package/dist/editor/components/RenderModal/RenderModalAdvanced.js +6 -3
  16. package/dist/editor/components/RenderModal/human-readable-codec.d.ts +1 -1
  17. package/dist/editor/components/RenderQueue/actions.d.ts +6 -3
  18. package/dist/editor/components/RenderQueue/actions.js +6 -3
  19. package/dist/editor/components/SidebarRenderButton.js +1 -0
  20. package/dist/editor/state/modals.d.ts +1 -0
  21. package/dist/get-cli-options.d.ts +1 -1
  22. package/dist/get-cli-options.js +1 -0
  23. package/dist/index.d.ts +7 -6
  24. package/dist/parse-command-line.d.ts +2 -1
  25. package/dist/parse-command-line.js +4 -0
  26. package/dist/preview-server/dev-middleware/range-parser.d.ts +1 -1
  27. package/dist/preview-server/project-info.js +2 -0
  28. package/dist/preview-server/render-queue/job.d.ts +2 -0
  29. package/dist/preview-server/render-queue/make-retry-payload.js +3 -0
  30. package/dist/preview-server/routes/add-render.js +3 -0
  31. package/dist/preview-server/routes.js +2 -0
  32. package/dist/render-flows/render.js +1 -0
  33. package/package.json +8 -8
  34. package/dist/config/presets-profile.d.ts +0 -3
  35. package/dist/config/presets-profile.js +0 -12
  36. package/dist/handle-common-errors.d.ts +0 -2
  37. package/dist/handle-common-errors.js +0 -60
@@ -3,7 +3,9 @@ export declare const getChromiumDisableWebSecurity: () => boolean;
3
3
  export declare const setChromiumDisableWebSecurity: (should: boolean) => void;
4
4
  export declare const getIgnoreCertificateErrors: () => boolean;
5
5
  export declare const setChromiumIgnoreCertificateErrors: (should: boolean) => void;
6
- export declare const getChromiumOpenGlRenderer: () => "swangle" | "angle" | "egl" | "swiftshader" | null;
6
+ export declare const getChromiumOpenGlRenderer: () => "swangle" | "angle" | "egl" | "swiftshader" | "vulkan" | null;
7
7
  export declare const setChromiumOpenGlRenderer: (renderer: OpenGlRenderer) => void;
8
8
  export declare const getChromiumHeadlessMode: () => boolean;
9
9
  export declare const setChromiumHeadlessMode: (should: boolean) => void;
10
+ export declare const getChromiumMultiProcessOnLinux: () => boolean;
11
+ export declare const setChromiumMultiProcessOnLinux: (should: boolean) => void;
@@ -1,11 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.setChromiumHeadlessMode = exports.getChromiumHeadlessMode = exports.setChromiumOpenGlRenderer = exports.getChromiumOpenGlRenderer = exports.setChromiumIgnoreCertificateErrors = exports.getIgnoreCertificateErrors = exports.setChromiumDisableWebSecurity = exports.getChromiumDisableWebSecurity = void 0;
3
+ exports.setChromiumMultiProcessOnLinux = exports.getChromiumMultiProcessOnLinux = exports.setChromiumHeadlessMode = exports.getChromiumHeadlessMode = exports.setChromiumOpenGlRenderer = exports.getChromiumOpenGlRenderer = exports.setChromiumIgnoreCertificateErrors = exports.getIgnoreCertificateErrors = exports.setChromiumDisableWebSecurity = exports.getChromiumDisableWebSecurity = void 0;
4
4
  const renderer_1 = require("@remotion/renderer");
5
5
  let chromiumDisableWebSecurity = false;
6
6
  let ignoreCertificateErrors = false;
7
7
  let openGlRenderer = renderer_1.RenderInternals.DEFAULT_OPENGL_RENDERER;
8
8
  let headlessMode = true;
9
+ let multiProcessOnLinux = false;
9
10
  const getChromiumDisableWebSecurity = () => chromiumDisableWebSecurity;
10
11
  exports.getChromiumDisableWebSecurity = getChromiumDisableWebSecurity;
11
12
  const setChromiumDisableWebSecurity = (should) => {
@@ -31,3 +32,9 @@ const setChromiumHeadlessMode = (should) => {
31
32
  headlessMode = should;
32
33
  };
33
34
  exports.setChromiumHeadlessMode = setChromiumHeadlessMode;
35
+ const getChromiumMultiProcessOnLinux = () => multiProcessOnLinux;
36
+ exports.getChromiumMultiProcessOnLinux = getChromiumMultiProcessOnLinux;
37
+ const setChromiumMultiProcessOnLinux = (should) => {
38
+ multiProcessOnLinux = should;
39
+ };
40
+ exports.setChromiumMultiProcessOnLinux = setChromiumMultiProcessOnLinux;
@@ -2,4 +2,4 @@ import type { StillImageFormat, VideoImageFormat } from '@remotion/renderer';
2
2
  export declare const setStillImageFormat: (format: StillImageFormat) => void;
3
3
  export declare const setVideoImageFormat: (format: VideoImageFormat) => void;
4
4
  export declare const getUserPreferredStillImageFormat: () => "png" | "jpeg" | "pdf" | "webp" | undefined;
5
- export declare const getUserPreferredVideoImageFormat: () => "png" | "jpeg" | "none" | undefined;
5
+ export declare const getUserPreferredVideoImageFormat: () => "none" | "png" | "jpeg" | undefined;
@@ -103,10 +103,10 @@ declare global {
103
103
  */
104
104
  readonly setChromiumHeadlessMode: (should: boolean) => void;
105
105
  /**
106
- * Set the OpenGL rendering backend for Chrome. Possible values: 'egl', 'angle', 'swiftshader' and 'swangle'.
106
+ * Set the OpenGL rendering backend for Chrome. Possible values: 'egl', 'angle', 'swiftshader', 'swangle' and 'vulkan'.
107
107
  * Default: 'swangle' in Lambda, null elsewhere.
108
108
  */
109
- readonly setChromiumOpenGlRenderer: (renderer: 'swangle' | 'angle' | 'egl' | 'swiftshader') => void;
109
+ readonly setChromiumOpenGlRenderer: (renderer: 'swangle' | 'angle' | 'egl' | 'swiftshader' | 'vulkan') => void;
110
110
  /**
111
111
  * Set the user agent for Chrome. Only works during rendering.
112
112
  * Default is the default user agent for Chrome
@@ -243,6 +243,13 @@ declare global {
243
243
  * Opt into bt709 rendering.
244
244
  */
245
245
  readonly setColorSpace: (colorSpace: ColorSpace) => void;
246
+ /**
247
+ * Removes the --single-process flag that gets passed to
248
+ Chromium on Linux by default. This will make the render faster because
249
+ multiple processes can be used, but may cause issues with some Linux
250
+ distributions or if window server libraries are missing.
251
+ */
252
+ readonly setChromiumMultiProcessOnLinux: (multiProcessOnLinux: boolean) => void;
246
253
  }
247
254
  }
248
255
  type FlatConfig = RemotionConfigObject & RemotionBundlingOptions & {
@@ -299,7 +306,7 @@ export declare const ConfigInternals: {
299
306
  getChromiumDisableWebSecurity: () => boolean;
300
307
  getIgnoreCertificateErrors: () => boolean;
301
308
  getChromiumHeadlessMode: () => boolean;
302
- getChromiumOpenGlRenderer: () => "swangle" | "angle" | "egl" | "swiftshader" | null;
309
+ getChromiumOpenGlRenderer: () => "swangle" | "angle" | "egl" | "swiftshader" | "vulkan" | null;
303
310
  getEveryNthFrame: () => number;
304
311
  getConcurrency: () => string | number | null;
305
312
  getCurrentPuppeteerTimeout: () => number;
@@ -309,7 +316,7 @@ export declare const ConfigInternals: {
309
316
  getShouldOutputImageSequence: (frameRange: FrameRange | null) => boolean;
310
317
  getDotEnvLocation: () => string | null;
311
318
  getUserPreferredStillImageFormat: () => "png" | "jpeg" | "pdf" | "webp" | undefined;
312
- getUserPreferredVideoImageFormat: () => "png" | "jpeg" | "none" | undefined;
319
+ getUserPreferredVideoImageFormat: () => "none" | "png" | "jpeg" | undefined;
313
320
  getWebpackOverrideFn: () => WebpackOverrideFn;
314
321
  getWebpackCaching: () => boolean;
315
322
  getOutputLocation: () => string | null;
@@ -339,4 +346,5 @@ export declare const ConfigInternals: {
339
346
  getDeleteAfter: () => ("1-day" | "3-days" | "7-days" | "30-days") | null;
340
347
  getColorSpace: () => "default" | "bt709";
341
348
  getEnableFolderExpiry: () => boolean | null;
349
+ getChromiumMultiProcessOnLinux: () => boolean;
342
350
  };
@@ -128,6 +128,7 @@ exports.Config = {
128
128
  setChromiumUserAgent: user_agent_1.setChromiumUserAgent,
129
129
  setDotEnvLocation: env_file_2.setDotEnvLocation,
130
130
  setConcurrency: concurrency_2.setConcurrency,
131
+ setChromiumMultiProcessOnLinux: chromium_flags_1.setChromiumMultiProcessOnLinux,
131
132
  setQuality: () => {
132
133
  throw new Error('setQuality() has been renamed - use setJpegQuality() instead.');
133
134
  },
@@ -216,4 +217,5 @@ exports.ConfigInternals = {
216
217
  getDeleteAfter: render_folder_expiry_1.getDeleteAfter,
217
218
  getColorSpace: color_space_1.getColorSpace,
218
219
  getEnableFolderExpiry: enable_folder_expiry_1.getEnableFolderExpiry,
220
+ getChromiumMultiProcessOnLinux: chromium_flags_1.getChromiumMultiProcessOnLinux,
219
221
  };
@@ -16,7 +16,7 @@ const UpdateModal_1 = require("./UpdateModal/UpdateModal");
16
16
  const Modals = () => {
17
17
  const { selectedModal: modalContextType } = (0, react_1.useContext)(modals_1.ModalsContext);
18
18
  const canRender = (0, react_1.useContext)(client_id_1.StudioServerConnectionCtx).type === 'connected';
19
- return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [modalContextType && modalContextType.type === 'new-comp' && ((0, jsx_runtime_1.jsx)(NewComposition_1.default, { initialCompType: modalContextType.compType })), modalContextType && canRender && modalContextType.type === 'render' && ((0, jsx_runtime_1.jsx)(RenderModal_1.RenderModalWithLoader, { initialFrame: modalContextType.initialFrame, compositionId: modalContextType.compositionId, initialVideoImageFormat: modalContextType.initialVideoImageFormat, initialJpegQuality: modalContextType.initialJpegQuality, initialOutName: modalContextType.initialOutName, initialScale: modalContextType.initialScale, initialVerbose: modalContextType.initialVerbose, initialRenderType: modalContextType.initialRenderType, initialOffthreadVideoCacheSizeInBytes: modalContextType.initialOffthreadVideoCacheSizeInBytes, initialVideoCodecForAudioTab: modalContextType.initialVideoCodecForAudioTab, initialVideoCodecForVideoTab: modalContextType.initialVideoCodecForVideoTab, initialConcurrency: modalContextType.initialConcurrency, maxConcurrency: modalContextType.maxConcurrency, minConcurrency: modalContextType.minConcurrency, initialStillImageFormat: modalContextType.initialStillImageFormat, initialMuted: modalContextType.initialMuted, initialEnforceAudioTrack: modalContextType.initialEnforceAudioTrack, initialProResProfile: modalContextType.initialProResProfile, initialx264Preset: modalContextType.initialx264Preset, initialPixelFormat: modalContextType.initialPixelFormat, initialAudioBitrate: modalContextType.initialAudioBitrate, initialVideoBitrate: modalContextType.initialVideoBitrate, initialEveryNthFrame: modalContextType.initialEveryNthFrame, initialNumberOfGifLoops: modalContextType.initialNumberOfGifLoops, initialDelayRenderTimeout: modalContextType.initialDelayRenderTimeout, initialAudioCodec: modalContextType.initialAudioCodec, initialEnvVariables: modalContextType.initialEnvVariables, initialDisableWebSecurity: modalContextType.initialDisableWebSecurity, initialGl: modalContextType.initialOpenGlRenderer, initialHeadless: modalContextType.initialHeadless, initialIgnoreCertificateErrors: modalContextType.initialIgnoreCertificateErrors, defaultProps: modalContextType.defaultProps, inFrameMark: modalContextType.inFrameMark, outFrameMark: modalContextType.outFrameMark, initialColorSpace: modalContextType.initialColorSpace })), modalContextType &&
19
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [modalContextType && modalContextType.type === 'new-comp' && ((0, jsx_runtime_1.jsx)(NewComposition_1.default, { initialCompType: modalContextType.compType })), modalContextType && canRender && modalContextType.type === 'render' && ((0, jsx_runtime_1.jsx)(RenderModal_1.RenderModalWithLoader, { initialFrame: modalContextType.initialFrame, compositionId: modalContextType.compositionId, initialVideoImageFormat: modalContextType.initialVideoImageFormat, initialJpegQuality: modalContextType.initialJpegQuality, initialOutName: modalContextType.initialOutName, initialScale: modalContextType.initialScale, initialVerbose: modalContextType.initialVerbose, initialRenderType: modalContextType.initialRenderType, initialOffthreadVideoCacheSizeInBytes: modalContextType.initialOffthreadVideoCacheSizeInBytes, initialVideoCodecForAudioTab: modalContextType.initialVideoCodecForAudioTab, initialVideoCodecForVideoTab: modalContextType.initialVideoCodecForVideoTab, initialConcurrency: modalContextType.initialConcurrency, maxConcurrency: modalContextType.maxConcurrency, minConcurrency: modalContextType.minConcurrency, initialStillImageFormat: modalContextType.initialStillImageFormat, initialMuted: modalContextType.initialMuted, initialEnforceAudioTrack: modalContextType.initialEnforceAudioTrack, initialProResProfile: modalContextType.initialProResProfile, initialx264Preset: modalContextType.initialx264Preset, initialPixelFormat: modalContextType.initialPixelFormat, initialAudioBitrate: modalContextType.initialAudioBitrate, initialVideoBitrate: modalContextType.initialVideoBitrate, initialEveryNthFrame: modalContextType.initialEveryNthFrame, initialNumberOfGifLoops: modalContextType.initialNumberOfGifLoops, initialDelayRenderTimeout: modalContextType.initialDelayRenderTimeout, initialAudioCodec: modalContextType.initialAudioCodec, initialEnvVariables: modalContextType.initialEnvVariables, initialDisableWebSecurity: modalContextType.initialDisableWebSecurity, initialGl: modalContextType.initialOpenGlRenderer, initialHeadless: modalContextType.initialHeadless, initialIgnoreCertificateErrors: modalContextType.initialIgnoreCertificateErrors, defaultProps: modalContextType.defaultProps, inFrameMark: modalContextType.inFrameMark, outFrameMark: modalContextType.outFrameMark, initialColorSpace: modalContextType.initialColorSpace, initialMultiProcessOnLinux: modalContextType.initialMultiProcessOnLinux })), modalContextType &&
20
20
  canRender &&
21
21
  modalContextType.type === 'render-progress' && ((0, jsx_runtime_1.jsx)(RenderStatusModal_1.RenderStatusModal, { jobId: modalContextType.jobId })), modalContextType && modalContextType.type === 'update' && ((0, jsx_runtime_1.jsx)(UpdateModal_1.UpdateModal, { info: modalContextType.info })), modalContextType && modalContextType.type === 'quick-switcher' && ((0, jsx_runtime_1.jsx)(QuickSwitcher_1.default, { invocationTimestamp: modalContextType.invocationTimestamp, initialMode: modalContextType.mode }))] }));
22
22
  };
@@ -13,5 +13,5 @@ export declare const getInputBorderColor: ({ status, isFocused, isHovered, }: {
13
13
  isFocused: boolean;
14
14
  isHovered: boolean;
15
15
  }) => "hsla(0, 0%, 100%, 0.15)" | "rgba(0, 0, 0, 0.6)" | "rgba(255, 255, 255, 0.05)" | "#ff3232" | "#f1c40f";
16
- export declare const RemotionInput: React.ForwardRefExoticComponent<Pick<Props, "status" | "key" | "rightAlign" | keyof React.InputHTMLAttributes<HTMLInputElement>> & React.RefAttributes<HTMLInputElement>>;
16
+ export declare const RemotionInput: React.ForwardRefExoticComponent<Pick<Props, "key" | keyof React.InputHTMLAttributes<HTMLInputElement> | "status" | "rightAlign"> & React.RefAttributes<HTMLInputElement>>;
17
17
  export {};
@@ -4,5 +4,5 @@ type Props = React.DetailedHTMLProps<React.InputHTMLAttributes<HTMLInputElement>
4
4
  status: RemInputStatus;
5
5
  name: string;
6
6
  };
7
- export declare const RemInputTypeColor: React.ForwardRefExoticComponent<Pick<Props, "status" | "key" | keyof React.InputHTMLAttributes<HTMLInputElement>> & React.RefAttributes<HTMLInputElement>>;
7
+ export declare const RemInputTypeColor: React.ForwardRefExoticComponent<Pick<Props, "key" | keyof React.InputHTMLAttributes<HTMLInputElement> | "status"> & React.RefAttributes<HTMLInputElement>>;
8
8
  export {};
@@ -3,5 +3,5 @@ type Props = React.DetailedHTMLProps<React.InputHTMLAttributes<HTMLTextAreaEleme
3
3
  status: 'error' | 'warning' | 'ok';
4
4
  };
5
5
  export declare const inputBaseStyle: React.CSSProperties;
6
- export declare const RemTextarea: React.ForwardRefExoticComponent<Pick<Props, "status" | "key" | keyof React.InputHTMLAttributes<HTMLTextAreaElement>> & React.RefAttributes<HTMLTextAreaElement>>;
6
+ export declare const RemTextarea: React.ForwardRefExoticComponent<Pick<Props, "key" | "status" | keyof React.InputHTMLAttributes<HTMLTextAreaElement>> & React.RefAttributes<HTMLTextAreaElement>>;
7
7
  export {};
@@ -135,7 +135,7 @@ const QuickSwitcherContent = ({ initialMode, invocationTimestamp }) => {
135
135
  var _a;
136
136
  selectComposition(c, true);
137
137
  setSelectedModal(null);
138
- const selector = `.__remotion-composition[data-compname=${c.id}`;
138
+ const selector = `.__remotion-composition[data-compname="${c.id}"]`;
139
139
  (_a = CompositionSelector_1.compositionSelectorRef.current) === null || _a === void 0 ? void 0 : _a.expandComposition(c.id);
140
140
  waitForElm(selector).then(() => {
141
141
  var _a;
@@ -100,6 +100,7 @@ const RenderButton = () => {
100
100
  inFrameMark: inFrame,
101
101
  outFrameMark: outFrame,
102
102
  initialColorSpace: defaults.colorSpace,
103
+ initialMultiProcessOnLinux: defaults.multiProcessOnLinux,
103
104
  });
104
105
  }, [video, setSelectedModal, frame, props, inFrame, outFrame]);
105
106
  if (!video) {
@@ -37,6 +37,7 @@ type RenderModalProps = {
37
37
  defaultProps: Record<string, unknown>;
38
38
  inFrameMark: number | null;
39
39
  outFrameMark: number | null;
40
+ initialMultiProcessOnLinux: boolean;
40
41
  };
41
42
  export declare const RenderModalWithLoader: React.FC<RenderModalProps>;
42
43
  export {};
@@ -114,13 +114,14 @@ const outer = {
114
114
  display: 'flex',
115
115
  flexDirection: 'column',
116
116
  };
117
- const RenderModal = ({ initialFrame, initialVideoImageFormat, initialStillImageFormat, initialJpegQuality, initialScale, initialVerbose, initialOutName, initialRenderType, initialVideoCodecForAudioTab, initialVideoCodecForVideoTab, initialConcurrency, maxConcurrency, minConcurrency, initialMuted, initialEnforceAudioTrack, initialProResProfile, initialx264Preset, initialPixelFormat, initialVideoBitrate, initialAudioBitrate, initialEveryNthFrame, initialNumberOfGifLoops, initialDelayRenderTimeout, initialOffthreadVideoCacheSizeInBytes, initialAudioCodec, initialEnvVariables, initialDisableWebSecurity, initialGl, initialHeadless, initialIgnoreCertificateErrors, defaultProps, inFrameMark, outFrameMark, onClose, resolvedComposition, unresolvedComposition, initialColorSpace, }) => {
117
+ const RenderModal = ({ initialFrame, initialVideoImageFormat, initialStillImageFormat, initialJpegQuality, initialScale, initialVerbose, initialOutName, initialRenderType, initialVideoCodecForAudioTab, initialVideoCodecForVideoTab, initialConcurrency, maxConcurrency, minConcurrency, initialMuted, initialEnforceAudioTrack, initialProResProfile, initialx264Preset, initialPixelFormat, initialVideoBitrate, initialAudioBitrate, initialEveryNthFrame, initialNumberOfGifLoops, initialDelayRenderTimeout, initialOffthreadVideoCacheSizeInBytes, initialAudioCodec, initialEnvVariables, initialDisableWebSecurity, initialGl, initialHeadless, initialIgnoreCertificateErrors, defaultProps, inFrameMark, outFrameMark, onClose, resolvedComposition, unresolvedComposition, initialColorSpace, initialMultiProcessOnLinux, }) => {
118
118
  const isMounted = (0, react_1.useRef)(true);
119
119
  const [state, dispatch] = (0, react_1.useReducer)(reducer, initialState);
120
120
  const [unclampedFrame, setFrame] = (0, react_1.useState)(() => initialFrame);
121
121
  const [saving, setSaving] = (0, react_1.useState)(false);
122
122
  const [stillImageFormat, setStillImageFormat] = (0, react_1.useState)(() => initialStillImageFormat);
123
123
  const [videoImageFormat, setVideoImageFormat] = (0, react_1.useState)(() => initialVideoImageFormat);
124
+ const [sequenceImageFormat, setSequenceImageFormat] = (0, react_1.useState)(() => initialStillImageFormat === 'jpeg' ? 'jpeg' : 'png');
124
125
  const [concurrency, setConcurrency] = (0, react_1.useState)(() => initialConcurrency);
125
126
  const [videoCodecForVideoTab, setVideoCodecForVideoTab] = (0, react_1.useState)(() => initialVideoCodecForVideoTab);
126
127
  const [userSelectedAudioCodec, setUserSelectedAudioCodec] = (0, react_1.useState)(() => initialAudioCodec);
@@ -136,6 +137,7 @@ const RenderModal = ({ initialFrame, initialVideoImageFormat, initialStillImageF
136
137
  const [disableWebSecurity, setDisableWebSecurity] = (0, react_1.useState)(() => initialDisableWebSecurity);
137
138
  const [headless, setHeadless] = (0, react_1.useState)(() => initialHeadless);
138
139
  const [ignoreCertificateErrors, setIgnoreCertificateErrors] = (0, react_1.useState)(() => initialIgnoreCertificateErrors);
140
+ const [multiProcessOnLinux, setChromiumMultiProcessOnLinux] = (0, react_1.useState)(() => initialMultiProcessOnLinux);
139
141
  const [openGlOption, setOpenGlOption] = (0, react_1.useState)(() => initialGl !== null && initialGl !== void 0 ? initialGl : 'default');
140
142
  const [colorSpace, setColorSpace] = (0, react_1.useState)(() => initialColorSpace);
141
143
  const chromiumOptions = (0, react_1.useMemo)(() => {
@@ -146,8 +148,15 @@ const RenderModal = ({ initialFrame, initialVideoImageFormat, initialStillImageF
146
148
  gl: openGlOption === 'default' ? null : openGlOption,
147
149
  // TODO: Make this configurable at some point (not necessary for V4)
148
150
  userAgent: null,
151
+ enableMultiProcessOnLinux: multiProcessOnLinux,
149
152
  };
150
- }, [headless, disableWebSecurity, ignoreCertificateErrors, openGlOption]);
153
+ }, [
154
+ headless,
155
+ disableWebSecurity,
156
+ ignoreCertificateErrors,
157
+ openGlOption,
158
+ multiProcessOnLinux,
159
+ ]);
151
160
  const [outName, setOutName] = (0, react_1.useState)(() => initialOutName);
152
161
  const [endFrameOrNull, setEndFrame] = (0, react_1.useState)(() => outFrameMark !== null && outFrameMark !== void 0 ? outFrameMark : null);
153
162
  const [startFrameOrNull, setStartFrame] = (0, react_1.useState)(() => inFrameMark !== null && inFrameMark !== void 0 ? inFrameMark : null);
@@ -345,6 +354,7 @@ const RenderModal = ({ initialFrame, initialVideoImageFormat, initialStillImageF
345
354
  envVariables: (0, convert_env_variables_1.envVariablesArrayToObject)(envVariables),
346
355
  inputProps,
347
356
  offthreadVideoCacheSizeInBytes,
357
+ multiProcessOnLinux,
348
358
  })
349
359
  .then(() => {
350
360
  dispatchIfMounted({ type: 'succeed' });
@@ -368,6 +378,7 @@ const RenderModal = ({ initialFrame, initialVideoImageFormat, initialStillImageF
368
378
  envVariables,
369
379
  inputProps,
370
380
  offthreadVideoCacheSizeInBytes,
381
+ multiProcessOnLinux,
371
382
  onClose,
372
383
  ]);
373
384
  const [everyNthFrameSetting, setEveryNthFrameSetting] = (0, react_1.useState)(() => initialEveryNthFrame);
@@ -413,6 +424,7 @@ const RenderModal = ({ initialFrame, initialVideoImageFormat, initialStillImageF
413
424
  inputProps,
414
425
  offthreadVideoCacheSizeInBytes,
415
426
  colorSpace,
427
+ multiProcessOnLinux,
416
428
  })
417
429
  .then(() => {
418
430
  dispatchIfMounted({ type: 'succeed' });
@@ -454,6 +466,7 @@ const RenderModal = ({ initialFrame, initialVideoImageFormat, initialStillImageF
454
466
  inputProps,
455
467
  offthreadVideoCacheSizeInBytes,
456
468
  colorSpace,
469
+ multiProcessOnLinux,
457
470
  onClose,
458
471
  ]);
459
472
  const onClickSequence = (0, react_1.useCallback)(() => {
@@ -465,7 +478,7 @@ const RenderModal = ({ initialFrame, initialVideoImageFormat, initialStillImageF
465
478
  (0, actions_1.addSequenceRenderJob)({
466
479
  compositionId: resolvedComposition.id,
467
480
  outName,
468
- imageFormat: videoImageFormat,
481
+ imageFormat: sequenceImageFormat,
469
482
  scale,
470
483
  verbose,
471
484
  concurrency,
@@ -478,6 +491,7 @@ const RenderModal = ({ initialFrame, initialVideoImageFormat, initialStillImageF
478
491
  inputProps,
479
492
  offthreadVideoCacheSizeInBytes,
480
493
  disallowParallelEncoding,
494
+ multiProcessOnLinux,
481
495
  })
482
496
  .then(() => {
483
497
  dispatchIfMounted({ type: 'succeed' });
@@ -491,7 +505,7 @@ const RenderModal = ({ initialFrame, initialVideoImageFormat, initialStillImageF
491
505
  dispatchIfMounted,
492
506
  resolvedComposition.id,
493
507
  outName,
494
- videoImageFormat,
508
+ sequenceImageFormat,
495
509
  scale,
496
510
  verbose,
497
511
  concurrency,
@@ -504,6 +518,7 @@ const RenderModal = ({ initialFrame, initialVideoImageFormat, initialStillImageF
504
518
  inputProps,
505
519
  offthreadVideoCacheSizeInBytes,
506
520
  disallowParallelEncoding,
521
+ multiProcessOnLinux,
507
522
  onClose,
508
523
  ]);
509
524
  (0, react_1.useEffect)(() => {
@@ -540,6 +555,22 @@ const RenderModal = ({ initialFrame, initialVideoImageFormat, initialStillImageF
540
555
  },
541
556
  ];
542
557
  }
558
+ if (renderMode === 'sequence') {
559
+ return [
560
+ {
561
+ label: 'PNG',
562
+ onClick: () => setSequenceImageFormat('png'),
563
+ key: 'png',
564
+ selected: sequenceImageFormat === 'png',
565
+ },
566
+ {
567
+ label: 'JPEG',
568
+ onClick: () => setSequenceImageFormat('jpeg'),
569
+ key: 'jpeg',
570
+ selected: sequenceImageFormat === 'jpeg',
571
+ },
572
+ ];
573
+ }
543
574
  return [
544
575
  {
545
576
  label: 'PNG',
@@ -554,7 +585,13 @@ const RenderModal = ({ initialFrame, initialVideoImageFormat, initialStillImageF
554
585
  selected: videoImageFormat === 'jpeg',
555
586
  },
556
587
  ];
557
- }, [stillImageFormat, renderMode, setStillFormat, videoImageFormat]);
588
+ }, [
589
+ renderMode,
590
+ videoImageFormat,
591
+ stillImageFormat,
592
+ setStillFormat,
593
+ sequenceImageFormat,
594
+ ]);
558
595
  const setRenderMode = (0, react_1.useCallback)((newRenderMode) => {
559
596
  setRenderModeState(newRenderMode);
560
597
  if (newRenderMode === 'audio') {
@@ -675,7 +712,7 @@ const RenderModal = ({ initialFrame, initialVideoImageFormat, initialStillImageF
675
712
  return ((0, jsx_runtime_1.jsxs)("div", { style: outer, children: [(0, jsx_runtime_1.jsx)(ModalHeader_1.NewCompHeader, { title: `Render ${resolvedComposition.id}` }), (0, jsx_runtime_1.jsxs)("div", { style: container, children: [(0, jsx_runtime_1.jsx)(SegmentedControl_1.SegmentedControl, { items: renderTabOptions, needsWrapping: false }), (0, jsx_runtime_1.jsx)("div", { style: flexer }), (0, jsx_runtime_1.jsxs)(Button_1.Button, { autoFocus: true, onClick: trigger, disabled: renderDisabled, style: {
676
713
  ...buttonStyle,
677
714
  backgroundColor: outnameValidation.valid ? colors_1.BLUE : colors_1.BLUE_DISABLED,
678
- }, children: [state.type === 'idle' ? `Render ${renderMode}` : 'Rendering...', (0, jsx_runtime_1.jsx)(ShortcutHint_1.ShortcutHint, { keyToPress: "\u21B5", cmdOrCtrl: true })] })] }), (0, jsx_runtime_1.jsxs)("div", { style: horizontalLayout, children: [(0, jsx_runtime_1.jsxs)("div", { style: leftSidebar, children: [shownTabs.includes('general') ? ((0, jsx_runtime_1.jsxs)(vertical_1.VerticalTab, { style: horizontalTab, selected: tab === 'general', onClick: () => setTab('general'), children: [(0, jsx_runtime_1.jsx)("div", { style: iconContainer, children: (0, jsx_runtime_1.jsx)(file_1.FileIcon, { style: icon }) }), "General"] })) : null, shownTabs.includes('data') ? ((0, jsx_runtime_1.jsxs)(vertical_1.VerticalTab, { style: horizontalTab, selected: tab === 'data', onClick: () => setTab('data'), children: [(0, jsx_runtime_1.jsx)("div", { style: iconContainer, children: (0, jsx_runtime_1.jsx)(data_1.DataIcon, { style: icon }) }), "Input Props"] })) : null, shownTabs.includes('picture') ? ((0, jsx_runtime_1.jsxs)(vertical_1.VerticalTab, { style: horizontalTab, selected: tab === 'picture', onClick: () => setTab('picture'), children: [(0, jsx_runtime_1.jsx)("div", { style: iconContainer, children: (0, jsx_runtime_1.jsx)(frame_1.PicIcon, { style: icon }) }), "Picture"] })) : null, shownTabs.includes('audio') ? ((0, jsx_runtime_1.jsxs)(vertical_1.VerticalTab, { style: horizontalTab, selected: tab === 'audio', onClick: () => setTab('audio'), children: [(0, jsx_runtime_1.jsx)("div", { style: iconContainer, children: (0, jsx_runtime_1.jsx)(audio_1.AudioIcon, { style: icon }) }), "Audio"] })) : null, shownTabs.includes('gif') ? ((0, jsx_runtime_1.jsxs)(vertical_1.VerticalTab, { style: horizontalTab, selected: tab === 'gif', onClick: () => setTab('gif'), children: [(0, jsx_runtime_1.jsx)("div", { style: iconContainer, children: (0, jsx_runtime_1.jsx)(gif_1.GifIcon, { style: icon }) }), "GIF"] })) : null, shownTabs.includes('advanced') ? ((0, jsx_runtime_1.jsxs)(vertical_1.VerticalTab, { style: horizontalTab, selected: tab === 'advanced', onClick: () => setTab('advanced'), children: [(0, jsx_runtime_1.jsx)("div", { style: iconContainer, children: (0, jsx_runtime_1.jsx)(gear_1.GearIcon, { style: icon }) }), "Other"] })) : null] }), (0, jsx_runtime_1.jsx)("div", { style: optionsPanel, className: is_menu_item_1.VERTICAL_SCROLLBAR_CLASSNAME, children: tab === 'general' ? ((0, jsx_runtime_1.jsx)(RenderModalBasic_1.RenderModalBasic, { codec: codec, resolvedComposition: resolvedComposition, frame: frame, imageFormatOptions: imageFormatOptions, outName: outName, proResProfile: proResProfile, renderMode: renderMode, setVideoCodec: setCodec, setFrame: setFrame, setOutName: setOutName, setProResProfile: setProResProfile, endFrame: endFrame, setEndFrame: setEndFrame, setStartFrame: setStartFrame, startFrame: startFrame, validationMessage: outnameValidation.valid ? null : outnameValidation.error.message })) : tab === 'picture' ? ((0, jsx_runtime_1.jsx)(RenderModalPicture_1.RenderModalPicture, { renderMode: renderMode, scale: scale, setScale: setScale, pixelFormat: pixelFormat, setPixelFormat: setPixelFormat, imageFormatOptions: imageFormatOptions, crf: crf, setCrf: setCrf, customTargetVideoBitrate: customTargetVideoBitrate, maxCrf: maxCrf, minCrf: minCrf, jpegQuality: jpegQuality, qualityControlType: qualityControlType, setJpegQuality: setJpegQuality, setColorSpace: setColorSpace, colorSpace: colorSpace, setCustomTargetVideoBitrateValue: setCustomTargetVideoBitrateValue, setQualityControl: setQualityControl, videoImageFormat: videoImageFormat, stillImageFormat: stillImageFormat, shouldDisplayQualityControlPicker: supportsBothQualityControls })) : tab === 'audio' ? ((0, jsx_runtime_1.jsx)(RenderModalAudio_1.RenderModalAudio, { muted: muted, renderMode: renderMode, setMuted: setMuted, codec: codec, audioCodec: audioCodec, setAudioCodec: setAudioCodec, enforceAudioTrack: enforceAudioTrack, setEnforceAudioTrackState: setEnforceAudioTrackState, customTargetAudioBitrate: customTargetAudioBitrate, setCustomTargetAudioBitrateValue: setCustomTargetAudioBitrateValue, setShouldHaveCustomTargetAudioBitrate: setShouldHaveCustomTargetAudioBitrate, shouldHaveCustomTargetAudioBitrate: shouldHaveCustomTargetAudioBitrate })) : tab === 'gif' ? ((0, jsx_runtime_1.jsx)(RenderModalGif_1.RenderModalGif, { everyNthFrame: everyNthFrame, limitNumberOfGifLoops: limitNumberOfGifLoops, numberOfGifLoopsSetting: numberOfGifLoopsSetting, setEveryNthFrameSetting: setEveryNthFrameSetting, setLimitNumberOfGifLoops: setLimitNumberOfGifLoops, setNumberOfGifLoopsSetting: setNumberOfGifLoopsSetting })) : tab === 'data' ? ((0, jsx_runtime_1.jsx)(DataEditor_1.DataEditor, { inputProps: inputProps, setInputProps: setInputProps, unresolvedComposition: unresolvedComposition, mayShowSaveButton: false, propsEditType: "input-props", saving: saving, setSaving: setSaving })) : ((0, jsx_runtime_1.jsx)(RenderModalAdvanced_1.RenderModalAdvanced, { x264Preset: x264Preset, setx264Preset: setx264Preset, concurrency: concurrency, maxConcurrency: maxConcurrency, minConcurrency: minConcurrency, renderMode: renderMode, setConcurrency: setConcurrency, setVerboseLogging: setVerboseLogging, verbose: verbose, delayRenderTimeout: delayRenderTimeout, setDelayRenderTimeout: setDelayRenderTimeout, disallowParallelEncoding: disallowParallelEncoding, setDisallowParallelEncoding: setDisallowParallelEncoding, setDisableWebSecurity: setDisableWebSecurity, setIgnoreCertificateErrors: setIgnoreCertificateErrors, setHeadless: setHeadless, headless: headless, ignoreCertificateErrors: ignoreCertificateErrors, disableWebSecurity: disableWebSecurity, openGlOption: openGlOption, setOpenGlOption: setOpenGlOption, setEnvVariables: setEnvVariables, envVariables: envVariables, offthreadVideoCacheSizeInBytes: offthreadVideoCacheSizeInBytes, setOffthreadVideoCacheSizeInBytes: setOffthreadVideoCacheSizeInBytes, codec: codec })) })] })] }));
715
+ }, children: [state.type === 'idle' ? `Render ${renderMode}` : 'Rendering...', (0, jsx_runtime_1.jsx)(ShortcutHint_1.ShortcutHint, { keyToPress: "\u21B5", cmdOrCtrl: true })] })] }), (0, jsx_runtime_1.jsxs)("div", { style: horizontalLayout, children: [(0, jsx_runtime_1.jsxs)("div", { style: leftSidebar, children: [shownTabs.includes('general') ? ((0, jsx_runtime_1.jsxs)(vertical_1.VerticalTab, { style: horizontalTab, selected: tab === 'general', onClick: () => setTab('general'), children: [(0, jsx_runtime_1.jsx)("div", { style: iconContainer, children: (0, jsx_runtime_1.jsx)(file_1.FileIcon, { style: icon }) }), "General"] })) : null, shownTabs.includes('data') ? ((0, jsx_runtime_1.jsxs)(vertical_1.VerticalTab, { style: horizontalTab, selected: tab === 'data', onClick: () => setTab('data'), children: [(0, jsx_runtime_1.jsx)("div", { style: iconContainer, children: (0, jsx_runtime_1.jsx)(data_1.DataIcon, { style: icon }) }), "Input Props"] })) : null, shownTabs.includes('picture') ? ((0, jsx_runtime_1.jsxs)(vertical_1.VerticalTab, { style: horizontalTab, selected: tab === 'picture', onClick: () => setTab('picture'), children: [(0, jsx_runtime_1.jsx)("div", { style: iconContainer, children: (0, jsx_runtime_1.jsx)(frame_1.PicIcon, { style: icon }) }), "Picture"] })) : null, shownTabs.includes('audio') ? ((0, jsx_runtime_1.jsxs)(vertical_1.VerticalTab, { style: horizontalTab, selected: tab === 'audio', onClick: () => setTab('audio'), children: [(0, jsx_runtime_1.jsx)("div", { style: iconContainer, children: (0, jsx_runtime_1.jsx)(audio_1.AudioIcon, { style: icon }) }), "Audio"] })) : null, shownTabs.includes('gif') ? ((0, jsx_runtime_1.jsxs)(vertical_1.VerticalTab, { style: horizontalTab, selected: tab === 'gif', onClick: () => setTab('gif'), children: [(0, jsx_runtime_1.jsx)("div", { style: iconContainer, children: (0, jsx_runtime_1.jsx)(gif_1.GifIcon, { style: icon }) }), "GIF"] })) : null, shownTabs.includes('advanced') ? ((0, jsx_runtime_1.jsxs)(vertical_1.VerticalTab, { style: horizontalTab, selected: tab === 'advanced', onClick: () => setTab('advanced'), children: [(0, jsx_runtime_1.jsx)("div", { style: iconContainer, children: (0, jsx_runtime_1.jsx)(gear_1.GearIcon, { style: icon }) }), "Other"] })) : null] }), (0, jsx_runtime_1.jsx)("div", { style: optionsPanel, className: is_menu_item_1.VERTICAL_SCROLLBAR_CLASSNAME, children: tab === 'general' ? ((0, jsx_runtime_1.jsx)(RenderModalBasic_1.RenderModalBasic, { codec: codec, resolvedComposition: resolvedComposition, frame: frame, imageFormatOptions: imageFormatOptions, outName: outName, proResProfile: proResProfile, renderMode: renderMode, setVideoCodec: setCodec, setFrame: setFrame, setOutName: setOutName, setProResProfile: setProResProfile, endFrame: endFrame, setEndFrame: setEndFrame, setStartFrame: setStartFrame, startFrame: startFrame, validationMessage: outnameValidation.valid ? null : outnameValidation.error.message })) : tab === 'picture' ? ((0, jsx_runtime_1.jsx)(RenderModalPicture_1.RenderModalPicture, { renderMode: renderMode, scale: scale, setScale: setScale, pixelFormat: pixelFormat, setPixelFormat: setPixelFormat, imageFormatOptions: imageFormatOptions, crf: crf, setCrf: setCrf, customTargetVideoBitrate: customTargetVideoBitrate, maxCrf: maxCrf, minCrf: minCrf, jpegQuality: jpegQuality, qualityControlType: qualityControlType, setJpegQuality: setJpegQuality, setColorSpace: setColorSpace, colorSpace: colorSpace, setCustomTargetVideoBitrateValue: setCustomTargetVideoBitrateValue, setQualityControl: setQualityControl, videoImageFormat: videoImageFormat, stillImageFormat: stillImageFormat, shouldDisplayQualityControlPicker: supportsBothQualityControls })) : tab === 'audio' ? ((0, jsx_runtime_1.jsx)(RenderModalAudio_1.RenderModalAudio, { muted: muted, renderMode: renderMode, setMuted: setMuted, codec: codec, audioCodec: audioCodec, setAudioCodec: setAudioCodec, enforceAudioTrack: enforceAudioTrack, setEnforceAudioTrackState: setEnforceAudioTrackState, customTargetAudioBitrate: customTargetAudioBitrate, setCustomTargetAudioBitrateValue: setCustomTargetAudioBitrateValue, setShouldHaveCustomTargetAudioBitrate: setShouldHaveCustomTargetAudioBitrate, shouldHaveCustomTargetAudioBitrate: shouldHaveCustomTargetAudioBitrate })) : tab === 'gif' ? ((0, jsx_runtime_1.jsx)(RenderModalGif_1.RenderModalGif, { everyNthFrame: everyNthFrame, limitNumberOfGifLoops: limitNumberOfGifLoops, numberOfGifLoopsSetting: numberOfGifLoopsSetting, setEveryNthFrameSetting: setEveryNthFrameSetting, setLimitNumberOfGifLoops: setLimitNumberOfGifLoops, setNumberOfGifLoopsSetting: setNumberOfGifLoopsSetting })) : tab === 'data' ? ((0, jsx_runtime_1.jsx)(DataEditor_1.DataEditor, { inputProps: inputProps, setInputProps: setInputProps, unresolvedComposition: unresolvedComposition, mayShowSaveButton: false, propsEditType: "input-props", saving: saving, setSaving: setSaving })) : ((0, jsx_runtime_1.jsx)(RenderModalAdvanced_1.RenderModalAdvanced, { x264Preset: x264Preset, setx264Preset: setx264Preset, concurrency: concurrency, maxConcurrency: maxConcurrency, minConcurrency: minConcurrency, renderMode: renderMode, setConcurrency: setConcurrency, setVerboseLogging: setVerboseLogging, verbose: verbose, delayRenderTimeout: delayRenderTimeout, setDelayRenderTimeout: setDelayRenderTimeout, disallowParallelEncoding: disallowParallelEncoding, setDisallowParallelEncoding: setDisallowParallelEncoding, setDisableWebSecurity: setDisableWebSecurity, setIgnoreCertificateErrors: setIgnoreCertificateErrors, setHeadless: setHeadless, headless: headless, ignoreCertificateErrors: ignoreCertificateErrors, disableWebSecurity: disableWebSecurity, openGlOption: openGlOption, setOpenGlOption: setOpenGlOption, setEnvVariables: setEnvVariables, envVariables: envVariables, offthreadVideoCacheSizeInBytes: offthreadVideoCacheSizeInBytes, setOffthreadVideoCacheSizeInBytes: setOffthreadVideoCacheSizeInBytes, enableMultiProcessOnLinux: multiProcessOnLinux, setChromiumMultiProcessOnLinux: setChromiumMultiProcessOnLinux, codec: codec })) })] })] }));
679
716
  };
680
717
  const RenderModalWithLoader = (props) => {
681
718
  const { setSelectedModal } = (0, react_1.useContext)(modals_1.ModalsContext);
@@ -29,4 +29,6 @@ export declare const RenderModalAdvanced: React.FC<{
29
29
  offthreadVideoCacheSizeInBytes: number | null;
30
30
  setOffthreadVideoCacheSizeInBytes: React.Dispatch<React.SetStateAction<number | null>>;
31
31
  codec: Codec;
32
+ enableMultiProcessOnLinux: boolean;
33
+ setChromiumMultiProcessOnLinux: React.Dispatch<React.SetStateAction<boolean>>;
32
34
  }>;
@@ -17,9 +17,9 @@ const container = {
17
17
  flex: 1,
18
18
  overflowY: 'auto',
19
19
  };
20
- const RenderModalAdvanced = ({ renderMode, maxConcurrency, minConcurrency, setConcurrency, concurrency, setVerboseLogging, verbose, delayRenderTimeout, setDelayRenderTimeout, disallowParallelEncoding, setDisallowParallelEncoding, setDisableWebSecurity, setIgnoreCertificateErrors, setHeadless, headless, ignoreCertificateErrors, disableWebSecurity, openGlOption, setOpenGlOption, setEnvVariables, envVariables, setx264Preset, x264Preset, codec, offthreadVideoCacheSizeInBytes, setOffthreadVideoCacheSizeInBytes, }) => {
20
+ const RenderModalAdvanced = ({ renderMode, maxConcurrency, minConcurrency, setConcurrency, concurrency, setVerboseLogging, verbose, delayRenderTimeout, setDelayRenderTimeout, disallowParallelEncoding, setDisallowParallelEncoding, setDisableWebSecurity, setIgnoreCertificateErrors, setHeadless, headless, ignoreCertificateErrors, disableWebSecurity, openGlOption, setOpenGlOption, setEnvVariables, envVariables, setx264Preset, x264Preset, codec, offthreadVideoCacheSizeInBytes, setOffthreadVideoCacheSizeInBytes, enableMultiProcessOnLinux, setChromiumMultiProcessOnLinux, }) => {
21
21
  const extendedOpenGlOptions = (0, react_1.useMemo)(() => {
22
- return ['angle', 'egl', 'swangle', 'swiftshader', 'default'];
22
+ return ['angle', 'egl', 'swangle', 'swiftshader', 'vulkan', 'default'];
23
23
  }, []);
24
24
  const onVerboseLoggingChanged = (0, react_1.useCallback)((e) => {
25
25
  setVerboseLogging(e.target.checked);
@@ -38,6 +38,9 @@ const RenderModalAdvanced = ({ renderMode, maxConcurrency, minConcurrency, setCo
38
38
  const onDisableWebSecurityChanged = (0, react_1.useCallback)((e) => {
39
39
  setDisableWebSecurity(e.target.checked);
40
40
  }, [setDisableWebSecurity]);
41
+ const onEnableMultiProcessOnLinux = (0, react_1.useCallback)((e) => {
42
+ setChromiumMultiProcessOnLinux(e.target.checked);
43
+ }, [setChromiumMultiProcessOnLinux]);
41
44
  const onIgnoreCertificatErrors = (0, react_1.useCallback)((e) => {
42
45
  setIgnoreCertificateErrors(e.target.checked);
43
46
  }, [setIgnoreCertificateErrors]);
@@ -93,6 +96,6 @@ const RenderModalAdvanced = ({ renderMode, maxConcurrency, minConcurrency, setCo
93
96
  , {
94
97
  // Also appears in packages/renderer/src/validate-puppeteer-timeout.ts
95
98
  min: 7000, max: 900000, name: "delayRender() timeout", onValueChanged: setDelayRenderTimeout, formatter: (w) => `${w}ms`, step: 1000, value: delayRenderTimeout }), (0, jsx_runtime_1.jsxs)("div", { style: layout_1.optionRow, children: [(0, jsx_runtime_1.jsx)("div", { style: layout_1.label, children: "No parallel encoding" }), (0, jsx_runtime_1.jsx)("div", { style: layout_1.rightRow, children: (0, jsx_runtime_1.jsx)(Checkbox_1.Checkbox, { checked: disallowParallelEncoding, onChange: onDisallowParallelEncodingChanged, name: "disallow-parallel-encoding" }) })] }), renderMode === 'audio' ? null : ((0, jsx_runtime_1.jsxs)("div", { style: layout_1.optionRow, children: [(0, jsx_runtime_1.jsx)("div", { style: layout_1.label, children: "Custom OffthreadVideo cache" }), (0, jsx_runtime_1.jsx)("div", { style: layout_1.rightRow, children: (0, jsx_runtime_1.jsx)(Checkbox_1.Checkbox, { checked: offthreadVideoCacheSizeInBytes !== null, onChange: toggleCustomOffthreadVideoCacheSizeInBytes, name: "custom-audio-bitrate" }) })] })), renderMode === 'audio' ||
96
- offthreadVideoCacheSizeInBytes === null ? null : ((0, jsx_runtime_1.jsx)(NumberSetting_1.NumberSetting, { min: minConcurrency, max: 2000 * 1024 * 1024, step: 1024, name: "OffthreadVideo cache size", formatter: (w) => `${w} bytes`, onValueChanged: changeOffthreadVideoCacheSizeInBytes, value: offthreadVideoCacheSizeInBytes })), (0, jsx_runtime_1.jsxs)("div", { style: layout_1.optionRow, children: [(0, jsx_runtime_1.jsx)("div", { style: layout_1.label, children: "Verbose logging" }), (0, jsx_runtime_1.jsx)("div", { style: layout_1.rightRow, children: (0, jsx_runtime_1.jsx)(Checkbox_1.Checkbox, { checked: verbose, onChange: onVerboseLoggingChanged, name: "verbose-logging" }) })] }), (0, jsx_runtime_1.jsx)(RenderModalHr_1.RenderModalHr, {}), (0, jsx_runtime_1.jsxs)("div", { style: layout_1.optionRow, children: [(0, jsx_runtime_1.jsx)("div", { style: layout_1.label, children: "Disable web security" }), (0, jsx_runtime_1.jsx)("div", { style: layout_1.rightRow, children: (0, jsx_runtime_1.jsx)(Checkbox_1.Checkbox, { checked: disableWebSecurity, onChange: onDisableWebSecurityChanged, name: "disable-web-security" }) })] }), (0, jsx_runtime_1.jsxs)("div", { style: layout_1.optionRow, children: [(0, jsx_runtime_1.jsx)("div", { style: layout_1.label, children: "Ignore certificate errors " }), (0, jsx_runtime_1.jsx)("div", { style: layout_1.rightRow, children: (0, jsx_runtime_1.jsx)(Checkbox_1.Checkbox, { checked: ignoreCertificateErrors, onChange: onIgnoreCertificatErrors, name: "ignore-certificate-errors" }) })] }), (0, jsx_runtime_1.jsxs)("div", { style: layout_1.optionRow, children: [(0, jsx_runtime_1.jsx)("div", { style: layout_1.label, children: "Headless mode" }), (0, jsx_runtime_1.jsx)("div", { style: layout_1.rightRow, children: (0, jsx_runtime_1.jsx)(Checkbox_1.Checkbox, { checked: headless, onChange: onHeadless, name: "headless" }) })] }), (0, jsx_runtime_1.jsxs)("div", { style: layout_1.optionRow, children: [(0, jsx_runtime_1.jsx)("div", { style: layout_1.label, children: "OpenGL render backend" }), (0, jsx_runtime_1.jsx)("div", { style: layout_1.rightRow, children: (0, jsx_runtime_1.jsx)(ComboBox_1.Combobox, { values: openGlOptions, selectedId: openGlOption, title: "OpenGl option" }) })] }), (0, jsx_runtime_1.jsx)(RenderModalHr_1.RenderModalHr, {}), (0, jsx_runtime_1.jsx)(RenderModalEnvironmentVariables_1.RenderModalEnvironmentVariables, { envVariables: envVariables, setEnvVariables: setEnvVariables })] }));
99
+ offthreadVideoCacheSizeInBytes === null ? null : ((0, jsx_runtime_1.jsx)(NumberSetting_1.NumberSetting, { min: minConcurrency, max: 2000 * 1024 * 1024, step: 1024, name: "OffthreadVideo cache size", formatter: (w) => `${w} bytes`, onValueChanged: changeOffthreadVideoCacheSizeInBytes, value: offthreadVideoCacheSizeInBytes })), (0, jsx_runtime_1.jsxs)("div", { style: layout_1.optionRow, children: [(0, jsx_runtime_1.jsx)("div", { style: layout_1.label, children: "Verbose logging" }), (0, jsx_runtime_1.jsx)("div", { style: layout_1.rightRow, children: (0, jsx_runtime_1.jsx)(Checkbox_1.Checkbox, { checked: verbose, onChange: onVerboseLoggingChanged, name: "verbose-logging" }) })] }), (0, jsx_runtime_1.jsx)(RenderModalHr_1.RenderModalHr, {}), (0, jsx_runtime_1.jsxs)("div", { style: layout_1.optionRow, children: [(0, jsx_runtime_1.jsx)("div", { style: layout_1.label, children: "Disable web security" }), (0, jsx_runtime_1.jsx)("div", { style: layout_1.rightRow, children: (0, jsx_runtime_1.jsx)(Checkbox_1.Checkbox, { checked: disableWebSecurity, onChange: onDisableWebSecurityChanged, name: "disable-web-security" }) })] }), (0, jsx_runtime_1.jsxs)("div", { style: layout_1.optionRow, children: [(0, jsx_runtime_1.jsx)("div", { style: layout_1.label, children: "Ignore certificate errors " }), (0, jsx_runtime_1.jsx)("div", { style: layout_1.rightRow, children: (0, jsx_runtime_1.jsx)(Checkbox_1.Checkbox, { checked: ignoreCertificateErrors, onChange: onIgnoreCertificatErrors, name: "ignore-certificate-errors" }) })] }), (0, jsx_runtime_1.jsxs)("div", { style: layout_1.optionRow, children: [(0, jsx_runtime_1.jsx)("div", { style: layout_1.label, children: "Headless mode" }), (0, jsx_runtime_1.jsx)("div", { style: layout_1.rightRow, children: (0, jsx_runtime_1.jsx)(Checkbox_1.Checkbox, { checked: headless, onChange: onHeadless, name: "headless" }) })] }), (0, jsx_runtime_1.jsxs)("div", { style: layout_1.optionRow, children: [(0, jsx_runtime_1.jsx)("div", { style: layout_1.label, children: "OpenGL render backend" }), (0, jsx_runtime_1.jsx)("div", { style: layout_1.rightRow, children: (0, jsx_runtime_1.jsx)(ComboBox_1.Combobox, { values: openGlOptions, selectedId: openGlOption, title: "OpenGl option" }) })] }), (0, jsx_runtime_1.jsxs)("div", { style: layout_1.optionRow, children: [(0, jsx_runtime_1.jsx)("div", { style: layout_1.label, children: "Multi-process Chrome on Linux" }), (0, jsx_runtime_1.jsx)("div", { style: layout_1.rightRow, children: (0, jsx_runtime_1.jsx)(Checkbox_1.Checkbox, { checked: enableMultiProcessOnLinux, onChange: onEnableMultiProcessOnLinux, name: "enable-multi-process-on-linux" }) })] }), (0, jsx_runtime_1.jsx)(RenderModalHr_1.RenderModalHr, {}), (0, jsx_runtime_1.jsx)(RenderModalEnvironmentVariables_1.RenderModalEnvironmentVariables, { envVariables: envVariables, setEnvVariables: setEnvVariables })] }));
97
100
  };
98
101
  exports.RenderModalAdvanced = RenderModalAdvanced;
@@ -1,2 +1,2 @@
1
1
  import type { Codec } from '@remotion/renderer';
2
- export declare const humanReadableCodec: (codec: Codec) => "GIF" | "AAC" | "MP3" | "H.264" | "H.264 Matroska" | "H.265" | "ProRes" | "WebM VP8" | "WebM VP9" | "Waveform" | undefined;
2
+ export declare const humanReadableCodec: (codec: Codec) => "AAC" | "MP3" | "GIF" | "H.264" | "H.264 Matroska" | "H.265" | "ProRes" | "WebM VP8" | "WebM VP9" | "Waveform" | undefined;
@@ -2,7 +2,7 @@ import type { AudioCodec, Codec, ColorSpace, PixelFormat, ProResProfile, StillIm
2
2
  import type { RenderJob } from '../../../preview-server/render-queue/job';
3
3
  import type { RequiredChromiumOptions } from '../../../required-chromium-options';
4
4
  import type { EnumPath } from '../RenderModal/SchemaEditor/extract-enum-json-paths';
5
- export declare const addStillRenderJob: ({ compositionId, outName, imageFormat, jpegQuality, frame, scale, verbose, chromiumOptions, delayRenderTimeout, envVariables, inputProps, offthreadVideoCacheSizeInBytes, }: {
5
+ export declare const addStillRenderJob: ({ compositionId, outName, imageFormat, jpegQuality, frame, scale, verbose, chromiumOptions, delayRenderTimeout, envVariables, inputProps, offthreadVideoCacheSizeInBytes, multiProcessOnLinux, }: {
6
6
  compositionId: string;
7
7
  outName: string;
8
8
  imageFormat: StillImageFormat;
@@ -15,8 +15,9 @@ export declare const addStillRenderJob: ({ compositionId, outName, imageFormat,
15
15
  envVariables: Record<string, string>;
16
16
  inputProps: Record<string, unknown>;
17
17
  offthreadVideoCacheSizeInBytes: number | null;
18
+ multiProcessOnLinux: boolean;
18
19
  }) => Promise<undefined>;
19
- export declare const addSequenceRenderJob: ({ compositionId, outName, imageFormat, startFrame, endFrame, scale, verbose, chromiumOptions, delayRenderTimeout, envVariables, inputProps, concurrency, offthreadVideoCacheSizeInBytes, jpegQuality, disallowParallelEncoding, }: {
20
+ export declare const addSequenceRenderJob: ({ compositionId, outName, imageFormat, startFrame, endFrame, scale, verbose, chromiumOptions, delayRenderTimeout, envVariables, inputProps, concurrency, offthreadVideoCacheSizeInBytes, jpegQuality, disallowParallelEncoding, multiProcessOnLinux, }: {
20
21
  compositionId: string;
21
22
  outName: string;
22
23
  imageFormat: VideoImageFormat;
@@ -32,8 +33,9 @@ export declare const addSequenceRenderJob: ({ compositionId, outName, imageForma
32
33
  inputProps: Record<string, unknown>;
33
34
  offthreadVideoCacheSizeInBytes: number | null;
34
35
  disallowParallelEncoding: boolean;
36
+ multiProcessOnLinux: boolean;
35
37
  }) => Promise<undefined>;
36
- export declare const addVideoRenderJob: ({ compositionId, outName, imageFormat, jpegQuality, scale, verbose, codec, concurrency, crf, startFrame, endFrame, muted, enforceAudioTrack, proResProfile, x264Preset, pixelFormat, audioBitrate, videoBitrate, everyNthFrame, numberOfGifLoops, delayRenderTimeout, audioCodec, disallowParallelEncoding, chromiumOptions, envVariables, inputProps, offthreadVideoCacheSizeInBytes, colorSpace, }: {
38
+ export declare const addVideoRenderJob: ({ compositionId, outName, imageFormat, jpegQuality, scale, verbose, codec, concurrency, crf, startFrame, endFrame, muted, enforceAudioTrack, proResProfile, x264Preset, pixelFormat, audioBitrate, videoBitrate, everyNthFrame, numberOfGifLoops, delayRenderTimeout, audioCodec, disallowParallelEncoding, chromiumOptions, envVariables, inputProps, offthreadVideoCacheSizeInBytes, colorSpace, multiProcessOnLinux, }: {
37
39
  compositionId: string;
38
40
  outName: string;
39
41
  imageFormat: VideoImageFormat;
@@ -62,6 +64,7 @@ export declare const addVideoRenderJob: ({ compositionId, outName, imageFormat,
62
64
  inputProps: Record<string, unknown>;
63
65
  offthreadVideoCacheSizeInBytes: number | null;
64
66
  colorSpace: ColorSpace;
67
+ multiProcessOnLinux: boolean;
65
68
  }) => Promise<undefined>;
66
69
  export declare const unsubscribeFromFileExistenceWatcher: ({ file, clientId, }: {
67
70
  file: string;
@@ -26,7 +26,7 @@ const callApi = (endpoint, body, signal) => {
26
26
  });
27
27
  });
28
28
  };
29
- const addStillRenderJob = ({ compositionId, outName, imageFormat, jpegQuality, frame, scale, verbose, chromiumOptions, delayRenderTimeout, envVariables, inputProps, offthreadVideoCacheSizeInBytes, }) => {
29
+ const addStillRenderJob = ({ compositionId, outName, imageFormat, jpegQuality, frame, scale, verbose, chromiumOptions, delayRenderTimeout, envVariables, inputProps, offthreadVideoCacheSizeInBytes, multiProcessOnLinux, }) => {
30
30
  return callApi('/api/render', {
31
31
  compositionId,
32
32
  type: 'still',
@@ -45,10 +45,11 @@ const addStillRenderJob = ({ compositionId, outName, imageFormat, jpegQuality, f
45
45
  indent: undefined,
46
46
  }).serializedString,
47
47
  offthreadVideoCacheSizeInBytes,
48
+ multiProcessOnLinux,
48
49
  });
49
50
  };
50
51
  exports.addStillRenderJob = addStillRenderJob;
51
- const addSequenceRenderJob = ({ compositionId, outName, imageFormat, startFrame, endFrame, scale, verbose, chromiumOptions, delayRenderTimeout, envVariables, inputProps, concurrency, offthreadVideoCacheSizeInBytes, jpegQuality, disallowParallelEncoding, }) => {
52
+ const addSequenceRenderJob = ({ compositionId, outName, imageFormat, startFrame, endFrame, scale, verbose, chromiumOptions, delayRenderTimeout, envVariables, inputProps, concurrency, offthreadVideoCacheSizeInBytes, jpegQuality, disallowParallelEncoding, multiProcessOnLinux, }) => {
52
53
  return callApi('/api/render', {
53
54
  compositionId,
54
55
  type: 'sequence',
@@ -70,10 +71,11 @@ const addSequenceRenderJob = ({ compositionId, outName, imageFormat, startFrame,
70
71
  }).serializedString,
71
72
  offthreadVideoCacheSizeInBytes,
72
73
  disallowParallelEncoding,
74
+ multiProcessOnLinux,
73
75
  });
74
76
  };
75
77
  exports.addSequenceRenderJob = addSequenceRenderJob;
76
- const addVideoRenderJob = ({ compositionId, outName, imageFormat, jpegQuality, scale, verbose, codec, concurrency, crf, startFrame, endFrame, muted, enforceAudioTrack, proResProfile, x264Preset, pixelFormat, audioBitrate, videoBitrate, everyNthFrame, numberOfGifLoops, delayRenderTimeout, audioCodec, disallowParallelEncoding, chromiumOptions, envVariables, inputProps, offthreadVideoCacheSizeInBytes, colorSpace, }) => {
78
+ const addVideoRenderJob = ({ compositionId, outName, imageFormat, jpegQuality, scale, verbose, codec, concurrency, crf, startFrame, endFrame, muted, enforceAudioTrack, proResProfile, x264Preset, pixelFormat, audioBitrate, videoBitrate, everyNthFrame, numberOfGifLoops, delayRenderTimeout, audioCodec, disallowParallelEncoding, chromiumOptions, envVariables, inputProps, offthreadVideoCacheSizeInBytes, colorSpace, multiProcessOnLinux, }) => {
77
79
  return callApi('/api/render', {
78
80
  compositionId,
79
81
  type: 'video',
@@ -108,6 +110,7 @@ const addVideoRenderJob = ({ compositionId, outName, imageFormat, jpegQuality, s
108
110
  }).serializedString,
109
111
  offthreadVideoCacheSizeInBytes,
110
112
  colorSpace,
113
+ multiProcessOnLinux,
111
114
  });
112
115
  };
113
116
  exports.addVideoRenderJob = addVideoRenderJob;
@@ -79,6 +79,7 @@ const SidebarRenderButton = ({ composition, visible }) => {
79
79
  inFrameMark: null,
80
80
  outFrameMark: null,
81
81
  initialColorSpace: defaults.colorSpace,
82
+ initialMultiProcessOnLinux: defaults.multiProcessOnLinux,
82
83
  });
83
84
  }, [
84
85
  composition.defaultProps,
@@ -36,6 +36,7 @@ export type RenderModalState = {
36
36
  initialHeadless: boolean;
37
37
  initialOffthreadVideoCacheSizeInBytes: number | null;
38
38
  initialColorSpace: ColorSpace;
39
+ initialMultiProcessOnLinux: boolean;
39
40
  minConcurrency: number;
40
41
  maxConcurrency: number;
41
42
  defaultProps: Record<string, unknown>;
@@ -34,7 +34,7 @@ export declare const getCliOptions: (options: {
34
34
  videoBitrate: string | null;
35
35
  height: number | null;
36
36
  width: number | null;
37
- configFileImageFormat: "png" | "jpeg" | "none" | undefined;
37
+ configFileImageFormat: "none" | "png" | "jpeg" | undefined;
38
38
  offthreadVideoCacheSizeInBytes: number | null;
39
39
  deleteAfter: ("1-day" | "3-days" | "7-days" | "30-days") | null;
40
40
  colorSpace: "default" | "bt709";
@@ -85,6 +85,7 @@ const getCliOptions = async (options) => {
85
85
  headless: config_1.ConfigInternals.getChromiumHeadlessMode(),
86
86
  gl: (_a = config_1.ConfigInternals.getChromiumOpenGlRenderer()) !== null && _a !== void 0 ? _a : renderer_1.RenderInternals.DEFAULT_OPENGL_RENDERER,
87
87
  userAgent: config_1.ConfigInternals.getChromiumUserAgent(),
88
+ enableMultiProcessOnLinux: config_1.ConfigInternals.getChromiumMultiProcessOnLinux(),
88
89
  };
89
90
  const everyNthFrame = config_1.ConfigInternals.getEveryNthFrame();
90
91
  const numberOfGifLoops = config_1.ConfigInternals.getNumberOfGifLoops();
package/dist/index.d.ts CHANGED
@@ -119,7 +119,7 @@ export declare const CliInternals: {
119
119
  videoBitrate: string | null;
120
120
  height: number | null;
121
121
  width: number | null;
122
- configFileImageFormat: "png" | "jpeg" | "none" | undefined;
122
+ configFileImageFormat: "none" | "png" | "jpeg" | undefined;
123
123
  offthreadVideoCacheSizeInBytes: number | null;
124
124
  deleteAfter: ("1-day" | "3-days" | "7-days" | "30-days") | null;
125
125
  colorSpace: "default" | "bt709";
@@ -131,7 +131,7 @@ export declare const CliInternals: {
131
131
  parsedCli: {
132
132
  "browser-executable": import("@remotion/renderer").BrowserExecutable;
133
133
  "pixel-format": "yuv420p" | "yuva420p" | "yuv422p" | "yuv444p" | "yuv420p10le" | "yuv422p10le" | "yuv444p10le" | "yuva444p10le";
134
- "image-format": "png" | "jpeg" | "pdf" | "webp" | "none";
134
+ "image-format": "none" | "png" | "jpeg" | "pdf" | "webp";
135
135
  "prores-profile": "4444-xq" | "4444" | "hq" | "standard" | "light" | "proxy";
136
136
  "x264-preset": "medium" | "ultrafast" | "superfast" | "veryfast" | "faster" | "fast" | "slow" | "slower" | "veryslow" | "placebo";
137
137
  "bundle-cache": string;
@@ -175,7 +175,7 @@ export declare const CliInternals: {
175
175
  runs: number;
176
176
  concurrencies: string;
177
177
  "enforce-audio-track": boolean;
178
- gl: "swangle" | "angle" | "egl" | "swiftshader";
178
+ gl: "swangle" | "angle" | "egl" | "swiftshader" | "vulkan";
179
179
  "package-manager": string;
180
180
  "webpack-poll": number;
181
181
  "no-open": boolean;
@@ -186,6 +186,7 @@ export declare const CliInternals: {
186
186
  "color-space": "default" | "bt709";
187
187
  "delete-after": string | undefined;
188
188
  "enable-folder-expiry": boolean | undefined;
189
+ "enable-multiprocess-on-linux": boolean;
189
190
  } & {
190
191
  _: string[];
191
192
  };
@@ -201,7 +202,7 @@ export declare const CliInternals: {
201
202
  downloadName: string | null;
202
203
  outName: string | null;
203
204
  configImageFormat: "png" | "jpeg" | "pdf" | "webp" | null;
204
- cliFlag: "png" | "jpeg" | "pdf" | "webp" | "none" | null;
205
+ cliFlag: "none" | "png" | "jpeg" | "pdf" | "webp" | null;
205
206
  isLambda: boolean;
206
207
  fromUi: "png" | "jpeg" | "pdf" | "webp" | null;
207
208
  }) => {
@@ -216,8 +217,8 @@ export declare const CliInternals: {
216
217
  };
217
218
  getVideoImageFormat: ({ codec, uiImageFormat, }: {
218
219
  codec: import("@remotion/renderer").CodecOrUndefined;
219
- uiImageFormat: "png" | "jpeg" | "none" | null;
220
- }) => "png" | "jpeg" | "none";
220
+ uiImageFormat: "none" | "png" | "jpeg" | null;
221
+ }) => "none" | "png" | "jpeg";
221
222
  printCompositions: (compositions: import("remotion").VideoConfig[]) => void;
222
223
  getFinalOutputCodec: ({ cliFlag, configFile, downloadName, outName, uiCodec, }: {
223
224
  cliFlag: import("@remotion/renderer").CodecOrUndefined;
@@ -1,5 +1,5 @@
1
1
  import type { AudioCodec, BrowserExecutable, Codec, OpenGlRenderer, PixelFormat, ProResProfile, StillImageFormat, VideoImageFormat, X264Preset } from '@remotion/renderer';
2
- import type { BrowserSafeApis } from '@remotion/renderer/client';
2
+ import { BrowserSafeApis } from '@remotion/renderer/client';
3
3
  type CommandLineOptions = {
4
4
  ['browser-executable']: BrowserExecutable;
5
5
  ['pixel-format']: PixelFormat;
@@ -60,6 +60,7 @@ type CommandLineOptions = {
60
60
  ['user-agent']: string;
61
61
  [BrowserSafeApis.options.deleteAfterOption.cliFlag]: string | undefined;
62
62
  [BrowserSafeApis.options.folderExpiryOption.cliFlag]: boolean | undefined;
63
+ [BrowserSafeApis.options.enableMultiprocessOnLinuxOption.cliFlag]: boolean;
63
64
  };
64
65
  export declare const BooleanFlags: string[];
65
66
  export declare const parsedCli: CommandLineOptions & {
@@ -5,6 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.quietFlagProvided = exports.parseCommandLine = exports.parsedCli = exports.BooleanFlags = void 0;
7
7
  const renderer_1 = require("@remotion/renderer");
8
+ const client_1 = require("@remotion/renderer/client");
8
9
  const minimist_1 = __importDefault(require("minimist"));
9
10
  const config_1 = require("./config");
10
11
  const log_1 = require("./log");
@@ -157,6 +158,9 @@ const parseCommandLine = () => {
157
158
  if (typeof exports.parsedCli['enable-folder-expiry'] !== 'undefined') {
158
159
  config_1.Config.setEnableFolderExpiry(exports.parsedCli['enable-folder-expiry']);
159
160
  }
161
+ if (typeof exports.parsedCli[client_1.BrowserSafeApis.options.enableMultiprocessOnLinuxOption.cliFlag] !== 'undefined') {
162
+ config_1.Config.setEnableFolderExpiry(exports.parsedCli[client_1.BrowserSafeApis.options.enableMultiprocessOnLinuxOption.cliFlag]);
163
+ }
160
164
  };
161
165
  exports.parseCommandLine = parseCommandLine;
162
166
  const quietFlagProvided = () => exports.parsedCli.quiet || exports.parsedCli.q;
@@ -11,5 +11,5 @@ type Range = {
11
11
  type Ranges = Range[] & {
12
12
  type?: string;
13
13
  };
14
- export declare function parseRange(size: number, str: string | string[]): -1 | Ranges | -2;
14
+ export declare function parseRange(size: number, str: string | string[]): -1 | -2 | Ranges;
15
15
  export {};
@@ -16,6 +16,8 @@ const getProjectInfo = (remotionRoot) => {
16
16
  'app/remotion/Root.tsx',
17
17
  'src/Video.tsx',
18
18
  'src/Video.jsx',
19
+ 'src/remotion/Root.tsx',
20
+ 'src/remotion/Root.jsx',
19
21
  ].map((p) => {
20
22
  return node_path_1.default.join(remotionRoot, p);
21
23
  });
@@ -75,6 +75,7 @@ export type RenderJob = {
75
75
  chromiumOptions: RequiredChromiumOptions;
76
76
  envVariables: Record<string, string>;
77
77
  serializedInputPropsWithCustomSchema: string;
78
+ multiProcessOnLinux: boolean;
78
79
  } & RenderJobDynamicFields;
79
80
  export type RenderJobWithCleanup = RenderJob & {
80
81
  cleanup: (() => void)[];
@@ -132,6 +133,7 @@ export type AddRenderRequest = {
132
133
  envVariables: Record<string, string>;
133
134
  serializedInputPropsWithCustomSchema: string;
134
135
  offthreadVideoCacheSizeInBytes: number | null;
136
+ multiProcessOnLinux: boolean;
135
137
  } & AddRenderRequestDynamicFields;
136
138
  export type RemoveRenderRequest = {
137
139
  jobId: string;
@@ -51,6 +51,7 @@ const makeRetryPayload = (job) => {
51
51
  outFrameMark: null,
52
52
  initialOffthreadVideoCacheSizeInBytes: job.offthreadVideoCacheSizeInBytes,
53
53
  initialColorSpace: defaults.colorSpace,
54
+ initialMultiProcessOnLinux: job.multiProcessOnLinux,
54
55
  };
55
56
  }
56
57
  if (job.type === 'sequence') {
@@ -95,6 +96,7 @@ const makeRetryPayload = (job) => {
95
96
  outFrameMark: job.endFrame,
96
97
  initialOffthreadVideoCacheSizeInBytes: job.offthreadVideoCacheSizeInBytes,
97
98
  initialColorSpace: defaults.colorSpace,
99
+ initialMultiProcessOnLinux: job.multiProcessOnLinux,
98
100
  };
99
101
  }
100
102
  if (job.type === 'video') {
@@ -139,6 +141,7 @@ const makeRetryPayload = (job) => {
139
141
  outFrameMark: job.endFrame,
140
142
  initialOffthreadVideoCacheSizeInBytes: job.offthreadVideoCacheSizeInBytes,
141
143
  initialColorSpace: job.colorSpace,
144
+ initialMultiProcessOnLinux: job.multiProcessOnLinux,
142
145
  };
143
146
  }
144
147
  throw new Error(`Job ${JSON.stringify(job)} Not implemented`);
@@ -45,6 +45,7 @@ const handleAddRender = ({ input, entryPoint, remotionRoot, }) => {
45
45
  serializedInputPropsWithCustomSchema: input.serializedInputPropsWithCustomSchema,
46
46
  offthreadVideoCacheSizeInBytes: input.offthreadVideoCacheSizeInBytes,
47
47
  colorSpace: input.colorSpace,
48
+ multiProcessOnLinux: input.multiProcessOnLinux,
48
49
  },
49
50
  });
50
51
  }
@@ -74,6 +75,7 @@ const handleAddRender = ({ input, entryPoint, remotionRoot, }) => {
74
75
  envVariables: input.envVariables,
75
76
  serializedInputPropsWithCustomSchema: input.serializedInputPropsWithCustomSchema,
76
77
  offthreadVideoCacheSizeInBytes: input.offthreadVideoCacheSizeInBytes,
78
+ multiProcessOnLinux: input.multiProcessOnLinux,
77
79
  },
78
80
  });
79
81
  }
@@ -99,6 +101,7 @@ const handleAddRender = ({ input, entryPoint, remotionRoot, }) => {
99
101
  envVariables: input.envVariables,
100
102
  serializedInputPropsWithCustomSchema: input.serializedInputPropsWithCustomSchema,
101
103
  offthreadVideoCacheSizeInBytes: input.offthreadVideoCacheSizeInBytes,
104
+ multiProcessOnLinux: input.multiProcessOnLinux,
102
105
  },
103
106
  entryPoint,
104
107
  remotionRoot,
@@ -57,6 +57,7 @@ const handleFallback = async ({ remotionRoot, hash, response, getCurrentInputPro
57
57
  const colorSpace = config_1.ConfigInternals.getColorSpace();
58
58
  const maxConcurrency = renderer_1.RenderInternals.getMaxConcurrency();
59
59
  const minConcurrency = renderer_1.RenderInternals.getMinConcurrency();
60
+ const multiProcessOnLinux = config_1.ConfigInternals.getChromiumMultiProcessOnLinux();
60
61
  response.setHeader('content-type', 'text/html');
61
62
  response.writeHead(200);
62
63
  const packageManager = (0, get_package_manager_1.getPackageManager)(remotionRoot, undefined);
@@ -101,6 +102,7 @@ const handleFallback = async ({ remotionRoot, hash, response, getCurrentInputPro
101
102
  openGlRenderer,
102
103
  offthreadVideoCacheSizeInBytes,
103
104
  colorSpace,
105
+ multiProcessOnLinux,
104
106
  },
105
107
  publicFolderExists: (0, node_fs_1.existsSync)(publicDir) ? publicDir : null,
106
108
  }));
@@ -171,6 +171,7 @@ const renderVideoFlow = async ({ remotionRoot, fullEntryPoint, indent, logLevel,
171
171
  height: config.height,
172
172
  codec,
173
173
  scale,
174
+ wantsImageSequence: shouldOutputImageSequence,
174
175
  });
175
176
  const relativeOutputLocation = (0, get_filename_1.getOutputFilename)({
176
177
  imageSequence: shouldOutputImageSequence,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remotion/cli",
3
- "version": "4.0.40",
3
+ "version": "4.0.42",
4
4
  "description": "CLI for Remotion",
5
5
  "main": "dist/index.js",
6
6
  "sideEffects": false,
@@ -35,11 +35,11 @@
35
35
  "prompts": "2.4.1",
36
36
  "semver": "7.5.3",
37
37
  "source-map": "0.6.1",
38
- "@remotion/media-utils": "4.0.40",
39
- "@remotion/renderer": "4.0.40",
40
- "remotion": "4.0.40",
41
- "@remotion/bundler": "4.0.40",
42
- "@remotion/player": "4.0.40"
38
+ "@remotion/renderer": "4.0.42",
39
+ "remotion": "4.0.42",
40
+ "@remotion/bundler": "4.0.42",
41
+ "@remotion/media-utils": "4.0.42",
42
+ "@remotion/player": "4.0.42"
43
43
  },
44
44
  "peerDependencies": {
45
45
  "react": ">=16.8.0",
@@ -65,8 +65,8 @@
65
65
  "react-dom": "^18.0.0",
66
66
  "vitest": "0.31.1",
67
67
  "zod": "^3.21.4",
68
- "@remotion/zod-types": "4.0.40",
69
- "@remotion/tailwind": "4.0.40"
68
+ "@remotion/zod-types": "4.0.42",
69
+ "@remotion/tailwind": "4.0.42"
70
70
  },
71
71
  "keywords": [
72
72
  "remotion",
@@ -1,3 +0,0 @@
1
- import type { x264Preset } from '@remotion/renderer';
2
- export declare const getPresetProfile: () => x264Preset | undefined;
3
- export declare const setPresetProfile: (profile: x264Preset | undefined) => void;
@@ -1,12 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.setPresetProfile = exports.getPresetProfile = void 0;
4
- let preset;
5
- const getPresetProfile = () => {
6
- return preset;
7
- };
8
- exports.getPresetProfile = getPresetProfile;
9
- const setPresetProfile = (profile) => {
10
- preset = profile;
11
- };
12
- exports.setPresetProfile = setPresetProfile;
@@ -1,2 +0,0 @@
1
- import type { LogLevel } from '@remotion/renderer';
2
- export declare const handleCommonError: (err: Error, logLevel: LogLevel) => Promise<void>;
@@ -1,60 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.handleCommonError = void 0;
4
- const chalk_1 = require("./chalk");
5
- const log_1 = require("./log");
6
- const print_error_1 = require("./print-error");
7
- const truthy_1 = require("./truthy");
8
- const handleCommonError = async (err, logLevel) => {
9
- var _a;
10
- await (0, print_error_1.printError)(err, logLevel);
11
- if (err.message.includes('Could not play video with')) {
12
- log_1.Log.info();
13
- log_1.Log.info('💡 Get help for this issue at https://remotion.dev/docs/media-playback-error');
14
- }
15
- if (err.message.includes('A delayRender()') &&
16
- err.message.includes('was called but not cleared after')) {
17
- log_1.Log.info();
18
- log_1.Log.info('💡 Get help for this issue at https://remotion.dev/docs/timeout');
19
- }
20
- if (err.message.includes('Target closed')) {
21
- log_1.Log.info();
22
- log_1.Log.info('💡 Get help for this issue at https://remotion.dev/docs/target-closed');
23
- }
24
- if (err.message.includes('ENAMETOOLONG')) {
25
- log_1.Log.info();
26
- log_1.Log.info('💡 Get help for this issue at https://remotion.dev/docs/enametoolong');
27
- }
28
- if (err.message.includes('Error creating WebGL context')) {
29
- log_1.Log.info();
30
- log_1.Log.warn('💡 You might need to set the OpenGL renderer to "angle" (or "swangle" if rendering on lambda). Learn why at https://www.remotion.dev/docs/three');
31
- log_1.Log.warn("💡 Check how it's done at https://www.remotion.dev/docs/chromium-flags#--gl");
32
- }
33
- if (err.message.includes('The bucket does not allow ACLs')) {
34
- log_1.Log.info();
35
- log_1.Log.info(chalk_1.chalk.green('💡 Fix this issue https://remotion.dev/docs/lambda/troubleshooting/bucket-disallows-acl'));
36
- }
37
- if (err.message.includes('Minified React error #306')) {
38
- const componentName = (_a = err.message.match(/<\w+>/)) === null || _a === void 0 ? void 0 : _a[0];
39
- log_1.Log.info([
40
- '💡 This error indicates that the component',
41
- componentName ? `(${componentName})` : null,
42
- 'you are trying to render is not imported correctly.',
43
- ]
44
- .filter(truthy_1.truthy)
45
- .join(' '));
46
- log_1.Log.info();
47
- log_1.Log.info(' Check the root file and ensure that the component is not undefined.');
48
- log_1.Log.info(' Oftentimes, this happens if the component is missing the `export` keyword');
49
- log_1.Log.info(' or if the component was renamed and the import statement not properly adjusted.');
50
- }
51
- if (err.message.includes('GLIBC_')) {
52
- log_1.Log.info('💡 Remotion requires at least Libc 2.35.');
53
- log_1.Log.info('💡 Get help for this issue: https://github.com/remotion-dev/remotion/issues/2439');
54
- }
55
- if (err.message.includes('EBADF')) {
56
- log_1.Log.info('💡 This error might be fixed by changing your Node version:');
57
- log_1.Log.info(' https://github.com/remotion-dev/remotion/issues/2452');
58
- }
59
- };
60
- exports.handleCommonError = handleCommonError;