@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.
- package/README.md +143 -80
- package/package.json +18 -16
- package/s/context.ts +0 -7
- package/s/demo/demo.bundle.ts +102 -43
- package/s/demo/demo.css +246 -11
- 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 +76 -0
- package/s/demo/routines/timeline-setup.ts +24 -0
- package/s/demo/routines/transcode-test.ts +21 -5
- package/s/demo/routines/transitions-test.ts +2 -2
- package/s/demo/routines/waveform-test.ts +8 -6
- package/s/driver/driver-worker.ts +9 -0
- package/s/driver/driver.test.ts +1 -1
- package/s/driver/driver.ts +32 -44
- package/s/driver/fns/schematic.ts +52 -25
- package/s/driver/fns/work.ts +71 -200
- package/s/driver/parts/compositor.ts +178 -0
- package/s/driver/parts/machina.ts +19 -20
- package/s/index.html.ts +103 -19
- 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 +3 -0
- package/s/timeline/parts/basics.ts +1 -1
- package/s/timeline/parts/filmstrip.ts +43 -16
- package/s/timeline/parts/item.ts +59 -6
- package/s/timeline/parts/media.ts +32 -1
- package/s/timeline/parts/resource-pool.ts +8 -5
- package/s/timeline/parts/resource.ts +2 -0
- package/s/timeline/parts/waveform.ts +3 -4
- 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 +109 -0
- package/s/timeline/renderers/export/parts/produce-audio.ts +64 -0
- package/s/timeline/renderers/export/parts/produce-video.ts +50 -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 +125 -0
- package/s/timeline/renderers/player/player.ts +71 -0
- package/s/timeline/renderers/renderers.test.ts +387 -0
- package/s/timeline/sugar/helpers.ts +85 -0
- package/s/timeline/sugar/o.ts +178 -38
- package/s/timeline/sugar/omni.test.ts +210 -0
- package/s/timeline/sugar/omni.ts +38 -12
- package/s/timeline/types.ts +29 -0
- 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/timeline/utils/matrix.ts +33 -0
- 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 +92 -40
- package/x/demo/demo.bundle.js.map +1 -1
- package/x/demo/demo.bundle.min.js +2450 -35
- package/x/demo/demo.bundle.min.js.map +4 -4
- package/x/demo/demo.css +246 -11
- 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 +65 -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 +17 -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 +7 -6
- 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/WebGLRenderer-OMRWYQIV.js +2 -0
- package/x/driver/WebGLRenderer-OMRWYQIV.js.map +7 -0
- package/x/driver/WebGPURenderer-KQJB2OJJ.js +2 -0
- package/x/driver/WebGPURenderer-KQJB2OJJ.js.map +7 -0
- package/x/driver/browserAll-YBZEJCN3.js +2 -0
- package/x/driver/browserAll-YBZEJCN3.js.map +7 -0
- package/x/driver/chunk-3L3MB5NY.js +393 -0
- package/x/driver/chunk-3L3MB5NY.js.map +7 -0
- package/x/driver/chunk-42BQ4XKE.js +269 -0
- package/x/driver/chunk-42BQ4XKE.js.map +7 -0
- package/x/driver/chunk-4HAYG3N5.js +327 -0
- package/x/driver/chunk-4HAYG3N5.js.map +7 -0
- package/x/driver/chunk-BFBY7VYB.js +42 -0
- package/x/driver/chunk-BFBY7VYB.js.map +7 -0
- package/x/driver/chunk-KM6O72WE.js +157 -0
- package/x/driver/chunk-KM6O72WE.js.map +7 -0
- package/x/driver/chunk-N6HD4WYJ.js +2 -0
- package/x/driver/chunk-N6HD4WYJ.js.map +7 -0
- package/x/driver/chunk-WCZ2O3UN.js +15 -0
- package/x/driver/chunk-WCZ2O3UN.js.map +7 -0
- package/x/driver/chunk-XWNSF3WJ.js +2 -0
- package/x/driver/chunk-XWNSF3WJ.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 +12 -9
- package/x/driver/driver.js +31 -41
- 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 +139 -1135
- package/x/driver/driver.worker.bundle.min.js.map +4 -4
- package/x/driver/fns/host.d.ts +10 -4
- package/x/driver/fns/schematic.d.ts +47 -24
- package/x/driver/fns/work.d.ts +12 -7
- package/x/driver/fns/work.js +68 -170
- package/x/driver/fns/work.js.map +1 -1
- package/x/driver/parts/compositor.d.ts +15 -0
- package/x/driver/parts/compositor.js +152 -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/driver/webworkerAll-BKJQW6P7.js +2 -0
- package/x/driver/webworkerAll-BKJQW6P7.js.map +7 -0
- package/x/features/speech/transcribe/parts/prep-audio.d.ts +1 -1
- package/x/features/speech/transcribe/worker.bundle.min.js +703 -703
- package/x/features/speech/transcribe/worker.bundle.min.js.map +4 -4
- package/x/index.d.ts +1 -0
- package/x/index.html +349 -30
- package/x/index.html.js +103 -19
- 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 +3 -0
- package/x/timeline/index.js +3 -0
- package/x/timeline/index.js.map +1 -1
- package/x/timeline/parts/basics.d.ts +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 +51 -8
- package/x/timeline/parts/item.js +7 -3
- package/x/timeline/parts/item.js.map +1 -1
- package/x/timeline/parts/media.d.ts +5 -0
- package/x/timeline/parts/media.js +27 -1
- 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 +2 -0
- package/x/timeline/parts/waveform.d.ts +2 -1
- package/x/timeline/parts/waveform.js +2 -4
- package/x/timeline/parts/waveform.js.map +1 -1
- 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 +19 -0
- package/x/timeline/renderers/export/parts/cursor.js +80 -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 +27 -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.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 +31 -0
- package/x/timeline/renderers/player/parts/playback.js +91 -0
- package/x/timeline/renderers/player/parts/playback.js.map +1 -0
- package/x/timeline/renderers/player/player.d.ts +23 -0
- package/x/timeline/renderers/player/player.js +50 -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 +306 -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 +31 -4
- package/x/timeline/sugar/o.js +144 -38
- package/x/timeline/sugar/o.js.map +1 -1
- package/x/timeline/sugar/omni.d.ts +11 -2
- package/x/timeline/sugar/omni.js +30 -9
- 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/types.d.ts +24 -0
- package/x/timeline/types.js +2 -0
- package/x/timeline/types.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/timeline/utils/matrix.d.ts +8 -0
- package/x/timeline/utils/matrix.js +26 -0
- package/x/timeline/utils/matrix.js.map +1 -0
- 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/sugar/omni-test.ts +0 -38
- 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/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/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/renderers/parts/samplers/audio}/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) {
|
|
@@ -50,7 +56,7 @@ export class Driver {
|
|
|
50
56
|
return await videoTrack?.computeDuration()
|
|
51
57
|
}
|
|
52
58
|
|
|
53
|
-
|
|
59
|
+
decodeVideo(input: DecoderInput) {
|
|
54
60
|
let lastFrame: VideoFrame | null = null
|
|
55
61
|
const videoTransform = new TransformStream<VideoFrame, VideoFrame>({
|
|
56
62
|
async transform(chunk, controller) {
|
|
@@ -61,56 +67,38 @@ export class Driver {
|
|
|
61
67
|
lastFrame = frame
|
|
62
68
|
}
|
|
63
69
|
})
|
|
64
|
-
|
|
65
|
-
this.thread.work.decode[tune]({transfer: [videoTransform.writable, audioTransform.writable]})({
|
|
70
|
+
this.thread.work.decodeVideo[tune]({transfer: [videoTransform.writable]})({
|
|
66
71
|
source: input.source,
|
|
67
72
|
video: videoTransform.writable,
|
|
68
|
-
|
|
73
|
+
start: input.start,
|
|
74
|
+
end: input.end
|
|
69
75
|
})
|
|
70
|
-
return
|
|
71
|
-
audio: audioTransform.readable,
|
|
72
|
-
video: videoTransform.readable
|
|
73
|
-
}
|
|
76
|
+
return videoTransform.readable
|
|
74
77
|
}
|
|
75
78
|
|
|
76
|
-
|
|
77
|
-
const
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
},
|
|
84
|
-
async close() {
|
|
85
|
-
await writable.close()
|
|
86
|
-
}
|
|
79
|
+
decodeAudio(input: DecoderInput) {
|
|
80
|
+
const audioTransform = new TransformStream<AudioData, AudioData>()
|
|
81
|
+
this.thread.work.decodeAudio[tune]({transfer: [audioTransform.writable]})({
|
|
82
|
+
source: input.source,
|
|
83
|
+
audio: audioTransform.writable,
|
|
84
|
+
start: input.start,
|
|
85
|
+
end: input.end
|
|
87
86
|
})
|
|
88
|
-
return
|
|
87
|
+
return audioTransform.readable
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
encode({audio, video, config}: EncoderInput) {
|
|
91
|
+
const {readable, writable} = new TransformStream<StreamTargetChunk, StreamTargetChunk>()
|
|
92
|
+
const transfer = [audio, video, writable].filter(is.happy)
|
|
93
|
+
const done = this.thread.work.encode[tune]({transfer})({audio, video, config, writable})
|
|
94
|
+
return {readable, done}
|
|
89
95
|
}
|
|
90
96
|
|
|
91
97
|
async composite(
|
|
92
98
|
composition: Composition,
|
|
93
99
|
) {
|
|
94
|
-
|
|
95
|
-
return await this.thread.work.composite[tune]({transfer})(composition)
|
|
100
|
+
return await this.compositor.composite(composition)
|
|
96
101
|
}
|
|
97
102
|
|
|
98
|
-
#collectTransferablesFromComposition(composition: Composition) {
|
|
99
|
-
const transferables: Transferable[] = []
|
|
100
|
-
|
|
101
|
-
const visit = (node: Composition) => {
|
|
102
|
-
if (Array.isArray(node)) {
|
|
103
|
-
for (const child of node)
|
|
104
|
-
visit(child)
|
|
105
|
-
}
|
|
106
|
-
else if (node && typeof node === 'object' && 'kind' in node) {
|
|
107
|
-
if (node.kind === 'image' && node.frame instanceof VideoFrame)
|
|
108
|
-
transferables.push(node.frame)
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
visit(composition)
|
|
113
|
-
return transferables
|
|
114
|
-
}
|
|
115
103
|
}
|
|
116
104
|
|
|
@@ -1,22 +1,32 @@
|
|
|
1
1
|
|
|
2
|
+
import {TextStyleOptions} from "pixi.js"
|
|
2
3
|
import {AsSchematic} from "@e280/comrade"
|
|
3
4
|
import type {AudioEncodingConfig, StreamTargetChunk, VideoEncodingConfig} from "mediabunny"
|
|
4
5
|
|
|
6
|
+
import {Mat6} from "../../timeline/utils/matrix.js"
|
|
7
|
+
import {Id} from "../../timeline/index.js"
|
|
8
|
+
|
|
5
9
|
export type DriverSchematic = AsSchematic<{
|
|
6
10
|
|
|
7
11
|
// happens on the web worker
|
|
8
12
|
work: {
|
|
9
13
|
hello(): Promise<void>
|
|
10
14
|
|
|
11
|
-
|
|
15
|
+
decodeAudio(input: {
|
|
12
16
|
source: DecoderSource
|
|
13
|
-
video: WritableStream<VideoFrame>
|
|
14
17
|
audio: WritableStream<AudioData>
|
|
18
|
+
start?: number
|
|
19
|
+
end?: number
|
|
15
20
|
}): Promise<void>
|
|
16
21
|
|
|
17
|
-
|
|
22
|
+
decodeVideo(input: {
|
|
23
|
+
source: DecoderSource
|
|
24
|
+
video: WritableStream<VideoFrame>
|
|
25
|
+
start?: number
|
|
26
|
+
end?: number
|
|
27
|
+
}): Promise<void>
|
|
18
28
|
|
|
19
|
-
|
|
29
|
+
encode(input: EncoderInput & {writable: WritableStream<StreamTargetChunk>}): Promise<void>
|
|
20
30
|
}
|
|
21
31
|
|
|
22
32
|
// happens on the main thread
|
|
@@ -26,20 +36,22 @@ export type DriverSchematic = AsSchematic<{
|
|
|
26
36
|
}>
|
|
27
37
|
|
|
28
38
|
export interface EncoderInput {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
39
|
+
video?: ReadableStream<VideoFrame>
|
|
40
|
+
audio?: ReadableStream<AudioData>
|
|
41
|
+
config: RenderConfig
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export interface RenderConfig {
|
|
45
|
+
video: VideoEncodingConfig
|
|
46
|
+
audio: AudioEncodingConfig
|
|
37
47
|
}
|
|
38
48
|
|
|
39
49
|
export type DecoderSource = Blob | string | URL
|
|
40
50
|
|
|
41
51
|
export interface DecoderInput {
|
|
42
52
|
source: DecoderSource
|
|
53
|
+
start?: number
|
|
54
|
+
end?: number
|
|
43
55
|
onFrame?: (frame: VideoFrame) => Promise<VideoFrame>
|
|
44
56
|
}
|
|
45
57
|
|
|
@@ -59,25 +71,40 @@ export interface MuxOpts {
|
|
|
59
71
|
|
|
60
72
|
export type Composition = Layer | (Layer | Composition)[]
|
|
61
73
|
|
|
62
|
-
export type Transform = {
|
|
63
|
-
x?: number
|
|
64
|
-
y?: number
|
|
65
|
-
scale?: number
|
|
66
|
-
opacity?: number
|
|
67
|
-
anchor?: number
|
|
68
|
-
}
|
|
69
|
-
|
|
70
74
|
export type TextLayer = {
|
|
75
|
+
id: Id
|
|
71
76
|
kind: 'text'
|
|
72
77
|
content: string
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
}
|
|
78
|
+
style?: TextStyleOptions
|
|
79
|
+
matrix?: Mat6
|
|
80
|
+
}
|
|
76
81
|
|
|
77
82
|
export type ImageLayer = {
|
|
83
|
+
id: Id
|
|
78
84
|
kind: 'image'
|
|
79
85
|
frame: VideoFrame
|
|
80
|
-
|
|
86
|
+
matrix?: Mat6
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export type TransitionLayer = {
|
|
90
|
+
id: Id
|
|
91
|
+
kind: 'transition'
|
|
92
|
+
name: string
|
|
93
|
+
progress: number
|
|
94
|
+
from: VideoFrame
|
|
95
|
+
to: VideoFrame
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export type GapLayer = {
|
|
99
|
+
id: Id
|
|
100
|
+
kind: 'gap'
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export type Audio = {
|
|
104
|
+
id: Id
|
|
105
|
+
kind: "audio"
|
|
106
|
+
data: AudioData
|
|
107
|
+
}
|
|
81
108
|
|
|
82
|
-
export type Layer = TextLayer | ImageLayer
|
|
109
|
+
export type Layer = TextLayer | ImageLayer | TransitionLayer | GapLayer
|
|
83
110
|
|
package/s/driver/fns/work.ts
CHANGED
|
@@ -1,234 +1,105 @@
|
|
|
1
1
|
import {Comrade} from "@e280/comrade"
|
|
2
|
-
import {
|
|
2
|
+
import {DOMAdapter, WebWorkerAdapter} from "pixi.js"
|
|
3
3
|
import {Input, ALL_FORMATS, VideoSampleSink, Output, Mp4OutputFormat, VideoSampleSource, VideoSample, AudioSampleSink, AudioSampleSource, AudioSample, StreamTarget, BlobSource, UrlSource} from "mediabunny"
|
|
4
4
|
|
|
5
|
-
import {
|
|
5
|
+
import {DecoderSource, DriverSchematic} from "./schematic.js"
|
|
6
6
|
|
|
7
7
|
DOMAdapter.set(WebWorkerAdapter)
|
|
8
8
|
|
|
9
|
+
const loadSource = async (source: DecoderSource) => {
|
|
10
|
+
if(source instanceof Blob) {
|
|
11
|
+
return new BlobSource(source)
|
|
12
|
+
} else {
|
|
13
|
+
return new UrlSource(source)
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
9
17
|
export const setupDriverWork = (
|
|
10
18
|
Comrade.work<DriverSchematic>(shell => ({
|
|
11
19
|
async hello() {
|
|
12
20
|
await shell.host.world()
|
|
13
21
|
},
|
|
14
22
|
|
|
15
|
-
async
|
|
16
|
-
const loadSource = async () => {
|
|
17
|
-
if(source instanceof Blob) {
|
|
18
|
-
return new BlobSource(source)
|
|
19
|
-
} else {
|
|
20
|
-
return new UrlSource(source)
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
+
async decodeAudio({source, audio, start, end}) {
|
|
23
24
|
const input = new Input({
|
|
24
|
-
source: await loadSource(),
|
|
25
|
+
source: await loadSource(source),
|
|
25
26
|
formats: ALL_FORMATS
|
|
26
27
|
})
|
|
27
28
|
|
|
28
|
-
const
|
|
29
|
-
input.getPrimaryVideoTrack(),
|
|
30
|
-
input.getPrimaryAudioTrack()
|
|
31
|
-
])
|
|
32
|
-
|
|
33
|
-
const videoDecodable = await videoTrack?.canDecode()
|
|
29
|
+
const audioTrack = await input.getPrimaryAudioTrack()
|
|
34
30
|
const audioDecodable = await audioTrack?.canDecode()
|
|
35
|
-
|
|
36
|
-
const videoWriter = video.getWriter()
|
|
37
31
|
const audioWriter = audio.getWriter()
|
|
38
32
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
await videoWriter.close()
|
|
50
|
-
}
|
|
51
|
-
})(),
|
|
52
|
-
(async () => {
|
|
53
|
-
if (audioDecodable && audioTrack) {
|
|
54
|
-
const sink = new AudioSampleSink(audioTrack)
|
|
55
|
-
for await (const sample of sink.samples()) {
|
|
56
|
-
const frame = sample.toAudioData()
|
|
57
|
-
await audioWriter.write(frame)
|
|
58
|
-
sample.close()
|
|
59
|
-
frame.close()
|
|
60
|
-
}
|
|
61
|
-
await audioWriter.close()
|
|
62
|
-
}
|
|
63
|
-
})()
|
|
64
|
-
])
|
|
33
|
+
if (audioDecodable && audioTrack) {
|
|
34
|
+
const sink = new AudioSampleSink(audioTrack)
|
|
35
|
+
for await (const sample of sink.samples(start, end)) {
|
|
36
|
+
const frame = sample.toAudioData()
|
|
37
|
+
await audioWriter.write(frame)
|
|
38
|
+
sample.close()
|
|
39
|
+
frame.close()
|
|
40
|
+
}
|
|
41
|
+
await audioWriter.close()
|
|
42
|
+
}
|
|
65
43
|
},
|
|
66
44
|
|
|
67
|
-
async
|
|
68
|
-
const
|
|
69
|
-
|
|
70
|
-
|
|
45
|
+
async decodeVideo({source, video, start, end}) {
|
|
46
|
+
const input = new Input({
|
|
47
|
+
source: await loadSource(source),
|
|
48
|
+
formats: ALL_FORMATS
|
|
71
49
|
})
|
|
72
|
-
const videoSource = new VideoSampleSource(config.video)
|
|
73
|
-
output.addVideoTrack(videoSource)
|
|
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
|
-
const audioSource = new AudioSampleSource(config.audio)
|
|
77
|
-
output.addAudioTrack(audioSource)
|
|
78
|
-
|
|
79
|
-
await output.start()
|
|
80
50
|
|
|
81
|
-
const
|
|
82
|
-
const
|
|
83
|
-
|
|
84
|
-
await Promise.all([
|
|
85
|
-
(async () => {
|
|
86
|
-
while (true) {
|
|
87
|
-
const {done, value} = await videoReader.read()
|
|
88
|
-
if (done) break
|
|
89
|
-
const sample = new VideoSample(value)
|
|
90
|
-
await videoSource.add(sample)
|
|
91
|
-
sample.close()
|
|
92
|
-
}
|
|
93
|
-
})(),
|
|
94
|
-
(async () => {
|
|
95
|
-
while (true) {
|
|
96
|
-
const {done, value} = await audioReader.read()
|
|
97
|
-
if (done) break
|
|
98
|
-
const sample = new AudioSample(value)
|
|
99
|
-
await audioSource.add(sample)
|
|
100
|
-
sample.close()
|
|
101
|
-
value.close()
|
|
102
|
-
}
|
|
103
|
-
})()
|
|
104
|
-
])
|
|
51
|
+
const videoTrack = await input.getPrimaryVideoTrack()
|
|
52
|
+
const videoDecodable = await videoTrack?.canDecode()
|
|
53
|
+
const videoWriter = video.getWriter()
|
|
105
54
|
|
|
106
|
-
|
|
55
|
+
if (videoDecodable && videoTrack) {
|
|
56
|
+
const sink = new VideoSampleSink(videoTrack)
|
|
57
|
+
for await (const sample of sink.samples(start, end)) {
|
|
58
|
+
const frame = sample.toVideoFrame()
|
|
59
|
+
await videoWriter.write(frame)
|
|
60
|
+
sample.close()
|
|
61
|
+
frame.close()
|
|
62
|
+
}
|
|
63
|
+
await videoWriter.close()
|
|
64
|
+
}
|
|
107
65
|
},
|
|
108
66
|
|
|
109
|
-
async
|
|
110
|
-
const
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
const {baseFrame, disposables} = await renderLayer(composition, stage)
|
|
114
|
-
renderer.render(stage)
|
|
115
|
-
|
|
116
|
-
// make sure browser support webgl/webgpu otherwise it might take much longer to construct frame
|
|
117
|
-
// if its very slow on eg edge try chrome
|
|
118
|
-
const frame = new VideoFrame(renderer.canvas, {
|
|
119
|
-
timestamp: baseFrame?.timestamp,
|
|
120
|
-
duration: baseFrame?.duration ?? undefined,
|
|
67
|
+
async encode({video, audio, config, writable}) {
|
|
68
|
+
const output = new Output({
|
|
69
|
+
format: new Mp4OutputFormat(),
|
|
70
|
+
target: new StreamTarget(writable, {chunked: true})
|
|
121
71
|
})
|
|
122
72
|
|
|
123
|
-
|
|
124
|
-
|
|
73
|
+
async function encodeVideo() {
|
|
74
|
+
if(!video) return
|
|
75
|
+
const videoSource = new VideoSampleSource(config.video)
|
|
76
|
+
output.addVideoTrack(videoSource)
|
|
77
|
+
for await (const frame of video) {
|
|
78
|
+
const sample = new VideoSample(frame)
|
|
79
|
+
await videoSource.add(sample)
|
|
80
|
+
sample.close()
|
|
81
|
+
}
|
|
82
|
+
}
|
|
125
83
|
|
|
126
|
-
|
|
127
|
-
|
|
84
|
+
async function encodeAudio() {
|
|
85
|
+
if(!audio) return
|
|
86
|
+
const audioSource = new AudioSampleSource(config.audio)
|
|
87
|
+
output.addAudioTrack(audioSource)
|
|
88
|
+
for await (const data of audio) {
|
|
89
|
+
const sample = new AudioSample(data)
|
|
90
|
+
await audioSource.add(sample)
|
|
91
|
+
sample.close()
|
|
92
|
+
data.close()
|
|
93
|
+
}
|
|
128
94
|
}
|
|
129
95
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
96
|
+
const audioTask = encodeAudio()
|
|
97
|
+
const videoTask = encodeVideo()
|
|
98
|
+
|
|
99
|
+
await output.start()
|
|
100
|
+
await Promise.all([audioTask, videoTask])
|
|
101
|
+
await output.finalize()
|
|
102
|
+
},
|
|
133
103
|
}))
|
|
134
104
|
)
|
|
135
105
|
|
|
136
|
-
// TODO suspicious global, probably bad
|
|
137
|
-
let pixi: {
|
|
138
|
-
renderer: Renderer
|
|
139
|
-
stage: Container
|
|
140
|
-
} | null = null
|
|
141
|
-
|
|
142
|
-
async function renderPIXI(width: number, height: number) {
|
|
143
|
-
if (pixi)
|
|
144
|
-
return pixi
|
|
145
|
-
|
|
146
|
-
const renderer = await autoDetectRenderer({
|
|
147
|
-
width,
|
|
148
|
-
height,
|
|
149
|
-
preference: "webgl", // webgl and webgl2 causes memory leaks on chrome
|
|
150
|
-
background: "black",
|
|
151
|
-
preferWebGLVersion: 2
|
|
152
|
-
})
|
|
153
|
-
|
|
154
|
-
const stage = new Container()
|
|
155
|
-
pixi = {renderer, stage}
|
|
156
|
-
|
|
157
|
-
return pixi
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
type RenderableObject = Sprite | Text | Texture
|
|
161
|
-
|
|
162
|
-
async function renderLayer(
|
|
163
|
-
layer: Layer | Composition,
|
|
164
|
-
parent: Container,
|
|
165
|
-
disposables: RenderableObject[] = []
|
|
166
|
-
) {
|
|
167
|
-
if (Array.isArray(layer)) {
|
|
168
|
-
let baseFrame: VideoFrame | undefined
|
|
169
|
-
for (const child of layer) {
|
|
170
|
-
const result = await renderLayer(child, parent, disposables)
|
|
171
|
-
baseFrame ??= result.baseFrame
|
|
172
|
-
}
|
|
173
|
-
return {baseFrame, disposables}
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
if (!isRenderableLayer(layer)) {
|
|
177
|
-
console.warn('Invalid layer', layer)
|
|
178
|
-
return {disposables}
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
switch (layer.kind) {
|
|
182
|
-
case 'text':
|
|
183
|
-
return renderTextLayer(layer, parent, disposables)
|
|
184
|
-
case 'image':
|
|
185
|
-
return renderImageLayer(layer, parent, disposables)
|
|
186
|
-
default:
|
|
187
|
-
console.warn('Unknown layer kind', (layer as any).kind)
|
|
188
|
-
return {disposables}
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
function isRenderableLayer(layer: any): layer is Layer {
|
|
193
|
-
return !!layer && typeof layer === 'object' && typeof layer.kind === 'string'
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
function renderTextLayer(
|
|
197
|
-
layer: Extract<Layer, {kind: 'text'}>,
|
|
198
|
-
parent: Container,
|
|
199
|
-
disposables: RenderableObject[]
|
|
200
|
-
) {
|
|
201
|
-
const text = new Text({
|
|
202
|
-
text: layer.content,
|
|
203
|
-
style: {
|
|
204
|
-
fontFamily: 'sans-serif',
|
|
205
|
-
fontSize: layer.fontSize ?? 48,
|
|
206
|
-
fill: layer.color ?? 'white'
|
|
207
|
-
}
|
|
208
|
-
})
|
|
209
|
-
applyTransform(text, layer)
|
|
210
|
-
parent.addChild(text)
|
|
211
|
-
disposables.push(text)
|
|
212
|
-
return {disposables}
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
function renderImageLayer(
|
|
216
|
-
layer: Extract<Layer, {kind: 'image'}>,
|
|
217
|
-
parent: Container,
|
|
218
|
-
disposables: RenderableObject[]
|
|
219
|
-
) {
|
|
220
|
-
const texture = Texture.from(layer.frame)
|
|
221
|
-
const sprite = new Sprite(texture)
|
|
222
|
-
applyTransform(sprite, layer)
|
|
223
|
-
parent.addChild(sprite)
|
|
224
|
-
disposables.push(sprite, texture)
|
|
225
|
-
return {baseFrame: layer.frame, disposables}
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
function applyTransform(target: Sprite | Text, t: Transform = {}) {
|
|
229
|
-
if(t.x) target.x = t.x
|
|
230
|
-
if(t.y) target.y = t.y
|
|
231
|
-
if(t.scale) target.scale.set(t.scale)
|
|
232
|
-
if(t.opacity) target.alpha = t.opacity
|
|
233
|
-
if(t.anchor && 'anchor' in target) target.anchor.set(t.anchor)
|
|
234
|
-
}
|