@omnimedia/omnitool 1.1.0-7 → 1.1.0-70

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 +187 -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 +20 -0
  161. package/x/driver/parts/compositor.js +159 -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,49 @@
1
+
2
+ import {Fps} from "../../../../units/fps.js"
3
+ import {CursorVisualSampler} from "./cursor.js"
4
+ import {Driver} from "../../../../driver/driver.js"
5
+ import {fixedStep} from "../../parts/schedulers.js"
6
+ import {TimelineFile} from "../../../parts/basics.js"
7
+ import {computeItemDuration} from "../../parts/handy.js"
8
+ import {DecoderSource} from "../../../../driver/fns/schematic.js"
9
+
10
+ export function produceVideo({
11
+ timeline,
12
+ fps,
13
+ driver,
14
+ resolveMedia,
15
+ }: {
16
+ driver: Driver
17
+ resolveMedia: (hash: string) => DecoderSource
18
+ timeline: TimelineFile
19
+ fps: Fps
20
+ }) {
21
+
22
+ const stream = new TransformStream<VideoFrame, VideoFrame>()
23
+ const writer = stream.writable.getWriter()
24
+ const sampler = new CursorVisualSampler(driver, resolveMedia, timeline)
25
+ const dt = 1 / fps
26
+ const duration = computeItemDuration(timeline.rootId, timeline)
27
+
28
+ async function produce() {
29
+ await fixedStep({fps, duration}, async (timecode, i) => {
30
+ const layers = await sampler.next(timecode)
31
+ const composed = await driver.composite(layers)
32
+
33
+ const frame = new VideoFrame(composed, {
34
+ timestamp: Math.round(i * dt * 1_000_000),
35
+ duration: Math.round(dt * 1_000_000)
36
+ })
37
+
38
+ await writer.write(frame)
39
+ composed.close()
40
+ })
41
+
42
+ await writer.close()
43
+ }
44
+
45
+ produce()
46
+
47
+ return stream.readable
48
+ }
49
+
@@ -0,0 +1,48 @@
1
+
2
+ const resampleLinear = (
3
+ src: Float32Array,
4
+ fromRate: number,
5
+ targetRate: number
6
+ ) => {
7
+ if (fromRate === targetRate)
8
+ return src
9
+
10
+ const ratio = targetRate / fromRate
11
+ const outFrames = Math.max(1, Math.round(src.length * ratio))
12
+ const out = new Float32Array(outFrames)
13
+
14
+ for (let i = 0; i < outFrames; i++) {
15
+ const t = i / ratio
16
+ const i0 = Math.floor(t)
17
+ const i1 = Math.min(i0 + 1, src.length - 1)
18
+ const frac = t - i0
19
+ out[i] = src[i0] * (1 - frac) + src[i1] * frac
20
+ }
21
+
22
+ return out
23
+ }
24
+
25
+ export const resampleToPlanar = (
26
+ sample: {
27
+ numberOfFrames: number
28
+ numberOfChannels: number
29
+ sampleRate: number
30
+ copyTo: (dest: Float32Array, options: {planeIndex: number; format: 'f32-planar'}) => void
31
+ },
32
+ targetRate: number
33
+ ): {data: Float32Array[]; frames: number} => {
34
+ const channels = sample.numberOfChannels
35
+ const data = new Array<Float32Array>(channels)
36
+ let frames = 0
37
+
38
+ for (let ch = 0; ch < channels; ch++) {
39
+ const plane = new Float32Array(sample.numberOfFrames)
40
+ sample.copyTo(plane, {planeIndex: ch, format: 'f32-planar'})
41
+ const resampled = resampleLinear(plane, sample.sampleRate, targetRate)
42
+ data[ch] = resampled
43
+ frames = resampled.length
44
+ }
45
+
46
+ return {data, frames}
47
+ }
48
+
@@ -0,0 +1,28 @@
1
+
2
+ import {Fps} from "../../../units/fps.js"
3
+ import {Driver} from "../../../driver/driver.js"
4
+ import {TimelineFile} from "../../parts/basics.js"
5
+ import {produceAudio} from "./parts/produce-audio.js"
6
+ import {produceVideo} from "./parts/produce-video.js"
7
+ import {DecoderSource} from "../../../driver/fns/schematic.js"
8
+
9
+ export function produce(opts: {
10
+ timeline: TimelineFile
11
+ fps: Fps
12
+ driver: Driver
13
+ resolveMedia: (hash: string) => DecoderSource
14
+ }) {
15
+
16
+ const audio = produceAudio({...opts})
17
+ const video = produceVideo({...opts})
18
+
19
+ return opts.driver.encode({
20
+ video,
21
+ audio,
22
+ config: {
23
+ audio: {codec: 'opus', bitrate: 128000},
24
+ video: {codec: 'vp9', bitrate: 1000000}
25
+ }
26
+ })
27
+ }
28
+
@@ -0,0 +1,360 @@
1
+
2
+ import {ms, Ms} from '../../../units/ms.js'
3
+ import {Id, TimelineFile} from '../../parts/basics.js'
4
+ import {I6, Mat6, mul6, transformToMat6} from '../../utils/matrix.js'
5
+ import {ContainerItem, Item, Kind, PlayableItem} from '../../parts/item.js'
6
+
7
+ function isPlayableItem(item: Item.Any): item is PlayableItem {
8
+ return 'duration' in item
9
+ }
10
+
11
+ type WalkAtCallbacks = {
12
+ sequence: (x: Item.Sequence, localTime: Ms, ancestors: ContainerItem[]) => void
13
+ stack: (x: Item.Stack, localTime: Ms, ancestors: ContainerItem[]) => void
14
+ video: (x: Item.Video, localTime: Ms, ancestors: ContainerItem[]) => void
15
+ text: (x: Item.Text, localTime: Ms, ancestors: ContainerItem[]) => void
16
+ audio: (x: Item.Audio, localTime: Ms, ancestors: ContainerItem[]) => void
17
+ }
18
+
19
+ type WalkCallbacks = {
20
+ sequence?: (x: Item.Sequence, matrix: Mat6, ancestors: ContainerItem[]) => void
21
+ stack?: (x: Item.Stack, matrix: Mat6, ancestors: ContainerItem[]) => void
22
+ video?: (x: Item.Video, matrix: Mat6, ancestors: ContainerItem[]) => void
23
+ text?: (x: Item.Text, matrix: Mat6, ancestors: ContainerItem[]) => void
24
+ audio?: (x: Item.Audio) => void
25
+ }
26
+
27
+ interface Props {
28
+ timeline: TimelineFile
29
+ timecode: Ms
30
+ }
31
+
32
+ interface At {
33
+ item: Item.Any
34
+ localTime: Ms
35
+ ancestors: ContainerItem[]
36
+ }
37
+
38
+ export function itemsAt(p: Props): At[] {
39
+ const results: At[] = []
40
+ const itemMap = new Map(p.timeline.items.map(item => [item.id, item]))
41
+
42
+ walkAt(p.timeline.rootId, itemMap, p.timecode, {
43
+ sequence: () => { },
44
+ stack: () => { },
45
+ video: (item, localTime, ancestors) => results.push({ item, localTime, ancestors }),
46
+ text: (item, localTime, ancestors) => results.push({ item, localTime, ancestors }),
47
+ audio: (item, localTime, ancestors) => results.push({ item, localTime, ancestors })
48
+ })
49
+
50
+ return results
51
+ }
52
+
53
+ interface FromProps {
54
+ timeline: TimelineFile
55
+ from: Ms
56
+ }
57
+
58
+ export function itemsFrom(p: FromProps): At[] {
59
+ const results: At[] = []
60
+ const itemMap = new Map(p.timeline.items.map(item => [item.id, item]))
61
+
62
+ walkFrom(p.timeline.rootId, itemMap, p.from, {
63
+ sequence: () => { },
64
+ stack: () => { },
65
+ video: (item, localTime, ancestors) => results.push({ item, localTime, ancestors }),
66
+ text: (item, localTime, ancestors) => results.push({ item, localTime, ancestors }),
67
+ audio: (item, localTime, ancestors) => results.push({ item, localTime, ancestors })
68
+ })
69
+
70
+ return results
71
+ }
72
+
73
+ export function computeWorldMatrix(
74
+ items: Map<Id, Item.Any>,
75
+ ancestors: ContainerItem[],
76
+ item: Item.Any
77
+ ): Mat6 {
78
+ let world = I6
79
+
80
+ for (const ancestor of ancestors) {
81
+ world = applySpatialIfAny(items, ancestor, world)
82
+ }
83
+
84
+ return applySpatialIfAny(items, item, world)
85
+ }
86
+
87
+ function applySpatialIfAny(
88
+ items: Map<Id, Item.Any>,
89
+ item: Item.Any,
90
+ parentMatrix: Mat6
91
+ ) {
92
+ if ("spatialId" in item && item.spatialId) {
93
+ const spatial = items.get(item.spatialId) as Item.Spatial | undefined
94
+ if (spatial?.enabled) {
95
+ const local = transformToMat6(spatial.transform)
96
+ return mul6(local, parentMatrix)
97
+ }
98
+ }
99
+ return parentMatrix
100
+ }
101
+
102
+ export function walk(
103
+ id: Id,
104
+ items: Map<Id, Item.Any>,
105
+ parentMatrix: Mat6,
106
+ callbacks: WalkCallbacks,
107
+ ancestors: ContainerItem[] = []
108
+ ) {
109
+ const item = items.get(id)
110
+ if (!item) return
111
+
112
+ let currentMatrix = parentMatrix
113
+
114
+ if ("spatialId" in item && item.spatialId) {
115
+ const spatial = items.get(item.spatialId) as Item.Spatial
116
+ if (spatial.enabled) {
117
+ const local = transformToMat6(spatial.transform)
118
+ currentMatrix = mul6(local, currentMatrix)
119
+ }
120
+ }
121
+
122
+ switch (item.kind) {
123
+ case Kind.Stack:
124
+ callbacks.stack?.(item, currentMatrix, ancestors)
125
+ for (const childId of item.childrenIds) {
126
+ walk(childId, items, currentMatrix, callbacks, [...ancestors, item])
127
+ }
128
+ break
129
+
130
+ case Kind.Sequence: {
131
+ callbacks.sequence?.(item, currentMatrix, ancestors)
132
+
133
+ for (const childId of item.childrenIds) {
134
+ const child = items.get(childId)
135
+
136
+ if (!child)
137
+ continue
138
+ if (!isPlayableItem(child)) {
139
+ continue
140
+ }
141
+
142
+ walk(
143
+ childId,
144
+ items,
145
+ currentMatrix,
146
+ callbacks,
147
+ [...ancestors, item]
148
+ )
149
+ }
150
+
151
+ break
152
+ }
153
+
154
+ case Kind.Video:
155
+ callbacks.video?.(item, currentMatrix, ancestors)
156
+ break
157
+
158
+ case Kind.Text:
159
+ callbacks.text?.(item, currentMatrix, ancestors)
160
+ break
161
+
162
+ case Kind.Audio:
163
+ callbacks.audio?.(item)
164
+ break
165
+ }
166
+ }
167
+
168
+
169
+ function walkAt(
170
+ id: Id,
171
+ items: Map<Id, Item.Any>,
172
+ time: Ms,
173
+ callbacks: WalkAtCallbacks,
174
+ ancestors: ContainerItem[] = []
175
+ ) {
176
+ const item = items.get(id)
177
+ if (!item) return
178
+
179
+ switch (item.kind) {
180
+ case Kind.Stack:
181
+ callbacks.stack(item, time, ancestors)
182
+ for (const childId of item.childrenIds) {
183
+ walkAt(childId, items, time, callbacks, [...ancestors, item])
184
+ }
185
+ break
186
+
187
+ case Kind.Sequence: {
188
+ callbacks.sequence(item, time, ancestors)
189
+
190
+ let offset = ms(0)
191
+
192
+ for (const childId of item.childrenIds) {
193
+ const child = items.get(childId)
194
+
195
+ if (!child)
196
+ continue
197
+ if (!isPlayableItem(child)) {
198
+ continue
199
+ }
200
+
201
+ if (time >= offset && time < offset + child.duration) {
202
+ const localTime = ms(time - offset)
203
+ walkAt(
204
+ childId,
205
+ items,
206
+ localTime,
207
+ callbacks,
208
+ [...ancestors, item]
209
+ )
210
+ break
211
+ }
212
+
213
+ offset = ms(offset + child.duration)
214
+ }
215
+
216
+ break
217
+ }
218
+
219
+ case Kind.Video:
220
+ callbacks.video(item, time, ancestors)
221
+ break
222
+
223
+ case Kind.Text:
224
+ callbacks.text(item, time, ancestors)
225
+ break
226
+
227
+ case Kind.Audio:
228
+ callbacks.audio(item, time, ancestors)
229
+ break
230
+ }
231
+ }
232
+
233
+ function walkFrom(
234
+ id: Id,
235
+ items: Map<Id, Item.Any>,
236
+ from: Ms,
237
+ callbacks: WalkAtCallbacks,
238
+ ancestors: ContainerItem[] = []
239
+ ) {
240
+ const item = items.get(id)
241
+ if (!item) return
242
+
243
+ switch (item.kind) {
244
+ case Kind.Stack:
245
+ callbacks.stack(item, from, ancestors)
246
+ for (const childId of item.childrenIds) {
247
+ walkFrom(childId, items, from, callbacks, [...ancestors, item])
248
+ }
249
+ break
250
+
251
+ case Kind.Sequence: {
252
+ callbacks.sequence(item, from, ancestors)
253
+
254
+ let offset = ms(0)
255
+
256
+ for (const childId of item.childrenIds) {
257
+ const child = items.get(childId)
258
+
259
+ if (!child)
260
+ continue
261
+ if (!isPlayableItem(child)) {
262
+ continue
263
+ }
264
+
265
+ const end = ms(offset + child.duration)
266
+ if (from >= end) {
267
+ offset = end
268
+ continue
269
+ }
270
+
271
+ const localTime = ms(Math.max(0, from - offset))
272
+ walkFrom(
273
+ childId,
274
+ items,
275
+ localTime,
276
+ callbacks,
277
+ [...ancestors, item]
278
+ )
279
+
280
+ offset = end
281
+ }
282
+
283
+ break
284
+ }
285
+
286
+ case Kind.Video:
287
+ callbacks.video(item, from, ancestors)
288
+ break
289
+
290
+ case Kind.Text:
291
+ callbacks.text(item, from, ancestors)
292
+ break
293
+
294
+ case Kind.Audio:
295
+ callbacks.audio(item, from, ancestors)
296
+ break
297
+ }
298
+ }
299
+
300
+ export function computeItemDuration(
301
+ id: number,
302
+ timeline: TimelineFile
303
+ ): Ms {
304
+ const item = timeline.items.find(item => item.id === id)
305
+
306
+ if (!item) return ms(0)
307
+
308
+ switch (item.kind) {
309
+ case Kind.Sequence: {
310
+ const children = item.childrenIds
311
+ .map(childId => timeline.items.find(x => x.id === childId))
312
+ .filter(Boolean) as Item.Any[]
313
+
314
+ let total = ms(0)
315
+
316
+ for (let i = 0; i < children.length; i++) {
317
+ const child = children[i]
318
+
319
+ if (child.kind === Kind.Transition) {
320
+ const prev = children[i - 1]
321
+ const next = children[i + 1]
322
+
323
+ if (prev && next && prev.kind !== Kind.Transition && next.kind !== Kind.Transition) {
324
+ const prevDur = computeItemDuration(prev.id, timeline)
325
+ const nextDur = computeItemDuration(next.id, timeline)
326
+ const overlap = Math.max(0, Math.min(child.duration, prevDur, nextDur))
327
+
328
+ total = ms(total - overlap)
329
+ }
330
+ continue
331
+ }
332
+
333
+ total = ms(total + computeItemDuration(child.id, timeline))
334
+ }
335
+
336
+ return total
337
+ }
338
+
339
+ case Kind.Stack: {
340
+ let longest = ms(0)
341
+
342
+ for (const childId of item.childrenIds) {
343
+ const duration = computeItemDuration(childId, timeline)
344
+ if (duration > longest) {
345
+ longest = duration
346
+ }
347
+ }
348
+
349
+ return longest
350
+ }
351
+
352
+ default: {
353
+ if (!isPlayableItem(item))
354
+ return ms(0)
355
+
356
+ return item.duration
357
+ }
358
+ }
359
+ }
360
+
@@ -0,0 +1,19 @@
1
+
2
+ import {ActiveStream} from "./types.js"
3
+
4
+ export function findEarliestStream(streams: ActiveStream[]) {
5
+ let earliest = {
6
+ index: 0,
7
+ stream: streams[0],
8
+ time: streams[0].timelineTime()
9
+ }
10
+
11
+ for (const [index, stream] of streams.entries()) {
12
+ const time = stream.timelineTime()
13
+ if (time < earliest.time) {
14
+ earliest = {time, stream, index}
15
+ }
16
+ }
17
+
18
+ return earliest
19
+ }
@@ -0,0 +1,60 @@
1
+
2
+ import {AudioSinkPool} from "./sink.js"
3
+ import {ActiveStream} from "./types.js"
4
+ import {itemsFrom} from "../../../handy.js"
5
+ import {Ms} from "../../../../../../units/ms.js"
6
+ import {Kind} from "../../../../../parts/item.js"
7
+ import {seconds} from "../../../../../../units/seconds.js"
8
+
9
+ export async function initStreams(
10
+ pool: AudioSinkPool,
11
+ items: ReturnType<typeof itemsFrom>,
12
+ from: Ms
13
+ ): Promise<ActiveStream[]> {
14
+ const streams = await Promise.all(
15
+ items.map(async ({item, localTime}) => {
16
+ if (item.kind !== Kind.Audio)
17
+ return
18
+
19
+ const sink = await pool.getSink(item.mediaHash)
20
+ if (!sink)
21
+ return
22
+
23
+ const mediaTime = item.start + localTime
24
+ const offset = seconds((from - mediaTime) / 1000)
25
+ const iter = sink.samples(mediaTime / 1000)
26
+
27
+ const first = await iter.next()
28
+ if (first.done)
29
+ return
30
+
31
+ let currentSample = first.value
32
+ let nextPromise = iter.next()
33
+
34
+ return {
35
+ offset,
36
+ gain: item.gain ?? 1,
37
+ get currentSample() {return currentSample},
38
+ timelineTime: () => seconds(offset + currentSample.timestamp),
39
+ output: () => ({
40
+ sample: currentSample,
41
+ timestamp: offset + currentSample.timestamp,
42
+ gain: item.gain ?? 1
43
+ }),
44
+ advance: async () => {
45
+ const result = await nextPromise
46
+ if (result.done)
47
+ return false
48
+
49
+ currentSample = result.value
50
+ nextPromise = iter.next()
51
+
52
+ return true
53
+ }
54
+ }
55
+ })
56
+ )
57
+
58
+ return streams.filter((stream): stream is ActiveStream => !!stream)
59
+ }
60
+
@@ -0,0 +1,38 @@
1
+
2
+ import {ALL_FORMATS, Input, AudioSampleSink} from "mediabunny"
3
+
4
+ import {DecoderSource} from "../../../../../../driver/fns/schematic.js"
5
+ import {loadDecoderSource} from "../../../../../../driver/utils/load-decoder-source.js"
6
+
7
+ type SinkState = {
8
+ input: Input
9
+ sink: AudioSampleSink | null
10
+ }
11
+
12
+ export class AudioSinkPool {
13
+ readonly #sinks = new Map<string, SinkState>()
14
+
15
+ constructor(
16
+ private resolveMedia: (hash: string) => DecoderSource
17
+ ) {}
18
+
19
+ async getSink(hash: string) {
20
+ const existing = this.#sinks.get(hash)
21
+
22
+ if (existing)
23
+ return existing.sink
24
+
25
+ const input = new Input({
26
+ formats: ALL_FORMATS,
27
+ source: await loadDecoderSource(this.resolveMedia(hash)),
28
+ })
29
+
30
+ const audioTrack = await input.getPrimaryAudioTrack()
31
+ const canDecodeAudio = !!audioTrack && await audioTrack.canDecode()
32
+ const sink = canDecodeAudio && audioTrack ? new AudioSampleSink(audioTrack) : null
33
+
34
+ this.#sinks.set(hash, {input, sink})
35
+
36
+ return sink
37
+ }
38
+ }
@@ -0,0 +1,16 @@
1
+
2
+ import {AudioSample} from "mediabunny"
3
+ import {Seconds} from "../../../../../../units/seconds.js"
4
+
5
+ export type ActiveStream = {
6
+ offset: Seconds
7
+ gain: number
8
+ currentSample: AudioSample
9
+ timelineTime: () => Seconds
10
+ output: () => {
11
+ sample: AudioSample
12
+ timestamp: number
13
+ gain: number
14
+ }
15
+ advance: () => Promise<boolean>
16
+ }
@@ -0,0 +1,35 @@
1
+
2
+ import {AudioSample} from "mediabunny"
3
+
4
+ import {itemsFrom} from "../../handy.js"
5
+ import {initStreams} from "./parts/init.js"
6
+ import {AudioSinkPool} from "./parts/sink.js"
7
+ import {Ms} from "../../../../../units/ms.js"
8
+ import {findEarliestStream} from "./parts/find.js"
9
+ import {TimelineFile} from "../../../../parts/basics.js"
10
+ import {DecoderSource} from "../../../../../driver/fns/schematic.js"
11
+
12
+ export function createAudioSampler(resolveMedia: (hash: string) => DecoderSource) {
13
+ const sinkPool = new AudioSinkPool(resolveMedia)
14
+
15
+ return {
16
+ async *sampleAudio(timeline: TimelineFile, from: Ms) {
17
+ const items = itemsFrom({timeline, from})
18
+ const streams = await initStreams(sinkPool, items, from)
19
+
20
+ while (streams.length > 0) {
21
+ const {stream, index} = findEarliestStream(streams)
22
+
23
+ yield stream.output()
24
+
25
+ const advancing = await stream.advance()
26
+
27
+ if (!advancing) {
28
+ streams.splice(index, 1)
29
+ }
30
+ }
31
+
32
+ }
33
+ }
34
+ }
35
+
@@ -0,0 +1,16 @@
1
+
2
+ import {VideoSink} from "./sink.js"
3
+ import {Ms} from "../../../../../../units/ms.js"
4
+ import {Item} from "../../../../../parts/item.js"
5
+
6
+ export type VideoSampler = (item: Item.Video, time: Ms) => Promise<VideoFrame | undefined>
7
+
8
+ export function createDefaultVideoSampler(sink: VideoSink): VideoSampler {
9
+ return async (item, time) => {
10
+ const s = await sink.getSink(item.mediaHash)
11
+ const sample = await s?.getSample(time / 1000)
12
+ const frame = sample?.toVideoFrame()
13
+ sample?.close()
14
+ return frame ?? undefined
15
+ }
16
+ }