@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.
- package/README.md +143 -80
- package/package.json +18 -17
- package/s/context.ts +0 -7
- package/s/demo/demo.bundle.ts +104 -43
- package/s/demo/demo.css +244 -14
- package/s/demo/routines/export-test.ts +16 -0
- package/s/demo/routines/filmstrip-test.ts +22 -18
- package/s/demo/routines/load-video.ts +2 -3
- package/s/demo/routines/playback-test.ts +61 -0
- package/s/demo/routines/timeline-setup.ts +24 -0
- package/s/demo/routines/transcode-test.ts +19 -5
- package/s/demo/routines/transitions-test.ts +2 -2
- package/s/demo/routines/waveform-test.ts +35 -8
- package/s/driver/driver-worker.ts +9 -0
- package/s/driver/driver.test.ts +1 -1
- package/s/driver/driver.ts +43 -42
- package/s/driver/fns/schematic.ts +11 -5
- package/s/driver/fns/work.ts +65 -189
- package/s/driver/parts/compositor.ts +219 -0
- package/s/driver/parts/machina.ts +19 -20
- package/s/index.html.ts +103 -25
- package/s/index.ts +1 -0
- package/s/tests.bundle.ts +11 -0
- package/s/tests.html.ts +28 -0
- package/s/timeline/index.ts +5 -0
- package/s/timeline/parts/filmstrip.ts +43 -16
- package/s/timeline/parts/item.ts +27 -6
- package/s/timeline/parts/media.ts +12 -2
- package/s/timeline/parts/resource-pool.ts +8 -5
- package/s/timeline/parts/resource.ts +3 -0
- package/s/timeline/parts/waveform/parts/collect.ts +72 -0
- package/s/timeline/parts/waveform/parts/render.ts +45 -0
- package/s/timeline/parts/waveform/parts/types.ts +24 -0
- package/s/timeline/parts/waveform/waveform.ts +161 -0
- package/s/timeline/renderers/export/parts/audio-gain.ts +17 -0
- package/s/timeline/renderers/export/parts/audio-mix.ts +133 -0
- package/s/timeline/renderers/export/parts/cursor.ts +129 -0
- package/s/timeline/renderers/export/parts/produce-audio.ts +64 -0
- package/s/timeline/renderers/export/parts/produce-video.ts +49 -0
- package/s/timeline/renderers/export/parts/resamplers.ts +48 -0
- package/s/timeline/renderers/export/produce.ts +28 -0
- package/s/timeline/renderers/parts/handy.ts +360 -0
- package/s/timeline/renderers/parts/samplers/audio/parts/find.ts +19 -0
- package/s/timeline/renderers/parts/samplers/audio/parts/init.ts +60 -0
- package/s/timeline/renderers/parts/samplers/audio/parts/sink.ts +38 -0
- package/s/timeline/renderers/parts/samplers/audio/parts/types.ts +16 -0
- package/s/timeline/renderers/parts/samplers/audio/sampler.ts +35 -0
- package/s/timeline/renderers/parts/samplers/visual/parts/defaults.ts +16 -0
- package/s/timeline/renderers/parts/samplers/visual/parts/sample.ts +59 -0
- package/s/timeline/renderers/parts/samplers/visual/parts/sequence.ts +111 -0
- package/s/timeline/renderers/parts/samplers/visual/parts/sink.ts +38 -0
- package/s/timeline/renderers/parts/samplers/visual/parts/transition.ts +28 -0
- package/s/timeline/renderers/parts/samplers/visual/parts/types.ts +10 -0
- package/s/timeline/renderers/parts/samplers/visual/sampler.ts +28 -0
- package/s/timeline/renderers/parts/schedulers.ts +96 -0
- package/s/timeline/renderers/player/parts/playback.ts +159 -0
- package/s/timeline/renderers/player/player.ts +77 -0
- package/s/timeline/renderers/renderers.test.ts +385 -0
- package/s/timeline/sugar/helpers.ts +85 -0
- package/s/timeline/sugar/o.ts +138 -57
- package/s/timeline/sugar/omni.test.ts +210 -0
- package/s/timeline/sugar/omni.ts +35 -12
- package/s/timeline/utils/checksum.ts +3 -1
- package/s/timeline/utils/datafile.ts +15 -4
- package/s/timeline/utils/dummy-data.ts +3 -3
- package/s/units/fps.ts +8 -0
- package/s/units/ms.ts +8 -0
- package/s/units/seconds.ts +8 -0
- package/x/WebGLRenderer-7X274AYV.js +2 -0
- package/x/WebGLRenderer-7X274AYV.js.map +7 -0
- package/x/WebGPURenderer-XMCMEXAO.js +2 -0
- package/x/WebGPURenderer-XMCMEXAO.js.map +7 -0
- package/x/browserAll-6TVTCHHE.js +2 -0
- package/x/browserAll-6TVTCHHE.js.map +7 -0
- package/x/chunk-4ONWQOPX.js +157 -0
- package/x/chunk-4ONWQOPX.js.map +7 -0
- package/x/chunk-63NSCXPX.js +2 -0
- package/x/chunk-63NSCXPX.js.map +7 -0
- package/x/chunk-A45M2HJC.js +2 -0
- package/x/chunk-A45M2HJC.js.map +7 -0
- package/x/chunk-OTQK6FAJ.js +15 -0
- package/x/chunk-OTQK6FAJ.js.map +7 -0
- package/x/chunk-Q7JBQNE4.js +42 -0
- package/x/chunk-Q7JBQNE4.js.map +7 -0
- package/x/chunk-W33LM336.js +393 -0
- package/x/chunk-W33LM336.js.map +7 -0
- package/x/chunk-W5CN46AR.js +327 -0
- package/x/chunk-W5CN46AR.js.map +7 -0
- package/x/chunk-WFT3KTZG.js +269 -0
- package/x/chunk-WFT3KTZG.js.map +7 -0
- package/x/context.d.ts +1 -4
- package/x/context.js +1 -5
- package/x/context.js.map +1 -1
- package/x/demo/WebGLRenderer-NLGJGAXK.js +2 -0
- package/x/demo/WebGLRenderer-NLGJGAXK.js.map +7 -0
- package/x/demo/WebGPURenderer-RBOFXPL5.js +2 -0
- package/x/demo/WebGPURenderer-RBOFXPL5.js.map +7 -0
- package/x/demo/browserAll-5AZHDDG6.js +2 -0
- package/x/demo/browserAll-5AZHDDG6.js.map +7 -0
- package/x/demo/chunk-5ZZYIILO.js +393 -0
- package/x/demo/chunk-5ZZYIILO.js.map +7 -0
- package/x/demo/chunk-P3PTHHFE.js +42 -0
- package/x/demo/chunk-P3PTHHFE.js.map +7 -0
- package/x/demo/chunk-PYG4RZZ2.js +269 -0
- package/x/demo/chunk-PYG4RZZ2.js.map +7 -0
- package/x/demo/chunk-Q4MWBZHL.js +157 -0
- package/x/demo/chunk-Q4MWBZHL.js.map +7 -0
- package/x/demo/chunk-T3METYEY.js +15 -0
- package/x/demo/chunk-T3METYEY.js.map +7 -0
- package/x/demo/chunk-USLRKDKD.js +2 -0
- package/x/demo/chunk-USLRKDKD.js.map +7 -0
- package/x/demo/chunk-YISSXWBT.js +327 -0
- package/x/demo/chunk-YISSXWBT.js.map +7 -0
- package/x/demo/chunk-YJQWVIHX.js +2 -0
- package/x/demo/chunk-YJQWVIHX.js.map +7 -0
- package/x/demo/demo.bundle.js +94 -40
- package/x/demo/demo.bundle.js.map +1 -1
- package/x/demo/demo.bundle.min.js +2421 -81
- package/x/demo/demo.bundle.min.js.map +4 -4
- package/x/demo/demo.css +244 -14
- package/x/demo/routines/export-test.d.ts +2 -0
- package/x/demo/routines/export-test.js +10 -0
- package/x/demo/routines/export-test.js.map +1 -0
- package/x/demo/routines/filmstrip-test.d.ts +1 -1
- package/x/demo/routines/filmstrip-test.js +20 -17
- package/x/demo/routines/filmstrip-test.js.map +1 -1
- package/x/demo/routines/load-video.d.ts +1 -1
- package/x/demo/routines/load-video.js +1 -2
- package/x/demo/routines/load-video.js.map +1 -1
- package/x/demo/routines/playback-test.d.ts +2 -0
- package/x/demo/routines/playback-test.js +51 -0
- package/x/demo/routines/playback-test.js.map +1 -0
- package/x/demo/routines/timeline-setup.d.ts +6 -0
- package/x/demo/routines/timeline-setup.js +13 -0
- package/x/demo/routines/timeline-setup.js.map +1 -0
- package/x/demo/routines/transcode-test.js +15 -5
- package/x/demo/routines/transcode-test.js.map +1 -1
- package/x/demo/routines/transitions-test.js +2 -2
- package/x/demo/routines/transitions-test.js.map +1 -1
- package/x/demo/routines/waveform-test.d.ts +2 -1
- package/x/demo/routines/waveform-test.js +29 -8
- package/x/demo/routines/waveform-test.js.map +1 -1
- package/x/demo/webworkerAll-QKIC5O27.js +2 -0
- package/x/demo/webworkerAll-QKIC5O27.js.map +7 -0
- package/x/driver/driver-worker.d.ts +1 -0
- package/x/driver/driver-worker.js +6 -0
- package/x/driver/driver-worker.js.map +1 -0
- package/x/driver/driver.d.ts +25 -8
- package/x/driver/driver.js +43 -39
- package/x/driver/driver.js.map +1 -1
- package/x/driver/driver.test.js +1 -1
- package/x/driver/driver.test.js.map +1 -1
- package/x/driver/driver.worker.bundle.min.js +117 -3506
- package/x/driver/driver.worker.bundle.min.js.map +4 -4
- package/x/driver/fns/host.d.ts +3 -2
- package/x/driver/fns/schematic.d.ts +11 -4
- package/x/driver/fns/work.d.ts +4 -4
- package/x/driver/fns/work.js +55 -155
- package/x/driver/fns/work.js.map +1 -1
- package/x/driver/parts/compositor.d.ts +28 -0
- package/x/driver/parts/compositor.js +186 -0
- package/x/driver/parts/compositor.js.map +1 -0
- package/x/driver/parts/machina.d.ts +0 -20
- package/x/driver/parts/machina.js +6 -10
- package/x/driver/parts/machina.js.map +1 -1
- package/x/features/speech/transcribe/parts/prep-audio.d.ts +1 -1
- package/x/features/speech/transcribe/worker.bundle.min.js +899 -899
- package/x/features/speech/transcribe/worker.bundle.min.js.map +4 -4
- package/x/index.d.ts +1 -0
- package/x/index.html +347 -38
- package/x/index.html.js +103 -24
- package/x/index.html.js.map +1 -1
- package/x/index.js +1 -0
- package/x/index.js.map +1 -1
- package/x/tests.bundle.js +8 -0
- package/x/tests.bundle.js.map +1 -0
- package/x/tests.bundle.min.js +2464 -0
- package/x/tests.bundle.min.js.map +7 -0
- package/x/tests.html +316 -0
- package/x/tests.html.d.ts +2 -0
- package/x/tests.html.js +22 -0
- package/x/tests.html.js.map +1 -0
- package/x/timeline/index.d.ts +4 -0
- package/x/timeline/index.js +4 -0
- package/x/timeline/index.js.map +1 -1
- package/x/timeline/parts/filmstrip.d.ts +4 -3
- package/x/timeline/parts/filmstrip.js +29 -10
- package/x/timeline/parts/filmstrip.js.map +1 -1
- package/x/timeline/parts/item.d.ts +20 -3
- package/x/timeline/parts/item.js +1 -0
- package/x/timeline/parts/item.js.map +1 -1
- package/x/timeline/parts/media.d.ts +2 -0
- package/x/timeline/parts/media.js +11 -2
- package/x/timeline/parts/media.js.map +1 -1
- package/x/timeline/parts/resource-pool.d.ts +3 -0
- package/x/timeline/parts/resource-pool.js +7 -4
- package/x/timeline/parts/resource-pool.js.map +1 -1
- package/x/timeline/parts/resource.d.ts +3 -0
- package/x/timeline/parts/waveform/parts/collect.d.ts +11 -0
- package/x/timeline/parts/waveform/parts/collect.js +56 -0
- package/x/timeline/parts/waveform/parts/collect.js.map +1 -0
- package/x/timeline/parts/waveform/parts/render.d.ts +5 -0
- package/x/timeline/parts/waveform/parts/render.js +29 -0
- package/x/timeline/parts/waveform/parts/render.js.map +1 -0
- package/x/timeline/parts/waveform/parts/types.d.ts +21 -0
- package/x/timeline/parts/waveform/parts/types.js.map +1 -0
- package/x/timeline/parts/waveform/waveform.d.ts +19 -0
- package/x/timeline/parts/waveform/waveform.js +133 -0
- package/x/timeline/parts/waveform/waveform.js.map +1 -0
- package/x/timeline/renderers/export/parts/audio-gain.d.ts +1 -0
- package/x/timeline/renderers/export/parts/audio-gain.js +13 -0
- package/x/timeline/renderers/export/parts/audio-gain.js.map +1 -0
- package/x/timeline/renderers/export/parts/audio-mix.d.ts +21 -0
- package/x/timeline/renderers/export/parts/audio-mix.js +89 -0
- package/x/timeline/renderers/export/parts/audio-mix.js.map +1 -0
- package/x/timeline/renderers/export/parts/cursor.d.ts +18 -0
- package/x/timeline/renderers/export/parts/cursor.js +99 -0
- package/x/timeline/renderers/export/parts/cursor.js.map +1 -0
- package/x/timeline/renderers/export/parts/produce-audio.d.ts +6 -0
- package/x/timeline/renderers/export/parts/produce-audio.js +41 -0
- package/x/timeline/renderers/export/parts/produce-audio.js.map +1 -0
- package/x/timeline/renderers/export/parts/produce-video.d.ts +10 -0
- package/x/timeline/renderers/export/parts/produce-video.js +26 -0
- package/x/timeline/renderers/export/parts/produce-video.js.map +1 -0
- package/x/timeline/renderers/export/parts/resamplers.d.ts +12 -0
- package/x/timeline/renderers/export/parts/resamplers.js +29 -0
- package/x/timeline/renderers/export/parts/resamplers.js.map +1 -0
- package/x/timeline/renderers/export/produce.d.ts +13 -0
- package/x/timeline/renderers/export/produce.js +15 -0
- package/x/timeline/renderers/export/produce.js.map +1 -0
- package/x/timeline/renderers/parts/handy.d.ts +30 -0
- package/x/timeline/renderers/parts/handy.js +219 -0
- package/x/timeline/renderers/parts/handy.js.map +1 -0
- package/x/timeline/renderers/parts/samplers/audio/parts/find.d.ts +6 -0
- package/x/timeline/renderers/parts/samplers/audio/parts/find.js +15 -0
- package/x/timeline/renderers/parts/samplers/audio/parts/find.js.map +1 -0
- package/x/timeline/renderers/parts/samplers/audio/parts/init.d.ts +5 -0
- package/x/timeline/renderers/parts/samplers/audio/parts/init.js +40 -0
- package/x/timeline/renderers/parts/samplers/audio/parts/init.js.map +1 -0
- package/x/timeline/renderers/parts/samplers/audio/parts/sink.d.ts +8 -0
- package/x/timeline/renderers/parts/samplers/audio/parts/sink.js +24 -0
- package/x/timeline/renderers/parts/samplers/audio/parts/sink.js.map +1 -0
- package/x/timeline/renderers/parts/samplers/audio/parts/types.d.ts +14 -0
- package/x/timeline/renderers/parts/samplers/audio/parts/types.js +2 -0
- package/x/timeline/renderers/parts/samplers/audio/parts/types.js.map +1 -0
- package/x/timeline/renderers/parts/samplers/audio/sampler.d.ts +11 -0
- package/x/timeline/renderers/parts/samplers/audio/sampler.js +22 -0
- package/x/timeline/renderers/parts/samplers/audio/sampler.js.map +1 -0
- package/x/timeline/renderers/parts/samplers/visual/parts/defaults.d.ts +5 -0
- package/x/timeline/renderers/parts/samplers/visual/parts/defaults.js +10 -0
- package/x/timeline/renderers/parts/samplers/visual/parts/defaults.js.map +1 -0
- package/x/timeline/renderers/parts/samplers/visual/parts/sample.d.ts +5 -0
- package/x/timeline/renderers/parts/samplers/visual/parts/sample.js +38 -0
- package/x/timeline/renderers/parts/samplers/visual/parts/sample.js.map +1 -0
- package/x/timeline/renderers/parts/samplers/visual/parts/sequence.d.ts +5 -0
- package/x/timeline/renderers/parts/samplers/visual/parts/sequence.js +75 -0
- package/x/timeline/renderers/parts/samplers/visual/parts/sequence.js.map +1 -0
- package/x/timeline/renderers/parts/samplers/visual/parts/sink.d.ts +8 -0
- package/x/timeline/renderers/parts/samplers/visual/parts/sink.js +24 -0
- package/x/timeline/renderers/parts/samplers/visual/parts/sink.js.map +1 -0
- package/x/timeline/renderers/parts/samplers/visual/parts/transition.d.ts +3 -0
- package/x/timeline/renderers/parts/samplers/visual/parts/transition.js +18 -0
- package/x/timeline/renderers/parts/samplers/visual/parts/transition.js.map +1 -0
- package/x/timeline/renderers/parts/samplers/visual/parts/types.d.ts +8 -0
- package/x/timeline/renderers/parts/samplers/visual/parts/types.js +2 -0
- package/x/timeline/renderers/parts/samplers/visual/parts/types.js.map +1 -0
- package/x/timeline/renderers/parts/samplers/visual/sampler.d.ts +7 -0
- package/x/timeline/renderers/parts/samplers/visual/sampler.js +17 -0
- package/x/timeline/renderers/parts/samplers/visual/sampler.js.map +1 -0
- package/x/timeline/renderers/parts/schedulers.d.ts +17 -0
- package/x/timeline/renderers/parts/schedulers.js +64 -0
- package/x/timeline/renderers/parts/schedulers.js.map +1 -0
- package/x/timeline/renderers/player/parts/playback.d.ts +36 -0
- package/x/timeline/renderers/player/parts/playback.js +113 -0
- package/x/timeline/renderers/player/parts/playback.js.map +1 -0
- package/x/timeline/renderers/player/player.d.ts +25 -0
- package/x/timeline/renderers/player/player.js +56 -0
- package/x/timeline/renderers/player/player.js.map +1 -0
- package/x/timeline/renderers/renderers.test.d.ts +32 -0
- package/x/timeline/renderers/renderers.test.js +305 -0
- package/x/timeline/renderers/renderers.test.js.map +1 -0
- package/x/timeline/sugar/helpers.d.ts +30 -0
- package/x/timeline/sugar/helpers.js +46 -0
- package/x/timeline/sugar/helpers.js.map +1 -0
- package/x/timeline/sugar/o.d.ts +28 -13
- package/x/timeline/sugar/o.js +108 -51
- package/x/timeline/sugar/o.js.map +1 -1
- package/x/timeline/sugar/omni.d.ts +11 -6
- package/x/timeline/sugar/omni.js +28 -8
- package/x/timeline/sugar/omni.js.map +1 -1
- package/x/timeline/sugar/omni.test.d.ts +27 -0
- package/x/timeline/sugar/omni.test.js +128 -0
- package/x/timeline/sugar/omni.test.js.map +1 -0
- package/x/timeline/utils/checksum.d.ts +3 -2
- package/x/timeline/utils/checksum.js.map +1 -1
- package/x/timeline/utils/datafile.d.ts +5 -3
- package/x/timeline/utils/datafile.js +18 -5
- package/x/timeline/utils/datafile.js.map +1 -1
- package/x/timeline/utils/dummy-data.d.ts +1 -2
- package/x/timeline/utils/dummy-data.js +4 -2
- package/x/timeline/utils/dummy-data.js.map +1 -1
- package/x/units/fps.d.ts +6 -0
- package/x/units/fps.js +2 -0
- package/x/units/fps.js.map +1 -0
- package/x/units/ms.d.ts +6 -0
- package/x/units/ms.js +2 -0
- package/x/units/ms.js.map +1 -0
- package/x/units/seconds.d.ts +6 -0
- package/x/units/seconds.js +2 -0
- package/x/units/seconds.js.map +1 -0
- package/x/webworkerAll-VVIU3M54.js +2 -0
- package/x/webworkerAll-VVIU3M54.js.map +7 -0
- package/s/tests.test.ts +0 -8
- package/s/timeline/parts/compositor/export.ts +0 -77
- package/s/timeline/parts/compositor/parts/html-tree.ts +0 -37
- package/s/timeline/parts/compositor/parts/schedulers.ts +0 -85
- package/s/timeline/parts/compositor/parts/tree-builder.ts +0 -184
- package/s/timeline/parts/compositor/parts/webcodecs-tree.ts +0 -30
- package/s/timeline/parts/compositor/playback.ts +0 -81
- package/s/timeline/parts/compositor/samplers/html.ts +0 -115
- package/s/timeline/parts/compositor/samplers/webcodecs.ts +0 -60
- package/s/timeline/parts/waveform.ts +0 -62
- package/s/timeline/sugar/builders.ts +0 -102
- package/s/timeline/sugar/omni-test.ts +0 -38
- package/s/timeline/timeline.ts +0 -22
- package/s/timeline/utils/audio-stream.ts +0 -15
- package/s/timeline/utils/video-cursor.ts +0 -40
- package/s/tools/common/loader.ts +0 -26
- package/s/tools/common/transformer-pipeline.ts +0 -26
- package/s/tools/speech-recognition/common/model.ts +0 -26
- package/s/tools/speech-recognition/whisper/fns/host.ts +0 -25
- package/s/tools/speech-recognition/whisper/fns/schematic.ts +0 -23
- package/s/tools/speech-recognition/whisper/fns/work.ts +0 -91
- package/s/tools/speech-recognition/whisper/parts/types.ts +0 -38
- package/s/tools/speech-recognition/whisper/parts/worker.bundle.ts +0 -7
- package/s/tools/speech-recognition/whisper/tool.ts +0 -70
- package/x/tests.test.js +0 -6
- package/x/tests.test.js.map +0 -1
- package/x/timeline/parts/compositor/export.d.ts +0 -9
- package/x/timeline/parts/compositor/export.js +0 -64
- package/x/timeline/parts/compositor/export.js.map +0 -1
- package/x/timeline/parts/compositor/parts/html-tree.d.ts +0 -3
- package/x/timeline/parts/compositor/parts/html-tree.js +0 -40
- package/x/timeline/parts/compositor/parts/html-tree.js.map +0 -1
- package/x/timeline/parts/compositor/parts/schedulers.d.ts +0 -15
- package/x/timeline/parts/compositor/parts/schedulers.js +0 -64
- package/x/timeline/parts/compositor/parts/schedulers.js.map +0 -1
- package/x/timeline/parts/compositor/parts/tree-builder.d.ts +0 -37
- package/x/timeline/parts/compositor/parts/tree-builder.js +0 -147
- package/x/timeline/parts/compositor/parts/tree-builder.js.map +0 -1
- package/x/timeline/parts/compositor/parts/webcodecs-tree.d.ts +0 -3
- package/x/timeline/parts/compositor/parts/webcodecs-tree.js +0 -28
- package/x/timeline/parts/compositor/parts/webcodecs-tree.js.map +0 -1
- package/x/timeline/parts/compositor/playback.d.ts +0 -19
- package/x/timeline/parts/compositor/playback.js +0 -71
- package/x/timeline/parts/compositor/playback.js.map +0 -1
- package/x/timeline/parts/compositor/samplers/html.d.ts +0 -3
- package/x/timeline/parts/compositor/samplers/html.js +0 -106
- package/x/timeline/parts/compositor/samplers/html.js.map +0 -1
- package/x/timeline/parts/compositor/samplers/webcodecs.d.ts +0 -2
- package/x/timeline/parts/compositor/samplers/webcodecs.js +0 -55
- package/x/timeline/parts/compositor/samplers/webcodecs.js.map +0 -1
- package/x/timeline/parts/waveform.d.ts +0 -8
- package/x/timeline/parts/waveform.js +0 -51
- package/x/timeline/parts/waveform.js.map +0 -1
- package/x/timeline/sugar/builders.d.ts +0 -96
- package/x/timeline/sugar/builders.js +0 -108
- package/x/timeline/sugar/builders.js.map +0 -1
- package/x/timeline/sugar/omni-test.d.ts +0 -1
- package/x/timeline/sugar/omni-test.js +0 -22
- package/x/timeline/sugar/omni-test.js.map +0 -1
- package/x/timeline/timeline.d.ts +0 -9
- package/x/timeline/timeline.js +0 -22
- package/x/timeline/timeline.js.map +0 -1
- package/x/timeline/utils/audio-stream.d.ts +0 -6
- package/x/timeline/utils/audio-stream.js +0 -17
- package/x/timeline/utils/audio-stream.js.map +0 -1
- package/x/timeline/utils/video-cursor.d.ts +0 -10
- package/x/timeline/utils/video-cursor.js +0 -36
- package/x/timeline/utils/video-cursor.js.map +0 -1
- package/x/tools/common/loader.d.ts +0 -19
- package/x/tools/common/loader.js +0 -18
- package/x/tools/common/loader.js.map +0 -1
- package/x/tools/common/transformer-pipeline.d.ts +0 -8
- package/x/tools/common/transformer-pipeline.js +0 -24
- package/x/tools/common/transformer-pipeline.js.map +0 -1
- package/x/tools/speech-recognition/common/model.d.ts +0 -14
- package/x/tools/speech-recognition/common/model.js +0 -16
- package/x/tools/speech-recognition/common/model.js.map +0 -1
- package/x/tools/speech-recognition/whisper/fns/host.d.ts +0 -13
- package/x/tools/speech-recognition/whisper/fns/host.js +0 -19
- package/x/tools/speech-recognition/whisper/fns/host.js.map +0 -1
- package/x/tools/speech-recognition/whisper/fns/schematic.d.ts +0 -19
- package/x/tools/speech-recognition/whisper/fns/schematic.js +0 -2
- package/x/tools/speech-recognition/whisper/fns/schematic.js.map +0 -1
- package/x/tools/speech-recognition/whisper/fns/work.d.ts +0 -12
- package/x/tools/speech-recognition/whisper/fns/work.js +0 -74
- package/x/tools/speech-recognition/whisper/fns/work.js.map +0 -1
- package/x/tools/speech-recognition/whisper/parts/types.d.ts +0 -31
- package/x/tools/speech-recognition/whisper/parts/types.js.map +0 -1
- package/x/tools/speech-recognition/whisper/parts/worker.bundle.d.ts +0 -1
- package/x/tools/speech-recognition/whisper/parts/worker.bundle.js +0 -4
- package/x/tools/speech-recognition/whisper/parts/worker.bundle.js.map +0 -1
- package/x/tools/speech-recognition/whisper/parts/worker.bundle.min.js +0 -8
- package/x/tools/speech-recognition/whisper/parts/worker.bundle.min.js.map +0 -7
- package/x/tools/speech-recognition/whisper/tool.d.ts +0 -12
- package/x/tools/speech-recognition/whisper/tool.js +0 -63
- package/x/tools/speech-recognition/whisper/tool.js.map +0 -1
- /package/x/{tests.test.d.ts → tests.bundle.d.ts} +0 -0
- /package/x/{tools/speech-recognition/whisper → timeline/parts/waveform}/parts/types.js +0 -0
package/s/driver/driver.ts
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
|
+
|
|
2
|
+
import {is} from "@e280/stz"
|
|
1
3
|
import {Comrade, tune, Thread} from "@e280/comrade"
|
|
2
4
|
import {ALL_FORMATS, Input, type StreamTargetChunk} from "mediabunny"
|
|
3
5
|
|
|
4
6
|
import {Machina} from "./parts/machina.js"
|
|
7
|
+
import {Compositor} from "./parts/compositor.js"
|
|
5
8
|
import {setupDriverHost} from "./fns/host.js"
|
|
6
9
|
import {loadDecoderSource} from "./utils/load-decoder-source.js"
|
|
7
10
|
import {DecoderInput, DriverSchematic, Composition, EncoderInput, DecoderSource} from "./fns/schematic.js"
|
|
@@ -11,19 +14,21 @@ export type DriverOptions = {
|
|
|
11
14
|
}
|
|
12
15
|
|
|
13
16
|
export class Driver {
|
|
14
|
-
static async setup(options
|
|
17
|
+
static async setup(options?: DriverOptions) {
|
|
15
18
|
const machina = new Machina()
|
|
16
19
|
const thread = await Comrade.thread<DriverSchematic>({
|
|
17
20
|
label: "OmnitoolDriver",
|
|
18
|
-
workerUrl: options.
|
|
21
|
+
workerUrl: options?.workerUrl ?? "/node_modules/@omnimedia/omnitool/x/driver/driver.worker.bundle.min.js",
|
|
19
22
|
setupHost: setupDriverHost(machina),
|
|
20
23
|
})
|
|
21
|
-
|
|
24
|
+
const compositor = await Compositor.setup()
|
|
25
|
+
return new this(machina, thread, compositor)
|
|
22
26
|
}
|
|
23
27
|
|
|
24
28
|
constructor(
|
|
25
29
|
public machina: Machina,
|
|
26
|
-
public thread: Thread<DriverSchematic
|
|
30
|
+
public thread: Thread<DriverSchematic>,
|
|
31
|
+
public compositor: Compositor
|
|
27
32
|
) {}
|
|
28
33
|
|
|
29
34
|
async hello() {
|
|
@@ -37,7 +42,8 @@ export class Driver {
|
|
|
37
42
|
})
|
|
38
43
|
|
|
39
44
|
const audioTrack = await input.getPrimaryAudioTrack()
|
|
40
|
-
|
|
45
|
+
if (!audioTrack) throw new Error("primary audio track not found")
|
|
46
|
+
return await audioTrack.computeDuration()
|
|
41
47
|
}
|
|
42
48
|
|
|
43
49
|
async getVideoDuration(source: DecoderSource) {
|
|
@@ -52,73 +58,68 @@ export class Driver {
|
|
|
52
58
|
|
|
53
59
|
decodeVideo(input: DecoderInput) {
|
|
54
60
|
let lastFrame: VideoFrame | null = null
|
|
61
|
+
const {port1, port2} = new MessageChannel()
|
|
55
62
|
const videoTransform = new TransformStream<VideoFrame, VideoFrame>({
|
|
56
63
|
async transform(chunk, controller) {
|
|
57
64
|
const frame = await input.onFrame?.(chunk) ?? chunk
|
|
58
|
-
// below code is to prevent mem leaks and hardware accelerated decoder stall
|
|
59
65
|
lastFrame?.close()
|
|
60
66
|
controller.enqueue(frame)
|
|
61
67
|
lastFrame = frame
|
|
62
68
|
}
|
|
63
69
|
})
|
|
64
|
-
this.thread.work.decodeVideo[tune]({transfer: [videoTransform.writable]})({
|
|
70
|
+
this.thread.work.decodeVideo[tune]({transfer: [videoTransform.writable, port2]})({
|
|
65
71
|
source: input.source,
|
|
72
|
+
cancel: port2,
|
|
66
73
|
video: videoTransform.writable,
|
|
67
74
|
start: input.start,
|
|
68
75
|
end: input.end
|
|
69
76
|
})
|
|
70
|
-
return
|
|
77
|
+
return {
|
|
78
|
+
readable: videoTransform.readable,
|
|
79
|
+
/**
|
|
80
|
+
* use this to stop decoding (premature interruption)
|
|
81
|
+
* */
|
|
82
|
+
cancel() {
|
|
83
|
+
port1.postMessage("close")
|
|
84
|
+
port1.close()
|
|
85
|
+
}
|
|
86
|
+
}
|
|
71
87
|
}
|
|
72
88
|
|
|
73
89
|
decodeAudio(input: DecoderInput) {
|
|
74
90
|
const audioTransform = new TransformStream<AudioData, AudioData>()
|
|
75
|
-
|
|
91
|
+
const {port1, port2} = new MessageChannel()
|
|
92
|
+
this.thread.work.decodeAudio[tune]({transfer: [audioTransform.writable, port2]})({
|
|
76
93
|
source: input.source,
|
|
94
|
+
cancel: port2,
|
|
77
95
|
audio: audioTransform.writable,
|
|
78
96
|
start: input.start,
|
|
79
97
|
end: input.end
|
|
80
98
|
})
|
|
81
|
-
return
|
|
99
|
+
return {
|
|
100
|
+
readable: audioTransform.readable,
|
|
101
|
+
/**
|
|
102
|
+
* use this to stop decoding (premature interruption)
|
|
103
|
+
* */
|
|
104
|
+
cancel() {
|
|
105
|
+
port1.postMessage("close")
|
|
106
|
+
port1.close()
|
|
107
|
+
}
|
|
108
|
+
}
|
|
82
109
|
}
|
|
83
110
|
|
|
84
|
-
|
|
85
|
-
const
|
|
86
|
-
const
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
async write(chunk) {
|
|
90
|
-
await writable.write(chunk)
|
|
91
|
-
},
|
|
92
|
-
async close() {
|
|
93
|
-
await writable.close()
|
|
94
|
-
}
|
|
95
|
-
})
|
|
96
|
-
return await this.thread.work.encode[tune]({transfer: [audio ?? [], video ?? [], bridge]})({video, audio, config, bridge})
|
|
111
|
+
encode({audio, video, config}: EncoderInput) {
|
|
112
|
+
const {readable, writable} = new TransformStream<StreamTargetChunk, StreamTargetChunk>()
|
|
113
|
+
const transfer = [audio, video, writable].filter(is.happy)
|
|
114
|
+
const done = this.thread.work.encode[tune]({transfer})({audio, video, config, writable})
|
|
115
|
+
return {readable, done}
|
|
97
116
|
}
|
|
98
117
|
|
|
99
118
|
async composite(
|
|
100
119
|
composition: Composition,
|
|
101
120
|
) {
|
|
102
|
-
|
|
103
|
-
return await this.thread.work.composite[tune]({transfer})(composition)
|
|
121
|
+
return await this.compositor.composite(composition)
|
|
104
122
|
}
|
|
105
123
|
|
|
106
|
-
#collectTransferablesFromComposition(composition: Composition) {
|
|
107
|
-
const transferables: Transferable[] = []
|
|
108
|
-
|
|
109
|
-
const visit = (node: Composition) => {
|
|
110
|
-
if (Array.isArray(node)) {
|
|
111
|
-
for (const child of node)
|
|
112
|
-
visit(child)
|
|
113
|
-
}
|
|
114
|
-
else if (node && typeof node === 'object' && 'kind' in node) {
|
|
115
|
-
if (node.kind === 'image' && node.frame instanceof VideoFrame)
|
|
116
|
-
transferables.push(node.frame)
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
visit(composition)
|
|
121
|
-
return transferables
|
|
122
|
-
}
|
|
123
124
|
}
|
|
124
125
|
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
|
|
2
|
+
import {TextStyleOptions} from "pixi.js"
|
|
2
3
|
import {AsSchematic} from "@e280/comrade"
|
|
3
4
|
import type {AudioEncodingConfig, StreamTargetChunk, VideoEncodingConfig} from "mediabunny"
|
|
4
5
|
|
|
5
6
|
import {Mat6} from "../../timeline/utils/matrix.js"
|
|
7
|
+
import {Id} from "../../timeline/index.js"
|
|
6
8
|
|
|
7
9
|
export type DriverSchematic = AsSchematic<{
|
|
8
10
|
|
|
@@ -12,6 +14,7 @@ export type DriverSchematic = AsSchematic<{
|
|
|
12
14
|
|
|
13
15
|
decodeAudio(input: {
|
|
14
16
|
source: DecoderSource
|
|
17
|
+
cancel: MessagePort
|
|
15
18
|
audio: WritableStream<AudioData>
|
|
16
19
|
start?: number
|
|
17
20
|
end?: number
|
|
@@ -19,14 +22,13 @@ export type DriverSchematic = AsSchematic<{
|
|
|
19
22
|
|
|
20
23
|
decodeVideo(input: {
|
|
21
24
|
source: DecoderSource
|
|
25
|
+
cancel: MessagePort
|
|
22
26
|
video: WritableStream<VideoFrame>
|
|
23
27
|
start?: number
|
|
24
28
|
end?: number
|
|
25
29
|
}): Promise<void>
|
|
26
30
|
|
|
27
|
-
encode(input: EncoderInput & {
|
|
28
|
-
|
|
29
|
-
composite(input: Composition): Promise<VideoFrame>
|
|
31
|
+
encode(input: EncoderInput & {writable: WritableStream<StreamTargetChunk>}): Promise<void>
|
|
30
32
|
}
|
|
31
33
|
|
|
32
34
|
// happens on the main thread
|
|
@@ -72,20 +74,22 @@ export interface MuxOpts {
|
|
|
72
74
|
export type Composition = Layer | (Layer | Composition)[]
|
|
73
75
|
|
|
74
76
|
export type TextLayer = {
|
|
77
|
+
id: Id
|
|
75
78
|
kind: 'text'
|
|
76
79
|
content: string
|
|
77
|
-
|
|
78
|
-
color?: string
|
|
80
|
+
style?: TextStyleOptions
|
|
79
81
|
matrix?: Mat6
|
|
80
82
|
}
|
|
81
83
|
|
|
82
84
|
export type ImageLayer = {
|
|
85
|
+
id: Id
|
|
83
86
|
kind: 'image'
|
|
84
87
|
frame: VideoFrame
|
|
85
88
|
matrix?: Mat6
|
|
86
89
|
}
|
|
87
90
|
|
|
88
91
|
export type TransitionLayer = {
|
|
92
|
+
id: Id
|
|
89
93
|
kind: 'transition'
|
|
90
94
|
name: string
|
|
91
95
|
progress: number
|
|
@@ -94,10 +98,12 @@ export type TransitionLayer = {
|
|
|
94
98
|
}
|
|
95
99
|
|
|
96
100
|
export type GapLayer = {
|
|
101
|
+
id: Id
|
|
97
102
|
kind: 'gap'
|
|
98
103
|
}
|
|
99
104
|
|
|
100
105
|
export type Audio = {
|
|
106
|
+
id: Id
|
|
101
107
|
kind: "audio"
|
|
102
108
|
data: AudioData
|
|
103
109
|
}
|
package/s/driver/fns/work.ts
CHANGED
|
@@ -1,12 +1,9 @@
|
|
|
1
1
|
import {Comrade} from "@e280/comrade"
|
|
2
|
-
import {autoDetectRenderer, Container, Renderer, Sprite, Text, Texture, DOMAdapter, WebWorkerAdapter, Matrix} from "pixi.js"
|
|
3
|
-
import {Input, ALL_FORMATS, VideoSampleSink, Output, Mp4OutputFormat, VideoSampleSource, VideoSample, AudioSampleSink, AudioSampleSource, AudioSample, StreamTarget, BlobSource, UrlSource} from "mediabunny"
|
|
4
2
|
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
import {Composition, DecoderSource, DriverSchematic, Layer} from "./schematic.js"
|
|
3
|
+
import {Input, ALL_FORMATS, VideoSampleSink, Output, Mp4OutputFormat, VideoSampleSource, VideoSample, AudioSampleSink,
|
|
4
|
+
AudioSampleSource, AudioSample, StreamTarget, BlobSource, UrlSource} from "mediabunny"
|
|
8
5
|
|
|
9
|
-
|
|
6
|
+
import {DecoderSource, DriverSchematic} from "./schematic.js"
|
|
10
7
|
|
|
11
8
|
const loadSource = async (source: DecoderSource) => {
|
|
12
9
|
if(source instanceof Blob) {
|
|
@@ -22,7 +19,7 @@ export const setupDriverWork = (
|
|
|
22
19
|
await shell.host.world()
|
|
23
20
|
},
|
|
24
21
|
|
|
25
|
-
async decodeAudio({source, audio, start, end}) {
|
|
22
|
+
async decodeAudio({source, audio, start, end, cancel}) {
|
|
26
23
|
const input = new Input({
|
|
27
24
|
source: await loadSource(source),
|
|
28
25
|
formats: ALL_FORMATS
|
|
@@ -32,19 +29,29 @@ export const setupDriverWork = (
|
|
|
32
29
|
const audioDecodable = await audioTrack?.canDecode()
|
|
33
30
|
const audioWriter = audio.getWriter()
|
|
34
31
|
|
|
35
|
-
if
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
32
|
+
if(!audioDecodable || !audioTrack)
|
|
33
|
+
return
|
|
34
|
+
|
|
35
|
+
const sink = new AudioSampleSink(audioTrack)
|
|
36
|
+
const samples = sink.samples(start, end)
|
|
37
|
+
|
|
38
|
+
cancel.onmessage = async () => {
|
|
39
|
+
samples.return()
|
|
40
|
+
input.dispose()
|
|
41
|
+
cancel.close()
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
for await (const sample of samples) {
|
|
45
|
+
const frame = sample.toAudioData()
|
|
46
|
+
sample.close()
|
|
47
|
+
await audioWriter.write(frame)
|
|
48
|
+
frame.close()
|
|
44
49
|
}
|
|
50
|
+
|
|
51
|
+
await audioWriter.close()
|
|
45
52
|
},
|
|
46
53
|
|
|
47
|
-
async decodeVideo({source, video, start, end}) {
|
|
54
|
+
async decodeVideo({source, video, start, end, cancel}) {
|
|
48
55
|
const input = new Input({
|
|
49
56
|
source: await loadSource(source),
|
|
50
57
|
formats: ALL_FORMATS
|
|
@@ -54,196 +61,65 @@ export const setupDriverWork = (
|
|
|
54
61
|
const videoDecodable = await videoTrack?.canDecode()
|
|
55
62
|
const videoWriter = video.getWriter()
|
|
56
63
|
|
|
57
|
-
if
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
64
|
+
if(!videoDecodable || !videoTrack)
|
|
65
|
+
return
|
|
66
|
+
|
|
67
|
+
const sink = new VideoSampleSink(videoTrack)
|
|
68
|
+
const samples = sink.samples(start, end)
|
|
69
|
+
|
|
70
|
+
cancel.onmessage = async () => {
|
|
71
|
+
await samples.return()
|
|
72
|
+
input.dispose()
|
|
73
|
+
cancel.close()
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
for await (const sample of samples) {
|
|
77
|
+
const frame = sample.toVideoFrame()
|
|
78
|
+
sample.close()
|
|
79
|
+
await videoWriter.write(frame)
|
|
80
|
+
frame.close()
|
|
66
81
|
}
|
|
82
|
+
|
|
83
|
+
await videoWriter.close()
|
|
67
84
|
},
|
|
68
85
|
|
|
69
|
-
async encode({video, audio, config,
|
|
86
|
+
async encode({video, audio, config, writable}) {
|
|
70
87
|
const output = new Output({
|
|
71
88
|
format: new Mp4OutputFormat(),
|
|
72
|
-
target: new StreamTarget(
|
|
89
|
+
target: new StreamTarget(writable, {chunked: true})
|
|
73
90
|
})
|
|
74
|
-
// since AudioSample is not transferable it fails to transfer encoder bitrate config
|
|
75
|
-
// so it needs to be hardcoded not set through constants eg QUALITY_LOW
|
|
76
|
-
|
|
77
|
-
const promises = []
|
|
78
91
|
|
|
79
|
-
|
|
92
|
+
async function encodeVideo() {
|
|
93
|
+
if(!video) return
|
|
80
94
|
const videoSource = new VideoSampleSource(config.video)
|
|
81
95
|
output.addVideoTrack(videoSource)
|
|
82
|
-
const
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
await videoSource.add(sample)
|
|
89
|
-
sample.close()
|
|
90
|
-
}
|
|
91
|
-
})())
|
|
96
|
+
for await (const frame of video) {
|
|
97
|
+
const sample = new VideoSample(frame)
|
|
98
|
+
await videoSource.add(sample)
|
|
99
|
+
sample.close()
|
|
100
|
+
frame.close()
|
|
101
|
+
}
|
|
92
102
|
}
|
|
93
103
|
|
|
94
|
-
|
|
104
|
+
async function encodeAudio() {
|
|
105
|
+
if(!audio) return
|
|
95
106
|
const audioSource = new AudioSampleSource(config.audio)
|
|
96
107
|
output.addAudioTrack(audioSource)
|
|
97
|
-
const
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
await audioSource.add(sample)
|
|
104
|
-
sample.close()
|
|
105
|
-
value.close()
|
|
106
|
-
}
|
|
107
|
-
})())
|
|
108
|
+
for await (const data of audio) {
|
|
109
|
+
const sample = new AudioSample(data)
|
|
110
|
+
await audioSource.add(sample)
|
|
111
|
+
sample.close()
|
|
112
|
+
data.close()
|
|
113
|
+
}
|
|
108
114
|
}
|
|
109
115
|
|
|
116
|
+
const audioTask = encodeAudio()
|
|
117
|
+
const videoTask = encodeVideo()
|
|
118
|
+
|
|
110
119
|
await output.start()
|
|
111
|
-
await Promise.all(
|
|
120
|
+
await Promise.all([audioTask, videoTask])
|
|
112
121
|
await output.finalize()
|
|
113
122
|
},
|
|
114
|
-
|
|
115
|
-
async composite(composition) {
|
|
116
|
-
const {stage, renderer} = await renderPIXI(1920, 1080)
|
|
117
|
-
stage.removeChildren()
|
|
118
|
-
|
|
119
|
-
const {dispose} = await renderLayer(composition, stage)
|
|
120
|
-
renderer.render(stage)
|
|
121
|
-
|
|
122
|
-
// make sure browser support webgl/webgpu otherwise it might take much longer to construct frame
|
|
123
|
-
// if its very slow on eg edge try chrome
|
|
124
|
-
const frame = new VideoFrame(renderer.canvas, {
|
|
125
|
-
timestamp: 0,
|
|
126
|
-
duration: 0,
|
|
127
|
-
})
|
|
128
|
-
|
|
129
|
-
renderer.clear()
|
|
130
|
-
dispose()
|
|
131
|
-
|
|
132
|
-
shell.transfer = [frame]
|
|
133
|
-
return frame
|
|
134
|
-
}
|
|
135
123
|
}))
|
|
136
124
|
)
|
|
137
125
|
|
|
138
|
-
// TODO suspicious global, probably bad
|
|
139
|
-
let pixi: {
|
|
140
|
-
renderer: Renderer
|
|
141
|
-
stage: Container
|
|
142
|
-
} | null = null
|
|
143
|
-
|
|
144
|
-
async function renderPIXI(width: number, height: number) {
|
|
145
|
-
if (pixi)
|
|
146
|
-
return pixi
|
|
147
|
-
|
|
148
|
-
const renderer = await autoDetectRenderer({
|
|
149
|
-
width,
|
|
150
|
-
height,
|
|
151
|
-
preference: "webgl", // webgl and webgl2 causes memory leaks on chrome
|
|
152
|
-
background: "black",
|
|
153
|
-
preferWebGLVersion: 2
|
|
154
|
-
})
|
|
155
|
-
|
|
156
|
-
const stage = new Container()
|
|
157
|
-
pixi = {renderer, stage}
|
|
158
|
-
|
|
159
|
-
return pixi
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
const transitions: Map<string, ReturnType<typeof makeTransition>> = new Map()
|
|
163
|
-
|
|
164
|
-
type RenderableObject = Sprite | Text | Texture
|
|
165
|
-
|
|
166
|
-
async function renderLayer(
|
|
167
|
-
layer: Layer | Composition,
|
|
168
|
-
parent: Container,
|
|
169
|
-
) {
|
|
170
|
-
if (Array.isArray(layer)) {
|
|
171
|
-
const disposers: (() => void)[] = []
|
|
172
|
-
for (const child of layer) {
|
|
173
|
-
const result = await renderLayer(child, parent)
|
|
174
|
-
disposers.push(result.dispose)
|
|
175
|
-
}
|
|
176
|
-
return {dispose: () => disposers.forEach(d => d())}
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
switch (layer.kind) {
|
|
180
|
-
case 'text':
|
|
181
|
-
return renderTextLayer(layer, parent)
|
|
182
|
-
case 'image':
|
|
183
|
-
return renderImageLayer(layer, parent)
|
|
184
|
-
case 'transition':
|
|
185
|
-
return renderTransitionLayer(layer, parent)
|
|
186
|
-
case 'gap': {
|
|
187
|
-
pixi?.renderer.clear()
|
|
188
|
-
return {dispose: () => {}}
|
|
189
|
-
}
|
|
190
|
-
default:
|
|
191
|
-
console.warn('Unknown layer kind', (layer as any).kind)
|
|
192
|
-
return {dispose: () => {}}
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
function renderTextLayer(
|
|
197
|
-
layer: Extract<Layer, {kind: 'text'}>,
|
|
198
|
-
parent: Container,
|
|
199
|
-
) {
|
|
200
|
-
const text = new Text({
|
|
201
|
-
text: layer.content,
|
|
202
|
-
style: {
|
|
203
|
-
fontFamily: 'sans-serif',
|
|
204
|
-
fontSize: layer.fontSize ?? 48,
|
|
205
|
-
fill: layer.color ?? 'white'
|
|
206
|
-
}
|
|
207
|
-
})
|
|
208
|
-
applyTransform(text, layer.matrix)
|
|
209
|
-
parent.addChild(text)
|
|
210
|
-
return {dispose: () => text.destroy(true)}
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
function renderImageLayer(
|
|
214
|
-
layer: Extract<Layer, {kind: 'image'}>,
|
|
215
|
-
parent: Container,
|
|
216
|
-
) {
|
|
217
|
-
const texture = Texture.from(layer.frame)
|
|
218
|
-
const sprite = new Sprite(texture)
|
|
219
|
-
applyTransform(sprite, layer.matrix)
|
|
220
|
-
parent.addChild(sprite)
|
|
221
|
-
return {dispose: () => {
|
|
222
|
-
sprite.destroy(true)
|
|
223
|
-
texture.destroy(true)
|
|
224
|
-
layer.frame.close()
|
|
225
|
-
}}
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
function renderTransitionLayer(
|
|
229
|
-
{from, to, progress, name}: Extract<Layer, {kind: 'transition'}>,
|
|
230
|
-
parent: Container,
|
|
231
|
-
) {
|
|
232
|
-
const transition = transitions.get(name) ??
|
|
233
|
-
(transitions.set(name, makeTransition({
|
|
234
|
-
name: "circle",
|
|
235
|
-
renderer: pixi!.renderer
|
|
236
|
-
})),
|
|
237
|
-
transitions.get(name)!
|
|
238
|
-
)
|
|
239
|
-
const texture = transition.render({from, to, progress, width: from.displayWidth, height: from.displayHeight})
|
|
240
|
-
const sprite = new Sprite(texture)
|
|
241
|
-
parent.addChild(sprite)
|
|
242
|
-
return {dispose: () => sprite.destroy(false)}
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
function applyTransform(target: Sprite | Text, worldMatrix?: Mat6) {
|
|
246
|
-
if (!worldMatrix) return
|
|
247
|
-
const mx = mat6ToMatrix(worldMatrix)
|
|
248
|
-
target.setFromMatrix(mx)
|
|
249
|
-
}
|