mattebox 0.1.0
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/LICENSE +21 -0
- package/README.md +106 -0
- package/dist/cdn/mattebox.dash-drm.min.js +2 -0
- package/dist/cdn/mattebox.dash.min.js +2 -0
- package/dist/cdn/mattebox.dual-drm.min.js +2 -0
- package/dist/cdn/mattebox.dual-ts-drm.min.js +3 -0
- package/dist/cdn/mattebox.dual-ts.min.js +3 -0
- package/dist/cdn/mattebox.dual.min.js +2 -0
- package/dist/cdn/mattebox.hls-drm.min.js +2 -0
- package/dist/cdn/mattebox.hls-ts-drm.min.js +3 -0
- package/dist/cdn/mattebox.hls-ts.min.js +3 -0
- package/dist/cdn/mattebox.hls.min.js +2 -0
- package/dist/cdn/mattebox.kernel.min.js +1 -0
- package/dist/cdn/mattebox.min.js +6 -0
- package/dist/cdn/transmux.worker.js +1 -0
- package/dist/containers/adts.d.ts +33 -0
- package/dist/containers/adts.d.ts.map +1 -0
- package/dist/containers/adts.js +66 -0
- package/dist/containers/adts.js.map +1 -0
- package/dist/containers/captions.d.ts +27 -0
- package/dist/containers/captions.d.ts.map +1 -0
- package/dist/containers/captions.js +36 -0
- package/dist/containers/captions.js.map +1 -0
- package/dist/containers/codec-probe/index.d.ts +35 -0
- package/dist/containers/codec-probe/index.d.ts.map +1 -0
- package/dist/containers/codec-probe/index.js +222 -0
- package/dist/containers/codec-probe/index.js.map +1 -0
- package/dist/containers/fmp4/writer.d.ts +62 -0
- package/dist/containers/fmp4/writer.d.ts.map +1 -0
- package/dist/containers/fmp4/writer.js +201 -0
- package/dist/containers/fmp4/writer.js.map +1 -0
- package/dist/containers/id3.d.ts +25 -0
- package/dist/containers/id3.d.ts.map +1 -0
- package/dist/containers/id3.js +75 -0
- package/dist/containers/id3.js.map +1 -0
- package/dist/containers/mp4-box/index.d.ts +79 -0
- package/dist/containers/mp4-box/index.d.ts.map +1 -0
- package/dist/containers/mp4-box/index.js +231 -0
- package/dist/containers/mp4-box/index.js.map +1 -0
- package/dist/containers/packed-audio/index.d.ts +7 -0
- package/dist/containers/packed-audio/index.d.ts.map +1 -0
- package/dist/containers/packed-audio/index.js +63 -0
- package/dist/containers/packed-audio/index.js.map +1 -0
- package/dist/containers/sei.d.ts +26 -0
- package/dist/containers/sei.d.ts.map +1 -0
- package/dist/containers/sei.js +100 -0
- package/dist/containers/sei.js.map +1 -0
- package/dist/containers/ts-transmux/demux.d.ts +49 -0
- package/dist/containers/ts-transmux/demux.d.ts.map +1 -0
- package/dist/containers/ts-transmux/demux.js +222 -0
- package/dist/containers/ts-transmux/demux.js.map +1 -0
- package/dist/containers/ts-transmux/h264.d.ts +48 -0
- package/dist/containers/ts-transmux/h264.d.ts.map +1 -0
- package/dist/containers/ts-transmux/h264.js +211 -0
- package/dist/containers/ts-transmux/h264.js.map +1 -0
- package/dist/containers/ts-transmux/index.d.ts +17 -0
- package/dist/containers/ts-transmux/index.d.ts.map +1 -0
- package/dist/containers/ts-transmux/index.js +34 -0
- package/dist/containers/ts-transmux/index.js.map +1 -0
- package/dist/containers/ts-transmux/runner.d.ts +23 -0
- package/dist/containers/ts-transmux/runner.d.ts.map +1 -0
- package/dist/containers/ts-transmux/runner.js +99 -0
- package/dist/containers/ts-transmux/runner.js.map +1 -0
- package/dist/containers/ts-transmux/transmux.d.ts +24 -0
- package/dist/containers/ts-transmux/transmux.d.ts.map +1 -0
- package/dist/containers/ts-transmux/transmux.js +212 -0
- package/dist/containers/ts-transmux/transmux.js.map +1 -0
- package/dist/containers/ts-transmux/transmux.worker.d.ts +2 -0
- package/dist/containers/ts-transmux/transmux.worker.d.ts.map +1 -0
- package/dist/containers/ts-transmux/transmux.worker.js +19 -0
- package/dist/containers/ts-transmux/transmux.worker.js.map +1 -0
- package/dist/es2015/_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/asyncToGenerator.js +27 -0
- package/dist/es2015/_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/defineProperty.js +12 -0
- package/dist/es2015/_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/objectSpread2.js +25 -0
- package/dist/es2015/_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/objectWithoutProperties.js +13 -0
- package/dist/es2015/_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/objectWithoutPropertiesLoose.js +12 -0
- package/dist/es2015/_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/toPrimitive.js +14 -0
- package/dist/es2015/_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/toPropertyKey.js +9 -0
- package/dist/es2015/_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/typeof.js +11 -0
- package/dist/es2015/containers/adts.js +77 -0
- package/dist/es2015/containers/captions.js +36 -0
- package/dist/es2015/containers/codec-probe/index.js +220 -0
- package/dist/es2015/containers/fmp4/writer.js +165 -0
- package/dist/es2015/containers/id3.js +72 -0
- package/dist/es2015/containers/mp4-box/index.js +209 -0
- package/dist/es2015/containers/packed-audio/index.js +67 -0
- package/dist/es2015/containers/sei.js +79 -0
- package/dist/es2015/containers/ts-transmux/demux.js +211 -0
- package/dist/es2015/containers/ts-transmux/h264.js +204 -0
- package/dist/es2015/containers/ts-transmux/index.js +37 -0
- package/dist/es2015/containers/ts-transmux/runner.js +95 -0
- package/dist/es2015/containers/ts-transmux/transmux.js +210 -0
- package/dist/es2015/containers/ts-transmux/transmux.worker.js +26 -0
- package/dist/es2015/index.js +356 -0
- package/dist/es2015/kernel/append-queue.js +148 -0
- package/dist/es2015/kernel/bus.js +134 -0
- package/dist/es2015/kernel/context.js +92 -0
- package/dist/es2015/kernel/effects.js +62 -0
- package/dist/es2015/kernel/evictor.js +67 -0
- package/dist/es2015/kernel/lifecycle.js +122 -0
- package/dist/es2015/kernel/loader.js +108 -0
- package/dist/es2015/kernel/mime.js +20 -0
- package/dist/es2015/kernel/mse.js +426 -0
- package/dist/es2015/kernel/reducer.js +1051 -0
- package/dist/es2015/kernel/rendition-select.js +263 -0
- package/dist/es2015/kernel/scheduler.js +82 -0
- package/dist/es2015/kernel/sinks/metadata-sink.js +7 -0
- package/dist/es2015/kernel/sinks/mse-sink.js +31 -0
- package/dist/es2015/kernel/sinks/text-track-sink.js +167 -0
- package/dist/es2015/kernel/timeline.js +127 -0
- package/dist/es2015/kernel/trace.js +134 -0
- package/dist/es2015/kernel/track-registry.js +47 -0
- package/dist/es2015/kernel/transport.js +242 -0
- package/dist/es2015/kernel/watchdog.js +38 -0
- package/dist/es2015/presets/dash/index.js +9 -0
- package/dist/es2015/presets/dash-drm/index.js +13 -0
- package/dist/es2015/presets/define.js +45 -0
- package/dist/es2015/presets/dual/index.js +14 -0
- package/dist/es2015/presets/dual-drm/index.js +14 -0
- package/dist/es2015/presets/dual-ts/index.js +14 -0
- package/dist/es2015/presets/dual-ts-drm/index.js +15 -0
- package/dist/es2015/presets/full/index.js +28 -0
- package/dist/es2015/presets/hls/index.js +9 -0
- package/dist/es2015/presets/hls-drm/index.js +13 -0
- package/dist/es2015/presets/hls-ts/index.js +13 -0
- package/dist/es2015/presets/hls-ts-drm/index.js +14 -0
- package/dist/es2015/presets/kernel/index.js +10 -0
- package/dist/es2015/presets/storage.js +24 -0
- package/dist/es2015/presets/tiers.js +93 -0
- package/dist/es2015/protocols/dash-cmaf/index.js +161 -0
- package/dist/es2015/protocols/dash-cmaf/parse.js +491 -0
- package/dist/es2015/protocols/dash-live/index.js +192 -0
- package/dist/es2015/protocols/hls-cmaf/index.js +168 -0
- package/dist/es2015/protocols/hls-cmaf/lexer.js +72 -0
- package/dist/es2015/protocols/hls-cmaf/parse.js +457 -0
- package/dist/es2015/protocols/hls-live/index.js +296 -0
- package/dist/es2015/protocols/live-shared.js +29 -0
- package/dist/es2015/stages/abr/index.js +126 -0
- package/dist/es2015/stages/abr-cap-size/index.js +22 -0
- package/dist/es2015/stages/abr-persist/index.js +52 -0
- package/dist/es2015/stages/aes-128/index.js +76 -0
- package/dist/es2015/stages/alt-audio/index.js +80 -0
- package/dist/es2015/stages/cmaf-timing/index.js +55 -0
- package/dist/es2015/stages/cmcd/index.js +70 -0
- package/dist/es2015/stages/codec-probe/index.js +65 -0
- package/dist/es2015/stages/codec-switch/index.js +48 -0
- package/dist/es2015/stages/content-steering/index.js +179 -0
- package/dist/es2015/stages/drm-shared.js +18 -0
- package/dist/es2015/stages/eme-cenc/index.js +46 -0
- package/dist/es2015/stages/eme-core/index.js +237 -0
- package/dist/es2015/stages/eme-fairplay/index.js +52 -0
- package/dist/es2015/stages/meta-id3/index.js +37 -0
- package/dist/es2015/stages/mp4-box/index.js +27 -0
- package/dist/es2015/stages/nal-scan/index.js +121 -0
- package/dist/es2015/stages/pdt/index.js +34 -0
- package/dist/es2015/stages/recovery/index.js +283 -0
- package/dist/es2015/stages/text-cea608/decode.js +201 -0
- package/dist/es2015/stages/text-cea608/index.js +71 -0
- package/dist/es2015/stages/text-webvtt/index.js +82 -0
- package/dist/es2015/stages/text-webvtt/parse.js +60 -0
- package/dist/es2015/stages/text-webvtt-segmented/index.js +57 -0
- package/dist/es2015/stages/thumbnails/index.js +73 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +423 -0
- package/dist/index.js.map +1 -0
- package/dist/kernel/append-queue.d.ts +47 -0
- package/dist/kernel/append-queue.d.ts.map +1 -0
- package/dist/kernel/append-queue.js +180 -0
- package/dist/kernel/append-queue.js.map +1 -0
- package/dist/kernel/bus.d.ts +50 -0
- package/dist/kernel/bus.d.ts.map +1 -0
- package/dist/kernel/bus.js +147 -0
- package/dist/kernel/bus.js.map +1 -0
- package/dist/kernel/context.d.ts +45 -0
- package/dist/kernel/context.d.ts.map +1 -0
- package/dist/kernel/context.js +116 -0
- package/dist/kernel/context.js.map +1 -0
- package/dist/kernel/effects.d.ts +33 -0
- package/dist/kernel/effects.d.ts.map +1 -0
- package/dist/kernel/effects.js +65 -0
- package/dist/kernel/effects.js.map +1 -0
- package/dist/kernel/evictor.d.ts +46 -0
- package/dist/kernel/evictor.d.ts.map +1 -0
- package/dist/kernel/evictor.js +92 -0
- package/dist/kernel/evictor.js.map +1 -0
- package/dist/kernel/lifecycle.d.ts +41 -0
- package/dist/kernel/lifecycle.d.ts.map +1 -0
- package/dist/kernel/lifecycle.js +129 -0
- package/dist/kernel/lifecycle.js.map +1 -0
- package/dist/kernel/loader.d.ts +28 -0
- package/dist/kernel/loader.d.ts.map +1 -0
- package/dist/kernel/loader.js +126 -0
- package/dist/kernel/loader.js.map +1 -0
- package/dist/kernel/mime.d.ts +13 -0
- package/dist/kernel/mime.d.ts.map +1 -0
- package/dist/kernel/mime.js +18 -0
- package/dist/kernel/mime.js.map +1 -0
- package/dist/kernel/mse.d.ts +62 -0
- package/dist/kernel/mse.d.ts.map +1 -0
- package/dist/kernel/mse.js +490 -0
- package/dist/kernel/mse.js.map +1 -0
- package/dist/kernel/reducer.d.ts +39 -0
- package/dist/kernel/reducer.d.ts.map +1 -0
- package/dist/kernel/reducer.js +1316 -0
- package/dist/kernel/reducer.js.map +1 -0
- package/dist/kernel/rendition-select.d.ts +102 -0
- package/dist/kernel/rendition-select.d.ts.map +1 -0
- package/dist/kernel/rendition-select.js +295 -0
- package/dist/kernel/rendition-select.js.map +1 -0
- package/dist/kernel/scheduler.d.ts +57 -0
- package/dist/kernel/scheduler.d.ts.map +1 -0
- package/dist/kernel/scheduler.js +98 -0
- package/dist/kernel/scheduler.js.map +1 -0
- package/dist/kernel/sinks/metadata-sink.d.ts +7 -0
- package/dist/kernel/sinks/metadata-sink.d.ts.map +1 -0
- package/dist/kernel/sinks/metadata-sink.js +5 -0
- package/dist/kernel/sinks/metadata-sink.js.map +1 -0
- package/dist/kernel/sinks/mse-sink.d.ts +17 -0
- package/dist/kernel/sinks/mse-sink.d.ts.map +1 -0
- package/dist/kernel/sinks/mse-sink.js +20 -0
- package/dist/kernel/sinks/mse-sink.js.map +1 -0
- package/dist/kernel/sinks/text-track-sink.d.ts +45 -0
- package/dist/kernel/sinks/text-track-sink.d.ts.map +1 -0
- package/dist/kernel/sinks/text-track-sink.js +184 -0
- package/dist/kernel/sinks/text-track-sink.js.map +1 -0
- package/dist/kernel/timeline.d.ts +57 -0
- package/dist/kernel/timeline.d.ts.map +1 -0
- package/dist/kernel/timeline.js +203 -0
- package/dist/kernel/timeline.js.map +1 -0
- package/dist/kernel/trace.d.ts +42 -0
- package/dist/kernel/trace.d.ts.map +1 -0
- package/dist/kernel/trace.js +165 -0
- package/dist/kernel/trace.js.map +1 -0
- package/dist/kernel/track-registry.d.ts +22 -0
- package/dist/kernel/track-registry.d.ts.map +1 -0
- package/dist/kernel/track-registry.js +42 -0
- package/dist/kernel/track-registry.js.map +1 -0
- package/dist/kernel/transport.d.ts +90 -0
- package/dist/kernel/transport.d.ts.map +1 -0
- package/dist/kernel/transport.js +256 -0
- package/dist/kernel/transport.js.map +1 -0
- package/dist/kernel/watchdog.d.ts +35 -0
- package/dist/kernel/watchdog.d.ts.map +1 -0
- package/dist/kernel/watchdog.js +43 -0
- package/dist/kernel/watchdog.js.map +1 -0
- package/dist/presets/dash/index.d.ts +4 -0
- package/dist/presets/dash/index.d.ts.map +1 -0
- package/dist/presets/dash/index.js +8 -0
- package/dist/presets/dash/index.js.map +1 -0
- package/dist/presets/dash-drm/index.d.ts +4 -0
- package/dist/presets/dash-drm/index.d.ts.map +1 -0
- package/dist/presets/dash-drm/index.js +8 -0
- package/dist/presets/dash-drm/index.js.map +1 -0
- package/dist/presets/define.d.ts +36 -0
- package/dist/presets/define.d.ts.map +1 -0
- package/dist/presets/define.js +39 -0
- package/dist/presets/define.js.map +1 -0
- package/dist/presets/dual/index.d.ts +4 -0
- package/dist/presets/dual/index.d.ts.map +1 -0
- package/dist/presets/dual/index.js +9 -0
- package/dist/presets/dual/index.js.map +1 -0
- package/dist/presets/dual-drm/index.d.ts +4 -0
- package/dist/presets/dual-drm/index.d.ts.map +1 -0
- package/dist/presets/dual-drm/index.js +13 -0
- package/dist/presets/dual-drm/index.js.map +1 -0
- package/dist/presets/dual-ts/index.d.ts +4 -0
- package/dist/presets/dual-ts/index.d.ts.map +1 -0
- package/dist/presets/dual-ts/index.js +8 -0
- package/dist/presets/dual-ts/index.js.map +1 -0
- package/dist/presets/dual-ts-drm/index.d.ts +4 -0
- package/dist/presets/dual-ts-drm/index.d.ts.map +1 -0
- package/dist/presets/dual-ts-drm/index.js +14 -0
- package/dist/presets/dual-ts-drm/index.js.map +1 -0
- package/dist/presets/full/index.d.ts +4 -0
- package/dist/presets/full/index.d.ts.map +1 -0
- package/dist/presets/full/index.js +27 -0
- package/dist/presets/full/index.js.map +1 -0
- package/dist/presets/hls/index.d.ts +4 -0
- package/dist/presets/hls/index.d.ts.map +1 -0
- package/dist/presets/hls/index.js +8 -0
- package/dist/presets/hls/index.js.map +1 -0
- package/dist/presets/hls-drm/index.d.ts +4 -0
- package/dist/presets/hls-drm/index.d.ts.map +1 -0
- package/dist/presets/hls-drm/index.js +8 -0
- package/dist/presets/hls-drm/index.js.map +1 -0
- package/dist/presets/hls-ts/index.d.ts +4 -0
- package/dist/presets/hls-ts/index.d.ts.map +1 -0
- package/dist/presets/hls-ts/index.js +8 -0
- package/dist/presets/hls-ts/index.js.map +1 -0
- package/dist/presets/hls-ts-drm/index.d.ts +4 -0
- package/dist/presets/hls-ts-drm/index.d.ts.map +1 -0
- package/dist/presets/hls-ts-drm/index.js +13 -0
- package/dist/presets/hls-ts-drm/index.js.map +1 -0
- package/dist/presets/kernel/index.d.ts +4 -0
- package/dist/presets/kernel/index.d.ts.map +1 -0
- package/dist/presets/kernel/index.js +9 -0
- package/dist/presets/kernel/index.js.map +1 -0
- package/dist/presets/storage.d.ts +9 -0
- package/dist/presets/storage.d.ts.map +1 -0
- package/dist/presets/storage.js +24 -0
- package/dist/presets/storage.js.map +1 -0
- package/dist/presets/tiers.d.ts +22 -0
- package/dist/presets/tiers.d.ts.map +1 -0
- package/dist/presets/tiers.js +78 -0
- package/dist/presets/tiers.js.map +1 -0
- package/dist/protocols/dash-cmaf/index.d.ts +20 -0
- package/dist/protocols/dash-cmaf/index.d.ts.map +1 -0
- package/dist/protocols/dash-cmaf/index.js +176 -0
- package/dist/protocols/dash-cmaf/index.js.map +1 -0
- package/dist/protocols/dash-cmaf/parse.d.ts +24 -0
- package/dist/protocols/dash-cmaf/parse.d.ts.map +1 -0
- package/dist/protocols/dash-cmaf/parse.js +586 -0
- package/dist/protocols/dash-cmaf/parse.js.map +1 -0
- package/dist/protocols/dash-live/index.d.ts +4 -0
- package/dist/protocols/dash-live/index.d.ts.map +1 -0
- package/dist/protocols/dash-live/index.js +188 -0
- package/dist/protocols/dash-live/index.js.map +1 -0
- package/dist/protocols/hls-cmaf/index.d.ts +17 -0
- package/dist/protocols/hls-cmaf/index.d.ts.map +1 -0
- package/dist/protocols/hls-cmaf/index.js +189 -0
- package/dist/protocols/hls-cmaf/index.js.map +1 -0
- package/dist/protocols/hls-cmaf/lexer.d.ts +25 -0
- package/dist/protocols/hls-cmaf/lexer.d.ts.map +1 -0
- package/dist/protocols/hls-cmaf/lexer.js +81 -0
- package/dist/protocols/hls-cmaf/lexer.js.map +1 -0
- package/dist/protocols/hls-cmaf/parse.d.ts +57 -0
- package/dist/protocols/hls-cmaf/parse.d.ts.map +1 -0
- package/dist/protocols/hls-cmaf/parse.js +572 -0
- package/dist/protocols/hls-cmaf/parse.js.map +1 -0
- package/dist/protocols/hls-live/index.d.ts +4 -0
- package/dist/protocols/hls-live/index.d.ts.map +1 -0
- package/dist/protocols/hls-live/index.js +309 -0
- package/dist/protocols/hls-live/index.js.map +1 -0
- package/dist/protocols/live-shared.d.ts +21 -0
- package/dist/protocols/live-shared.d.ts.map +1 -0
- package/dist/protocols/live-shared.js +32 -0
- package/dist/protocols/live-shared.js.map +1 -0
- package/dist/stages/abr/index.d.ts +16 -0
- package/dist/stages/abr/index.d.ts.map +1 -0
- package/dist/stages/abr/index.js +176 -0
- package/dist/stages/abr/index.js.map +1 -0
- package/dist/stages/abr-cap-size/index.d.ts +8 -0
- package/dist/stages/abr-cap-size/index.d.ts.map +1 -0
- package/dist/stages/abr-cap-size/index.js +21 -0
- package/dist/stages/abr-cap-size/index.js.map +1 -0
- package/dist/stages/abr-persist/index.d.ts +8 -0
- package/dist/stages/abr-persist/index.d.ts.map +1 -0
- package/dist/stages/abr-persist/index.js +44 -0
- package/dist/stages/abr-persist/index.js.map +1 -0
- package/dist/stages/aes-128/index.d.ts +15 -0
- package/dist/stages/aes-128/index.d.ts.map +1 -0
- package/dist/stages/aes-128/index.js +78 -0
- package/dist/stages/aes-128/index.js.map +1 -0
- package/dist/stages/alt-audio/index.d.ts +4 -0
- package/dist/stages/alt-audio/index.d.ts.map +1 -0
- package/dist/stages/alt-audio/index.js +90 -0
- package/dist/stages/alt-audio/index.js.map +1 -0
- package/dist/stages/cmaf-timing/index.d.ts +3 -0
- package/dist/stages/cmaf-timing/index.d.ts.map +1 -0
- package/dist/stages/cmaf-timing/index.js +56 -0
- package/dist/stages/cmaf-timing/index.js.map +1 -0
- package/dist/stages/cmcd/index.d.ts +22 -0
- package/dist/stages/cmcd/index.d.ts.map +1 -0
- package/dist/stages/cmcd/index.js +92 -0
- package/dist/stages/cmcd/index.js.map +1 -0
- package/dist/stages/codec-probe/index.d.ts +9 -0
- package/dist/stages/codec-probe/index.d.ts.map +1 -0
- package/dist/stages/codec-probe/index.js +68 -0
- package/dist/stages/codec-probe/index.js.map +1 -0
- package/dist/stages/codec-switch/index.d.ts +6 -0
- package/dist/stages/codec-switch/index.d.ts.map +1 -0
- package/dist/stages/codec-switch/index.js +59 -0
- package/dist/stages/codec-switch/index.js.map +1 -0
- package/dist/stages/content-steering/index.d.ts +4 -0
- package/dist/stages/content-steering/index.d.ts.map +1 -0
- package/dist/stages/content-steering/index.js +174 -0
- package/dist/stages/content-steering/index.js.map +1 -0
- package/dist/stages/drm-shared.d.ts +46 -0
- package/dist/stages/drm-shared.d.ts.map +1 -0
- package/dist/stages/drm-shared.js +28 -0
- package/dist/stages/drm-shared.js.map +1 -0
- package/dist/stages/eme-cenc/index.d.ts +12 -0
- package/dist/stages/eme-cenc/index.d.ts.map +1 -0
- package/dist/stages/eme-cenc/index.js +53 -0
- package/dist/stages/eme-cenc/index.js.map +1 -0
- package/dist/stages/eme-core/index.d.ts +29 -0
- package/dist/stages/eme-core/index.d.ts.map +1 -0
- package/dist/stages/eme-core/index.js +244 -0
- package/dist/stages/eme-core/index.js.map +1 -0
- package/dist/stages/eme-fairplay/index.d.ts +20 -0
- package/dist/stages/eme-fairplay/index.d.ts.map +1 -0
- package/dist/stages/eme-fairplay/index.js +59 -0
- package/dist/stages/eme-fairplay/index.js.map +1 -0
- package/dist/stages/meta-id3/index.d.ts +14 -0
- package/dist/stages/meta-id3/index.d.ts.map +1 -0
- package/dist/stages/meta-id3/index.js +30 -0
- package/dist/stages/meta-id3/index.js.map +1 -0
- package/dist/stages/mp4-box/index.d.ts +3 -0
- package/dist/stages/mp4-box/index.d.ts.map +1 -0
- package/dist/stages/mp4-box/index.js +19 -0
- package/dist/stages/mp4-box/index.js.map +1 -0
- package/dist/stages/nal-scan/index.d.ts +3 -0
- package/dist/stages/nal-scan/index.d.ts.map +1 -0
- package/dist/stages/nal-scan/index.js +123 -0
- package/dist/stages/nal-scan/index.js.map +1 -0
- package/dist/stages/pdt/index.d.ts +14 -0
- package/dist/stages/pdt/index.d.ts.map +1 -0
- package/dist/stages/pdt/index.js +34 -0
- package/dist/stages/pdt/index.js.map +1 -0
- package/dist/stages/recovery/index.d.ts +16 -0
- package/dist/stages/recovery/index.d.ts.map +1 -0
- package/dist/stages/recovery/index.js +270 -0
- package/dist/stages/recovery/index.js.map +1 -0
- package/dist/stages/text-cea608/decode.d.ts +44 -0
- package/dist/stages/text-cea608/decode.d.ts.map +1 -0
- package/dist/stages/text-cea608/decode.js +225 -0
- package/dist/stages/text-cea608/decode.js.map +1 -0
- package/dist/stages/text-cea608/index.d.ts +3 -0
- package/dist/stages/text-cea608/index.d.ts.map +1 -0
- package/dist/stages/text-cea608/index.js +84 -0
- package/dist/stages/text-cea608/index.js.map +1 -0
- package/dist/stages/text-webvtt/index.d.ts +3 -0
- package/dist/stages/text-webvtt/index.d.ts.map +1 -0
- package/dist/stages/text-webvtt/index.js +82 -0
- package/dist/stages/text-webvtt/index.js.map +1 -0
- package/dist/stages/text-webvtt/parse.d.ts +19 -0
- package/dist/stages/text-webvtt/parse.d.ts.map +1 -0
- package/dist/stages/text-webvtt/parse.js +62 -0
- package/dist/stages/text-webvtt/parse.js.map +1 -0
- package/dist/stages/text-webvtt-segmented/index.d.ts +5 -0
- package/dist/stages/text-webvtt-segmented/index.d.ts.map +1 -0
- package/dist/stages/text-webvtt-segmented/index.js +63 -0
- package/dist/stages/text-webvtt-segmented/index.js.map +1 -0
- package/dist/stages/thumbnails/index.d.ts +34 -0
- package/dist/stages/thumbnails/index.d.ts.map +1 -0
- package/dist/stages/thumbnails/index.js +58 -0
- package/dist/stages/thumbnails/index.js.map +1 -0
- package/dist/types/error.d.ts +33 -0
- package/dist/types/error.d.ts.map +1 -0
- package/dist/types/error.js +7 -0
- package/dist/types/error.js.map +1 -0
- package/dist/types/facade.d.ts +104 -0
- package/dist/types/facade.d.ts.map +1 -0
- package/dist/types/facade.js +2 -0
- package/dist/types/facade.js.map +1 -0
- package/dist/types/ir.d.ts +238 -0
- package/dist/types/ir.d.ts.map +1 -0
- package/dist/types/ir.js +7 -0
- package/dist/types/ir.js.map +1 -0
- package/dist/types/kernel.d.ts +217 -0
- package/dist/types/kernel.d.ts.map +1 -0
- package/dist/types/kernel.js +2 -0
- package/dist/types/kernel.js.map +1 -0
- package/dist/types/messages.d.ts +288 -0
- package/dist/types/messages.d.ts.map +1 -0
- package/dist/types/messages.js +2 -0
- package/dist/types/messages.js.map +1 -0
- package/dist/types/quality.d.ts +108 -0
- package/dist/types/quality.d.ts.map +1 -0
- package/dist/types/quality.js +2 -0
- package/dist/types/quality.js.map +1 -0
- package/dist/types/sink.d.ts +27 -0
- package/dist/types/sink.d.ts.map +1 -0
- package/dist/types/sink.js +2 -0
- package/dist/types/sink.js.map +1 -0
- package/dist/types/stage.d.ts +139 -0
- package/dist/types/stage.d.ts.map +1 -0
- package/dist/types/stage.js +2 -0
- package/dist/types/stage.js.map +1 -0
- package/package.json +132 -0
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
import _objectSpread2 from "../../_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/objectSpread2.js";
|
|
2
|
+
//#region src/stages/recovery/index.ts
|
|
3
|
+
const DEFAULTS = {
|
|
4
|
+
excludeAfter: 2,
|
|
5
|
+
readmitAfterSeconds: 15,
|
|
6
|
+
skipAfter: 3,
|
|
7
|
+
maxConsecutiveSkips: 3,
|
|
8
|
+
maxGapSeconds: 2
|
|
9
|
+
};
|
|
10
|
+
const READMIT_TOKEN = "recovery:readmit";
|
|
11
|
+
const INITIAL = {
|
|
12
|
+
renditionFails: {},
|
|
13
|
+
seqFails: {},
|
|
14
|
+
excluded: [],
|
|
15
|
+
readmitPending: false,
|
|
16
|
+
lastJump: null,
|
|
17
|
+
stall: null,
|
|
18
|
+
flushes: 0,
|
|
19
|
+
skips: 0
|
|
20
|
+
};
|
|
21
|
+
/** Loops a message back into the bus through a zero-delay schedule effect. */
|
|
22
|
+
function feed(message) {
|
|
23
|
+
return {
|
|
24
|
+
kind: "schedule",
|
|
25
|
+
token: "recovery:loopback",
|
|
26
|
+
delayMs: 0,
|
|
27
|
+
then: message
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function constrainExcluded(excluded) {
|
|
31
|
+
return excluded.length === 0 ? feed({
|
|
32
|
+
type: "RELEASE_CONSTRAINT",
|
|
33
|
+
source: "recovery"
|
|
34
|
+
}) : feed({
|
|
35
|
+
type: "CONSTRAIN",
|
|
36
|
+
source: "recovery",
|
|
37
|
+
constraint: { excludeIds: excluded }
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
function isCueTrack(kernel, trackId) {
|
|
41
|
+
var _kernel$presentation$, _kernel$presentation;
|
|
42
|
+
for (const period of (_kernel$presentation$ = (_kernel$presentation = kernel.presentation) === null || _kernel$presentation === void 0 ? void 0 : _kernel$presentation.periods) !== null && _kernel$presentation$ !== void 0 ? _kernel$presentation$ : []) for (const track of period.tracks) if (track.id === trackId) return track.contentType === "text" || track.contentType === "metadata";
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
function segmentWindow(kernel, seq) {
|
|
46
|
+
var _kernel$presentation$2, _kernel$presentation2;
|
|
47
|
+
for (const period of (_kernel$presentation$2 = (_kernel$presentation2 = kernel.presentation) === null || _kernel$presentation2 === void 0 ? void 0 : _kernel$presentation2.periods) !== null && _kernel$presentation$2 !== void 0 ? _kernel$presentation$2 : []) for (const track of period.tracks) for (const rendition of track.renditions) {
|
|
48
|
+
if (!Array.isArray(rendition.segments)) continue;
|
|
49
|
+
const segment = rendition.segments.find((s) => s.seq === seq);
|
|
50
|
+
if (segment !== void 0) return {
|
|
51
|
+
start: segment.start,
|
|
52
|
+
end: segment.start + segment.duration
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
/** The segment of the active video rendition that covers `time`. */
|
|
58
|
+
function segmentAt(kernel, time) {
|
|
59
|
+
var _kernel$presentation$3, _kernel$presentation3;
|
|
60
|
+
const active = kernel.quality.active;
|
|
61
|
+
for (const period of (_kernel$presentation$3 = (_kernel$presentation3 = kernel.presentation) === null || _kernel$presentation3 === void 0 ? void 0 : _kernel$presentation3.periods) !== null && _kernel$presentation$3 !== void 0 ? _kernel$presentation$3 : []) for (const track of period.tracks) {
|
|
62
|
+
if (track.contentType !== "video") continue;
|
|
63
|
+
for (const rendition of track.renditions) {
|
|
64
|
+
if (active !== null && rendition.id !== active) continue;
|
|
65
|
+
if (!Array.isArray(rendition.segments)) continue;
|
|
66
|
+
const segment = rendition.segments.find((s) => s.start <= time && time < s.start + s.duration);
|
|
67
|
+
if (segment !== void 0) return {
|
|
68
|
+
start: segment.start,
|
|
69
|
+
end: segment.start + segment.duration
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
function createRecoveryReducer(options) {
|
|
76
|
+
return (slice, msg, kernel) => {
|
|
77
|
+
const state = slice !== null && slice !== void 0 ? slice : INITIAL;
|
|
78
|
+
if (msg.type === "DETACH" || msg.type === "UNLOAD" || msg.type === "LOAD") return [INITIAL, msg.type === "LOAD" ? [] : []];
|
|
79
|
+
if (msg.type === "SEGMENT_FAILED") {
|
|
80
|
+
var _state$renditionFails, _state$seqFails$seqKe;
|
|
81
|
+
if (msg.renditionId === void 0 || isCueTrack(kernel, msg.trackId)) return [state, []];
|
|
82
|
+
const effects = [];
|
|
83
|
+
const renditionFails = _objectSpread2(_objectSpread2({}, state.renditionFails), {}, { [msg.renditionId]: ((_state$renditionFails = state.renditionFails[msg.renditionId]) !== null && _state$renditionFails !== void 0 ? _state$renditionFails : 0) + 1 });
|
|
84
|
+
const seqKey = `${msg.trackId}:${msg.seq}`;
|
|
85
|
+
const seqFails = _objectSpread2(_objectSpread2({}, state.seqFails), {}, { [seqKey]: ((_state$seqFails$seqKe = state.seqFails[seqKey]) !== null && _state$seqFails$seqKe !== void 0 ? _state$seqFails$seqKe : 0) + 1 });
|
|
86
|
+
let excluded = state.excluded;
|
|
87
|
+
let readmitPending = state.readmitPending;
|
|
88
|
+
if (seqFails[seqKey] >= options.skipAfter && state.skips < options.maxConsecutiveSkips) {
|
|
89
|
+
const window = segmentWindow(kernel, msg.seq);
|
|
90
|
+
if (window !== null && kernel.playback.currentTime < window.end) {
|
|
91
|
+
effects.push({
|
|
92
|
+
kind: "emit",
|
|
93
|
+
event: "recovery:skip",
|
|
94
|
+
payload: {
|
|
95
|
+
seq: msg.seq,
|
|
96
|
+
to: window.end
|
|
97
|
+
}
|
|
98
|
+
}, feed({
|
|
99
|
+
type: "SEEK",
|
|
100
|
+
to: window.end + .1
|
|
101
|
+
}));
|
|
102
|
+
return [_objectSpread2(_objectSpread2({}, state), {}, {
|
|
103
|
+
renditionFails,
|
|
104
|
+
seqFails: {},
|
|
105
|
+
skips: state.skips + 1
|
|
106
|
+
}), effects];
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
if (renditionFails[msg.renditionId] >= options.excludeAfter && !excluded.includes(msg.renditionId)) {
|
|
110
|
+
excluded = [...excluded, msg.renditionId];
|
|
111
|
+
effects.push({
|
|
112
|
+
kind: "emit",
|
|
113
|
+
event: "recovery:excluded",
|
|
114
|
+
payload: { renditionId: msg.renditionId }
|
|
115
|
+
}, constrainExcluded(excluded));
|
|
116
|
+
if (!readmitPending) {
|
|
117
|
+
effects.push({
|
|
118
|
+
kind: "schedule",
|
|
119
|
+
token: READMIT_TOKEN,
|
|
120
|
+
delayMs: options.readmitAfterSeconds * 1e3,
|
|
121
|
+
then: {
|
|
122
|
+
type: "TICK",
|
|
123
|
+
token: READMIT_TOKEN
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
readmitPending = true;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return [_objectSpread2(_objectSpread2({}, state), {}, {
|
|
130
|
+
renditionFails,
|
|
131
|
+
seqFails,
|
|
132
|
+
excluded,
|
|
133
|
+
readmitPending
|
|
134
|
+
}), effects];
|
|
135
|
+
}
|
|
136
|
+
if (msg.type === "SEGMENT_LOADED" && msg.trackId !== "manifest") {
|
|
137
|
+
var _state$renditionFails2;
|
|
138
|
+
const rendition = kernel.quality.active;
|
|
139
|
+
if (rendition !== null && ((_state$renditionFails2 = state.renditionFails[rendition]) !== null && _state$renditionFails2 !== void 0 ? _state$renditionFails2 : 0) > 0 || state.skips > 0) {
|
|
140
|
+
const renditionFails = _objectSpread2({}, state.renditionFails);
|
|
141
|
+
if (rendition !== null) delete renditionFails[rendition];
|
|
142
|
+
return [_objectSpread2(_objectSpread2({}, state), {}, {
|
|
143
|
+
renditionFails,
|
|
144
|
+
skips: 0
|
|
145
|
+
}), []];
|
|
146
|
+
}
|
|
147
|
+
return [state, []];
|
|
148
|
+
}
|
|
149
|
+
if (msg.type === "TICK" && msg.token === READMIT_TOKEN) {
|
|
150
|
+
const [readmitted, ...rest] = state.excluded;
|
|
151
|
+
if (readmitted === void 0) return [_objectSpread2(_objectSpread2({}, state), {}, { readmitPending: false }), []];
|
|
152
|
+
const renditionFails = _objectSpread2({}, state.renditionFails);
|
|
153
|
+
delete renditionFails[readmitted];
|
|
154
|
+
const effects = [{
|
|
155
|
+
kind: "emit",
|
|
156
|
+
event: "recovery:readmitted",
|
|
157
|
+
payload: { renditionId: readmitted }
|
|
158
|
+
}, constrainExcluded(rest)];
|
|
159
|
+
let readmitPending = false;
|
|
160
|
+
if (rest.length > 0) {
|
|
161
|
+
effects.push({
|
|
162
|
+
kind: "schedule",
|
|
163
|
+
token: READMIT_TOKEN,
|
|
164
|
+
delayMs: options.readmitAfterSeconds * 1e3,
|
|
165
|
+
then: {
|
|
166
|
+
type: "TICK",
|
|
167
|
+
token: READMIT_TOKEN
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
readmitPending = true;
|
|
171
|
+
}
|
|
172
|
+
return [_objectSpread2(_objectSpread2({}, state), {}, {
|
|
173
|
+
excluded: rest,
|
|
174
|
+
renditionFails,
|
|
175
|
+
readmitPending
|
|
176
|
+
}), effects];
|
|
177
|
+
}
|
|
178
|
+
if (msg.type === "STALLED") {
|
|
179
|
+
const buffered = kernel.playback.buffered;
|
|
180
|
+
if (buffered.find((range) => range.start <= msg.at + .3 && range.end > msg.at + 1) !== void 0) {
|
|
181
|
+
const count = state.stall !== null && Math.abs(state.stall.at - msg.at) < .3 ? state.stall.count + 1 : 1;
|
|
182
|
+
const stall = {
|
|
183
|
+
at: msg.at,
|
|
184
|
+
count
|
|
185
|
+
};
|
|
186
|
+
if (count === 1) return [_objectSpread2(_objectSpread2({}, state), {}, { stall }), []];
|
|
187
|
+
if (count === 2) return [_objectSpread2(_objectSpread2({}, state), {}, { stall }), [{
|
|
188
|
+
kind: "emit",
|
|
189
|
+
event: "recovery:nudge",
|
|
190
|
+
payload: { at: msg.at }
|
|
191
|
+
}, feed({
|
|
192
|
+
type: "SEEK",
|
|
193
|
+
to: msg.at + .1
|
|
194
|
+
})]];
|
|
195
|
+
if (count === 3) {
|
|
196
|
+
const effects = [{
|
|
197
|
+
kind: "emit",
|
|
198
|
+
event: "recovery:flush",
|
|
199
|
+
payload: { at: msg.at }
|
|
200
|
+
}];
|
|
201
|
+
for (const sbId of kernel.buffers.keys()) effects.push({
|
|
202
|
+
kind: "remove",
|
|
203
|
+
sbId,
|
|
204
|
+
start: msg.at,
|
|
205
|
+
end: Number.POSITIVE_INFINITY
|
|
206
|
+
});
|
|
207
|
+
effects.push(feed({
|
|
208
|
+
type: "SEEK",
|
|
209
|
+
to: msg.at
|
|
210
|
+
}));
|
|
211
|
+
return [_objectSpread2(_objectSpread2({}, state), {}, { stall }), effects];
|
|
212
|
+
}
|
|
213
|
+
if (count === 4) {
|
|
214
|
+
const window = segmentAt(kernel, msg.at);
|
|
215
|
+
if (window !== null) return [_objectSpread2(_objectSpread2({}, state), {}, { stall }), [{
|
|
216
|
+
kind: "emit",
|
|
217
|
+
event: "recovery:skip",
|
|
218
|
+
payload: {
|
|
219
|
+
at: msg.at,
|
|
220
|
+
to: window.end
|
|
221
|
+
}
|
|
222
|
+
}, feed({
|
|
223
|
+
type: "SEEK",
|
|
224
|
+
to: window.end + .1
|
|
225
|
+
})]];
|
|
226
|
+
}
|
|
227
|
+
return [_objectSpread2(_objectSpread2({}, state), {}, { stall: null }), []];
|
|
228
|
+
}
|
|
229
|
+
const next = buffered.filter((range) => range.start > msg.at && range.start - msg.at <= options.maxGapSeconds).sort((a, b) => a.start - b.start)[0];
|
|
230
|
+
if (next !== void 0 && (state.lastJump === null || Math.abs(next.start - state.lastJump) > .5)) return [_objectSpread2(_objectSpread2({}, state), {}, {
|
|
231
|
+
lastJump: next.start,
|
|
232
|
+
stall: null
|
|
233
|
+
}), [{
|
|
234
|
+
kind: "emit",
|
|
235
|
+
event: "recovery:gap-jump",
|
|
236
|
+
payload: {
|
|
237
|
+
from: msg.at,
|
|
238
|
+
to: next.start
|
|
239
|
+
}
|
|
240
|
+
}, feed({
|
|
241
|
+
type: "SEEK",
|
|
242
|
+
to: next.start + .1
|
|
243
|
+
})]];
|
|
244
|
+
return [_objectSpread2(_objectSpread2({}, state), {}, { stall: null }), []];
|
|
245
|
+
}
|
|
246
|
+
if (msg.type === "SOURCEBUFFER_ERROR") {
|
|
247
|
+
var _kernel$bufferErrors$;
|
|
248
|
+
if (((_kernel$bufferErrors$ = kernel.bufferErrors.get(msg.sbId)) !== null && _kernel$bufferErrors$ !== void 0 ? _kernel$bufferErrors$ : 0) === 2 && state.flushes < 1) return [_objectSpread2(_objectSpread2({}, state), {}, { flushes: state.flushes + 1 }), [
|
|
249
|
+
{
|
|
250
|
+
kind: "emit",
|
|
251
|
+
event: "recovery:flush",
|
|
252
|
+
payload: { sbId: msg.sbId }
|
|
253
|
+
},
|
|
254
|
+
{
|
|
255
|
+
kind: "remove",
|
|
256
|
+
sbId: msg.sbId,
|
|
257
|
+
start: kernel.playback.currentTime,
|
|
258
|
+
end: Number.POSITIVE_INFINITY
|
|
259
|
+
},
|
|
260
|
+
feed({
|
|
261
|
+
type: "SEEK",
|
|
262
|
+
to: kernel.playback.currentTime
|
|
263
|
+
})
|
|
264
|
+
]];
|
|
265
|
+
return [state, []];
|
|
266
|
+
}
|
|
267
|
+
return [state, []];
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
/** The stage factory. */
|
|
271
|
+
function recovery(options) {
|
|
272
|
+
const resolved = _objectSpread2(_objectSpread2({}, DEFAULTS), options);
|
|
273
|
+
return {
|
|
274
|
+
name: "recovery",
|
|
275
|
+
provides: ["recovery"],
|
|
276
|
+
requires: ["scheduler", "mse"],
|
|
277
|
+
install(ctx) {
|
|
278
|
+
ctx.reduce("recovery", createRecoveryReducer(resolved));
|
|
279
|
+
}
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
//#endregion
|
|
283
|
+
export { recovery as default };
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import _defineProperty from "../../_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/defineProperty.js";
|
|
2
|
+
//#region src/stages/text-cea608/decode.ts
|
|
3
|
+
const ROWS = 15;
|
|
4
|
+
/** The basic CEA-608 character set: ASCII with a handful of substitutions. */
|
|
5
|
+
const BASIC = {
|
|
6
|
+
42: "á",
|
|
7
|
+
92: "é",
|
|
8
|
+
94: "í",
|
|
9
|
+
95: "ó",
|
|
10
|
+
96: "ú",
|
|
11
|
+
123: "ç",
|
|
12
|
+
124: "÷",
|
|
13
|
+
125: "Ñ",
|
|
14
|
+
126: "ñ",
|
|
15
|
+
127: "█"
|
|
16
|
+
};
|
|
17
|
+
/** Special characters, PAC-selected via 0x11/0x19 with 0x30-0x3f. */
|
|
18
|
+
const SPECIAL = {
|
|
19
|
+
48: "®",
|
|
20
|
+
49: "°",
|
|
21
|
+
50: "½",
|
|
22
|
+
51: "¿",
|
|
23
|
+
52: "™",
|
|
24
|
+
53: "¢",
|
|
25
|
+
54: "£",
|
|
26
|
+
55: "♪",
|
|
27
|
+
56: "à",
|
|
28
|
+
57: " ",
|
|
29
|
+
58: "è",
|
|
30
|
+
59: "â",
|
|
31
|
+
60: "ê",
|
|
32
|
+
61: "î",
|
|
33
|
+
62: "ô",
|
|
34
|
+
63: "û"
|
|
35
|
+
};
|
|
36
|
+
/** PAC row from the two control bytes; the standard's non-linear row map. */
|
|
37
|
+
const PAC_ROWS = [
|
|
38
|
+
11,
|
|
39
|
+
1,
|
|
40
|
+
3,
|
|
41
|
+
12,
|
|
42
|
+
14,
|
|
43
|
+
5,
|
|
44
|
+
7,
|
|
45
|
+
9
|
|
46
|
+
];
|
|
47
|
+
function basicChar(code) {
|
|
48
|
+
if (code in BASIC) return BASIC[code];
|
|
49
|
+
if (code >= 32 && code < 128) return String.fromCharCode(code);
|
|
50
|
+
return "";
|
|
51
|
+
}
|
|
52
|
+
var Cea608Decoder = class {
|
|
53
|
+
constructor() {
|
|
54
|
+
_defineProperty(this, "mode", "none");
|
|
55
|
+
_defineProperty(this, "displayed", blankScreen());
|
|
56
|
+
_defineProperty(this, "nonDisplayed", blankScreen());
|
|
57
|
+
_defineProperty(this, "row", 14);
|
|
58
|
+
_defineProperty(this, "col", 0);
|
|
59
|
+
_defineProperty(this, "rollUpRows", 2);
|
|
60
|
+
_defineProperty(this, "lastControl", 0);
|
|
61
|
+
_defineProperty(this, "cues", []);
|
|
62
|
+
_defineProperty(this, "openText", null);
|
|
63
|
+
_defineProperty(this, "openStart", 0);
|
|
64
|
+
}
|
|
65
|
+
/** Feeds one CEA-608 byte pair at a presentation time in seconds. */
|
|
66
|
+
push(a, b, time) {
|
|
67
|
+
const b0 = a & 127;
|
|
68
|
+
const b1 = b & 127;
|
|
69
|
+
if (b0 >= 16 && b0 <= 31) {
|
|
70
|
+
const packed = b0 << 8 | b1;
|
|
71
|
+
if (packed === this.lastControl) {
|
|
72
|
+
this.lastControl = 0;
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
this.lastControl = packed;
|
|
76
|
+
this.control(b0, b1, time);
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
this.lastControl = 0;
|
|
80
|
+
if (b0 !== 0) this.write(basicChar(b0));
|
|
81
|
+
if (b1 !== 0) this.write(basicChar(b1));
|
|
82
|
+
if (this.mode === "paintOn" || this.mode === "rollUp") this.refresh(time);
|
|
83
|
+
}
|
|
84
|
+
control(b0, b1, time) {
|
|
85
|
+
if (b0 === 17 && b1 >= 32 && b1 <= 47) {
|
|
86
|
+
this.write(" ");
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
if ((b0 === 17 || b0 === 25) && b1 >= 48 && b1 <= 63) {
|
|
90
|
+
var _SPECIAL$b;
|
|
91
|
+
this.write((_SPECIAL$b = SPECIAL[b1]) !== null && _SPECIAL$b !== void 0 ? _SPECIAL$b : "");
|
|
92
|
+
if (this.mode !== "popOn") this.refresh(time);
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
if (b0 >= 16 && b0 <= 23 && b1 >= 64 && b1 <= 127) {
|
|
96
|
+
this.pac(b0, b1);
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
if (b0 === 20 || b0 === 21 || b0 === 28) this.miscControl(b1, time);
|
|
100
|
+
}
|
|
101
|
+
miscControl(b1, time) {
|
|
102
|
+
switch (b1) {
|
|
103
|
+
case 32:
|
|
104
|
+
this.mode = "popOn";
|
|
105
|
+
break;
|
|
106
|
+
case 37:
|
|
107
|
+
case 38:
|
|
108
|
+
case 39:
|
|
109
|
+
this.rollUpRows = b1 - 35;
|
|
110
|
+
if (this.mode !== "rollUp") {
|
|
111
|
+
this.mode = "rollUp";
|
|
112
|
+
this.displayed = blankScreen();
|
|
113
|
+
}
|
|
114
|
+
this.row = 14;
|
|
115
|
+
this.col = 0;
|
|
116
|
+
break;
|
|
117
|
+
case 41:
|
|
118
|
+
this.mode = "paintOn";
|
|
119
|
+
break;
|
|
120
|
+
case 44:
|
|
121
|
+
this.closeCue(time);
|
|
122
|
+
this.displayed = blankScreen();
|
|
123
|
+
break;
|
|
124
|
+
case 45:
|
|
125
|
+
this.rollUp(time);
|
|
126
|
+
break;
|
|
127
|
+
case 46:
|
|
128
|
+
this.nonDisplayed = blankScreen();
|
|
129
|
+
break;
|
|
130
|
+
case 47:
|
|
131
|
+
this.closeCue(time);
|
|
132
|
+
[this.displayed, this.nonDisplayed] = [this.nonDisplayed, this.displayed];
|
|
133
|
+
this.refresh(time);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
pac(b0, b1) {
|
|
137
|
+
var _PAC_ROWS;
|
|
138
|
+
const rowBase = (_PAC_ROWS = PAC_ROWS[b0 & 7]) !== null && _PAC_ROWS !== void 0 ? _PAC_ROWS : 1;
|
|
139
|
+
const rowOffset = (b1 & 32) !== 0 ? 1 : 0;
|
|
140
|
+
this.row = Math.min(14, rowBase - 1 + rowOffset);
|
|
141
|
+
this.col = (b1 & 16) !== 0 ? ((b1 & 14) >> 1) * 4 : 0;
|
|
142
|
+
}
|
|
143
|
+
target() {
|
|
144
|
+
return this.mode === "popOn" ? this.nonDisplayed : this.displayed;
|
|
145
|
+
}
|
|
146
|
+
write(char) {
|
|
147
|
+
var _screen$this$row;
|
|
148
|
+
if (char === "") return;
|
|
149
|
+
const screen = this.target();
|
|
150
|
+
const padded = ((_screen$this$row = screen[this.row]) !== null && _screen$this$row !== void 0 ? _screen$this$row : "").padEnd(this.col, " ");
|
|
151
|
+
screen[this.row] = padded.slice(0, this.col) + char + padded.slice(this.col + 1);
|
|
152
|
+
this.col = Math.min(31, this.col + 1);
|
|
153
|
+
}
|
|
154
|
+
rollUp(time) {
|
|
155
|
+
var _this$displayed;
|
|
156
|
+
this.closeCue(time);
|
|
157
|
+
const top = ROWS - this.rollUpRows;
|
|
158
|
+
for (let r = top; r < 14; r += 1) this.displayed[r] = (_this$displayed = this.displayed[r + 1]) !== null && _this$displayed !== void 0 ? _this$displayed : "";
|
|
159
|
+
this.displayed[14] = "";
|
|
160
|
+
this.row = 14;
|
|
161
|
+
this.col = 0;
|
|
162
|
+
this.refresh(time);
|
|
163
|
+
}
|
|
164
|
+
refresh(time) {
|
|
165
|
+
var _this$openText;
|
|
166
|
+
const text = screenText(this.displayed);
|
|
167
|
+
if (text === ((_this$openText = this.openText) !== null && _this$openText !== void 0 ? _this$openText : "")) return;
|
|
168
|
+
this.closeCue(time);
|
|
169
|
+
if (text !== "") {
|
|
170
|
+
this.openText = text;
|
|
171
|
+
this.openStart = time;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
closeCue(time) {
|
|
175
|
+
if (this.openText === null) return;
|
|
176
|
+
if (time > this.openStart) this.cues.push({
|
|
177
|
+
start: this.openStart,
|
|
178
|
+
end: time,
|
|
179
|
+
text: this.openText
|
|
180
|
+
});
|
|
181
|
+
this.openText = null;
|
|
182
|
+
}
|
|
183
|
+
/** Closes any open caption at the final time and returns every cue. */
|
|
184
|
+
flush(time) {
|
|
185
|
+
this.closeCue(time);
|
|
186
|
+
return this.cues;
|
|
187
|
+
}
|
|
188
|
+
/** Returns cues completed since the last drain and forgets them. */
|
|
189
|
+
drain() {
|
|
190
|
+
if (this.cues.length === 0) return [];
|
|
191
|
+
return this.cues.splice(0, this.cues.length);
|
|
192
|
+
}
|
|
193
|
+
};
|
|
194
|
+
function blankScreen() {
|
|
195
|
+
return Array.from({ length: ROWS }, () => "");
|
|
196
|
+
}
|
|
197
|
+
function screenText(screen) {
|
|
198
|
+
return screen.map((line) => line.replace(/\s+$/, "")).filter((line) => line !== "").join("\n");
|
|
199
|
+
}
|
|
200
|
+
//#endregion
|
|
201
|
+
export { Cea608Decoder };
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { registerCaptionConsumer } from "../../containers/captions.js";
|
|
2
|
+
import { Cea608Decoder } from "./decode.js";
|
|
3
|
+
//#region src/stages/text-cea608/index.ts
|
|
4
|
+
/**
|
|
5
|
+
* CEA-608 in-band captions as a stage. It owns the decoder and the seam to
|
|
6
|
+
* its SEI source: it registers one caption consumer, and whichever source is
|
|
7
|
+
* composed (ts-transmux for TS, nal-scan for fMP4) delivers the byte pairs.
|
|
8
|
+
* The stage imports neither source, only the shared registry, which is what
|
|
9
|
+
* lets one decoder serve both routes (entanglement #1).
|
|
10
|
+
*
|
|
11
|
+
* Decoded captions become native VTTCues on a caption TextTrack, rendered by
|
|
12
|
+
* the browser like any text track. The track is created on the first cue and
|
|
13
|
+
* left off by default; the viewer or the app turns it on.
|
|
14
|
+
*/
|
|
15
|
+
function textCea608() {
|
|
16
|
+
return {
|
|
17
|
+
name: "text-cea608",
|
|
18
|
+
provides: ["text-cea608", {
|
|
19
|
+
contentType: "text",
|
|
20
|
+
mimeType: "application/cea-608"
|
|
21
|
+
}],
|
|
22
|
+
requires: [["ts-transmux", "nal-scan"]],
|
|
23
|
+
install(ctx) {
|
|
24
|
+
const decoder = new Cea608Decoder();
|
|
25
|
+
const element = ctx.element;
|
|
26
|
+
let track = null;
|
|
27
|
+
/** Empties the track. `cues` reads null while disabled; hidden makes them removable. */
|
|
28
|
+
function empty(target) {
|
|
29
|
+
target.mode = "hidden";
|
|
30
|
+
const { cues } = target;
|
|
31
|
+
if (cues === null) return;
|
|
32
|
+
for (let i = cues.length - 1; i >= 0; i -= 1) {
|
|
33
|
+
const cue = cues[i];
|
|
34
|
+
if (cue !== void 0) target.removeCue(cue);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function ensureTrack() {
|
|
38
|
+
if (track === null) {
|
|
39
|
+
var _track;
|
|
40
|
+
for (const existing of element.textTracks) if (existing.kind === "captions" && existing.label === "CC1") {
|
|
41
|
+
track = existing;
|
|
42
|
+
empty(track);
|
|
43
|
+
break;
|
|
44
|
+
}
|
|
45
|
+
(_track = track) !== null && _track !== void 0 || (track = element.addTextTrack("captions", "CC1", "en"));
|
|
46
|
+
track.mode = "hidden";
|
|
47
|
+
}
|
|
48
|
+
return track;
|
|
49
|
+
}
|
|
50
|
+
const unregister = registerCaptionConsumer((packets) => {
|
|
51
|
+
for (const packet of packets) for (const triple of packet.triples) if (triple.type === 0) decoder.push(triple.a, triple.b, packet.time);
|
|
52
|
+
const cues = decoder.drain();
|
|
53
|
+
if (cues.length === 0) return;
|
|
54
|
+
const VttCue = globalThis.VTTCue;
|
|
55
|
+
if (VttCue === void 0) return;
|
|
56
|
+
const target = ensureTrack();
|
|
57
|
+
for (const cue of cues) target.addCue(new VttCue(cue.start, cue.end, cue.text));
|
|
58
|
+
});
|
|
59
|
+
return () => {
|
|
60
|
+
unregister();
|
|
61
|
+
if (track !== null) {
|
|
62
|
+
empty(track);
|
|
63
|
+
track.mode = "disabled";
|
|
64
|
+
track = null;
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
//#endregion
|
|
71
|
+
export { textCea608 as default };
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { createTextTrackSink } from "../../kernel/sinks/text-track-sink.js";
|
|
2
|
+
import { parseVtt } from "./parse.js";
|
|
3
|
+
//#region src/stages/text-webvtt/index.ts
|
|
4
|
+
/**
|
|
5
|
+
* WebVTT as a stage: a parser for text/vtt and the text sink registration
|
|
6
|
+
* that makes text tracks selectable. Cues become native VTTCues through the
|
|
7
|
+
* kernel's TextTrackSink; the browser renders, styles, and exposes the
|
|
8
|
+
* caption UI, which is why this stage stays small.
|
|
9
|
+
*
|
|
10
|
+
* The stage also keeps the element's TextTrackList and the engine's text
|
|
11
|
+
* selection in step, both ways. Every text track exists natively from the
|
|
12
|
+
* manifest on, so the browser's caption menu lists all of them; the active
|
|
13
|
+
* one is `showing`, the rest `disabled`. A pick in that menu selects in the
|
|
14
|
+
* engine, and switching captions off there deselects.
|
|
15
|
+
*/
|
|
16
|
+
function parseSegment(data, _meta) {
|
|
17
|
+
return parseVtt(new TextDecoder().decode(data)).cues;
|
|
18
|
+
}
|
|
19
|
+
function textWebvtt() {
|
|
20
|
+
return {
|
|
21
|
+
name: "text-webvtt",
|
|
22
|
+
provides: ["text-webvtt", {
|
|
23
|
+
contentType: "text",
|
|
24
|
+
mimeType: "text/vtt"
|
|
25
|
+
}],
|
|
26
|
+
requires: ["scheduler"],
|
|
27
|
+
install(ctx) {
|
|
28
|
+
const { element } = ctx;
|
|
29
|
+
const sink = createTextTrackSink({
|
|
30
|
+
element,
|
|
31
|
+
parse: parseSegment
|
|
32
|
+
});
|
|
33
|
+
ctx.registerParser("text/vtt", parseSegment);
|
|
34
|
+
ctx.registerSink("text", () => sink);
|
|
35
|
+
function textTracks() {
|
|
36
|
+
const presentation = ctx.getState().presentation;
|
|
37
|
+
if (presentation === null) return [];
|
|
38
|
+
return presentation.periods.flatMap((period) => period.tracks.filter((track) => track.contentType === "text"));
|
|
39
|
+
}
|
|
40
|
+
function activeId() {
|
|
41
|
+
return ctx.getState().tracks.active.get("text");
|
|
42
|
+
}
|
|
43
|
+
function mirror() {
|
|
44
|
+
const active = activeId();
|
|
45
|
+
const current = new Set(textTracks().map((track) => track.id));
|
|
46
|
+
for (const id of sink.trackIds()) if (!current.has(id)) sink.retire(id);
|
|
47
|
+
for (const track of textTracks()) {
|
|
48
|
+
const native = sink.declare(track.id);
|
|
49
|
+
const mode = track.id === active ? "showing" : "disabled";
|
|
50
|
+
if (native.mode !== mode) native.mode = mode;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function onNativeChange() {
|
|
54
|
+
const active = activeId();
|
|
55
|
+
const showing = textTracks().find((track) => {
|
|
56
|
+
var _sink$nativeTrack;
|
|
57
|
+
return ((_sink$nativeTrack = sink.nativeTrack(track.id)) === null || _sink$nativeTrack === void 0 ? void 0 : _sink$nativeTrack.mode) === "showing";
|
|
58
|
+
});
|
|
59
|
+
if (showing !== void 0) {
|
|
60
|
+
if (showing.id !== active) ctx.dispatch({
|
|
61
|
+
type: "SELECT_TRACK",
|
|
62
|
+
trackId: showing.id
|
|
63
|
+
});
|
|
64
|
+
} else if (active !== void 0) ctx.dispatch({
|
|
65
|
+
type: "DESELECT_TRACK",
|
|
66
|
+
contentType: "text"
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
ctx.on("tracks:changed", mirror);
|
|
70
|
+
ctx.on("tracks:selected", (payload) => {
|
|
71
|
+
if (payload.contentType === "text") mirror();
|
|
72
|
+
});
|
|
73
|
+
element.textTracks.addEventListener("change", onNativeChange);
|
|
74
|
+
return () => {
|
|
75
|
+
element.textTracks.removeEventListener("change", onNativeChange);
|
|
76
|
+
sink.dispose();
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
//#endregion
|
|
82
|
+
export { textWebvtt as default };
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import _objectSpread2 from "../../_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/objectSpread2.js";
|
|
2
|
+
//#region src/stages/text-webvtt/parse.ts
|
|
3
|
+
/** `HH:MM:SS.mmm` or `MM:SS.mmm` to seconds, or null. */
|
|
4
|
+
function parseTimestamp(text) {
|
|
5
|
+
const match = /^(?:(\d+):)?([0-5]\d):([0-5]\d)\.(\d{3})$/.exec(text.trim());
|
|
6
|
+
if (match === null) return null;
|
|
7
|
+
const [, hours, minutes, seconds, millis] = match;
|
|
8
|
+
return Number(hours !== null && hours !== void 0 ? hours : 0) * 3600 + Number(minutes) * 60 + Number(seconds) + Number(millis) / 1e3;
|
|
9
|
+
}
|
|
10
|
+
/** djb2 over the cue text; enough identity for dedup, not cryptography. */
|
|
11
|
+
function hash(text) {
|
|
12
|
+
let value = 5381;
|
|
13
|
+
for (let i = 0; i < text.length; i += 1) value = (value << 5) + value + text.charCodeAt(i) >>> 0;
|
|
14
|
+
return value.toString(36);
|
|
15
|
+
}
|
|
16
|
+
function parseVtt(text) {
|
|
17
|
+
const body = text.charCodeAt(0) === 65279 ? text.slice(1) : text;
|
|
18
|
+
if (!body.startsWith("WEBVTT")) return {
|
|
19
|
+
cues: [],
|
|
20
|
+
skipped: 0
|
|
21
|
+
};
|
|
22
|
+
const cues = [];
|
|
23
|
+
let skipped = 0;
|
|
24
|
+
const blocks = body.split(/\r?\n\r?\n/).slice(1);
|
|
25
|
+
for (const block of blocks) {
|
|
26
|
+
var _settingsMatch$;
|
|
27
|
+
const lines = block.split(/\r?\n/).filter((line) => line !== "");
|
|
28
|
+
if (lines.length === 0) continue;
|
|
29
|
+
const first = lines[0];
|
|
30
|
+
if (first.startsWith("NOTE") || first.startsWith("STYLE") || first.startsWith("REGION")) continue;
|
|
31
|
+
const timingIndex = lines.findIndex((line) => line.includes("-->"));
|
|
32
|
+
if (timingIndex === -1 || timingIndex > 1) {
|
|
33
|
+
skipped += 1;
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
const id = timingIndex === 1 ? first : void 0;
|
|
37
|
+
const [startText, rest] = lines[timingIndex].split("-->");
|
|
38
|
+
const settingsMatch = (rest !== null && rest !== void 0 ? rest : "").trim().split(/\s+/);
|
|
39
|
+
const start = parseTimestamp(startText !== null && startText !== void 0 ? startText : "");
|
|
40
|
+
const end = parseTimestamp((_settingsMatch$ = settingsMatch[0]) !== null && _settingsMatch$ !== void 0 ? _settingsMatch$ : "");
|
|
41
|
+
if (start === null || end === null || end <= start) {
|
|
42
|
+
skipped += 1;
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
const settings = settingsMatch.slice(1).join(" ");
|
|
46
|
+
const cueText = lines.slice(timingIndex + 1).join("\n");
|
|
47
|
+
cues.push(_objectSpread2({
|
|
48
|
+
id: id !== null && id !== void 0 ? id : `${Math.round(start * 1e3)}-${Math.round(end * 1e3)}-${hash(cueText)}`,
|
|
49
|
+
start,
|
|
50
|
+
end,
|
|
51
|
+
text: cueText
|
|
52
|
+
}, settings !== "" ? { settings } : {}));
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
cues,
|
|
56
|
+
skipped
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
//#endregion
|
|
60
|
+
export { parseTimestamp, parseVtt };
|