@omnimedia/omnitool 1.1.0-7 → 1.1.0-71

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 (410) hide show
  1. package/README.md +143 -80
  2. package/package.json +18 -17
  3. package/s/context.ts +0 -7
  4. package/s/demo/demo.bundle.ts +104 -43
  5. package/s/demo/demo.css +244 -14
  6. package/s/demo/routines/export-test.ts +16 -0
  7. package/s/demo/routines/filmstrip-test.ts +22 -18
  8. package/s/demo/routines/load-video.ts +2 -3
  9. package/s/demo/routines/playback-test.ts +61 -0
  10. package/s/demo/routines/timeline-setup.ts +24 -0
  11. package/s/demo/routines/transcode-test.ts +19 -5
  12. package/s/demo/routines/transitions-test.ts +2 -2
  13. package/s/demo/routines/waveform-test.ts +35 -8
  14. package/s/driver/driver-worker.ts +9 -0
  15. package/s/driver/driver.test.ts +1 -1
  16. package/s/driver/driver.ts +43 -42
  17. package/s/driver/fns/schematic.ts +11 -5
  18. package/s/driver/fns/work.ts +65 -189
  19. package/s/driver/parts/compositor.ts +219 -0
  20. package/s/driver/parts/machina.ts +19 -20
  21. package/s/index.html.ts +103 -25
  22. package/s/index.ts +1 -0
  23. package/s/tests.bundle.ts +11 -0
  24. package/s/tests.html.ts +28 -0
  25. package/s/timeline/index.ts +5 -0
  26. package/s/timeline/parts/filmstrip.ts +43 -16
  27. package/s/timeline/parts/item.ts +27 -6
  28. package/s/timeline/parts/media.ts +12 -2
  29. package/s/timeline/parts/resource-pool.ts +8 -5
  30. package/s/timeline/parts/resource.ts +3 -0
  31. package/s/timeline/parts/waveform/parts/collect.ts +72 -0
  32. package/s/timeline/parts/waveform/parts/render.ts +45 -0
  33. package/s/timeline/parts/waveform/parts/types.ts +24 -0
  34. package/s/timeline/parts/waveform/waveform.ts +161 -0
  35. package/s/timeline/renderers/export/parts/audio-gain.ts +17 -0
  36. package/s/timeline/renderers/export/parts/audio-mix.ts +133 -0
  37. package/s/timeline/renderers/export/parts/cursor.ts +129 -0
  38. package/s/timeline/renderers/export/parts/produce-audio.ts +64 -0
  39. package/s/timeline/renderers/export/parts/produce-video.ts +49 -0
  40. package/s/timeline/renderers/export/parts/resamplers.ts +48 -0
  41. package/s/timeline/renderers/export/produce.ts +28 -0
  42. package/s/timeline/renderers/parts/handy.ts +360 -0
  43. package/s/timeline/renderers/parts/samplers/audio/parts/find.ts +19 -0
  44. package/s/timeline/renderers/parts/samplers/audio/parts/init.ts +60 -0
  45. package/s/timeline/renderers/parts/samplers/audio/parts/sink.ts +38 -0
  46. package/s/timeline/renderers/parts/samplers/audio/parts/types.ts +16 -0
  47. package/s/timeline/renderers/parts/samplers/audio/sampler.ts +35 -0
  48. package/s/timeline/renderers/parts/samplers/visual/parts/defaults.ts +16 -0
  49. package/s/timeline/renderers/parts/samplers/visual/parts/sample.ts +59 -0
  50. package/s/timeline/renderers/parts/samplers/visual/parts/sequence.ts +111 -0
  51. package/s/timeline/renderers/parts/samplers/visual/parts/sink.ts +38 -0
  52. package/s/timeline/renderers/parts/samplers/visual/parts/transition.ts +28 -0
  53. package/s/timeline/renderers/parts/samplers/visual/parts/types.ts +10 -0
  54. package/s/timeline/renderers/parts/samplers/visual/sampler.ts +28 -0
  55. package/s/timeline/renderers/parts/schedulers.ts +96 -0
  56. package/s/timeline/renderers/player/parts/playback.ts +159 -0
  57. package/s/timeline/renderers/player/player.ts +77 -0
  58. package/s/timeline/renderers/renderers.test.ts +385 -0
  59. package/s/timeline/sugar/helpers.ts +85 -0
  60. package/s/timeline/sugar/o.ts +138 -57
  61. package/s/timeline/sugar/omni.test.ts +210 -0
  62. package/s/timeline/sugar/omni.ts +35 -12
  63. package/s/timeline/utils/checksum.ts +3 -1
  64. package/s/timeline/utils/datafile.ts +15 -4
  65. package/s/timeline/utils/dummy-data.ts +3 -3
  66. package/s/units/fps.ts +8 -0
  67. package/s/units/ms.ts +8 -0
  68. package/s/units/seconds.ts +8 -0
  69. package/x/WebGLRenderer-7X274AYV.js +2 -0
  70. package/x/WebGLRenderer-7X274AYV.js.map +7 -0
  71. package/x/WebGPURenderer-XMCMEXAO.js +2 -0
  72. package/x/WebGPURenderer-XMCMEXAO.js.map +7 -0
  73. package/x/browserAll-6TVTCHHE.js +2 -0
  74. package/x/browserAll-6TVTCHHE.js.map +7 -0
  75. package/x/chunk-4ONWQOPX.js +157 -0
  76. package/x/chunk-4ONWQOPX.js.map +7 -0
  77. package/x/chunk-63NSCXPX.js +2 -0
  78. package/x/chunk-63NSCXPX.js.map +7 -0
  79. package/x/chunk-A45M2HJC.js +2 -0
  80. package/x/chunk-A45M2HJC.js.map +7 -0
  81. package/x/chunk-OTQK6FAJ.js +15 -0
  82. package/x/chunk-OTQK6FAJ.js.map +7 -0
  83. package/x/chunk-Q7JBQNE4.js +42 -0
  84. package/x/chunk-Q7JBQNE4.js.map +7 -0
  85. package/x/chunk-W33LM336.js +393 -0
  86. package/x/chunk-W33LM336.js.map +7 -0
  87. package/x/chunk-W5CN46AR.js +327 -0
  88. package/x/chunk-W5CN46AR.js.map +7 -0
  89. package/x/chunk-WFT3KTZG.js +269 -0
  90. package/x/chunk-WFT3KTZG.js.map +7 -0
  91. package/x/context.d.ts +1 -4
  92. package/x/context.js +1 -5
  93. package/x/context.js.map +1 -1
  94. package/x/demo/WebGLRenderer-NLGJGAXK.js +2 -0
  95. package/x/demo/WebGLRenderer-NLGJGAXK.js.map +7 -0
  96. package/x/demo/WebGPURenderer-RBOFXPL5.js +2 -0
  97. package/x/demo/WebGPURenderer-RBOFXPL5.js.map +7 -0
  98. package/x/demo/browserAll-5AZHDDG6.js +2 -0
  99. package/x/demo/browserAll-5AZHDDG6.js.map +7 -0
  100. package/x/demo/chunk-5ZZYIILO.js +393 -0
  101. package/x/demo/chunk-5ZZYIILO.js.map +7 -0
  102. package/x/demo/chunk-P3PTHHFE.js +42 -0
  103. package/x/demo/chunk-P3PTHHFE.js.map +7 -0
  104. package/x/demo/chunk-PYG4RZZ2.js +269 -0
  105. package/x/demo/chunk-PYG4RZZ2.js.map +7 -0
  106. package/x/demo/chunk-Q4MWBZHL.js +157 -0
  107. package/x/demo/chunk-Q4MWBZHL.js.map +7 -0
  108. package/x/demo/chunk-T3METYEY.js +15 -0
  109. package/x/demo/chunk-T3METYEY.js.map +7 -0
  110. package/x/demo/chunk-USLRKDKD.js +2 -0
  111. package/x/demo/chunk-USLRKDKD.js.map +7 -0
  112. package/x/demo/chunk-YISSXWBT.js +327 -0
  113. package/x/demo/chunk-YISSXWBT.js.map +7 -0
  114. package/x/demo/chunk-YJQWVIHX.js +2 -0
  115. package/x/demo/chunk-YJQWVIHX.js.map +7 -0
  116. package/x/demo/demo.bundle.js +94 -40
  117. package/x/demo/demo.bundle.js.map +1 -1
  118. package/x/demo/demo.bundle.min.js +2421 -81
  119. package/x/demo/demo.bundle.min.js.map +4 -4
  120. package/x/demo/demo.css +244 -14
  121. package/x/demo/routines/export-test.d.ts +2 -0
  122. package/x/demo/routines/export-test.js +10 -0
  123. package/x/demo/routines/export-test.js.map +1 -0
  124. package/x/demo/routines/filmstrip-test.d.ts +1 -1
  125. package/x/demo/routines/filmstrip-test.js +20 -17
  126. package/x/demo/routines/filmstrip-test.js.map +1 -1
  127. package/x/demo/routines/load-video.d.ts +1 -1
  128. package/x/demo/routines/load-video.js +1 -2
  129. package/x/demo/routines/load-video.js.map +1 -1
  130. package/x/demo/routines/playback-test.d.ts +2 -0
  131. package/x/demo/routines/playback-test.js +51 -0
  132. package/x/demo/routines/playback-test.js.map +1 -0
  133. package/x/demo/routines/timeline-setup.d.ts +6 -0
  134. package/x/demo/routines/timeline-setup.js +13 -0
  135. package/x/demo/routines/timeline-setup.js.map +1 -0
  136. package/x/demo/routines/transcode-test.js +15 -5
  137. package/x/demo/routines/transcode-test.js.map +1 -1
  138. package/x/demo/routines/transitions-test.js +2 -2
  139. package/x/demo/routines/transitions-test.js.map +1 -1
  140. package/x/demo/routines/waveform-test.d.ts +2 -1
  141. package/x/demo/routines/waveform-test.js +29 -8
  142. package/x/demo/routines/waveform-test.js.map +1 -1
  143. package/x/demo/webworkerAll-QKIC5O27.js +2 -0
  144. package/x/demo/webworkerAll-QKIC5O27.js.map +7 -0
  145. package/x/driver/driver-worker.d.ts +1 -0
  146. package/x/driver/driver-worker.js +6 -0
  147. package/x/driver/driver-worker.js.map +1 -0
  148. package/x/driver/driver.d.ts +25 -8
  149. package/x/driver/driver.js +43 -39
  150. package/x/driver/driver.js.map +1 -1
  151. package/x/driver/driver.test.js +1 -1
  152. package/x/driver/driver.test.js.map +1 -1
  153. package/x/driver/driver.worker.bundle.min.js +117 -3506
  154. package/x/driver/driver.worker.bundle.min.js.map +4 -4
  155. package/x/driver/fns/host.d.ts +3 -2
  156. package/x/driver/fns/schematic.d.ts +11 -4
  157. package/x/driver/fns/work.d.ts +4 -4
  158. package/x/driver/fns/work.js +55 -155
  159. package/x/driver/fns/work.js.map +1 -1
  160. package/x/driver/parts/compositor.d.ts +28 -0
  161. package/x/driver/parts/compositor.js +186 -0
  162. package/x/driver/parts/compositor.js.map +1 -0
  163. package/x/driver/parts/machina.d.ts +0 -20
  164. package/x/driver/parts/machina.js +6 -10
  165. package/x/driver/parts/machina.js.map +1 -1
  166. package/x/features/speech/transcribe/parts/prep-audio.d.ts +1 -1
  167. package/x/features/speech/transcribe/worker.bundle.min.js +899 -899
  168. package/x/features/speech/transcribe/worker.bundle.min.js.map +4 -4
  169. package/x/index.d.ts +1 -0
  170. package/x/index.html +347 -38
  171. package/x/index.html.js +103 -24
  172. package/x/index.html.js.map +1 -1
  173. package/x/index.js +1 -0
  174. package/x/index.js.map +1 -1
  175. package/x/tests.bundle.js +8 -0
  176. package/x/tests.bundle.js.map +1 -0
  177. package/x/tests.bundle.min.js +2464 -0
  178. package/x/tests.bundle.min.js.map +7 -0
  179. package/x/tests.html +316 -0
  180. package/x/tests.html.d.ts +2 -0
  181. package/x/tests.html.js +22 -0
  182. package/x/tests.html.js.map +1 -0
  183. package/x/timeline/index.d.ts +4 -0
  184. package/x/timeline/index.js +4 -0
  185. package/x/timeline/index.js.map +1 -1
  186. package/x/timeline/parts/filmstrip.d.ts +4 -3
  187. package/x/timeline/parts/filmstrip.js +29 -10
  188. package/x/timeline/parts/filmstrip.js.map +1 -1
  189. package/x/timeline/parts/item.d.ts +20 -3
  190. package/x/timeline/parts/item.js +1 -0
  191. package/x/timeline/parts/item.js.map +1 -1
  192. package/x/timeline/parts/media.d.ts +2 -0
  193. package/x/timeline/parts/media.js +11 -2
  194. package/x/timeline/parts/media.js.map +1 -1
  195. package/x/timeline/parts/resource-pool.d.ts +3 -0
  196. package/x/timeline/parts/resource-pool.js +7 -4
  197. package/x/timeline/parts/resource-pool.js.map +1 -1
  198. package/x/timeline/parts/resource.d.ts +3 -0
  199. package/x/timeline/parts/waveform/parts/collect.d.ts +11 -0
  200. package/x/timeline/parts/waveform/parts/collect.js +56 -0
  201. package/x/timeline/parts/waveform/parts/collect.js.map +1 -0
  202. package/x/timeline/parts/waveform/parts/render.d.ts +5 -0
  203. package/x/timeline/parts/waveform/parts/render.js +29 -0
  204. package/x/timeline/parts/waveform/parts/render.js.map +1 -0
  205. package/x/timeline/parts/waveform/parts/types.d.ts +21 -0
  206. package/x/timeline/parts/waveform/parts/types.js.map +1 -0
  207. package/x/timeline/parts/waveform/waveform.d.ts +19 -0
  208. package/x/timeline/parts/waveform/waveform.js +133 -0
  209. package/x/timeline/parts/waveform/waveform.js.map +1 -0
  210. package/x/timeline/renderers/export/parts/audio-gain.d.ts +1 -0
  211. package/x/timeline/renderers/export/parts/audio-gain.js +13 -0
  212. package/x/timeline/renderers/export/parts/audio-gain.js.map +1 -0
  213. package/x/timeline/renderers/export/parts/audio-mix.d.ts +21 -0
  214. package/x/timeline/renderers/export/parts/audio-mix.js +89 -0
  215. package/x/timeline/renderers/export/parts/audio-mix.js.map +1 -0
  216. package/x/timeline/renderers/export/parts/cursor.d.ts +18 -0
  217. package/x/timeline/renderers/export/parts/cursor.js +99 -0
  218. package/x/timeline/renderers/export/parts/cursor.js.map +1 -0
  219. package/x/timeline/renderers/export/parts/produce-audio.d.ts +6 -0
  220. package/x/timeline/renderers/export/parts/produce-audio.js +41 -0
  221. package/x/timeline/renderers/export/parts/produce-audio.js.map +1 -0
  222. package/x/timeline/renderers/export/parts/produce-video.d.ts +10 -0
  223. package/x/timeline/renderers/export/parts/produce-video.js +26 -0
  224. package/x/timeline/renderers/export/parts/produce-video.js.map +1 -0
  225. package/x/timeline/renderers/export/parts/resamplers.d.ts +12 -0
  226. package/x/timeline/renderers/export/parts/resamplers.js +29 -0
  227. package/x/timeline/renderers/export/parts/resamplers.js.map +1 -0
  228. package/x/timeline/renderers/export/produce.d.ts +13 -0
  229. package/x/timeline/renderers/export/produce.js +15 -0
  230. package/x/timeline/renderers/export/produce.js.map +1 -0
  231. package/x/timeline/renderers/parts/handy.d.ts +30 -0
  232. package/x/timeline/renderers/parts/handy.js +219 -0
  233. package/x/timeline/renderers/parts/handy.js.map +1 -0
  234. package/x/timeline/renderers/parts/samplers/audio/parts/find.d.ts +6 -0
  235. package/x/timeline/renderers/parts/samplers/audio/parts/find.js +15 -0
  236. package/x/timeline/renderers/parts/samplers/audio/parts/find.js.map +1 -0
  237. package/x/timeline/renderers/parts/samplers/audio/parts/init.d.ts +5 -0
  238. package/x/timeline/renderers/parts/samplers/audio/parts/init.js +40 -0
  239. package/x/timeline/renderers/parts/samplers/audio/parts/init.js.map +1 -0
  240. package/x/timeline/renderers/parts/samplers/audio/parts/sink.d.ts +8 -0
  241. package/x/timeline/renderers/parts/samplers/audio/parts/sink.js +24 -0
  242. package/x/timeline/renderers/parts/samplers/audio/parts/sink.js.map +1 -0
  243. package/x/timeline/renderers/parts/samplers/audio/parts/types.d.ts +14 -0
  244. package/x/timeline/renderers/parts/samplers/audio/parts/types.js +2 -0
  245. package/x/timeline/renderers/parts/samplers/audio/parts/types.js.map +1 -0
  246. package/x/timeline/renderers/parts/samplers/audio/sampler.d.ts +11 -0
  247. package/x/timeline/renderers/parts/samplers/audio/sampler.js +22 -0
  248. package/x/timeline/renderers/parts/samplers/audio/sampler.js.map +1 -0
  249. package/x/timeline/renderers/parts/samplers/visual/parts/defaults.d.ts +5 -0
  250. package/x/timeline/renderers/parts/samplers/visual/parts/defaults.js +10 -0
  251. package/x/timeline/renderers/parts/samplers/visual/parts/defaults.js.map +1 -0
  252. package/x/timeline/renderers/parts/samplers/visual/parts/sample.d.ts +5 -0
  253. package/x/timeline/renderers/parts/samplers/visual/parts/sample.js +38 -0
  254. package/x/timeline/renderers/parts/samplers/visual/parts/sample.js.map +1 -0
  255. package/x/timeline/renderers/parts/samplers/visual/parts/sequence.d.ts +5 -0
  256. package/x/timeline/renderers/parts/samplers/visual/parts/sequence.js +75 -0
  257. package/x/timeline/renderers/parts/samplers/visual/parts/sequence.js.map +1 -0
  258. package/x/timeline/renderers/parts/samplers/visual/parts/sink.d.ts +8 -0
  259. package/x/timeline/renderers/parts/samplers/visual/parts/sink.js +24 -0
  260. package/x/timeline/renderers/parts/samplers/visual/parts/sink.js.map +1 -0
  261. package/x/timeline/renderers/parts/samplers/visual/parts/transition.d.ts +3 -0
  262. package/x/timeline/renderers/parts/samplers/visual/parts/transition.js +18 -0
  263. package/x/timeline/renderers/parts/samplers/visual/parts/transition.js.map +1 -0
  264. package/x/timeline/renderers/parts/samplers/visual/parts/types.d.ts +8 -0
  265. package/x/timeline/renderers/parts/samplers/visual/parts/types.js +2 -0
  266. package/x/timeline/renderers/parts/samplers/visual/parts/types.js.map +1 -0
  267. package/x/timeline/renderers/parts/samplers/visual/sampler.d.ts +7 -0
  268. package/x/timeline/renderers/parts/samplers/visual/sampler.js +17 -0
  269. package/x/timeline/renderers/parts/samplers/visual/sampler.js.map +1 -0
  270. package/x/timeline/renderers/parts/schedulers.d.ts +17 -0
  271. package/x/timeline/renderers/parts/schedulers.js +64 -0
  272. package/x/timeline/renderers/parts/schedulers.js.map +1 -0
  273. package/x/timeline/renderers/player/parts/playback.d.ts +36 -0
  274. package/x/timeline/renderers/player/parts/playback.js +113 -0
  275. package/x/timeline/renderers/player/parts/playback.js.map +1 -0
  276. package/x/timeline/renderers/player/player.d.ts +25 -0
  277. package/x/timeline/renderers/player/player.js +56 -0
  278. package/x/timeline/renderers/player/player.js.map +1 -0
  279. package/x/timeline/renderers/renderers.test.d.ts +32 -0
  280. package/x/timeline/renderers/renderers.test.js +305 -0
  281. package/x/timeline/renderers/renderers.test.js.map +1 -0
  282. package/x/timeline/sugar/helpers.d.ts +30 -0
  283. package/x/timeline/sugar/helpers.js +46 -0
  284. package/x/timeline/sugar/helpers.js.map +1 -0
  285. package/x/timeline/sugar/o.d.ts +28 -13
  286. package/x/timeline/sugar/o.js +108 -51
  287. package/x/timeline/sugar/o.js.map +1 -1
  288. package/x/timeline/sugar/omni.d.ts +11 -6
  289. package/x/timeline/sugar/omni.js +28 -8
  290. package/x/timeline/sugar/omni.js.map +1 -1
  291. package/x/timeline/sugar/omni.test.d.ts +27 -0
  292. package/x/timeline/sugar/omni.test.js +128 -0
  293. package/x/timeline/sugar/omni.test.js.map +1 -0
  294. package/x/timeline/utils/checksum.d.ts +3 -2
  295. package/x/timeline/utils/checksum.js.map +1 -1
  296. package/x/timeline/utils/datafile.d.ts +5 -3
  297. package/x/timeline/utils/datafile.js +18 -5
  298. package/x/timeline/utils/datafile.js.map +1 -1
  299. package/x/timeline/utils/dummy-data.d.ts +1 -2
  300. package/x/timeline/utils/dummy-data.js +4 -2
  301. package/x/timeline/utils/dummy-data.js.map +1 -1
  302. package/x/units/fps.d.ts +6 -0
  303. package/x/units/fps.js +2 -0
  304. package/x/units/fps.js.map +1 -0
  305. package/x/units/ms.d.ts +6 -0
  306. package/x/units/ms.js +2 -0
  307. package/x/units/ms.js.map +1 -0
  308. package/x/units/seconds.d.ts +6 -0
  309. package/x/units/seconds.js +2 -0
  310. package/x/units/seconds.js.map +1 -0
  311. package/x/webworkerAll-VVIU3M54.js +2 -0
  312. package/x/webworkerAll-VVIU3M54.js.map +7 -0
  313. package/s/tests.test.ts +0 -8
  314. package/s/timeline/parts/compositor/export.ts +0 -77
  315. package/s/timeline/parts/compositor/parts/html-tree.ts +0 -37
  316. package/s/timeline/parts/compositor/parts/schedulers.ts +0 -85
  317. package/s/timeline/parts/compositor/parts/tree-builder.ts +0 -184
  318. package/s/timeline/parts/compositor/parts/webcodecs-tree.ts +0 -30
  319. package/s/timeline/parts/compositor/playback.ts +0 -81
  320. package/s/timeline/parts/compositor/samplers/html.ts +0 -115
  321. package/s/timeline/parts/compositor/samplers/webcodecs.ts +0 -60
  322. package/s/timeline/parts/waveform.ts +0 -62
  323. package/s/timeline/sugar/builders.ts +0 -102
  324. package/s/timeline/sugar/omni-test.ts +0 -38
  325. package/s/timeline/timeline.ts +0 -22
  326. package/s/timeline/utils/audio-stream.ts +0 -15
  327. package/s/timeline/utils/video-cursor.ts +0 -40
  328. package/s/tools/common/loader.ts +0 -26
  329. package/s/tools/common/transformer-pipeline.ts +0 -26
  330. package/s/tools/speech-recognition/common/model.ts +0 -26
  331. package/s/tools/speech-recognition/whisper/fns/host.ts +0 -25
  332. package/s/tools/speech-recognition/whisper/fns/schematic.ts +0 -23
  333. package/s/tools/speech-recognition/whisper/fns/work.ts +0 -91
  334. package/s/tools/speech-recognition/whisper/parts/types.ts +0 -38
  335. package/s/tools/speech-recognition/whisper/parts/worker.bundle.ts +0 -7
  336. package/s/tools/speech-recognition/whisper/tool.ts +0 -70
  337. package/x/tests.test.js +0 -6
  338. package/x/tests.test.js.map +0 -1
  339. package/x/timeline/parts/compositor/export.d.ts +0 -9
  340. package/x/timeline/parts/compositor/export.js +0 -64
  341. package/x/timeline/parts/compositor/export.js.map +0 -1
  342. package/x/timeline/parts/compositor/parts/html-tree.d.ts +0 -3
  343. package/x/timeline/parts/compositor/parts/html-tree.js +0 -40
  344. package/x/timeline/parts/compositor/parts/html-tree.js.map +0 -1
  345. package/x/timeline/parts/compositor/parts/schedulers.d.ts +0 -15
  346. package/x/timeline/parts/compositor/parts/schedulers.js +0 -64
  347. package/x/timeline/parts/compositor/parts/schedulers.js.map +0 -1
  348. package/x/timeline/parts/compositor/parts/tree-builder.d.ts +0 -37
  349. package/x/timeline/parts/compositor/parts/tree-builder.js +0 -147
  350. package/x/timeline/parts/compositor/parts/tree-builder.js.map +0 -1
  351. package/x/timeline/parts/compositor/parts/webcodecs-tree.d.ts +0 -3
  352. package/x/timeline/parts/compositor/parts/webcodecs-tree.js +0 -28
  353. package/x/timeline/parts/compositor/parts/webcodecs-tree.js.map +0 -1
  354. package/x/timeline/parts/compositor/playback.d.ts +0 -19
  355. package/x/timeline/parts/compositor/playback.js +0 -71
  356. package/x/timeline/parts/compositor/playback.js.map +0 -1
  357. package/x/timeline/parts/compositor/samplers/html.d.ts +0 -3
  358. package/x/timeline/parts/compositor/samplers/html.js +0 -106
  359. package/x/timeline/parts/compositor/samplers/html.js.map +0 -1
  360. package/x/timeline/parts/compositor/samplers/webcodecs.d.ts +0 -2
  361. package/x/timeline/parts/compositor/samplers/webcodecs.js +0 -55
  362. package/x/timeline/parts/compositor/samplers/webcodecs.js.map +0 -1
  363. package/x/timeline/parts/waveform.d.ts +0 -8
  364. package/x/timeline/parts/waveform.js +0 -51
  365. package/x/timeline/parts/waveform.js.map +0 -1
  366. package/x/timeline/sugar/builders.d.ts +0 -96
  367. package/x/timeline/sugar/builders.js +0 -108
  368. package/x/timeline/sugar/builders.js.map +0 -1
  369. package/x/timeline/sugar/omni-test.d.ts +0 -1
  370. package/x/timeline/sugar/omni-test.js +0 -22
  371. package/x/timeline/sugar/omni-test.js.map +0 -1
  372. package/x/timeline/timeline.d.ts +0 -9
  373. package/x/timeline/timeline.js +0 -22
  374. package/x/timeline/timeline.js.map +0 -1
  375. package/x/timeline/utils/audio-stream.d.ts +0 -6
  376. package/x/timeline/utils/audio-stream.js +0 -17
  377. package/x/timeline/utils/audio-stream.js.map +0 -1
  378. package/x/timeline/utils/video-cursor.d.ts +0 -10
  379. package/x/timeline/utils/video-cursor.js +0 -36
  380. package/x/timeline/utils/video-cursor.js.map +0 -1
  381. package/x/tools/common/loader.d.ts +0 -19
  382. package/x/tools/common/loader.js +0 -18
  383. package/x/tools/common/loader.js.map +0 -1
  384. package/x/tools/common/transformer-pipeline.d.ts +0 -8
  385. package/x/tools/common/transformer-pipeline.js +0 -24
  386. package/x/tools/common/transformer-pipeline.js.map +0 -1
  387. package/x/tools/speech-recognition/common/model.d.ts +0 -14
  388. package/x/tools/speech-recognition/common/model.js +0 -16
  389. package/x/tools/speech-recognition/common/model.js.map +0 -1
  390. package/x/tools/speech-recognition/whisper/fns/host.d.ts +0 -13
  391. package/x/tools/speech-recognition/whisper/fns/host.js +0 -19
  392. package/x/tools/speech-recognition/whisper/fns/host.js.map +0 -1
  393. package/x/tools/speech-recognition/whisper/fns/schematic.d.ts +0 -19
  394. package/x/tools/speech-recognition/whisper/fns/schematic.js +0 -2
  395. package/x/tools/speech-recognition/whisper/fns/schematic.js.map +0 -1
  396. package/x/tools/speech-recognition/whisper/fns/work.d.ts +0 -12
  397. package/x/tools/speech-recognition/whisper/fns/work.js +0 -74
  398. package/x/tools/speech-recognition/whisper/fns/work.js.map +0 -1
  399. package/x/tools/speech-recognition/whisper/parts/types.d.ts +0 -31
  400. package/x/tools/speech-recognition/whisper/parts/types.js.map +0 -1
  401. package/x/tools/speech-recognition/whisper/parts/worker.bundle.d.ts +0 -1
  402. package/x/tools/speech-recognition/whisper/parts/worker.bundle.js +0 -4
  403. package/x/tools/speech-recognition/whisper/parts/worker.bundle.js.map +0 -1
  404. package/x/tools/speech-recognition/whisper/parts/worker.bundle.min.js +0 -8
  405. package/x/tools/speech-recognition/whisper/parts/worker.bundle.min.js.map +0 -7
  406. package/x/tools/speech-recognition/whisper/tool.d.ts +0 -12
  407. package/x/tools/speech-recognition/whisper/tool.js +0 -63
  408. package/x/tools/speech-recognition/whisper/tool.js.map +0 -1
  409. /package/x/{tests.test.d.ts → tests.bundle.d.ts} +0 -0
  410. /package/x/{tools/speech-recognition/whisper → timeline/parts/waveform}/parts/types.js +0 -0
@@ -0,0 +1,385 @@
1
+
2
+ import {Science, test, expect} from "@e280/science"
3
+
4
+ import {O} from "../sugar/o.js"
5
+ import {ms} from "../../units/ms.js"
6
+ import {Omni} from "../sugar/omni.js"
7
+ import {fps} from "../../units/fps.js"
8
+ import {Datafile} from "../utils/datafile.js"
9
+ import {Driver} from "../../driver/driver.js"
10
+ import {AudioMix} from "./export/parts/audio-mix.js"
11
+ import {produceAudio} from "./export/parts/produce-audio.js"
12
+ import {resampleToPlanar} from "./export/parts/resamplers.js"
13
+ import {loadVideo} from "../../demo/routines/load-video.js"
14
+ import {produceVideo} from "./export/parts/produce-video.js"
15
+ import {CursorVisualSampler} from "./export/parts/cursor.js"
16
+ import {applyGainToPlanar} from "./export/parts/audio-gain.js"
17
+ import {createVisualSampler} from "./parts/samplers/visual/sampler.js"
18
+
19
+ const workerUrl = new URL("../driver/driver.worker.bundle.min.js", import.meta.url)
20
+ export async function setupTest() {
21
+ const driver = await Driver.setup({workerUrl})
22
+ const omni = new Omni(driver)
23
+
24
+ const testVideo = await loadVideo("/assets/temp/test.mp4")
25
+ const {videoA} = await omni.load({videoA: Datafile.make(testVideo, "test.mp4")})
26
+
27
+ const resolveMedia = (hash: string) => omni.resources.require(hash).blob
28
+
29
+ return {driver, omni, testVideo, videoA, resolveMedia}
30
+ }
31
+
32
+ async function collect<T>(iterable: AsyncIterable<T>) {
33
+ const out: T[] = []
34
+ for await (const item of iterable)
35
+ out.push(item)
36
+ return out
37
+ }
38
+
39
+ const near = (actual: number, expected: number, eps = 1e-6) =>
40
+ Math.abs(actual - expected) < eps
41
+
42
+ export default Science.suite({
43
+
44
+ "cursor visual sampler cannot get previous samples": test(async () => {
45
+ const {omni, videoA, resolveMedia, driver} = await setupTest()
46
+ const {timeline} = new O({timeline: omni.timeline(o => o.sequence(
47
+ o.video(videoA, {duration: 2000}),
48
+ o.gap(500),
49
+ o.video(videoA, {duration: 2000}),
50
+ o.audio(videoA, {duration: 500}),
51
+ ))})
52
+ const cursor = new CursorVisualSampler(driver, resolveMedia, timeline)
53
+ await cursor.next(ms(1000))
54
+ await expect(async () => await cursor.next(ms(100))).throwsAsync()
55
+ }),
56
+
57
+ "visual sampler gives correct layer at x time": test(async () => {
58
+ const {omni, videoA, resolveMedia} = await setupTest()
59
+ const {timeline} = new O({timeline: omni.timeline(o => o.sequence(
60
+ o.video(videoA, {duration: 2000}),
61
+ o.gap(500),
62
+ o.video(videoA, {duration: 2000}),
63
+ o.audio(videoA, {duration: 500}),
64
+ o.text("123", {duration: 1000})
65
+ ))})
66
+ const sampler = createVisualSampler(resolveMedia)
67
+ const imgLayer = await sampler.sample(timeline, ms(1000))
68
+ expect(imgLayer[0].kind).is("image")
69
+ const gapLayer = await sampler.sample(timeline, ms(2300))
70
+ expect(gapLayer[0].kind).is("gap")
71
+ const imgLayer1 = await sampler.sample(timeline, ms(2700))
72
+ expect(imgLayer1[0].kind).is("image")
73
+ const textLayer = await sampler.sample(timeline, ms(5500))
74
+ expect(textLayer[0].kind).is("text")
75
+ }),
76
+
77
+ "audio mix sums overlapping chunks": test(async () => {
78
+ const mixer = new AudioMix({chunkFrames: 4, clamp: false})
79
+ async function *samples() {
80
+ yield {
81
+ planes: [new Float32Array([0.25, 0.25, 0.25, 0.25])],
82
+ sampleRate: 4,
83
+ timestamp: 0
84
+ }
85
+ yield {
86
+ planes: [new Float32Array([0.5, 0.5, 0.5, 0.5])],
87
+ sampleRate: 4,
88
+ timestamp: 0.5
89
+ }
90
+ }
91
+
92
+ const mixed = await collect(mixer.mix(samples()))
93
+ expect(mixed.length).is(2)
94
+ expect(mixed[0].startFrame).is(0)
95
+ expect(mixed[0].frames).is(4)
96
+ expect(mixed[0].channels).is(1)
97
+ expect(mixed[0].planar[0]).is(0.25)
98
+ expect(mixed[0].planar[1]).is(0.25)
99
+ expect(mixed[0].planar[2]).is(0.75)
100
+ expect(mixed[0].planar[3]).is(0.75)
101
+ expect(mixed[1].startFrame).is(4)
102
+ expect(mixed[1].planar[0]).is(0.5)
103
+ expect(mixed[1].planar[1]).is(0.5)
104
+ expect(mixed[1].planar[2]).is(0)
105
+ expect(mixed[1].planar[3]).is(0)
106
+ }),
107
+
108
+ "audio mix clamps output to [-1, 1]": test(async () => {
109
+ const mixer = new AudioMix({chunkFrames: 4, clamp: true})
110
+ async function *samples() {
111
+ yield {
112
+ planes: [new Float32Array([0.9, 0.9, 0.9, 0.9])],
113
+ sampleRate: 4,
114
+ timestamp: 0
115
+ }
116
+ yield {
117
+ planes: [new Float32Array([0.8, 0.8, 0.8, 0.8])],
118
+ sampleRate: 4,
119
+ timestamp: 0
120
+ }
121
+ }
122
+
123
+ const mixed = await collect(mixer.mix(samples()))
124
+ expect(mixed.length).is(1)
125
+ expect(mixed[0].planar[0]).is(1)
126
+ expect(mixed[0].planar[1]).is(1)
127
+ expect(mixed[0].planar[2]).is(1)
128
+ expect(mixed[0].planar[3]).is(1)
129
+ }),
130
+
131
+ "audio mix fills gaps with silence": test(async () => {
132
+ const mixer = new AudioMix({chunkFrames: 4, clamp: false})
133
+ async function *samples() {
134
+ yield {
135
+ planes: [new Float32Array([1, 1, 1, 1])],
136
+ sampleRate: 4,
137
+ timestamp: 0
138
+ }
139
+ yield {
140
+ planes: [new Float32Array([2, 2, 2, 2])],
141
+ sampleRate: 4,
142
+ timestamp: 2
143
+ }
144
+ }
145
+
146
+ const mixed = await collect(mixer.mix(samples()))
147
+ expect(mixed.length).is(3)
148
+ expect(mixed[0].startFrame).is(0)
149
+ expect(mixed[0].planar[0]).is(1)
150
+
151
+ expect(mixed[1].startFrame).is(4)
152
+ expect(mixed[1].planar[0]).is(0)
153
+ expect(mixed[1].planar[3]).is(0)
154
+
155
+ expect(mixed[2].startFrame).is(8)
156
+ expect(mixed[2].planar[0]).is(2)
157
+ }),
158
+
159
+ "audio mix truncates negative timestamps": test(async () => {
160
+ const mixer = new AudioMix({chunkFrames: 4, clamp: false})
161
+ async function *samples() {
162
+ yield {
163
+ planes: [new Float32Array([1, 2, 3, 4])],
164
+ sampleRate: 4,
165
+ timestamp: -0.5
166
+ }
167
+ }
168
+
169
+ const mixed = await collect(mixer.mix(samples()))
170
+ expect(mixed.length).is(1)
171
+ expect(mixed[0].startFrame).is(0)
172
+ expect(mixed[0].planar[0]).is(3)
173
+ expect(mixed[0].planar[1]).is(4)
174
+ expect(mixed[0].planar[2]).is(0)
175
+ expect(mixed[0].planar[3]).is(0)
176
+ }),
177
+
178
+ "audio mix handles stereo planar layout": test(async () => {
179
+ const mixer = new AudioMix({chunkFrames: 4, clamp: false})
180
+ async function *samples() {
181
+ yield {
182
+ planes: [
183
+ new Float32Array([1, 1, 1, 1]),
184
+ new Float32Array([2, 2, 2, 2])
185
+ ],
186
+ sampleRate: 4,
187
+ timestamp: 0
188
+ }
189
+ }
190
+
191
+ const mixed = await collect(mixer.mix(samples()))
192
+ expect(mixed.length).is(1)
193
+ expect(mixed[0].channels).is(2)
194
+ expect(mixed[0].planar.length).is(8)
195
+ expect(mixed[0].planar[0]).is(1)
196
+ expect(mixed[0].planar[4]).is(2)
197
+ }),
198
+
199
+ "applyGainToPlanar scales values across multiple channels": test(async () => {
200
+ const planes = [
201
+ new Float32Array([0.2, -0.4]),
202
+ new Float32Array([0.6, -0.8])
203
+ ]
204
+
205
+ applyGainToPlanar(planes, 0.5)
206
+
207
+ expect(near(planes[0][0], 0.1)).ok()
208
+ expect(near(planes[0][1], -0.2)).ok()
209
+ expect(near(planes[1][0], 0.3)).ok()
210
+ expect(near(planes[1][1], -0.4)).ok()
211
+ }),
212
+
213
+ "applyGainToPlanar does not mutate when gain is 1": test(async () => {
214
+ const planes = [new Float32Array([0.5, -0.5])]
215
+
216
+ applyGainToPlanar(planes, 1)
217
+
218
+ expect(near(planes[0][0], 0.5)).ok()
219
+ expect(near(planes[0][1], -0.5)).ok()
220
+ }),
221
+
222
+ "applyGainToPlanar mutes entirely when gain is 0": test(async () => {
223
+ const planes = [new Float32Array([0.9, -0.9])]
224
+
225
+ applyGainToPlanar(planes, 0)
226
+
227
+ expect(planes[0][0]).is(0)
228
+ expect(planes[0][1]).is(0)
229
+ }),
230
+
231
+ "resampleToPlanar returns original data when sample rates match": test(async () => {
232
+ const sample = {
233
+ numberOfFrames: 3,
234
+ numberOfChannels: 1,
235
+ sampleRate: 48000,
236
+ copyTo: (dest: Float32Array) => dest.set([0.1, 0.2, 0.3])
237
+ }
238
+
239
+ const result = resampleToPlanar(sample, 48000)
240
+
241
+ expect(result.frames).is(3)
242
+ expect(result.data.length).is(1)
243
+ expect(near(result.data[0][0], 0.1)).ok()
244
+ expect(near(result.data[0][1], 0.2)).ok()
245
+ expect(near(result.data[0][2], 0.3)).ok()
246
+ }),
247
+
248
+ "resampleToPlanar upsamples using linear interpolation": test(async () => {
249
+ const sample = {
250
+ numberOfFrames: 2,
251
+ numberOfChannels: 1,
252
+ sampleRate: 1,
253
+ copyTo: (dest: Float32Array) => dest.set([10, 20])
254
+ }
255
+
256
+ const result = resampleToPlanar(sample as any, 2)
257
+
258
+ expect(result.frames).is(4)
259
+ expect(near(result.data[0][0], 10)).ok()
260
+ expect(near(result.data[0][1], 15)).ok()
261
+ expect(near(result.data[0][2], 20)).ok()
262
+ expect(near(result.data[0][3], 20)).ok()
263
+ }),
264
+
265
+ "resampleToPlanar downsamples correctly": test(async () => {
266
+ const sample = {
267
+ numberOfFrames: 4,
268
+ numberOfChannels: 1,
269
+ sampleRate: 4,
270
+ copyTo: (dest: Float32Array) => dest.set([1, 2, 3, 4])
271
+ }
272
+
273
+ const result = resampleToPlanar(sample, 2)
274
+
275
+ expect(result.frames).is(2)
276
+ expect(near(result.data[0][0], 1)).ok()
277
+ expect(near(result.data[0][1], 3)).ok()
278
+ }),
279
+
280
+ "resampleToPlanar processes multi-channel planar data": test(async () => {
281
+ const planes = [
282
+ new Float32Array([1, 2]),
283
+ new Float32Array([3, 4])
284
+ ]
285
+
286
+ const sample = {
287
+ numberOfFrames: 2,
288
+ numberOfChannels: 2,
289
+ sampleRate: 1,
290
+ copyTo: (dest: Float32Array, options: { planeIndex: number }) => {
291
+ dest.set(planes[options.planeIndex])
292
+ }
293
+ }
294
+
295
+ const result = resampleToPlanar(sample, 2)
296
+
297
+ expect(result.data.length).is(2)
298
+ expect(near(result.data[0][1], 1.5)).ok()
299
+ expect(near(result.data[1][1], 3.5)).ok()
300
+ }),
301
+
302
+ "resampleToPlanar handles zero channels gracefully": test(async () => {
303
+ const sample = {
304
+ numberOfFrames: 10,
305
+ numberOfChannels: 0,
306
+ sampleRate: 48000,
307
+ copyTo: () => { throw new Error("Should not be called") }
308
+ }
309
+
310
+ const result = resampleToPlanar(sample, 44100)
311
+
312
+ expect(result.data.length).is(0)
313
+ expect(result.frames).is(0)
314
+ }),
315
+
316
+ "resampleToPlanar enforces minimum of 1 frame on aggressive downsample": test(async () => {
317
+ const sample = {
318
+ numberOfFrames: 1,
319
+ numberOfChannels: 1,
320
+ sampleRate: 48000,
321
+ copyTo: (dest: Float32Array) => dest.set([0.8])
322
+ }
323
+
324
+ const result = resampleToPlanar(sample, 8000)
325
+
326
+ expect(result.frames).is(1)
327
+ expect(result.data[0].length).is(1)
328
+ expect(near(result.data[0][0], 0.8)).ok()
329
+ }),
330
+
331
+ "resampleToPlanar calls copyTo with strict contract shape": test(async () => {
332
+ let passedOptions: any = null
333
+ const sample = {
334
+ numberOfFrames: 2,
335
+ numberOfChannels: 1,
336
+ sampleRate: 48000,
337
+ copyTo: (dest: Float32Array, options: any) => {
338
+ passedOptions = options
339
+ }
340
+ }
341
+
342
+ resampleToPlanar(sample, 44100)
343
+
344
+ expect(passedOptions).not.is(null)
345
+ expect(passedOptions.planeIndex).is(0)
346
+ expect(passedOptions.format).is("f32-planar")
347
+ }),
348
+
349
+ "5s long export at 30fps renders exacly 150 frames": test(async () => {
350
+ const {omni, videoA, driver, resolveMedia} = await setupTest()
351
+ const {timeline} = new O({timeline: omni.timeline(o => o.sequence(
352
+ o.video(videoA, {duration: 2000}),
353
+ o.gap(500),
354
+ o.video(videoA, {duration: 2000}),
355
+ o.audio(videoA, {duration: 500})
356
+ ))})
357
+ const readable = produceVideo({timeline, fps: fps(30), driver, resolveMedia})
358
+ let frames = 0
359
+ for await (const frame of readable) {
360
+ frame.close()
361
+ frames++
362
+ }
363
+ expect(frames).is(150)
364
+ }),
365
+
366
+ "5s long audio export at 48000Hz renders exactly 240000 frames": test(async () => {
367
+ const {omni, videoA, resolveMedia} = await setupTest()
368
+ const {timeline} = new O({timeline: omni.timeline(o => o.sequence(
369
+ o.video(videoA, {duration: 2000}),
370
+ o.gap(500),
371
+ o.video(videoA, {duration: 2000}),
372
+ o.audio(videoA, {duration: 500})
373
+ ))})
374
+
375
+ const readable = produceAudio({timeline, resolveMedia})
376
+ let totalFrames = 0
377
+
378
+ for await (const chunk of readable) {
379
+ totalFrames += chunk.numberOfFrames
380
+ chunk.close()
381
+ }
382
+
383
+ expect(totalFrames).is(240000)
384
+ })
385
+ })
@@ -0,0 +1,85 @@
1
+
2
+ import {TextStyleOptions} from "pixi.js"
3
+
4
+ import {O} from "./o.js"
5
+ import {Item} from "../parts/item.js"
6
+ import {Transform} from "../types.js"
7
+ import {Media} from "../parts/media.js"
8
+ import {TimelineFile} from "../parts/basics.js"
9
+
10
+ type Build<T extends Item.Any = Item.Any> = (o: O) => T
11
+
12
+ function createTimeline(): TimelineFile {
13
+ return {
14
+ format: "timeline",
15
+ info: "https://omniclip.app/",
16
+ version: 0,
17
+ items: [],
18
+ rootId: 0
19
+ }
20
+ }
21
+
22
+ export function timeline(root: Build): TimelineFile {
23
+ const o = new O({timeline: createTimeline()})
24
+ const item = root(o)
25
+ o.timeline.rootId = item.id
26
+ return o.timeline
27
+ }
28
+
29
+ export function sequence(...items: Build[]): Build<Item.Sequence> {
30
+ return o => o.sequence(...items.map(item => item(o)))
31
+ }
32
+
33
+ export function stack(...items: Build[]): Build<Item.Stack> {
34
+ return o => o.stack(...items.map(item => item(o)))
35
+ }
36
+
37
+ export function video(
38
+ media: Media,
39
+ options?: {
40
+ start?: number,
41
+ duration?: number
42
+ }
43
+ ): Build<Item.Video> {
44
+ return o => o.video(media, options)
45
+ }
46
+
47
+ export function audio(
48
+ media: Media,
49
+ options?: {
50
+ start?: number,
51
+ duration?: number,
52
+ gain?: number
53
+ }
54
+ ): Build<Item.Audio> {
55
+ return o => o.audio(media, options)
56
+ }
57
+
58
+ export function text(
59
+ content: string,
60
+ options?: {
61
+ duration?: number,
62
+ styles?: TextStyleOptions
63
+ }
64
+ ): Build<Item.Text> {
65
+ return o => o.text(content, options)
66
+ }
67
+
68
+ export function gap(duration: number): Build<Item.Gap> {
69
+ return o => o.gap(duration)
70
+ }
71
+
72
+ export function spatial(transform: Transform): Build<Item.Spatial> {
73
+ return o => o.spatial(transform)
74
+ }
75
+
76
+ export function textStyle(style: TextStyleOptions): Build<Item.TextStyle> {
77
+ return o => o.textStyle(style)
78
+ }
79
+
80
+ export const transition = {
81
+ crossfade(duration: number): Build<Item.Transition> {
82
+ return o => o.transition.crossfade(duration)
83
+ }
84
+ }
85
+