@remotion/cli 4.0.77 → 4.0.81

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 (100) hide show
  1. package/dist/benchmark.js +3 -1
  2. package/dist/cloudrun-command.js +3 -4
  3. package/dist/config/bitrate.d.ts +4 -0
  4. package/dist/config/bitrate.js +22 -1
  5. package/dist/config/image-format.d.ts +1 -1
  6. package/dist/config/index.d.ts +12 -2
  7. package/dist/config/index.js +7 -4
  8. package/dist/download-progress.d.ts +1 -1
  9. package/dist/download-progress.js +2 -2
  10. package/dist/editor/components/Modals.js +1 -1
  11. package/dist/editor/components/RenderButton.js +3 -0
  12. package/dist/editor/components/RenderModal/CrfSetting.d.ts +3 -2
  13. package/dist/editor/components/RenderModal/EnforceAudioTrackSetting.d.ts +0 -2
  14. package/dist/editor/components/RenderModal/EnforceAudioTrackSetting.js +3 -4
  15. package/dist/editor/components/RenderModal/JpegQualitySetting.js +1 -2
  16. package/dist/editor/components/RenderModal/MutedSetting.d.ts +0 -2
  17. package/dist/editor/components/RenderModal/MutedSetting.js +3 -4
  18. package/dist/editor/components/RenderModal/NumberSetting.d.ts +2 -2
  19. package/dist/editor/components/RenderModal/NumberSetting.js +2 -3
  20. package/dist/editor/components/RenderModal/OptionExplainerBubble.d.ts +5 -0
  21. package/dist/editor/components/RenderModal/OptionExplainerBubble.js +12 -0
  22. package/dist/editor/components/RenderModal/RenderModal.d.ts +3 -0
  23. package/dist/editor/components/RenderModal/RenderModal.js +15 -4
  24. package/dist/editor/components/RenderModal/RenderModalAdvanced.d.ts +2 -0
  25. package/dist/editor/components/RenderModal/RenderModalAdvanced.js +19 -5
  26. package/dist/editor/components/RenderModal/RenderModalAudio.js +4 -4
  27. package/dist/editor/components/RenderModal/RenderModalBasic.js +2 -3
  28. package/dist/editor/components/RenderModal/RenderModalPicture.d.ts +4 -0
  29. package/dist/editor/components/RenderModal/RenderModalPicture.js +19 -5
  30. package/dist/editor/components/RenderModal/ScaleSetting.js +1 -2
  31. package/dist/editor/components/RenderModal/SchemaEditor/SchemaLabel.d.ts +1 -0
  32. package/dist/editor/components/RenderModal/SchemaEditor/SchemaLabel.js +19 -4
  33. package/dist/editor/components/RenderModal/SchemaEditor/SchemaSeparationLine.d.ts +8 -0
  34. package/dist/editor/components/RenderModal/SchemaEditor/SchemaSeparationLine.js +70 -2
  35. package/dist/editor/components/RenderModal/SchemaEditor/SchemaVerticalGuide.d.ts +1 -1
  36. package/dist/editor/components/RenderModal/SchemaEditor/SchemaVerticalGuide.js +23 -5
  37. package/dist/editor/components/RenderModal/SchemaEditor/ZodArrayEditor.js +12 -22
  38. package/dist/editor/components/RenderModal/SchemaEditor/ZodArrayItemEditor.js +6 -1
  39. package/dist/editor/components/RenderModal/SchemaEditor/ZodBooleanEditor.js +1 -1
  40. package/dist/editor/components/RenderModal/SchemaEditor/ZodColorEditor.js +1 -1
  41. package/dist/editor/components/RenderModal/SchemaEditor/ZodDateEditor.js +1 -1
  42. package/dist/editor/components/RenderModal/SchemaEditor/ZodDiscriminatedUnionEditor.js +1 -1
  43. package/dist/editor/components/RenderModal/SchemaEditor/ZodEnumEditor.js +1 -1
  44. package/dist/editor/components/RenderModal/SchemaEditor/ZodNonEditableValue.js +1 -1
  45. package/dist/editor/components/RenderModal/SchemaEditor/ZodNumberEditor.js +1 -1
  46. package/dist/editor/components/RenderModal/SchemaEditor/ZodObjectEditor.js +13 -5
  47. package/dist/editor/components/RenderModal/SchemaEditor/ZodOrNullishEditor.js +1 -1
  48. package/dist/editor/components/RenderModal/SchemaEditor/ZodStaticFileEditor.js +1 -1
  49. package/dist/editor/components/RenderModal/SchemaEditor/ZodStringEditor.js +1 -1
  50. package/dist/editor/components/RenderModal/SchemaEditor/ZodTextareaEditor.js +1 -1
  51. package/dist/editor/components/RenderModal/layout.d.ts +1 -0
  52. package/dist/editor/components/RenderModal/layout.js +6 -3
  53. package/dist/editor/components/RenderQueue/actions.d.ts +3 -1
  54. package/dist/editor/components/RenderQueue/actions.js +3 -1
  55. package/dist/editor/components/SidebarRenderButton.js +3 -0
  56. package/dist/editor/helpers/colors.d.ts +1 -0
  57. package/dist/editor/helpers/colors.js +2 -1
  58. package/dist/editor/helpers/render-modal-sections.d.ts +0 -1
  59. package/dist/editor/state/modals.d.ts +3 -0
  60. package/dist/get-cli-options.d.ts +4 -2
  61. package/dist/get-cli-options.js +4 -0
  62. package/dist/get-composition-id.js +2 -2
  63. package/dist/get-env.js +2 -2
  64. package/dist/get-render-defaults.d.ts +2 -0
  65. package/dist/get-render-defaults.js +71 -0
  66. package/dist/index.d.ts +13 -9
  67. package/dist/index.js +4 -4
  68. package/dist/lambda-command.js +3 -4
  69. package/dist/list-of-remotion-packages.js +1 -0
  70. package/dist/make-on-download.d.ts +1 -1
  71. package/dist/make-on-download.js +4 -2
  72. package/dist/parse-command-line.d.ts +6 -2
  73. package/dist/parse-command-line.js +6 -0
  74. package/dist/preview-server/render-queue/job.d.ts +4 -0
  75. package/dist/preview-server/render-queue/make-retry-payload.js +9 -0
  76. package/dist/preview-server/render-queue/process-video.js +2 -0
  77. package/dist/preview-server/routes/add-render.js +2 -0
  78. package/dist/preview-server/routes.d.ts +0 -1
  79. package/dist/preview-server/routes.js +6 -0
  80. package/dist/progress-bar.d.ts +1 -9
  81. package/dist/progress-bar.js +3 -4
  82. package/dist/progress-types.d.ts +1 -31
  83. package/dist/render-flows/render.d.ts +4 -2
  84. package/dist/render-flows/render.js +3 -1
  85. package/dist/render-flows/still.d.ts +1 -1
  86. package/dist/render-queue/process-still.d.ts +8 -0
  87. package/dist/render-queue/process-still.js +49 -0
  88. package/dist/render-queue/process-video.d.ts +10 -0
  89. package/dist/render-queue/process-video.js +70 -0
  90. package/dist/render-queue/queue.d.ts +11 -0
  91. package/dist/render-queue/queue.js +220 -0
  92. package/dist/render.js +3 -1
  93. package/dist/setup-cache.d.ts +1 -1
  94. package/dist/studio.js +30 -102
  95. package/dist/upgrade.js +4 -5
  96. package/dist/user-passed-output-location.js +2 -2
  97. package/package.json +10 -14
  98. package/styles/styles.css +0 -123
  99. package/types/global.d.ts +0 -4
  100. package/web/favicon.png +0 -0
package/dist/benchmark.js CHANGED
@@ -96,7 +96,7 @@ const benchmarkCommand = async (remotionRoot, args, logLevel) => {
96
96
  process.exit(1);
97
97
  }
98
98
  const fullEntryPoint = (0, convert_entry_point_to_serve_url_1.convertEntryPointToServeUrl)(file);
99
- const { inputProps, envVariables, browserExecutable, chromiumOptions, puppeteerTimeout, browser, scale, publicDir, proResProfile, x264Preset, frameRange: defaultFrameRange, overwrite, jpegQuality, crf: configFileCrf, pixelFormat, scale: configFileScale, numberOfGifLoops, everyNthFrame, muted, enforceAudioTrack, ffmpegOverride, audioBitrate, videoBitrate, height, width, concurrency: unparsedConcurrency, offthreadVideoCacheSizeInBytes, colorSpace, } = await (0, get_cli_options_1.getCliOptions)({
99
+ const { inputProps, envVariables, browserExecutable, chromiumOptions, puppeteerTimeout, browser, scale, publicDir, proResProfile, x264Preset, frameRange: defaultFrameRange, overwrite, jpegQuality, crf: configFileCrf, pixelFormat, scale: configFileScale, numberOfGifLoops, everyNthFrame, muted, enforceAudioTrack, ffmpegOverride, audioBitrate, videoBitrate, encodingMaxRate, encodingBufferSize, height, width, concurrency: unparsedConcurrency, offthreadVideoCacheSizeInBytes, colorSpace, } = await (0, get_cli_options_1.getCliOptions)({
100
100
  isLambda: false,
101
101
  type: 'series',
102
102
  remotionRoot,
@@ -222,6 +222,8 @@ const benchmarkCommand = async (remotionRoot, args, logLevel) => {
222
222
  codec,
223
223
  audioBitrate,
224
224
  videoBitrate,
225
+ encodingMaxRate,
226
+ encodingBufferSize,
225
227
  puppeteerInstance,
226
228
  concurrency: con,
227
229
  audioCodec: null,
@@ -1,9 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.cloudrunCommand = void 0;
4
+ const studio_1 = require("@remotion/studio");
4
5
  const log_1 = require("./log");
5
- const get_package_manager_1 = require("./preview-server/get-package-manager");
6
- const update_available_1 = require("./preview-server/update-available");
7
6
  const cloudrunCommand = async (remotionRoot, args, logLevel) => {
8
7
  try {
9
8
  const path = require.resolve('@remotion/cloudrun', {
@@ -14,13 +13,13 @@ const cloudrunCommand = async (remotionRoot, args, logLevel) => {
14
13
  process.exit(0);
15
14
  }
16
15
  catch (err) {
17
- const manager = (0, get_package_manager_1.getPackageManager)(remotionRoot, undefined);
16
+ const manager = studio_1.StudioInternals.getPackageManager(remotionRoot, undefined);
18
17
  const installCommand = manager === 'unknown' ? 'npm i' : manager.installCommand;
19
18
  log_1.Log.error(err);
20
19
  log_1.Log.error('Remotion Cloud Run is not installed.');
21
20
  log_1.Log.infoAdvanced({ indent: false, logLevel }, '');
22
21
  log_1.Log.infoAdvanced({ indent: false, logLevel }, 'You can install it using:');
23
- log_1.Log.infoAdvanced({ indent: false, logLevel }, `${installCommand} @remotion/cloudrun@${(0, update_available_1.getRemotionVersion)()}`);
22
+ log_1.Log.infoAdvanced({ indent: false, logLevel }, `${installCommand} @remotion/cloudrun@${studio_1.StudioInternals.getRemotionVersion()}`);
24
23
  process.exit(1);
25
24
  }
26
25
  };
@@ -2,3 +2,7 @@ export declare const setAudioBitrate: (bitrate: string | null) => void;
2
2
  export declare const getAudioBitrate: () => string | null;
3
3
  export declare const setVideoBitrate: (bitrate: string | null) => void;
4
4
  export declare const getVideoBitrate: () => string | null;
5
+ export declare const setEncodingMaxRate: (bitrate: string | null) => void;
6
+ export declare const getEncodingMaxRate: () => string | null;
7
+ export declare const setEncodingBufferSize: (bitrate: string | null) => void;
8
+ export declare const getEncodingBufferSize: () => string | null;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getVideoBitrate = exports.setVideoBitrate = exports.getAudioBitrate = exports.setAudioBitrate = void 0;
3
+ exports.getEncodingBufferSize = exports.setEncodingBufferSize = exports.getEncodingMaxRate = exports.setEncodingMaxRate = exports.getVideoBitrate = exports.setVideoBitrate = exports.getAudioBitrate = exports.setAudioBitrate = void 0;
4
4
  let audioBitrate = null;
5
5
  const setAudioBitrate = (bitrate) => {
6
6
  audioBitrate = bitrate;
@@ -19,3 +19,24 @@ const getVideoBitrate = () => {
19
19
  return videoBitrate;
20
20
  };
21
21
  exports.getVideoBitrate = getVideoBitrate;
22
+ let encodingMaxRate = null;
23
+ const setEncodingMaxRate = (bitrate) => {
24
+ encodingMaxRate = bitrate;
25
+ };
26
+ exports.setEncodingMaxRate = setEncodingMaxRate;
27
+ const getEncodingMaxRate = () => {
28
+ return encodingMaxRate;
29
+ };
30
+ exports.getEncodingMaxRate = getEncodingMaxRate;
31
+ /**
32
+ * encodingBufferSize is not a bitrate, but it is a bitrate-related option and get validated like a bitrate.
33
+ */
34
+ let encodingBufferSize = null;
35
+ const setEncodingBufferSize = (bitrate) => {
36
+ encodingBufferSize = bitrate;
37
+ };
38
+ exports.setEncodingBufferSize = setEncodingBufferSize;
39
+ const getEncodingBufferSize = () => {
40
+ return encodingBufferSize;
41
+ };
42
+ exports.getEncodingBufferSize = getEncodingBufferSize;
@@ -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: () => "none" | "png" | "jpeg" | undefined;
5
+ export declare const getUserPreferredVideoImageFormat: () => "png" | "jpeg" | "none" | undefined;
@@ -250,6 +250,14 @@ declare global {
250
250
  * Mutually exclusive with setCrf().
251
251
  */
252
252
  readonly setVideoBitrate: (bitrate: string | null) => void;
253
+ /**
254
+ * Set a maximum bitrate to be passed to FFmpeg.
255
+ */
256
+ readonly setEncodingMaxRate: (bitrate: string | null) => void;
257
+ /**
258
+ * Set a buffer size to be passed to FFmpeg.
259
+ */
260
+ readonly setEncodingBufferSize: (bitrate: string | null) => void;
253
261
  /**
254
262
  * Opt into bt709 rendering.
255
263
  */
@@ -307,7 +315,7 @@ export declare const ConfigInternals: {
307
315
  getBrowser: () => null;
308
316
  getPixelFormat: () => "yuv420p" | "yuva420p" | "yuv422p" | "yuv444p" | "yuv420p10le" | "yuv422p10le" | "yuv444p10le" | "yuva444p10le";
309
317
  getProResProfile: () => "4444-xq" | "4444" | "hq" | "standard" | "light" | "proxy" | undefined;
310
- getPresetProfile: () => "medium" | "ultrafast" | "superfast" | "veryfast" | "faster" | "fast" | "slow" | "slower" | "veryslow" | "placebo" | undefined;
318
+ getPresetProfile: () => "ultrafast" | "superfast" | "veryfast" | "faster" | "fast" | "medium" | "slow" | "slower" | "veryslow" | "placebo" | undefined;
311
319
  getShouldOverwrite: ({ defaultValue, }: {
312
320
  defaultValue: boolean;
313
321
  }) => boolean;
@@ -329,7 +337,7 @@ export declare const ConfigInternals: {
329
337
  getShouldOutputImageSequence: (frameRange: FrameRange | null) => boolean;
330
338
  getDotEnvLocation: () => string | null;
331
339
  getUserPreferredStillImageFormat: () => "png" | "jpeg" | "pdf" | "webp" | undefined;
332
- getUserPreferredVideoImageFormat: () => "none" | "png" | "jpeg" | undefined;
340
+ getUserPreferredVideoImageFormat: () => "png" | "jpeg" | "none" | undefined;
333
341
  getWebpackOverrideFn: () => WebpackOverrideFn;
334
342
  getWebpackCaching: () => boolean;
335
343
  getOutputLocation: () => string | null;
@@ -347,6 +355,8 @@ export declare const ConfigInternals: {
347
355
  getFfmpegOverrideFunction: () => import("@remotion/renderer").FfmpegOverrideFn;
348
356
  getAudioBitrate: () => string | null;
349
357
  getVideoBitrate: () => string | null;
358
+ getEncodingBufferSize: () => string | null;
359
+ getEncodingMaxRate: () => string | null;
350
360
  getHeight: () => number | null;
351
361
  getWidth: () => number | null;
352
362
  getCrfOrUndefined: () => Crf;
@@ -36,7 +36,6 @@ const image_format_1 = require("./image-format");
36
36
  const image_sequence_1 = require("./image-sequence");
37
37
  const jpeg_quality_1 = require("./jpeg-quality");
38
38
  const Logging = __importStar(require("./log"));
39
- const max_timeline_tracks_1 = require("./max-timeline-tracks");
40
39
  const output_location_1 = require("./output-location");
41
40
  const override_webpack_1 = require("./override-webpack");
42
41
  const overwrite_1 = require("./overwrite");
@@ -49,6 +48,7 @@ const still_frame_1 = require("./still-frame");
49
48
  const timeout_1 = require("./timeout");
50
49
  const webpack_caching_1 = require("./webpack-caching");
51
50
  const x264_preset_1 = require("./x264-preset");
51
+ const studio_1 = require("@remotion/studio");
52
52
  const audio_codec_1 = require("./audio-codec");
53
53
  const bitrate_1 = require("./bitrate");
54
54
  const browser_executable_2 = require("./browser-executable");
@@ -68,7 +68,6 @@ const image_sequence_2 = require("./image-sequence");
68
68
  const jpeg_quality_2 = require("./jpeg-quality");
69
69
  const keyboard_shortcuts_1 = require("./keyboard-shortcuts");
70
70
  const log_1 = require("./log");
71
- const max_timeline_tracks_2 = require("./max-timeline-tracks");
72
71
  const muted_1 = require("./muted");
73
72
  const number_of_gif_loops_1 = require("./number-of-gif-loops");
74
73
  const number_of_shared_audio_tags_1 = require("./number-of-shared-audio-tags");
@@ -107,7 +106,7 @@ exports.Config = {
107
106
  get Puppeteer() {
108
107
  throw new Error('The config format has changed. Change `Config.Puppeteer.*()` calls to `Config.*()` in your config file.');
109
108
  },
110
- setMaxTimelineTracks: max_timeline_tracks_2.setMaxTimelineTracks,
109
+ setMaxTimelineTracks: studio_1.StudioInternals.setMaxTimelineTracks,
111
110
  setKeyboardShortcutsEnabled: keyboard_shortcuts_1.setKeyboardShortcutsEnabled,
112
111
  setNumberOfSharedAudioTags: number_of_shared_audio_tags_1.setNumberOfSharedAudioTags,
113
112
  setWebpackPollingInMilliseconds: webpack_poll_1.setWebpackPollingInMilliseconds,
@@ -140,6 +139,8 @@ exports.Config = {
140
139
  setJpegQuality: jpeg_quality_2.setJpegQuality,
141
140
  setStillImageFormat: image_format_1.setStillImageFormat,
142
141
  setVideoImageFormat: image_format_1.setVideoImageFormat,
142
+ setEncodingMaxRate: bitrate_1.setEncodingMaxRate,
143
+ setEncodingBufferSize: bitrate_1.setEncodingBufferSize,
143
144
  setFrameRange: frame_range_2.setFrameRange,
144
145
  setScale: scale_2.setScale,
145
146
  setEveryNthFrame: every_nth_frame_1.setEveryNthFrame,
@@ -198,7 +199,7 @@ exports.ConfigInternals = {
198
199
  Logging,
199
200
  setFrameRangeFromCli: frame_range_1.setFrameRangeFromCli,
200
201
  setStillFrame: still_frame_1.setStillFrame,
201
- getMaxTimelineTracks: max_timeline_tracks_1.getMaxTimelineTracks,
202
+ getMaxTimelineTracks: studio_1.StudioInternals.getMaxTimelineTracks,
202
203
  defaultOverrideFunction: override_webpack_1.defaultOverrideFunction,
203
204
  setMuted: muted_1.setMuted,
204
205
  getMuted: muted_1.getMuted,
@@ -209,6 +210,8 @@ exports.ConfigInternals = {
209
210
  getFfmpegOverrideFunction: ffmpeg_override_1.getFfmpegOverrideFunction,
210
211
  getAudioBitrate: bitrate_1.getAudioBitrate,
211
212
  getVideoBitrate: bitrate_1.getVideoBitrate,
213
+ getEncodingBufferSize: bitrate_1.getEncodingBufferSize,
214
+ getEncodingMaxRate: bitrate_1.getEncodingMaxRate,
212
215
  getHeight: height_1.getHeight,
213
216
  getWidth: width_1.getWidth,
214
217
  getCrfOrUndefined: crf_1.getCrfOrUndefined,
@@ -1,3 +1,3 @@
1
- import type { DownloadProgress } from './progress-types';
1
+ import type { DownloadProgress } from '@remotion/studio';
2
2
  export declare const getFileSizeDownloadBar: (downloaded: number) => string;
3
3
  export declare const makeMultiDownloadProgress: (progresses: DownloadProgress[]) => string | null;
@@ -1,12 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.makeMultiDownloadProgress = exports.getFileSizeDownloadBar = void 0;
4
- const format_bytes_1 = require("./format-bytes");
4
+ const studio_1 = require("@remotion/studio");
5
5
  const make_progress_bar_1 = require("./make-progress-bar");
6
6
  const truthy_1 = require("./truthy");
7
7
  const getFileSizeDownloadBar = (downloaded) => {
8
8
  const desiredLength = (0, make_progress_bar_1.makeProgressBar)(0).length;
9
- return `[${(0, format_bytes_1.formatBytes)(downloaded).padEnd(desiredLength - 2, ' ')}]`;
9
+ return `[${studio_1.StudioInternals.formatBytes(downloaded).padEnd(desiredLength - 2, ' ')}]`;
10
10
  };
11
11
  exports.getFileSizeDownloadBar = getFileSizeDownloadBar;
12
12
  const makeMultiDownloadProgress = (progresses) => {
@@ -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, initialScale: modalContextType.initialScale, initialLogLevel: modalContextType.initialLogLevel, initialOffthreadVideoCacheSizeInBytes: modalContextType.initialOffthreadVideoCacheSizeInBytes, 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, 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, defaultConfigurationAudioCodec: modalContextType.defaultConfigurationAudioCodec, defaultConfigurationVideoCodec: modalContextType.defaultConfigurationVideoCodec })), 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, initialScale: modalContextType.initialScale, initialLogLevel: modalContextType.initialLogLevel, initialOffthreadVideoCacheSizeInBytes: modalContextType.initialOffthreadVideoCacheSizeInBytes, 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, initialEnvVariables: modalContextType.initialEnvVariables, initialDisableWebSecurity: modalContextType.initialDisableWebSecurity, initialGl: modalContextType.initialOpenGlRenderer, initialHeadless: modalContextType.initialHeadless, initialIgnoreCertificateErrors: modalContextType.initialIgnoreCertificateErrors, initialEncodingBufferSize: modalContextType.initialEncodingBufferSize, initialEncodingMaxRate: modalContextType.initialEncodingMaxRate, initialUserAgent: modalContextType.initialUserAgent, initialColorSpace: modalContextType.initialColorSpace, initialMultiProcessOnLinux: modalContextType.initialMultiProcessOnLinux, defaultProps: modalContextType.defaultProps, inFrameMark: modalContextType.inFrameMark, outFrameMark: modalContextType.outFrameMark, defaultConfigurationAudioCodec: modalContextType.defaultConfigurationAudioCodec, defaultConfigurationVideoCodec: modalContextType.defaultConfigurationVideoCodec })), 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, knownBugs: modalContextType.knownBugs })), modalContextType && modalContextType.type === 'quick-switcher' && ((0, jsx_runtime_1.jsx)(QuickSwitcher_1.default, { invocationTimestamp: modalContextType.invocationTimestamp, initialMode: modalContextType.mode }))] }));
22
22
  };
@@ -84,6 +84,9 @@ const RenderButton = () => {
84
84
  initialColorSpace: defaults.colorSpace,
85
85
  initialMultiProcessOnLinux: defaults.multiProcessOnLinux,
86
86
  defaultConfigurationVideoCodec: defaults.codec,
87
+ initialEncodingBufferSize: defaults.encodingBufferSize,
88
+ initialEncodingMaxRate: defaults.encodingMaxRate,
89
+ initialUserAgent: defaults.userAgent,
87
90
  });
88
91
  }, [video, setSelectedModal, frame, props, inFrame, outFrame]);
89
92
  if (!video) {
@@ -1,5 +1,6 @@
1
1
  /// <reference types="react" />
2
- import type { AnyRemotionOption, Codec } from '@remotion/renderer';
2
+ import type { Codec } from '@remotion/renderer';
3
+ import type { AvailableOptions } from '@remotion/renderer/client';
3
4
  export declare const useCrfState: (codec: Codec) => {
4
5
  crf: number;
5
6
  setCrf: import("react").Dispatch<import("react").SetStateAction<number>>;
@@ -11,5 +12,5 @@ export declare const CrfSetting: React.FC<{
11
12
  setCrf: React.Dispatch<React.SetStateAction<number>>;
12
13
  min: number;
13
14
  max: number;
14
- option: AnyRemotionOption;
15
+ option: AvailableOptions;
15
16
  }>;
@@ -1,8 +1,6 @@
1
- import type { AnyRemotionOption } from '@remotion/renderer';
2
1
  import React from 'react';
3
2
  export declare const EnforceAudioTrackSetting: React.FC<{
4
3
  enforceAudioTrack: boolean;
5
4
  setEnforceAudioTrack: React.Dispatch<React.SetStateAction<boolean>>;
6
5
  muted: boolean;
7
- option: AnyRemotionOption;
8
6
  }>;
@@ -5,13 +5,12 @@ const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
6
  const Checkbox_1 = require("../Checkbox");
7
7
  const layout_1 = require("../layout");
8
- const InfoBubble_1 = require("./InfoBubble");
9
8
  const layout_2 = require("./layout");
10
- const OptionExplainer_1 = require("./OptionExplainer");
11
- const EnforceAudioTrackSetting = ({ enforceAudioTrack, muted, setEnforceAudioTrack, option }) => {
9
+ const OptionExplainerBubble_1 = require("./OptionExplainerBubble");
10
+ const EnforceAudioTrackSetting = ({ enforceAudioTrack, muted, setEnforceAudioTrack }) => {
12
11
  const onEnforceAudioTrackChanged = (0, react_1.useCallback)((e) => {
13
12
  setEnforceAudioTrack(e.target.checked);
14
13
  }, [setEnforceAudioTrack]);
15
- return ((0, jsx_runtime_1.jsxs)("div", { style: layout_2.optionRow, children: [(0, jsx_runtime_1.jsxs)("div", { style: layout_2.label, children: ["Enforce Audio Track", (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 0.5 }), (0, jsx_runtime_1.jsx)(InfoBubble_1.InfoBubble, { title: "Learn more about this option", children: (0, jsx_runtime_1.jsx)(OptionExplainer_1.OptionExplainer, { option: option }) })] }), (0, jsx_runtime_1.jsx)("div", { style: layout_2.rightRow, children: (0, jsx_runtime_1.jsx)(Checkbox_1.Checkbox, { disabled: muted && !enforceAudioTrack, checked: enforceAudioTrack, onChange: onEnforceAudioTrackChanged, name: "enforce-audio-track" }) })] }));
14
+ return ((0, jsx_runtime_1.jsxs)("div", { style: layout_2.optionRow, children: [(0, jsx_runtime_1.jsxs)("div", { style: layout_2.label, children: ["Enforce Audio Track", (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 0.5 }), (0, jsx_runtime_1.jsx)(OptionExplainerBubble_1.OptionExplainerBubble, { id: "enforceAudioOption" })] }), (0, jsx_runtime_1.jsx)("div", { style: layout_2.rightRow, children: (0, jsx_runtime_1.jsx)(Checkbox_1.Checkbox, { disabled: muted && !enforceAudioTrack, checked: enforceAudioTrack, onChange: onEnforceAudioTrackChanged, name: "enforce-audio-track" }) })] }));
16
15
  };
17
16
  exports.EnforceAudioTrackSetting = EnforceAudioTrackSetting;
@@ -2,11 +2,10 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.JpegQualitySetting = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
- const client_1 = require("@remotion/renderer/client");
6
5
  const NumberSetting_1 = require("./NumberSetting");
7
6
  const MIN_JPEG_QUALITY = 1;
8
7
  const MAX_JPEG_QUALITY = 100;
9
8
  const JpegQualitySetting = ({ jpegQuality, setJpegQuality }) => {
10
- return ((0, jsx_runtime_1.jsx)(NumberSetting_1.NumberSetting, { min: MIN_JPEG_QUALITY, max: MAX_JPEG_QUALITY, step: 1, name: "JPEG Quality", onValueChanged: setJpegQuality, value: jpegQuality, hint: client_1.BrowserSafeApis.options.jpegQualityOption }));
9
+ return ((0, jsx_runtime_1.jsx)(NumberSetting_1.NumberSetting, { min: MIN_JPEG_QUALITY, max: MAX_JPEG_QUALITY, step: 1, name: "JPEG Quality", onValueChanged: setJpegQuality, value: jpegQuality, hint: 'jpegQualityOption' }));
11
10
  };
12
11
  exports.JpegQualitySetting = JpegQualitySetting;
@@ -1,8 +1,6 @@
1
- import type { AnyRemotionOption } from '@remotion/renderer';
2
1
  import React from 'react';
3
2
  export declare const MutedSetting: React.FC<{
4
3
  muted: boolean;
5
4
  setMuted: React.Dispatch<React.SetStateAction<boolean>>;
6
5
  enforceAudioTrack: boolean;
7
- hint: AnyRemotionOption;
8
6
  }>;
@@ -5,13 +5,12 @@ const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
6
  const Checkbox_1 = require("../Checkbox");
7
7
  const layout_1 = require("../layout");
8
- const InfoBubble_1 = require("./InfoBubble");
9
8
  const layout_2 = require("./layout");
10
- const OptionExplainer_1 = require("./OptionExplainer");
11
- const MutedSetting = ({ muted, setMuted, enforceAudioTrack, hint }) => {
9
+ const OptionExplainerBubble_1 = require("./OptionExplainerBubble");
10
+ const MutedSetting = ({ muted, setMuted, enforceAudioTrack }) => {
12
11
  const onMutedChanged = (0, react_1.useCallback)((e) => {
13
12
  setMuted(e.target.checked);
14
13
  }, [setMuted]);
15
- return ((0, jsx_runtime_1.jsxs)("div", { style: layout_2.optionRow, children: [(0, jsx_runtime_1.jsxs)("div", { style: layout_2.label, children: ["Muted", (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 0.5 }), (0, jsx_runtime_1.jsx)(InfoBubble_1.InfoBubble, { title: "Learn more about this option", children: (0, jsx_runtime_1.jsx)(OptionExplainer_1.OptionExplainer, { option: hint }) })] }), (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 0.25 }), (0, jsx_runtime_1.jsx)("div", { style: layout_2.rightRow, children: (0, jsx_runtime_1.jsx)(Checkbox_1.Checkbox, { checked: muted, disabled: enforceAudioTrack && !muted, onChange: onMutedChanged, name: "muted" }) })] }));
14
+ return ((0, jsx_runtime_1.jsxs)("div", { style: layout_2.optionRow, children: [(0, jsx_runtime_1.jsxs)("div", { style: layout_2.label, children: ["Muted", (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 0.5 }), (0, jsx_runtime_1.jsx)(OptionExplainerBubble_1.OptionExplainerBubble, { id: "muteOption" })] }), (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 0.25 }), (0, jsx_runtime_1.jsx)("div", { style: layout_2.rightRow, children: (0, jsx_runtime_1.jsx)(Checkbox_1.Checkbox, { checked: muted, disabled: enforceAudioTrack && !muted, onChange: onMutedChanged, name: "muted" }) })] }));
16
15
  };
17
16
  exports.MutedSetting = MutedSetting;
@@ -1,4 +1,4 @@
1
- import type { AnyRemotionOption } from '@remotion/renderer';
1
+ import type { AvailableOptions } from '@remotion/renderer/client';
2
2
  import React from 'react';
3
3
  export declare const NumberSetting: React.FC<{
4
4
  name: string;
@@ -8,5 +8,5 @@ export declare const NumberSetting: React.FC<{
8
8
  min: number;
9
9
  step: number;
10
10
  formatter?: (value: string | number) => string;
11
- hint?: AnyRemotionOption;
11
+ hint?: AvailableOptions;
12
12
  }>;
@@ -6,9 +6,8 @@ const react_1 = require("react");
6
6
  const layout_1 = require("../layout");
7
7
  const InputDragger_1 = require("../NewComposition/InputDragger");
8
8
  const RemInput_1 = require("../NewComposition/RemInput");
9
- const InfoBubble_1 = require("./InfoBubble");
10
9
  const layout_2 = require("./layout");
11
- const OptionExplainer_1 = require("./OptionExplainer");
10
+ const OptionExplainerBubble_1 = require("./OptionExplainerBubble");
12
11
  const NumberSetting = ({ name, value, step, hint, onValueChanged, max, min, formatter }) => {
13
12
  const onTextChanged = (0, react_1.useCallback)((e) => {
14
13
  onValueChanged((q) => {
@@ -22,7 +21,7 @@ const NumberSetting = ({ name, value, step, hint, onValueChanged, max, min, form
22
21
  const onValueChange = (0, react_1.useCallback)((newConcurrency) => {
23
22
  onValueChanged(newConcurrency);
24
23
  }, [onValueChanged]);
25
- return ((0, jsx_runtime_1.jsxs)("div", { style: layout_2.optionRow, children: [(0, jsx_runtime_1.jsxs)("div", { style: layout_2.label, children: [name, hint ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 0.25 }), ' ', (0, jsx_runtime_1.jsx)(InfoBubble_1.InfoBubble, { title: "Learn more about this option", children: (0, jsx_runtime_1.jsx)(OptionExplainer_1.OptionExplainer, { option: hint }) })] })) : null] }), (0, jsx_runtime_1.jsx)("div", { style: layout_2.rightRow, children: (0, jsx_runtime_1.jsx)(RemInput_1.RightAlignInput, { children: (0, jsx_runtime_1.jsx)(InputDragger_1.InputDragger, { value: value, name: name.toLowerCase(), onTextChange: onTextChanged, onValueChange: onValueChange, step: step, placeholder: [min, max]
24
+ return ((0, jsx_runtime_1.jsxs)("div", { style: layout_2.optionRow, children: [(0, jsx_runtime_1.jsxs)("div", { style: layout_2.label, children: [name, hint ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 0.5 }), (0, jsx_runtime_1.jsx)(OptionExplainerBubble_1.OptionExplainerBubble, { id: hint })] })) : null] }), (0, jsx_runtime_1.jsx)("div", { style: layout_2.rightRow, children: (0, jsx_runtime_1.jsx)(RemInput_1.RightAlignInput, { children: (0, jsx_runtime_1.jsx)(InputDragger_1.InputDragger, { value: value, name: name.toLowerCase(), onTextChange: onTextChanged, onValueChange: onValueChange, step: step, placeholder: [min, max]
26
25
  .map((f) => (f !== null && f !== undefined ? f : ''))
27
26
  .join('-'), min: min, max: max, formatter: formatter, status: "ok", rightAlign: true }) }) })] }));
28
27
  };
@@ -0,0 +1,5 @@
1
+ /// <reference types="react" />
2
+ import type { AvailableOptions } from '@remotion/renderer/client';
3
+ export declare const OptionExplainerBubble: React.FC<{
4
+ id: AvailableOptions;
5
+ }>;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OptionExplainerBubble = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const client_1 = require("@remotion/renderer/client");
6
+ const InfoBubble_1 = require("./InfoBubble");
7
+ const OptionExplainer_1 = require("./OptionExplainer");
8
+ const OptionExplainerBubble = ({ id }) => {
9
+ const option = client_1.BrowserSafeApis.options[id];
10
+ return ((0, jsx_runtime_1.jsx)(InfoBubble_1.InfoBubble, { title: "Learn more about this option", children: (0, jsx_runtime_1.jsx)(OptionExplainer_1.OptionExplainer, { option: option }) }));
11
+ };
12
+ exports.OptionExplainerBubble = OptionExplainerBubble;
@@ -28,6 +28,9 @@ type RenderModalProps = {
28
28
  initialOffthreadVideoCacheSizeInBytes: number | null;
29
29
  initialHeadless: boolean;
30
30
  initialColorSpace: ColorSpace;
31
+ initialEncodingMaxRate: string | null;
32
+ initialEncodingBufferSize: string | null;
33
+ initialUserAgent: string | null;
31
34
  defaultProps: Record<string, unknown>;
32
35
  inFrameMark: number | null;
33
36
  outFrameMark: number | null;
@@ -117,7 +117,7 @@ const outer = {
117
117
  display: 'flex',
118
118
  flexDirection: 'column',
119
119
  };
120
- const RenderModal = ({ initialFrame, initialVideoImageFormat, initialStillImageFormat, initialJpegQuality, initialScale, initialLogLevel, initialConcurrency, maxConcurrency, minConcurrency, initialMuted, initialEnforceAudioTrack, initialProResProfile, initialx264Preset, initialPixelFormat, initialVideoBitrate, initialAudioBitrate, initialEveryNthFrame, initialNumberOfGifLoops, initialDelayRenderTimeout, initialOffthreadVideoCacheSizeInBytes, initialEnvVariables, initialDisableWebSecurity, initialGl, initialHeadless, initialIgnoreCertificateErrors, defaultProps, inFrameMark, outFrameMark, onClose, resolvedComposition, unresolvedComposition, initialColorSpace, initialMultiProcessOnLinux, defaultConfigurationAudioCodec, defaultConfigurationVideoCodec, }) => {
120
+ const RenderModal = ({ initialFrame, initialVideoImageFormat, initialStillImageFormat, initialJpegQuality, initialScale, initialLogLevel, initialConcurrency, maxConcurrency, minConcurrency, initialMuted, initialEnforceAudioTrack, initialProResProfile, initialx264Preset, initialPixelFormat, initialVideoBitrate, initialAudioBitrate, initialEveryNthFrame, initialNumberOfGifLoops, initialDelayRenderTimeout, initialOffthreadVideoCacheSizeInBytes, initialEnvVariables, initialDisableWebSecurity, initialGl, initialHeadless, initialIgnoreCertificateErrors, initialEncodingBufferSize, initialEncodingMaxRate, initialUserAgent, defaultProps, inFrameMark, outFrameMark, onClose, resolvedComposition, unresolvedComposition, initialColorSpace, initialMultiProcessOnLinux, defaultConfigurationAudioCodec, defaultConfigurationVideoCodec, }) => {
121
121
  const isMounted = (0, react_1.useRef)(true);
122
122
  const [isVideo] = (0, react_1.useState)(() => {
123
123
  return typeof resolvedComposition.durationInFrames === 'undefined'
@@ -165,14 +165,18 @@ const RenderModal = ({ initialFrame, initialVideoImageFormat, initialStillImageF
165
165
  const [multiProcessOnLinux, setChromiumMultiProcessOnLinux] = (0, react_1.useState)(() => initialMultiProcessOnLinux);
166
166
  const [openGlOption, setOpenGlOption] = (0, react_1.useState)(() => initialGl !== null && initialGl !== void 0 ? initialGl : 'default');
167
167
  const [colorSpace, setColorSpace] = (0, react_1.useState)(() => initialColorSpace);
168
+ const [userAgent, setUserAgent] = (0, react_1.useState)(() => initialUserAgent === null
169
+ ? null
170
+ : initialUserAgent.trim() === ''
171
+ ? null
172
+ : initialUserAgent);
168
173
  const chromiumOptions = (0, react_1.useMemo)(() => {
169
174
  return {
170
175
  headless,
171
176
  disableWebSecurity,
172
177
  ignoreCertificateErrors,
173
178
  gl: openGlOption === 'default' ? null : openGlOption,
174
- // TODO: Make this configurable at some point (not necessary for V4)
175
- userAgent: null,
179
+ userAgent: userAgent === null ? null : userAgent.trim() === '' ? null : userAgent,
176
180
  enableMultiProcessOnLinux: multiProcessOnLinux,
177
181
  };
178
182
  }, [
@@ -180,6 +184,7 @@ const RenderModal = ({ initialFrame, initialVideoImageFormat, initialStillImageF
180
184
  disableWebSecurity,
181
185
  ignoreCertificateErrors,
182
186
  openGlOption,
187
+ userAgent,
183
188
  multiProcessOnLinux,
184
189
  ]);
185
190
  const [outName, setOutName] = (0, react_1.useState)(() => initialOutName);
@@ -192,6 +197,8 @@ const RenderModal = ({ initialFrame, initialVideoImageFormat, initialStillImageF
192
197
  const [shouldHaveCustomTargetAudioBitrate, setShouldHaveCustomTargetAudioBitrate,] = (0, react_1.useState)(() => initialAudioBitrate !== null);
193
198
  const [customTargetAudioBitrate, setCustomTargetAudioBitrateValue] = (0, react_1.useState)(() => initialAudioBitrate !== null && initialAudioBitrate !== void 0 ? initialAudioBitrate : '320K');
194
199
  const [customTargetVideoBitrate, setCustomTargetVideoBitrateValue] = (0, react_1.useState)(() => initialVideoBitrate !== null && initialVideoBitrate !== void 0 ? initialVideoBitrate : '1M');
200
+ const [encodingMaxRate, setEncodingMaxRate] = (0, react_1.useState)(() => initialEncodingMaxRate !== null && initialEncodingMaxRate !== void 0 ? initialEncodingMaxRate : null);
201
+ const [encodingBufferSize, setEncodingBufferSize] = (0, react_1.useState)(() => initialEncodingBufferSize !== null && initialEncodingBufferSize !== void 0 ? initialEncodingBufferSize : null);
195
202
  const [limitNumberOfGifLoops, setLimitNumberOfGifLoops] = (0, react_1.useState)(() => initialNumberOfGifLoops !== null);
196
203
  const [numberOfGifLoopsSetting, setNumberOfGifLoopsSetting] = (0, react_1.useState)(() => initialNumberOfGifLoops !== null && initialNumberOfGifLoops !== void 0 ? initialNumberOfGifLoops : 1);
197
204
  const [delayRenderTimeout, setDelayRenderTimeout] = (0, react_1.useState)(() => initialDelayRenderTimeout);
@@ -459,6 +466,8 @@ const RenderModal = ({ initialFrame, initialVideoImageFormat, initialStillImageF
459
466
  offthreadVideoCacheSizeInBytes,
460
467
  colorSpace,
461
468
  multiProcessOnLinux,
469
+ encodingBufferSize,
470
+ encodingMaxRate,
462
471
  })
463
472
  .then(() => {
464
473
  dispatchIfMounted({ type: 'succeed' });
@@ -501,6 +510,8 @@ const RenderModal = ({ initialFrame, initialVideoImageFormat, initialStillImageF
501
510
  offthreadVideoCacheSizeInBytes,
502
511
  colorSpace,
503
512
  multiProcessOnLinux,
513
+ encodingBufferSize,
514
+ encodingMaxRate,
504
515
  onClose,
505
516
  ]);
506
517
  const onClickSequence = (0, react_1.useCallback)(() => {
@@ -763,7 +774,7 @@ const RenderModal = ({ initialFrame, initialVideoImageFormat, initialStillImageF
763
774
  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: {
764
775
  ...buttonStyle,
765
776
  backgroundColor: outnameValidation.valid ? colors_1.BLUE : colors_1.BLUE_DISABLED,
766
- }, 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, pixelFormatOptions: pixelFormatOptions, 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: setLogLevel, logLevel: logLevel, 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 })) })] })] }));
777
+ }, 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, pixelFormatOptions: pixelFormatOptions, 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, encodingBufferSize: encodingBufferSize, setEncodingBufferSize: setEncodingBufferSize, encodingMaxRate: encodingMaxRate, setEncodingMaxRate: setEncodingMaxRate })) : 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: setLogLevel, logLevel: logLevel, 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, userAgent: userAgent, setUserAgent: setUserAgent })) })] })] }));
767
778
  };
768
779
  const RenderModalWithLoader = (props) => {
769
780
  const { setSelectedModal } = (0, react_1.useContext)(modals_1.ModalsContext);
@@ -31,4 +31,6 @@ export declare const RenderModalAdvanced: React.FC<{
31
31
  codec: Codec;
32
32
  enableMultiProcessOnLinux: boolean;
33
33
  setChromiumMultiProcessOnLinux: React.Dispatch<React.SetStateAction<boolean>>;
34
+ userAgent: string | null;
35
+ setUserAgent: React.Dispatch<React.SetStateAction<string | null>>;
34
36
  }>;
@@ -7,17 +7,20 @@ const react_1 = require("react");
7
7
  const presets_labels_1 = require("../../helpers/presets-labels");
8
8
  const Checkmark_1 = require("../../icons/Checkmark");
9
9
  const Checkbox_1 = require("../Checkbox");
10
+ const layout_1 = require("../layout");
10
11
  const is_menu_item_1 = require("../Menu/is-menu-item");
11
12
  const ComboBox_1 = require("../NewComposition/ComboBox");
12
- const layout_1 = require("./layout");
13
+ const RemInput_1 = require("../NewComposition/RemInput");
14
+ const layout_2 = require("./layout");
13
15
  const NumberSetting_1 = require("./NumberSetting");
16
+ const OptionExplainerBubble_1 = require("./OptionExplainerBubble");
14
17
  const RenderModalEnvironmentVariables_1 = require("./RenderModalEnvironmentVariables");
15
18
  const RenderModalHr_1 = require("./RenderModalHr");
16
19
  const container = {
17
20
  flex: 1,
18
21
  overflowY: 'auto',
19
22
  };
20
- const RenderModalAdvanced = ({ renderMode, maxConcurrency, minConcurrency, setConcurrency, concurrency, setVerboseLogging, logLevel, delayRenderTimeout, setDelayRenderTimeout, disallowParallelEncoding, setDisallowParallelEncoding, setDisableWebSecurity, setIgnoreCertificateErrors, setHeadless, headless, ignoreCertificateErrors, disableWebSecurity, openGlOption, setOpenGlOption, setEnvVariables, envVariables, setx264Preset, x264Preset, codec, offthreadVideoCacheSizeInBytes, setOffthreadVideoCacheSizeInBytes, enableMultiProcessOnLinux, setChromiumMultiProcessOnLinux, }) => {
23
+ const RenderModalAdvanced = ({ renderMode, maxConcurrency, minConcurrency, setConcurrency, concurrency, setVerboseLogging, logLevel, delayRenderTimeout, setDelayRenderTimeout, disallowParallelEncoding, setDisallowParallelEncoding, setDisableWebSecurity, setIgnoreCertificateErrors, setHeadless, headless, ignoreCertificateErrors, disableWebSecurity, openGlOption, setOpenGlOption, setEnvVariables, envVariables, setx264Preset, x264Preset, codec, offthreadVideoCacheSizeInBytes, setOffthreadVideoCacheSizeInBytes, enableMultiProcessOnLinux, setChromiumMultiProcessOnLinux, setUserAgent, userAgent, }) => {
21
24
  const extendedOpenGlOptions = (0, react_1.useMemo)(() => {
22
25
  return [
23
26
  'angle',
@@ -40,6 +43,14 @@ const RenderModalAdvanced = ({ renderMode, maxConcurrency, minConcurrency, setCo
40
43
  return null;
41
44
  });
42
45
  }, [setOffthreadVideoCacheSizeInBytes]);
46
+ const toggleCustomUserAgent = (0, react_1.useCallback)(() => {
47
+ setUserAgent((previous) => {
48
+ if (previous === null) {
49
+ return 'Mozilla/5.0 (Remotion)';
50
+ }
51
+ return null;
52
+ });
53
+ }, [setUserAgent]);
43
54
  const onDisallowParallelEncodingChanged = (0, react_1.useCallback)((e) => {
44
55
  setDisallowParallelEncoding(e.target.checked);
45
56
  }, [setDisallowParallelEncoding]);
@@ -55,6 +66,9 @@ const RenderModalAdvanced = ({ renderMode, maxConcurrency, minConcurrency, setCo
55
66
  const onHeadless = (0, react_1.useCallback)((e) => {
56
67
  setHeadless(e.target.checked);
57
68
  }, [setHeadless]);
69
+ const onUserAgentChanged = (0, react_1.useCallback)((e) => {
70
+ setUserAgent(e.target.value);
71
+ }, [setUserAgent]);
58
72
  const openGlOptions = (0, react_1.useMemo)(() => {
59
73
  return extendedOpenGlOptions.map((option) => {
60
74
  return {
@@ -99,11 +113,11 @@ const RenderModalAdvanced = ({ renderMode, maxConcurrency, minConcurrency, setCo
99
113
  return cb;
100
114
  });
101
115
  }, [setOffthreadVideoCacheSizeInBytes]);
102
- return ((0, jsx_runtime_1.jsxs)("div", { style: container, className: is_menu_item_1.VERTICAL_SCROLLBAR_CLASSNAME, children: [renderMode === 'video' && codec === 'h264' ? ((0, jsx_runtime_1.jsxs)("div", { style: layout_1.optionRow, children: [(0, jsx_runtime_1.jsx)("div", { style: layout_1.label, children: "x264 Preset" }), (0, jsx_runtime_1.jsx)("div", { style: layout_1.rightRow, children: (0, jsx_runtime_1.jsx)(ComboBox_1.Combobox, { title: x264Preset, selectedId: x264Preset, values: x264PresetOptions }) })] })) : null, renderMode === 'still' ? null : ((0, jsx_runtime_1.jsx)(NumberSetting_1.NumberSetting, { min: minConcurrency, max: maxConcurrency, step: 1, name: "Concurrency", formatter: (w) => `${w}x`, onValueChanged: setConcurrency, value: concurrency })), (0, jsx_runtime_1.jsx)(NumberSetting_1.NumberSetting
116
+ return ((0, jsx_runtime_1.jsxs)("div", { style: container, className: is_menu_item_1.VERTICAL_SCROLLBAR_CLASSNAME, children: [(0, jsx_runtime_1.jsxs)("div", { style: layout_2.optionRow, children: [(0, jsx_runtime_1.jsx)("div", { style: layout_2.label, children: "Verbose logging" }), (0, jsx_runtime_1.jsx)("div", { style: layout_2.rightRow, children: (0, jsx_runtime_1.jsx)(Checkbox_1.Checkbox, { checked: logLevel === 'verbose', onChange: onVerboseLoggingChanged, name: "verbose-logging" }) })] }), renderMode === 'still' ? null : ((0, jsx_runtime_1.jsx)(NumberSetting_1.NumberSetting, { min: minConcurrency, max: maxConcurrency, step: 1, name: "Concurrency", formatter: (w) => `${w}x`, onValueChanged: setConcurrency, value: concurrency })), renderMode === 'video' && codec === 'h264' ? ((0, jsx_runtime_1.jsxs)("div", { style: layout_2.optionRow, children: [(0, jsx_runtime_1.jsx)("div", { style: layout_2.label, children: "x264 Preset" }), (0, jsx_runtime_1.jsx)("div", { style: layout_2.rightRow, children: (0, jsx_runtime_1.jsx)(ComboBox_1.Combobox, { title: x264Preset, selectedId: x264Preset, values: x264PresetOptions }) })] })) : null, (0, jsx_runtime_1.jsx)(NumberSetting_1.NumberSetting
103
117
  // Also appears in packages/renderer/src/validate-puppeteer-timeout.ts
104
118
  , {
105
119
  // Also appears in packages/renderer/src/validate-puppeteer-timeout.ts
106
- 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' ||
107
- 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: logLevel === '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 })] }));
120
+ 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_2.optionRow, children: [(0, jsx_runtime_1.jsx)("div", { style: layout_2.label, children: "No parallel encoding" }), (0, jsx_runtime_1.jsx)("div", { style: layout_2.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_2.optionRow, children: [(0, jsx_runtime_1.jsx)("div", { style: layout_2.label, children: "Custom OffthreadVideo cache" }), (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 0.5 }), (0, jsx_runtime_1.jsx)(OptionExplainerBubble_1.OptionExplainerBubble, { id: "offthreadVideoCacheSizeInBytes" }), (0, jsx_runtime_1.jsx)("div", { style: layout_2.rightRow, children: (0, jsx_runtime_1.jsx)(Checkbox_1.Checkbox, { checked: offthreadVideoCacheSizeInBytes !== null, onChange: toggleCustomOffthreadVideoCacheSizeInBytes, name: "custom-audio-bitrate" }) })] })), renderMode === 'audio' ||
121
+ 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.jsx)(RenderModalHr_1.RenderModalHr, {}), (0, jsx_runtime_1.jsxs)("div", { style: layout_2.optionRow, children: [(0, jsx_runtime_1.jsx)("div", { style: layout_2.label, children: "Disable web security" }), (0, jsx_runtime_1.jsx)("div", { style: layout_2.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_2.optionRow, children: [(0, jsx_runtime_1.jsx)("div", { style: layout_2.label, children: "Ignore certificate errors" }), (0, jsx_runtime_1.jsx)("div", { style: layout_2.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_2.optionRow, children: [(0, jsx_runtime_1.jsx)("div", { style: layout_2.label, children: "Headless mode" }), (0, jsx_runtime_1.jsx)("div", { style: layout_2.rightRow, children: (0, jsx_runtime_1.jsx)(Checkbox_1.Checkbox, { checked: headless, onChange: onHeadless, name: "headless" }) })] }), (0, jsx_runtime_1.jsxs)("div", { style: layout_2.optionRow, children: [(0, jsx_runtime_1.jsxs)("div", { style: layout_2.label, children: ["OpenGL render backend ", (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 0.5 }), (0, jsx_runtime_1.jsx)(OptionExplainerBubble_1.OptionExplainerBubble, { id: "glOption" })] }), (0, jsx_runtime_1.jsx)("div", { style: layout_2.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_2.optionRow, children: [(0, jsx_runtime_1.jsx)("div", { style: layout_2.label, children: "Multi-process Chrome on Linux" }), (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 0.5 }), (0, jsx_runtime_1.jsx)(OptionExplainerBubble_1.OptionExplainerBubble, { id: "enableMultiprocessOnLinuxOption" }), (0, jsx_runtime_1.jsx)("div", { style: layout_2.rightRow, children: (0, jsx_runtime_1.jsx)(Checkbox_1.Checkbox, { checked: enableMultiProcessOnLinux, onChange: onEnableMultiProcessOnLinux, name: "enable-multi-process-on-linux" }) })] }), (0, jsx_runtime_1.jsxs)("div", { style: layout_2.optionRow, children: [(0, jsx_runtime_1.jsx)("div", { style: layout_2.label, children: "Custom User Agent" }), (0, jsx_runtime_1.jsx)("div", { style: layout_2.rightRow, children: (0, jsx_runtime_1.jsx)(Checkbox_1.Checkbox, { checked: userAgent !== null, onChange: toggleCustomUserAgent, name: "custom-user-agent" }) })] }), userAgent === null ? null : ((0, jsx_runtime_1.jsxs)("div", { style: layout_2.optionRow, children: [(0, jsx_runtime_1.jsx)("div", { style: layout_2.label, children: "User Agent" }), (0, jsx_runtime_1.jsx)("div", { style: layout_2.rightRow, children: (0, jsx_runtime_1.jsx)("div", { children: (0, jsx_runtime_1.jsx)(RemInput_1.RemotionInput, { style: layout_2.input, value: userAgent, onChange: onUserAgentChanged, status: "ok", rightAlign: true }) }) })] })), (0, jsx_runtime_1.jsx)(RenderModalHr_1.RenderModalHr, {}), (0, jsx_runtime_1.jsx)(RenderModalEnvironmentVariables_1.RenderModalEnvironmentVariables, { envVariables: envVariables, setEnvVariables: setEnvVariables })] }));
108
122
  };
109
123
  exports.RenderModalAdvanced = RenderModalAdvanced;