@omnimedia/omnitool 1.1.0-5 → 1.1.0-51

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 (380) hide show
  1. package/README.md +143 -80
  2. package/package.json +18 -16
  3. package/s/context.ts +0 -7
  4. package/s/demo/demo.bundle.ts +102 -43
  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 +22 -18
  8. package/s/demo/routines/load-video.ts +2 -3
  9. package/s/demo/routines/playback-test.ts +76 -0
  10. package/s/demo/routines/timeline-setup.ts +24 -0
  11. package/s/demo/routines/transcode-test.ts +21 -5
  12. package/s/demo/routines/transitions-test.ts +2 -2
  13. package/s/demo/routines/waveform-test.ts +8 -6
  14. package/s/driver/driver-worker.ts +9 -0
  15. package/s/driver/driver.test.ts +1 -1
  16. package/s/driver/driver.ts +32 -44
  17. package/s/driver/fns/schematic.ts +52 -25
  18. package/s/driver/fns/work.ts +71 -200
  19. package/s/driver/parts/compositor.ts +178 -0
  20. package/s/driver/parts/machina.ts +19 -20
  21. package/s/index.html.ts +103 -19
  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 +3 -0
  26. package/s/timeline/parts/basics.ts +1 -1
  27. package/s/timeline/parts/filmstrip.ts +43 -16
  28. package/s/timeline/parts/item.ts +59 -6
  29. package/s/timeline/parts/media.ts +32 -1
  30. package/s/timeline/parts/resource-pool.ts +8 -5
  31. package/s/timeline/parts/resource.ts +2 -0
  32. package/s/timeline/parts/waveform.ts +3 -4
  33. package/s/timeline/renderers/export/parts/audio-gain.ts +17 -0
  34. package/s/timeline/renderers/export/parts/audio-mix.ts +133 -0
  35. package/s/timeline/renderers/export/parts/cursor.ts +109 -0
  36. package/s/timeline/renderers/export/parts/produce-audio.ts +64 -0
  37. package/s/timeline/renderers/export/parts/produce-video.ts +50 -0
  38. package/s/timeline/renderers/export/parts/resamplers.ts +48 -0
  39. package/s/timeline/renderers/export/produce.ts +28 -0
  40. package/s/timeline/renderers/parts/handy.ts +360 -0
  41. package/s/timeline/renderers/parts/samplers/audio/parts/find.ts +19 -0
  42. package/s/timeline/renderers/parts/samplers/audio/parts/init.ts +60 -0
  43. package/s/timeline/renderers/parts/samplers/audio/parts/sink.ts +38 -0
  44. package/s/timeline/renderers/parts/samplers/audio/parts/types.ts +16 -0
  45. package/s/timeline/renderers/parts/samplers/audio/sampler.ts +35 -0
  46. package/s/timeline/renderers/parts/samplers/visual/parts/defaults.ts +16 -0
  47. package/s/timeline/renderers/parts/samplers/visual/parts/sample.ts +59 -0
  48. package/s/timeline/renderers/parts/samplers/visual/parts/sequence.ts +111 -0
  49. package/s/timeline/renderers/parts/samplers/visual/parts/sink.ts +38 -0
  50. package/s/timeline/renderers/parts/samplers/visual/parts/transition.ts +28 -0
  51. package/s/timeline/renderers/parts/samplers/visual/parts/types.ts +10 -0
  52. package/s/timeline/renderers/parts/samplers/visual/sampler.ts +28 -0
  53. package/s/timeline/renderers/parts/schedulers.ts +96 -0
  54. package/s/timeline/renderers/player/parts/playback.ts +125 -0
  55. package/s/timeline/renderers/player/player.ts +71 -0
  56. package/s/timeline/renderers/renderers.test.ts +387 -0
  57. package/s/timeline/sugar/helpers.ts +85 -0
  58. package/s/timeline/sugar/o.ts +178 -38
  59. package/s/timeline/sugar/omni.test.ts +210 -0
  60. package/s/timeline/sugar/omni.ts +38 -12
  61. package/s/timeline/types.ts +29 -0
  62. package/s/timeline/utils/checksum.ts +3 -1
  63. package/s/timeline/utils/datafile.ts +15 -4
  64. package/s/timeline/utils/dummy-data.ts +3 -3
  65. package/s/timeline/utils/matrix.ts +33 -0
  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 +92 -40
  117. package/x/demo/demo.bundle.js.map +1 -1
  118. package/x/demo/demo.bundle.min.js +2450 -35
  119. package/x/demo/demo.bundle.min.js.map +4 -4
  120. package/x/demo/demo.css +246 -11
  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 +65 -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 +17 -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 +7 -6
  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/WebGLRenderer-OMRWYQIV.js +2 -0
  146. package/x/driver/WebGLRenderer-OMRWYQIV.js.map +7 -0
  147. package/x/driver/WebGPURenderer-KQJB2OJJ.js +2 -0
  148. package/x/driver/WebGPURenderer-KQJB2OJJ.js.map +7 -0
  149. package/x/driver/browserAll-YBZEJCN3.js +2 -0
  150. package/x/driver/browserAll-YBZEJCN3.js.map +7 -0
  151. package/x/driver/chunk-3L3MB5NY.js +393 -0
  152. package/x/driver/chunk-3L3MB5NY.js.map +7 -0
  153. package/x/driver/chunk-42BQ4XKE.js +269 -0
  154. package/x/driver/chunk-42BQ4XKE.js.map +7 -0
  155. package/x/driver/chunk-4HAYG3N5.js +327 -0
  156. package/x/driver/chunk-4HAYG3N5.js.map +7 -0
  157. package/x/driver/chunk-BFBY7VYB.js +42 -0
  158. package/x/driver/chunk-BFBY7VYB.js.map +7 -0
  159. package/x/driver/chunk-KM6O72WE.js +157 -0
  160. package/x/driver/chunk-KM6O72WE.js.map +7 -0
  161. package/x/driver/chunk-N6HD4WYJ.js +2 -0
  162. package/x/driver/chunk-N6HD4WYJ.js.map +7 -0
  163. package/x/driver/chunk-WCZ2O3UN.js +15 -0
  164. package/x/driver/chunk-WCZ2O3UN.js.map +7 -0
  165. package/x/driver/chunk-XWNSF3WJ.js +2 -0
  166. package/x/driver/chunk-XWNSF3WJ.js.map +7 -0
  167. package/x/driver/driver-worker.d.ts +1 -0
  168. package/x/driver/driver-worker.js +6 -0
  169. package/x/driver/driver-worker.js.map +1 -0
  170. package/x/driver/driver.d.ts +12 -9
  171. package/x/driver/driver.js +31 -41
  172. package/x/driver/driver.js.map +1 -1
  173. package/x/driver/driver.test.js +1 -1
  174. package/x/driver/driver.test.js.map +1 -1
  175. package/x/driver/driver.worker.bundle.min.js +139 -1135
  176. package/x/driver/driver.worker.bundle.min.js.map +4 -4
  177. package/x/driver/fns/host.d.ts +10 -4
  178. package/x/driver/fns/schematic.d.ts +47 -24
  179. package/x/driver/fns/work.d.ts +12 -7
  180. package/x/driver/fns/work.js +68 -170
  181. package/x/driver/fns/work.js.map +1 -1
  182. package/x/driver/parts/compositor.d.ts +15 -0
  183. package/x/driver/parts/compositor.js +152 -0
  184. package/x/driver/parts/compositor.js.map +1 -0
  185. package/x/driver/parts/machina.d.ts +0 -20
  186. package/x/driver/parts/machina.js +6 -10
  187. package/x/driver/parts/machina.js.map +1 -1
  188. package/x/driver/webworkerAll-BKJQW6P7.js +2 -0
  189. package/x/driver/webworkerAll-BKJQW6P7.js.map +7 -0
  190. package/x/features/speech/transcribe/parts/prep-audio.d.ts +1 -1
  191. package/x/features/speech/transcribe/worker.bundle.min.js +703 -703
  192. package/x/features/speech/transcribe/worker.bundle.min.js.map +4 -4
  193. package/x/index.d.ts +1 -0
  194. package/x/index.html +349 -30
  195. package/x/index.html.js +103 -19
  196. package/x/index.html.js.map +1 -1
  197. package/x/index.js +1 -0
  198. package/x/index.js.map +1 -1
  199. package/x/tests.bundle.js +8 -0
  200. package/x/tests.bundle.js.map +1 -0
  201. package/x/tests.bundle.min.js +2464 -0
  202. package/x/tests.bundle.min.js.map +7 -0
  203. package/x/tests.html +316 -0
  204. package/x/tests.html.d.ts +2 -0
  205. package/x/tests.html.js +22 -0
  206. package/x/tests.html.js.map +1 -0
  207. package/x/timeline/index.d.ts +3 -0
  208. package/x/timeline/index.js +3 -0
  209. package/x/timeline/index.js.map +1 -1
  210. package/x/timeline/parts/basics.d.ts +1 -1
  211. package/x/timeline/parts/filmstrip.d.ts +4 -3
  212. package/x/timeline/parts/filmstrip.js +29 -10
  213. package/x/timeline/parts/filmstrip.js.map +1 -1
  214. package/x/timeline/parts/item.d.ts +51 -8
  215. package/x/timeline/parts/item.js +7 -3
  216. package/x/timeline/parts/item.js.map +1 -1
  217. package/x/timeline/parts/media.d.ts +5 -0
  218. package/x/timeline/parts/media.js +27 -1
  219. package/x/timeline/parts/media.js.map +1 -1
  220. package/x/timeline/parts/resource-pool.d.ts +3 -0
  221. package/x/timeline/parts/resource-pool.js +7 -4
  222. package/x/timeline/parts/resource-pool.js.map +1 -1
  223. package/x/timeline/parts/resource.d.ts +2 -0
  224. package/x/timeline/parts/waveform.d.ts +2 -1
  225. package/x/timeline/parts/waveform.js +2 -4
  226. package/x/timeline/parts/waveform.js.map +1 -1
  227. package/x/timeline/renderers/export/parts/audio-gain.d.ts +1 -0
  228. package/x/timeline/renderers/export/parts/audio-gain.js +13 -0
  229. package/x/timeline/renderers/export/parts/audio-gain.js.map +1 -0
  230. package/x/timeline/renderers/export/parts/audio-mix.d.ts +21 -0
  231. package/x/timeline/renderers/export/parts/audio-mix.js +89 -0
  232. package/x/timeline/renderers/export/parts/audio-mix.js.map +1 -0
  233. package/x/timeline/renderers/export/parts/cursor.d.ts +19 -0
  234. package/x/timeline/renderers/export/parts/cursor.js +80 -0
  235. package/x/timeline/renderers/export/parts/cursor.js.map +1 -0
  236. package/x/timeline/renderers/export/parts/produce-audio.d.ts +6 -0
  237. package/x/timeline/renderers/export/parts/produce-audio.js +41 -0
  238. package/x/timeline/renderers/export/parts/produce-audio.js.map +1 -0
  239. package/x/timeline/renderers/export/parts/produce-video.d.ts +10 -0
  240. package/x/timeline/renderers/export/parts/produce-video.js +27 -0
  241. package/x/timeline/renderers/export/parts/produce-video.js.map +1 -0
  242. package/x/timeline/renderers/export/parts/resamplers.d.ts +12 -0
  243. package/x/timeline/renderers/export/parts/resamplers.js +29 -0
  244. package/x/timeline/renderers/export/parts/resamplers.js.map +1 -0
  245. package/x/timeline/renderers/export/produce.d.ts +13 -0
  246. package/x/timeline/renderers/export/produce.js +15 -0
  247. package/x/timeline/renderers/export/produce.js.map +1 -0
  248. package/x/timeline/renderers/parts/handy.d.ts +30 -0
  249. package/x/timeline/renderers/parts/handy.js +219 -0
  250. package/x/timeline/renderers/parts/handy.js.map +1 -0
  251. package/x/timeline/renderers/parts/samplers/audio/parts/find.d.ts +6 -0
  252. package/x/timeline/renderers/parts/samplers/audio/parts/find.js +15 -0
  253. package/x/timeline/renderers/parts/samplers/audio/parts/find.js.map +1 -0
  254. package/x/timeline/renderers/parts/samplers/audio/parts/init.d.ts +5 -0
  255. package/x/timeline/renderers/parts/samplers/audio/parts/init.js +40 -0
  256. package/x/timeline/renderers/parts/samplers/audio/parts/init.js.map +1 -0
  257. package/x/timeline/renderers/parts/samplers/audio/parts/sink.d.ts +8 -0
  258. package/x/timeline/renderers/parts/samplers/audio/parts/sink.js +24 -0
  259. package/x/timeline/renderers/parts/samplers/audio/parts/sink.js.map +1 -0
  260. package/x/timeline/renderers/parts/samplers/audio/parts/types.d.ts +14 -0
  261. package/x/timeline/renderers/parts/samplers/audio/parts/types.js.map +1 -0
  262. package/x/timeline/renderers/parts/samplers/audio/sampler.d.ts +11 -0
  263. package/x/timeline/renderers/parts/samplers/audio/sampler.js +22 -0
  264. package/x/timeline/renderers/parts/samplers/audio/sampler.js.map +1 -0
  265. package/x/timeline/renderers/parts/samplers/visual/parts/defaults.d.ts +5 -0
  266. package/x/timeline/renderers/parts/samplers/visual/parts/defaults.js +10 -0
  267. package/x/timeline/renderers/parts/samplers/visual/parts/defaults.js.map +1 -0
  268. package/x/timeline/renderers/parts/samplers/visual/parts/sample.d.ts +5 -0
  269. package/x/timeline/renderers/parts/samplers/visual/parts/sample.js +38 -0
  270. package/x/timeline/renderers/parts/samplers/visual/parts/sample.js.map +1 -0
  271. package/x/timeline/renderers/parts/samplers/visual/parts/sequence.d.ts +5 -0
  272. package/x/timeline/renderers/parts/samplers/visual/parts/sequence.js +75 -0
  273. package/x/timeline/renderers/parts/samplers/visual/parts/sequence.js.map +1 -0
  274. package/x/timeline/renderers/parts/samplers/visual/parts/sink.d.ts +8 -0
  275. package/x/timeline/renderers/parts/samplers/visual/parts/sink.js +24 -0
  276. package/x/timeline/renderers/parts/samplers/visual/parts/sink.js.map +1 -0
  277. package/x/timeline/renderers/parts/samplers/visual/parts/transition.d.ts +3 -0
  278. package/x/timeline/renderers/parts/samplers/visual/parts/transition.js +18 -0
  279. package/x/timeline/renderers/parts/samplers/visual/parts/transition.js.map +1 -0
  280. package/x/timeline/renderers/parts/samplers/visual/parts/types.d.ts +8 -0
  281. package/x/timeline/renderers/parts/samplers/visual/parts/types.js +2 -0
  282. package/x/timeline/renderers/parts/samplers/visual/parts/types.js.map +1 -0
  283. package/x/timeline/renderers/parts/samplers/visual/sampler.d.ts +7 -0
  284. package/x/timeline/renderers/parts/samplers/visual/sampler.js +17 -0
  285. package/x/timeline/renderers/parts/samplers/visual/sampler.js.map +1 -0
  286. package/x/timeline/renderers/parts/schedulers.d.ts +17 -0
  287. package/x/timeline/renderers/parts/schedulers.js +64 -0
  288. package/x/timeline/renderers/parts/schedulers.js.map +1 -0
  289. package/x/timeline/renderers/player/parts/playback.d.ts +31 -0
  290. package/x/timeline/renderers/player/parts/playback.js +91 -0
  291. package/x/timeline/renderers/player/parts/playback.js.map +1 -0
  292. package/x/timeline/renderers/player/player.d.ts +23 -0
  293. package/x/timeline/renderers/player/player.js +50 -0
  294. package/x/timeline/renderers/player/player.js.map +1 -0
  295. package/x/timeline/renderers/renderers.test.d.ts +32 -0
  296. package/x/timeline/renderers/renderers.test.js +306 -0
  297. package/x/timeline/renderers/renderers.test.js.map +1 -0
  298. package/x/timeline/sugar/helpers.d.ts +30 -0
  299. package/x/timeline/sugar/helpers.js +46 -0
  300. package/x/timeline/sugar/helpers.js.map +1 -0
  301. package/x/timeline/sugar/o.d.ts +31 -4
  302. package/x/timeline/sugar/o.js +144 -38
  303. package/x/timeline/sugar/o.js.map +1 -1
  304. package/x/timeline/sugar/omni.d.ts +11 -2
  305. package/x/timeline/sugar/omni.js +30 -9
  306. package/x/timeline/sugar/omni.js.map +1 -1
  307. package/x/timeline/sugar/omni.test.d.ts +27 -0
  308. package/x/timeline/sugar/omni.test.js +128 -0
  309. package/x/timeline/sugar/omni.test.js.map +1 -0
  310. package/x/timeline/types.d.ts +24 -0
  311. package/x/timeline/types.js +2 -0
  312. package/x/timeline/types.js.map +1 -0
  313. package/x/timeline/utils/checksum.d.ts +3 -2
  314. package/x/timeline/utils/checksum.js.map +1 -1
  315. package/x/timeline/utils/datafile.d.ts +5 -3
  316. package/x/timeline/utils/datafile.js +18 -5
  317. package/x/timeline/utils/datafile.js.map +1 -1
  318. package/x/timeline/utils/dummy-data.d.ts +1 -2
  319. package/x/timeline/utils/dummy-data.js +4 -2
  320. package/x/timeline/utils/dummy-data.js.map +1 -1
  321. package/x/timeline/utils/matrix.d.ts +8 -0
  322. package/x/timeline/utils/matrix.js +26 -0
  323. package/x/timeline/utils/matrix.js.map +1 -0
  324. package/x/units/fps.d.ts +6 -0
  325. package/x/units/fps.js +2 -0
  326. package/x/units/fps.js.map +1 -0
  327. package/x/units/ms.d.ts +6 -0
  328. package/x/units/ms.js +2 -0
  329. package/x/units/ms.js.map +1 -0
  330. package/x/units/seconds.d.ts +6 -0
  331. package/x/units/seconds.js +2 -0
  332. package/x/units/seconds.js.map +1 -0
  333. package/x/webworkerAll-VVIU3M54.js +2 -0
  334. package/x/webworkerAll-VVIU3M54.js.map +7 -0
  335. package/s/tests.test.ts +0 -8
  336. package/s/timeline/sugar/omni-test.ts +0 -38
  337. package/s/tools/common/loader.ts +0 -26
  338. package/s/tools/common/transformer-pipeline.ts +0 -26
  339. package/s/tools/speech-recognition/common/model.ts +0 -26
  340. package/s/tools/speech-recognition/whisper/fns/host.ts +0 -25
  341. package/s/tools/speech-recognition/whisper/fns/schematic.ts +0 -23
  342. package/s/tools/speech-recognition/whisper/fns/work.ts +0 -91
  343. package/s/tools/speech-recognition/whisper/parts/types.ts +0 -38
  344. package/s/tools/speech-recognition/whisper/parts/worker.bundle.ts +0 -7
  345. package/s/tools/speech-recognition/whisper/tool.ts +0 -70
  346. package/x/tests.test.js +0 -6
  347. package/x/tests.test.js.map +0 -1
  348. package/x/timeline/sugar/omni-test.d.ts +0 -1
  349. package/x/timeline/sugar/omni-test.js +0 -22
  350. package/x/timeline/sugar/omni-test.js.map +0 -1
  351. package/x/tools/common/loader.d.ts +0 -19
  352. package/x/tools/common/loader.js +0 -18
  353. package/x/tools/common/loader.js.map +0 -1
  354. package/x/tools/common/transformer-pipeline.d.ts +0 -8
  355. package/x/tools/common/transformer-pipeline.js +0 -24
  356. package/x/tools/common/transformer-pipeline.js.map +0 -1
  357. package/x/tools/speech-recognition/common/model.d.ts +0 -14
  358. package/x/tools/speech-recognition/common/model.js +0 -16
  359. package/x/tools/speech-recognition/common/model.js.map +0 -1
  360. package/x/tools/speech-recognition/whisper/fns/host.d.ts +0 -13
  361. package/x/tools/speech-recognition/whisper/fns/host.js +0 -19
  362. package/x/tools/speech-recognition/whisper/fns/host.js.map +0 -1
  363. package/x/tools/speech-recognition/whisper/fns/schematic.d.ts +0 -19
  364. package/x/tools/speech-recognition/whisper/fns/schematic.js +0 -2
  365. package/x/tools/speech-recognition/whisper/fns/schematic.js.map +0 -1
  366. package/x/tools/speech-recognition/whisper/fns/work.d.ts +0 -12
  367. package/x/tools/speech-recognition/whisper/fns/work.js +0 -74
  368. package/x/tools/speech-recognition/whisper/fns/work.js.map +0 -1
  369. package/x/tools/speech-recognition/whisper/parts/types.d.ts +0 -31
  370. package/x/tools/speech-recognition/whisper/parts/types.js.map +0 -1
  371. package/x/tools/speech-recognition/whisper/parts/worker.bundle.d.ts +0 -1
  372. package/x/tools/speech-recognition/whisper/parts/worker.bundle.js +0 -4
  373. package/x/tools/speech-recognition/whisper/parts/worker.bundle.js.map +0 -1
  374. package/x/tools/speech-recognition/whisper/parts/worker.bundle.min.js +0 -8
  375. package/x/tools/speech-recognition/whisper/parts/worker.bundle.min.js.map +0 -7
  376. package/x/tools/speech-recognition/whisper/tool.d.ts +0 -12
  377. package/x/tools/speech-recognition/whisper/tool.js +0 -63
  378. package/x/tools/speech-recognition/whisper/tool.js.map +0 -1
  379. /package/x/{tests.test.d.ts → tests.bundle.d.ts} +0 -0
  380. /package/x/{tools/speech-recognition/whisper → timeline/renderers/parts/samplers/audio}/parts/types.js +0 -0
@@ -0,0 +1,178 @@
1
+ import {autoDetectRenderer, Container, Renderer, Sprite, Text, Texture} from "pixi.js"
2
+
3
+ import {Composition, Layer} from "../fns/schematic.js"
4
+ import {Mat6, mat6ToMatrix} from "../../timeline/utils/matrix.js"
5
+ import {makeTransition} from "../../features/transition/transition.js"
6
+
7
+ export class Compositor {
8
+
9
+ static async setup() {
10
+ const renderer = await autoDetectRenderer({
11
+ width: 1920,
12
+ height: 1080,
13
+ preference: "webgl", // webgl and webgl2 causes memory leaks on chrome
14
+ background: "black",
15
+ preferWebGLVersion: 2
16
+ })
17
+ const stage = new Container()
18
+ stage.interactive = true
19
+ return new this({renderer, stage})
20
+ }
21
+
22
+ constructor(public pixi: {renderer: Renderer, stage: Container}) {}
23
+
24
+ #transitions: Map<string, ReturnType<typeof makeTransition>> = new Map()
25
+ #objects = new Map<number, Container>()
26
+
27
+ async composite(
28
+ composition: Composition,
29
+ ) {
30
+ const {stage, renderer} = this.pixi
31
+
32
+ this.#cleanup(this.#collectIds(composition))
33
+ const {dispose} = await this.#renderLayer(composition, stage)
34
+ renderer.render(stage)
35
+
36
+ // make sure browser support webgl/webgpu otherwise it might take much longer to construct frame
37
+ // if its very slow on eg edge try chrome
38
+ const frame = new VideoFrame(renderer.canvas, {
39
+ timestamp: 0,
40
+ duration: 0,
41
+ })
42
+
43
+ dispose()
44
+
45
+ return frame
46
+ }
47
+
48
+ async #renderLayer(
49
+ layer: Layer | Composition,
50
+ parent: Container,
51
+ ) {
52
+ if (Array.isArray(layer)) {
53
+ layer.reverse()
54
+ const disposers: (() => void)[] = []
55
+ for (const child of layer) {
56
+ const result = await this.#renderLayer(child, parent)
57
+ disposers.push(result.dispose)
58
+ }
59
+ return {dispose: () => disposers.forEach(d => d())}
60
+ }
61
+
62
+ switch (layer.kind) {
63
+ case 'text':
64
+ return this.#renderTextLayer(layer, parent)
65
+ case 'image':
66
+ return this.#renderImageLayer(layer, parent)
67
+ case 'transition':
68
+ return this.#renderTransitionLayer(layer, parent)
69
+ case 'gap': {
70
+ this.pixi?.renderer.clear()
71
+ return {dispose: () => {}}
72
+ }
73
+ default:
74
+ console.warn('Unknown layer kind', (layer as any).kind)
75
+ return {dispose: () => {}}
76
+ }
77
+ }
78
+
79
+ #renderTextLayer(
80
+ layer: Extract<Layer, {kind: 'text'}>,
81
+ parent: Container,
82
+ ) {
83
+ const text = this.#findOrCreate<Text>(layer)!
84
+ this.#applyTransform(text, layer.matrix)
85
+ parent.addChild(text)
86
+ return {
87
+ dispose: () => {}
88
+ }
89
+ }
90
+
91
+ #renderImageLayer(
92
+ layer: Extract<Layer, {kind: 'image'}>,
93
+ parent: Container,
94
+ ) {
95
+ const texture = Texture.from(layer.frame)
96
+ const sprite = this.#findOrCreate<Sprite>(layer)!
97
+ sprite.texture = texture
98
+ this.#applyTransform(sprite, layer.matrix)
99
+ parent.addChild(sprite)
100
+ return {
101
+ dispose: () => {
102
+ texture.destroy(true)
103
+ layer.frame.close()
104
+ }
105
+ }
106
+ }
107
+
108
+ #renderTransitionLayer(
109
+ {from, to, progress, name}: Extract<Layer, {kind: 'transition'}>,
110
+ parent: Container,
111
+ ) {
112
+ const transition = this.#transitions.get(name) ??
113
+ (this.#transitions.set(name, makeTransition({
114
+ name: "circle",
115
+ renderer: this.pixi.renderer
116
+ })),
117
+ this.#transitions.get(name)!
118
+ )
119
+ const texture = transition.render({from, to, progress, width: from.displayWidth, height: from.displayHeight})
120
+ const sprite = new Sprite(texture)
121
+ parent.addChild(sprite)
122
+ return {dispose: () => sprite.destroy(false)}
123
+ }
124
+
125
+ #applyTransform(target: Sprite | Text, worldMatrix?: Mat6) {
126
+ if (!worldMatrix) return
127
+ const mx = mat6ToMatrix(worldMatrix)
128
+ target.setFromMatrix(mx)
129
+ }
130
+
131
+ #findOrCreate<T = Container>(layer: Layer) {
132
+ const object = this.#objects.get(layer.id)
133
+ if(!object) {
134
+ switch (layer.kind) {
135
+ case 'text': {
136
+ const text = new Text({
137
+ text: layer.content,
138
+ style: layer.style
139
+ })
140
+ text.onmouseenter = () => console.log("enter text")
141
+ return this.#objects
142
+ .set(layer.id, text)
143
+ .get(layer.id) as T
144
+ }
145
+ case 'image': {
146
+ const sprite = new Sprite()
147
+ sprite.onmouseenter = () => console.log("enter")
148
+ return this.#objects
149
+ .set(layer.id, sprite)
150
+ .get(layer.id) as T
151
+ }
152
+ }
153
+ } else return object as T
154
+ }
155
+
156
+ #collectIds(layers: Layer | Composition): Set<number> {
157
+ const result = new Set<number>()
158
+ const traverse = (node: Layer | Composition) => {
159
+ if (Array.isArray(node)) {
160
+ for (const child of node) traverse(child)
161
+ } else {
162
+ result.add(node.id)
163
+ }
164
+ }
165
+ traverse(layers)
166
+ return result
167
+ }
168
+
169
+ #cleanup(activeIds: Set<number>) {
170
+ for (const id of this.#objects.keys()) {
171
+ if (!activeIds.has(id)) {
172
+ const obj = this.#objects.get(id)!
173
+ obj.destroy(true)
174
+ this.#objects.delete(id)
175
+ }
176
+ }
177
+ }
178
+ }
@@ -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
 
package/s/index.html.ts CHANGED
@@ -15,7 +15,7 @@ export default ssg.page(import.meta.url, async orb => ({
15
15
  head: html`
16
16
  <link rel="preconnect" href="https://fonts.googleapis.com">
17
17
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
18
- <link href="https://fonts.googleapis.com/css2?family=Share+Tech&display=swap" rel="stylesheet">
18
+ <link href="https://fonts.googleapis.com/css2?family=Share+Tech&family=Space+Grotesk:wght@400;600&display=swap" rel="stylesheet">
19
19
  `,
20
20
 
21
21
  socialCard: {
@@ -28,25 +28,109 @@ export default ssg.page(import.meta.url, async orb => ({
28
28
 
29
29
  body: html`
30
30
  <section>
31
- <h1>Omnitool <small>v${orb.packageVersion()}</small></h1>
32
- <button class=fetch>fetch</button>
33
- <button class="import">import</button>
34
- <div class=results></div>
35
- <div class=filmstrip-demo>
36
- <label for="viewable-range">viewable range:</label>
37
- <input type="range" min="0" max="100" step="1" value="10" class="range" id="viewable-range" name="viewable-range">
38
- <div class="range-view"></div>
39
- <label for="range-size">viewable range size:</label>
40
- <input type="range" class="range-size" min="0.1" max="10" step="0.1" value="0.5" id="range-size" name="range-size">
41
- <label for="frequency">frequency:</label>
42
- <input type="range" class="frequency" min="0.1" max="120" step="0.1" value="10" id="frequency" name="frequency">
43
- <div class="frequency-view">10 (fps)</div>
44
- <div id=filmstrip></div>
45
- </div>
46
- <div class=waveform-demo>
47
- <label for="width">width:</label>
48
- <input class="width" id="width" name="width" type="range" min="100" max="1000000" value="1000" />
31
+ <header class="hero">
32
+ <div>
33
+ <h1>Omnitool <small>v${orb.packageVersion()}</small></h1>
34
+ <p>Developer demos for decoding, preview, waveform, playback, and export.</p>
35
+ </div>
36
+ </header>
37
+
38
+ <div class="demo-grid">
39
+ <article class="demo-card" data-demo="transcode">
40
+ <header>
41
+ <h2>Transcode Test</h2>
42
+ <p>Full decode + composite + encode pipeline.</p>
43
+ </header>
44
+ <div class="demo-controls">
45
+ <input type="file" accept="video/*" />
46
+ <button data-action="run">Run Transcode</button>
47
+ </div>
48
+ <div class="demo-progress">
49
+ <progress class="progress"></progress>
50
+ <span class="status">idle</span>
51
+ </div>
52
+ <div class="demo-preview"></div>
53
+ </article>
54
+
55
+ <article class="demo-card" data-demo="filmstrip">
56
+ <header>
57
+ <h2>Filmstrip</h2>
58
+ <p>Thumbnail sampling across a time range.</p>
59
+ </header>
60
+ <div class="demo-controls">
61
+ <input type="file" accept="video/*" />
62
+ <button data-action="run">Generate Filmstrip</button>
63
+ </div>
64
+ <div class="filmstrip-controls">
65
+ <label>viewable range</label>
66
+ <input type="range" min="0" max="100" step="1" value="10" class="range">
67
+ <div class="range-view"></div>
68
+ <label>range size</label>
69
+ <input type="range" class="range-size" min="0.1" max="10" step="0.1" value="0.5">
70
+ <label>frequency</label>
71
+ <input type="range" class="frequency" min="0.1" max="120" step="0.1" value="10">
72
+ <div class="frequency-view">10 (fps)</div>
73
+ </div>
74
+ <div class="filmstrip"></div>
75
+ </article>
76
+
77
+ <article class="demo-card" data-demo="waveform">
78
+ <header>
79
+ <h2>Waveform</h2>
80
+ <p>Audio peak rendering with adjustable width.</p>
81
+ </header>
82
+ <div class="demo-controls">
83
+ <input type="file" accept="audio/*,video/*" />
84
+ <button data-action="run">Build Waveform</button>
85
+ </div>
86
+ <div class="waveform-controls">
87
+ <label>width</label>
88
+ <input class="width" type="range" min="100" max="1000000" value="1000" />
89
+ </div>
90
+ <div class="waveform-canvas"></div>
91
+ </article>
92
+
93
+ <article class="demo-card" data-demo="playback">
94
+ <header>
95
+ <h2>Timeline Playback</h2>
96
+ <p>Build timeline and run the playback engine.</p>
97
+ </header>
98
+ <div class="demo-controls">
99
+ <input type="file" accept="video/*,audio/*" />
100
+ </div>
101
+ <div class="player-canvas"></div>
102
+ <div class="player">
103
+ <div class="timeline">
104
+ <div class="track">
105
+ <div class="playhead"></div>
106
+ </div>
107
+ <input class="scrub" type="range" min="0" max="0" step="1" value="0">
108
+ </div>
109
+ <div class="timecode">0:00.000 / 0:00.000</div>
110
+ <div class="controls">
111
+ <button class=play disabled>play</button>
112
+ <button class=stop disabled>stop</button>
113
+ </div>
114
+ </div>
115
+ </article>
116
+
117
+ <article class="demo-card" data-demo="export">
118
+ <header>
119
+ <h2>Timeline Export</h2>
120
+ <p>Build timeline and export a render.</p>
121
+ </header>
122
+ <div class="demo-controls">
123
+ <input type="file" accept="video/*,audio/*" />
124
+ <button data-action="export" disabled>Export</button>
125
+ </div>
126
+ <div class="demo-progress">
127
+ <progress class="progress"></progress>
128
+ <span class="status">idle</span>
129
+ </div>
130
+ <div class="demo-preview"></div>
131
+ </article>
49
132
  </div>
133
+
50
134
  </section>
51
135
  `,
52
136
  }))
package/s/index.ts CHANGED
@@ -1,4 +1,5 @@
1
1
 
2
2
  export * from "./driver/driver.js"
3
+ export * from "./driver/driver-worker.js"
3
4
  export * from "./timeline/index.js"
4
5
 
@@ -0,0 +1,11 @@
1
+
2
+ import {Science} from "@e280/science"
3
+ import omniTest from "./timeline/sugar/omni.test.js"
4
+ import renderersTest from "./timeline/renderers/renderers.test.js"
5
+
6
+ await Science.run
7
+ ({
8
+ omniTest,
9
+ renderersTest
10
+ })
11
+
@@ -0,0 +1,28 @@
1
+
2
+ import {ssg, html} from "@e280/scute"
3
+
4
+ const title = "omnitool"
5
+ const domain = "omnitool.omniclip.app"
6
+ const favicon = "/assets/favicon.png"
7
+
8
+ export default ssg.page(import.meta.url, async orb => ({
9
+ title,
10
+ dark: true,
11
+ css: "demo/demo.css",
12
+ js: "tests.bundle.min.js",
13
+
14
+ head: html`
15
+ `,
16
+
17
+ socialCard: {
18
+ title,
19
+ description: "video processing toolkit",
20
+ themeColor: "#3cff9c",
21
+ siteName: domain,
22
+ image: `https://${domain}${favicon}`,
23
+ },
24
+
25
+ body: html`
26
+ `,
27
+ }))
28
+
@@ -5,8 +5,11 @@ export * from "./parts/media.js"
5
5
  export * from "./parts/resource-pool.js"
6
6
  export * from "./parts/resource.js"
7
7
  export * from "./parts/filmstrip.js"
8
+ export * from "./parts/waveform.js"
9
+ export * from "./renderers/player/player.js"
8
10
 
9
11
  export * from "./sugar/o.js"
12
+ export * from "./sugar/helpers.js"
10
13
  export * from "./sugar/omni.js"
11
14
 
12
15
  export * from "./utils/checksum.js"
@@ -11,7 +11,7 @@ export type TimelineFile = {
11
11
  info: "https://omniclip.app/"
12
12
  format: "timeline"
13
13
  version: number
14
- root: Id
14
+ rootId: Id
15
15
  items: Item.Any[]
16
16
  }
17
17
 
@@ -17,7 +17,7 @@ export class Filmstrip {
17
17
 
18
18
  private constructor(
19
19
  private videoTrack: InputVideoTrack,
20
- private options: Required<FilmstripOptions>
20
+ private options: FilmstripOptions
21
21
  ) {
22
22
  this.#sink = new CanvasSink(videoTrack, options.canvasSinkOptions)
23
23
  }
@@ -33,7 +33,8 @@ export class Filmstrip {
33
33
  videoTrack, {
34
34
  frequency: options.frequency ?? 1,
35
35
  canvasSinkOptions: options.canvasSinkOptions ?? {width: 80, height: 50, fit: "fill"},
36
- onChange: options.onChange
36
+ onChange: options.onChange,
37
+ onPlaceholders: options.onPlaceholders
37
38
  })
38
39
  else throw new Error("Source has no video track")
39
40
  }
@@ -54,9 +55,28 @@ export class Filmstrip {
54
55
  return this.options.frequency
55
56
  }
56
57
 
57
- #computeActiveRange([start, end]: TimeRange): TimeRange {
58
+ #computeActiveRange([start, end]: TimeRange, margin = 1): TimeRange {
58
59
  const tileSize = end - start
59
- return [start - tileSize, end + tileSize]
60
+ return [start - tileSize * margin, end + tileSize * margin]
61
+ }
62
+
63
+ async #generatePlaceholders() {
64
+ const [rangeStart, rangeEnd] = this.#activeRange
65
+ const neededTimestamps = new Set<number>()
66
+
67
+ // duration should be computed but with trim etc also
68
+ const duration = await this.videoTrack.computeDuration()
69
+ for (
70
+ let timestamp = Math.max(0, rangeStart);
71
+ timestamp <= rangeEnd;
72
+ timestamp += this.options.frequency
73
+ ) {
74
+ // Clamp to valid time range
75
+ if (timestamp >= 0 && timestamp <= duration)
76
+ neededTimestamps.add(timestamp)
77
+ }
78
+
79
+ this.options.onPlaceholders?.([...neededTimestamps])
60
80
  }
61
81
 
62
82
  async #generateTiles() {
@@ -66,13 +86,13 @@ export class Filmstrip {
66
86
  // duration should be computed but with trim etc also
67
87
  const duration = await this.videoTrack.computeDuration()
68
88
  for (
69
- let timestamp = rangeStart;
89
+ let timestamp = Math.max(0, rangeStart);
70
90
  timestamp <= rangeEnd;
71
91
  timestamp += this.options.frequency
72
92
  ) {
73
93
  // Clamp to valid time range
74
94
  if (timestamp >= 0 && timestamp <= duration)
75
- neededTimestamps.add(+timestamp.toFixed(3))
95
+ neededTimestamps.add(timestamp)
76
96
  }
77
97
 
78
98
  const missingTimestamps = [...neededTimestamps]
@@ -106,15 +126,20 @@ export class Filmstrip {
106
126
  * @param visibleRange - The current timeline viewport as a [start, end] tuple in seconds.
107
127
  */
108
128
  set range(visibleRange: TimeRange) {
109
- const newRange = this.#computeActiveRange(visibleRange)
110
- // Avoid redundant updates
111
- if (
112
- this.#activeRange[0] === newRange[0] &&
113
- this.#activeRange[1] === newRange[1]
114
- )
115
- return
129
+ const [visStart, visEnd] = visibleRange
130
+ const visibleSize = visEnd - visStart
131
+ const [actStart, actEnd] = this.#activeRange
132
+
133
+ // trigger when we're 1x visible width away from margin edges
134
+ const leftTrigger = actStart + visibleSize
135
+ const rightTrigger = actEnd - visibleSize
136
+
137
+ const nearLeftEdge = visStart < leftTrigger
138
+ const nearRightEdge = visEnd > rightTrigger
139
+
140
+ if (!nearLeftEdge && !nearRightEdge) return
116
141
 
117
- this.#activeRange = newRange
142
+ this.#activeRange = this.#computeActiveRange(visibleRange, 2)
118
143
  this.#update()
119
144
  }
120
145
 
@@ -122,6 +147,7 @@ export class Filmstrip {
122
147
  #shouldRunAgain = false
123
148
 
124
149
  async #update() {
150
+ this.#generatePlaceholders()
125
151
  // Perform update immediately. If multiple updates are requested while updating,
126
152
  // only the latest one will run after the current finishes (skips intermediate ones).
127
153
  if(this.#updating) {
@@ -147,11 +173,12 @@ export class Filmstrip {
147
173
  }
148
174
  }
149
175
 
150
- type TimeRange = [number, number]
176
+ export type TimeRange = [start: number, end: number]
151
177
 
152
178
  interface FilmstripOptions {
153
- frequency?: number
179
+ frequency: number
154
180
  canvasSinkOptions?: CanvasSinkOptions
181
+ onPlaceholders?: (timestamps: number[]) => void
155
182
  onChange: (tiles: {
156
183
  time: number
157
184
  canvas: WrappedCanvas
@@ -1,12 +1,20 @@
1
1
 
2
+ import {TextStyleOptions} from "pixi.js"
3
+
2
4
  import {Id, Hash} from "./basics.js"
5
+ import {Transform} from "../types.js"
6
+ import {Ms} from "../../units/ms.js"
3
7
 
4
8
  export enum Kind {
5
9
  Sequence,
6
10
  Stack,
7
- Clip,
11
+ Video,
12
+ Audio,
8
13
  Text,
14
+ Gap,
15
+ Spatial,
9
16
  Transition,
17
+ TextStyle
10
18
  }
11
19
 
12
20
  export enum Effect {
@@ -14,30 +22,64 @@ export enum Effect {
14
22
  }
15
23
 
16
24
  export namespace Item {
25
+ export type TextStyle = {
26
+ id: Id
27
+ kind: Kind.TextStyle
28
+ style: TextStyleOptions
29
+ }
30
+
31
+ export type Spatial = {
32
+ id: Id
33
+ kind: Kind.Spatial
34
+ transform: Transform
35
+ enabled: boolean
36
+ }
37
+
38
+ export type Gap = {
39
+ id: Id
40
+ kind: Kind.Gap
41
+ duration: number
42
+ }
43
+
17
44
  export type Sequence = {
18
45
  id: Id
19
46
  kind: Kind.Sequence
20
- children: Id[]
47
+ childrenIds: Id[]
48
+ spatialId?: Id
21
49
  }
22
50
 
23
51
  export type Stack = {
24
52
  id: Id
25
53
  kind: Kind.Stack
26
- children: Id[]
54
+ childrenIds: Id[]
55
+ spatialId?: Id
56
+ }
57
+
58
+ export type Video = {
59
+ id: Id
60
+ kind: Kind.Video
61
+ mediaHash: Hash
62
+ start: number
63
+ duration: number
64
+ spatialId?: Id
27
65
  }
28
66
 
29
- export type Clip = {
67
+ export type Audio = {
30
68
  id: Id
31
- kind: Kind.Clip
69
+ kind: Kind.Audio
32
70
  mediaHash: Hash
33
71
  start: number
34
72
  duration: number
73
+ gain?: number
35
74
  }
36
75
 
37
76
  export type Text = {
38
77
  id: Id
39
78
  kind: Kind.Text
40
79
  content: string
80
+ duration: number
81
+ spatialId?: Id
82
+ styleId?: Id
41
83
  }
42
84
 
43
85
  export type Transition = {
@@ -50,9 +92,20 @@ export namespace Item {
50
92
  export type Any = (
51
93
  | Sequence
52
94
  | Stack
53
- | Clip
95
+ | Video
96
+ | Audio
54
97
  | Text
98
+ | Gap
55
99
  | Transition
100
+ | Spatial
101
+ | TextStyle
56
102
  )
57
103
  }
58
104
 
105
+ export type ContainerItem = Item.Sequence | Item.Stack
106
+ export type NonContainerItem = Exclude<Item.Any, ContainerItem>
107
+
108
+ export type PlayableItem = Item.Any & {
109
+ start: Ms
110
+ duration: Ms
111
+ }