@omnimedia/omnitool 1.1.0-1 → 1.1.0-100

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 (468) hide show
  1. package/README.md +556 -72
  2. package/package.json +20 -15
  3. package/s/context.ts +0 -7
  4. package/s/demo/demo.bundle.ts +104 -39
  5. package/s/demo/demo.css +246 -11
  6. package/s/demo/routines/export-test.ts +16 -0
  7. package/s/demo/routines/filmstrip-test.ts +23 -19
  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 +81 -0
  11. package/s/demo/routines/transcode-test.ts +21 -5
  12. package/s/demo/routines/transcriber-test.ts +34 -0
  13. package/s/demo/routines/transitions-test.ts +43 -0
  14. package/s/demo/routines/waveform-test.ts +35 -8
  15. package/s/driver/driver-worker.ts +9 -0
  16. package/s/driver/driver.test.ts +1 -1
  17. package/s/driver/driver.ts +52 -43
  18. package/s/driver/fns/host.ts +7 -6
  19. package/s/driver/fns/schematic.ts +69 -25
  20. package/s/driver/fns/work.ts +102 -214
  21. package/s/driver/parts/compositor.ts +319 -0
  22. package/s/driver/parts/machina.ts +19 -20
  23. package/s/driver/utils/find-pixi-filter.ts +24 -0
  24. package/s/driver/utils/load-decoder-source.ts +3 -4
  25. package/s/features/bg-remover/bg-remover.ts +26 -0
  26. package/s/features/bg-remover/default-spec.ts +11 -0
  27. package/s/features/bg-remover/types.ts +27 -0
  28. package/s/features/bg-remover/worker.bundle.ts +52 -0
  29. package/s/features/parts/expose-errors.ts +41 -0
  30. package/s/features/parts/load-pipe.ts +17 -0
  31. package/s/features/parts/types.ts +19 -0
  32. package/s/features/speech/transcribe/default-spec.ts +11 -0
  33. package/s/features/speech/transcribe/parts/prep-audio.ts +23 -0
  34. package/s/features/speech/transcribe/parts/transcribe.ts +70 -0
  35. package/s/features/speech/transcribe/transcriber.ts +46 -0
  36. package/s/features/speech/transcribe/types.ts +76 -0
  37. package/s/features/speech/transcribe/worker.bundle.ts +42 -0
  38. package/s/features/transition/parts/fragment.ts +24 -0
  39. package/s/features/transition/parts/types.ts +27 -0
  40. package/s/features/transition/parts/uniforms.ts +29 -0
  41. package/s/features/transition/parts/vertex.ts +31 -0
  42. package/s/features/transition/transition.ts +60 -0
  43. package/s/index.html.ts +103 -20
  44. package/s/index.ts +1 -0
  45. package/s/tests.bundle.ts +11 -0
  46. package/s/tests.html.ts +28 -0
  47. package/s/timeline/index.ts +17 -1
  48. package/s/timeline/parts/animations/make.ts +38 -0
  49. package/s/timeline/parts/animations/presets.ts +138 -0
  50. package/s/timeline/parts/animations/properties.ts +30 -0
  51. package/s/timeline/parts/animations/registry.ts +13 -0
  52. package/s/timeline/parts/animations/types.ts +80 -0
  53. package/s/timeline/parts/basics.ts +1 -1
  54. package/s/timeline/parts/captions.ts +91 -0
  55. package/s/timeline/parts/filmstrip.ts +43 -16
  56. package/s/timeline/parts/filters.ts +453 -0
  57. package/s/timeline/parts/item.ts +124 -11
  58. package/s/timeline/parts/media.ts +43 -1
  59. package/s/timeline/parts/resource-pool.ts +8 -5
  60. package/s/timeline/parts/resource.ts +3 -0
  61. package/s/timeline/parts/transitions.ts +102 -0
  62. package/s/timeline/parts/waveform/parts/collect.ts +72 -0
  63. package/s/timeline/parts/waveform/parts/render.ts +45 -0
  64. package/s/timeline/parts/waveform/parts/types.ts +24 -0
  65. package/s/timeline/parts/waveform/waveform.ts +161 -0
  66. package/s/timeline/renderers/export/parts/audio-gain.ts +17 -0
  67. package/s/timeline/renderers/export/parts/audio-mix.ts +133 -0
  68. package/s/timeline/renderers/export/parts/cursor.ts +291 -0
  69. package/s/timeline/renderers/export/parts/produce-audio.ts +64 -0
  70. package/s/timeline/renderers/export/parts/produce-video.ts +49 -0
  71. package/s/timeline/renderers/export/parts/resamplers.ts +48 -0
  72. package/s/timeline/renderers/export/produce.ts +28 -0
  73. package/s/timeline/renderers/parts/handy.ts +441 -0
  74. package/s/timeline/renderers/parts/samplers/audio/parts/find.ts +19 -0
  75. package/s/timeline/renderers/parts/samplers/audio/parts/init.ts +60 -0
  76. package/s/timeline/renderers/parts/samplers/audio/parts/sink.ts +38 -0
  77. package/s/timeline/renderers/parts/samplers/audio/parts/types.ts +16 -0
  78. package/s/timeline/renderers/parts/samplers/audio/sampler.ts +35 -0
  79. package/s/timeline/renderers/parts/samplers/visual/parts/defaults.ts +23 -0
  80. package/s/timeline/renderers/parts/samplers/visual/parts/image-sink.ts +51 -0
  81. package/s/timeline/renderers/parts/samplers/visual/parts/sample.ts +99 -0
  82. package/s/timeline/renderers/parts/samplers/visual/parts/sequence.ts +97 -0
  83. package/s/timeline/renderers/parts/samplers/visual/parts/transition.ts +28 -0
  84. package/s/timeline/renderers/parts/samplers/visual/parts/types.ts +11 -0
  85. package/s/timeline/renderers/parts/samplers/visual/parts/video-sink.ts +38 -0
  86. package/s/timeline/renderers/parts/samplers/visual/sampler.ts +31 -0
  87. package/s/timeline/renderers/parts/schedulers.ts +96 -0
  88. package/s/timeline/renderers/player/parts/playback.ts +213 -0
  89. package/s/timeline/renderers/player/player.ts +86 -0
  90. package/s/timeline/renderers/renderers.test.ts +403 -0
  91. package/s/timeline/sugar/helpers.ts +239 -0
  92. package/s/timeline/sugar/o.ts +443 -48
  93. package/s/timeline/sugar/omni.test.ts +210 -0
  94. package/s/timeline/sugar/omni.ts +38 -12
  95. package/s/timeline/types.ts +62 -0
  96. package/s/timeline/utils/anim.ts +63 -0
  97. package/s/timeline/utils/checksum.ts +5 -2
  98. package/s/timeline/utils/datafile.ts +15 -4
  99. package/s/timeline/utils/dummy-data.ts +3 -3
  100. package/s/timeline/utils/matrix.ts +54 -0
  101. package/s/timeline/utils/terps.ts +81 -0
  102. package/s/units/fps.ts +8 -0
  103. package/s/units/ms.ts +8 -0
  104. package/s/units/seconds.ts +8 -0
  105. package/x/WebGLRenderer-4CHIZDHY.js +2 -0
  106. package/x/WebGLRenderer-4CHIZDHY.js.map +7 -0
  107. package/x/WebGPURenderer-O6WXU2QR.js +2 -0
  108. package/x/WebGPURenderer-O6WXU2QR.js.map +7 -0
  109. package/x/browserAll-WNIOTNNP.js +2 -0
  110. package/x/browserAll-WNIOTNNP.js.map +7 -0
  111. package/x/chunk-23FOBGX6.js +2 -0
  112. package/x/chunk-23FOBGX6.js.map +7 -0
  113. package/x/chunk-73XOWA4F.js +393 -0
  114. package/x/chunk-73XOWA4F.js.map +7 -0
  115. package/x/chunk-IAWJKNX5.js +42 -0
  116. package/x/chunk-IAWJKNX5.js.map +7 -0
  117. package/x/chunk-KCMVLWBS.js +157 -0
  118. package/x/chunk-KCMVLWBS.js.map +7 -0
  119. package/x/chunk-MR32SQ27.js +2 -0
  120. package/x/chunk-MR32SQ27.js.map +7 -0
  121. package/x/chunk-VCUJJYRJ.js +327 -0
  122. package/x/chunk-VCUJJYRJ.js.map +7 -0
  123. package/x/chunk-XNIZ4L5W.js +269 -0
  124. package/x/chunk-XNIZ4L5W.js.map +7 -0
  125. package/x/chunk-ZLGNQFUI.js +15 -0
  126. package/x/chunk-ZLGNQFUI.js.map +7 -0
  127. package/x/context.d.ts +1 -4
  128. package/x/context.js +1 -5
  129. package/x/context.js.map +1 -1
  130. package/x/demo/WebGLRenderer-RSJAHIG2.js +2 -0
  131. package/x/demo/WebGLRenderer-RSJAHIG2.js.map +7 -0
  132. package/x/demo/WebGPURenderer-MGFAJCYY.js +2 -0
  133. package/x/demo/WebGPURenderer-MGFAJCYY.js.map +7 -0
  134. package/x/demo/browserAll-PTRBXBRP.js +2 -0
  135. package/x/demo/browserAll-PTRBXBRP.js.map +7 -0
  136. package/x/demo/chunk-CUYOGHWU.js +42 -0
  137. package/x/demo/chunk-CUYOGHWU.js.map +7 -0
  138. package/x/demo/chunk-DGTDNJ7W.js +2 -0
  139. package/x/demo/chunk-DGTDNJ7W.js.map +7 -0
  140. package/x/demo/chunk-FZ5BYF63.js +15 -0
  141. package/x/demo/chunk-FZ5BYF63.js.map +7 -0
  142. package/x/demo/chunk-KWN4NNES.js +269 -0
  143. package/x/demo/chunk-KWN4NNES.js.map +7 -0
  144. package/x/demo/chunk-OJ3FPXW7.js +157 -0
  145. package/x/demo/chunk-OJ3FPXW7.js.map +7 -0
  146. package/x/demo/chunk-PSLUOGTZ.js +393 -0
  147. package/x/demo/chunk-PSLUOGTZ.js.map +7 -0
  148. package/x/demo/chunk-VLCVEIFU.js +327 -0
  149. package/x/demo/chunk-VLCVEIFU.js.map +7 -0
  150. package/x/demo/chunk-ZWCPT5FR.js +2 -0
  151. package/x/demo/chunk-ZWCPT5FR.js.map +7 -0
  152. package/x/demo/demo.bundle.js +94 -36
  153. package/x/demo/demo.bundle.js.map +1 -1
  154. package/x/demo/demo.bundle.min.js +7359 -107
  155. package/x/demo/demo.bundle.min.js.map +4 -4
  156. package/x/demo/demo.css +246 -11
  157. package/x/demo/routines/export-test.d.ts +2 -0
  158. package/x/demo/routines/export-test.js +10 -0
  159. package/x/demo/routines/export-test.js.map +1 -0
  160. package/x/demo/routines/filmstrip-test.d.ts +1 -1
  161. package/x/demo/routines/filmstrip-test.js +21 -18
  162. package/x/demo/routines/filmstrip-test.js.map +1 -1
  163. package/x/demo/routines/load-video.d.ts +1 -1
  164. package/x/demo/routines/load-video.js +1 -2
  165. package/x/demo/routines/load-video.js.map +1 -1
  166. package/x/demo/routines/playback-test.d.ts +2 -0
  167. package/x/demo/routines/playback-test.js +51 -0
  168. package/x/demo/routines/playback-test.js.map +1 -0
  169. package/x/demo/routines/timeline-setup.d.ts +6 -0
  170. package/x/demo/routines/timeline-setup.js +59 -0
  171. package/x/demo/routines/timeline-setup.js.map +1 -0
  172. package/x/demo/routines/transcode-test.js +17 -5
  173. package/x/demo/routines/transcode-test.js.map +1 -1
  174. package/x/demo/routines/transcriber-test.d.ts +4 -0
  175. package/x/demo/routines/transcriber-test.js +33 -0
  176. package/x/demo/routines/transcriber-test.js.map +1 -0
  177. package/x/demo/routines/transitions-test.d.ts +5 -0
  178. package/x/demo/routines/transitions-test.js +35 -0
  179. package/x/demo/routines/transitions-test.js.map +1 -0
  180. package/x/demo/routines/waveform-test.d.ts +2 -1
  181. package/x/demo/routines/waveform-test.js +29 -8
  182. package/x/demo/routines/waveform-test.js.map +1 -1
  183. package/x/demo/webworkerAll-JENRT6BT.js +2 -0
  184. package/x/demo/webworkerAll-JENRT6BT.js.map +7 -0
  185. package/x/driver/driver-worker.d.ts +1 -0
  186. package/x/driver/driver-worker.js +6 -0
  187. package/x/driver/driver-worker.js.map +1 -0
  188. package/x/driver/driver.d.ts +24 -9
  189. package/x/driver/driver.js +51 -40
  190. package/x/driver/driver.js.map +1 -1
  191. package/x/driver/driver.test.js +1 -1
  192. package/x/driver/driver.test.js.map +1 -1
  193. package/x/driver/driver.worker.bundle.min.js +137 -1137
  194. package/x/driver/driver.worker.bundle.min.js.map +4 -4
  195. package/x/driver/fns/host.d.ts +12 -4
  196. package/x/driver/fns/host.js +3 -3
  197. package/x/driver/fns/host.js.map +1 -1
  198. package/x/driver/fns/schematic.d.ts +65 -25
  199. package/x/driver/fns/work.d.ts +14 -7
  200. package/x/driver/fns/work.js +83 -174
  201. package/x/driver/fns/work.js.map +1 -1
  202. package/x/driver/parts/compositor.d.ts +39 -0
  203. package/x/driver/parts/compositor.js +264 -0
  204. package/x/driver/parts/compositor.js.map +1 -0
  205. package/x/driver/parts/machina.d.ts +0 -20
  206. package/x/driver/parts/machina.js +6 -10
  207. package/x/driver/parts/machina.js.map +1 -1
  208. package/x/driver/utils/find-pixi-filter.d.ts +5 -0
  209. package/x/driver/utils/find-pixi-filter.js +13 -0
  210. package/x/driver/utils/find-pixi-filter.js.map +1 -0
  211. package/x/driver/utils/load-decoder-source.d.ts +2 -1
  212. package/x/driver/utils/load-decoder-source.js +2 -3
  213. package/x/driver/utils/load-decoder-source.js.map +1 -1
  214. package/x/features/bg-remover/bg-remover.d.ts +5 -0
  215. package/x/features/bg-remover/bg-remover.js +18 -0
  216. package/x/features/bg-remover/bg-remover.js.map +1 -0
  217. package/x/features/bg-remover/default-spec.d.ts +2 -0
  218. package/x/features/bg-remover/default-spec.js +6 -0
  219. package/x/features/bg-remover/default-spec.js.map +1 -0
  220. package/x/features/bg-remover/types.d.ts +20 -0
  221. package/x/features/bg-remover/types.js +2 -0
  222. package/x/features/bg-remover/types.js.map +1 -0
  223. package/x/features/bg-remover/worker.bundle.js +39 -0
  224. package/x/features/bg-remover/worker.bundle.js.map +1 -0
  225. package/x/features/bg-remover/worker.bundle.min.js +2916 -0
  226. package/x/features/bg-remover/worker.bundle.min.js.map +7 -0
  227. package/x/features/parts/expose-errors.d.ts +3 -0
  228. package/x/features/parts/expose-errors.js +32 -0
  229. package/x/features/parts/expose-errors.js.map +1 -0
  230. package/x/features/parts/load-pipe.d.ts +2 -0
  231. package/x/features/parts/load-pipe.js +13 -0
  232. package/x/features/parts/load-pipe.js.map +1 -0
  233. package/x/features/parts/types.d.ts +15 -0
  234. package/x/features/parts/types.js +2 -0
  235. package/x/features/parts/types.js.map +1 -0
  236. package/x/features/speech/transcribe/default-spec.d.ts +2 -0
  237. package/x/features/speech/transcribe/default-spec.js +8 -0
  238. package/x/features/speech/transcribe/default-spec.js.map +1 -0
  239. package/x/features/speech/transcribe/parts/prep-audio.d.ts +5 -0
  240. package/x/features/speech/transcribe/parts/prep-audio.js +21 -0
  241. package/x/features/speech/transcribe/parts/prep-audio.js.map +1 -0
  242. package/x/features/speech/transcribe/parts/transcribe.d.ts +5 -0
  243. package/x/features/speech/transcribe/parts/transcribe.js +56 -0
  244. package/x/features/speech/transcribe/parts/transcribe.js.map +1 -0
  245. package/x/features/speech/transcribe/transcriber.d.ts +5 -0
  246. package/x/features/speech/transcribe/transcriber.js +33 -0
  247. package/x/features/speech/transcribe/transcriber.js.map +1 -0
  248. package/x/features/speech/transcribe/types.d.ts +59 -0
  249. package/x/features/speech/transcribe/types.js +2 -0
  250. package/x/features/speech/transcribe/types.js.map +1 -0
  251. package/x/features/speech/transcribe/worker.bundle.js +35 -0
  252. package/x/features/speech/transcribe/worker.bundle.js.map +1 -0
  253. package/x/features/speech/transcribe/worker.bundle.min.js +2916 -0
  254. package/x/features/speech/transcribe/worker.bundle.min.js.map +7 -0
  255. package/x/features/transition/parts/fragment.d.ts +1 -0
  256. package/x/features/transition/parts/fragment.js +25 -0
  257. package/x/features/transition/parts/fragment.js.map +1 -0
  258. package/x/features/transition/parts/types.d.ts +23 -0
  259. package/x/features/transition/parts/types.js +2 -0
  260. package/x/features/transition/parts/types.js.map +1 -0
  261. package/x/features/transition/parts/uniforms.d.ts +31 -0
  262. package/x/features/transition/parts/uniforms.js +27 -0
  263. package/x/features/transition/parts/uniforms.js.map +1 -0
  264. package/x/features/transition/parts/vertex.d.ts +1 -0
  265. package/x/features/transition/parts/vertex.js +32 -0
  266. package/x/features/transition/parts/vertex.js.map +1 -0
  267. package/x/features/transition/transition.d.ts +5 -0
  268. package/x/features/transition/transition.js +50 -0
  269. package/x/features/transition/transition.js.map +1 -0
  270. package/x/index.d.ts +1 -0
  271. package/x/index.html +349 -30
  272. package/x/index.html.js +103 -19
  273. package/x/index.html.js.map +1 -1
  274. package/x/index.js +1 -0
  275. package/x/index.js.map +1 -1
  276. package/x/tests.bundle.d.ts +1 -0
  277. package/x/tests.bundle.js +8 -0
  278. package/x/tests.bundle.js.map +1 -0
  279. package/x/tests.bundle.min.js +7374 -0
  280. package/x/tests.bundle.min.js.map +7 -0
  281. package/x/tests.html +316 -0
  282. package/x/tests.html.d.ts +2 -0
  283. package/x/tests.html.js +22 -0
  284. package/x/tests.html.js.map +1 -0
  285. package/x/timeline/index.d.ts +16 -0
  286. package/x/timeline/index.js +16 -0
  287. package/x/timeline/index.js.map +1 -1
  288. package/x/timeline/parts/animations/make.d.ts +3 -0
  289. package/x/timeline/parts/animations/make.js +29 -0
  290. package/x/timeline/parts/animations/make.js.map +1 -0
  291. package/x/timeline/parts/animations/presets.d.ts +170 -0
  292. package/x/timeline/parts/animations/presets.js +135 -0
  293. package/x/timeline/parts/animations/presets.js.map +1 -0
  294. package/x/timeline/parts/animations/properties.d.ts +84 -0
  295. package/x/timeline/parts/animations/properties.js +25 -0
  296. package/x/timeline/parts/animations/properties.js.map +1 -0
  297. package/x/timeline/parts/animations/registry.d.ts +218 -0
  298. package/x/timeline/parts/animations/registry.js +11 -0
  299. package/x/timeline/parts/animations/registry.js.map +1 -0
  300. package/x/timeline/parts/animations/types.d.ts +60 -0
  301. package/x/timeline/parts/animations/types.js +2 -0
  302. package/x/timeline/parts/animations/types.js.map +1 -0
  303. package/x/timeline/parts/basics.d.ts +1 -1
  304. package/x/timeline/parts/captions.d.ts +41 -0
  305. package/x/timeline/parts/captions.js +55 -0
  306. package/x/timeline/parts/captions.js.map +1 -0
  307. package/x/timeline/parts/filmstrip.d.ts +4 -3
  308. package/x/timeline/parts/filmstrip.js +29 -10
  309. package/x/timeline/parts/filmstrip.js.map +1 -1
  310. package/x/timeline/parts/filters.d.ts +108 -0
  311. package/x/timeline/parts/filters.js +340 -0
  312. package/x/timeline/parts/filters.js.map +1 -0
  313. package/x/timeline/parts/item.d.ts +106 -12
  314. package/x/timeline/parts/item.js +11 -7
  315. package/x/timeline/parts/item.js.map +1 -1
  316. package/x/timeline/parts/media.d.ts +6 -0
  317. package/x/timeline/parts/media.js +35 -1
  318. package/x/timeline/parts/media.js.map +1 -1
  319. package/x/timeline/parts/resource-pool.d.ts +3 -0
  320. package/x/timeline/parts/resource-pool.js +7 -4
  321. package/x/timeline/parts/resource-pool.js.map +1 -1
  322. package/x/timeline/parts/resource.d.ts +3 -0
  323. package/x/timeline/parts/transitions.d.ts +15 -0
  324. package/x/timeline/parts/transitions.js +81 -0
  325. package/x/timeline/parts/transitions.js.map +1 -0
  326. package/x/timeline/parts/waveform/parts/collect.d.ts +11 -0
  327. package/x/timeline/parts/waveform/parts/collect.js +56 -0
  328. package/x/timeline/parts/waveform/parts/collect.js.map +1 -0
  329. package/x/timeline/parts/waveform/parts/render.d.ts +5 -0
  330. package/x/timeline/parts/waveform/parts/render.js +29 -0
  331. package/x/timeline/parts/waveform/parts/render.js.map +1 -0
  332. package/x/timeline/parts/waveform/parts/types.d.ts +21 -0
  333. package/x/timeline/parts/waveform/parts/types.js +2 -0
  334. package/x/timeline/parts/waveform/parts/types.js.map +1 -0
  335. package/x/timeline/parts/waveform/waveform.d.ts +19 -0
  336. package/x/timeline/parts/waveform/waveform.js +133 -0
  337. package/x/timeline/parts/waveform/waveform.js.map +1 -0
  338. package/x/timeline/renderers/export/parts/audio-gain.d.ts +1 -0
  339. package/x/timeline/renderers/export/parts/audio-gain.js +13 -0
  340. package/x/timeline/renderers/export/parts/audio-gain.js.map +1 -0
  341. package/x/timeline/renderers/export/parts/audio-mix.d.ts +21 -0
  342. package/x/timeline/renderers/export/parts/audio-mix.js +89 -0
  343. package/x/timeline/renderers/export/parts/audio-mix.js.map +1 -0
  344. package/x/timeline/renderers/export/parts/cursor.d.ts +35 -0
  345. package/x/timeline/renderers/export/parts/cursor.js +236 -0
  346. package/x/timeline/renderers/export/parts/cursor.js.map +1 -0
  347. package/x/timeline/renderers/export/parts/produce-audio.d.ts +6 -0
  348. package/x/timeline/renderers/export/parts/produce-audio.js +41 -0
  349. package/x/timeline/renderers/export/parts/produce-audio.js.map +1 -0
  350. package/x/timeline/renderers/export/parts/produce-video.d.ts +10 -0
  351. package/x/timeline/renderers/export/parts/produce-video.js +26 -0
  352. package/x/timeline/renderers/export/parts/produce-video.js.map +1 -0
  353. package/x/timeline/renderers/export/parts/resamplers.d.ts +12 -0
  354. package/x/timeline/renderers/export/parts/resamplers.js +29 -0
  355. package/x/timeline/renderers/export/parts/resamplers.js.map +1 -0
  356. package/x/timeline/renderers/export/produce.d.ts +13 -0
  357. package/x/timeline/renderers/export/produce.js +15 -0
  358. package/x/timeline/renderers/export/produce.js.map +1 -0
  359. package/x/timeline/renderers/parts/handy.d.ts +38 -0
  360. package/x/timeline/renderers/parts/handy.js +263 -0
  361. package/x/timeline/renderers/parts/handy.js.map +1 -0
  362. package/x/timeline/renderers/parts/samplers/audio/parts/find.d.ts +6 -0
  363. package/x/timeline/renderers/parts/samplers/audio/parts/find.js +15 -0
  364. package/x/timeline/renderers/parts/samplers/audio/parts/find.js.map +1 -0
  365. package/x/timeline/renderers/parts/samplers/audio/parts/init.d.ts +5 -0
  366. package/x/timeline/renderers/parts/samplers/audio/parts/init.js +40 -0
  367. package/x/timeline/renderers/parts/samplers/audio/parts/init.js.map +1 -0
  368. package/x/timeline/renderers/parts/samplers/audio/parts/sink.d.ts +8 -0
  369. package/x/timeline/renderers/parts/samplers/audio/parts/sink.js +24 -0
  370. package/x/timeline/renderers/parts/samplers/audio/parts/sink.js.map +1 -0
  371. package/x/timeline/renderers/parts/samplers/audio/parts/types.d.ts +14 -0
  372. package/x/timeline/renderers/parts/samplers/audio/parts/types.js +2 -0
  373. package/x/timeline/renderers/parts/samplers/audio/parts/types.js.map +1 -0
  374. package/x/timeline/renderers/parts/samplers/audio/sampler.d.ts +11 -0
  375. package/x/timeline/renderers/parts/samplers/audio/sampler.js +22 -0
  376. package/x/timeline/renderers/parts/samplers/audio/sampler.js.map +1 -0
  377. package/x/timeline/renderers/parts/samplers/visual/parts/defaults.d.ts +8 -0
  378. package/x/timeline/renderers/parts/samplers/visual/parts/defaults.js +14 -0
  379. package/x/timeline/renderers/parts/samplers/visual/parts/defaults.js.map +1 -0
  380. package/x/timeline/renderers/parts/samplers/visual/parts/image-sink.d.ts +11 -0
  381. package/x/timeline/renderers/parts/samplers/visual/parts/image-sink.js +36 -0
  382. package/x/timeline/renderers/parts/samplers/visual/parts/image-sink.js.map +1 -0
  383. package/x/timeline/renderers/parts/samplers/visual/parts/sample.d.ts +9 -0
  384. package/x/timeline/renderers/parts/samplers/visual/parts/sample.js +70 -0
  385. package/x/timeline/renderers/parts/samplers/visual/parts/sample.js.map +1 -0
  386. package/x/timeline/renderers/parts/samplers/visual/parts/sequence.d.ts +6 -0
  387. package/x/timeline/renderers/parts/samplers/visual/parts/sequence.js +63 -0
  388. package/x/timeline/renderers/parts/samplers/visual/parts/sequence.js.map +1 -0
  389. package/x/timeline/renderers/parts/samplers/visual/parts/transition.d.ts +3 -0
  390. package/x/timeline/renderers/parts/samplers/visual/parts/transition.js +18 -0
  391. package/x/timeline/renderers/parts/samplers/visual/parts/transition.js.map +1 -0
  392. package/x/timeline/renderers/parts/samplers/visual/parts/types.d.ts +9 -0
  393. package/x/timeline/renderers/parts/samplers/visual/parts/types.js +2 -0
  394. package/x/timeline/renderers/parts/samplers/visual/parts/types.js.map +1 -0
  395. package/x/timeline/renderers/parts/samplers/visual/parts/video-sink.d.ts +8 -0
  396. package/x/timeline/renderers/parts/samplers/visual/parts/video-sink.js +24 -0
  397. package/x/timeline/renderers/parts/samplers/visual/parts/video-sink.js.map +1 -0
  398. package/x/timeline/renderers/parts/samplers/visual/sampler.d.ts +7 -0
  399. package/x/timeline/renderers/parts/samplers/visual/sampler.js +20 -0
  400. package/x/timeline/renderers/parts/samplers/visual/sampler.js.map +1 -0
  401. package/x/timeline/renderers/parts/schedulers.d.ts +17 -0
  402. package/x/timeline/renderers/parts/schedulers.js +64 -0
  403. package/x/timeline/renderers/parts/schedulers.js.map +1 -0
  404. package/x/timeline/renderers/player/parts/playback.d.ts +39 -0
  405. package/x/timeline/renderers/player/parts/playback.js +160 -0
  406. package/x/timeline/renderers/player/parts/playback.js.map +1 -0
  407. package/x/timeline/renderers/player/player.d.ts +27 -0
  408. package/x/timeline/renderers/player/player.js +64 -0
  409. package/x/timeline/renderers/player/player.js.map +1 -0
  410. package/x/timeline/renderers/renderers.test.d.ts +33 -0
  411. package/x/timeline/renderers/renderers.test.js +321 -0
  412. package/x/timeline/renderers/renderers.test.js.map +1 -0
  413. package/x/timeline/sugar/helpers.d.ts +72 -0
  414. package/x/timeline/sugar/helpers.js +122 -0
  415. package/x/timeline/sugar/helpers.js.map +1 -0
  416. package/x/timeline/sugar/o.d.ts +59 -8
  417. package/x/timeline/sugar/o.js +326 -40
  418. package/x/timeline/sugar/o.js.map +1 -1
  419. package/x/timeline/sugar/omni.d.ts +11 -2
  420. package/x/timeline/sugar/omni.js +30 -9
  421. package/x/timeline/sugar/omni.js.map +1 -1
  422. package/x/timeline/sugar/omni.test.d.ts +27 -0
  423. package/x/timeline/sugar/omni.test.js +128 -0
  424. package/x/timeline/sugar/omni.test.js.map +1 -0
  425. package/x/timeline/types.d.ts +37 -0
  426. package/x/timeline/types.js +2 -0
  427. package/x/timeline/types.js.map +1 -0
  428. package/x/timeline/utils/anim.d.ts +3 -0
  429. package/x/timeline/utils/anim.js +40 -0
  430. package/x/timeline/utils/anim.js.map +1 -0
  431. package/x/timeline/utils/checksum.d.ts +3 -2
  432. package/x/timeline/utils/checksum.js +2 -1
  433. package/x/timeline/utils/checksum.js.map +1 -1
  434. package/x/timeline/utils/datafile.d.ts +5 -3
  435. package/x/timeline/utils/datafile.js +18 -5
  436. package/x/timeline/utils/datafile.js.map +1 -1
  437. package/x/timeline/utils/dummy-data.d.ts +1 -2
  438. package/x/timeline/utils/dummy-data.js +4 -2
  439. package/x/timeline/utils/dummy-data.js.map +1 -1
  440. package/x/timeline/utils/matrix.d.ts +17 -0
  441. package/x/timeline/utils/matrix.js +36 -0
  442. package/x/timeline/utils/matrix.js.map +1 -0
  443. package/x/timeline/utils/terps.d.ts +11 -0
  444. package/x/timeline/utils/terps.js +57 -0
  445. package/x/timeline/utils/terps.js.map +1 -0
  446. package/x/units/fps.d.ts +6 -0
  447. package/x/units/fps.js +2 -0
  448. package/x/units/fps.js.map +1 -0
  449. package/x/units/ms.d.ts +6 -0
  450. package/x/units/ms.js +2 -0
  451. package/x/units/ms.js.map +1 -0
  452. package/x/units/seconds.d.ts +6 -0
  453. package/x/units/seconds.js +2 -0
  454. package/x/units/seconds.js.map +1 -0
  455. package/x/webworkerAll-RLCTMSDD.js +2 -0
  456. package/x/webworkerAll-RLCTMSDD.js.map +7 -0
  457. package/s/tests.test.ts +0 -8
  458. package/s/timeline/parts/waveform.ts +0 -62
  459. package/s/timeline/sugar/omni-test.ts +0 -38
  460. package/x/tests.test.js +0 -6
  461. package/x/tests.test.js.map +0 -1
  462. package/x/timeline/parts/waveform.d.ts +0 -8
  463. package/x/timeline/parts/waveform.js +0 -51
  464. package/x/timeline/parts/waveform.js.map +0 -1
  465. package/x/timeline/sugar/omni-test.js +0 -22
  466. package/x/timeline/sugar/omni-test.js.map +0 -1
  467. /package/x/{tests.test.d.ts → features/bg-remover/worker.bundle.d.ts} +0 -0
  468. /package/x/{timeline/sugar/omni-test.d.ts → features/speech/transcribe/worker.bundle.d.ts} +0 -0
@@ -1,237 +1,125 @@
1
1
  import {Comrade} from "@e280/comrade"
2
- import {
3
- Input, ALL_FORMATS, VideoSampleSink, Output, Mp4OutputFormat, VideoSampleSource, VideoSample,
4
- AudioSampleSink, AudioSampleSource, AudioSample, StreamTarget, BlobSource, UrlSource
5
- } from "mediabunny"
6
- import {autoDetectRenderer, Container, Renderer, Sprite, Text, Texture, DOMAdapter, WebWorkerAdapter} from "pixi.js"
7
2
 
8
- import {Composition, DriverSchematic, Layer, Transform} from "./schematic.js"
3
+ import {Input, ALL_FORMATS, VideoSampleSink, Output, Mp4OutputFormat, VideoSampleSource, VideoSample, AudioSampleSink,
4
+ AudioSampleSource, AudioSample, StreamTarget, BlobSource, UrlSource} from "mediabunny"
9
5
 
10
- DOMAdapter.set(WebWorkerAdapter)
6
+ import {DecoderSource, DriverSchematic} from "./schematic.js"
11
7
 
12
- export const setupDriverWork = Comrade.work<DriverSchematic>(({host}, rig) => ({
13
-
14
- async hello() {
15
- await host.world()
16
- },
17
-
18
- async decode({source, video, audio}) {
19
- const loadSource = async () => {
20
- if(source instanceof FileSystemFileHandle) {
21
- const file = await source.getFile()
22
- return new BlobSource(file)
23
- } else {
24
- return new UrlSource(source)
25
- }
26
- }
27
- const input = new Input({
28
- source: await loadSource(),
29
- formats: ALL_FORMATS
30
- })
31
-
32
- const [videoTrack, audioTrack] = await Promise.all([
33
- input.getPrimaryVideoTrack(),
34
- input.getPrimaryAudioTrack()
35
- ])
36
-
37
- const videoDecodable = await videoTrack?.canDecode()
38
- const audioDecodable = await audioTrack?.canDecode()
39
-
40
- const videoWriter = video.getWriter()
41
- const audioWriter = audio.getWriter()
42
-
43
- await Promise.all([
44
- (async () => {
45
- if (videoDecodable && videoTrack) {
46
- const sink = new VideoSampleSink(videoTrack)
47
- for await (const sample of sink.samples()) {
48
- const frame = sample.toVideoFrame()
49
- await videoWriter.write(frame)
50
- sample.close()
51
- frame.close()
52
- }
53
- await videoWriter.close()
54
- }
55
- })(),
56
- (async () => {
57
- if (audioDecodable && audioTrack) {
58
- const sink = new AudioSampleSink(audioTrack)
59
- for await (const sample of sink.samples()) {
60
- const frame = sample.toAudioData()
61
- await audioWriter.write(frame)
62
- sample.close()
63
- frame.close()
64
- }
65
- await audioWriter.close()
66
- }
67
- })()
68
- ])
69
- },
70
-
71
- async encode({readables, config, bridge}) {
72
- const output = new Output({
73
- format: new Mp4OutputFormat(),
74
- target: new StreamTarget(bridge, {chunked: true})
75
- })
76
- const videoSource = new VideoSampleSource(config.video)
77
- output.addVideoTrack(videoSource)
78
- // since AudioSample is not transferable it fails to transfer encoder bitrate config
79
- // so it needs to be hardcoded not set through constants eg QUALITY_LOW
80
- const audioSource = new AudioSampleSource(config.audio)
81
- output.addAudioTrack(audioSource)
82
-
83
- await output.start()
84
-
85
- const videoReader = readables.video.getReader()
86
- const audioReader = readables.audio.getReader()
87
-
88
- await Promise.all([
89
- (async () => {
90
- while (true) {
91
- const {done, value} = await videoReader.read()
92
- if (done) break
93
- const sample = new VideoSample(value)
94
- await videoSource.add(sample)
95
- sample.close()
96
- }
97
- })(),
98
- (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
- ])
109
-
110
- await output.finalize()
111
- },
8
+ const loadSource = async (source: DecoderSource) => {
9
+ if(source instanceof Blob) {
10
+ return new BlobSource(source)
11
+ } else {
12
+ return new UrlSource(source)
13
+ }
14
+ }
112
15
 
113
- async composite(composition) {
114
- const {stage, renderer} = await renderPIXI(1920, 1080)
115
- stage.removeChildren()
16
+ export const setupDriverWork = (
17
+ Comrade.work<DriverSchematic>(shell => ({
18
+ async hello() {
19
+ await shell.host.world()
20
+ },
116
21
 
117
- const {baseFrame, disposables} = await renderLayer(composition, stage)
118
- renderer.render(stage)
22
+ async decodeAudio({source, audio, start, end, cancel}) {
23
+ const input = new Input({
24
+ source: await loadSource(source),
25
+ formats: ALL_FORMATS
26
+ })
119
27
 
120
- // make sure browser support webgl/webgpu otherwise it might take much longer to construct frame
121
- // if its very slow on eg edge try chrome
122
- const frame = new VideoFrame(renderer.canvas, {
123
- timestamp: baseFrame?.timestamp,
124
- duration: baseFrame?.duration ?? undefined,
125
- })
28
+ const audioTrack = await input.getPrimaryAudioTrack()
29
+ const audioDecodable = await audioTrack?.canDecode()
30
+ const audioWriter = audio.getWriter()
126
31
 
127
- baseFrame?.close()
128
- renderer.clear()
32
+ if(!audioDecodable || !audioTrack)
33
+ return
129
34
 
130
- for (const disposable of disposables) {
131
- disposable.destroy(true)
132
- }
35
+ const sink = new AudioSampleSink(audioTrack)
36
+ const samples = sink.samples(start, end)
133
37
 
134
- rig.transfer = [frame]
135
- return frame
136
- }
137
- }))
38
+ cancel.onmessage = async () => {
39
+ samples.return()
40
+ input.dispose()
41
+ cancel.close()
42
+ }
138
43
 
44
+ for await (const sample of samples) {
45
+ const frame = sample.toAudioData()
46
+ sample.close()
47
+ await audioWriter.write(frame)
48
+ frame.close()
49
+ }
139
50
 
140
- let pixi: {
141
- renderer: Renderer
142
- stage: Container
143
- } | null = null
51
+ await audioWriter.close()
52
+ },
144
53
 
145
- async function renderPIXI(width: number, height: number) {
146
- if (pixi)
147
- return pixi
54
+ async decodeVideo({source, video, start, end, cancel}) {
55
+ const input = new Input({
56
+ source: await loadSource(source),
57
+ formats: ALL_FORMATS
58
+ })
148
59
 
149
- const renderer = await autoDetectRenderer({
150
- width,
151
- height,
152
- preference: "webgl", // webgl and webgl2 causes memory leaks on chrome
153
- background: "black",
154
- preferWebGLVersion: 2
155
- })
60
+ const videoTrack = await input.getPrimaryVideoTrack()
61
+ const videoDecodable = await videoTrack?.canDecode()
62
+ const videoWriter = video.getWriter()
156
63
 
157
- const stage = new Container()
158
- pixi = {renderer, stage}
64
+ if(!videoDecodable || !videoTrack)
65
+ return
159
66
 
160
- return pixi
161
- }
67
+ const sink = new VideoSampleSink(videoTrack)
68
+ const samples = sink.samples(start, end)
162
69
 
163
- type RenderableObject = Sprite | Text | Texture
164
-
165
- async function renderLayer(
166
- layer: Layer | Composition,
167
- parent: Container,
168
- disposables: RenderableObject[] = []
169
- ) {
170
- if (Array.isArray(layer)) {
171
- let baseFrame: VideoFrame | undefined
172
- for (const child of layer) {
173
- const result = await renderLayer(child, parent, disposables)
174
- baseFrame ??= result.baseFrame
175
- }
176
- return {baseFrame, disposables}
177
- }
70
+ cancel.onmessage = async () => {
71
+ await samples.return()
72
+ cancel.close()
73
+ }
178
74
 
179
- if (!isRenderableLayer(layer)) {
180
- console.warn('Invalid layer', layer)
181
- return {disposables}
182
- }
75
+ for await (const sample of samples) {
76
+ const frame = sample.toVideoFrame()
77
+ sample.close()
78
+ await videoWriter.write(frame)
79
+ frame.close()
80
+ }
183
81
 
184
- switch (layer.kind) {
185
- case 'text':
186
- return renderTextLayer(layer, parent, disposables)
187
- case 'image':
188
- return renderImageLayer(layer, parent, disposables)
189
- default:
190
- console.warn('Unknown layer kind', (layer as any).kind)
191
- return {disposables}
192
- }
193
- }
82
+ await videoWriter.close()
83
+ input.dispose()
84
+ },
85
+
86
+ async encode({video, audio, config, writable}) {
87
+ const output = new Output({
88
+ format: new Mp4OutputFormat(),
89
+ target: new StreamTarget(writable, {chunked: true})
90
+ })
91
+
92
+ async function encodeVideo() {
93
+ if(!video) return
94
+ const videoSource = new VideoSampleSource(config.video)
95
+ output.addVideoTrack(videoSource)
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
+ }
102
+ }
194
103
 
195
- function isRenderableLayer(layer: any): layer is Layer {
196
- return !!layer && typeof layer === 'object' && typeof layer.kind === 'string'
197
- }
104
+ async function encodeAudio() {
105
+ if(!audio) return
106
+ const audioSource = new AudioSampleSource(config.audio)
107
+ output.addAudioTrack(audioSource)
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
+ }
114
+ }
198
115
 
199
- function renderTextLayer(
200
- layer: Extract<Layer, {kind: 'text'}>,
201
- parent: Container,
202
- disposables: RenderableObject[]
203
- ) {
204
- const text = new Text({
205
- text: layer.content,
206
- style: {
207
- fontFamily: 'sans-serif',
208
- fontSize: layer.fontSize ?? 48,
209
- fill: layer.color ?? 'white'
210
- }
211
- })
212
- applyTransform(text, layer)
213
- parent.addChild(text)
214
- disposables.push(text)
215
- return {disposables}
216
- }
116
+ const audioTask = encodeAudio()
117
+ const videoTask = encodeVideo()
217
118
 
218
- function renderImageLayer(
219
- layer: Extract<Layer, {kind: 'image'}>,
220
- parent: Container,
221
- disposables: RenderableObject[]
222
- ) {
223
- const texture = Texture.from(layer.frame)
224
- const sprite = new Sprite(texture)
225
- applyTransform(sprite, layer)
226
- parent.addChild(sprite)
227
- disposables.push(sprite, texture)
228
- return {baseFrame: layer.frame, disposables}
229
- }
119
+ await output.start()
120
+ await Promise.all([audioTask, videoTask])
121
+ await output.finalize()
122
+ },
123
+ }))
124
+ )
230
125
 
231
- function applyTransform(target: Sprite | Text, t: Transform = {}) {
232
- if(t.x) target.x = t.x
233
- if(t.y) target.y = t.y
234
- if(t.scale) target.scale.set(t.scale)
235
- if(t.opacity) target.alpha = t.opacity
236
- if(t.anchor && 'anchor' in target) target.anchor.set(t.anchor)
237
- }
@@ -0,0 +1,319 @@
1
+
2
+ import {pub} from "@e280/stz"
3
+ import {
4
+ autoDetectRenderer,
5
+ ColorMatrixFilter,
6
+ Container,
7
+ FederatedPointerEvent,
8
+ Filter,
9
+ Graphics,
10
+ Renderer,
11
+ Sprite,
12
+ Text,
13
+ Texture
14
+ } from "pixi.js"
15
+ import * as PixiFilters from "pixi-filters"
16
+
17
+ import {Id} from "../../timeline/index.js"
18
+ import {Crop} from "../../timeline/parts/item.js"
19
+ import {findPixiFilter} from "../utils/find-pixi-filter.js"
20
+ import {Composition, FilterSpec, Layer} from "../fns/schematic.js"
21
+ import {Mat6, mat6ToMatrix} from "../../timeline/utils/matrix.js"
22
+ import {makeTransition} from "../../features/transition/transition.js"
23
+
24
+ export class Compositor {
25
+ onPointerDown = pub<[{event: FederatedPointerEvent, id: Id, object: Container}]>()
26
+ onPointerMove = pub<[{event: FederatedPointerEvent, id: Id, object: Container}]>()
27
+ onPointerUp = pub<[{event: FederatedPointerEvent, id: Id, object: Container}]>()
28
+ onDispose = pub<[{id: Id, object: Container}]>()
29
+
30
+ static async setup() {
31
+ const renderer = await autoDetectRenderer({
32
+ width: 1920,
33
+ height: 1080,
34
+ preference: "webgl", // webgl and webgl2 causes memory leaks on chrome
35
+ background: "black",
36
+ preferWebGLVersion: 2
37
+ })
38
+ const stage = new Container()
39
+ stage.interactive = true
40
+ return new this({renderer, stage})
41
+ }
42
+
43
+ constructor(public pixi: {renderer: Renderer, stage: Container}) {}
44
+
45
+ #transitions: Map<string, ReturnType<typeof makeTransition>> = new Map()
46
+ // objects rendered for current Composition
47
+ #activeObjects = new Map<number, {sprite: Container, dispose: () => void}>()
48
+ #cropMasks = new WeakMap<Container, Graphics>()
49
+
50
+ async composite(
51
+ composition: Composition,
52
+ ) {
53
+ const {stage, renderer} = this.pixi
54
+
55
+ this.#cleanup(this.#collectIds(composition))
56
+ const {dispose} = await this.#renderLayer(composition, stage)
57
+ renderer.render(stage)
58
+
59
+ // make sure browser support webgl/webgpu otherwise it might take much longer to construct frame
60
+ // if its very slow on eg edge try chrome
61
+ const frame = new VideoFrame(renderer.canvas, {
62
+ timestamp: 0,
63
+ duration: 0,
64
+ })
65
+
66
+ dispose()
67
+
68
+ return frame
69
+ }
70
+
71
+ /**
72
+ * get object for current Composition
73
+ * */
74
+ getActiveObject(id: Id) {
75
+ return this.#activeObjects.get(id)?.sprite
76
+ }
77
+
78
+ async #renderLayer(
79
+ layer: Layer | Composition,
80
+ parent: Container,
81
+ ) {
82
+ if (Array.isArray(layer)) {
83
+ const disposers: (() => void)[] = []
84
+ for (const child of [...layer].reverse()) {
85
+ const result = await this.#renderLayer(child, parent)
86
+ disposers.push(result.dispose)
87
+ }
88
+ return {dispose: () => disposers.forEach(d => d())}
89
+ }
90
+
91
+ switch (layer.kind) {
92
+ case 'text':
93
+ return this.#renderTextLayer(layer, parent)
94
+ case 'image':
95
+ return this.#renderImageLayer(layer, parent)
96
+ case 'transition':
97
+ return this.#renderTransitionLayer(layer, parent)
98
+ case 'gap': {
99
+ this.pixi?.renderer.clear()
100
+ return {dispose: () => {}}
101
+ }
102
+ default:
103
+ console.warn('Unknown layer kind', (layer as any).kind)
104
+ return {dispose: () => {}}
105
+ }
106
+ }
107
+
108
+ #renderTextLayer(
109
+ layer: Extract<Layer, {kind: 'text'}>,
110
+ parent: Container,
111
+ ) {
112
+ const sprite = this.#findOrCreate<Text>(layer)!
113
+ sprite.text = layer.content
114
+ if (layer.style)
115
+ sprite.style = layer.style
116
+ this.#applyTransform(sprite, layer.matrix)
117
+ this.#applyAlpha(sprite, layer.alpha)
118
+ this.#applyCrop(sprite, layer.crop)
119
+ this.#applyFilters(sprite, layer.filters)
120
+ parent.addChild(sprite)
121
+ return {
122
+ dispose: () => {}
123
+ }
124
+ }
125
+
126
+ #renderImageLayer(
127
+ layer: Extract<Layer, {kind: 'image'}>,
128
+ parent: Container,
129
+ ) {
130
+ const sprite = this.#findOrCreate<Sprite>(layer)!
131
+
132
+ if (sprite.texture && sprite.texture !== Texture.EMPTY) {
133
+ sprite.texture.destroy(true)
134
+ }
135
+
136
+ const texture = Texture.from(layer.frame)
137
+ sprite.texture = texture
138
+ this.#applyTransform(sprite, layer.matrix)
139
+ this.#applyAlpha(sprite, layer.alpha)
140
+ this.#applyCrop(sprite, layer.crop)
141
+ this.#applyFilters(sprite, layer.filters)
142
+ parent.addChild(sprite)
143
+
144
+ return {
145
+ dispose: () => {
146
+ layer.frame.close()
147
+ }
148
+ }
149
+ }
150
+
151
+ #renderTransitionLayer(
152
+ {from, to, progress, name}: Extract<Layer, {kind: 'transition'}>,
153
+ parent: Container,
154
+ ) {
155
+ const transition = this.#transitions.get(name) ??
156
+ (this.#transitions.set(name, makeTransition({
157
+ name,
158
+ renderer: this.pixi.renderer
159
+ })),
160
+ this.#transitions.get(name)!
161
+ )
162
+ const texture = transition.render({from, to, progress, width: from.displayWidth, height: from.displayHeight})
163
+ const sprite = new Sprite(texture)
164
+ parent.addChild(sprite)
165
+ return {dispose: () => sprite.destroy(false)}
166
+ }
167
+
168
+ #applyTransform(target: Sprite | Text, worldMatrix?: Mat6) {
169
+ if (!worldMatrix) return
170
+ const mx = mat6ToMatrix(worldMatrix)
171
+ target.setFromMatrix(mx)
172
+ }
173
+
174
+ #applyAlpha(target: Container, alpha?: number) {
175
+ target.alpha = alpha ?? 1
176
+ }
177
+
178
+ #applyCrop(target: Container, crop?: Crop) {
179
+ const existing = this.#cropMasks.get(target)
180
+ if (existing) {
181
+ if (target.mask === existing)
182
+ target.mask = null
183
+ existing.removeFromParent()
184
+ existing.clear()
185
+ }
186
+
187
+ if (!crop || crop.every(value => value === 0))
188
+ return
189
+
190
+ const [top, right, bottom, left] = crop
191
+ const activeMask = target.mask
192
+ target.mask = null
193
+ const bounds = target.getLocalBounds()
194
+ target.mask = activeMask
195
+ const x = bounds.x + bounds.width * left
196
+ const y = bounds.y + bounds.height * top
197
+ const width = bounds.width * Math.max(0, 1 - left - right)
198
+ const height = bounds.height * Math.max(0, 1 - top - bottom)
199
+
200
+ const mask = existing ?? new Graphics()
201
+ mask.clear()
202
+ mask.beginFill(0xffffff)
203
+ mask.drawRect(x, y, width, height)
204
+ mask.endFill()
205
+ target.addChild(mask)
206
+ target.mask = mask
207
+ this.#cropMasks.set(target, mask)
208
+ }
209
+
210
+ #applyFilters(target: Container, specs: FilterSpec[] | undefined) {
211
+ if (!specs?.length) {
212
+ target.filters = null
213
+ return
214
+ }
215
+
216
+ target.filters = specs
217
+ .map((spec): Filter | undefined => {
218
+ switch (spec.type) {
219
+ case "ColorMatrixFilter": {
220
+ const {matrix, ...params} = spec.params ?? {}
221
+ const filter = new ColorMatrixFilter(params)
222
+ if (matrix)
223
+ filter.matrix = matrix
224
+ return filter
225
+ }
226
+ case "EmbossFilter":
227
+ return new PixiFilters.EmbossFilter(spec.params?.strength)
228
+ case "PixelateFilter":
229
+ return new PixiFilters.PixelateFilter(spec.params?.size)
230
+ default: {
231
+ const PixiFilter = findPixiFilter(spec.type)
232
+ return PixiFilter ? new PixiFilter(spec.params) : undefined
233
+ }
234
+ }
235
+ })
236
+ .filter((filter): filter is Filter => !!filter)
237
+ }
238
+
239
+ #findOrCreate<T = Container>(layer: Layer) {
240
+ const object = this.#activeObjects.get(layer.id)
241
+ if(!object) {
242
+ switch (layer.kind) {
243
+ case 'text': {
244
+ const text = new Text({
245
+ text: layer.content,
246
+ style: layer.style
247
+ })
248
+ text.eventMode = "static"
249
+ const down = (event: FederatedPointerEvent) => this.onPointerDown.publish({event, id: layer.id, object: text})
250
+ const up = (event: FederatedPointerEvent) => this.onPointerUp.publish({event, id: layer.id, object: text})
251
+ const move = (event: FederatedPointerEvent) => this.onPointerUp.publish({event, id: layer.id, object: text})
252
+
253
+ text.on("pointerdown", down)
254
+ text.on("pointerup", up)
255
+ text.on("pointermove", move)
256
+
257
+ return this.#activeObjects
258
+ .set(layer.id, {
259
+ sprite: text,
260
+ dispose: () => {
261
+ this.onDispose.publish({id: layer.id, object: text})
262
+ text.off("pointermove", move)
263
+ text.off("pointerdown", down)
264
+ text.off("pointerup", up)
265
+ }
266
+ })
267
+ .get(layer.id)?.sprite as T
268
+ }
269
+ case 'image': {
270
+ const sprite = new Sprite()
271
+ sprite.eventMode = "static"
272
+ const down = (event: FederatedPointerEvent) => this.onPointerDown.publish({event, id: layer.id, object: sprite})
273
+ const up = (event: FederatedPointerEvent) => this.onPointerUp.publish({event, id: layer.id, object: sprite})
274
+ const move = (event: FederatedPointerEvent) => this.onPointerUp.publish({event, id: layer.id, object: sprite})
275
+
276
+ sprite.on("pointerdown", down)
277
+ sprite.on("pointermove", move)
278
+ sprite.on("pointerup", up)
279
+
280
+ return this.#activeObjects
281
+ .set(layer.id, {
282
+ sprite,
283
+ dispose: () => {
284
+ this.onDispose.publish({id: layer.id, object: sprite})
285
+ sprite.off("pointerdown", down)
286
+ sprite.off("pointermove", move)
287
+ sprite.off("pointerup", up)
288
+ }
289
+ })
290
+ .get(layer.id)?.sprite as T
291
+ }
292
+ }
293
+ } else return object.sprite as T
294
+ }
295
+
296
+ #collectIds(layers: Layer | Composition): Set<number> {
297
+ const result = new Set<number>()
298
+ const traverse = (node: Layer | Composition) => {
299
+ if (Array.isArray(node)) {
300
+ for (const child of node) traverse(child)
301
+ } else {
302
+ result.add(node.id)
303
+ }
304
+ }
305
+ traverse(layers)
306
+ return result
307
+ }
308
+
309
+ #cleanup(activeIds: Set<number>) {
310
+ for (const id of this.#activeObjects.keys()) {
311
+ if (!activeIds.has(id)) {
312
+ const {sprite, dispose} = this.#activeObjects.get(id)!
313
+ dispose()
314
+ sprite.destroy(true)
315
+ this.#activeObjects.delete(id)
316
+ }
317
+ }
318
+ }
319
+ }
@@ -1,27 +1,26 @@
1
- import {WebMediaInfo} from "web-demuxer"
2
1
 
3
- type Events =
4
- | {type: "config", config: {audio: AudioDecoderConfig, video: VideoDecoderConfig}}
5
- | {type: "info", data: WebMediaInfo}
6
- | {type: "encoderQueueSize", size: number}
7
-
8
- type Handler = (event: Events) => void
2
+ // type Events =
3
+ // | {type: "config", config: {audio: AudioDecoderConfig, video: VideoDecoderConfig}}
4
+ // | {type: "info", data: WebMediaInfo}
5
+ // | {type: "encoderQueueSize", size: number}
6
+ //
7
+ // type Handler = (event: Events) => void
9
8
 
10
9
  export class Machina {
11
10
  count = 0
12
11
 
13
- #handlers = new Map<number, Handler>()
14
-
15
- register(id: number, handler: Handler) {
16
- this.#handlers.set(id, handler)
17
- }
18
-
19
- unregister(id: number) {
20
- this.#handlers.delete(id)
21
- }
22
-
23
- dispatch(id: number, event: Events) {
24
- this.#handlers.get(id)?.(event)
25
- }
12
+ // #handlers = new Map<number, Handler>()
13
+ //
14
+ // register(id: number, handler: Handler) {
15
+ // this.#handlers.set(id, handler)
16
+ // }
17
+ //
18
+ // unregister(id: number) {
19
+ // this.#handlers.delete(id)
20
+ // }
21
+ //
22
+ // dispatch(id: number, event: Events) {
23
+ // this.#handlers.get(id)?.(event)
24
+ // }
26
25
  }
27
26