@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
@@ -0,0 +1,81 @@
1
+
2
+ import {Driver} from "../../driver/driver.js"
3
+ import {Datafile, defaultTranscriberSpec, Item, makeTranscriber, Omni} from "../../timeline/index.js"
4
+
5
+ export async function TimelineSchemaTest(driver: Driver, file: File) {
6
+ const transcriber = await makeTranscriber({
7
+ driver,
8
+ spec: defaultTranscriberSpec(),
9
+ workerUrl: new URL("/features/speech/transcribe/worker.bundle.min.js", import.meta.url),
10
+ onLoading: loading => console.log("transcriber loading", loading),
11
+ })
12
+
13
+ const omni = new Omni(driver)
14
+ const {videoA} = await omni.load({videoA: Datafile.make(file)})
15
+
16
+ const transcript = await transcriber.transcribe({
17
+ source: file,
18
+ language: "english",
19
+ onReport: report => console.log("transcriber report", report),
20
+ onTranscription: text => console.log("transcribing", text),
21
+ })
22
+
23
+ const timeline = omni.timeline(o => {
24
+ const text = o.text("content", {duration: 3000})
25
+ const fade = o.animate.opacity.make("easeIn", [
26
+ [0, 0],
27
+ [700, 1],
28
+ [2200, 1],
29
+ [3000, 0.35],
30
+ ])
31
+ const style = o.textStyle({fill: "green", fontSize: 100})
32
+ const videoSpatial = o.spatial(
33
+ o.transform({
34
+ position: [240, 160],
35
+ scale: [1.4, 1.4],
36
+ rotation: 0.08,
37
+ }),
38
+ [0.15, 0.1, 0.05, 0.2],
39
+ )
40
+ const textSpatial = o.spatial()
41
+ const textMotion = o.animate.transform.make("linear", [
42
+ [0, o.transform({position: [-320, 80], scale: [0.7, 0.7]})],
43
+ [1000, o.transform({position: [120, 80], scale: [1, 1]})],
44
+ [2000, o.transform({position: [200, 40], scale: [1.35, 1.35], rotation: 8})],
45
+ [3000, o.transform({position: [320, 0], scale: [1.15, 1.15], rotation: 0})],
46
+ ])
47
+
48
+ const video = o.video(videoA, {duration: 6000, start: 3000})
49
+ o.set<Item.Text>(text.id, {styleId: style.id, spatialId: textSpatial.id, animationIds: [fade.id, textMotion.id]})
50
+ o.set<Item.Video>(video.id, {spatialId: videoSpatial.id})
51
+
52
+ const visual = o.sequence(
53
+ o.stack(
54
+ text,
55
+ o.captions(video, transcript, {
56
+ maxChars: 34,
57
+ maxDuration: 2800,
58
+ maxSilence: 450,
59
+ styles: {
60
+ fontFamily: "Arial",
61
+ fontSize: 64,
62
+ fill: "#ffffff",
63
+ align: "center",
64
+ wordWrap: true,
65
+ wordWrapWidth: 1280,
66
+ stroke: {color: "#000000", width: 6},
67
+ },
68
+ })
69
+ ),
70
+ o.transition.circle(1500),
71
+ o.video(videoA, {duration: 7000, start: 5000})
72
+ )
73
+
74
+ return o.stack(
75
+ visual,
76
+ o.audio(videoA, {start: 3000, duration: video.duration})
77
+ )
78
+ })
79
+
80
+ return {timeline, omni}
81
+ }
@@ -1,3 +1,4 @@
1
+
1
2
  import {Driver} from "../../driver/driver.js"
2
3
  import {DecoderSource} from "../../driver/fns/schematic.js"
3
4
 
@@ -10,19 +11,23 @@ export function setupTranscodeTest(driver: Driver, source: DecoderSource) {
10
11
  const ctx = canvas.getContext("2d")
11
12
 
12
13
  async function run() {
13
- const readables = driver.decode({
14
+ const video = driver.decodeVideo({
14
15
  source,
15
16
  async onFrame(frame) {
16
17
  const composed = await driver.composite([
17
18
  {
19
+ id: 0,
18
20
  kind: "image",
19
21
  frame
20
22
  },
21
23
  {
24
+ id: 1,
22
25
  kind: "text",
23
26
  content: "omnitool",
24
- fontSize: 50,
25
- color: "green"
27
+ style: {
28
+ fontSize: 50,
29
+ fill: "green"
30
+ }
26
31
  }
27
32
  ])
28
33
  frame.close()
@@ -30,15 +35,26 @@ export function setupTranscodeTest(driver: Driver, source: DecoderSource) {
30
35
  return composed
31
36
  }
32
37
  })
38
+ const audio = driver.decodeAudio({source})
33
39
 
34
- await driver.encode({
35
- readables,
40
+ const {readable, done} = driver.encode({
41
+ video: video.readable,
42
+ audio: audio.readable,
36
43
  config: {
37
44
  audio: {codec: "opus", bitrate: 128000},
38
45
  video: {codec: "vp9", bitrate: 1000000}
39
46
  }
40
47
  })
48
+
49
+ const handle = await window.showSaveFilePicker()
50
+ const writable = await handle.createWritable()
51
+
52
+ await Promise.all([
53
+ readable.pipeTo(writable),
54
+ done
55
+ ])
41
56
  }
42
57
 
43
58
  return {canvas, run}
44
59
  }
60
+
@@ -0,0 +1,34 @@
1
+ import {Driver} from "../../driver/driver.js"
2
+ import {makeTranscriber} from "../../features/speech/transcribe/transcriber.js"
3
+
4
+ export async function transcriberTest(driver: Driver) {
5
+ const transcriber = await makeTranscriber({
6
+ driver,
7
+ spec: {
8
+ model: "onnx-community/whisper-tiny_timestamped",
9
+ device: "webgpu",
10
+ strideLength: 5,
11
+ chunkLength: 30,
12
+ dtype: "fp32"
13
+ },
14
+ workerUrl: new URL("/features/speech/transcribe/worker.bundle.min.js", import.meta.url),
15
+ onLoading({progress, total}) {
16
+ console.log(progress, total, "total")
17
+ },
18
+ })
19
+ return {
20
+ transcribe: async (file: File) => {
21
+ const result = await transcriber.transcribe({
22
+ source: file,
23
+ language: "english",
24
+ onReport(report) {
25
+ console.log("report", report)
26
+ },
27
+ onTranscription(transcription) {
28
+ console.log("transcript", transcription)
29
+ }
30
+ })
31
+ console.log(result, "transcript result")
32
+ }
33
+ }
34
+ }
@@ -0,0 +1,43 @@
1
+ import {Application, Sprite} from "pixi.js"
2
+
3
+ import {Driver} from "../../driver/driver.js"
4
+ import {DecoderSource} from "../../driver/fns/schematic.js"
5
+ import {makeTransition} from "../../features/transition/transition.js"
6
+
7
+ export async function setupTransitionsTest(driver: Driver, source: DecoderSource) {
8
+ const app = new Application()
9
+ await app.init({width: 300, height: 300, preference: "webgl"})
10
+ const sprite = new Sprite({width: 300, height: 300})
11
+
12
+ app.stage.addChild(sprite)
13
+
14
+ document.body.appendChild(app.canvas)
15
+ const transition = makeTransition({name: "circle", renderer: app.renderer})
16
+
17
+ async function run() {
18
+ const video = driver.decodeVideo({
19
+ source,
20
+ async onFrame(frame) {
21
+ const texture = transition.render({
22
+ from: frame,
23
+ to: frame,
24
+ progress: 0.7,
25
+ width: app.canvas.width,
26
+ height: app.canvas.height
27
+ })
28
+ sprite.texture = texture
29
+ return frame
30
+ }
31
+ })
32
+
33
+ driver.encode({
34
+ video: video.readable,
35
+ config: {
36
+ audio: {codec: "opus", bitrate: 128000},
37
+ video: {codec: "vp9", bitrate: 1000000}
38
+ }
39
+ })
40
+ }
41
+
42
+ return {run}
43
+ }
@@ -1,12 +1,39 @@
1
- import {Waveform} from "../../timeline/parts/waveform.js"
2
1
 
3
- export async function waveformTest() {
4
- const container = document.querySelector(".waveform-demo") as HTMLElement
5
- const widthSlider = document.querySelector(".width") as HTMLInputElement
6
- const waveform = await Waveform.init("/assets/temp/gl.mp4", container)
2
+ import {Driver} from "../../driver/driver.js"
3
+ import {Waveform} from "../../timeline/parts/waveform/waveform.js"
7
4
 
8
- widthSlider.addEventListener("change", () => {
9
- const width = +widthSlider.value
10
- waveform.width = width
5
+ export async function waveformTest(driver: Driver, source: File, root: HTMLElement) {
6
+ const container = root.querySelector(".waveform-canvas") as HTMLDivElement
7
+ const widthSlider = root.querySelector(".width") as HTMLInputElement
8
+
9
+ container.replaceChildren()
10
+ container.style.position = "relative"
11
+ container.style.height = "96px"
12
+ container.style.overflow = "hidden"
13
+
14
+ const waveform = await Waveform.init(driver, source, {
15
+ tileHeight: 96,
16
+ onChange: () => renderTiles()
11
17
  })
18
+
19
+ const renderTiles = () => {
20
+ const width = +widthSlider.value
21
+ const zoom = pixelsPerSecond(width, waveform.duration)
22
+ waveform.zoom = zoom
23
+ container.style.width = `${width}px`
24
+ container.replaceChildren(...[...waveform.getTiles().values()].map(tile => {
25
+ tile.canvas.style.position = "absolute"
26
+ tile.canvas.style.top = "0"
27
+ tile.canvas.style.left = `${tile.startTime * pixelsPerSecond(width, waveform.duration)}px`
28
+ tile.canvas.style.height = "100%"
29
+ return tile.canvas
30
+ }))
31
+ }
32
+
33
+ widthSlider.oninput = renderTiles
34
+ waveform.range = [0, waveform.duration]
35
+ }
36
+
37
+ function pixelsPerSecond(width: number, duration: number) {
38
+ return duration > 0 ? width / duration : 0
12
39
  }
@@ -0,0 +1,9 @@
1
+
2
+ import {Comrade} from "@e280/comrade"
3
+ import {setupDriverWork} from "./fns/work.js"
4
+ import {DriverSchematic} from "./fns/schematic.js"
5
+
6
+ export async function driverWorker() {
7
+ await Comrade.worker<DriverSchematic>(setupDriverWork)
8
+ }
9
+
@@ -5,7 +5,7 @@ import {Science, test, expect} from "@e280/science"
5
5
  const workerUrl = new URL("./driver.worker.bundle.js", import.meta.url)
6
6
 
7
7
  export default Science.suite({
8
- "driver hello world": test(async() => {
8
+ "driver hello world": test.skip(async() => {
9
9
  const driver = await Driver.setup({workerUrl})
10
10
  expect(driver.machina.count).is(0)
11
11
  await driver.thread.work.hello()
@@ -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) {
@@ -50,67 +56,70 @@ export class Driver {
50
56
  return await videoTrack?.computeDuration()
51
57
  }
52
58
 
53
- decode(input: DecoderInput) {
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
- const audioTransform = new TransformStream<AudioData, AudioData>()
65
- this.thread.work.decode[tune]({transfer: [videoTransform.writable, audioTransform.writable]})({
70
+ this.thread.work.decodeVideo[tune]({transfer: [videoTransform.writable, port2]})({
66
71
  source: input.source,
72
+ cancel: port2,
67
73
  video: videoTransform.writable,
68
- audio: audioTransform.writable,
74
+ start: input.start,
75
+ end: input.end
69
76
  })
70
77
  return {
71
- audio: audioTransform.readable,
72
- video: videoTransform.readable
78
+ readable: videoTransform.readable,
79
+ /**
80
+ * use this to stop decoding (premature interruption)
81
+ * */
82
+ cancel() {
83
+ port1.postMessage("close")
84
+ port1.close()
85
+ }
73
86
  }
74
87
  }
75
88
 
76
- async encode({readables, config}: EncoderInput) {
77
- const handle = await window.showSaveFilePicker()
78
- const writable = await handle.createWritable()
79
- // making bridge because file picker writable is not transferable
80
- const bridge = new WritableStream<StreamTargetChunk>({
81
- async write(chunk) {
82
- await writable.write(chunk)
83
- },
84
- async close() {
85
- await writable.close()
86
- }
89
+ decodeAudio(input: DecoderInput) {
90
+ const audioTransform = new TransformStream<AudioData, AudioData>()
91
+ const {port1, port2} = new MessageChannel()
92
+ this.thread.work.decodeAudio[tune]({transfer: [audioTransform.writable, port2]})({
93
+ source: input.source,
94
+ cancel: port2,
95
+ audio: audioTransform.writable,
96
+ start: input.start,
97
+ end: input.end
87
98
  })
88
- return await this.thread.work.encode[tune]({transfer: [readables.audio, readables.video, bridge]})({readables, config, bridge})
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
+ }
109
+ }
110
+
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}
89
116
  }
90
117
 
91
118
  async composite(
92
119
  composition: Composition,
93
120
  ) {
94
- const transfer = this.#collectTransferablesFromComposition(composition)
95
- return await this.thread.work.composite[tune]({transfer})(composition)
121
+ return await this.compositor.composite(composition)
96
122
  }
97
123
 
98
- #collectTransferablesFromComposition(composition: Composition) {
99
- const transferables: Transferable[] = []
100
-
101
- const visit = (node: Composition) => {
102
- if (Array.isArray(node)) {
103
- for (const child of node)
104
- visit(child)
105
- }
106
- else if (node && typeof node === 'object' && 'kind' in node) {
107
- if (node.kind === 'image' && node.frame instanceof VideoFrame)
108
- transferables.push(node.frame)
109
- }
110
- }
111
-
112
- visit(composition)
113
- return transferables
114
- }
115
124
  }
116
125
 
@@ -3,10 +3,11 @@ import {Comrade} from "@e280/comrade"
3
3
  import {Machina} from "../parts/machina.js"
4
4
  import {DriverSchematic} from "./schematic.js"
5
5
 
6
- export const setupDriverHost = (machina: Machina) => Comrade.host<DriverSchematic>(({work}, rig) => ({
7
-
8
- async world() {
9
- machina.count++
10
- }
11
- }))
6
+ export const setupDriverHost = (machina: Machina) => (
7
+ Comrade.host<DriverSchematic>(_shell => ({
8
+ async world() {
9
+ machina.count++
10
+ },
11
+ }))
12
+ )
12
13
 
@@ -1,22 +1,37 @@
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"
8
+ import {Mat6} from "../../timeline/utils/matrix.js"
9
+ import {FilterParams, FilterType} from "../../timeline/parts/filters.js"
10
+ import {TransitionName} from "../../timeline/parts/transitions.js"
11
+
5
12
  export type DriverSchematic = AsSchematic<{
6
13
 
7
14
  // happens on the web worker
8
15
  work: {
9
16
  hello(): Promise<void>
10
17
 
11
- decode(input: {
18
+ decodeAudio(input: {
12
19
  source: DecoderSource
13
- video: WritableStream<VideoFrame>
20
+ cancel: MessagePort
14
21
  audio: WritableStream<AudioData>
22
+ start?: number
23
+ end?: number
15
24
  }): Promise<void>
16
25
 
17
- encode(input: EncoderInput & {bridge: WritableStream<StreamTargetChunk>}): Promise<void>
26
+ decodeVideo(input: {
27
+ source: DecoderSource
28
+ cancel: MessagePort
29
+ video: WritableStream<VideoFrame>
30
+ start?: number
31
+ end?: number
32
+ }): Promise<void>
18
33
 
19
- composite(input: Composition): Promise<VideoFrame>
34
+ encode(input: EncoderInput & {writable: WritableStream<StreamTargetChunk>}): Promise<void>
20
35
  }
21
36
 
22
37
  // happens on the main thread
@@ -26,20 +41,22 @@ export type DriverSchematic = AsSchematic<{
26
41
  }>
27
42
 
28
43
  export interface EncoderInput {
29
- readables: {
30
- video: ReadableStream<VideoFrame>
31
- audio: ReadableStream<AudioData>
32
- },
33
- config: {
34
- video: VideoEncodingConfig
35
- audio: AudioEncodingConfig
36
- }
44
+ video?: ReadableStream<VideoFrame>
45
+ audio?: ReadableStream<AudioData>
46
+ config: RenderConfig
47
+ }
48
+
49
+ export interface RenderConfig {
50
+ video: VideoEncodingConfig
51
+ audio: AudioEncodingConfig
37
52
  }
38
53
 
39
- export type DecoderSource = FileSystemFileHandle | string
54
+ export type DecoderSource = Blob | string | URL
40
55
 
41
56
  export interface DecoderInput {
42
57
  source: DecoderSource
58
+ start?: number
59
+ end?: number
43
60
  onFrame?: (frame: VideoFrame) => Promise<VideoFrame>
44
61
  }
45
62
 
@@ -59,25 +76,52 @@ export interface MuxOpts {
59
76
 
60
77
  export type Composition = Layer | (Layer | Composition)[]
61
78
 
62
- export type Transform = {
63
- x?: number
64
- y?: number
65
- scale?: number
66
- opacity?: number
67
- anchor?: number
68
- }
79
+ export type FilterSpec = {
80
+ [TFilter in FilterType]: {
81
+ type: TFilter
82
+ params?: FilterParams<TFilter>
83
+ }
84
+ }[FilterType]
69
85
 
70
86
  export type TextLayer = {
87
+ id: Id
71
88
  kind: 'text'
72
89
  content: string
73
- fontSize?: number
74
- color?: string
75
- } & Transform
90
+ style?: TextStyleOptions
91
+ matrix?: Mat6
92
+ alpha?: number
93
+ crop?: Crop
94
+ filters?: FilterSpec[]
95
+ }
76
96
 
77
97
  export type ImageLayer = {
98
+ id: Id
78
99
  kind: 'image'
79
100
  frame: VideoFrame
80
- } & Transform
101
+ matrix?: Mat6
102
+ alpha?: number
103
+ crop?: Crop
104
+ filters?: FilterSpec[]
105
+ }
81
106
 
82
- export type Layer = TextLayer | ImageLayer
107
+ export type TransitionLayer = {
108
+ id: Id
109
+ kind: 'transition'
110
+ name: TransitionName
111
+ progress: number
112
+ from: VideoFrame
113
+ to: VideoFrame
114
+ }
115
+
116
+ export type GapLayer = {
117
+ id: Id
118
+ kind: 'gap'
119
+ }
120
+
121
+ export type Audio = {
122
+ id: Id
123
+ kind: "audio"
124
+ data: AudioData
125
+ }
83
126
 
127
+ export type Layer = TextLayer | ImageLayer | TransitionLayer | GapLayer