@remotion/renderer 3.0.21 → 3.0.24

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 (357) hide show
  1. package/dist/abort.d.ts +7 -0
  2. package/dist/abort.js +20 -0
  3. package/dist/assets/calculate-asset-positions.d.ts +2 -2
  4. package/dist/assets/convert-assets-to-file-urls.d.ts +2 -2
  5. package/dist/assets/download-and-map-assets-to-file.d.ts +1 -1
  6. package/dist/assets/ffmpeg-volume-expression.d.ts +1 -1
  7. package/dist/assets/flatten-volume-array.d.ts +1 -1
  8. package/dist/assets/get-audio-channels.d.ts +1 -1
  9. package/dist/assets/types.d.ts +1 -1
  10. package/dist/browser/Browser.d.ts +5 -159
  11. package/dist/browser/Browser.js +5 -190
  12. package/dist/browser/BrowserConnector.d.ts +1 -8
  13. package/dist/browser/BrowserConnector.js +0 -32
  14. package/dist/browser/BrowserFetcher.d.ts +1 -1
  15. package/dist/browser/BrowserFetcher.js +8 -10
  16. package/dist/browser/BrowserRunner.d.ts +2 -2
  17. package/dist/browser/BrowserRunner.js +1 -1
  18. package/dist/browser/Connection.d.ts +4 -11
  19. package/dist/browser/Connection.js +5 -25
  20. package/dist/browser/ConsoleMessage.d.ts +4 -28
  21. package/dist/browser/ConsoleMessage.js +5 -32
  22. package/dist/browser/DOMWorld.d.ts +5 -6
  23. package/dist/browser/DOMWorld.js +2 -18
  24. package/dist/browser/EvalTypes.d.ts +1 -1
  25. package/dist/browser/EventEmitter.d.ts +1 -48
  26. package/dist/browser/EventEmitter.js +0 -49
  27. package/dist/browser/ExecutionContext.d.ts +7 -8
  28. package/dist/browser/ExecutionContext.js +0 -16
  29. package/dist/browser/FrameManager.d.ts +10 -14
  30. package/dist/browser/FrameManager.js +3 -19
  31. package/dist/browser/HTTPRequest.d.ts +4 -18
  32. package/dist/browser/HTTPRequest.js +3 -48
  33. package/dist/browser/HTTPResponse.d.ts +2 -81
  34. package/dist/browser/HTTPResponse.js +3 -173
  35. package/dist/browser/JSHandle.d.ts +4 -5
  36. package/dist/browser/JSHandle.js +0 -3
  37. package/dist/browser/LaunchOptions.d.ts +2 -81
  38. package/dist/browser/Launcher.d.ts +2 -2
  39. package/dist/browser/Launcher.js +21 -119
  40. package/dist/browser/LifecycleWatcher.d.ts +4 -4
  41. package/dist/browser/LifecycleWatcher.js +4 -17
  42. package/dist/browser/NetworkEventManager.d.ts +2 -4
  43. package/dist/browser/NetworkEventManager.js +0 -47
  44. package/dist/browser/NetworkManager.d.ts +1 -3
  45. package/dist/browser/NetworkManager.js +6 -42
  46. package/dist/browser/NodeWebSocketTransport.d.ts +8 -2
  47. package/dist/browser/NodeWebSocketTransport.js +1 -1
  48. package/dist/browser/{page.d.ts → Page.d.ts} +7 -13
  49. package/dist/browser/{page.js → Page.js} +14 -9
  50. package/dist/browser/PuppeteerNode.d.ts +7 -59
  51. package/dist/browser/PuppeteerNode.js +4 -66
  52. package/dist/browser/Target.d.ts +4 -4
  53. package/dist/browser/assert.d.ts +0 -20
  54. package/dist/browser/assert.js +0 -20
  55. package/dist/browser/create-browser-fetcher.d.ts +1 -1
  56. package/dist/browser/create-browser-fetcher.js +4 -25
  57. package/dist/browser/util.d.ts +3 -3
  58. package/dist/browser/util.js +1 -1
  59. package/dist/browser-log.d.ts +1 -1
  60. package/dist/calculate-ffmpeg-filters.d.ts +1 -1
  61. package/dist/can-use-parallel-encoding.d.ts +1 -1
  62. package/dist/cancel.d.ts +7 -0
  63. package/dist/cancel.js +25 -0
  64. package/dist/combine-videos.d.ts +1 -1
  65. package/dist/convert-to-pcm.d.ts +1 -1
  66. package/dist/create-silent-audio.d.ts +1 -1
  67. package/dist/cycle-browser-tabs.d.ts +1 -1
  68. package/dist/delay-render-embedded-stack.d.ts +1 -1
  69. package/dist/ensure-faststart.d.ts +1 -0
  70. package/dist/ensure-faststart.js +14 -0
  71. package/dist/ensure-presentation-timestamp.d.ts +1 -1
  72. package/dist/ensure-presentation-timestamp.js +1 -1
  73. package/dist/error-handling/handle-javascript-exception.d.ts +2 -2
  74. package/dist/error-handling/handle-javascript-exception.js +2 -2
  75. package/dist/error-handling/symbolicate-error.d.ts +1 -1
  76. package/dist/error-handling/symbolicateable-error.d.ts +1 -1
  77. package/dist/extract-frame-from-video.d.ts +7 -2
  78. package/dist/extract-frame-from-video.js +62 -11
  79. package/dist/faststart/atom.d.ts +35 -0
  80. package/dist/faststart/atom.js +138 -0
  81. package/dist/faststart/index.d.ts +0 -0
  82. package/dist/faststart/index.js +1 -0
  83. package/dist/faststart/options.d.ts +6 -0
  84. package/dist/faststart/options.js +2 -0
  85. package/dist/faststart/qt-faststart.d.ts +18 -0
  86. package/dist/faststart/qt-faststart.js +66 -0
  87. package/dist/faststart/update-chunk-offsets.d.ts +10 -0
  88. package/dist/faststart/update-chunk-offsets.js +114 -0
  89. package/dist/faststart/util.d.ts +9 -0
  90. package/dist/faststart/util.js +34 -0
  91. package/dist/get-audio-codec-name.d.ts +1 -1
  92. package/dist/get-browser-instance.d.ts +4 -3
  93. package/dist/get-codec-name.d.ts +1 -1
  94. package/dist/get-compositions.d.ts +4 -4
  95. package/dist/get-compositions.js +2 -2
  96. package/dist/get-duration-from-frame-range.d.ts +1 -1
  97. package/dist/get-extension-from-codec.d.ts +1 -1
  98. package/dist/get-frame-to-render.d.ts +1 -1
  99. package/dist/get-local-browser-executable.d.ts +1 -1
  100. package/dist/get-local-browser-executable.js +7 -5
  101. package/dist/get-prores-profile-name.d.ts +1 -1
  102. package/dist/get-video-info.d.ts +8 -0
  103. package/dist/get-video-info.js +45 -0
  104. package/dist/image-format.d.ts +1 -1
  105. package/dist/index.d.ts +0 -1
  106. package/dist/is-vp9-video.d.ts +3 -0
  107. package/dist/is-vp9-video.js +24 -0
  108. package/dist/last-frame-from-video-cache.d.ts +5 -1
  109. package/dist/last-frame-from-video-cache.js +6 -1
  110. package/dist/merge-audio-track.d.ts +1 -1
  111. package/dist/offthread/index.d.ts +0 -0
  112. package/dist/offthread/index.js +1 -0
  113. package/dist/offthread-video-server.d.ts +4 -3
  114. package/dist/offthread-video-server.js +14 -3
  115. package/dist/open-browser.d.ts +5 -3
  116. package/dist/open-browser.js +8 -8
  117. package/dist/prepare-server.d.ts +2 -2
  118. package/dist/preprocess-audio-track.d.ts +2 -2
  119. package/dist/prespawn-ffmpeg.d.ts +2 -2
  120. package/dist/provide-screenshot.d.ts +4 -4
  121. package/dist/provide-screenshot.js +0 -1
  122. package/dist/puppeteer-evaluate.d.ts +1 -1
  123. package/dist/puppeteer-evaluate.js +3 -4
  124. package/dist/puppeteer-screenshot.d.ts +3 -2
  125. package/dist/puppeteer-screenshot.js +2 -4
  126. package/dist/render-frames.d.ts +9 -9
  127. package/dist/render-frames.js +18 -10
  128. package/dist/render-gif.d.ts +2 -0
  129. package/dist/render-gif.js +242 -0
  130. package/dist/render-media.d.ts +8 -8
  131. package/dist/render-still.d.ts +6 -6
  132. package/dist/screenshot-dom-element.d.ts +6 -7
  133. package/dist/screenshot-dom-element.js +3 -6
  134. package/dist/screenshot-task.d.ts +3 -2
  135. package/dist/screenshot-task.js +3 -5
  136. package/dist/seek-to-frame.d.ts +2 -2
  137. package/dist/serve-handler/index.d.ts +1 -1
  138. package/dist/serve-handler/index.js +0 -1
  139. package/dist/serve-static.d.ts +2 -2
  140. package/dist/set-props-and-env.d.ts +1 -1
  141. package/dist/set-props-and-env.js +3 -0
  142. package/dist/should-use-vp9-decoder.d.ts +0 -0
  143. package/dist/should-use-vp9-decoder.js +1 -0
  144. package/dist/stitch-frames-to-gif.d.ts +8 -0
  145. package/dist/stitch-frames-to-gif.js +128 -0
  146. package/dist/stitch-frames-to-video.d.ts +3 -3
  147. package/dist/stringify-ffmpeg-filter.d.ts +2 -2
  148. package/dist/stringify-ffmpeg-filter.js +3 -0
  149. package/dist/symbolicate-stacktrace.d.ts +1 -1
  150. package/dist/types.d.ts +1 -1
  151. package/dist/validate-even-dimensions-with-codec.d.ts +1 -1
  152. package/dist/validate-offthreadvideo-image-format.d.ts +1 -0
  153. package/dist/validate-offthreadvideo-image-format.js +15 -0
  154. package/dist/validate-output-filename.d.ts +1 -1
  155. package/package.json +10 -6
  156. package/dist/assets/calculate-asset-positions.d.ts.map +0 -1
  157. package/dist/assets/calculate-asset-positions.js.map +0 -1
  158. package/dist/assets/calculate-atempo.d.ts.map +0 -1
  159. package/dist/assets/calculate-atempo.js.map +0 -1
  160. package/dist/assets/convert-assets-to-file-urls.d.ts.map +0 -1
  161. package/dist/assets/convert-assets-to-file-urls.js.map +0 -1
  162. package/dist/assets/download-and-map-assets-to-file.d.ts.map +0 -1
  163. package/dist/assets/download-and-map-assets-to-file.js.map +0 -1
  164. package/dist/assets/download-file.d.ts.map +0 -1
  165. package/dist/assets/download-file.js.map +0 -1
  166. package/dist/assets/ffmpeg-volume-expression.d.ts.map +0 -1
  167. package/dist/assets/ffmpeg-volume-expression.js.map +0 -1
  168. package/dist/assets/flatten-volume-array.d.ts.map +0 -1
  169. package/dist/assets/flatten-volume-array.js.map +0 -1
  170. package/dist/assets/get-audio-channels.d.ts.map +0 -1
  171. package/dist/assets/get-audio-channels.js.map +0 -1
  172. package/dist/assets/read-file.d.ts.map +0 -1
  173. package/dist/assets/read-file.js.map +0 -1
  174. package/dist/assets/round-volume-to-avoid-stack-overflow.d.ts.map +0 -1
  175. package/dist/assets/round-volume-to-avoid-stack-overflow.js.map +0 -1
  176. package/dist/assets/sanitize-filename.d.ts.map +0 -1
  177. package/dist/assets/sanitize-filename.js.map +0 -1
  178. package/dist/assets/sanitize-filepath.d.ts.map +0 -1
  179. package/dist/assets/sanitize-filepath.js.map +0 -1
  180. package/dist/assets/truncate-utf8-bytes.d.ts.map +0 -1
  181. package/dist/assets/truncate-utf8-bytes.js.map +0 -1
  182. package/dist/assets/types.d.ts.map +0 -1
  183. package/dist/assets/types.js.map +0 -1
  184. package/dist/browser/Accessibility.d.ts +0 -175
  185. package/dist/browser/Accessibility.js +0 -423
  186. package/dist/browser/AriaQueryHandler.d.ts +0 -20
  187. package/dist/browser/AriaQueryHandler.js +0 -108
  188. package/dist/browser/Coverage.d.ts +0 -180
  189. package/dist/browser/Coverage.js +0 -371
  190. package/dist/browser/Debug.d.ts +0 -19
  191. package/dist/browser/Debug.js +0 -42
  192. package/dist/browser/DeviceDescriptors.d.ts +0 -40
  193. package/dist/browser/DeviceDescriptors.js +0 -1407
  194. package/dist/browser/FileChooser.d.ts +0 -56
  195. package/dist/browser/FileChooser.js +0 -86
  196. package/dist/browser/Input.d.ts +0 -355
  197. package/dist/browser/Input.js +0 -592
  198. package/dist/browser/NetworkConditions.d.ts +0 -26
  199. package/dist/browser/NetworkConditions.js +0 -33
  200. package/dist/browser/PDFOptions.d.ts +0 -165
  201. package/dist/browser/PDFOptions.js +0 -34
  202. package/dist/browser/PipeTransport.d.ts +0 -10
  203. package/dist/browser/PipeTransport.js +0 -86
  204. package/dist/browser/Puppeteer.d.ts +0 -35
  205. package/dist/browser/Puppeteer.js +0 -17
  206. package/dist/browser/QueryHandler.d.ts +0 -64
  207. package/dist/browser/QueryHandler.js +0 -183
  208. package/dist/browser/SecurityDetails.d.ts +0 -55
  209. package/dist/browser/SecurityDetails.js +0 -95
  210. package/dist/browser/Tracing.d.ts +0 -45
  211. package/dist/browser/Tracing.js +0 -136
  212. package/dist/browser/USKeyboardLayout.d.ts +0 -39
  213. package/dist/browser/USKeyboardLayout.js +0 -406
  214. package/dist/browser/WebWorker.d.ts +0 -96
  215. package/dist/browser/WebWorker.js +0 -122
  216. package/dist/browser/dialog.d.ts +0 -70
  217. package/dist/browser/dialog.js +0 -114
  218. package/dist/browser/fetch.d.ts +0 -16
  219. package/dist/browser/fetch.js +0 -46
  220. package/dist/browser/find-up.d.ts +0 -4
  221. package/dist/browser/find-up.js +0 -85
  222. package/dist/browser/pkg-dir.d.ts +0 -3
  223. package/dist/browser/pkg-dir.js +0 -13
  224. package/dist/browser-log.d.ts.map +0 -1
  225. package/dist/browser-log.js.map +0 -1
  226. package/dist/calculate-ffmpeg-filters.d.ts.map +0 -1
  227. package/dist/calculate-ffmpeg-filters.js.map +0 -1
  228. package/dist/can-use-parallel-encoding.d.ts.map +0 -1
  229. package/dist/can-use-parallel-encoding.js.map +0 -1
  230. package/dist/chunk.d.ts.map +0 -1
  231. package/dist/chunk.js.map +0 -1
  232. package/dist/combine-videos.d.ts.map +0 -1
  233. package/dist/combine-videos.js.map +0 -1
  234. package/dist/convert-to-pcm.d.ts.map +0 -1
  235. package/dist/convert-to-pcm.js.map +0 -1
  236. package/dist/create-ffmpeg-complex-filter.d.ts.map +0 -1
  237. package/dist/create-ffmpeg-complex-filter.js.map +0 -1
  238. package/dist/create-ffmpeg-merge-filter.d.ts.map +0 -1
  239. package/dist/create-ffmpeg-merge-filter.js.map +0 -1
  240. package/dist/create-silent-audio.d.ts.map +0 -1
  241. package/dist/create-silent-audio.js.map +0 -1
  242. package/dist/cycle-browser-tabs.d.ts.map +0 -1
  243. package/dist/cycle-browser-tabs.js.map +0 -1
  244. package/dist/delay-render-embedded-stack.d.ts.map +0 -1
  245. package/dist/delay-render-embedded-stack.js.map +0 -1
  246. package/dist/delete-directory.d.ts.map +0 -1
  247. package/dist/delete-directory.js.map +0 -1
  248. package/dist/ensure-frames-in-order.d.ts.map +0 -1
  249. package/dist/ensure-frames-in-order.js.map +0 -1
  250. package/dist/ensure-output-directory.d.ts.map +0 -1
  251. package/dist/ensure-output-directory.js.map +0 -1
  252. package/dist/error-handling/handle-javascript-exception.d.ts.map +0 -1
  253. package/dist/error-handling/handle-javascript-exception.js.map +0 -1
  254. package/dist/error-handling/symbolicate-error.d.ts.map +0 -1
  255. package/dist/error-handling/symbolicate-error.js.map +0 -1
  256. package/dist/error-handling/symbolicateable-error.d.ts.map +0 -1
  257. package/dist/error-handling/symbolicateable-error.js.map +0 -1
  258. package/dist/ffmpeg-filter-file.d.ts.map +0 -1
  259. package/dist/ffmpeg-filter-file.js.map +0 -1
  260. package/dist/ffmpeg-flags.d.ts.map +0 -1
  261. package/dist/ffmpeg-flags.js.map +0 -1
  262. package/dist/get-audio-codec-name.d.ts.map +0 -1
  263. package/dist/get-audio-codec-name.js.map +0 -1
  264. package/dist/get-browser-instance.d.ts.map +0 -1
  265. package/dist/get-browser-instance.js.map +0 -1
  266. package/dist/get-codec-name.d.ts.map +0 -1
  267. package/dist/get-codec-name.js.map +0 -1
  268. package/dist/get-compositions.d.ts.map +0 -1
  269. package/dist/get-compositions.js.map +0 -1
  270. package/dist/get-concurrency.d.ts.map +0 -1
  271. package/dist/get-concurrency.js.map +0 -1
  272. package/dist/get-duration-from-frame-range.d.ts.map +0 -1
  273. package/dist/get-duration-from-frame-range.js.map +0 -1
  274. package/dist/get-extension-from-codec.d.ts.map +0 -1
  275. package/dist/get-extension-from-codec.js.map +0 -1
  276. package/dist/get-frame-to-render.d.ts.map +0 -1
  277. package/dist/get-frame-to-render.js.map +0 -1
  278. package/dist/get-local-browser-executable.d.ts.map +0 -1
  279. package/dist/get-local-browser-executable.js.map +0 -1
  280. package/dist/get-port.d.ts.map +0 -1
  281. package/dist/get-port.js.map +0 -1
  282. package/dist/get-prores-profile-name.d.ts.map +0 -1
  283. package/dist/get-prores-profile-name.js.map +0 -1
  284. package/dist/image-format.d.ts.map +0 -1
  285. package/dist/image-format.js.map +0 -1
  286. package/dist/index.d.ts.map +0 -1
  287. package/dist/index.js.map +0 -1
  288. package/dist/is-serve-url.d.ts.map +0 -1
  289. package/dist/is-serve-url.js.map +0 -1
  290. package/dist/legacy-webpack-config.d.ts.map +0 -1
  291. package/dist/legacy-webpack-config.js.map +0 -1
  292. package/dist/make-assets-download-dir.d.ts.map +0 -1
  293. package/dist/make-assets-download-dir.js.map +0 -1
  294. package/dist/merge-audio-track.d.ts.map +0 -1
  295. package/dist/merge-audio-track.js.map +0 -1
  296. package/dist/normalize-serve-url.d.ts.map +0 -1
  297. package/dist/normalize-serve-url.js.map +0 -1
  298. package/dist/open-browser.d.ts.map +0 -1
  299. package/dist/open-browser.js.map +0 -1
  300. package/dist/p-limit.d.ts.map +0 -1
  301. package/dist/p-limit.js.map +0 -1
  302. package/dist/parse-browser-error-stack.d.ts.map +0 -1
  303. package/dist/parse-browser-error-stack.js.map +0 -1
  304. package/dist/parse-ffmpeg-progress.d.ts.map +0 -1
  305. package/dist/parse-ffmpeg-progress.js.map +0 -1
  306. package/dist/pool.d.ts.map +0 -1
  307. package/dist/pool.js.map +0 -1
  308. package/dist/prepare-server.d.ts.map +0 -1
  309. package/dist/prepare-server.js.map +0 -1
  310. package/dist/preprocess-audio-track.d.ts.map +0 -1
  311. package/dist/preprocess-audio-track.js.map +0 -1
  312. package/dist/prespawn-ffmpeg.d.ts.map +0 -1
  313. package/dist/prespawn-ffmpeg.js.map +0 -1
  314. package/dist/provide-screenshot.d.ts.map +0 -1
  315. package/dist/provide-screenshot.js.map +0 -1
  316. package/dist/puppeteer-evaluate.d.ts.map +0 -1
  317. package/dist/puppeteer-evaluate.js.map +0 -1
  318. package/dist/puppeteer-screenshot.d.ts.map +0 -1
  319. package/dist/puppeteer-screenshot.js.map +0 -1
  320. package/dist/render-frames.d.ts.map +0 -1
  321. package/dist/render-frames.js.map +0 -1
  322. package/dist/render-media.d.ts.map +0 -1
  323. package/dist/render-media.js.map +0 -1
  324. package/dist/render-still.d.ts.map +0 -1
  325. package/dist/render-still.js.map +0 -1
  326. package/dist/resolve-asset-src.d.ts.map +0 -1
  327. package/dist/resolve-asset-src.js.map +0 -1
  328. package/dist/sample-rate.d.ts.map +0 -1
  329. package/dist/sample-rate.js.map +0 -1
  330. package/dist/screenshot-dom-element.d.ts.map +0 -1
  331. package/dist/screenshot-dom-element.js.map +0 -1
  332. package/dist/screenshot-task.d.ts.map +0 -1
  333. package/dist/screenshot-task.js.map +0 -1
  334. package/dist/seek-to-frame.d.ts.map +0 -1
  335. package/dist/seek-to-frame.js.map +0 -1
  336. package/dist/serve-static.d.ts.map +0 -1
  337. package/dist/serve-static.js.map +0 -1
  338. package/dist/set-props-and-env.d.ts.map +0 -1
  339. package/dist/set-props-and-env.js.map +0 -1
  340. package/dist/stitch-frames-to-video.d.ts.map +0 -1
  341. package/dist/stitch-frames-to-video.js.map +0 -1
  342. package/dist/stringify-ffmpeg-filter.d.ts.map +0 -1
  343. package/dist/stringify-ffmpeg-filter.js.map +0 -1
  344. package/dist/symbolicate-stacktrace.d.ts.map +0 -1
  345. package/dist/symbolicate-stacktrace.js.map +0 -1
  346. package/dist/tmp-dir.d.ts.map +0 -1
  347. package/dist/tmp-dir.js.map +0 -1
  348. package/dist/types.d.ts.map +0 -1
  349. package/dist/types.js.map +0 -1
  350. package/dist/validate-even-dimensions-with-codec.d.ts.map +0 -1
  351. package/dist/validate-even-dimensions-with-codec.js.map +0 -1
  352. package/dist/validate-ffmpeg.d.ts.map +0 -1
  353. package/dist/validate-ffmpeg.js.map +0 -1
  354. package/dist/validate-puppeteer-timeout.d.ts.map +0 -1
  355. package/dist/validate-puppeteer-timeout.js.map +0 -1
  356. package/dist/validate-scale.d.ts.map +0 -1
  357. package/dist/validate-scale.js.map +0 -1
@@ -0,0 +1,242 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.renderGif = void 0;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const os_1 = __importDefault(require("os"));
9
+ const path_1 = __importDefault(require("path"));
10
+ const remotion_1 = require("remotion");
11
+ const can_use_parallel_encoding_1 = require("./can-use-parallel-encoding");
12
+ const ensure_frames_in_order_1 = require("./ensure-frames-in-order");
13
+ const ensure_output_directory_1 = require("./ensure-output-directory");
14
+ const get_duration_from_frame_range_1 = require("./get-duration-from-frame-range");
15
+ const get_extension_from_codec_1 = require("./get-extension-from-codec");
16
+ const get_extension_of_filename_1 = require("./get-extension-of-filename");
17
+ const get_frame_to_render_1 = require("./get-frame-to-render");
18
+ const legacy_webpack_config_1 = require("./legacy-webpack-config");
19
+ const make_cancel_signal_1 = require("./make-cancel-signal");
20
+ const prespawn_ffmpeg_1 = require("./prespawn-ffmpeg");
21
+ const render_frames_1 = require("./render-frames");
22
+ const stitch_frames_to_gif_1 = require("./stitch-frames-to-gif");
23
+ const tmp_dir_1 = require("./tmp-dir");
24
+ const validate_even_dimensions_with_codec_1 = require("./validate-even-dimensions-with-codec");
25
+ const validate_output_filename_1 = require("./validate-output-filename");
26
+ const validate_scale_1 = require("./validate-scale");
27
+ const renderGif = ({ parallelism, proResProfile, crf, composition, imageFormat, ffmpegExecutable, inputProps, pixelFormat, codec, envVariables, quality, frameRange, puppeteerInstance, outputLocation, onProgress, overwrite, onDownload, loop, skipNFrames, dumpBrowserLogs, onBrowserLog, onStart, timeoutInMilliseconds, chromiumOptions, scale, browserExecutable, port, cancelSignal, ...options }) => {
28
+ remotion_1.Internals.validateQuality(quality);
29
+ if (typeof crf !== 'undefined' && crf !== null) {
30
+ remotion_1.Internals.validateSelectedCrfAndCodecCombination(crf, codec);
31
+ }
32
+ (0, validate_output_filename_1.validateOutputFilename)(codec, (0, get_extension_of_filename_1.getExtensionOfFilename)(outputLocation));
33
+ (0, validate_scale_1.validateScale)(scale);
34
+ const serveUrl = (0, legacy_webpack_config_1.getServeUrlWithFallback)(options);
35
+ let stitchStage = 'encoding';
36
+ let stitcherFfmpeg;
37
+ let preStitcher = null;
38
+ let encodedFrames = 0;
39
+ let renderedFrames = 0;
40
+ let renderedDoneIn = null;
41
+ let encodedDoneIn = null;
42
+ let cancelled = false;
43
+ const renderStart = Date.now();
44
+ const tmpdir = (0, tmp_dir_1.tmpDir)('pre-encode');
45
+ const parallelEncoding = (0, can_use_parallel_encoding_1.canUseParallelEncoding)(codec);
46
+ const actualImageFormat = imageFormat !== null && imageFormat !== void 0 ? imageFormat : 'jpeg';
47
+ const preEncodedFileLocation = parallelEncoding
48
+ ? path_1.default.join(tmpdir, 'pre-encode.' + (0, get_extension_from_codec_1.getFileExtensionFromCodec)(codec, 'chunk'))
49
+ : null;
50
+ const outputDir = parallelEncoding
51
+ ? null
52
+ : fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), 'react-motion-render'));
53
+ (0, validate_even_dimensions_with_codec_1.validateEvenDimensionsWithCodec)({
54
+ codec,
55
+ height: composition.height,
56
+ scale: scale !== null && scale !== void 0 ? scale : 1,
57
+ width: composition.width,
58
+ });
59
+ const callUpdate = () => {
60
+ onProgress === null || onProgress === void 0 ? void 0 : onProgress({
61
+ encodedDoneIn,
62
+ encodedFrames,
63
+ renderedDoneIn,
64
+ renderedFrames,
65
+ stitchStage,
66
+ });
67
+ };
68
+ const realFrameRange = (0, get_frame_to_render_1.getRealFrameRange)(composition.durationInFrames, frameRange !== null && frameRange !== void 0 ? frameRange : null);
69
+ const cancelRenderFrames = (0, make_cancel_signal_1.makeCancelSignal)();
70
+ const cancelPrestitcher = (0, make_cancel_signal_1.makeCancelSignal)();
71
+ const cancelStitcher = (0, make_cancel_signal_1.makeCancelSignal)();
72
+ cancelSignal === null || cancelSignal === void 0 ? void 0 : cancelSignal(() => {
73
+ cancelRenderFrames.cancel();
74
+ });
75
+ const { waitForRightTimeOfFrameToBeInserted, setFrameToStitch, waitForFinish } = (0, ensure_frames_in_order_1.ensureFramesInOrder)(realFrameRange);
76
+ const actualGifFps = Math.floor(composition.fps / (skipNFrames + 1));
77
+ const createPrestitcherIfNecessary = async () => {
78
+ if (preEncodedFileLocation) {
79
+ preStitcher = await (0, prespawn_ffmpeg_1.prespawnFfmpeg)({
80
+ width: composition.width * (scale !== null && scale !== void 0 ? scale : 1),
81
+ height: composition.height * (scale !== null && scale !== void 0 ? scale : 1),
82
+ fps: actualGifFps,
83
+ outputLocation: preEncodedFileLocation,
84
+ pixelFormat,
85
+ codec,
86
+ proResProfile,
87
+ crf,
88
+ onProgress: (frame) => {
89
+ encodedFrames = frame;
90
+ callUpdate();
91
+ },
92
+ verbose: remotion_1.Internals.Logging.isEqualOrBelowLogLevel(remotion_1.Internals.Logging.getLogLevel(), 'verbose'),
93
+ ffmpegExecutable,
94
+ imageFormat: actualImageFormat,
95
+ signal: cancelPrestitcher.cancelSignal,
96
+ });
97
+ stitcherFfmpeg = preStitcher.task;
98
+ }
99
+ };
100
+ const waitForPrestitcherIfNecessary = async () => {
101
+ var _a;
102
+ if (stitcherFfmpeg) {
103
+ await waitForFinish();
104
+ (_a = stitcherFfmpeg === null || stitcherFfmpeg === void 0 ? void 0 : stitcherFfmpeg.stdin) === null || _a === void 0 ? void 0 : _a.end();
105
+ try {
106
+ await stitcherFfmpeg;
107
+ }
108
+ catch (err) {
109
+ throw new Error(preStitcher === null || preStitcher === void 0 ? void 0 : preStitcher.getLogs());
110
+ }
111
+ }
112
+ };
113
+ const happyPath = createPrestitcherIfNecessary()
114
+ .then(() => {
115
+ const renderFramesProc = (0, render_frames_1.renderFrames)({
116
+ config: composition,
117
+ onFrameUpdate: (frame) => {
118
+ stitchStage = 'gif';
119
+ renderedFrames = frame;
120
+ callUpdate();
121
+ },
122
+ parallelism,
123
+ outputDir,
124
+ skipNFrames,
125
+ onStart: (data) => {
126
+ renderedFrames = 0;
127
+ callUpdate();
128
+ onStart === null || onStart === void 0 ? void 0 : onStart(data);
129
+ },
130
+ inputProps,
131
+ envVariables,
132
+ imageFormat: actualImageFormat,
133
+ quality,
134
+ frameRange: frameRange !== null && frameRange !== void 0 ? frameRange : null,
135
+ puppeteerInstance,
136
+ onFrameBuffer: parallelEncoding
137
+ ? async (buffer, frame) => {
138
+ var _a;
139
+ await waitForRightTimeOfFrameToBeInserted(frame);
140
+ if (cancelled) {
141
+ return;
142
+ }
143
+ (_a = stitcherFfmpeg === null || stitcherFfmpeg === void 0 ? void 0 : stitcherFfmpeg.stdin) === null || _a === void 0 ? void 0 : _a.write(buffer);
144
+ setFrameToStitch(frame + 1);
145
+ }
146
+ : undefined,
147
+ serveUrl,
148
+ dumpBrowserLogs,
149
+ onBrowserLog,
150
+ onDownload,
151
+ timeoutInMilliseconds,
152
+ chromiumOptions,
153
+ scale,
154
+ ffmpegExecutable,
155
+ browserExecutable,
156
+ port,
157
+ cancelSignal: cancelRenderFrames.cancelSignal,
158
+ });
159
+ return renderFramesProc;
160
+ })
161
+ .then((renderFramesReturn) => {
162
+ return Promise.all([renderFramesReturn, waitForPrestitcherIfNecessary()]);
163
+ })
164
+ .then(([{ assetsInfo }]) => {
165
+ renderedDoneIn = Date.now() - renderStart;
166
+ callUpdate();
167
+ (0, ensure_output_directory_1.ensureOutputDirectory)(outputLocation);
168
+ const stitchStart = Date.now();
169
+ return Promise.all([
170
+ (0, stitch_frames_to_gif_1.stitchFramesToGif)({
171
+ width: composition.width * (scale !== null && scale !== void 0 ? scale : 1),
172
+ height: composition.height * (scale !== null && scale !== void 0 ? scale : 1),
173
+ fps: actualGifFps,
174
+ outputLocation,
175
+ internalOptions: {
176
+ preEncodedFileLocation,
177
+ imageFormat: actualImageFormat,
178
+ },
179
+ force: overwrite !== null && overwrite !== void 0 ? overwrite : remotion_1.Internals.DEFAULT_OVERWRITE,
180
+ pixelFormat,
181
+ codec,
182
+ proResProfile,
183
+ crf,
184
+ loop,
185
+ assetsInfo,
186
+ ffmpegExecutable,
187
+ onProgress: (frame) => {
188
+ stitchStage = 'gif';
189
+ encodedFrames = frame;
190
+ callUpdate();
191
+ },
192
+ verbose: remotion_1.Internals.Logging.isEqualOrBelowLogLevel(remotion_1.Internals.Logging.getLogLevel(), 'verbose'),
193
+ dir: outputDir !== null && outputDir !== void 0 ? outputDir : undefined,
194
+ cancelSignal: cancelStitcher.cancelSignal,
195
+ }),
196
+ stitchStart,
197
+ ]);
198
+ })
199
+ .then(([, stitchStart]) => {
200
+ encodedFrames = (0, get_duration_from_frame_range_1.getDurationFromFrameRange)(frameRange !== null && frameRange !== void 0 ? frameRange : null, composition.durationInFrames, skipNFrames);
201
+ encodedDoneIn = Date.now() - stitchStart;
202
+ callUpdate();
203
+ })
204
+ .catch((err) => {
205
+ /**
206
+ * When an error is thrown in renderFrames(...) (e.g., when delayRender() is used incorrectly), fs.unlinkSync(...) throws an error that the file is locked because ffmpeg is still running, and renderMedia returns it.
207
+ * Therefore we first kill the FFMPEG process before deleting the file
208
+ */
209
+ cancelled = true;
210
+ cancelRenderFrames.cancel();
211
+ cancelStitcher.cancel();
212
+ cancelPrestitcher.cancel();
213
+ if (stitcherFfmpeg !== undefined && stitcherFfmpeg.exitCode === null) {
214
+ const promise = new Promise((resolve) => {
215
+ setTimeout(() => {
216
+ resolve();
217
+ }, 2000);
218
+ stitcherFfmpeg.on('close', resolve);
219
+ });
220
+ stitcherFfmpeg.kill();
221
+ return promise.then(() => {
222
+ throw err;
223
+ });
224
+ }
225
+ throw err;
226
+ })
227
+ .finally(() => {
228
+ if (preEncodedFileLocation !== null &&
229
+ fs_1.default.existsSync(preEncodedFileLocation)) {
230
+ fs_1.default.unlinkSync(preEncodedFileLocation);
231
+ }
232
+ });
233
+ return Promise.race([
234
+ happyPath,
235
+ new Promise((_resolve, reject) => {
236
+ cancelSignal === null || cancelSignal === void 0 ? void 0 : cancelSignal(() => {
237
+ reject(new Error('renderMedia() got cancelled'));
238
+ });
239
+ }),
240
+ ]);
241
+ };
242
+ exports.renderGif = renderGif;
@@ -1,11 +1,11 @@
1
- import type { Browser as PuppeteerBrowser } from 'puppeteer-core';
2
- import { BrowserExecutable, Codec, FfmpegExecutable, FrameRange, PixelFormat, ProResProfile, SmallTCompMetadata } from 'remotion';
3
- import { RenderMediaOnDownload } from './assets/download-and-map-assets-to-file';
4
- import { BrowserLog } from './browser-log';
5
- import { ServeUrlOrWebpackBundle } from './legacy-webpack-config';
6
- import { CancelSignal } from './make-cancel-signal';
7
- import { ChromiumOptions } from './open-browser';
8
- import { OnStartData } from './types';
1
+ import type { BrowserExecutable, Codec, FfmpegExecutable, FrameRange, PixelFormat, ProResProfile, SmallTCompMetadata } from 'remotion';
2
+ import type { RenderMediaOnDownload } from './assets/download-and-map-assets-to-file';
3
+ import type { BrowserLog } from './browser-log';
4
+ import type { Browser as PuppeteerBrowser } from './browser/Browser';
5
+ import type { ServeUrlOrWebpackBundle } from './legacy-webpack-config';
6
+ import type { CancelSignal } from './make-cancel-signal';
7
+ import type { ChromiumOptions } from './open-browser';
8
+ import type { OnStartData } from './types';
9
9
  export declare type StitchingState = 'encoding' | 'muxing';
10
10
  export declare type RenderMediaOnProgress = (progress: {
11
11
  renderedFrames: number;
@@ -1,9 +1,9 @@
1
- import { Browser as PuppeteerBrowser } from 'puppeteer-core';
2
- import { BrowserExecutable, FfmpegExecutable, SmallTCompMetadata, StillImageFormat } from 'remotion';
3
- import { RenderMediaOnDownload } from './assets/download-and-map-assets-to-file';
4
- import { ServeUrlOrWebpackBundle } from './legacy-webpack-config';
5
- import { CancelSignal } from './make-cancel-signal';
6
- import { ChromiumOptions } from './open-browser';
1
+ import type { BrowserExecutable, FfmpegExecutable, SmallTCompMetadata, StillImageFormat } from 'remotion';
2
+ import type { RenderMediaOnDownload } from './assets/download-and-map-assets-to-file';
3
+ import type { Browser as PuppeteerBrowser } from './browser/Browser';
4
+ import type { ServeUrlOrWebpackBundle } from './legacy-webpack-config';
5
+ import type { CancelSignal } from './make-cancel-signal';
6
+ import type { ChromiumOptions } from './open-browser';
7
7
  declare type InnerStillOptions = {
8
8
  composition: SmallTCompMetadata;
9
9
  output: string;
@@ -1,11 +1,10 @@
1
- import puppeteer from 'puppeteer-core';
2
- import { ImageFormat } from 'remotion';
1
+ import type { ImageFormat } from 'remotion';
2
+ import type { Page } from './browser/Page';
3
3
  export declare const screenshotDOMElement: ({ page, imageFormat, quality, opts, }: {
4
- page: puppeteer.Page;
4
+ page: Page;
5
5
  imageFormat: ImageFormat;
6
6
  quality: number | undefined;
7
- opts?: {
8
- path?: string | undefined;
9
- selector?: string | undefined;
10
- } | undefined;
7
+ opts: {
8
+ path: string | null;
9
+ };
11
10
  }) => Promise<Buffer>;
@@ -3,11 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.screenshotDOMElement = void 0;
4
4
  const puppeteer_evaluate_1 = require("./puppeteer-evaluate");
5
5
  const puppeteer_screenshot_1 = require("./puppeteer-screenshot");
6
- const screenshotDOMElement = async ({ page, imageFormat, quality, opts = {}, }) => {
7
- const path = 'path' in opts ? opts.path : undefined;
8
- const { selector } = opts;
9
- if (!selector)
10
- throw Error('Please provide a selector.');
6
+ const screenshotDOMElement = async ({ page, imageFormat, quality, opts, }) => {
7
+ const { path } = opts;
11
8
  if (imageFormat === 'png') {
12
9
  await (0, puppeteer_evaluate_1.puppeteerEvaluateWithCatch)({
13
10
  pageFunction: () => {
@@ -33,7 +30,7 @@ const screenshotDOMElement = async ({ page, imageFormat, quality, opts = {}, })
33
30
  }
34
31
  return (0, puppeteer_screenshot_1.screenshot)(page, {
35
32
  omitBackground: imageFormat === 'png',
36
- path,
33
+ path: path !== null && path !== void 0 ? path : undefined,
37
34
  type: imageFormat,
38
35
  quality,
39
36
  });
@@ -1,3 +1,4 @@
1
- import { Page, ScreenshotOptions } from 'puppeteer-core';
2
- import { StillImageFormat } from 'remotion';
1
+ import type { StillImageFormat } from 'remotion';
2
+ import type { Page } from './browser/Page';
3
+ import type { ScreenshotOptions } from './browser/ScreenshotOptions';
3
4
  export declare const _screenshotTask: (page: Page, format: StillImageFormat, options: ScreenshotOptions) => Promise<Buffer | string>;
@@ -7,8 +7,8 @@ exports._screenshotTask = void 0;
7
7
  const fs_1 = __importDefault(require("fs"));
8
8
  const remotion_1 = require("remotion");
9
9
  const _screenshotTask = async (page, format, options) => {
10
- const client = page._client;
11
- const target = page._target;
10
+ const client = page._client();
11
+ const target = page.target();
12
12
  const perfTarget = remotion_1.Internals.perf.startPerfMeasure('activate-target');
13
13
  await client.send('Target.activateTarget', {
14
14
  targetId: target._targetId,
@@ -30,9 +30,7 @@ const _screenshotTask = async (page, format, options) => {
30
30
  if (shouldSetDefaultBackground)
31
31
  await client.send('Emulation.setDefaultBackgroundColorOverride');
32
32
  const saveMarker = remotion_1.Internals.perf.startPerfMeasure('save');
33
- const buffer = options.encoding === 'base64'
34
- ? result.data
35
- : Buffer.from(result.data, 'base64');
33
+ const buffer = Buffer.from(result.data, 'base64');
36
34
  if (options.path)
37
35
  await fs_1.default.promises.writeFile(options.path, buffer);
38
36
  remotion_1.Internals.perf.stopPerfMeasure(saveMarker);
@@ -1,5 +1,5 @@
1
- import puppeteer from 'puppeteer-core';
1
+ import type { Page } from './browser/Page';
2
2
  export declare const seekToFrame: ({ frame, page, }: {
3
3
  frame: number;
4
- page: puppeteer.Page;
4
+ page: Page;
5
5
  }) => Promise<void>;
@@ -1,4 +1,4 @@
1
- import { IncomingMessage, ServerResponse } from 'http';
1
+ import type { IncomingMessage, ServerResponse } from 'http';
2
2
  export declare const serveHandler: (request: IncomingMessage, response: ServerResponse, config: {
3
3
  public: string;
4
4
  }) => Promise<void>;
@@ -4,7 +4,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.serveHandler = void 0;
7
- // Native
8
7
  const fs_1 = require("fs");
9
8
  const path_1 = __importDefault(require("path"));
10
9
  const url_1 = __importDefault(require("url"));
@@ -1,5 +1,5 @@
1
- import { FfmpegExecutable } from 'remotion';
2
- import { RenderMediaOnDownload } from './assets/download-and-map-assets-to-file';
1
+ import type { FfmpegExecutable } from 'remotion';
2
+ import type { RenderMediaOnDownload } from './assets/download-and-map-assets-to-file';
3
3
  export declare const serveStatic: (path: string | null, options: {
4
4
  port: number | null;
5
5
  ffmpegExecutable: FfmpegExecutable;
@@ -1,4 +1,4 @@
1
- import { Page } from 'puppeteer-core';
1
+ import type { Page } from './browser/Page';
2
2
  export declare const setPropsAndEnv: ({ inputProps, envVariables, page, serveUrl, initialFrame, timeoutInMilliseconds, proxyPort, retriesRemaining, }: {
3
3
  inputProps: unknown;
4
4
  envVariables: Record<string, string> | undefined;
@@ -31,6 +31,9 @@ const setPropsAndEnv = async ({ inputProps, envVariables, page, serveUrl, initia
31
31
  window.remotion_proxyPort = port;
32
32
  }, [proxyPort]);
33
33
  const pageRes = await page.goto(urlToVisit);
34
+ if (pageRes === null) {
35
+ throw new Error(`Visited "${urlToVisit}" but got no response.`);
36
+ }
34
37
  const status = pageRes.status();
35
38
  // S3 in rare occasions returns a 500 or 503 error code for GET operations.
36
39
  // Usually it is fixed by retrying.
File without changes
@@ -0,0 +1 @@
1
+ "use strict";
@@ -0,0 +1,8 @@
1
+ import { StitcherOptions } from './stitch-frames-to-video';
2
+ declare type ReturnType = {
3
+ task: Promise<unknown>;
4
+ getLogs: () => string;
5
+ };
6
+ export declare const spawnFfmpeg: (options: StitcherOptions) => Promise<ReturnType>;
7
+ export declare const stitchFramesToGif: (options: StitcherOptions) => Promise<void>;
8
+ export {};
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.stitchFramesToGif = exports.spawnFfmpeg = void 0;
7
+ const execa_1 = __importDefault(require("execa"));
8
+ const fs_1 = __importDefault(require("fs"));
9
+ const path_1 = __importDefault(require("path"));
10
+ const remotion_1 = require("remotion");
11
+ const get_codec_name_1 = require("./get-codec-name");
12
+ const get_prores_profile_name_1 = require("./get-prores-profile-name");
13
+ const parse_ffmpeg_progress_1 = require("./parse-ffmpeg-progress");
14
+ const validate_even_dimensions_with_codec_1 = require("./validate-even-dimensions-with-codec");
15
+ const validate_ffmpeg_1 = require("./validate-ffmpeg");
16
+ const packageJsonPath = path_1.default.join(__dirname, '..', 'package.json');
17
+ const packageJson = fs_1.default.existsSync(packageJsonPath)
18
+ ? JSON.parse(fs_1.default.readFileSync(packageJsonPath, 'utf-8'))
19
+ : null;
20
+ const spawnFfmpeg = async (options) => {
21
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
22
+ remotion_1.Internals.validateDimension(options.height, 'height', 'passed to `stitchFramesToVideo()`');
23
+ remotion_1.Internals.validateDimension(options.width, 'width', 'passed to `stitchFramesToVideo()`');
24
+ remotion_1.Internals.validateFps(options.fps, 'passed to `stitchFramesToVideo()`');
25
+ const codec = (_a = options.codec) !== null && _a !== void 0 ? _a : remotion_1.Internals.DEFAULT_CODEC;
26
+ (0, validate_even_dimensions_with_codec_1.validateEvenDimensionsWithCodec)({
27
+ width: options.width,
28
+ height: options.height,
29
+ codec,
30
+ scale: 1,
31
+ });
32
+ const crf = (_b = options.crf) !== null && _b !== void 0 ? _b : remotion_1.Internals.getDefaultCrfForCodec(codec);
33
+ const pixelFormat = (_c = options.pixelFormat) !== null && _c !== void 0 ? _c : remotion_1.Internals.DEFAULT_PIXEL_FORMAT;
34
+ await (0, validate_ffmpeg_1.validateFfmpeg)((_d = options.ffmpegExecutable) !== null && _d !== void 0 ? _d : null);
35
+ const encoderName = (0, get_codec_name_1.getCodecName)(codec);
36
+ const proResProfileName = (0, get_prores_profile_name_1.getProResProfileName)(codec, options.proResProfile);
37
+ const supportsCrf = encoderName && codec !== 'prores';
38
+ if (options.verbose) {
39
+ console.log('[verbose] ffmpeg', (_e = options.ffmpegExecutable) !== null && _e !== void 0 ? _e : 'ffmpeg in PATH');
40
+ console.log('[verbose] encoder', encoderName);
41
+ console.log('[verbose] pixelFormat', pixelFormat);
42
+ if (supportsCrf) {
43
+ console.log('[verbose] crf', crf);
44
+ }
45
+ console.log('[verbose] codec', codec);
46
+ console.log('[verbose] proResProfileName', proResProfileName);
47
+ }
48
+ remotion_1.Internals.validateSelectedCrfAndCodecCombination(crf, codec);
49
+ remotion_1.Internals.validateSelectedPixelFormatAndCodecCombination(pixelFormat, codec);
50
+ const expectedFrames = options.assetsInfo.assets.length;
51
+ const updateProgress = (preStitchProgress, muxProgress) => {
52
+ var _a;
53
+ const totalFrameProgress = 0.5 * preStitchProgress * expectedFrames + muxProgress * 0.5;
54
+ (_a = options.onProgress) === null || _a === void 0 ? void 0 : _a.call(options, Math.round(totalFrameProgress));
55
+ };
56
+ const ffmpegArgs = [
57
+ ['-r', String(options.fps)],
58
+ ...(((_f = options.internalOptions) === null || _f === void 0 ? void 0 : _f.preEncodedFileLocation)
59
+ ? [['-i', (_g = options.internalOptions) === null || _g === void 0 ? void 0 : _g.preEncodedFileLocation]]
60
+ : [
61
+ ['-f', 'image2'],
62
+ ['-s', `${options.width}x${options.height}`],
63
+ ['-start_number', String(options.assetsInfo.firstFrameIndex)],
64
+ ['-i', options.assetsInfo.imageSequenceName],
65
+ ]),
66
+ // -c:v is the same as -vcodec as -codec:video
67
+ // and specified the video codec.
68
+ options.loop === null
69
+ ? null
70
+ : ['-loop', typeof options.loop === 'number' ? options.loop : '-1'],
71
+ // Ignore metadata that may come from remote media
72
+ ['-map_metadata', '-1'],
73
+ [
74
+ '-metadata',
75
+ `comment=` +
76
+ [`Made with Remotion`, packageJson ? packageJson.version : null].join(' '),
77
+ ],
78
+ options.force ? '-y' : null,
79
+ options.outputLocation,
80
+ ];
81
+ if (options.verbose) {
82
+ console.log('Generated FFMPEG command:');
83
+ console.log(ffmpegArgs);
84
+ }
85
+ const ffmpegString = ffmpegArgs.flat(2).filter(Boolean);
86
+ const task = (0, execa_1.default)((_h = options.ffmpegExecutable) !== null && _h !== void 0 ? _h : 'ffmpeg', ffmpegString, {
87
+ cwd: options.dir,
88
+ });
89
+ (_j = options.cancelSignal) === null || _j === void 0 ? void 0 : _j.call(options, () => {
90
+ task.kill();
91
+ });
92
+ let ffmpegOutput = '';
93
+ let isFinished = false;
94
+ (_k = task.stderr) === null || _k === void 0 ? void 0 : _k.on('data', (data) => {
95
+ var _a;
96
+ const str = data.toString();
97
+ ffmpegOutput += str;
98
+ if (options.onProgress) {
99
+ const parsed = (0, parse_ffmpeg_progress_1.parseFfmpegProgress)(str);
100
+ // FFMPEG bug: In some cases, FFMPEG does hang after it is finished with it's job
101
+ // Example repo: https://github.com/JonnyBurger/ffmpeg-repro (access can be given upon request)
102
+ if (parsed !== undefined) {
103
+ // If two times in a row the finishing frame is logged, we quit the render
104
+ if (parsed === expectedFrames) {
105
+ if (isFinished) {
106
+ (_a = task.stdin) === null || _a === void 0 ? void 0 : _a.write('q');
107
+ }
108
+ else {
109
+ isFinished = true;
110
+ }
111
+ }
112
+ updateProgress(1, parsed);
113
+ }
114
+ }
115
+ });
116
+ return { task, getLogs: () => ffmpegOutput };
117
+ };
118
+ exports.spawnFfmpeg = spawnFfmpeg;
119
+ const stitchFramesToGif = async (options) => {
120
+ const { task, getLogs } = await (0, exports.spawnFfmpeg)(options);
121
+ try {
122
+ await task;
123
+ }
124
+ catch (err) {
125
+ throw new Error(getLogs());
126
+ }
127
+ };
128
+ exports.stitchFramesToGif = stitchFramesToGif;
@@ -1,6 +1,6 @@
1
- import { Codec, FfmpegExecutable, ImageFormat, PixelFormat, ProResProfile, RenderAssetInfo } from 'remotion';
2
- import { RenderMediaOnDownload } from './assets/download-and-map-assets-to-file';
3
- import { CancelSignal } from './make-cancel-signal';
1
+ import type { Codec, FfmpegExecutable, ImageFormat, PixelFormat, ProResProfile, RenderAssetInfo } from 'remotion';
2
+ import type { RenderMediaOnDownload } from './assets/download-and-map-assets-to-file';
3
+ import type { CancelSignal } from './make-cancel-signal';
4
4
  export declare type StitcherOptions = {
5
5
  fps: number;
6
6
  width: number;
@@ -1,4 +1,4 @@
1
- import { AssetVolume } from './assets/types';
1
+ import type { AssetVolume } from './assets/types';
2
2
  export declare const stringifyFfmpegFilter: ({ trimLeft, trimRight, channels, startInVideo, volume, fps, playbackRate, durationInFrames, assetDuration, }: {
3
3
  trimLeft: number;
4
4
  trimRight: number;
@@ -9,4 +9,4 @@ export declare const stringifyFfmpegFilter: ({ trimLeft, trimRight, channels, st
9
9
  durationInFrames: number;
10
10
  playbackRate: number;
11
11
  assetDuration: number | null;
12
- }) => string;
12
+ }) => string | null;
@@ -7,6 +7,9 @@ const ffmpeg_volume_expression_1 = require("./assets/ffmpeg-volume-expression");
7
7
  const sample_rate_1 = require("./sample-rate");
8
8
  const stringifyFfmpegFilter = ({ trimLeft, trimRight, channels, startInVideo, volume, fps, playbackRate, durationInFrames, assetDuration, }) => {
9
9
  const startInVideoSeconds = startInVideo / fps;
10
+ if (assetDuration && trimLeft >= assetDuration) {
11
+ return null;
12
+ }
10
13
  const volumeFilter = (0, ffmpeg_volume_expression_1.ffmpegVolumeExpression)({
11
14
  volume,
12
15
  startInVideo,
@@ -1,4 +1,4 @@
1
- import { UnsymbolicatedStackFrame } from './parse-browser-error-stack';
1
+ import type { UnsymbolicatedStackFrame } from './parse-browser-error-stack';
2
2
  declare type ScriptLine = {
3
3
  lineNumber: number;
4
4
  content: string;
package/dist/types.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { RenderAssetInfo } from 'remotion';
1
+ import type { RenderAssetInfo } from 'remotion';
2
2
  export declare type RenderFramesOutput = {
3
3
  frameCount: number;
4
4
  assetsInfo: RenderAssetInfo;
@@ -1,4 +1,4 @@
1
- import { Codec } from 'remotion';
1
+ import type { Codec } from 'remotion';
2
2
  export declare const validateEvenDimensionsWithCodec: ({ width, height, codec, scale, }: {
3
3
  width: number;
4
4
  height: number;
@@ -0,0 +1 @@
1
+ export declare const validateOffthreadVideoImageFormat: (input: unknown) => void;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateOffthreadVideoImageFormat = void 0;
4
+ const validateOffthreadVideoImageFormat = (input) => {
5
+ if (typeof input === 'undefined') {
6
+ return;
7
+ }
8
+ if (typeof input !== 'string') {
9
+ throw new TypeError(`<OffthreadVideo imageFormat=""> must be a string, but got ${JSON.stringify(input)} instead.`);
10
+ }
11
+ if (input !== 'png' && input !== 'jpeg') {
12
+ throw new TypeError(`<OffthreadVideo imageFormat=""> must be either "png" or "jpeg", but got ${input}`);
13
+ }
14
+ };
15
+ exports.validateOffthreadVideoImageFormat = validateOffthreadVideoImageFormat;
@@ -1,2 +1,2 @@
1
- import { Codec } from 'remotion';
1
+ import type { Codec } from 'remotion';
2
2
  export declare const validateOutputFilename: (codec: Codec, extension: string | null) => void;