@remotion/renderer 4.0.0-fastlambda.8 → 4.0.0-forcepublish.7

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 (435) hide show
  1. package/dist/assets/calculate-asset-positions.d.ts +2 -2
  2. package/dist/assets/convert-assets-to-file-urls.d.ts +5 -4
  3. package/dist/assets/convert-assets-to-file-urls.js +2 -2
  4. package/dist/assets/download-and-map-assets-to-file.d.ts +15 -6
  5. package/dist/assets/download-and-map-assets-to-file.js +108 -44
  6. package/dist/assets/download-file.d.ts +10 -5
  7. package/dist/assets/download-file.js +18 -5
  8. package/dist/assets/download-map.d.ts +64 -0
  9. package/dist/assets/download-map.js +73 -0
  10. package/dist/assets/ffmpeg-volume-expression.d.ts +3 -3
  11. package/dist/assets/ffmpeg-volume-expression.js +16 -14
  12. package/dist/assets/flatten-volume-array.d.ts +1 -1
  13. package/dist/assets/get-audio-channels.d.ts +3 -4
  14. package/dist/assets/get-audio-channels.js +14 -4
  15. package/dist/assets/get-video-stream-duration.d.ts +4 -0
  16. package/dist/assets/get-video-stream-duration.js +59 -0
  17. package/dist/assets/read-file.js +4 -1
  18. package/dist/assets/types.d.ts +1 -1
  19. package/dist/browser/Browser.d.ts +60 -0
  20. package/dist/browser/Browser.js +218 -0
  21. package/dist/browser/BrowserConnector.d.ts +19 -0
  22. package/dist/browser/BrowserConnector.js +17 -0
  23. package/dist/browser/BrowserFetcher.d.ts +89 -0
  24. package/dist/browser/BrowserFetcher.js +510 -0
  25. package/dist/browser/BrowserPage.d.ts +74 -0
  26. package/dist/browser/BrowserPage.js +283 -0
  27. package/dist/browser/BrowserRunner.d.ts +39 -0
  28. package/dist/browser/BrowserRunner.js +308 -0
  29. package/dist/browser/Connection.d.ts +42 -0
  30. package/dist/browser/Connection.js +242 -0
  31. package/dist/browser/ConsoleMessage.d.ts +31 -0
  32. package/dist/browser/ConsoleMessage.js +48 -0
  33. package/dist/browser/DOMWorld.d.ts +52 -0
  34. package/dist/browser/DOMWorld.js +272 -0
  35. package/dist/browser/Errors.d.ts +25 -0
  36. package/dist/browser/Errors.js +35 -0
  37. package/dist/browser/EvalTypes.d.ts +27 -0
  38. package/dist/browser/EvalTypes.js +17 -0
  39. package/dist/browser/EventEmitter.d.ts +23 -0
  40. package/dist/browser/EventEmitter.js +53 -0
  41. package/dist/browser/ExecutionContext.d.ts +34 -0
  42. package/dist/browser/ExecutionContext.js +174 -0
  43. package/dist/browser/FrameManager.d.ts +93 -0
  44. package/dist/browser/FrameManager.js +496 -0
  45. package/dist/browser/HTTPRequest.d.ts +28 -0
  46. package/dist/browser/HTTPRequest.js +37 -0
  47. package/dist/browser/HTTPResponse.d.ts +21 -0
  48. package/dist/browser/HTTPResponse.js +41 -0
  49. package/dist/browser/JSHandle.d.ts +35 -0
  50. package/dist/browser/JSHandle.js +90 -0
  51. package/dist/browser/LaunchOptions.d.ts +37 -0
  52. package/dist/browser/LaunchOptions.js +17 -0
  53. package/dist/browser/Launcher.d.ts +9 -0
  54. package/dist/browser/Launcher.js +504 -0
  55. package/dist/browser/LifecycleWatcher.d.ts +29 -0
  56. package/dist/browser/LifecycleWatcher.js +180 -0
  57. package/dist/browser/NetworkEventManager.d.ts +33 -0
  58. package/dist/browser/NetworkEventManager.js +81 -0
  59. package/dist/browser/NetworkManager.d.ts +34 -0
  60. package/dist/browser/NetworkManager.js +231 -0
  61. package/dist/browser/NodeWebSocketTransport.d.ts +17 -0
  62. package/dist/browser/NodeWebSocketTransport.js +87 -0
  63. package/dist/browser/Product.d.ts +16 -0
  64. package/dist/browser/Product.js +17 -0
  65. package/dist/browser/PuppeteerNode.d.ts +40 -0
  66. package/dist/browser/PuppeteerNode.js +81 -0
  67. package/dist/browser/PuppeteerViewport.d.ts +5 -0
  68. package/dist/browser/PuppeteerViewport.js +2 -0
  69. package/dist/browser/ScreenshotOptions.d.ts +14 -0
  70. package/dist/browser/ScreenshotOptions.js +2 -0
  71. package/dist/browser/Target.d.ts +61 -0
  72. package/dist/browser/Target.js +146 -0
  73. package/dist/browser/TaskQueue.d.ts +20 -0
  74. package/dist/browser/TaskQueue.js +47 -0
  75. package/dist/browser/TimeoutSettings.d.ts +24 -0
  76. package/dist/browser/TimeoutSettings.js +62 -0
  77. package/dist/browser/assert.d.ts +1 -0
  78. package/dist/browser/assert.js +9 -0
  79. package/dist/browser/create-browser-fetcher.d.ts +17 -0
  80. package/dist/browser/create-browser-fetcher.js +119 -0
  81. package/dist/browser/devtools-commands.d.ts +270 -0
  82. package/dist/browser/devtools-commands.js +2 -0
  83. package/dist/browser/devtools-types.d.ts +1122 -0
  84. package/dist/browser/devtools-types.js +2 -0
  85. package/dist/browser/get-download-destination.d.ts +1 -0
  86. package/dist/browser/get-download-destination.js +38 -0
  87. package/dist/browser/mitt/index.d.ts +22 -0
  88. package/dist/browser/mitt/index.js +49 -0
  89. package/dist/browser/node.d.ts +2 -0
  90. package/dist/browser/node.js +9 -0
  91. package/dist/browser/revisions.d.ts +21 -0
  92. package/dist/browser/revisions.js +22 -0
  93. package/dist/browser/util.d.ts +47 -0
  94. package/dist/browser/util.js +169 -0
  95. package/dist/browser-executable.d.ts +1 -0
  96. package/dist/browser-executable.js +2 -0
  97. package/dist/browser-log.d.ts +1 -1
  98. package/dist/browser.d.ts +2 -0
  99. package/dist/browser.js +4 -0
  100. package/dist/calculate-ffmpeg-filters.d.ts +1 -1
  101. package/dist/calculate-ffmpeg-filters.js +2 -2
  102. package/dist/calculate-sar-dar-pixels.d.ts +9 -0
  103. package/dist/calculate-sar-dar-pixels.js +19 -0
  104. package/dist/can-use-parallel-encoding.d.ts +1 -1
  105. package/dist/can-use-parallel-encoding.js +2 -2
  106. package/dist/codec-supports-media.d.ts +7 -0
  107. package/dist/codec-supports-media.js +49 -0
  108. package/dist/codec.d.ts +4 -0
  109. package/dist/codec.js +16 -0
  110. package/dist/combine-videos.d.ts +4 -2
  111. package/dist/combine-videos.js +19 -5
  112. package/dist/compress-assets.d.ts +7 -0
  113. package/dist/compress-assets.js +25 -0
  114. package/dist/convert-number-of-gif-loops-to-ffmpeg.d.ts +1 -0
  115. package/dist/convert-number-of-gif-loops-to-ffmpeg.js +17 -0
  116. package/dist/convert-to-pcm.d.ts +1 -1
  117. package/dist/create-ffmpeg-complex-filter.d.ts +3 -5
  118. package/dist/create-ffmpeg-complex-filter.js +2 -11
  119. package/dist/create-ffmpeg-merge-filter.js +3 -3
  120. package/dist/create-silent-audio.d.ts +1 -1
  121. package/dist/crf.d.ts +5 -0
  122. package/dist/crf.js +64 -0
  123. package/dist/cycle-browser-tabs.d.ts +3 -2
  124. package/dist/cycle-browser-tabs.js +9 -2
  125. package/dist/delay-render-embedded-stack.d.ts +1 -1
  126. package/dist/ensure-frames-in-order.d.ts +1 -1
  127. package/dist/ensure-frames-in-order.js +3 -2
  128. package/dist/ensure-presentation-timestamp.d.ts +2 -0
  129. package/dist/ensure-presentation-timestamp.js +69 -0
  130. package/dist/error-handling/handle-javascript-exception.d.ts +2 -2
  131. package/dist/error-handling/handle-javascript-exception.js +3 -4
  132. package/dist/error-handling/symbolicate-error.d.ts +1 -1
  133. package/dist/error-handling/symbolicateable-error.d.ts +1 -1
  134. package/dist/extract-frame-from-video.d.ts +16 -0
  135. package/dist/extract-frame-from-video.js +254 -0
  136. package/dist/ffmpeg-executable.d.ts +1 -0
  137. package/dist/ffmpeg-executable.js +2 -0
  138. package/dist/ffmpeg-filter-file.d.ts +2 -1
  139. package/dist/ffmpeg-filter-file.js +4 -6
  140. package/dist/frame-range.d.ts +2 -0
  141. package/dist/frame-range.js +49 -0
  142. package/dist/frame-to-ffmpeg-timestamp.d.ts +1 -0
  143. package/dist/frame-to-ffmpeg-timestamp.js +8 -0
  144. package/dist/get-audio-codec-name.d.ts +1 -1
  145. package/dist/get-audio-codec-name.js +2 -2
  146. package/dist/get-browser-instance.d.ts +4 -3
  147. package/dist/get-browser-instance.js +2 -2
  148. package/dist/get-codec-name.d.ts +1 -1
  149. package/dist/get-codec-name.js +5 -2
  150. package/dist/get-compositions.d.ts +15 -5
  151. package/dist/get-compositions.js +35 -11
  152. package/dist/get-duration-from-frame-range.d.ts +1 -2
  153. package/dist/get-duration-from-frame-range.js +13 -9
  154. package/dist/get-extension-from-codec.d.ts +2 -2
  155. package/dist/get-extension-from-codec.js +5 -0
  156. package/dist/get-extension-of-filename.d.ts +1 -1
  157. package/dist/get-extension-of-filename.js +3 -0
  158. package/dist/get-frame-padded-index.d.ts +14 -0
  159. package/dist/get-frame-padded-index.js +33 -0
  160. package/dist/get-frame-to-render.d.ts +1 -1
  161. package/dist/get-local-browser-executable.d.ts +2 -1
  162. package/dist/get-local-browser-executable.js +7 -5
  163. package/dist/get-port.js +30 -37
  164. package/dist/get-prores-profile-name.d.ts +2 -1
  165. package/dist/get-video-info.d.ts +3 -0
  166. package/dist/get-video-info.js +49 -0
  167. package/dist/get-video-threads-flag.d.ts +1 -0
  168. package/dist/get-video-threads-flag.js +18 -0
  169. package/dist/guess-extension-for-media.d.ts +1 -0
  170. package/dist/guess-extension-for-media.js +27 -0
  171. package/dist/image-format.d.ts +6 -1
  172. package/dist/image-format.js +25 -1
  173. package/dist/index.d.ts +95 -20
  174. package/dist/index.js +93 -6
  175. package/dist/is-audio-codec.d.ts +2 -0
  176. package/dist/is-audio-codec.js +7 -0
  177. package/dist/is-beyond-last-frame.d.ts +3 -0
  178. package/dist/is-beyond-last-frame.js +12 -0
  179. package/dist/last-frame-from-video-cache.d.ts +17 -0
  180. package/dist/last-frame-from-video-cache.js +55 -0
  181. package/dist/log-level.d.ts +4 -0
  182. package/dist/log-level.js +15 -0
  183. package/dist/make-cancel-signal.d.ts +7 -0
  184. package/dist/make-cancel-signal.js +25 -0
  185. package/dist/merge-audio-track.d.ts +3 -1
  186. package/dist/merge-audio-track.js +14 -8
  187. package/dist/mime-db.d.ts +6 -0
  188. package/dist/mime-db.js +8636 -0
  189. package/dist/mime-types.d.ts +2 -0
  190. package/dist/mime-types.js +89 -0
  191. package/dist/offthread-video-server.d.ts +17 -0
  192. package/dist/offthread-video-server.js +86 -0
  193. package/dist/open-browser.d.ts +10 -8
  194. package/dist/open-browser.js +37 -32
  195. package/dist/overwrite.d.ts +1 -0
  196. package/dist/overwrite.js +4 -0
  197. package/dist/perf.d.ts +5 -0
  198. package/dist/perf.js +35 -0
  199. package/dist/pixel-format.d.ts +5 -0
  200. package/dist/pixel-format.js +26 -0
  201. package/dist/prepare-server.d.ts +14 -2
  202. package/dist/prepare-server.js +38 -5
  203. package/dist/preprocess-audio-track.d.ts +5 -2
  204. package/dist/preprocess-audio-track.js +3 -3
  205. package/dist/prespawn-ffmpeg.d.ts +7 -1
  206. package/dist/prespawn-ffmpeg.js +20 -16
  207. package/dist/prestitcher-memory-usage.d.ts +12 -0
  208. package/dist/prestitcher-memory-usage.js +30 -0
  209. package/dist/prores-profile.d.ts +5 -0
  210. package/dist/prores-profile.js +23 -0
  211. package/dist/provide-screenshot.d.ts +5 -4
  212. package/dist/provide-screenshot.js +1 -2
  213. package/dist/puppeteer-evaluate.d.ts +1 -1
  214. package/dist/puppeteer-evaluate.js +3 -4
  215. package/dist/puppeteer-screenshot.d.ts +4 -2
  216. package/dist/puppeteer-screenshot.js +7 -5
  217. package/dist/quality.d.ts +1 -0
  218. package/dist/quality.js +21 -0
  219. package/dist/render-frames.d.ts +24 -8
  220. package/dist/render-frames.js +137 -63
  221. package/dist/render-media.d.ts +36 -9
  222. package/dist/render-media.js +191 -70
  223. package/dist/render-still.d.ts +25 -7
  224. package/dist/render-still.js +75 -24
  225. package/dist/screenshot-dom-element.d.ts +7 -7
  226. package/dist/screenshot-dom-element.js +3 -6
  227. package/dist/screenshot-task.d.ts +4 -2
  228. package/dist/screenshot-task.js +36 -23
  229. package/dist/seek-to-frame.d.ts +2 -2
  230. package/dist/seek-to-frame.js +2 -2
  231. package/dist/serve-handler/index.d.ts +4 -0
  232. package/dist/serve-handler/index.js +204 -0
  233. package/dist/serve-handler/is-path-inside.d.ts +1 -0
  234. package/dist/serve-handler/is-path-inside.js +27 -0
  235. package/dist/serve-handler/range-parser.d.ts +13 -0
  236. package/dist/serve-handler/range-parser.js +57 -0
  237. package/dist/serve-static.d.ts +11 -3
  238. package/dist/serve-static.js +37 -7
  239. package/dist/set-props-and-env.d.ts +6 -2
  240. package/dist/set-props-and-env.js +48 -12
  241. package/dist/stitch-frames-to-video.d.ts +17 -5
  242. package/dist/stitch-frames-to-video.js +129 -45
  243. package/dist/stringify-ffmpeg-filter.d.ts +2 -2
  244. package/dist/stringify-ffmpeg-filter.js +12 -7
  245. package/dist/symbolicate-stacktrace.d.ts +1 -1
  246. package/dist/symbolicate-stacktrace.js +3 -3
  247. package/dist/tmp-dir.js +5 -1
  248. package/dist/truthy.d.ts +3 -0
  249. package/dist/truthy.js +7 -0
  250. package/dist/types.d.ts +1 -1
  251. package/dist/validate-concurrency.d.ts +1 -0
  252. package/dist/validate-concurrency.js +24 -0
  253. package/dist/validate-even-dimensions-with-codec.d.ts +1 -1
  254. package/dist/validate-even-dimensions-with-codec.js +2 -2
  255. package/dist/validate-every-nth-frame.d.ts +1 -0
  256. package/dist/validate-every-nth-frame.js +21 -0
  257. package/dist/validate-ffmpeg.js +2 -3
  258. package/dist/validate-frame.d.ts +1 -0
  259. package/dist/validate-frame.js +24 -0
  260. package/dist/validate-opengl-renderer.d.ts +5 -0
  261. package/dist/validate-opengl-renderer.js +15 -0
  262. package/dist/validate-output-filename.d.ts +1 -1
  263. package/dist/validate-output-filename.js +5 -0
  264. package/dist/wait-for-symbolication-error-to-be-done.d.ts +3 -0
  265. package/dist/wait-for-symbolication-error-to-be-done.js +34 -0
  266. package/dist/ws/ws-types.d.ts +14 -0
  267. package/dist/ws/ws-types.js +10 -0
  268. package/package.json +13 -16
  269. package/tsconfig.json +2 -2
  270. package/types/ws/index.d.ts +509 -0
  271. package/vitest.config.ts +8 -0
  272. package/dist/assets/calculate-asset-positions.d.ts.map +0 -1
  273. package/dist/assets/calculate-asset-positions.js.map +0 -1
  274. package/dist/assets/calculate-atempo.d.ts.map +0 -1
  275. package/dist/assets/calculate-atempo.js.map +0 -1
  276. package/dist/assets/convert-assets-to-file-urls.d.ts.map +0 -1
  277. package/dist/assets/convert-assets-to-file-urls.js.map +0 -1
  278. package/dist/assets/download-and-map-assets-to-file.d.ts.map +0 -1
  279. package/dist/assets/download-and-map-assets-to-file.js.map +0 -1
  280. package/dist/assets/download-file.d.ts.map +0 -1
  281. package/dist/assets/download-file.js.map +0 -1
  282. package/dist/assets/ffmpeg-volume-expression.d.ts.map +0 -1
  283. package/dist/assets/ffmpeg-volume-expression.js.map +0 -1
  284. package/dist/assets/flatten-volume-array.d.ts.map +0 -1
  285. package/dist/assets/flatten-volume-array.js.map +0 -1
  286. package/dist/assets/get-audio-channels.d.ts.map +0 -1
  287. package/dist/assets/get-audio-channels.js.map +0 -1
  288. package/dist/assets/read-file.d.ts.map +0 -1
  289. package/dist/assets/read-file.js.map +0 -1
  290. package/dist/assets/round-volume-to-avoid-stack-overflow.d.ts.map +0 -1
  291. package/dist/assets/round-volume-to-avoid-stack-overflow.js.map +0 -1
  292. package/dist/assets/sanitize-filename.d.ts.map +0 -1
  293. package/dist/assets/sanitize-filename.js.map +0 -1
  294. package/dist/assets/sanitize-filepath.d.ts.map +0 -1
  295. package/dist/assets/sanitize-filepath.js.map +0 -1
  296. package/dist/assets/truncate-utf8-bytes.d.ts.map +0 -1
  297. package/dist/assets/truncate-utf8-bytes.js.map +0 -1
  298. package/dist/assets/types.d.ts.map +0 -1
  299. package/dist/assets/types.js.map +0 -1
  300. package/dist/browser-log.d.ts.map +0 -1
  301. package/dist/browser-log.js.map +0 -1
  302. package/dist/calculate-ffmpeg-filters.d.ts.map +0 -1
  303. package/dist/calculate-ffmpeg-filters.js.map +0 -1
  304. package/dist/can-use-parallel-encoding.d.ts.map +0 -1
  305. package/dist/can-use-parallel-encoding.js.map +0 -1
  306. package/dist/chunk.d.ts.map +0 -1
  307. package/dist/chunk.js.map +0 -1
  308. package/dist/combine-videos.d.ts.map +0 -1
  309. package/dist/combine-videos.js.map +0 -1
  310. package/dist/convert-to-pcm.d.ts.map +0 -1
  311. package/dist/convert-to-pcm.js.map +0 -1
  312. package/dist/create-ffmpeg-complex-filter.d.ts.map +0 -1
  313. package/dist/create-ffmpeg-complex-filter.js.map +0 -1
  314. package/dist/create-ffmpeg-merge-filter.d.ts.map +0 -1
  315. package/dist/create-ffmpeg-merge-filter.js.map +0 -1
  316. package/dist/create-silent-audio.d.ts.map +0 -1
  317. package/dist/create-silent-audio.js.map +0 -1
  318. package/dist/cycle-browser-tabs.d.ts.map +0 -1
  319. package/dist/cycle-browser-tabs.js.map +0 -1
  320. package/dist/delay-render-embedded-stack.d.ts.map +0 -1
  321. package/dist/delay-render-embedded-stack.js.map +0 -1
  322. package/dist/delete-directory.d.ts.map +0 -1
  323. package/dist/delete-directory.js.map +0 -1
  324. package/dist/ensure-frames-in-order.d.ts.map +0 -1
  325. package/dist/ensure-frames-in-order.js.map +0 -1
  326. package/dist/ensure-output-directory.d.ts.map +0 -1
  327. package/dist/ensure-output-directory.js.map +0 -1
  328. package/dist/error-handling/handle-javascript-exception.d.ts.map +0 -1
  329. package/dist/error-handling/handle-javascript-exception.js.map +0 -1
  330. package/dist/error-handling/symbolicate-error.d.ts.map +0 -1
  331. package/dist/error-handling/symbolicate-error.js.map +0 -1
  332. package/dist/error-handling/symbolicateable-error.d.ts.map +0 -1
  333. package/dist/error-handling/symbolicateable-error.js.map +0 -1
  334. package/dist/ffmpeg-filter-file.d.ts.map +0 -1
  335. package/dist/ffmpeg-filter-file.js.map +0 -1
  336. package/dist/ffmpeg-flags.d.ts.map +0 -1
  337. package/dist/ffmpeg-flags.js.map +0 -1
  338. package/dist/get-audio-codec-name.d.ts.map +0 -1
  339. package/dist/get-audio-codec-name.js.map +0 -1
  340. package/dist/get-browser-instance.d.ts.map +0 -1
  341. package/dist/get-browser-instance.js.map +0 -1
  342. package/dist/get-codec-name.d.ts.map +0 -1
  343. package/dist/get-codec-name.js.map +0 -1
  344. package/dist/get-compositions.d.ts.map +0 -1
  345. package/dist/get-compositions.js.map +0 -1
  346. package/dist/get-concurrency.d.ts.map +0 -1
  347. package/dist/get-concurrency.js.map +0 -1
  348. package/dist/get-duration-from-frame-range.d.ts.map +0 -1
  349. package/dist/get-duration-from-frame-range.js.map +0 -1
  350. package/dist/get-extension-from-codec.d.ts.map +0 -1
  351. package/dist/get-extension-from-codec.js.map +0 -1
  352. package/dist/get-frame-to-render.d.ts.map +0 -1
  353. package/dist/get-frame-to-render.js.map +0 -1
  354. package/dist/get-local-browser-executable.d.ts.map +0 -1
  355. package/dist/get-local-browser-executable.js.map +0 -1
  356. package/dist/get-port.d.ts.map +0 -1
  357. package/dist/get-port.js.map +0 -1
  358. package/dist/get-prores-profile-name.d.ts.map +0 -1
  359. package/dist/get-prores-profile-name.js.map +0 -1
  360. package/dist/image-format.d.ts.map +0 -1
  361. package/dist/image-format.js.map +0 -1
  362. package/dist/index.d.ts.map +0 -1
  363. package/dist/index.js.map +0 -1
  364. package/dist/is-serve-url.d.ts.map +0 -1
  365. package/dist/is-serve-url.js.map +0 -1
  366. package/dist/legacy-webpack-config.d.ts.map +0 -1
  367. package/dist/legacy-webpack-config.js.map +0 -1
  368. package/dist/make-assets-download-dir.d.ts +0 -1
  369. package/dist/make-assets-download-dir.d.ts.map +0 -1
  370. package/dist/make-assets-download-dir.js +0 -8
  371. package/dist/make-assets-download-dir.js.map +0 -1
  372. package/dist/merge-audio-track.d.ts.map +0 -1
  373. package/dist/merge-audio-track.js.map +0 -1
  374. package/dist/normalize-serve-url.d.ts.map +0 -1
  375. package/dist/normalize-serve-url.js.map +0 -1
  376. package/dist/open-browser.d.ts.map +0 -1
  377. package/dist/open-browser.js.map +0 -1
  378. package/dist/p-limit.d.ts.map +0 -1
  379. package/dist/p-limit.js.map +0 -1
  380. package/dist/parse-browser-error-stack.d.ts.map +0 -1
  381. package/dist/parse-browser-error-stack.js.map +0 -1
  382. package/dist/parse-ffmpeg-progress.d.ts.map +0 -1
  383. package/dist/parse-ffmpeg-progress.js.map +0 -1
  384. package/dist/pool.d.ts.map +0 -1
  385. package/dist/pool.js.map +0 -1
  386. package/dist/prepare-server.d.ts.map +0 -1
  387. package/dist/prepare-server.js.map +0 -1
  388. package/dist/preprocess-audio-track.d.ts.map +0 -1
  389. package/dist/preprocess-audio-track.js.map +0 -1
  390. package/dist/prespawn-ffmpeg.d.ts.map +0 -1
  391. package/dist/prespawn-ffmpeg.js.map +0 -1
  392. package/dist/provide-screenshot.d.ts.map +0 -1
  393. package/dist/provide-screenshot.js.map +0 -1
  394. package/dist/puppeteer-evaluate.d.ts.map +0 -1
  395. package/dist/puppeteer-evaluate.js.map +0 -1
  396. package/dist/puppeteer-screenshot.d.ts.map +0 -1
  397. package/dist/puppeteer-screenshot.js.map +0 -1
  398. package/dist/render-frames.d.ts.map +0 -1
  399. package/dist/render-frames.js.map +0 -1
  400. package/dist/render-media.d.ts.map +0 -1
  401. package/dist/render-media.js.map +0 -1
  402. package/dist/render-still.d.ts.map +0 -1
  403. package/dist/render-still.js.map +0 -1
  404. package/dist/resolve-asset-src.d.ts.map +0 -1
  405. package/dist/resolve-asset-src.js.map +0 -1
  406. package/dist/sample-rate.d.ts.map +0 -1
  407. package/dist/sample-rate.js.map +0 -1
  408. package/dist/screenshot-dom-element.d.ts.map +0 -1
  409. package/dist/screenshot-dom-element.js.map +0 -1
  410. package/dist/screenshot-task.d.ts.map +0 -1
  411. package/dist/screenshot-task.js.map +0 -1
  412. package/dist/seek-to-frame.d.ts.map +0 -1
  413. package/dist/seek-to-frame.js.map +0 -1
  414. package/dist/serve-static.d.ts.map +0 -1
  415. package/dist/serve-static.js.map +0 -1
  416. package/dist/set-props-and-env.d.ts.map +0 -1
  417. package/dist/set-props-and-env.js.map +0 -1
  418. package/dist/stitch-frames-to-video.d.ts.map +0 -1
  419. package/dist/stitch-frames-to-video.js.map +0 -1
  420. package/dist/stringify-ffmpeg-filter.d.ts.map +0 -1
  421. package/dist/stringify-ffmpeg-filter.js.map +0 -1
  422. package/dist/symbolicate-stacktrace.d.ts.map +0 -1
  423. package/dist/symbolicate-stacktrace.js.map +0 -1
  424. package/dist/tmp-dir.d.ts.map +0 -1
  425. package/dist/tmp-dir.js.map +0 -1
  426. package/dist/types.d.ts.map +0 -1
  427. package/dist/types.js.map +0 -1
  428. package/dist/validate-even-dimensions-with-codec.d.ts.map +0 -1
  429. package/dist/validate-even-dimensions-with-codec.js.map +0 -1
  430. package/dist/validate-ffmpeg.d.ts.map +0 -1
  431. package/dist/validate-ffmpeg.js.map +0 -1
  432. package/dist/validate-puppeteer-timeout.d.ts.map +0 -1
  433. package/dist/validate-puppeteer-timeout.js.map +0 -1
  434. package/dist/validate-scale.d.ts.map +0 -1
  435. package/dist/validate-scale.js.map +0 -1
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ /**
3
+ * Since audio or video can be base64-encoded, those can be really long strings.
4
+ * Since we track the `src` property for every frame, Node.JS can run out of memory easily. Instead of duplicating the src for every frame, we save memory by replacing the full base 64 encoded data with a string `same-as-[asset-id]-[frame]` referencing a previous asset with the same src.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.isAssetCompressed = exports.compressAsset = void 0;
8
+ const compressAsset = (previousAssets, newAsset) => {
9
+ if (newAsset.src.length < 400) {
10
+ return newAsset;
11
+ }
12
+ const assetWithSameSrc = previousAssets.find((a) => a.src === newAsset.src);
13
+ if (!assetWithSameSrc) {
14
+ return newAsset;
15
+ }
16
+ return {
17
+ ...newAsset,
18
+ src: `same-as-${assetWithSameSrc.id}-${assetWithSameSrc.frame}`,
19
+ };
20
+ };
21
+ exports.compressAsset = compressAsset;
22
+ const isAssetCompressed = (src) => {
23
+ return src.startsWith('same-as');
24
+ };
25
+ exports.isAssetCompressed = isAssetCompressed;
@@ -0,0 +1 @@
1
+ export declare const convertNumberOfGifLoopsToFfmpegSyntax: (loops: number | null) => string;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ // https://superuser.com/questions/1607099/how-to-control-gif-loop-settings-in-ffmpeg
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.convertNumberOfGifLoopsToFfmpegSyntax = void 0;
5
+ const convertNumberOfGifLoopsToFfmpegSyntax = (loops) => {
6
+ // Infinite loop
7
+ if (loops === null) {
8
+ return '0';
9
+ }
10
+ // No loops
11
+ if (loops === 0) {
12
+ return '-1';
13
+ }
14
+ // N amount of loops
15
+ return String(loops);
16
+ };
17
+ exports.convertNumberOfGifLoopsToFfmpegSyntax = convertNumberOfGifLoopsToFfmpegSyntax;
@@ -1,4 +1,4 @@
1
- import { FfmpegExecutable } from 'remotion';
1
+ import type { FfmpegExecutable } from './ffmpeg-executable';
2
2
  export declare const convertToPcm: ({ ffmpegExecutable, input, outName, }: {
3
3
  ffmpegExecutable: FfmpegExecutable;
4
4
  input: string;
@@ -1,7 +1,5 @@
1
- export declare const createFfmpegComplexFilter: (filters: number) => Promise<{
2
- complexFilterFlag: [
3
- string,
4
- string
5
- ] | null;
1
+ import type { DownloadMap } from './assets/download-map';
2
+ export declare const createFfmpegComplexFilter: (filters: number, downloadMap: DownloadMap) => Promise<{
3
+ complexFilterFlag: [string, string] | null;
6
4
  cleanup: () => void;
7
5
  }>;
@@ -1,23 +1,14 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.createFfmpegComplexFilter = void 0;
7
- const fs_1 = __importDefault(require("fs"));
8
- const path_1 = __importDefault(require("path"));
9
4
  const create_ffmpeg_merge_filter_1 = require("./create-ffmpeg-merge-filter");
10
5
  const ffmpeg_filter_file_1 = require("./ffmpeg-filter-file");
11
- const tmp_dir_1 = require("./tmp-dir");
12
- const createFfmpegComplexFilter = async (filters) => {
6
+ const createFfmpegComplexFilter = async (filters, downloadMap) => {
13
7
  if (filters === 0) {
14
8
  return { complexFilterFlag: null, cleanup: () => undefined };
15
9
  }
16
10
  const complexFilter = (0, create_ffmpeg_merge_filter_1.createFfmpegMergeFilter)(filters);
17
- const { file, cleanup } = await (0, ffmpeg_filter_file_1.makeFfmpegFilterFile)(complexFilter);
18
- const tempPath = (0, tmp_dir_1.tmpDir)('remotion-complex-filter-script');
19
- const filterFile = path_1.default.join(tempPath, 'complex-filter.txt');
20
- await fs_1.default.promises.writeFile(filterFile, complexFilter);
11
+ const { file, cleanup } = await (0, ffmpeg_filter_file_1.makeFfmpegFilterFile)(complexFilter, downloadMap);
21
12
  return {
22
13
  complexFilterFlag: ['-filter_complex_script', file],
23
14
  cleanup,
@@ -1,17 +1,17 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createFfmpegMergeFilter = void 0;
4
- const remotion_1 = require("remotion");
4
+ const truthy_1 = require("./truthy");
5
5
  const createFfmpegMergeFilter = (inputs) => {
6
6
  const leftChannel = new Array(inputs * 2)
7
7
  .fill(true)
8
8
  .map((_, i) => (i % 2 === 0 ? `c${i}` : null))
9
- .filter(remotion_1.Internals.truthy)
9
+ .filter(truthy_1.truthy)
10
10
  .join('+');
11
11
  const rightChannel = new Array(inputs * 2)
12
12
  .fill(true)
13
13
  .map((_, i) => (i % 2 === 1 ? `c${i}` : null))
14
- .filter(remotion_1.Internals.truthy)
14
+ .filter(truthy_1.truthy)
15
15
  .join('+');
16
16
  return `[0:a][1:a]amerge=inputs=${inputs},pan=stereo|c0=${leftChannel}|c1=${rightChannel}[a]`;
17
17
  };
@@ -1,4 +1,4 @@
1
- import { FfmpegExecutable } from 'remotion';
1
+ import type { FfmpegExecutable } from './ffmpeg-executable';
2
2
  export declare const createSilentAudio: ({ ffmpegExecutable, numberOfSeconds, outName, }: {
3
3
  ffmpegExecutable: FfmpegExecutable;
4
4
  numberOfSeconds: number;
package/dist/crf.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ import type { Codec } from './codec';
2
+ export declare type Crf = number | undefined;
3
+ export declare const getDefaultCrfForCodec: (codec: Codec) => number;
4
+ export declare const getValidCrfRanges: (codec: Codec) => [number, number];
5
+ export declare const validateSelectedCrfAndCodecCombination: (crf: unknown, codec: Codec) => void;
package/dist/crf.js ADDED
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateSelectedCrfAndCodecCombination = exports.getValidCrfRanges = exports.getDefaultCrfForCodec = void 0;
4
+ const is_audio_codec_1 = require("./is-audio-codec");
5
+ const getDefaultCrfForCodec = (codec) => {
6
+ if ((0, is_audio_codec_1.isAudioCodec)(codec)) {
7
+ return 0;
8
+ }
9
+ if (codec === 'h264' || codec === 'h264-mkv') {
10
+ return 18; // FFMPEG default 23
11
+ }
12
+ if (codec === 'h265' || codec === 'gif') {
13
+ return 23; // FFMPEG default 28
14
+ }
15
+ if (codec === 'vp8') {
16
+ return 9; // FFMPEG default 10
17
+ }
18
+ if (codec === 'vp9') {
19
+ return 28; // FFMPEG recommendation 31
20
+ }
21
+ if (codec === 'prores') {
22
+ return 0;
23
+ }
24
+ throw new TypeError(`Got unexpected codec "${codec}"`);
25
+ };
26
+ exports.getDefaultCrfForCodec = getDefaultCrfForCodec;
27
+ const getValidCrfRanges = (codec) => {
28
+ if ((0, is_audio_codec_1.isAudioCodec)(codec)) {
29
+ return [0, 0];
30
+ }
31
+ if (codec === 'prores') {
32
+ return [0, 0];
33
+ }
34
+ if (codec === 'h264' || codec === 'h264-mkv') {
35
+ return [1, 51];
36
+ }
37
+ if (codec === 'h265' || codec === 'gif') {
38
+ return [0, 51];
39
+ }
40
+ if (codec === 'vp8') {
41
+ return [4, 63];
42
+ }
43
+ if (codec === 'vp9') {
44
+ return [0, 63];
45
+ }
46
+ throw new TypeError(`Got unexpected codec "${codec}"`);
47
+ };
48
+ exports.getValidCrfRanges = getValidCrfRanges;
49
+ const validateSelectedCrfAndCodecCombination = (crf, codec) => {
50
+ if (crf === null) {
51
+ return;
52
+ }
53
+ if (typeof crf !== 'number') {
54
+ throw new TypeError('Expected CRF to be a number, but is ' + JSON.stringify(crf));
55
+ }
56
+ const range = (0, exports.getValidCrfRanges)(codec);
57
+ if (crf === 0 && (codec === 'h264' || codec === 'h264-mkv')) {
58
+ throw new TypeError("Setting the CRF to 0 with a H264 codec is not supported anymore because of it's inconsistencies between platforms. Videos with CRF 0 cannot be played on iOS/macOS. 0 is a extreme value with inefficient settings which you probably want. Set CRF to a higher value to fix this error.");
59
+ }
60
+ if (crf < range[0] || crf > range[1]) {
61
+ throw new TypeError(`CRF must be between ${range[0]} and ${range[1]} for codec ${codec}. Passed: ${crf}`);
62
+ }
63
+ };
64
+ exports.validateSelectedCrfAndCodecCombination = validateSelectedCrfAndCodecCombination;
@@ -1,6 +1,7 @@
1
- import { openBrowser } from './open-browser';
1
+ import type { openBrowser } from './open-browser';
2
2
  declare type Await<T> = T extends PromiseLike<infer U> ? U : T;
3
- export declare const cycleBrowserTabs: (puppeteerInstance: Await<ReturnType<typeof openBrowser>>, concurrency: number) => {
3
+ declare type Browser = Await<ReturnType<typeof openBrowser>>;
4
+ export declare const cycleBrowserTabs: (puppeteerInstance: Browser, concurrency: number) => {
4
5
  stopCycling: () => void;
5
6
  };
6
7
  export {};
@@ -9,15 +9,21 @@ const cycleBrowserTabs = (puppeteerInstance, concurrency) => {
9
9
  }
10
10
  let interval = null;
11
11
  let i = 0;
12
+ let stopped = false;
12
13
  const set = () => {
13
14
  interval = setTimeout(() => {
14
15
  puppeteerInstance
15
16
  .pages()
16
17
  .then((pages) => {
17
- var _a, _b;
18
+ var _a;
19
+ if (pages.length === 0) {
20
+ return;
21
+ }
18
22
  const currentPage = pages[i % pages.length];
19
23
  i++;
20
- if (!((_b = (_a = currentPage === null || currentPage === void 0 ? void 0 : currentPage.isClosed) === null || _a === void 0 ? void 0 : _a.call(currentPage)) !== null && _b !== void 0 ? _b : true)) {
24
+ if (!((_a = currentPage === null || currentPage === void 0 ? void 0 : currentPage.isClosed) === null || _a === void 0 ? void 0 : _a.call(currentPage)) &&
25
+ !stopped &&
26
+ (currentPage === null || currentPage === void 0 ? void 0 : currentPage.url()) !== 'about:blank') {
21
27
  return currentPage.bringToFront();
22
28
  }
23
29
  })
@@ -33,6 +39,7 @@ const cycleBrowserTabs = (puppeteerInstance, concurrency) => {
33
39
  if (!interval) {
34
40
  return;
35
41
  }
42
+ stopped = true;
36
43
  return clearInterval(interval);
37
44
  },
38
45
  };
@@ -1,2 +1,2 @@
1
- import { UnsymbolicatedStackFrame } from './parse-browser-error-stack';
1
+ import type { UnsymbolicatedStackFrame } from './parse-browser-error-stack';
2
2
  export declare const parseDelayRenderEmbeddedStack: (message: string) => UnsymbolicatedStackFrame[] | null;
@@ -1,4 +1,4 @@
1
- export declare const ensureFramesInOrder: (frameRange: [number, number]) => {
1
+ export declare const ensureFramesInOrder: (framesToRender: number[]) => {
2
2
  waitForRightTimeOfFrameToBeInserted: (frameToBe: number) => Promise<void>;
3
3
  setFrameToStitch: (f: number) => void;
4
4
  waitForFinish: () => Promise<void>;
@@ -1,8 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ensureFramesInOrder = void 0;
4
- const ensureFramesInOrder = (frameRange) => {
5
- let [frameToStitch, finalFrame] = frameRange;
4
+ const ensureFramesInOrder = (framesToRender) => {
5
+ let [frameToStitch] = framesToRender;
6
+ const finalFrame = framesToRender[framesToRender.length - 1];
6
7
  let waiters = [];
7
8
  const resolveWaiters = () => {
8
9
  for (const waiter of waiters.slice(0)) {
@@ -0,0 +1,2 @@
1
+ import type { DownloadMap } from './assets/download-map';
2
+ export declare const ensurePresentationTimestamps: (downloadMap: DownloadMap, src: string) => Promise<string>;
@@ -0,0 +1,69 @@
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.ensurePresentationTimestamps = void 0;
7
+ const execa_1 = __importDefault(require("execa"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const guess_extension_for_media_1 = require("./guess-extension-for-media");
10
+ const truthy_1 = require("./truthy");
11
+ let callbacks = [];
12
+ const getTemporaryOutputName = async (src) => {
13
+ const parts = src.split(path_1.default.sep);
14
+ // If there is no file extension for the video, then we need to temporarily add an extension
15
+ const lastPart = parts[parts.length - 1];
16
+ const extraExtension = lastPart.includes('.')
17
+ ? null
18
+ : await (0, guess_extension_for_media_1.guessExtensionForVideo)(src);
19
+ return parts
20
+ .map((p, i) => {
21
+ if (i === parts.length - 1) {
22
+ return [`pts-${p}`, extraExtension].filter(truthy_1.truthy).join('.');
23
+ }
24
+ return p;
25
+ })
26
+ .join(path_1.default.sep);
27
+ };
28
+ const ensurePresentationTimestamps = async (downloadMap, src) => {
29
+ const elem = downloadMap.ensureFileHasPresentationTimestamp[src];
30
+ if ((elem === null || elem === void 0 ? void 0 : elem.type) === 'encoding') {
31
+ return new Promise((resolve) => {
32
+ callbacks.push({
33
+ src,
34
+ fn: (newSrc) => resolve(newSrc),
35
+ });
36
+ });
37
+ }
38
+ if ((elem === null || elem === void 0 ? void 0 : elem.type) === 'done') {
39
+ return elem.src;
40
+ }
41
+ downloadMap.ensureFileHasPresentationTimestamp[src] = { type: 'encoding' };
42
+ // If there is no file extension for the video, then we need to tempoa
43
+ const output = await getTemporaryOutputName(src);
44
+ await (0, execa_1.default)('ffmpeg', [
45
+ '-i',
46
+ src,
47
+ '-fflags',
48
+ '+genpts+igndts',
49
+ '-vcodec',
50
+ 'copy',
51
+ '-acodec',
52
+ 'copy',
53
+ output,
54
+ '-y',
55
+ ]);
56
+ callbacks = callbacks.filter((c) => {
57
+ if (c.src === src) {
58
+ c.fn(output);
59
+ return false;
60
+ }
61
+ return true;
62
+ });
63
+ downloadMap.ensureFileHasPresentationTimestamp[src] = {
64
+ type: 'done',
65
+ src: output,
66
+ };
67
+ return output;
68
+ };
69
+ exports.ensurePresentationTimestamps = ensurePresentationTimestamps;
@@ -1,5 +1,5 @@
1
- import { Page } from 'puppeteer-core';
2
- import { SymbolicatedStackFrame } from '../symbolicate-stacktrace';
1
+ import type { Page } from '../browser/BrowserPage';
2
+ import type { SymbolicatedStackFrame } from '../symbolicate-stacktrace';
3
3
  export declare class ErrorWithStackFrame extends Error {
4
4
  symbolicatedStackFrames: SymbolicatedStackFrame[] | null;
5
5
  frame: number | null;
@@ -41,8 +41,8 @@ const callFrameToStackFrame = (callFrame) => {
41
41
  };
42
42
  };
43
43
  const handleJavascriptException = ({ page, onError, frame, }) => {
44
- const client = page._client;
45
- const handler = async (exception) => {
44
+ const client = page._client();
45
+ const handler = (exception) => {
46
46
  var _a, _b, _c;
47
47
  const rawErrorMessage = (_a = exception.exceptionDetails.exception) === null || _a === void 0 ? void 0 : _a.description;
48
48
  const cleanErrorMessage = cleanUpErrorMessage(exception);
@@ -55,8 +55,7 @@ const handleJavascriptException = ({ page, onError, frame, }) => {
55
55
  const errorType = (_b = exception.exceptionDetails.exception) === null || _b === void 0 ? void 0 : _b.className;
56
56
  const symbolicatedErr = new symbolicateable_error_1.SymbolicateableError({
57
57
  message: removeDelayRenderStack(cleanErrorMessage),
58
- stackFrame: exception.exceptionDetails.stackTrace
59
- .callFrames.map((f) => callFrameToStackFrame(f)),
58
+ stackFrame: exception.exceptionDetails.stackTrace.callFrames.map((f) => callFrameToStackFrame(f)),
60
59
  frame,
61
60
  name: errorType,
62
61
  stack: (_c = exception.exceptionDetails.exception) === null || _c === void 0 ? void 0 : _c.description,
@@ -1,3 +1,3 @@
1
1
  import { ErrorWithStackFrame } from './handle-javascript-exception';
2
- import { SymbolicateableError } from './symbolicateable-error';
2
+ import type { SymbolicateableError } from './symbolicateable-error';
3
3
  export declare const symbolicateError: (symbolicateableError: SymbolicateableError) => Promise<ErrorWithStackFrame>;
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * A symbolicateable error is an error that can be symolicated by fetching the original sources. By throwing a symbolicateable error, Remotion CLI will attempt to symplicate it
3
3
  */
4
- import { UnsymbolicatedStackFrame } from '../parse-browser-error-stack';
4
+ import type { UnsymbolicatedStackFrame } from '../parse-browser-error-stack';
5
5
  export declare class SymbolicateableError extends Error {
6
6
  stackFrame: UnsymbolicatedStackFrame[] | null;
7
7
  delayRenderCall: UnsymbolicatedStackFrame[] | null;
@@ -0,0 +1,16 @@
1
+ /// <reference types="node" />
2
+ import type { OffthreadVideoImageFormat } from 'remotion';
3
+ import type { DownloadMap } from './assets/download-map';
4
+ import type { FfmpegExecutable } from './ffmpeg-executable';
5
+ import type { LastFrameOptions } from './last-frame-from-video-cache';
6
+ export declare const getLastFrameOfVideo: (options: LastFrameOptions) => Promise<Buffer>;
7
+ declare type Options = {
8
+ time: number;
9
+ src: string;
10
+ ffmpegExecutable: FfmpegExecutable;
11
+ ffprobeExecutable: FfmpegExecutable;
12
+ imageFormat: OffthreadVideoImageFormat;
13
+ downloadMap: DownloadMap;
14
+ };
15
+ export declare const extractFrameFromVideo: (options: Options) => Promise<Buffer>;
16
+ export {};
@@ -0,0 +1,254 @@
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.extractFrameFromVideo = exports.getLastFrameOfVideo = void 0;
7
+ const execa_1 = __importDefault(require("execa"));
8
+ const get_video_stream_duration_1 = require("./assets/get-video-stream-duration");
9
+ const ensure_presentation_timestamp_1 = require("./ensure-presentation-timestamp");
10
+ const frame_to_ffmpeg_timestamp_1 = require("./frame-to-ffmpeg-timestamp");
11
+ const get_video_info_1 = require("./get-video-info");
12
+ const is_beyond_last_frame_1 = require("./is-beyond-last-frame");
13
+ const last_frame_from_video_cache_1 = require("./last-frame-from-video-cache");
14
+ const p_limit_1 = require("./p-limit");
15
+ const perf_1 = require("./perf");
16
+ const truthy_1 = require("./truthy");
17
+ const lastFrameLimit = (0, p_limit_1.pLimit)(1);
18
+ const mainLimit = (0, p_limit_1.pLimit)(5);
19
+ const determineVcodecFfmepgFlags = (vcodecFlag) => {
20
+ return [
21
+ vcodecFlag === 'vp9' ? '-vcodec' : null,
22
+ vcodecFlag === 'vp9' ? 'libvpx-vp9' : null,
23
+ vcodecFlag === 'vp8' ? '-vcodec' : null,
24
+ vcodecFlag === 'vp8' ? 'libvpx' : null,
25
+ ].filter(truthy_1.truthy);
26
+ };
27
+ const determineResizeParams = (needsResize) => {
28
+ if (needsResize === null) {
29
+ return [];
30
+ }
31
+ return ['-s', `${needsResize[0]}x${needsResize[1]}`];
32
+ };
33
+ // Uses no seeking, therefore the whole video has to be decoded. This is a last resort and should only happen
34
+ // if the video is corrupted
35
+ const getFrameOfVideoSlow = async ({ src, timestamp, ffmpegExecutable, imageFormat, specialVCodecForTransparency, needsResize, }) => {
36
+ console.warn(`\nUsing a slow method to extract the frame at ${timestamp}ms of ${src}. See https://remotion.dev/docs/slow-method-to-extract-frame for advice`);
37
+ const actualOffset = `-${timestamp * 1000}ms`;
38
+ const command = [
39
+ '-itsoffset',
40
+ actualOffset,
41
+ ...determineVcodecFfmepgFlags(specialVCodecForTransparency),
42
+ '-i',
43
+ src,
44
+ '-frames:v',
45
+ '1',
46
+ '-c:v',
47
+ imageFormat === 'jpeg' ? 'mjpeg' : 'png',
48
+ '-f',
49
+ 'image2pipe',
50
+ ...determineResizeParams(needsResize),
51
+ '-',
52
+ ].filter(truthy_1.truthy);
53
+ const { stdout, stderr } = (0, execa_1.default)(ffmpegExecutable !== null && ffmpegExecutable !== void 0 ? ffmpegExecutable : 'ffmpeg', command);
54
+ if (!stderr) {
55
+ throw new Error('unexpectedly did not get stderr');
56
+ }
57
+ if (!stdout) {
58
+ throw new Error('unexpectedly did not get stdout');
59
+ }
60
+ const stderrChunks = [];
61
+ const stdoutChunks = [];
62
+ const stdErrString = new Promise((resolve, reject) => {
63
+ stderr.on('data', (d) => stderrChunks.push(d));
64
+ stderr.on('error', (err) => reject(err));
65
+ stderr.on('end', () => resolve(Buffer.concat(stderrChunks).toString('utf-8')));
66
+ });
67
+ const stdoutChunk = new Promise((resolve, reject) => {
68
+ stdout.on('data', (d) => stdoutChunks.push(d));
69
+ stdout.on('error', (err) => reject(err));
70
+ stdout.on('end', () => resolve(Buffer.concat(stdoutChunks)));
71
+ });
72
+ const [stdErr, stdoutBuffer] = await Promise.all([stdErrString, stdoutChunk]);
73
+ const isEmpty = stdErr.includes('Output file is empty');
74
+ if (isEmpty) {
75
+ throw new Error(`Could not get last frame of ${src}. Tried to seek to the end using the command "ffmpeg ${command.join(' ')}" but got no frame. Most likely this video is corrupted.`);
76
+ }
77
+ return stdoutBuffer;
78
+ };
79
+ const getLastFrameOfVideoFastUnlimited = async (options) => {
80
+ const { ffmpegExecutable, ffprobeExecutable, offset, src, downloadMap } = options;
81
+ const fromCache = (0, last_frame_from_video_cache_1.getLastFrameFromCache)({ ...options, offset: 0 });
82
+ if (fromCache) {
83
+ return fromCache;
84
+ }
85
+ const { duration, fps } = await (0, get_video_stream_duration_1.getVideoStreamDuration)(downloadMap, src, ffprobeExecutable);
86
+ if (duration === null) {
87
+ throw new Error(`Could not determine the duration of ${src} using FFMPEG. The file is not supported.`);
88
+ }
89
+ if (options.specialVCodecForTransparency === 'vp8' || offset > 40) {
90
+ const last = await getFrameOfVideoSlow({
91
+ timestamp: duration,
92
+ ffmpegExecutable,
93
+ src,
94
+ imageFormat: options.imageFormat,
95
+ specialVCodecForTransparency: options.specialVCodecForTransparency,
96
+ needsResize: options.needsResize,
97
+ });
98
+ return last;
99
+ }
100
+ const actualOffset = `${duration * 1000 - offset}ms`;
101
+ const { stdout, stderr } = (0, execa_1.default)(ffmpegExecutable !== null && ffmpegExecutable !== void 0 ? ffmpegExecutable : 'ffmpeg', [
102
+ '-ss',
103
+ actualOffset,
104
+ ...determineVcodecFfmepgFlags(options.specialVCodecForTransparency),
105
+ '-i',
106
+ src,
107
+ '-frames:v',
108
+ '1',
109
+ '-c:v',
110
+ options.imageFormat === 'jpeg' ? 'mjpeg' : 'png',
111
+ '-f',
112
+ 'image2pipe',
113
+ ...determineResizeParams(options.needsResize),
114
+ '-',
115
+ ].filter(truthy_1.truthy));
116
+ if (!stderr) {
117
+ throw new Error('unexpectedly did not get stderr');
118
+ }
119
+ if (!stdout) {
120
+ throw new Error('unexpectedly did not get stdout');
121
+ }
122
+ const stderrChunks = [];
123
+ const stdoutChunks = [];
124
+ const stdErrString = new Promise((resolve, reject) => {
125
+ stderr.on('data', (d) => stderrChunks.push(d));
126
+ stderr.on('error', (err) => reject(err));
127
+ stderr.on('end', () => resolve(Buffer.concat(stderrChunks).toString('utf-8')));
128
+ });
129
+ const stdoutChunk = new Promise((resolve, reject) => {
130
+ stdout.on('data', (d) => {
131
+ stdoutChunks.push(d);
132
+ });
133
+ stdout.on('error', (err) => {
134
+ reject(err);
135
+ });
136
+ stdout.on('end', () => {
137
+ resolve(Buffer.concat(stdoutChunks));
138
+ });
139
+ });
140
+ const [stdErr, stdoutBuffer] = await Promise.all([stdErrString, stdoutChunk]);
141
+ const isEmpty = stdErr.includes('Output file is empty');
142
+ if (isEmpty) {
143
+ const unlimited = await getLastFrameOfVideoFastUnlimited({
144
+ ffmpegExecutable,
145
+ // Decrement in 10ms increments, or 1 frame (e.g. fps = 25 --> 40ms)
146
+ offset: offset + 1000 / (fps === null ? 10 : fps),
147
+ src,
148
+ ffprobeExecutable,
149
+ imageFormat: options.imageFormat,
150
+ specialVCodecForTransparency: options.specialVCodecForTransparency,
151
+ needsResize: options.needsResize,
152
+ downloadMap: options.downloadMap,
153
+ });
154
+ return unlimited;
155
+ }
156
+ return stdoutBuffer;
157
+ };
158
+ const getLastFrameOfVideo = async (options) => {
159
+ const result = await lastFrameLimit(getLastFrameOfVideoFastUnlimited, options);
160
+ (0, last_frame_from_video_cache_1.setLastFrameInCache)(options, result);
161
+ return result;
162
+ };
163
+ exports.getLastFrameOfVideo = getLastFrameOfVideo;
164
+ const extractFrameFromVideoFn = async ({ time, ffmpegExecutable, ffprobeExecutable, imageFormat, downloadMap, ...options }) => {
165
+ // We make a new copy of the video only for video because the conversion may affect
166
+ // audio rendering, so we work with 2 different files
167
+ const src = await (0, ensure_presentation_timestamp_1.ensurePresentationTimestamps)(downloadMap, options.src);
168
+ const { specialVcodec, needsResize } = await (0, get_video_info_1.getVideoInfo)(downloadMap, src, ffprobeExecutable);
169
+ if (specialVcodec === 'vp8') {
170
+ return getFrameOfVideoSlow({
171
+ ffmpegExecutable,
172
+ imageFormat,
173
+ specialVCodecForTransparency: specialVcodec,
174
+ src,
175
+ timestamp: time,
176
+ needsResize,
177
+ });
178
+ }
179
+ if ((0, is_beyond_last_frame_1.isBeyondLastFrame)(downloadMap, src, time)) {
180
+ const lastFrame = await (0, exports.getLastFrameOfVideo)({
181
+ ffmpegExecutable,
182
+ ffprobeExecutable,
183
+ offset: 0,
184
+ src,
185
+ imageFormat,
186
+ specialVCodecForTransparency: specialVcodec,
187
+ needsResize,
188
+ downloadMap,
189
+ });
190
+ return lastFrame;
191
+ }
192
+ const ffmpegTimestamp = (0, frame_to_ffmpeg_timestamp_1.frameToFfmpegTimestamp)(time);
193
+ const { stdout, stderr } = (0, execa_1.default)(ffmpegExecutable !== null && ffmpegExecutable !== void 0 ? ffmpegExecutable : 'ffmpeg', [
194
+ '-ss',
195
+ ffmpegTimestamp,
196
+ ...determineVcodecFfmepgFlags(specialVcodec),
197
+ '-i',
198
+ src,
199
+ '-frames:v',
200
+ '1',
201
+ '-f',
202
+ 'image2pipe',
203
+ '-vcodec',
204
+ imageFormat === 'jpeg' ? 'mjpeg' : 'png',
205
+ ...determineResizeParams(needsResize),
206
+ '-',
207
+ ].filter(truthy_1.truthy), {
208
+ buffer: false,
209
+ });
210
+ if (!stderr) {
211
+ throw new Error('unexpectedly did not get stderr');
212
+ }
213
+ if (!stdout) {
214
+ throw new Error('unexpectedly did not get stdout');
215
+ }
216
+ const stdoutChunks = [];
217
+ const stderrChunks = [];
218
+ const stderrStringProm = new Promise((resolve, reject) => {
219
+ stderr.on('data', (d) => stderrChunks.push(d));
220
+ stderr.on('error', (err) => reject(err));
221
+ stderr.on('end', () => resolve(Buffer.concat(stderrChunks).toString('utf8')));
222
+ });
223
+ const stdoutBuffer = new Promise((resolve, reject) => {
224
+ stdout.on('data', (d) => stdoutChunks.push(d));
225
+ stdout.on('error', (err) => reject(err));
226
+ stdout.on('end', () => resolve(Buffer.concat(stdoutChunks)));
227
+ });
228
+ const [stderrStr, stdOut] = await Promise.all([
229
+ stderrStringProm,
230
+ stdoutBuffer,
231
+ ]);
232
+ if (stderrStr.includes('Output file is empty')) {
233
+ (0, is_beyond_last_frame_1.markAsBeyondLastFrame)(downloadMap, src, time);
234
+ const last = await (0, exports.getLastFrameOfVideo)({
235
+ ffmpegExecutable,
236
+ ffprobeExecutable,
237
+ offset: 0,
238
+ src,
239
+ imageFormat,
240
+ specialVCodecForTransparency: specialVcodec,
241
+ needsResize,
242
+ downloadMap,
243
+ });
244
+ return last;
245
+ }
246
+ return stdOut;
247
+ };
248
+ const extractFrameFromVideo = async (options) => {
249
+ const perf = (0, perf_1.startPerfMeasure)('extract-frame');
250
+ const res = await mainLimit(extractFrameFromVideoFn, options);
251
+ (0, perf_1.stopPerfMeasure)(perf);
252
+ return res;
253
+ };
254
+ exports.extractFrameFromVideo = extractFrameFromVideo;
@@ -0,0 +1 @@
1
+ export declare type FfmpegExecutable = string | null;