@remotion/renderer 4.1.0-alpha2 → 4.1.0-alpha4

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 (87) hide show
  1. package/dist/assets/get-video-stream-duration.d.ts +9 -0
  2. package/dist/assets/get-video-stream-duration.js +71 -0
  3. package/dist/browser/Browser.d.ts +7 -6
  4. package/dist/browser/Browser.js +12 -12
  5. package/dist/browser/BrowserPage.d.ts +13 -2
  6. package/dist/browser/BrowserPage.js +15 -8
  7. package/dist/browser/BrowserRunner.js +2 -2
  8. package/dist/browser/LaunchOptions.d.ts +2 -0
  9. package/dist/browser/Launcher.js +2 -1
  10. package/dist/browser/Target.d.ts +2 -1
  11. package/dist/browser/Target.js +3 -1
  12. package/dist/browser/should-log-message.js +8 -0
  13. package/dist/calculate-sar-dar-pixels.d.ts +9 -0
  14. package/dist/calculate-sar-dar-pixels.js +19 -0
  15. package/dist/compositor/compositor.d.ts +3 -2
  16. package/dist/compositor/compositor.js +6 -5
  17. package/dist/cycle-browser-tabs.d.ts +2 -1
  18. package/dist/cycle-browser-tabs.js +2 -2
  19. package/dist/determine-resize-params.d.ts +4 -0
  20. package/dist/determine-resize-params.js +10 -0
  21. package/dist/determine-vcodec-ffmpeg-flags.d.ts +2 -0
  22. package/dist/determine-vcodec-ffmpeg-flags.js +13 -0
  23. package/dist/ensure-ffmpeg.d.ts +18 -0
  24. package/dist/ensure-ffmpeg.js +58 -0
  25. package/dist/ensure-presentation-timestamp.d.ts +15 -0
  26. package/dist/ensure-presentation-timestamp.js +88 -0
  27. package/dist/extract-frame-from-video.d.ts +16 -0
  28. package/dist/extract-frame-from-video.js +191 -0
  29. package/dist/ffmpeg-executable.d.ts +1 -0
  30. package/dist/ffmpeg-executable.js +2 -0
  31. package/dist/ffmpeg-flags.d.ts +31 -0
  32. package/dist/ffmpeg-flags.js +245 -0
  33. package/dist/format-logs.d.ts +3 -0
  34. package/dist/format-logs.js +201 -0
  35. package/dist/frame-to-ffmpeg-timestamp.d.ts +1 -0
  36. package/dist/frame-to-ffmpeg-timestamp.js +8 -0
  37. package/dist/get-browser-instance.d.ts +3 -2
  38. package/dist/get-browser-instance.js +5 -5
  39. package/dist/get-can-extract-frames-fast.d.ts +14 -0
  40. package/dist/get-can-extract-frames-fast.js +71 -0
  41. package/dist/get-compositions.d.ts +4 -3
  42. package/dist/get-compositions.js +6 -5
  43. package/dist/get-frame-of-video-slow.d.ts +17 -0
  44. package/dist/get-frame-of-video-slow.js +72 -0
  45. package/dist/get-video-info.d.ts +8 -0
  46. package/dist/get-video-info.js +59 -0
  47. package/dist/index.d.ts +23 -25
  48. package/dist/is-beyond-last-frame.d.ts +3 -0
  49. package/dist/is-beyond-last-frame.js +12 -0
  50. package/dist/last-frame-from-video-cache.d.ts +17 -0
  51. package/dist/last-frame-from-video-cache.js +55 -0
  52. package/dist/legacy-webpack-config.d.ts +9 -0
  53. package/dist/legacy-webpack-config.js +13 -0
  54. package/dist/logger.d.ts +1 -2
  55. package/dist/logger.js +5 -10
  56. package/dist/offthread-video-server.d.ts +3 -2
  57. package/dist/offthread-video-server.js +4 -3
  58. package/dist/open-browser.d.ts +3 -2
  59. package/dist/open-browser.js +7 -5
  60. package/dist/perf.js +4 -2
  61. package/dist/prepare-server.d.ts +3 -2
  62. package/dist/prepare-server.js +4 -4
  63. package/dist/prespawn-ffmpeg.d.ts +2 -1
  64. package/dist/prespawn-ffmpeg.js +2 -30
  65. package/dist/quality.d.ts +1 -0
  66. package/dist/quality.js +21 -0
  67. package/dist/render-frames.d.ts +11 -4
  68. package/dist/render-frames.js +15 -11
  69. package/dist/render-media.d.ts +11 -4
  70. package/dist/render-media.js +12 -14
  71. package/dist/render-still.d.ts +8 -2
  72. package/dist/render-still.js +8 -8
  73. package/dist/replace-browser.d.ts +2 -1
  74. package/dist/replace-browser.js +2 -2
  75. package/dist/select-composition.d.ts +2 -1
  76. package/dist/select-composition.js +8 -8
  77. package/dist/serve-static.d.ts +2 -1
  78. package/dist/serve-static.js +1 -1
  79. package/dist/stitch-frames-to-video.d.ts +2 -1
  80. package/dist/stitch-frames-to-video.js +12 -22
  81. package/dist/try-to-extract-frame-of-video-fast.d.ts +12 -0
  82. package/dist/try-to-extract-frame-of-video-fast.js +55 -0
  83. package/dist/validate-ffmpeg.d.ts +7 -0
  84. package/dist/validate-ffmpeg.js +77 -0
  85. package/dist/warn-about-ffmpeg-version.d.ts +5 -0
  86. package/dist/warn-about-ffmpeg-version.js +37 -0
  87. package/package.json +9 -9
package/dist/index.d.ts CHANGED
@@ -43,7 +43,7 @@ export declare const RenderInternals: {
43
43
  downloadMap: import("./assets/download-map").DownloadMap;
44
44
  remotionRoot: string;
45
45
  concurrency: number;
46
- verbose: boolean;
46
+ logLevel: "verbose" | "info" | "warn" | "error";
47
47
  indent: boolean;
48
48
  }) => Promise<{
49
49
  port: number;
@@ -114,8 +114,8 @@ export declare const RenderInternals: {
114
114
  validPixelFormats: readonly ["yuv420p", "yuva420p", "yuv422p", "yuv444p", "yuv420p10le", "yuv422p10le", "yuv444p10le", "yuva444p10le"];
115
115
  DEFAULT_BROWSER: import("./browser").Browser;
116
116
  validateFrameRange: (frameRange: import("./frame-range").FrameRange | null) => void;
117
- DEFAULT_OPENGL_RENDERER: "angle" | "swangle" | "egl" | "swiftshader" | null;
118
- validateOpenGlRenderer: (option: "angle" | "swangle" | "egl" | "swiftshader" | null) => "angle" | "swangle" | "egl" | "swiftshader" | null;
117
+ DEFAULT_OPENGL_RENDERER: "swangle" | "angle" | "egl" | "swiftshader" | null;
118
+ validateOpenGlRenderer: (option: "swangle" | "angle" | "egl" | "swiftshader" | null) => "swangle" | "angle" | "egl" | "swiftshader" | null;
119
119
  validCodecs: readonly ["h264", "h265", "vp8", "vp9", "mp3", "aac", "wav", "prores", "h264-mkv", "gif"];
120
120
  DEFAULT_PIXEL_FORMAT: "yuv420p" | "yuva420p" | "yuv422p" | "yuv444p" | "yuv420p10le" | "yuv422p10le" | "yuv444p10le" | "yuva444p10le";
121
121
  validateJpegQuality: (q: number | undefined) => void;
@@ -123,7 +123,7 @@ export declare const RenderInternals: {
123
123
  DEFAULT_CODEC: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif";
124
124
  isAudioCodec: (codec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif" | undefined) => boolean;
125
125
  logLevels: readonly ["verbose", "info", "warn", "error"];
126
- isEqualOrBelowLogLevel: (currentLevel: "error" | "verbose" | "info" | "warn", level: "error" | "verbose" | "info" | "warn") => boolean;
126
+ isEqualOrBelowLogLevel: (currentLevel: "verbose" | "info" | "warn" | "error", level: "verbose" | "info" | "warn" | "error") => boolean;
127
127
  isValidLogLevel: (level: string) => boolean;
128
128
  perf: typeof perf;
129
129
  convertToPositiveFrameIndex: ({ frame, durationInFrames, }: {
@@ -300,8 +300,8 @@ export declare const RenderInternals: {
300
300
  };
301
301
  validStillImageFormats: readonly ["png", "jpeg", "pdf", "webp"];
302
302
  validVideoImageFormats: readonly ["png", "jpeg", "none"];
303
- DEFAULT_STILL_IMAGE_FORMAT: "jpeg" | "png" | "webp" | "pdf";
304
- DEFAULT_VIDEO_IMAGE_FORMAT: "jpeg" | "png" | "none";
303
+ DEFAULT_STILL_IMAGE_FORMAT: "png" | "jpeg" | "pdf" | "webp";
304
+ DEFAULT_VIDEO_IMAGE_FORMAT: "none" | "png" | "jpeg";
305
305
  DEFAULT_JPEG_QUALITY: number;
306
306
  chalk: {
307
307
  enabled: boolean;
@@ -356,34 +356,33 @@ export declare const RenderInternals: {
356
356
  verbose: (message?: any, ...optionalParams: any[]) => void;
357
357
  verboseAdvanced: (options: {
358
358
  indent: boolean;
359
- logLevel: "error" | "verbose" | "info" | "warn";
359
+ logLevel: "verbose" | "info" | "warn" | "error";
360
360
  } & {
361
361
  tag?: string | undefined;
362
- secondTag?: string | undefined;
363
362
  }, message?: any, ...optionalParams: any[]) => void;
364
363
  info: (message?: any, ...optionalParams: any[]) => void;
365
364
  infoAdvanced: (options: {
366
365
  indent: boolean;
367
- logLevel: "error" | "verbose" | "info" | "warn";
366
+ logLevel: "verbose" | "info" | "warn" | "error";
368
367
  }, message?: any, ...optionalParams: any[]) => void;
369
368
  warn: (message?: any, ...optionalParams: any[]) => void;
370
369
  warnAdvanced: (options: {
371
370
  indent: boolean;
372
- logLevel: "error" | "verbose" | "info" | "warn";
371
+ logLevel: "verbose" | "info" | "warn" | "error";
373
372
  }, message?: any, ...optionalParams: any[]) => void;
374
373
  error: (message?: any, ...optionalParams: any[]) => void;
375
374
  };
376
- getLogLevel: () => "error" | "verbose" | "info" | "warn";
377
- setLogLevel: (newLogLevel: "error" | "verbose" | "info" | "warn") => void;
375
+ getLogLevel: () => "verbose" | "info" | "warn" | "error";
376
+ setLogLevel: (newLogLevel: "verbose" | "info" | "warn" | "error") => void;
378
377
  INDENT_TOKEN: string;
379
378
  isColorSupported: boolean;
380
379
  HeadlessBrowser: typeof HeadlessBrowser;
381
- prepareServer: ({ webpackConfigOrServeUrl, port, remotionRoot, concurrency, verbose, indent, }: {
380
+ prepareServer: ({ webpackConfigOrServeUrl, port, remotionRoot, concurrency, logLevel, indent, }: {
382
381
  webpackConfigOrServeUrl: string;
383
382
  port: number | null;
384
383
  remotionRoot: string;
385
384
  concurrency: number;
386
- verbose: boolean;
385
+ logLevel: "verbose" | "info" | "warn" | "error";
387
386
  indent: boolean;
388
387
  }) => Promise<import("./prepare-server").RemotionServer>;
389
388
  makeOrReuseServer: (server: import("./prepare-server").RemotionServer | undefined, config: {
@@ -391,7 +390,7 @@ export declare const RenderInternals: {
391
390
  port: number | null;
392
391
  remotionRoot: string;
393
392
  concurrency: number;
394
- verbose: boolean;
393
+ logLevel: "verbose" | "info" | "warn" | "error";
395
394
  indent: boolean;
396
395
  }, { onDownload, onError, }: {
397
396
  onError: (err: Error) => void;
@@ -405,10 +404,9 @@ export declare const RenderInternals: {
405
404
  output: string | null;
406
405
  frame: number;
407
406
  inputProps: Record<string, unknown>;
408
- imageFormat: "jpeg" | "png" | "webp" | "pdf";
407
+ imageFormat: "png" | "jpeg" | "pdf" | "webp";
409
408
  jpegQuality: number;
410
409
  puppeteerInstance: HeadlessBrowser | null;
411
- dumpBrowserLogs: boolean;
412
410
  envVariables: Record<string, string>;
413
411
  overwrite: boolean;
414
412
  browserExecutable: import("./browser-executable").BrowserExecutable;
@@ -420,20 +418,20 @@ export declare const RenderInternals: {
420
418
  cancelSignal: import("./make-cancel-signal").CancelSignal | null;
421
419
  indent: boolean;
422
420
  server: import("./prepare-server").RemotionServer | undefined;
423
- verbose: boolean;
421
+ logLevel: "verbose" | "info" | "warn" | "error";
424
422
  serveUrl: string;
425
423
  port: number | null;
426
424
  }) => Promise<{
427
425
  buffer: Buffer | null;
428
426
  }>;
429
- internalOpenBrowser: ({ browser, browserExecutable, chromiumOptions, forceDeviceScaleFactor, indent, shouldDumpIo, viewport, }: {
430
- shouldDumpIo: boolean;
427
+ internalOpenBrowser: ({ browser, browserExecutable, chromiumOptions, forceDeviceScaleFactor, indent, viewport, logLevel, }: {
431
428
  browserExecutable: string | null;
432
429
  chromiumOptions: import("./open-browser").ChromiumOptions;
433
430
  forceDeviceScaleFactor: number | undefined;
434
431
  viewport: import("./browser/PuppeteerViewport").Viewport | null;
435
432
  indent: boolean;
436
433
  browser: import("./browser").Browser;
434
+ logLevel: "verbose" | "info" | "warn" | "error";
437
435
  }) => Promise<HeadlessBrowser>;
438
436
  internalSelectComposition: (options: {
439
437
  inputProps: Record<string, unknown>;
@@ -446,11 +444,11 @@ export declare const RenderInternals: {
446
444
  port: number | null;
447
445
  indent: boolean;
448
446
  server: import("./prepare-server").RemotionServer | undefined;
449
- verbose: boolean;
447
+ logLevel: "verbose" | "info" | "warn" | "error";
450
448
  serveUrl: string;
451
449
  id: string;
452
450
  }) => Promise<import("remotion").AnyCompMetadata>;
453
- internalGetCompositions: ({ browserExecutable, chromiumOptions, envVariables, indent, inputProps, onBrowserLog, port, puppeteerInstance, serveUrlOrWebpackUrl, server, timeoutInMilliseconds, verbose, }: {
451
+ internalGetCompositions: ({ browserExecutable, chromiumOptions, envVariables, indent, inputProps, onBrowserLog, port, puppeteerInstance, serveUrlOrWebpackUrl, server, timeoutInMilliseconds, logLevel, }: {
454
452
  inputProps: Record<string, unknown>;
455
453
  envVariables: Record<string, string>;
456
454
  puppeteerInstance: HeadlessBrowser | undefined;
@@ -461,11 +459,11 @@ export declare const RenderInternals: {
461
459
  port: number | null;
462
460
  server: import("./prepare-server").RemotionServer | undefined;
463
461
  indent: boolean;
464
- verbose: boolean;
462
+ logLevel: "verbose" | "info" | "warn" | "error";
465
463
  serveUrlOrWebpackUrl: string;
466
464
  }) => Promise<import("remotion").AnyCompMetadata[]>;
467
- internalRenderFrames: ({ browserExecutable, cancelSignal, chromiumOptions, composition, concurrency, dumpBrowserLogs, envVariables, everyNthFrame, frameRange, imageFormat, indent, inputProps, jpegQuality, muted, onBrowserLog, onDownload, onFrameBuffer, onFrameUpdate, onStart, outputDir, port, puppeteerInstance, scale, server, timeoutInMilliseconds, verbose, webpackBundleOrServeUrl, }: import("./render-frames").InternalRenderFramesOptions) => Promise<import("./types").RenderFramesOutput>;
468
- internalRenderMedia: ({ proResProfile, crf, composition, inputProps, pixelFormat, codec, envVariables, frameRange, puppeteerInstance, outputLocation, onProgress, overwrite, onDownload, dumpBrowserLogs, onBrowserLog, onStart, timeoutInMilliseconds, chromiumOptions, scale, browserExecutable, port, cancelSignal, muted, enforceAudioTrack, ffmpegOverride, audioBitrate, videoBitrate, audioCodec, concurrency, disallowParallelEncoding, everyNthFrame, imageFormat: provisionalImageFormat, indent, jpegQuality, numberOfGifLoops, onCtrlCExit, preferLossless, serveUrl, server: reusedServer, verbose, }: import("./render-media").InternalRenderMediaOptions) => Promise<{
465
+ internalRenderFrames: ({ browserExecutable, cancelSignal, chromiumOptions, composition, concurrency, envVariables, everyNthFrame, frameRange, imageFormat, indent, inputProps, jpegQuality, muted, onBrowserLog, onDownload, onFrameBuffer, onFrameUpdate, onStart, outputDir, port, puppeteerInstance, scale, server, timeoutInMilliseconds, logLevel, webpackBundleOrServeUrl, }: import("./render-frames").InternalRenderFramesOptions) => Promise<import("./types").RenderFramesOutput>;
466
+ internalRenderMedia: ({ proResProfile, crf, composition, inputProps, pixelFormat, codec, envVariables, frameRange, puppeteerInstance, outputLocation, onProgress, overwrite, onDownload, onBrowserLog, onStart, timeoutInMilliseconds, chromiumOptions, scale, browserExecutable, port, cancelSignal, muted, enforceAudioTrack, ffmpegOverride, audioBitrate, videoBitrate, audioCodec, concurrency, disallowParallelEncoding, everyNthFrame, imageFormat: provisionalImageFormat, indent, jpegQuality, numberOfGifLoops, onCtrlCExit, preferLossless, serveUrl, server: reusedServer, logLevel, }: import("./render-media").InternalRenderMediaOptions) => Promise<{
469
467
  buffer: Buffer | null;
470
468
  slowestFrames: import("./render-media").SlowFrame[];
471
469
  }>;
@@ -0,0 +1,3 @@
1
+ import type { DownloadMap } from './assets/download-map';
2
+ export declare const isBeyondLastFrame: (downloadMap: DownloadMap, src: string, time: number) => boolean | 0;
3
+ export declare const markAsBeyondLastFrame: (downloadMap: DownloadMap, src: string, time: number) => void;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.markAsBeyondLastFrame = exports.isBeyondLastFrame = void 0;
4
+ const isBeyondLastFrame = (downloadMap, src, time) => {
5
+ return (downloadMap.isBeyondLastFrameMap[src] &&
6
+ time >= downloadMap.isBeyondLastFrameMap[src]);
7
+ };
8
+ exports.isBeyondLastFrame = isBeyondLastFrame;
9
+ const markAsBeyondLastFrame = (downloadMap, src, time) => {
10
+ downloadMap.isBeyondLastFrameMap[src] = time;
11
+ };
12
+ exports.markAsBeyondLastFrame = markAsBeyondLastFrame;
@@ -0,0 +1,17 @@
1
+ import type { OffthreadVideoImageFormat } from 'remotion';
2
+ import type { DownloadMap, SpecialVCodecForTransparency } from './assets/download-map';
3
+ import type { FfmpegExecutable } from './ffmpeg-executable';
4
+ export type LastFrameOptions = {
5
+ ffmpegExecutable: FfmpegExecutable;
6
+ ffprobeExecutable: FfmpegExecutable;
7
+ offset: number;
8
+ src: string;
9
+ specialVCodecForTransparency: SpecialVCodecForTransparency;
10
+ imageFormat: OffthreadVideoImageFormat;
11
+ needsResize: [number, number] | null;
12
+ downloadMap: DownloadMap;
13
+ remotionRoot: string;
14
+ };
15
+ export declare const setLastFrameInCache: (options: LastFrameOptions, data: Buffer) => void;
16
+ export declare const getLastFrameFromCache: (options: LastFrameOptions) => Buffer | null;
17
+ export declare const clearLastFileCache: (downloadMap: DownloadMap) => void;
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ // OffthreadVideo requires sometimes that the last frame of a video gets extracted, however, this can be slow. We allocate a cache for it but that can be garbage collected
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.clearLastFileCache = exports.getLastFrameFromCache = exports.setLastFrameInCache = void 0;
5
+ const MAX_CACHE_SIZE = 50 * 1024 * 1024; // 50MB
6
+ let bufferSize = 0;
7
+ const makeLastFrameCacheKey = (options) => {
8
+ return [
9
+ options.ffmpegExecutable,
10
+ options.offset,
11
+ options.src,
12
+ options.imageFormat,
13
+ options.downloadMap.id,
14
+ ].join('-');
15
+ };
16
+ const setLastFrameInCache = (options, data) => {
17
+ const key = makeLastFrameCacheKey(options);
18
+ if (options.downloadMap.lastFrameMap[key]) {
19
+ bufferSize -= options.downloadMap.lastFrameMap[key].data.byteLength;
20
+ }
21
+ options.downloadMap.lastFrameMap[key] = { data, lastAccessed: Date.now() };
22
+ bufferSize += data.byteLength;
23
+ ensureMaxSize(options.downloadMap);
24
+ };
25
+ exports.setLastFrameInCache = setLastFrameInCache;
26
+ const getLastFrameFromCache = (options) => {
27
+ var _a;
28
+ const key = makeLastFrameCacheKey(options);
29
+ if (!options.downloadMap.lastFrameMap[key]) {
30
+ return null;
31
+ }
32
+ options.downloadMap.lastFrameMap[key].lastAccessed = Date.now();
33
+ return (_a = options.downloadMap.lastFrameMap[key].data) !== null && _a !== void 0 ? _a : null;
34
+ };
35
+ exports.getLastFrameFromCache = getLastFrameFromCache;
36
+ const removedLastFrameFromCache = (key, downloadMap) => {
37
+ if (!downloadMap.lastFrameMap[key]) {
38
+ return;
39
+ }
40
+ bufferSize -= downloadMap.lastFrameMap[key].data.byteLength;
41
+ delete downloadMap.lastFrameMap[key];
42
+ };
43
+ const ensureMaxSize = (downloadMap) => {
44
+ // eslint-disable-next-line no-unmodified-loop-condition
45
+ while (bufferSize > MAX_CACHE_SIZE) {
46
+ const earliest = Object.entries(downloadMap.lastFrameMap).sort((a, b) => {
47
+ return a[1].lastAccessed - b[1].lastAccessed;
48
+ })[0];
49
+ removedLastFrameFromCache(earliest[0], downloadMap);
50
+ }
51
+ };
52
+ const clearLastFileCache = (downloadMap) => {
53
+ downloadMap.lastFrameMap = {};
54
+ };
55
+ exports.clearLastFileCache = clearLastFileCache;
@@ -0,0 +1,9 @@
1
+ export type ServeUrlOrWebpackBundle = {
2
+ serveUrl: string;
3
+ } | {
4
+ /**
5
+ * @deprecated Renamed to `serveUrl`
6
+ */
7
+ webpackBundle: string;
8
+ };
9
+ export declare const getServeUrlWithFallback: (serve: ServeUrlOrWebpackBundle) => string;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getServeUrlWithFallback = void 0;
4
+ const getServeUrlWithFallback = (serve) => {
5
+ if ('webpackBundle' in serve) {
6
+ return serve.webpackBundle;
7
+ }
8
+ if ('serveUrl' in serve) {
9
+ return serve.serveUrl;
10
+ }
11
+ throw new Error('You must pass the `serveUrl` parameter');
12
+ };
13
+ exports.getServeUrlWithFallback = getServeUrlWithFallback;
package/dist/logger.d.ts CHANGED
@@ -6,7 +6,6 @@ type LogOptions = {
6
6
  };
7
7
  type VerboseLogOptions = LogOptions & {
8
8
  tag?: string;
9
- secondTag?: string;
10
9
  };
11
10
  export declare const verboseTag: (str: string) => string;
12
11
  export declare const secondverboseTag: (str: string) => string;
@@ -19,6 +18,6 @@ export declare const Log: {
19
18
  warnAdvanced: (options: LogOptions, message?: any, ...optionalParams: any[]) => void;
20
19
  error: (message?: any, ...optionalParams: any[]) => void;
21
20
  };
22
- export declare const getLogLevel: () => "error" | "verbose" | "info" | "warn";
21
+ export declare const getLogLevel: () => "verbose" | "info" | "warn" | "error";
23
22
  export declare const setLogLevel: (newLogLevel: LogLevel) => void;
24
23
  export {};
package/dist/logger.js CHANGED
@@ -22,12 +22,7 @@ exports.Log = {
22
22
  if ((0, log_level_1.isEqualOrBelowLogLevel)(options.logLevel, 'verbose')) {
23
23
  return console.log(...[
24
24
  options.indent ? exports.INDENT_TOKEN : null,
25
- [
26
- options.tag ? (0, exports.verboseTag)(options.tag) : null,
27
- options.secondTag ? (0, exports.secondverboseTag)(options.secondTag) : null,
28
- ]
29
- .filter(truthy_1.truthy)
30
- .join(''),
25
+ options.tag ? (0, exports.verboseTag)(options.tag) : null,
31
26
  ...args.map((a) => chalk_1.chalk.gray(a)),
32
27
  ].filter(truthy_1.truthy));
33
28
  }
@@ -36,12 +31,12 @@ exports.Log = {
36
31
  exports.Log.infoAdvanced({ indent: false, logLevel: (0, exports.getLogLevel)() }, ...args);
37
32
  },
38
33
  infoAdvanced: (options, ...args) => {
39
- if ((0, log_level_1.isEqualOrBelowLogLevel)(options.logLevel, 'info')) {
40
- return console.log(...[options.indent ? exports.INDENT_TOKEN : null, ...args].filter(truthy_1.truthy));
41
- }
34
+ return console.log(...[options.indent ? exports.INDENT_TOKEN : null, ...args].filter(truthy_1.truthy));
42
35
  },
43
36
  warn: (...args) => {
44
- exports.Log.warnAdvanced({ indent: false, logLevel: (0, exports.getLogLevel)() }, ...args);
37
+ if ((0, log_level_1.isEqualOrBelowLogLevel)((0, exports.getLogLevel)(), 'warn')) {
38
+ exports.Log.warnAdvanced({ indent: false, logLevel: (0, exports.getLogLevel)() }, ...args);
39
+ }
45
40
  },
46
41
  warnAdvanced: (options, ...args) => {
47
42
  if ((0, log_level_1.isEqualOrBelowLogLevel)(options.logLevel, 'warn')) {
@@ -1,15 +1,16 @@
1
1
  import type { RequestListener } from 'node:http';
2
2
  import type { DownloadMap } from './assets/download-map';
3
3
  import type { Compositor } from './compositor/compositor';
4
+ import type { LogLevel } from './log-level';
4
5
  export declare const extractUrlAndSourceFromUrl: (url: string) => {
5
6
  src: string;
6
7
  time: number;
7
8
  transparent: boolean;
8
9
  };
9
- export declare const startOffthreadVideoServer: ({ downloadMap, concurrency, verbose, indent, }: {
10
+ export declare const startOffthreadVideoServer: ({ downloadMap, concurrency, logLevel, indent, }: {
10
11
  downloadMap: DownloadMap;
11
12
  concurrency: number;
12
- verbose: boolean;
13
+ logLevel: LogLevel;
13
14
  indent: boolean;
14
15
  }) => {
15
16
  listener: RequestListener;
@@ -4,6 +4,7 @@ exports.OffthreadVideoServerEmitter = exports.startOffthreadVideoServer = export
4
4
  const node_url_1 = require("node:url");
5
5
  const download_and_map_assets_to_file_1 = require("./assets/download-and-map-assets-to-file");
6
6
  const compositor_1 = require("./compositor/compositor");
7
+ const log_level_1 = require("./log-level");
7
8
  const extractUrlAndSourceFromUrl = (url) => {
8
9
  const parsed = new URL(url, 'http://localhost');
9
10
  const query = parsed.search;
@@ -27,13 +28,13 @@ const extractUrlAndSourceFromUrl = (url) => {
27
28
  };
28
29
  };
29
30
  exports.extractUrlAndSourceFromUrl = extractUrlAndSourceFromUrl;
30
- const startOffthreadVideoServer = ({ downloadMap, concurrency, verbose, indent, }) => {
31
+ const startOffthreadVideoServer = ({ downloadMap, concurrency, logLevel, indent, }) => {
31
32
  const events = new OffthreadVideoServerEmitter();
32
33
  const compositor = (0, compositor_1.startCompositor)('StartLongRunningProcess', {
33
34
  concurrency,
34
35
  maximum_frame_cache_items: (0, compositor_1.getIdealMaximumFrameCacheItems)(),
35
- verbose,
36
- }, indent);
36
+ verbose: (0, log_level_1.isEqualOrBelowLogLevel)(logLevel, 'verbose'),
37
+ }, logLevel, indent);
37
38
  return {
38
39
  close: () => {
39
40
  compositor.finishCommands();
@@ -1,6 +1,7 @@
1
1
  import type { Browser } from './browser';
2
2
  import type { HeadlessBrowser } from './browser/Browser';
3
3
  import type { Viewport } from './browser/PuppeteerViewport';
4
+ import { type LogLevel } from './log-level';
4
5
  declare const validRenderers: readonly ["swangle", "angle", "egl", "swiftshader"];
5
6
  type OpenGlRenderer = typeof validRenderers[number];
6
7
  export type ChromiumOptions = {
@@ -12,13 +13,13 @@ export type ChromiumOptions = {
12
13
  };
13
14
  export declare const killAllBrowsers: () => Promise<void>;
14
15
  type InternalOpenBrowserOptions = {
15
- shouldDumpIo: boolean;
16
16
  browserExecutable: string | null;
17
17
  chromiumOptions: ChromiumOptions;
18
18
  forceDeviceScaleFactor: number | undefined;
19
19
  viewport: Viewport | null;
20
20
  indent: boolean;
21
21
  browser: Browser;
22
+ logLevel: LogLevel;
22
23
  };
23
24
  export type OpenBrowserOptions = {
24
25
  shouldDumpIo?: boolean;
@@ -26,7 +27,7 @@ export type OpenBrowserOptions = {
26
27
  chromiumOptions?: ChromiumOptions;
27
28
  forceDeviceScaleFactor?: number;
28
29
  };
29
- export declare const internalOpenBrowser: ({ browser, browserExecutable, chromiumOptions, forceDeviceScaleFactor, indent, shouldDumpIo, viewport, }: InternalOpenBrowserOptions) => Promise<HeadlessBrowser>;
30
+ export declare const internalOpenBrowser: ({ browser, browserExecutable, chromiumOptions, forceDeviceScaleFactor, indent, viewport, logLevel, }: InternalOpenBrowserOptions) => Promise<HeadlessBrowser>;
30
31
  /**
31
32
  * @description Opens a Chrome or Chromium browser instance.
32
33
  * @see [Documentation](https://www.remotion.dev/docs/renderer/open-browser)
@@ -4,6 +4,7 @@ exports.openBrowser = exports.internalOpenBrowser = exports.killAllBrowsers = vo
4
4
  const node_1 = require("./browser/node");
5
5
  const get_local_browser_executable_1 = require("./get-local-browser-executable");
6
6
  const get_video_threads_flag_1 = require("./get-video-threads-flag");
7
+ const log_level_1 = require("./log-level");
7
8
  const validate_opengl_renderer_1 = require("./validate-opengl-renderer");
8
9
  const validRenderers = ['swangle', 'angle', 'egl', 'swiftshader'];
9
10
  const getOpenGlRenderer = (option) => {
@@ -21,13 +22,13 @@ const browserInstances = [];
21
22
  const killAllBrowsers = async () => {
22
23
  for (const browser of browserInstances) {
23
24
  try {
24
- await browser.close(true);
25
+ await browser.close(true, 'info', false);
25
26
  }
26
27
  catch (err) { }
27
28
  }
28
29
  };
29
30
  exports.killAllBrowsers = killAllBrowsers;
30
- const internalOpenBrowser = async ({ browser, browserExecutable, chromiumOptions, forceDeviceScaleFactor, indent, shouldDumpIo, viewport, }) => {
31
+ const internalOpenBrowser = async ({ browser, browserExecutable, chromiumOptions, forceDeviceScaleFactor, indent, viewport, logLevel, }) => {
31
32
  var _a, _b;
32
33
  if (browser === 'firefox') {
33
34
  throw new TypeError('Firefox supported is not yet turned on. Stay tuned for the future.');
@@ -38,7 +39,8 @@ const internalOpenBrowser = async ({ browser, browserExecutable, chromiumOptions
38
39
  const browserInstance = await node_1.puppeteer.launch({
39
40
  executablePath,
40
41
  product: browser,
41
- dumpio: shouldDumpIo,
42
+ dumpio: (0, log_level_1.isEqualOrBelowLogLevel)(logLevel, 'verbose'),
43
+ logLevel,
42
44
  indent,
43
45
  args: [
44
46
  'about:blank',
@@ -109,7 +111,7 @@ const internalOpenBrowser = async ({ browser, browserExecutable, chromiumOptions
109
111
  deviceScaleFactor: 1,
110
112
  },
111
113
  });
112
- const pages = await browserInstance.pages();
114
+ const pages = await browserInstance.pages(logLevel, indent);
113
115
  await pages[0].close();
114
116
  browserInstances.push(browserInstance);
115
117
  return browserInstance;
@@ -127,8 +129,8 @@ const openBrowser = (browser, options) => {
127
129
  chromiumOptions: chromiumOptions !== null && chromiumOptions !== void 0 ? chromiumOptions : {},
128
130
  forceDeviceScaleFactor,
129
131
  indent: false,
130
- shouldDumpIo: shouldDumpIo !== null && shouldDumpIo !== void 0 ? shouldDumpIo : false,
131
132
  viewport: null,
133
+ logLevel: shouldDumpIo ? 'verbose' : 'info',
132
134
  });
133
135
  };
134
136
  exports.openBrowser = openBrowser;
package/dist/perf.js CHANGED
@@ -29,8 +29,10 @@ exports.stopPerfMeasure = stopPerfMeasure;
29
29
  const getPerf = () => {
30
30
  return [
31
31
  'Render performance:',
32
- ...Object.keys(perf).map((p) => {
33
- return ` ${p} => ${perf[p].reduce((a, b) => a + b, 0) / perf[p].length} (n = ${perf[p].length})`;
32
+ ...Object.keys(perf)
33
+ .filter((p) => perf[p].length)
34
+ .map((p) => {
35
+ return ` ${p} => ${perf[p].reduce((a, b) => a + b, 0) / perf[p].length}ms (n = ${perf[p].length})`;
34
36
  }),
35
37
  ];
36
38
  };
@@ -3,6 +3,7 @@ import type { DownloadMap } from './assets/download-map';
3
3
  import type { Compositor } from './compositor/compositor';
4
4
  import type { OffthreadVideoServerEmitter } from './offthread-video-server';
5
5
  import type { AnySourceMapConsumer } from './symbolicate-stacktrace';
6
+ import type { LogLevel } from './log-level';
6
7
  export type RemotionServer = {
7
8
  serveUrl: string;
8
9
  closeServer: (force: boolean) => Promise<unknown>;
@@ -17,10 +18,10 @@ type PrepareServerOptions = {
17
18
  port: number | null;
18
19
  remotionRoot: string;
19
20
  concurrency: number;
20
- verbose: boolean;
21
+ logLevel: LogLevel;
21
22
  indent: boolean;
22
23
  };
23
- export declare const prepareServer: ({ webpackConfigOrServeUrl, port, remotionRoot, concurrency, verbose, indent, }: PrepareServerOptions) => Promise<RemotionServer>;
24
+ export declare const prepareServer: ({ webpackConfigOrServeUrl, port, remotionRoot, concurrency, logLevel, indent, }: PrepareServerOptions) => Promise<RemotionServer>;
24
25
  export declare const makeOrReuseServer: (server: RemotionServer | undefined, config: PrepareServerOptions, { onDownload, onError, }: {
25
26
  onError: (err: Error) => void;
26
27
  onDownload: RenderMediaOnDownload | null;
@@ -14,16 +14,16 @@ const logger_1 = require("./logger");
14
14
  const serve_static_1 = require("./serve-static");
15
15
  const symbolicate_stacktrace_1 = require("./symbolicate-stacktrace");
16
16
  const wait_for_symbolication_error_to_be_done_1 = require("./wait-for-symbolication-error-to-be-done");
17
- const prepareServer = async ({ webpackConfigOrServeUrl, port, remotionRoot, concurrency, verbose, indent, }) => {
17
+ const prepareServer = async ({ webpackConfigOrServeUrl, port, remotionRoot, concurrency, logLevel, indent, }) => {
18
18
  const downloadMap = (0, download_map_1.makeDownloadMap)();
19
- logger_1.Log.verboseAdvanced({ indent, logLevel: verbose ? 'verbose' : 'info' }, 'Created directory for temporary files', downloadMap.assetDir);
19
+ logger_1.Log.verboseAdvanced({ indent, logLevel }, 'Created directory for temporary files', downloadMap.assetDir);
20
20
  if ((0, is_serve_url_1.isServeUrl)(webpackConfigOrServeUrl)) {
21
21
  const { port: offthreadPort, close: closeProxy, compositor: comp, events, } = await (0, serve_static_1.serveStatic)(null, {
22
22
  port,
23
23
  downloadMap,
24
24
  remotionRoot,
25
25
  concurrency,
26
- verbose,
26
+ logLevel,
27
27
  indent,
28
28
  });
29
29
  return Promise.resolve({
@@ -51,7 +51,7 @@ const prepareServer = async ({ webpackConfigOrServeUrl, port, remotionRoot, conc
51
51
  downloadMap,
52
52
  remotionRoot,
53
53
  concurrency,
54
- verbose,
54
+ logLevel,
55
55
  indent,
56
56
  });
57
57
  return Promise.resolve({
@@ -4,6 +4,7 @@ import type { VideoImageFormat } from './image-format';
4
4
  import type { CancelSignal } from './make-cancel-signal';
5
5
  import type { PixelFormat } from './pixel-format';
6
6
  import type { ProResProfile } from './prores-profile';
7
+ import type { LogLevel } from './log-level';
7
8
  type RunningStatus = {
8
9
  type: 'running';
9
10
  } | {
@@ -24,7 +25,7 @@ type PreStitcherOptions = {
24
25
  crf: number | null | undefined;
25
26
  onProgress: (progress: number) => void;
26
27
  proResProfile: ProResProfile | undefined;
27
- verbose: boolean;
28
+ logLevel: LogLevel;
28
29
  imageFormat: VideoImageFormat;
29
30
  ffmpegOverride: FfmpegOverrideFn;
30
31
  signal: CancelSignal;
@@ -29,34 +29,6 @@ const prespawnFfmpeg = (options) => {
29
29
  if (encoderName === null) {
30
30
  throw new TypeError('encoderName is null: ' + JSON.stringify(options));
31
31
  }
32
- const supportsCrf = codec !== 'prores';
33
- logger_1.Log.verboseAdvanced({
34
- indent: options.indent,
35
- logLevel: options.verbose ? 'verbose' : 'info',
36
- tag: 'prespawnFfmpeg()',
37
- }, 'encoder', encoderName);
38
- logger_1.Log.verboseAdvanced({
39
- indent: options.indent,
40
- logLevel: options.verbose ? 'verbose' : 'info',
41
- tag: 'prespawnFfmpeg()',
42
- }, 'pixelFormat', pixelFormat);
43
- if (supportsCrf) {
44
- logger_1.Log.verboseAdvanced({
45
- indent: options.indent,
46
- logLevel: options.verbose ? 'verbose' : 'info',
47
- tag: 'prespawnFfmpeg()',
48
- }, 'pixelFormat', options.crf);
49
- }
50
- logger_1.Log.verboseAdvanced({
51
- indent: options.indent,
52
- logLevel: options.verbose ? 'verbose' : 'info',
53
- tag: 'prespawnFfmpeg()',
54
- }, 'codec', codec);
55
- logger_1.Log.verboseAdvanced({
56
- indent: options.indent,
57
- logLevel: options.verbose ? 'verbose' : 'info',
58
- tag: 'prespawnFfmpeg()',
59
- }, 'proResProfileName', proResProfileName);
60
32
  (0, pixel_format_1.validateSelectedPixelFormatAndCodecCombination)(pixelFormat, codec);
61
33
  const ffmpegArgs = [
62
34
  ['-r', options.fps.toFixed(2)],
@@ -86,12 +58,12 @@ const prespawnFfmpeg = (options) => {
86
58
  ];
87
59
  logger_1.Log.verboseAdvanced({
88
60
  indent: options.indent,
89
- logLevel: options.verbose ? 'verbose' : 'info',
61
+ logLevel: options.logLevel,
90
62
  tag: 'prespawnFfmpeg()',
91
63
  }, 'Generated FFMPEG command:');
92
64
  logger_1.Log.verboseAdvanced({
93
65
  indent: options.indent,
94
- logLevel: options.verbose ? 'verbose' : 'info',
66
+ logLevel: options.logLevel,
95
67
  tag: 'prespawnFfmpeg()',
96
68
  }, ffmpegArgs.join(' '));
97
69
  const ffmpegString = ffmpegArgs.flat(2).filter(Boolean);
@@ -0,0 +1 @@
1
+ export declare const validateQuality: (q: number | undefined) => void;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateQuality = void 0;
4
+ const validateQuality = (q) => {
5
+ if (typeof q !== 'undefined' && typeof q !== 'number') {
6
+ throw new Error(`Quality option must be a number or undefined. Got ${typeof q} (${JSON.stringify(q)})`);
7
+ }
8
+ if (typeof q === 'undefined') {
9
+ return;
10
+ }
11
+ if (!Number.isFinite(q)) {
12
+ throw new RangeError(`Quality must be a finite number, but is ${q}`);
13
+ }
14
+ if (Number.isNaN(q)) {
15
+ throw new RangeError(`Quality is NaN, but must be a real number`);
16
+ }
17
+ if (q > 100 || q < 0) {
18
+ throw new RangeError('Quality option must be between 0 and 100.');
19
+ }
20
+ };
21
+ exports.validateQuality = validateQuality;