@remotion/renderer 4.0.0-alpha4 → 4.0.0-alpha5

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 (121) hide show
  1. package/README.md +5 -43
  2. package/dist/assets/download-map.d.ts +0 -26
  3. package/dist/assets/download-map.js +0 -5
  4. package/dist/assets/get-audio-channels.d.ts +1 -2
  5. package/dist/assets/get-audio-channels.js +5 -9
  6. package/dist/audio-codec.d.ts +4 -3
  7. package/dist/audio-codec.js +3 -9
  8. package/dist/browser/BrowserFetcher.d.ts +0 -1
  9. package/dist/browser/BrowserFetcher.js +1 -2
  10. package/dist/browser/BrowserRunner.js +8 -2
  11. package/dist/browser/FrameManager.js +2 -3
  12. package/dist/browser/LaunchOptions.d.ts +1 -0
  13. package/dist/browser/Launcher.js +2 -1
  14. package/dist/browser/devtools-commands.d.ts +5 -1
  15. package/dist/browser/devtools-types.d.ts +78 -0
  16. package/dist/browser/is-target-closed-err.d.ts +1 -0
  17. package/dist/browser/is-target-closed-err.js +9 -0
  18. package/dist/call-ffmpeg.d.ts +14 -0
  19. package/dist/call-ffmpeg.js +37 -0
  20. package/dist/check-apple-silicon.js +2 -45
  21. package/dist/client.d.ts +67 -42
  22. package/dist/client.js +27 -1
  23. package/dist/codec-supports-media.d.ts +2 -1
  24. package/dist/codec-supports-media.js +20 -5
  25. package/dist/combine-videos.d.ts +0 -3
  26. package/dist/combine-videos.js +5 -9
  27. package/dist/compositor/compose.d.ts +3 -1
  28. package/dist/compositor/compose.js +34 -14
  29. package/dist/compositor/compositor.d.ts +12 -0
  30. package/dist/compositor/compositor.js +202 -0
  31. package/dist/compositor/get-executable-path.d.ts +1 -1
  32. package/dist/compositor/get-executable-path.js +27 -8
  33. package/dist/compositor/make-nonce.d.ts +1 -0
  34. package/dist/compositor/make-nonce.js +8 -0
  35. package/dist/compositor/payloads.d.ts +34 -7
  36. package/dist/create-ffmpeg-complex-filter.d.ts +5 -5
  37. package/dist/create-ffmpeg-complex-filter.js +2 -4
  38. package/dist/create-ffmpeg-merge-filter.d.ts +2 -5
  39. package/dist/create-ffmpeg-merge-filter.js +2 -10
  40. package/dist/create-silent-audio.d.ts +1 -4
  41. package/dist/create-silent-audio.js +3 -7
  42. package/dist/crf.js +8 -2
  43. package/dist/delete-directory.js +16 -16
  44. package/dist/file-extensions.d.ts +1 -12
  45. package/dist/file-extensions.js +1 -13
  46. package/dist/get-compositions.d.ts +3 -5
  47. package/dist/get-compositions.js +8 -11
  48. package/dist/get-extension-from-codec.d.ts +2 -2
  49. package/dist/get-frame-padded-index.d.ts +2 -1
  50. package/dist/guess-extension-for-media.d.ts +1 -3
  51. package/dist/guess-extension-for-media.js +4 -8
  52. package/dist/image-format.d.ts +12 -6
  53. package/dist/image-format.js +16 -13
  54. package/dist/index.d.ts +66 -59
  55. package/dist/index.js +15 -17
  56. package/dist/jpeg-quality.d.ts +1 -0
  57. package/dist/jpeg-quality.js +21 -0
  58. package/dist/merge-audio-track.d.ts +0 -2
  59. package/dist/merge-audio-track.js +3 -10
  60. package/dist/offthread-video-server.d.ts +8 -8
  61. package/dist/offthread-video-server.js +63 -56
  62. package/dist/open-browser.d.ts +1 -0
  63. package/dist/open-browser.js +7 -6
  64. package/dist/options/audio-bitrate.d.ts +2 -0
  65. package/dist/options/audio-bitrate.js +11 -0
  66. package/dist/options/crf.d.ts +2 -0
  67. package/dist/options/crf.js +11 -0
  68. package/dist/options/enforce-audio.d.ts +2 -0
  69. package/dist/options/enforce-audio.js +11 -0
  70. package/dist/options/jpeg-quality.d.ts +2 -0
  71. package/dist/options/jpeg-quality.js +11 -0
  72. package/dist/options/mute.d.ts +2 -0
  73. package/dist/options/mute.js +11 -0
  74. package/dist/options/option.d.ts +8 -0
  75. package/dist/options/option.js +2 -0
  76. package/dist/options/scale.d.ts +2 -0
  77. package/dist/options/scale.js +11 -0
  78. package/dist/options/video-bitrate.d.ts +2 -0
  79. package/dist/options/video-bitrate.js +11 -0
  80. package/dist/options/video-codec.d.ts +2 -0
  81. package/dist/options/video-codec.js +11 -0
  82. package/dist/perf.d.ts +1 -1
  83. package/dist/perf.js +9 -7
  84. package/dist/prepare-server.d.ts +3 -4
  85. package/dist/prepare-server.js +5 -5
  86. package/dist/preprocess-audio-track.d.ts +0 -4
  87. package/dist/preprocess-audio-track.js +4 -8
  88. package/dist/prespawn-ffmpeg.d.ts +6 -9
  89. package/dist/prespawn-ffmpeg.js +7 -12
  90. package/dist/prestitcher-memory-usage.d.ts +0 -4
  91. package/dist/prestitcher-memory-usage.js +2 -3
  92. package/dist/prores-profile.d.ts +1 -2
  93. package/dist/prores-profile.js +4 -4
  94. package/dist/provide-screenshot.d.ts +4 -5
  95. package/dist/provide-screenshot.js +2 -2
  96. package/dist/puppeteer-screenshot.d.ts +3 -3
  97. package/dist/puppeteer-screenshot.js +9 -32
  98. package/dist/render-frames.d.ts +13 -25
  99. package/dist/render-frames.js +29 -40
  100. package/dist/render-media.d.ts +16 -18
  101. package/dist/render-media.js +33 -43
  102. package/dist/render-still.d.ts +10 -8
  103. package/dist/render-still.js +14 -13
  104. package/dist/screenshot-dom-element.d.ts +4 -5
  105. package/dist/screenshot-dom-element.js +6 -3
  106. package/dist/screenshot-task.d.ts +2 -3
  107. package/dist/screenshot-task.js +38 -23
  108. package/dist/serve-handler/index.js +6 -4
  109. package/dist/serve-static.d.ts +2 -3
  110. package/dist/serve-static.js +24 -20
  111. package/dist/stitch-frames-to-video.d.ts +2 -12
  112. package/dist/stitch-frames-to-video.js +24 -33
  113. package/dist/take-frame-and-compose.d.ts +4 -5
  114. package/dist/take-frame-and-compose.js +12 -6
  115. package/dist/tmp-dir.js +1 -2
  116. package/dist/validate-concurrency.d.ts +2 -0
  117. package/dist/validate-concurrency.js +11 -5
  118. package/dist/validate-output-filename.d.ts +1 -1
  119. package/dist/validate-puppeteer-timeout.js +1 -0
  120. package/install-toolchain.mjs +36 -0
  121. package/package.json +11 -10
package/dist/client.d.ts CHANGED
@@ -1,97 +1,99 @@
1
1
  export declare const BrowserSafeApis: {
2
- getFileExtensionFromCodec: <T extends "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif">(codec: T, audioCodec: "mp3" | "aac" | "pcm-16" | "opus" | null) => import("./file-extensions").FileExtension;
2
+ getFileExtensionFromCodec: <T extends "aac" | "mp3" | "h264" | "h265" | "vp8" | "vp9" | "wav" | "prores" | "h264-mkv" | "gif">(codec: T, audioCodec: "pcm-16" | "aac" | "mp3" | "opus" | null) => import("./file-extensions").FileExtension;
3
3
  validCodecs: readonly ["h264", "h265", "vp8", "vp9", "mp3", "aac", "wav", "prores", "h264-mkv", "gif"];
4
- getDefaultCrfForCodec: (codec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif") => number;
5
- getValidCrfRanges: (codec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif") => [number, number];
6
- isAudioCodec: (codec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif" | undefined) => boolean;
4
+ validAudioCodecs: readonly ["pcm-16", "aac", "mp3", "opus"];
5
+ getDefaultCrfForCodec: (codec: "aac" | "mp3" | "h264" | "h265" | "vp8" | "vp9" | "wav" | "prores" | "h264-mkv" | "gif") => number;
6
+ getValidCrfRanges: (codec: "aac" | "mp3" | "h264" | "h265" | "vp8" | "vp9" | "wav" | "prores" | "h264-mkv" | "gif") => [number, number];
7
+ isAudioCodec: (codec: "aac" | "mp3" | "h264" | "h265" | "vp8" | "vp9" | "wav" | "prores" | "h264-mkv" | "gif" | undefined) => boolean;
8
+ proResProfileOptions: readonly ["4444-xq", "4444", "hq", "standard", "light", "proxy"];
7
9
  validPixelFormats: readonly ["yuv420p", "yuva420p", "yuv422p", "yuv444p", "yuv420p10le", "yuv422p10le", "yuv444p10le", "yuva444p10le"];
8
10
  DEFAULT_PIXEL_FORMAT: "yuv420p" | "yuva420p" | "yuv422p" | "yuv444p" | "yuv420p10le" | "yuv422p10le" | "yuv444p10le" | "yuva444p10le";
9
11
  supportedAudioCodecs: {
10
12
  readonly h264: readonly ["aac", "pcm-16"];
11
13
  readonly 'h264-mkv': readonly ["pcm-16"];
12
14
  readonly aac: readonly ["aac", "pcm-16"];
13
- readonly gif: readonly [];
15
+ readonly gif: const[];
14
16
  readonly h265: readonly ["aac", "pcm-16"];
15
17
  readonly mp3: readonly ["mp3", "pcm-16"];
16
- readonly prores: readonly ["pcm-16", "aac"];
18
+ readonly prores: readonly ["aac", "pcm-16"];
17
19
  readonly vp8: readonly ["opus", "pcm-16"];
18
20
  readonly vp9: readonly ["opus", "pcm-16"];
19
21
  readonly wav: readonly ["pcm-16"];
20
22
  };
21
23
  defaultFileExtensionMap: {
22
- h264: {
24
+ aac: {
23
25
  default: import("./file-extensions").FileExtension;
24
26
  forAudioCodec: {
25
- aac: {
27
+ "pcm-16": {
26
28
  possible: import("./file-extensions").FileExtension[];
27
29
  default: import("./file-extensions").FileExtension;
28
30
  };
29
- "pcm-16": {
31
+ aac: {
30
32
  possible: import("./file-extensions").FileExtension[];
31
33
  default: import("./file-extensions").FileExtension;
32
34
  };
33
35
  };
34
36
  };
35
- h265: {
37
+ mp3: {
36
38
  default: import("./file-extensions").FileExtension;
37
39
  forAudioCodec: {
38
- aac: {
40
+ "pcm-16": {
39
41
  possible: import("./file-extensions").FileExtension[];
40
42
  default: import("./file-extensions").FileExtension;
41
43
  };
42
- "pcm-16": {
44
+ mp3: {
43
45
  possible: import("./file-extensions").FileExtension[];
44
46
  default: import("./file-extensions").FileExtension;
45
47
  };
46
48
  };
47
49
  };
48
- vp8: {
50
+ h264: {
49
51
  default: import("./file-extensions").FileExtension;
50
52
  forAudioCodec: {
51
53
  "pcm-16": {
52
54
  possible: import("./file-extensions").FileExtension[];
53
55
  default: import("./file-extensions").FileExtension;
54
56
  };
55
- opus: {
57
+ aac: {
56
58
  possible: import("./file-extensions").FileExtension[];
57
59
  default: import("./file-extensions").FileExtension;
58
60
  };
59
61
  };
60
62
  };
61
- vp9: {
63
+ h265: {
62
64
  default: import("./file-extensions").FileExtension;
63
65
  forAudioCodec: {
64
66
  "pcm-16": {
65
67
  possible: import("./file-extensions").FileExtension[];
66
68
  default: import("./file-extensions").FileExtension;
67
69
  };
68
- opus: {
70
+ aac: {
69
71
  possible: import("./file-extensions").FileExtension[];
70
72
  default: import("./file-extensions").FileExtension;
71
73
  };
72
74
  };
73
75
  };
74
- mp3: {
76
+ vp8: {
75
77
  default: import("./file-extensions").FileExtension;
76
78
  forAudioCodec: {
77
- mp3: {
79
+ "pcm-16": {
78
80
  possible: import("./file-extensions").FileExtension[];
79
81
  default: import("./file-extensions").FileExtension;
80
82
  };
81
- "pcm-16": {
83
+ opus: {
82
84
  possible: import("./file-extensions").FileExtension[];
83
85
  default: import("./file-extensions").FileExtension;
84
86
  };
85
87
  };
86
88
  };
87
- aac: {
89
+ vp9: {
88
90
  default: import("./file-extensions").FileExtension;
89
91
  forAudioCodec: {
90
- aac: {
92
+ "pcm-16": {
91
93
  possible: import("./file-extensions").FileExtension[];
92
94
  default: import("./file-extensions").FileExtension;
93
95
  };
94
- "pcm-16": {
96
+ opus: {
95
97
  possible: import("./file-extensions").FileExtension[];
96
98
  default: import("./file-extensions").FileExtension;
97
99
  };
@@ -109,11 +111,11 @@ export declare const BrowserSafeApis: {
109
111
  prores: {
110
112
  default: import("./file-extensions").FileExtension;
111
113
  forAudioCodec: {
112
- aac: {
114
+ "pcm-16": {
113
115
  possible: import("./file-extensions").FileExtension[];
114
116
  default: import("./file-extensions").FileExtension;
115
117
  };
116
- "pcm-16": {
118
+ aac: {
117
119
  possible: import("./file-extensions").FileExtension[];
118
120
  default: import("./file-extensions").FileExtension;
119
121
  };
@@ -130,17 +132,30 @@ export declare const BrowserSafeApis: {
130
132
  };
131
133
  gif: {
132
134
  default: import("./file-extensions").FileExtension;
133
- forAudioCodec: {};
135
+ forAudioCodec: {
136
+ [x: string]: {
137
+ possible: import("./file-extensions").FileExtension[];
138
+ default: import("./file-extensions").FileExtension;
139
+ };
140
+ };
134
141
  };
135
142
  };
136
143
  defaultAudioCodecs: {
144
+ aac: {
145
+ compressed: "pcm-16" | "aac" | null;
146
+ lossless: "pcm-16" | "aac" | null;
147
+ };
148
+ mp3: {
149
+ compressed: "pcm-16" | "mp3" | null;
150
+ lossless: "pcm-16" | "mp3" | null;
151
+ };
137
152
  h264: {
138
- compressed: "aac" | "pcm-16" | null;
139
- lossless: "aac" | "pcm-16" | null;
153
+ compressed: "pcm-16" | "aac" | null;
154
+ lossless: "pcm-16" | "aac" | null;
140
155
  };
141
156
  h265: {
142
- compressed: "aac" | "pcm-16" | null;
143
- lossless: "aac" | "pcm-16" | null;
157
+ compressed: "pcm-16" | "aac" | null;
158
+ lossless: "pcm-16" | "aac" | null;
144
159
  };
145
160
  vp8: {
146
161
  compressed: "pcm-16" | "opus" | null;
@@ -150,30 +165,40 @@ export declare const BrowserSafeApis: {
150
165
  compressed: "pcm-16" | "opus" | null;
151
166
  lossless: "pcm-16" | "opus" | null;
152
167
  };
153
- mp3: {
154
- compressed: "mp3" | "pcm-16" | null;
155
- lossless: "mp3" | "pcm-16" | null;
156
- };
157
- aac: {
158
- compressed: "aac" | "pcm-16" | null;
159
- lossless: "aac" | "pcm-16" | null;
160
- };
161
168
  wav: {
162
169
  compressed: "pcm-16" | null;
163
170
  lossless: "pcm-16" | null;
164
171
  };
165
172
  prores: {
166
- compressed: "aac" | "pcm-16" | null;
167
- lossless: "aac" | "pcm-16" | null;
173
+ compressed: "pcm-16" | "aac" | null;
174
+ lossless: "pcm-16" | "aac" | null;
168
175
  };
169
176
  "h264-mkv": {
170
177
  compressed: "pcm-16" | null;
171
178
  lossless: "pcm-16" | null;
172
179
  };
173
180
  gif: {
174
- compressed: null;
175
- lossless: null;
181
+ compressed: any;
182
+ lossless: any;
176
183
  };
177
184
  };
178
- defaultCodecsForFileExtension: Record<import("./file-extensions").FileExtension, "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif">;
185
+ defaultCodecsForFileExtension: Record<import("./file-extensions").FileExtension, "aac" | "mp3" | "h264" | "h265" | "vp8" | "vp9" | "wav" | "prores" | "h264-mkv" | "gif">;
186
+ validateOutputFilename: <T_1 extends "aac" | "mp3" | "h264" | "h265" | "vp8" | "vp9" | "wav" | "prores" | "h264-mkv" | "gif">({ codec, audioCodec, extension, preferLossless, }: {
187
+ codec: T_1;
188
+ audioCodec: "pcm-16" | "aac" | "mp3" | "opus" | null;
189
+ extension: string;
190
+ preferLossless: boolean;
191
+ }) => void;
192
+ options: {
193
+ scaleOption: import(".").RemotionOption;
194
+ crfOption: import(".").RemotionOption;
195
+ jpegQualityOption: import(".").RemotionOption;
196
+ videoBitrate: import(".").RemotionOption;
197
+ audioBitrateOption: import(".").RemotionOption;
198
+ enforceAudioOption: import(".").RemotionOption;
199
+ muteOption: import(".").RemotionOption;
200
+ videoCodecOption: import(".").RemotionOption;
201
+ };
202
+ codecSupportsCrf: (codec: "aac" | "mp3" | "h264" | "h265" | "vp8" | "vp9" | "wav" | "prores" | "h264-mkv" | "gif") => boolean;
203
+ codecSupportsVideoBitrate: (codec: "aac" | "mp3" | "h264" | "h265" | "vp8" | "vp9" | "wav" | "prores" | "h264-mkv" | "gif") => boolean;
179
204
  };
package/dist/client.js CHANGED
@@ -3,21 +3,47 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.BrowserSafeApis = void 0;
4
4
  const audio_codec_1 = require("./audio-codec");
5
5
  const codec_1 = require("./codec");
6
+ const codec_supports_media_1 = require("./codec-supports-media");
6
7
  const crf_1 = require("./crf");
7
8
  const file_extensions_1 = require("./file-extensions");
8
9
  const get_extension_from_codec_1 = require("./get-extension-from-codec");
9
10
  const is_audio_codec_1 = require("./is-audio-codec");
11
+ const audio_bitrate_1 = require("./options/audio-bitrate");
12
+ const crf_2 = require("./options/crf");
13
+ const enforce_audio_1 = require("./options/enforce-audio");
14
+ const jpeg_quality_1 = require("./options/jpeg-quality");
15
+ const mute_1 = require("./options/mute");
16
+ const scale_1 = require("./options/scale");
17
+ const video_bitrate_1 = require("./options/video-bitrate");
18
+ const video_codec_1 = require("./options/video-codec");
10
19
  const pixel_format_1 = require("./pixel-format");
20
+ const prores_profile_1 = require("./prores-profile");
21
+ const validate_output_filename_1 = require("./validate-output-filename");
11
22
  exports.BrowserSafeApis = {
12
23
  getFileExtensionFromCodec: get_extension_from_codec_1.getFileExtensionFromCodec,
13
24
  validCodecs: codec_1.validCodecs,
25
+ validAudioCodecs: audio_codec_1.validAudioCodecs,
14
26
  getDefaultCrfForCodec: crf_1.getDefaultCrfForCodec,
15
27
  getValidCrfRanges: crf_1.getValidCrfRanges,
16
28
  isAudioCodec: is_audio_codec_1.isAudioCodec,
29
+ proResProfileOptions: prores_profile_1.proResProfileOptions,
17
30
  validPixelFormats: pixel_format_1.validPixelFormats,
18
31
  DEFAULT_PIXEL_FORMAT: pixel_format_1.DEFAULT_PIXEL_FORMAT,
19
- supportedAudioCodecs: file_extensions_1.supportedAudioCodecs,
32
+ supportedAudioCodecs: audio_codec_1.supportedAudioCodecs,
20
33
  defaultFileExtensionMap: file_extensions_1.defaultFileExtensionMap,
21
34
  defaultAudioCodecs: audio_codec_1.defaultAudioCodecs,
22
35
  defaultCodecsForFileExtension: get_extension_from_codec_1.defaultCodecsForFileExtension,
36
+ validateOutputFilename: validate_output_filename_1.validateOutputFilename,
37
+ options: {
38
+ scaleOption: scale_1.scaleOption,
39
+ crfOption: crf_2.crfOption,
40
+ jpegQualityOption: jpeg_quality_1.jpegQualityOption,
41
+ videoBitrate: video_bitrate_1.videoBitrate,
42
+ audioBitrateOption: audio_bitrate_1.audioBitrateOption,
43
+ enforceAudioOption: enforce_audio_1.enforceAudioOption,
44
+ muteOption: mute_1.muteOption,
45
+ videoCodecOption: video_codec_1.videoCodecOption,
46
+ },
47
+ codecSupportsCrf: codec_supports_media_1.codecSupportsCrf,
48
+ codecSupportsVideoBitrate: codec_supports_media_1.codecSupportsVideoBitrate,
23
49
  };
@@ -4,5 +4,6 @@ declare type MediaSupport = {
4
4
  audio: boolean;
5
5
  };
6
6
  export declare const codecSupportsMedia: (codec: Codec) => MediaSupport;
7
- export declare const codecSupportsCrf: (codec: Codec) => boolean | "" | null;
7
+ export declare const codecSupportsCrf: (codec: Codec) => boolean;
8
+ export declare const codecSupportsVideoBitrate: (codec: Codec) => boolean;
8
9
  export {};
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.codecSupportsCrf = exports.codecSupportsMedia = void 0;
4
- const get_codec_name_1 = require("./get-codec-name");
3
+ exports.codecSupportsVideoBitrate = exports.codecSupportsCrf = exports.codecSupportsMedia = void 0;
4
+ const crf_1 = require("./crf");
5
5
  const support = {
6
6
  'h264-mkv': {
7
7
  audio: true,
@@ -48,9 +48,24 @@ const codecSupportsMedia = (codec) => {
48
48
  return support[codec];
49
49
  };
50
50
  exports.codecSupportsMedia = codecSupportsMedia;
51
+ const codecSupportsVideoBitrateMap = {
52
+ 'h264-mkv': true,
53
+ aac: false,
54
+ gif: false,
55
+ h264: true,
56
+ h265: true,
57
+ mp3: false,
58
+ prores: false,
59
+ vp8: true,
60
+ vp9: true,
61
+ wav: false,
62
+ };
51
63
  const codecSupportsCrf = (codec) => {
52
- const encoderName = (0, get_codec_name_1.getCodecName)(codec);
53
- const supportsCrf = encoderName && codec !== 'prores';
54
- return supportsCrf;
64
+ const range = (0, crf_1.getValidCrfRanges)(codec);
65
+ return range[0] !== range[1];
55
66
  };
56
67
  exports.codecSupportsCrf = codecSupportsCrf;
68
+ const codecSupportsVideoBitrate = (codec) => {
69
+ return codecSupportsVideoBitrateMap[codec];
70
+ };
71
+ exports.codecSupportsVideoBitrate = codecSupportsVideoBitrate;
@@ -1,6 +1,5 @@
1
1
  import type { AudioCodec } from './audio-codec';
2
2
  import type { Codec } from './codec';
3
- import type { FfmpegExecutable } from './ffmpeg-executable';
4
3
  declare type Options = {
5
4
  files: string[];
6
5
  filelistDir: string;
@@ -10,8 +9,6 @@ declare type Options = {
10
9
  codec: Codec;
11
10
  fps: number;
12
11
  numberOfGifLoops: number | null;
13
- remotionRoot: string;
14
- ffmpegExecutable: FfmpegExecutable;
15
12
  audioCodec: AudioCodec | null;
16
13
  };
17
14
  export declare const combineVideos: (options: Options) => Promise<void>;
@@ -1,27 +1,23 @@
1
1
  "use strict";
2
2
  // Combine multiple video chunks, useful for decentralized rendering
3
- var __importDefault = (this && this.__importDefault) || function (mod) {
4
- return (mod && mod.__esModule) ? mod : { "default": mod };
5
- };
6
3
  Object.defineProperty(exports, "__esModule", { value: true });
7
4
  exports.combineVideos = void 0;
8
- const execa_1 = __importDefault(require("execa"));
9
5
  const fs_1 = require("fs");
10
6
  const path_1 = require("path");
11
7
  const audio_codec_1 = require("./audio-codec");
12
- const ffmpeg_flags_1 = require("./ffmpeg-flags");
8
+ const call_ffmpeg_1 = require("./call-ffmpeg");
13
9
  const is_audio_codec_1 = require("./is-audio-codec");
14
10
  const parse_ffmpeg_progress_1 = require("./parse-ffmpeg-progress");
15
11
  const truthy_1 = require("./truthy");
16
12
  const combineVideos = async (options) => {
17
13
  var _a;
18
- const { files, filelistDir, output, onProgress, numberOfFrames, codec, fps, numberOfGifLoops, ffmpegExecutable, remotionRoot, audioCodec, } = options;
14
+ const { files, filelistDir, output, onProgress, numberOfFrames, codec, fps, numberOfGifLoops, audioCodec, } = options;
19
15
  const fileList = files.map((p) => `file '${p}'`).join('\n');
20
16
  const fileListTxt = (0, path_1.join)(filelistDir, 'files.txt');
21
17
  (0, fs_1.writeFileSync)(fileListTxt, fileList);
22
18
  const resolvedAudioCodec = audioCodec !== null && audioCodec !== void 0 ? audioCodec : (0, audio_codec_1.getDefaultAudioCodec)({ codec, preferLossless: false });
23
19
  try {
24
- const task = (0, execa_1.default)(await (0, ffmpeg_flags_1.getExecutableBinary)(ffmpegExecutable, remotionRoot, 'ffmpeg'), [
20
+ const task = (0, call_ffmpeg_1.callFf)('ffmpeg', [
25
21
  (0, is_audio_codec_1.isAudioCodec)(codec) ? null : '-r',
26
22
  (0, is_audio_codec_1.isAudioCodec)(codec) ? null : String(fps),
27
23
  '-f',
@@ -60,10 +56,10 @@ const combineVideos = async (options) => {
60
56
  });
61
57
  await task;
62
58
  onProgress(numberOfFrames);
63
- (fs_1.rmSync !== null && fs_1.rmSync !== void 0 ? fs_1.rmSync : fs_1.rmdirSync)(filelistDir, { recursive: true });
59
+ (0, fs_1.rmSync)(filelistDir, { recursive: true });
64
60
  }
65
61
  catch (err) {
66
- (fs_1.rmSync !== null && fs_1.rmSync !== void 0 ? fs_1.rmSync : fs_1.rmdirSync)(filelistDir, { recursive: true });
62
+ (0, fs_1.rmSync)(filelistDir, { recursive: true });
67
63
  throw err;
68
64
  }
69
65
  };
@@ -1,13 +1,15 @@
1
1
  import type { DownloadMap } from '../assets/download-map';
2
- import type { CompositorImageFormat, Layer } from './payloads';
2
+ import type { CompositorCommand, CompositorCommandSerialized, CompositorImageFormat, Layer } from './payloads';
3
3
  declare type CompositorInput = {
4
4
  height: number;
5
5
  width: number;
6
6
  layers: Layer[];
7
7
  imageFormat: CompositorImageFormat;
8
8
  };
9
+ export declare const serializeCommand: <Type extends keyof CompositorCommand>(command: Type, params: CompositorCommand[Type]) => CompositorCommandSerialized<Type>;
9
10
  export declare const compose: ({ height, width, layers, output, downloadMap, imageFormat, }: CompositorInput & {
10
11
  downloadMap: DownloadMap;
11
12
  output: string;
12
13
  }) => Promise<void>;
14
+ export declare const callCompositor: (payload: string) => Promise<void>;
13
15
  export {};
@@ -1,31 +1,46 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.compose = void 0;
3
+ exports.callCompositor = exports.compose = exports.serializeCommand = void 0;
4
4
  const child_process_1 = require("child_process");
5
5
  const crypto_1 = require("crypto");
6
6
  const promises_1 = require("fs/promises");
7
+ const call_ffmpeg_1 = require("../call-ffmpeg");
7
8
  const get_executable_path_1 = require("./get-executable-path");
9
+ const make_nonce_1 = require("./make-nonce");
8
10
  const getCompositorHash = ({ ...input }) => {
9
11
  return (0, crypto_1.createHash)('sha256').update(JSON.stringify(input)).digest('base64');
10
12
  };
13
+ const serializeCommand = (command, params) => {
14
+ return {
15
+ nonce: (0, make_nonce_1.makeNonce)(),
16
+ payload: {
17
+ type: command,
18
+ params,
19
+ },
20
+ };
21
+ };
22
+ exports.serializeCommand = serializeCommand;
11
23
  const compose = async ({ height, width, layers, output, downloadMap, imageFormat, }) => {
12
- const bin = (0, get_executable_path_1.getExecutablePath)();
13
24
  const hash = getCompositorHash({ height, width, layers, imageFormat });
14
25
  if (downloadMap.compositorCache[hash]) {
15
26
  await (0, promises_1.copyFile)(downloadMap.compositorCache[hash], output);
16
27
  return;
17
28
  }
18
- const payload = {
19
- v: 1,
29
+ const payload = (0, exports.serializeCommand)('Compose', {
20
30
  height,
21
31
  width,
22
32
  layers,
23
33
  output,
24
34
  output_format: imageFormat,
25
- };
26
- await new Promise((resolve, reject) => {
27
- const child = (0, child_process_1.spawn)(bin);
28
- child.stdin.write(JSON.stringify(payload));
35
+ });
36
+ await (0, exports.callCompositor)(JSON.stringify(payload));
37
+ downloadMap.compositorCache[hash] = output;
38
+ };
39
+ exports.compose = compose;
40
+ const callCompositor = (payload) => {
41
+ return new Promise((resolve, reject) => {
42
+ const child = (0, child_process_1.spawn)((0, get_executable_path_1.getExecutablePath)('compositor'), [payload], (0, call_ffmpeg_1.dynamicLibraryPathOptions)());
43
+ child.stdin.write(payload);
29
44
  child.stdin.end();
30
45
  const stderrChunks = [];
31
46
  child.stderr.on('data', (d) => stderrChunks.push(d));
@@ -35,13 +50,18 @@ const compose = async ({ height, width, layers, output, downloadMap, imageFormat
35
50
  }
36
51
  else {
37
52
  const message = Buffer.concat(stderrChunks).toString('utf-8');
38
- const parsed = JSON.parse(message);
39
- const err = new Error(parsed.error);
40
- err.stack = parsed.error + '\n' + parsed.backtrace;
41
- reject(err);
53
+ try {
54
+ // Try to see if the error is a JSON
55
+ const parsed = JSON.parse(message);
56
+ const msg = `Compositor error: ${parsed.error}`;
57
+ const err = new Error(`${msg}\n${parsed.backtrace}`);
58
+ reject(err);
59
+ }
60
+ catch (err) {
61
+ reject(new Error(`Compositor panicked: ${message}`));
62
+ }
42
63
  }
43
64
  });
44
65
  });
45
- downloadMap.compositorCache[hash] = output;
46
66
  };
47
- exports.compose = compose;
67
+ exports.callCompositor = callCompositor;
@@ -0,0 +1,12 @@
1
+ /// <reference types="node" />
2
+ import type { CompositorCommand } from './payloads';
3
+ declare type Compositor = {
4
+ finishCommands: () => void;
5
+ executeCommand: <T extends keyof CompositorCommand>(type: T, payload: CompositorCommand[T]) => Promise<Buffer>;
6
+ waitForDone: () => Promise<void>;
7
+ pid: number | null;
8
+ };
9
+ export declare const getIdealMaximumFrameCacheItems: () => number;
10
+ export declare const startLongRunningCompositor: (maximumFrameCacheItems: number, verbose: boolean) => Compositor;
11
+ export declare const startCompositor: <T extends keyof CompositorCommand>(type: T, payload: CompositorCommand[T]) => Compositor;
12
+ export {};