@omnimedia/omnitool 1.1.0-8 → 1.1.0-80

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 (436) hide show
  1. package/README.md +293 -76
  2. package/package.json +19 -17
  3. package/s/context.ts +0 -7
  4. package/s/demo/demo.bundle.ts +104 -43
  5. package/s/demo/demo.css +244 -14
  6. package/s/demo/routines/export-test.ts +16 -0
  7. package/s/demo/routines/filmstrip-test.ts +22 -18
  8. package/s/demo/routines/load-video.ts +2 -3
  9. package/s/demo/routines/playback-test.ts +61 -0
  10. package/s/demo/routines/timeline-setup.ts +50 -0
  11. package/s/demo/routines/transcode-test.ts +19 -5
  12. package/s/demo/routines/transitions-test.ts +2 -2
  13. package/s/demo/routines/waveform-test.ts +35 -8
  14. package/s/driver/driver-worker.ts +9 -0
  15. package/s/driver/driver.test.ts +1 -1
  16. package/s/driver/driver.ts +43 -42
  17. package/s/driver/fns/schematic.ts +26 -6
  18. package/s/driver/fns/work.ts +65 -189
  19. package/s/driver/parts/compositor.ts +316 -0
  20. package/s/driver/parts/machina.ts +19 -20
  21. package/s/driver/utils/find-pixi-filter.ts +24 -0
  22. package/s/index.html.ts +103 -25
  23. package/s/index.ts +1 -0
  24. package/s/tests.bundle.ts +11 -0
  25. package/s/tests.html.ts +28 -0
  26. package/s/timeline/index.ts +8 -2
  27. package/s/timeline/parts/animations.ts +56 -0
  28. package/s/timeline/parts/filmstrip.ts +43 -16
  29. package/s/timeline/parts/filters.ts +453 -0
  30. package/s/timeline/parts/item.ts +70 -7
  31. package/s/timeline/parts/media.ts +12 -2
  32. package/s/timeline/parts/resource-pool.ts +8 -5
  33. package/s/timeline/parts/resource.ts +3 -0
  34. package/s/timeline/parts/waveform/parts/collect.ts +72 -0
  35. package/s/timeline/parts/waveform/parts/render.ts +45 -0
  36. package/s/timeline/parts/waveform/parts/types.ts +24 -0
  37. package/s/timeline/parts/waveform/waveform.ts +161 -0
  38. package/s/timeline/renderers/export/parts/audio-gain.ts +17 -0
  39. package/s/timeline/renderers/export/parts/audio-mix.ts +133 -0
  40. package/s/timeline/renderers/export/parts/cursor.ts +129 -0
  41. package/s/timeline/renderers/export/parts/produce-audio.ts +64 -0
  42. package/s/timeline/renderers/export/parts/produce-video.ts +49 -0
  43. package/s/timeline/renderers/export/parts/resamplers.ts +48 -0
  44. package/s/timeline/renderers/export/produce.ts +28 -0
  45. package/s/timeline/renderers/parts/handy.ts +377 -0
  46. package/s/timeline/renderers/parts/samplers/audio/parts/find.ts +19 -0
  47. package/s/timeline/renderers/parts/samplers/audio/parts/init.ts +60 -0
  48. package/s/timeline/renderers/parts/samplers/audio/parts/sink.ts +38 -0
  49. package/s/timeline/renderers/parts/samplers/audio/parts/types.ts +16 -0
  50. package/s/timeline/renderers/parts/samplers/audio/sampler.ts +35 -0
  51. package/s/timeline/renderers/parts/samplers/visual/parts/defaults.ts +16 -0
  52. package/s/timeline/renderers/parts/samplers/visual/parts/sample.ts +69 -0
  53. package/s/timeline/renderers/parts/samplers/visual/parts/sequence.ts +111 -0
  54. package/s/timeline/renderers/parts/samplers/visual/parts/sink.ts +38 -0
  55. package/s/timeline/renderers/parts/samplers/visual/parts/transition.ts +28 -0
  56. package/s/timeline/renderers/parts/samplers/visual/parts/types.ts +10 -0
  57. package/s/timeline/renderers/parts/samplers/visual/sampler.ts +28 -0
  58. package/s/timeline/renderers/parts/schedulers.ts +96 -0
  59. package/s/timeline/renderers/player/parts/playback.ts +159 -0
  60. package/s/timeline/renderers/player/player.ts +77 -0
  61. package/s/timeline/renderers/renderers.test.ts +385 -0
  62. package/s/timeline/sugar/helpers.ts +190 -0
  63. package/s/timeline/sugar/o.ts +271 -59
  64. package/s/timeline/sugar/omni.test.ts +210 -0
  65. package/s/timeline/sugar/omni.ts +35 -12
  66. package/s/timeline/types.ts +28 -3
  67. package/s/timeline/utils/anim.ts +71 -0
  68. package/s/timeline/utils/checksum.ts +3 -1
  69. package/s/timeline/utils/datafile.ts +15 -4
  70. package/s/timeline/utils/dummy-data.ts +3 -3
  71. package/s/timeline/utils/matrix.ts +21 -0
  72. package/s/timeline/utils/terps.ts +81 -0
  73. package/s/units/fps.ts +8 -0
  74. package/s/units/ms.ts +8 -0
  75. package/s/units/seconds.ts +8 -0
  76. package/x/WebGLRenderer-4CHIZDHY.js +2 -0
  77. package/x/WebGLRenderer-4CHIZDHY.js.map +7 -0
  78. package/x/WebGPURenderer-O6WXU2QR.js +2 -0
  79. package/x/WebGPURenderer-O6WXU2QR.js.map +7 -0
  80. package/x/browserAll-WNIOTNNP.js +2 -0
  81. package/x/browserAll-WNIOTNNP.js.map +7 -0
  82. package/x/chunk-23FOBGX6.js +2 -0
  83. package/x/chunk-23FOBGX6.js.map +7 -0
  84. package/x/chunk-73XOWA4F.js +393 -0
  85. package/x/chunk-73XOWA4F.js.map +7 -0
  86. package/x/chunk-IAWJKNX5.js +42 -0
  87. package/x/chunk-IAWJKNX5.js.map +7 -0
  88. package/x/chunk-KCMVLWBS.js +157 -0
  89. package/x/chunk-KCMVLWBS.js.map +7 -0
  90. package/x/chunk-MR32SQ27.js +2 -0
  91. package/x/chunk-MR32SQ27.js.map +7 -0
  92. package/x/chunk-VCUJJYRJ.js +327 -0
  93. package/x/chunk-VCUJJYRJ.js.map +7 -0
  94. package/x/chunk-XNIZ4L5W.js +269 -0
  95. package/x/chunk-XNIZ4L5W.js.map +7 -0
  96. package/x/chunk-ZLGNQFUI.js +15 -0
  97. package/x/chunk-ZLGNQFUI.js.map +7 -0
  98. package/x/context.d.ts +1 -4
  99. package/x/context.js +1 -5
  100. package/x/context.js.map +1 -1
  101. package/x/demo/WebGLRenderer-RSJAHIG2.js +2 -0
  102. package/x/demo/WebGLRenderer-RSJAHIG2.js.map +7 -0
  103. package/x/demo/WebGPURenderer-MGFAJCYY.js +2 -0
  104. package/x/demo/WebGPURenderer-MGFAJCYY.js.map +7 -0
  105. package/x/demo/browserAll-PTRBXBRP.js +2 -0
  106. package/x/demo/browserAll-PTRBXBRP.js.map +7 -0
  107. package/x/demo/chunk-CUYOGHWU.js +42 -0
  108. package/x/demo/chunk-CUYOGHWU.js.map +7 -0
  109. package/x/demo/chunk-DGTDNJ7W.js +2 -0
  110. package/x/demo/chunk-DGTDNJ7W.js.map +7 -0
  111. package/x/demo/chunk-FZ5BYF63.js +15 -0
  112. package/x/demo/chunk-FZ5BYF63.js.map +7 -0
  113. package/x/demo/chunk-KWN4NNES.js +269 -0
  114. package/x/demo/chunk-KWN4NNES.js.map +7 -0
  115. package/x/demo/chunk-OJ3FPXW7.js +157 -0
  116. package/x/demo/chunk-OJ3FPXW7.js.map +7 -0
  117. package/x/demo/chunk-PSLUOGTZ.js +393 -0
  118. package/x/demo/chunk-PSLUOGTZ.js.map +7 -0
  119. package/x/demo/chunk-VLCVEIFU.js +327 -0
  120. package/x/demo/chunk-VLCVEIFU.js.map +7 -0
  121. package/x/demo/chunk-ZWCPT5FR.js +2 -0
  122. package/x/demo/chunk-ZWCPT5FR.js.map +7 -0
  123. package/x/demo/demo.bundle.js +94 -40
  124. package/x/demo/demo.bundle.js.map +1 -1
  125. package/x/demo/demo.bundle.min.js +7340 -90
  126. package/x/demo/demo.bundle.min.js.map +4 -4
  127. package/x/demo/demo.css +244 -14
  128. package/x/demo/routines/export-test.d.ts +2 -0
  129. package/x/demo/routines/export-test.js +10 -0
  130. package/x/demo/routines/export-test.js.map +1 -0
  131. package/x/demo/routines/filmstrip-test.d.ts +1 -1
  132. package/x/demo/routines/filmstrip-test.js +20 -17
  133. package/x/demo/routines/filmstrip-test.js.map +1 -1
  134. package/x/demo/routines/load-video.d.ts +1 -1
  135. package/x/demo/routines/load-video.js +1 -2
  136. package/x/demo/routines/load-video.js.map +1 -1
  137. package/x/demo/routines/playback-test.d.ts +2 -0
  138. package/x/demo/routines/playback-test.js +51 -0
  139. package/x/demo/routines/playback-test.js.map +1 -0
  140. package/x/demo/routines/timeline-setup.d.ts +6 -0
  141. package/x/demo/routines/timeline-setup.js +32 -0
  142. package/x/demo/routines/timeline-setup.js.map +1 -0
  143. package/x/demo/routines/transcode-test.js +15 -5
  144. package/x/demo/routines/transcode-test.js.map +1 -1
  145. package/x/demo/routines/transitions-test.js +2 -2
  146. package/x/demo/routines/transitions-test.js.map +1 -1
  147. package/x/demo/routines/waveform-test.d.ts +2 -1
  148. package/x/demo/routines/waveform-test.js +29 -8
  149. package/x/demo/routines/waveform-test.js.map +1 -1
  150. package/x/demo/webworkerAll-JENRT6BT.js +2 -0
  151. package/x/demo/webworkerAll-JENRT6BT.js.map +7 -0
  152. package/x/driver/driver-worker.d.ts +1 -0
  153. package/x/driver/driver-worker.js +6 -0
  154. package/x/driver/driver-worker.js.map +1 -0
  155. package/x/driver/driver.d.ts +25 -8
  156. package/x/driver/driver.js +43 -39
  157. package/x/driver/driver.js.map +1 -1
  158. package/x/driver/driver.test.js +1 -1
  159. package/x/driver/driver.test.js.map +1 -1
  160. package/x/driver/driver.worker.bundle.min.js +117 -3506
  161. package/x/driver/driver.worker.bundle.min.js.map +4 -4
  162. package/x/driver/fns/host.d.ts +3 -2
  163. package/x/driver/fns/schematic.d.ts +25 -4
  164. package/x/driver/fns/work.d.ts +4 -4
  165. package/x/driver/fns/work.js +55 -155
  166. package/x/driver/fns/work.js.map +1 -1
  167. package/x/driver/parts/compositor.d.ts +39 -0
  168. package/x/driver/parts/compositor.js +261 -0
  169. package/x/driver/parts/compositor.js.map +1 -0
  170. package/x/driver/parts/machina.d.ts +0 -20
  171. package/x/driver/parts/machina.js +6 -10
  172. package/x/driver/parts/machina.js.map +1 -1
  173. package/x/driver/utils/find-pixi-filter.d.ts +5 -0
  174. package/x/driver/utils/find-pixi-filter.js +13 -0
  175. package/x/driver/utils/find-pixi-filter.js.map +1 -0
  176. package/x/features/speech/transcribe/parts/prep-audio.d.ts +1 -1
  177. package/x/features/speech/transcribe/worker.bundle.min.js +899 -899
  178. package/x/features/speech/transcribe/worker.bundle.min.js.map +4 -4
  179. package/x/index.d.ts +1 -0
  180. package/x/index.html +347 -38
  181. package/x/index.html.js +103 -24
  182. package/x/index.html.js.map +1 -1
  183. package/x/index.js +1 -0
  184. package/x/index.js.map +1 -1
  185. package/x/tests.bundle.js +8 -0
  186. package/x/tests.bundle.js.map +1 -0
  187. package/x/tests.bundle.min.js +7374 -0
  188. package/x/tests.bundle.min.js.map +7 -0
  189. package/x/tests.html +316 -0
  190. package/x/tests.html.d.ts +2 -0
  191. package/x/tests.html.js +22 -0
  192. package/x/tests.html.js.map +1 -0
  193. package/x/timeline/index.d.ts +7 -1
  194. package/x/timeline/index.js +7 -1
  195. package/x/timeline/index.js.map +1 -1
  196. package/x/timeline/parts/animations.d.ts +105 -0
  197. package/x/timeline/parts/animations.js +28 -0
  198. package/x/timeline/parts/animations.js.map +1 -0
  199. package/x/timeline/parts/filmstrip.d.ts +4 -3
  200. package/x/timeline/parts/filmstrip.js +29 -10
  201. package/x/timeline/parts/filmstrip.js.map +1 -1
  202. package/x/timeline/parts/filters.d.ts +108 -0
  203. package/x/timeline/parts/filters.js +340 -0
  204. package/x/timeline/parts/filters.js.map +1 -0
  205. package/x/timeline/parts/item.d.ts +56 -4
  206. package/x/timeline/parts/item.js +5 -1
  207. package/x/timeline/parts/item.js.map +1 -1
  208. package/x/timeline/parts/media.d.ts +2 -0
  209. package/x/timeline/parts/media.js +11 -2
  210. package/x/timeline/parts/media.js.map +1 -1
  211. package/x/timeline/parts/resource-pool.d.ts +3 -0
  212. package/x/timeline/parts/resource-pool.js +7 -4
  213. package/x/timeline/parts/resource-pool.js.map +1 -1
  214. package/x/timeline/parts/resource.d.ts +3 -0
  215. package/x/timeline/parts/waveform/parts/collect.d.ts +11 -0
  216. package/x/timeline/parts/waveform/parts/collect.js +56 -0
  217. package/x/timeline/parts/waveform/parts/collect.js.map +1 -0
  218. package/x/timeline/parts/waveform/parts/render.d.ts +5 -0
  219. package/x/timeline/parts/waveform/parts/render.js +29 -0
  220. package/x/timeline/parts/waveform/parts/render.js.map +1 -0
  221. package/x/timeline/parts/waveform/parts/types.d.ts +21 -0
  222. package/x/timeline/parts/waveform/parts/types.js.map +1 -0
  223. package/x/timeline/parts/waveform/waveform.d.ts +19 -0
  224. package/x/timeline/parts/waveform/waveform.js +133 -0
  225. package/x/timeline/parts/waveform/waveform.js.map +1 -0
  226. package/x/timeline/renderers/export/parts/audio-gain.d.ts +1 -0
  227. package/x/timeline/renderers/export/parts/audio-gain.js +13 -0
  228. package/x/timeline/renderers/export/parts/audio-gain.js.map +1 -0
  229. package/x/timeline/renderers/export/parts/audio-mix.d.ts +21 -0
  230. package/x/timeline/renderers/export/parts/audio-mix.js +89 -0
  231. package/x/timeline/renderers/export/parts/audio-mix.js.map +1 -0
  232. package/x/timeline/renderers/export/parts/cursor.d.ts +18 -0
  233. package/x/timeline/renderers/export/parts/cursor.js +99 -0
  234. package/x/timeline/renderers/export/parts/cursor.js.map +1 -0
  235. package/x/timeline/renderers/export/parts/produce-audio.d.ts +6 -0
  236. package/x/timeline/renderers/export/parts/produce-audio.js +41 -0
  237. package/x/timeline/renderers/export/parts/produce-audio.js.map +1 -0
  238. package/x/timeline/renderers/export/parts/produce-video.d.ts +10 -0
  239. package/x/timeline/renderers/export/parts/produce-video.js +26 -0
  240. package/x/timeline/renderers/export/parts/produce-video.js.map +1 -0
  241. package/x/timeline/renderers/export/parts/resamplers.d.ts +12 -0
  242. package/x/timeline/renderers/export/parts/resamplers.js +29 -0
  243. package/x/timeline/renderers/export/parts/resamplers.js.map +1 -0
  244. package/x/timeline/renderers/export/produce.d.ts +13 -0
  245. package/x/timeline/renderers/export/produce.js +15 -0
  246. package/x/timeline/renderers/export/produce.js.map +1 -0
  247. package/x/timeline/renderers/parts/handy.d.ts +36 -0
  248. package/x/timeline/renderers/parts/handy.js +221 -0
  249. package/x/timeline/renderers/parts/handy.js.map +1 -0
  250. package/x/timeline/renderers/parts/samplers/audio/parts/find.d.ts +6 -0
  251. package/x/timeline/renderers/parts/samplers/audio/parts/find.js +15 -0
  252. package/x/timeline/renderers/parts/samplers/audio/parts/find.js.map +1 -0
  253. package/x/timeline/renderers/parts/samplers/audio/parts/init.d.ts +5 -0
  254. package/x/timeline/renderers/parts/samplers/audio/parts/init.js +40 -0
  255. package/x/timeline/renderers/parts/samplers/audio/parts/init.js.map +1 -0
  256. package/x/timeline/renderers/parts/samplers/audio/parts/sink.d.ts +8 -0
  257. package/x/timeline/renderers/parts/samplers/audio/parts/sink.js +24 -0
  258. package/x/timeline/renderers/parts/samplers/audio/parts/sink.js.map +1 -0
  259. package/x/timeline/renderers/parts/samplers/audio/parts/types.d.ts +14 -0
  260. package/x/timeline/renderers/parts/samplers/audio/parts/types.js +2 -0
  261. package/x/timeline/renderers/parts/samplers/audio/parts/types.js.map +1 -0
  262. package/x/timeline/renderers/parts/samplers/audio/sampler.d.ts +11 -0
  263. package/x/timeline/renderers/parts/samplers/audio/sampler.js +22 -0
  264. package/x/timeline/renderers/parts/samplers/audio/sampler.js.map +1 -0
  265. package/x/timeline/renderers/parts/samplers/visual/parts/defaults.d.ts +5 -0
  266. package/x/timeline/renderers/parts/samplers/visual/parts/defaults.js +10 -0
  267. package/x/timeline/renderers/parts/samplers/visual/parts/defaults.js.map +1 -0
  268. package/x/timeline/renderers/parts/samplers/visual/parts/sample.d.ts +6 -0
  269. package/x/timeline/renderers/parts/samplers/visual/parts/sample.js +48 -0
  270. package/x/timeline/renderers/parts/samplers/visual/parts/sample.js.map +1 -0
  271. package/x/timeline/renderers/parts/samplers/visual/parts/sequence.d.ts +6 -0
  272. package/x/timeline/renderers/parts/samplers/visual/parts/sequence.js +75 -0
  273. package/x/timeline/renderers/parts/samplers/visual/parts/sequence.js.map +1 -0
  274. package/x/timeline/renderers/parts/samplers/visual/parts/sink.d.ts +8 -0
  275. package/x/timeline/renderers/parts/samplers/visual/parts/sink.js +24 -0
  276. package/x/timeline/renderers/parts/samplers/visual/parts/sink.js.map +1 -0
  277. package/x/timeline/renderers/parts/samplers/visual/parts/transition.d.ts +3 -0
  278. package/x/timeline/renderers/parts/samplers/visual/parts/transition.js +18 -0
  279. package/x/timeline/renderers/parts/samplers/visual/parts/transition.js.map +1 -0
  280. package/x/timeline/renderers/parts/samplers/visual/parts/types.d.ts +8 -0
  281. package/x/timeline/renderers/parts/samplers/visual/parts/types.js +2 -0
  282. package/x/timeline/renderers/parts/samplers/visual/parts/types.js.map +1 -0
  283. package/x/timeline/renderers/parts/samplers/visual/sampler.d.ts +7 -0
  284. package/x/timeline/renderers/parts/samplers/visual/sampler.js +17 -0
  285. package/x/timeline/renderers/parts/samplers/visual/sampler.js.map +1 -0
  286. package/x/timeline/renderers/parts/schedulers.d.ts +17 -0
  287. package/x/timeline/renderers/parts/schedulers.js +64 -0
  288. package/x/timeline/renderers/parts/schedulers.js.map +1 -0
  289. package/x/timeline/renderers/player/parts/playback.d.ts +36 -0
  290. package/x/timeline/renderers/player/parts/playback.js +113 -0
  291. package/x/timeline/renderers/player/parts/playback.js.map +1 -0
  292. package/x/timeline/renderers/player/player.d.ts +25 -0
  293. package/x/timeline/renderers/player/player.js +56 -0
  294. package/x/timeline/renderers/player/player.js.map +1 -0
  295. package/x/timeline/renderers/renderers.test.d.ts +32 -0
  296. package/x/timeline/renderers/renderers.test.js +305 -0
  297. package/x/timeline/renderers/renderers.test.js.map +1 -0
  298. package/x/timeline/sugar/helpers.d.ts +56 -0
  299. package/x/timeline/sugar/helpers.js +104 -0
  300. package/x/timeline/sugar/helpers.js.map +1 -0
  301. package/x/timeline/sugar/o.d.ts +48 -14
  302. package/x/timeline/sugar/o.js +213 -54
  303. package/x/timeline/sugar/o.js.map +1 -1
  304. package/x/timeline/sugar/omni.d.ts +11 -6
  305. package/x/timeline/sugar/omni.js +28 -8
  306. package/x/timeline/sugar/omni.js.map +1 -1
  307. package/x/timeline/sugar/omni.test.d.ts +27 -0
  308. package/x/timeline/sugar/omni.test.js +128 -0
  309. package/x/timeline/sugar/omni.test.js.map +1 -0
  310. package/x/timeline/types.d.ts +12 -2
  311. package/x/timeline/utils/anim.d.ts +5 -0
  312. package/x/timeline/utils/anim.js +44 -0
  313. package/x/timeline/utils/anim.js.map +1 -0
  314. package/x/timeline/utils/checksum.d.ts +3 -2
  315. package/x/timeline/utils/checksum.js.map +1 -1
  316. package/x/timeline/utils/datafile.d.ts +5 -3
  317. package/x/timeline/utils/datafile.js +18 -5
  318. package/x/timeline/utils/datafile.js.map +1 -1
  319. package/x/timeline/utils/dummy-data.d.ts +1 -2
  320. package/x/timeline/utils/dummy-data.js +4 -2
  321. package/x/timeline/utils/dummy-data.js.map +1 -1
  322. package/x/timeline/utils/matrix.d.ts +9 -0
  323. package/x/timeline/utils/matrix.js +10 -0
  324. package/x/timeline/utils/matrix.js.map +1 -1
  325. package/x/timeline/utils/terps.d.ts +11 -0
  326. package/x/timeline/utils/terps.js +57 -0
  327. package/x/timeline/utils/terps.js.map +1 -0
  328. package/x/units/fps.d.ts +6 -0
  329. package/x/units/fps.js +2 -0
  330. package/x/units/fps.js.map +1 -0
  331. package/x/units/ms.d.ts +6 -0
  332. package/x/units/ms.js +2 -0
  333. package/x/units/ms.js.map +1 -0
  334. package/x/units/seconds.d.ts +6 -0
  335. package/x/units/seconds.js +2 -0
  336. package/x/units/seconds.js.map +1 -0
  337. package/x/webworkerAll-RLCTMSDD.js +2 -0
  338. package/x/webworkerAll-RLCTMSDD.js.map +7 -0
  339. package/s/tests.test.ts +0 -8
  340. package/s/timeline/parts/compositor/export.ts +0 -77
  341. package/s/timeline/parts/compositor/parts/html-tree.ts +0 -37
  342. package/s/timeline/parts/compositor/parts/schedulers.ts +0 -85
  343. package/s/timeline/parts/compositor/parts/tree-builder.ts +0 -184
  344. package/s/timeline/parts/compositor/parts/webcodecs-tree.ts +0 -30
  345. package/s/timeline/parts/compositor/playback.ts +0 -81
  346. package/s/timeline/parts/compositor/samplers/html.ts +0 -115
  347. package/s/timeline/parts/compositor/samplers/webcodecs.ts +0 -60
  348. package/s/timeline/parts/waveform.ts +0 -62
  349. package/s/timeline/sugar/builders.ts +0 -102
  350. package/s/timeline/sugar/omni-test.ts +0 -38
  351. package/s/timeline/timeline.ts +0 -22
  352. package/s/timeline/utils/audio-stream.ts +0 -15
  353. package/s/timeline/utils/video-cursor.ts +0 -40
  354. package/s/tools/common/loader.ts +0 -26
  355. package/s/tools/common/transformer-pipeline.ts +0 -26
  356. package/s/tools/speech-recognition/common/model.ts +0 -26
  357. package/s/tools/speech-recognition/whisper/fns/host.ts +0 -25
  358. package/s/tools/speech-recognition/whisper/fns/schematic.ts +0 -23
  359. package/s/tools/speech-recognition/whisper/fns/work.ts +0 -91
  360. package/s/tools/speech-recognition/whisper/parts/types.ts +0 -38
  361. package/s/tools/speech-recognition/whisper/parts/worker.bundle.ts +0 -7
  362. package/s/tools/speech-recognition/whisper/tool.ts +0 -70
  363. package/x/tests.test.js +0 -6
  364. package/x/tests.test.js.map +0 -1
  365. package/x/timeline/parts/compositor/export.d.ts +0 -9
  366. package/x/timeline/parts/compositor/export.js +0 -64
  367. package/x/timeline/parts/compositor/export.js.map +0 -1
  368. package/x/timeline/parts/compositor/parts/html-tree.d.ts +0 -3
  369. package/x/timeline/parts/compositor/parts/html-tree.js +0 -40
  370. package/x/timeline/parts/compositor/parts/html-tree.js.map +0 -1
  371. package/x/timeline/parts/compositor/parts/schedulers.d.ts +0 -15
  372. package/x/timeline/parts/compositor/parts/schedulers.js +0 -64
  373. package/x/timeline/parts/compositor/parts/schedulers.js.map +0 -1
  374. package/x/timeline/parts/compositor/parts/tree-builder.d.ts +0 -37
  375. package/x/timeline/parts/compositor/parts/tree-builder.js +0 -147
  376. package/x/timeline/parts/compositor/parts/tree-builder.js.map +0 -1
  377. package/x/timeline/parts/compositor/parts/webcodecs-tree.d.ts +0 -3
  378. package/x/timeline/parts/compositor/parts/webcodecs-tree.js +0 -28
  379. package/x/timeline/parts/compositor/parts/webcodecs-tree.js.map +0 -1
  380. package/x/timeline/parts/compositor/playback.d.ts +0 -19
  381. package/x/timeline/parts/compositor/playback.js +0 -71
  382. package/x/timeline/parts/compositor/playback.js.map +0 -1
  383. package/x/timeline/parts/compositor/samplers/html.d.ts +0 -3
  384. package/x/timeline/parts/compositor/samplers/html.js +0 -106
  385. package/x/timeline/parts/compositor/samplers/html.js.map +0 -1
  386. package/x/timeline/parts/compositor/samplers/webcodecs.d.ts +0 -2
  387. package/x/timeline/parts/compositor/samplers/webcodecs.js +0 -55
  388. package/x/timeline/parts/compositor/samplers/webcodecs.js.map +0 -1
  389. package/x/timeline/parts/waveform.d.ts +0 -8
  390. package/x/timeline/parts/waveform.js +0 -51
  391. package/x/timeline/parts/waveform.js.map +0 -1
  392. package/x/timeline/sugar/builders.d.ts +0 -96
  393. package/x/timeline/sugar/builders.js +0 -108
  394. package/x/timeline/sugar/builders.js.map +0 -1
  395. package/x/timeline/sugar/omni-test.d.ts +0 -1
  396. package/x/timeline/sugar/omni-test.js +0 -22
  397. package/x/timeline/sugar/omni-test.js.map +0 -1
  398. package/x/timeline/timeline.d.ts +0 -9
  399. package/x/timeline/timeline.js +0 -22
  400. package/x/timeline/timeline.js.map +0 -1
  401. package/x/timeline/utils/audio-stream.d.ts +0 -6
  402. package/x/timeline/utils/audio-stream.js +0 -17
  403. package/x/timeline/utils/audio-stream.js.map +0 -1
  404. package/x/timeline/utils/video-cursor.d.ts +0 -10
  405. package/x/timeline/utils/video-cursor.js +0 -36
  406. package/x/timeline/utils/video-cursor.js.map +0 -1
  407. package/x/tools/common/loader.d.ts +0 -19
  408. package/x/tools/common/loader.js +0 -18
  409. package/x/tools/common/loader.js.map +0 -1
  410. package/x/tools/common/transformer-pipeline.d.ts +0 -8
  411. package/x/tools/common/transformer-pipeline.js +0 -24
  412. package/x/tools/common/transformer-pipeline.js.map +0 -1
  413. package/x/tools/speech-recognition/common/model.d.ts +0 -14
  414. package/x/tools/speech-recognition/common/model.js +0 -16
  415. package/x/tools/speech-recognition/common/model.js.map +0 -1
  416. package/x/tools/speech-recognition/whisper/fns/host.d.ts +0 -13
  417. package/x/tools/speech-recognition/whisper/fns/host.js +0 -19
  418. package/x/tools/speech-recognition/whisper/fns/host.js.map +0 -1
  419. package/x/tools/speech-recognition/whisper/fns/schematic.d.ts +0 -19
  420. package/x/tools/speech-recognition/whisper/fns/schematic.js +0 -2
  421. package/x/tools/speech-recognition/whisper/fns/schematic.js.map +0 -1
  422. package/x/tools/speech-recognition/whisper/fns/work.d.ts +0 -12
  423. package/x/tools/speech-recognition/whisper/fns/work.js +0 -74
  424. package/x/tools/speech-recognition/whisper/fns/work.js.map +0 -1
  425. package/x/tools/speech-recognition/whisper/parts/types.d.ts +0 -31
  426. package/x/tools/speech-recognition/whisper/parts/types.js.map +0 -1
  427. package/x/tools/speech-recognition/whisper/parts/worker.bundle.d.ts +0 -1
  428. package/x/tools/speech-recognition/whisper/parts/worker.bundle.js +0 -4
  429. package/x/tools/speech-recognition/whisper/parts/worker.bundle.js.map +0 -1
  430. package/x/tools/speech-recognition/whisper/parts/worker.bundle.min.js +0 -8
  431. package/x/tools/speech-recognition/whisper/parts/worker.bundle.min.js.map +0 -7
  432. package/x/tools/speech-recognition/whisper/tool.d.ts +0 -12
  433. package/x/tools/speech-recognition/whisper/tool.js +0 -63
  434. package/x/tools/speech-recognition/whisper/tool.js.map +0 -1
  435. /package/x/{tests.test.d.ts → tests.bundle.d.ts} +0 -0
  436. /package/x/{tools/speech-recognition/whisper → timeline/parts/waveform}/parts/types.js +0 -0
@@ -1,7 +1,10 @@
1
+
2
+ import {is} from "@e280/stz"
1
3
  import {Comrade, tune, Thread} from "@e280/comrade"
2
4
  import {ALL_FORMATS, Input, type StreamTargetChunk} from "mediabunny"
3
5
 
4
6
  import {Machina} from "./parts/machina.js"
7
+ import {Compositor} from "./parts/compositor.js"
5
8
  import {setupDriverHost} from "./fns/host.js"
6
9
  import {loadDecoderSource} from "./utils/load-decoder-source.js"
7
10
  import {DecoderInput, DriverSchematic, Composition, EncoderInput, DecoderSource} from "./fns/schematic.js"
@@ -11,19 +14,21 @@ export type DriverOptions = {
11
14
  }
12
15
 
13
16
  export class Driver {
14
- static async setup(options: DriverOptions) {
17
+ static async setup(options?: DriverOptions) {
15
18
  const machina = new Machina()
16
19
  const thread = await Comrade.thread<DriverSchematic>({
17
20
  label: "OmnitoolDriver",
18
- workerUrl: options.workerUrl,
21
+ workerUrl: options?.workerUrl ?? "/node_modules/@omnimedia/omnitool/x/driver/driver.worker.bundle.min.js",
19
22
  setupHost: setupDriverHost(machina),
20
23
  })
21
- return new this(machina, thread)
24
+ const compositor = await Compositor.setup()
25
+ return new this(machina, thread, compositor)
22
26
  }
23
27
 
24
28
  constructor(
25
29
  public machina: Machina,
26
- public thread: Thread<DriverSchematic>
30
+ public thread: Thread<DriverSchematic>,
31
+ public compositor: Compositor
27
32
  ) {}
28
33
 
29
34
  async hello() {
@@ -37,7 +42,8 @@ export class Driver {
37
42
  })
38
43
 
39
44
  const audioTrack = await input.getPrimaryAudioTrack()
40
- return await audioTrack?.computeDuration()
45
+ if (!audioTrack) throw new Error("primary audio track not found")
46
+ return await audioTrack.computeDuration()
41
47
  }
42
48
 
43
49
  async getVideoDuration(source: DecoderSource) {
@@ -52,73 +58,68 @@ export class Driver {
52
58
 
53
59
  decodeVideo(input: DecoderInput) {
54
60
  let lastFrame: VideoFrame | null = null
61
+ const {port1, port2} = new MessageChannel()
55
62
  const videoTransform = new TransformStream<VideoFrame, VideoFrame>({
56
63
  async transform(chunk, controller) {
57
64
  const frame = await input.onFrame?.(chunk) ?? chunk
58
- // below code is to prevent mem leaks and hardware accelerated decoder stall
59
65
  lastFrame?.close()
60
66
  controller.enqueue(frame)
61
67
  lastFrame = frame
62
68
  }
63
69
  })
64
- this.thread.work.decodeVideo[tune]({transfer: [videoTransform.writable]})({
70
+ this.thread.work.decodeVideo[tune]({transfer: [videoTransform.writable, port2]})({
65
71
  source: input.source,
72
+ cancel: port2,
66
73
  video: videoTransform.writable,
67
74
  start: input.start,
68
75
  end: input.end
69
76
  })
70
- return videoTransform.readable
77
+ return {
78
+ readable: videoTransform.readable,
79
+ /**
80
+ * use this to stop decoding (premature interruption)
81
+ * */
82
+ cancel() {
83
+ port1.postMessage("close")
84
+ port1.close()
85
+ }
86
+ }
71
87
  }
72
88
 
73
89
  decodeAudio(input: DecoderInput) {
74
90
  const audioTransform = new TransformStream<AudioData, AudioData>()
75
- this.thread.work.decodeAudio[tune]({transfer: [audioTransform.writable]})({
91
+ const {port1, port2} = new MessageChannel()
92
+ this.thread.work.decodeAudio[tune]({transfer: [audioTransform.writable, port2]})({
76
93
  source: input.source,
94
+ cancel: port2,
77
95
  audio: audioTransform.writable,
78
96
  start: input.start,
79
97
  end: input.end
80
98
  })
81
- return audioTransform.readable
99
+ return {
100
+ readable: audioTransform.readable,
101
+ /**
102
+ * use this to stop decoding (premature interruption)
103
+ * */
104
+ cancel() {
105
+ port1.postMessage("close")
106
+ port1.close()
107
+ }
108
+ }
82
109
  }
83
110
 
84
- async encode({video, audio, config}: EncoderInput) {
85
- const handle = await window.showSaveFilePicker()
86
- const writable = await handle.createWritable()
87
- // making bridge because file picker writable is not transferable
88
- const bridge = new WritableStream<StreamTargetChunk>({
89
- async write(chunk) {
90
- await writable.write(chunk)
91
- },
92
- async close() {
93
- await writable.close()
94
- }
95
- })
96
- return await this.thread.work.encode[tune]({transfer: [audio ?? [], video ?? [], bridge]})({video, audio, config, bridge})
111
+ encode({audio, video, config}: EncoderInput) {
112
+ const {readable, writable} = new TransformStream<StreamTargetChunk, StreamTargetChunk>()
113
+ const transfer = [audio, video, writable].filter(is.happy)
114
+ const done = this.thread.work.encode[tune]({transfer})({audio, video, config, writable})
115
+ return {readable, done}
97
116
  }
98
117
 
99
118
  async composite(
100
119
  composition: Composition,
101
120
  ) {
102
- const transfer = this.#collectTransferablesFromComposition(composition)
103
- return await this.thread.work.composite[tune]({transfer})(composition)
121
+ return await this.compositor.composite(composition)
104
122
  }
105
123
 
106
- #collectTransferablesFromComposition(composition: Composition) {
107
- const transferables: Transferable[] = []
108
-
109
- const visit = (node: Composition) => {
110
- if (Array.isArray(node)) {
111
- for (const child of node)
112
- visit(child)
113
- }
114
- else if (node && typeof node === 'object' && 'kind' in node) {
115
- if (node.kind === 'image' && node.frame instanceof VideoFrame)
116
- transferables.push(node.frame)
117
- }
118
- }
119
-
120
- visit(composition)
121
- return transferables
122
- }
123
124
  }
124
125
 
@@ -1,8 +1,12 @@
1
1
 
2
+ import {TextStyleOptions} from "pixi.js"
2
3
  import {AsSchematic} from "@e280/comrade"
3
4
  import type {AudioEncodingConfig, StreamTargetChunk, VideoEncodingConfig} from "mediabunny"
4
5
 
6
+ import {Id} from "../../timeline/index.js"
7
+ import {Crop} from "../../timeline/parts/item.js"
5
8
  import {Mat6} from "../../timeline/utils/matrix.js"
9
+ import {FilterParams, FilterType} from "../../timeline/parts/filters.js"
6
10
 
7
11
  export type DriverSchematic = AsSchematic<{
8
12
 
@@ -12,6 +16,7 @@ export type DriverSchematic = AsSchematic<{
12
16
 
13
17
  decodeAudio(input: {
14
18
  source: DecoderSource
19
+ cancel: MessagePort
15
20
  audio: WritableStream<AudioData>
16
21
  start?: number
17
22
  end?: number
@@ -19,14 +24,13 @@ export type DriverSchematic = AsSchematic<{
19
24
 
20
25
  decodeVideo(input: {
21
26
  source: DecoderSource
27
+ cancel: MessagePort
22
28
  video: WritableStream<VideoFrame>
23
29
  start?: number
24
30
  end?: number
25
31
  }): Promise<void>
26
32
 
27
- encode(input: EncoderInput & {bridge: WritableStream<StreamTargetChunk>}): Promise<void>
28
-
29
- composite(input: Composition): Promise<VideoFrame>
33
+ encode(input: EncoderInput & {writable: WritableStream<StreamTargetChunk>}): Promise<void>
30
34
  }
31
35
 
32
36
  // happens on the main thread
@@ -71,21 +75,36 @@ export interface MuxOpts {
71
75
 
72
76
  export type Composition = Layer | (Layer | Composition)[]
73
77
 
78
+ export type FilterSpec = {
79
+ [TFilter in FilterType]: {
80
+ type: TFilter
81
+ params?: FilterParams<TFilter>
82
+ }
83
+ }[FilterType]
84
+
74
85
  export type TextLayer = {
86
+ id: Id
75
87
  kind: 'text'
76
88
  content: string
77
- fontSize?: number
78
- color?: string
89
+ style?: TextStyleOptions
79
90
  matrix?: Mat6
91
+ alpha?: number
92
+ crop?: Crop
93
+ filters?: FilterSpec[]
80
94
  }
81
95
 
82
96
  export type ImageLayer = {
97
+ id: Id
83
98
  kind: 'image'
84
99
  frame: VideoFrame
85
100
  matrix?: Mat6
101
+ alpha?: number
102
+ crop?: Crop
103
+ filters?: FilterSpec[]
86
104
  }
87
105
 
88
106
  export type TransitionLayer = {
107
+ id: Id
89
108
  kind: 'transition'
90
109
  name: string
91
110
  progress: number
@@ -94,13 +113,14 @@ export type TransitionLayer = {
94
113
  }
95
114
 
96
115
  export type GapLayer = {
116
+ id: Id
97
117
  kind: 'gap'
98
118
  }
99
119
 
100
120
  export type Audio = {
121
+ id: Id
101
122
  kind: "audio"
102
123
  data: AudioData
103
124
  }
104
125
 
105
126
  export type Layer = TextLayer | ImageLayer | TransitionLayer | GapLayer
106
-
@@ -1,12 +1,9 @@
1
1
  import {Comrade} from "@e280/comrade"
2
- import {autoDetectRenderer, Container, Renderer, Sprite, Text, Texture, DOMAdapter, WebWorkerAdapter, Matrix} from "pixi.js"
3
- import {Input, ALL_FORMATS, VideoSampleSink, Output, Mp4OutputFormat, VideoSampleSource, VideoSample, AudioSampleSink, AudioSampleSource, AudioSample, StreamTarget, BlobSource, UrlSource} from "mediabunny"
4
2
 
5
- import {Mat6, mat6ToMatrix} from "../../timeline/utils/matrix.js"
6
- import {makeTransition} from "../../features/transition/transition.js"
7
- import {Composition, DecoderSource, DriverSchematic, Layer} from "./schematic.js"
3
+ import {Input, ALL_FORMATS, VideoSampleSink, Output, Mp4OutputFormat, VideoSampleSource, VideoSample, AudioSampleSink,
4
+ AudioSampleSource, AudioSample, StreamTarget, BlobSource, UrlSource} from "mediabunny"
8
5
 
9
- DOMAdapter.set(WebWorkerAdapter)
6
+ import {DecoderSource, DriverSchematic} from "./schematic.js"
10
7
 
11
8
  const loadSource = async (source: DecoderSource) => {
12
9
  if(source instanceof Blob) {
@@ -22,7 +19,7 @@ export const setupDriverWork = (
22
19
  await shell.host.world()
23
20
  },
24
21
 
25
- async decodeAudio({source, audio, start, end}) {
22
+ async decodeAudio({source, audio, start, end, cancel}) {
26
23
  const input = new Input({
27
24
  source: await loadSource(source),
28
25
  formats: ALL_FORMATS
@@ -32,19 +29,29 @@ export const setupDriverWork = (
32
29
  const audioDecodable = await audioTrack?.canDecode()
33
30
  const audioWriter = audio.getWriter()
34
31
 
35
- if (audioDecodable && audioTrack) {
36
- const sink = new AudioSampleSink(audioTrack)
37
- for await (const sample of sink.samples(start, end)) {
38
- const frame = sample.toAudioData()
39
- await audioWriter.write(frame)
40
- sample.close()
41
- frame.close()
42
- }
43
- await audioWriter.close()
32
+ if(!audioDecodable || !audioTrack)
33
+ return
34
+
35
+ const sink = new AudioSampleSink(audioTrack)
36
+ const samples = sink.samples(start, end)
37
+
38
+ cancel.onmessage = async () => {
39
+ samples.return()
40
+ input.dispose()
41
+ cancel.close()
42
+ }
43
+
44
+ for await (const sample of samples) {
45
+ const frame = sample.toAudioData()
46
+ sample.close()
47
+ await audioWriter.write(frame)
48
+ frame.close()
44
49
  }
50
+
51
+ await audioWriter.close()
45
52
  },
46
53
 
47
- async decodeVideo({source, video, start, end}) {
54
+ async decodeVideo({source, video, start, end, cancel}) {
48
55
  const input = new Input({
49
56
  source: await loadSource(source),
50
57
  formats: ALL_FORMATS
@@ -54,196 +61,65 @@ export const setupDriverWork = (
54
61
  const videoDecodable = await videoTrack?.canDecode()
55
62
  const videoWriter = video.getWriter()
56
63
 
57
- if (videoDecodable && videoTrack) {
58
- const sink = new VideoSampleSink(videoTrack)
59
- for await (const sample of sink.samples(start, end)) {
60
- const frame = sample.toVideoFrame()
61
- await videoWriter.write(frame)
62
- sample.close()
63
- frame.close()
64
- }
65
- await videoWriter.close()
64
+ if(!videoDecodable || !videoTrack)
65
+ return
66
+
67
+ const sink = new VideoSampleSink(videoTrack)
68
+ const samples = sink.samples(start, end)
69
+
70
+ cancel.onmessage = async () => {
71
+ await samples.return()
72
+ input.dispose()
73
+ cancel.close()
74
+ }
75
+
76
+ for await (const sample of samples) {
77
+ const frame = sample.toVideoFrame()
78
+ sample.close()
79
+ await videoWriter.write(frame)
80
+ frame.close()
66
81
  }
82
+
83
+ await videoWriter.close()
67
84
  },
68
85
 
69
- async encode({video, audio, config, bridge}) {
86
+ async encode({video, audio, config, writable}) {
70
87
  const output = new Output({
71
88
  format: new Mp4OutputFormat(),
72
- target: new StreamTarget(bridge, {chunked: true})
89
+ target: new StreamTarget(writable, {chunked: true})
73
90
  })
74
- // since AudioSample is not transferable it fails to transfer encoder bitrate config
75
- // so it needs to be hardcoded not set through constants eg QUALITY_LOW
76
-
77
- const promises = []
78
91
 
79
- if(video) {
92
+ async function encodeVideo() {
93
+ if(!video) return
80
94
  const videoSource = new VideoSampleSource(config.video)
81
95
  output.addVideoTrack(videoSource)
82
- const videoReader = video.getReader()
83
- promises.push((async () => {
84
- while (true) {
85
- const {done, value} = await videoReader.read()
86
- if (done) break
87
- const sample = new VideoSample(value)
88
- await videoSource.add(sample)
89
- sample.close()
90
- }
91
- })())
96
+ for await (const frame of video) {
97
+ const sample = new VideoSample(frame)
98
+ await videoSource.add(sample)
99
+ sample.close()
100
+ frame.close()
101
+ }
92
102
  }
93
103
 
94
- if(audio) {
104
+ async function encodeAudio() {
105
+ if(!audio) return
95
106
  const audioSource = new AudioSampleSource(config.audio)
96
107
  output.addAudioTrack(audioSource)
97
- const audioReader = audio.getReader()
98
- promises.push((async () => {
99
- while (true) {
100
- const {done, value} = await audioReader.read()
101
- if (done) break
102
- const sample = new AudioSample(value)
103
- await audioSource.add(sample)
104
- sample.close()
105
- value.close()
106
- }
107
- })())
108
+ for await (const data of audio) {
109
+ const sample = new AudioSample(data)
110
+ await audioSource.add(sample)
111
+ sample.close()
112
+ data.close()
113
+ }
108
114
  }
109
115
 
116
+ const audioTask = encodeAudio()
117
+ const videoTask = encodeVideo()
118
+
110
119
  await output.start()
111
- await Promise.all(promises)
120
+ await Promise.all([audioTask, videoTask])
112
121
  await output.finalize()
113
122
  },
114
-
115
- async composite(composition) {
116
- const {stage, renderer} = await renderPIXI(1920, 1080)
117
- stage.removeChildren()
118
-
119
- const {dispose} = await renderLayer(composition, stage)
120
- renderer.render(stage)
121
-
122
- // make sure browser support webgl/webgpu otherwise it might take much longer to construct frame
123
- // if its very slow on eg edge try chrome
124
- const frame = new VideoFrame(renderer.canvas, {
125
- timestamp: 0,
126
- duration: 0,
127
- })
128
-
129
- renderer.clear()
130
- dispose()
131
-
132
- shell.transfer = [frame]
133
- return frame
134
- }
135
123
  }))
136
124
  )
137
125
 
138
- // TODO suspicious global, probably bad
139
- let pixi: {
140
- renderer: Renderer
141
- stage: Container
142
- } | null = null
143
-
144
- async function renderPIXI(width: number, height: number) {
145
- if (pixi)
146
- return pixi
147
-
148
- const renderer = await autoDetectRenderer({
149
- width,
150
- height,
151
- preference: "webgl", // webgl and webgl2 causes memory leaks on chrome
152
- background: "black",
153
- preferWebGLVersion: 2
154
- })
155
-
156
- const stage = new Container()
157
- pixi = {renderer, stage}
158
-
159
- return pixi
160
- }
161
-
162
- const transitions: Map<string, ReturnType<typeof makeTransition>> = new Map()
163
-
164
- type RenderableObject = Sprite | Text | Texture
165
-
166
- async function renderLayer(
167
- layer: Layer | Composition,
168
- parent: Container,
169
- ) {
170
- if (Array.isArray(layer)) {
171
- const disposers: (() => void)[] = []
172
- for (const child of layer) {
173
- const result = await renderLayer(child, parent)
174
- disposers.push(result.dispose)
175
- }
176
- return {dispose: () => disposers.forEach(d => d())}
177
- }
178
-
179
- switch (layer.kind) {
180
- case 'text':
181
- return renderTextLayer(layer, parent)
182
- case 'image':
183
- return renderImageLayer(layer, parent)
184
- case 'transition':
185
- return renderTransitionLayer(layer, parent)
186
- case 'gap': {
187
- pixi?.renderer.clear()
188
- return {dispose: () => {}}
189
- }
190
- default:
191
- console.warn('Unknown layer kind', (layer as any).kind)
192
- return {dispose: () => {}}
193
- }
194
- }
195
-
196
- function renderTextLayer(
197
- layer: Extract<Layer, {kind: 'text'}>,
198
- parent: Container,
199
- ) {
200
- const text = new Text({
201
- text: layer.content,
202
- style: {
203
- fontFamily: 'sans-serif',
204
- fontSize: layer.fontSize ?? 48,
205
- fill: layer.color ?? 'white'
206
- }
207
- })
208
- applyTransform(text, layer.matrix)
209
- parent.addChild(text)
210
- return {dispose: () => text.destroy(true)}
211
- }
212
-
213
- function renderImageLayer(
214
- layer: Extract<Layer, {kind: 'image'}>,
215
- parent: Container,
216
- ) {
217
- const texture = Texture.from(layer.frame)
218
- const sprite = new Sprite(texture)
219
- applyTransform(sprite, layer.matrix)
220
- parent.addChild(sprite)
221
- return {dispose: () => {
222
- sprite.destroy(true)
223
- texture.destroy(true)
224
- layer.frame.close()
225
- }}
226
- }
227
-
228
- function renderTransitionLayer(
229
- {from, to, progress, name}: Extract<Layer, {kind: 'transition'}>,
230
- parent: Container,
231
- ) {
232
- const transition = transitions.get(name) ??
233
- (transitions.set(name, makeTransition({
234
- name: "circle",
235
- renderer: pixi!.renderer
236
- })),
237
- transitions.get(name)!
238
- )
239
- const texture = transition.render({from, to, progress, width: from.displayWidth, height: from.displayHeight})
240
- const sprite = new Sprite(texture)
241
- parent.addChild(sprite)
242
- return {dispose: () => sprite.destroy(false)}
243
- }
244
-
245
- function applyTransform(target: Sprite | Text, worldMatrix?: Mat6) {
246
- if (!worldMatrix) return
247
- const mx = mat6ToMatrix(worldMatrix)
248
- target.setFromMatrix(mx)
249
- }