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,296 @@
|
|
|
1
|
+
import _objectSpread2 from "../../_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/objectSpread2.js";
|
|
2
|
+
import { mergePlaylist, parseMediaPlaylist } from "../hls-cmaf/parse.js";
|
|
3
|
+
import { registerLiveNamespace } from "../live-shared.js";
|
|
4
|
+
//#region src/protocols/hls-live/index.ts
|
|
5
|
+
const REFRESH_TOKEN = "hls:live:refresh";
|
|
6
|
+
const TICK_TOKEN = "hls-live:reload";
|
|
7
|
+
const INITIAL = {
|
|
8
|
+
manifestUrl: null,
|
|
9
|
+
target: null,
|
|
10
|
+
companions: [],
|
|
11
|
+
round: 0,
|
|
12
|
+
tickPending: false,
|
|
13
|
+
inflight: null,
|
|
14
|
+
lastEndSeq: -1,
|
|
15
|
+
awaitingTarget: false
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* A two-hour DVR playlist is tens of kilobytes; reloading four of them every
|
|
19
|
+
* target duration saturates a slow link. The audio and text companions keep
|
|
20
|
+
* the full cadence because playback consumes them; the other video rungs
|
|
21
|
+
* only need to be fresh enough for a switch, which reloads the new target
|
|
22
|
+
* at once anyway.
|
|
23
|
+
*/
|
|
24
|
+
const LADDER_EVERY = 3;
|
|
25
|
+
/**
|
|
26
|
+
* Every reload names its rendition in the token, the target's included. A
|
|
27
|
+
* response is merged into the rendition it was fetched for, never into
|
|
28
|
+
* whichever rendition is the target when it lands: a switch while a
|
|
29
|
+
* reload is in flight would otherwise file one rendition's segment URLs
|
|
30
|
+
* under another, and the scheduler would then append the wrong bytes under
|
|
31
|
+
* a matching rendition id, which no init guard can catch.
|
|
32
|
+
*/
|
|
33
|
+
function refreshToken(renditionId) {
|
|
34
|
+
return `${REFRESH_TOKEN}:${renditionId}`;
|
|
35
|
+
}
|
|
36
|
+
function renditionOfToken(token) {
|
|
37
|
+
return token.startsWith(`${REFRESH_TOKEN}:`) ? token.slice(17) : null;
|
|
38
|
+
}
|
|
39
|
+
function findRendition(presentation, renditionId) {
|
|
40
|
+
for (const period of presentation.periods) for (const track of period.tracks) for (const rendition of track.renditions) if (rendition.id === renditionId) return rendition;
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* The active tracks' playlists other than the window rendition's: every
|
|
45
|
+
* other video rendition, the audio group rendition, a segmented subtitle
|
|
46
|
+
* playlist. The whole video ladder reloads because a switch can only land
|
|
47
|
+
* on a rendition whose playlist reaches the playhead; one left at its
|
|
48
|
+
* startup window can never be scheduled from, so the switch never happens.
|
|
49
|
+
* Renditions without a playlist of their own (muxed audio, a text track in
|
|
50
|
+
* a single file) need no reload.
|
|
51
|
+
*/
|
|
52
|
+
function companionTargets(presentation, kernel, windowRenditionId) {
|
|
53
|
+
const activeIds = new Set([
|
|
54
|
+
"video",
|
|
55
|
+
"audio",
|
|
56
|
+
"text"
|
|
57
|
+
].map((contentType) => kernel.tracks.active.get(contentType)).filter((id) => id !== void 0));
|
|
58
|
+
const out = [];
|
|
59
|
+
for (const period of presentation.periods) for (const track of period.tracks) {
|
|
60
|
+
if (!activeIds.has(track.id)) continue;
|
|
61
|
+
for (const rendition of track.renditions) {
|
|
62
|
+
if (rendition.id === windowRenditionId || rendition.playlistUrl === void 0) continue;
|
|
63
|
+
out.push({
|
|
64
|
+
url: rendition.playlistUrl,
|
|
65
|
+
renditionId: rendition.id,
|
|
66
|
+
ladder: track.contentType === "video"
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return out;
|
|
71
|
+
}
|
|
72
|
+
/** Loops a message back into the bus through a zero-delay schedule effect. */
|
|
73
|
+
function feed(message) {
|
|
74
|
+
return {
|
|
75
|
+
kind: "schedule",
|
|
76
|
+
token: "hls-live:loopback",
|
|
77
|
+
delayMs: 0,
|
|
78
|
+
then: message
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
function tick(delaySeconds) {
|
|
82
|
+
return {
|
|
83
|
+
kind: "schedule",
|
|
84
|
+
token: TICK_TOKEN,
|
|
85
|
+
delayMs: Math.max(500, delaySeconds * 1e3),
|
|
86
|
+
then: {
|
|
87
|
+
type: "TICK",
|
|
88
|
+
token: TICK_TOKEN
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* The rendition whose playlist drives the live window: the active video
|
|
94
|
+
* rendition, else the first with segments. Video leads, but an audio-only
|
|
95
|
+
* presentation (a radio or packed-audio DVR stream) has no video track, so
|
|
96
|
+
* audio drives the window there.
|
|
97
|
+
*/
|
|
98
|
+
function windowRendition(presentation, kernel) {
|
|
99
|
+
let fallback = null;
|
|
100
|
+
for (const contentType of ["video", "audio"]) {
|
|
101
|
+
for (const period of presentation.periods) for (const track of period.tracks) {
|
|
102
|
+
if (track.contentType !== contentType) continue;
|
|
103
|
+
for (const rendition of track.renditions) {
|
|
104
|
+
var _fallback;
|
|
105
|
+
if (!Array.isArray(rendition.segments) || rendition.segments.length === 0) continue;
|
|
106
|
+
if (rendition.id === kernel.quality.active) return rendition;
|
|
107
|
+
fallback = (_fallback = fallback) !== null && _fallback !== void 0 ? _fallback : rendition;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
if (fallback !== null) return fallback;
|
|
111
|
+
}
|
|
112
|
+
return fallback;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* The window fact for the rendition's current segment list, or null when
|
|
116
|
+
* the kernel already holds exactly that window: every companion reload
|
|
117
|
+
* feeds a MANIFEST_LOADED, and a window that has not moved is not news.
|
|
118
|
+
*/
|
|
119
|
+
function windowFact(presentation, rendition, kernel) {
|
|
120
|
+
var _presentation$live$ho, _presentation$live, _presentation$live$up, _presentation$live2;
|
|
121
|
+
const segments = rendition.segments;
|
|
122
|
+
if (!Array.isArray(segments) || segments.length === 0) return null;
|
|
123
|
+
const first = segments[0];
|
|
124
|
+
const last = segments[segments.length - 1];
|
|
125
|
+
if (first === void 0 || last === void 0) return null;
|
|
126
|
+
const end = last.start + last.duration;
|
|
127
|
+
const holdBack = (_presentation$live$ho = (_presentation$live = presentation.live) === null || _presentation$live === void 0 ? void 0 : _presentation$live.holdBack) !== null && _presentation$live$ho !== void 0 ? _presentation$live$ho : 3 * ((_presentation$live$up = (_presentation$live2 = presentation.live) === null || _presentation$live2 === void 0 ? void 0 : _presentation$live2.updatePeriod) !== null && _presentation$live$up !== void 0 ? _presentation$live$up : last.duration);
|
|
128
|
+
const start = first.start;
|
|
129
|
+
const edge = Math.max(start, end - holdBack);
|
|
130
|
+
const known = kernel.live;
|
|
131
|
+
if (known !== null && known.span.start === start && known.span.end === end && known.edge === edge) return null;
|
|
132
|
+
return feed({
|
|
133
|
+
type: "LIVE_WINDOW_CHANGED",
|
|
134
|
+
start,
|
|
135
|
+
end,
|
|
136
|
+
edge
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
/** The playlist URL a rendition's reload resolves against. */
|
|
140
|
+
function playlistUrlFor(presentation, renditionId, target) {
|
|
141
|
+
const rendition = findRendition(presentation, renditionId);
|
|
142
|
+
if ((rendition === null || rendition === void 0 ? void 0 : rendition.playlistUrl) !== void 0) return rendition.playlistUrl;
|
|
143
|
+
return target !== null && target.renditionId === renditionId ? target.url : null;
|
|
144
|
+
}
|
|
145
|
+
const reduceHlsLive = (slice, msg, kernel) => {
|
|
146
|
+
const state = slice !== null && slice !== void 0 ? slice : INITIAL;
|
|
147
|
+
if (msg.type === "LOAD") return [_objectSpread2(_objectSpread2({}, INITIAL), {}, { manifestUrl: msg.url }), []];
|
|
148
|
+
if (msg.type === "UNLOAD" || msg.type === "DETACH") return [INITIAL, []];
|
|
149
|
+
if (msg.type === "MANIFEST_LOADED") {
|
|
150
|
+
var _rendition$playlistUr, _rendition$id;
|
|
151
|
+
if (!msg.presentation.isLive) return [_objectSpread2(_objectSpread2({}, state), {}, {
|
|
152
|
+
target: null,
|
|
153
|
+
companions: [],
|
|
154
|
+
inflight: null
|
|
155
|
+
}), []];
|
|
156
|
+
const rendition = windowRendition(msg.presentation, kernel);
|
|
157
|
+
const effects = [];
|
|
158
|
+
const url = (_rendition$playlistUr = rendition === null || rendition === void 0 ? void 0 : rendition.playlistUrl) !== null && _rendition$playlistUr !== void 0 ? _rendition$playlistUr : state.manifestUrl;
|
|
159
|
+
const target = url !== null && rendition !== null ? {
|
|
160
|
+
url,
|
|
161
|
+
renditionId: rendition.id,
|
|
162
|
+
ladder: false
|
|
163
|
+
} : state.target;
|
|
164
|
+
const companions = companionTargets(msg.presentation, kernel, (_rendition$id = rendition === null || rendition === void 0 ? void 0 : rendition.id) !== null && _rendition$id !== void 0 ? _rendition$id : null);
|
|
165
|
+
const switched = state.target !== null && target !== null && target.renditionId !== state.target.renditionId;
|
|
166
|
+
let awaitingTarget = state.awaitingTarget;
|
|
167
|
+
let inflight = state.inflight;
|
|
168
|
+
if (switched && target !== null) {
|
|
169
|
+
if (inflight !== target.renditionId) {
|
|
170
|
+
effects.push({
|
|
171
|
+
kind: "fetch",
|
|
172
|
+
token: refreshToken(target.renditionId),
|
|
173
|
+
url: target.url
|
|
174
|
+
});
|
|
175
|
+
inflight = target.renditionId;
|
|
176
|
+
}
|
|
177
|
+
awaitingTarget = true;
|
|
178
|
+
} else if (!awaitingTarget && rendition !== null) {
|
|
179
|
+
const window = windowFact(msg.presentation, rendition, kernel);
|
|
180
|
+
if (window !== null) effects.push(window);
|
|
181
|
+
}
|
|
182
|
+
let tickPending = state.tickPending;
|
|
183
|
+
if (!tickPending && inflight === null && target !== null) {
|
|
184
|
+
var _msg$presentation$liv, _msg$presentation$liv2;
|
|
185
|
+
effects.push(tick((_msg$presentation$liv = (_msg$presentation$liv2 = msg.presentation.live) === null || _msg$presentation$liv2 === void 0 ? void 0 : _msg$presentation$liv2.updatePeriod) !== null && _msg$presentation$liv !== void 0 ? _msg$presentation$liv : 4));
|
|
186
|
+
tickPending = true;
|
|
187
|
+
}
|
|
188
|
+
return [_objectSpread2(_objectSpread2({}, state), {}, {
|
|
189
|
+
target,
|
|
190
|
+
companions,
|
|
191
|
+
tickPending,
|
|
192
|
+
inflight,
|
|
193
|
+
awaitingTarget
|
|
194
|
+
}), effects];
|
|
195
|
+
}
|
|
196
|
+
if (msg.type === "TICK" && msg.token === TICK_TOKEN) {
|
|
197
|
+
var _kernel$presentation;
|
|
198
|
+
if (state.target === null || ((_kernel$presentation = kernel.presentation) === null || _kernel$presentation === void 0 ? void 0 : _kernel$presentation.isLive) !== true) return [_objectSpread2(_objectSpread2({}, state), {}, {
|
|
199
|
+
tickPending: false,
|
|
200
|
+
inflight: null
|
|
201
|
+
}), []];
|
|
202
|
+
const effects = [];
|
|
203
|
+
let inflight = state.inflight;
|
|
204
|
+
if (inflight !== state.target.renditionId) {
|
|
205
|
+
effects.push({
|
|
206
|
+
kind: "fetch",
|
|
207
|
+
token: refreshToken(state.target.renditionId),
|
|
208
|
+
url: state.target.url
|
|
209
|
+
});
|
|
210
|
+
inflight = state.target.renditionId;
|
|
211
|
+
}
|
|
212
|
+
for (const companion of state.companions) {
|
|
213
|
+
if (companion.ladder && state.round % LADDER_EVERY !== 0) continue;
|
|
214
|
+
effects.push({
|
|
215
|
+
kind: "fetch",
|
|
216
|
+
token: refreshToken(companion.renditionId),
|
|
217
|
+
url: companion.url
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
return [_objectSpread2(_objectSpread2({}, state), {}, {
|
|
221
|
+
round: state.round + 1,
|
|
222
|
+
tickPending: false,
|
|
223
|
+
inflight
|
|
224
|
+
}), effects];
|
|
225
|
+
}
|
|
226
|
+
if (msg.type === "SEGMENT_FAILED") {
|
|
227
|
+
const renditionId = renditionOfToken(msg.trackId);
|
|
228
|
+
if (renditionId === null) return [state, []];
|
|
229
|
+
if (state.target === null || renditionId !== state.target.renditionId) return [state, []];
|
|
230
|
+
if (state.tickPending) return [_objectSpread2(_objectSpread2({}, state), {}, { inflight: null }), []];
|
|
231
|
+
return [_objectSpread2(_objectSpread2({}, state), {}, {
|
|
232
|
+
inflight: null,
|
|
233
|
+
tickPending: true
|
|
234
|
+
}), [tick(2)]];
|
|
235
|
+
}
|
|
236
|
+
if (msg.type === "SEGMENT_LOADED") {
|
|
237
|
+
var _lastSegment$seq;
|
|
238
|
+
const renditionId = renditionOfToken(msg.trackId);
|
|
239
|
+
if (renditionId === null || kernel.presentation === null) return [state, []];
|
|
240
|
+
const isTarget = state.target !== null && renditionId === state.target.renditionId;
|
|
241
|
+
const url = playlistUrlFor(kernel.presentation, renditionId, state.target);
|
|
242
|
+
if (url === null) return [state, []];
|
|
243
|
+
const text = new TextDecoder().decode(msg.bytes);
|
|
244
|
+
const media = parseMediaPlaylist(text, url);
|
|
245
|
+
if (media.playlist === null) {
|
|
246
|
+
if (!isTarget) return [state, []];
|
|
247
|
+
if (state.tickPending) return [_objectSpread2(_objectSpread2({}, state), {}, { inflight: null }), []];
|
|
248
|
+
return [_objectSpread2(_objectSpread2({}, state), {}, {
|
|
249
|
+
inflight: null,
|
|
250
|
+
tickPending: true
|
|
251
|
+
}), [tick(2)]];
|
|
252
|
+
}
|
|
253
|
+
const refreshed = mergePlaylist(kernel.presentation, renditionId, media.playlist);
|
|
254
|
+
const effects = [feed({
|
|
255
|
+
type: "PLAYLIST_REFRESHED",
|
|
256
|
+
trackId: renditionId,
|
|
257
|
+
renditionId,
|
|
258
|
+
mediaSequence: media.playlist.mediaSequence,
|
|
259
|
+
segments: media.playlist.segments
|
|
260
|
+
}), feed({
|
|
261
|
+
type: "MANIFEST_LOADED",
|
|
262
|
+
presentation: refreshed
|
|
263
|
+
})];
|
|
264
|
+
if (!isTarget) return [state, effects];
|
|
265
|
+
const lastSegment = media.playlist.segments[media.playlist.segments.length - 1];
|
|
266
|
+
const endSeq = (_lastSegment$seq = lastSegment === null || lastSegment === void 0 ? void 0 : lastSegment.seq) !== null && _lastSegment$seq !== void 0 ? _lastSegment$seq : -1;
|
|
267
|
+
const changed = endSeq !== state.lastEndSeq;
|
|
268
|
+
const cadence = media.playlist.targetDuration || 4;
|
|
269
|
+
let tickPending = state.tickPending;
|
|
270
|
+
if (!media.playlist.endlist && !tickPending) {
|
|
271
|
+
effects.push(tick(changed ? cadence : cadence / 2));
|
|
272
|
+
tickPending = true;
|
|
273
|
+
}
|
|
274
|
+
return [_objectSpread2(_objectSpread2({}, state), {}, {
|
|
275
|
+
lastEndSeq: endSeq,
|
|
276
|
+
tickPending,
|
|
277
|
+
inflight: null,
|
|
278
|
+
awaitingTarget: false
|
|
279
|
+
}), effects];
|
|
280
|
+
}
|
|
281
|
+
return [state, []];
|
|
282
|
+
};
|
|
283
|
+
/** The stage factory. Requires hls-cmaf; the loader enforces it. */
|
|
284
|
+
function hlsLive() {
|
|
285
|
+
return {
|
|
286
|
+
name: "hls-live",
|
|
287
|
+
provides: ["hls-live"],
|
|
288
|
+
requires: ["hls-cmaf"],
|
|
289
|
+
install(ctx) {
|
|
290
|
+
ctx.reduce("hls-live", reduceHlsLive);
|
|
291
|
+
registerLiveNamespace(ctx);
|
|
292
|
+
}
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
//#endregion
|
|
296
|
+
export { hlsLive as default };
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
//#region src/protocols/live-shared.ts
|
|
2
|
+
/** How far behind the edge still counts as at it, in seconds. */
|
|
3
|
+
const AT_EDGE_SLACK = 2;
|
|
4
|
+
function registerLiveNamespace(ctx) {
|
|
5
|
+
const api = {
|
|
6
|
+
get edge() {
|
|
7
|
+
var _ctx$getState$live$ed, _ctx$getState$live;
|
|
8
|
+
return (_ctx$getState$live$ed = (_ctx$getState$live = ctx.getState().live) === null || _ctx$getState$live === void 0 ? void 0 : _ctx$getState$live.edge) !== null && _ctx$getState$live$ed !== void 0 ? _ctx$getState$live$ed : null;
|
|
9
|
+
},
|
|
10
|
+
get latency() {
|
|
11
|
+
const state = ctx.getState();
|
|
12
|
+
if (state.live === null) return null;
|
|
13
|
+
return state.live.span.end - state.playback.currentTime;
|
|
14
|
+
},
|
|
15
|
+
get atEdge() {
|
|
16
|
+
const state = ctx.getState();
|
|
17
|
+
if (state.live === null) return false;
|
|
18
|
+
return state.playback.currentTime >= state.live.edge - AT_EDGE_SLACK;
|
|
19
|
+
},
|
|
20
|
+
seekToEdge() {
|
|
21
|
+
ctx.dispatch({ type: "SEEK_TO_LIVE_EDGE" });
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
try {
|
|
25
|
+
ctx.registerNamespace("live", api);
|
|
26
|
+
} catch (_unused) {}
|
|
27
|
+
}
|
|
28
|
+
//#endregion
|
|
29
|
+
export { registerLiveNamespace };
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import _objectSpread2 from "../../_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/objectSpread2.js";
|
|
2
|
+
import { canSwitchTo } from "../../kernel/rendition-select.js";
|
|
3
|
+
//#region src/stages/abr/index.ts
|
|
4
|
+
/**
|
|
5
|
+
* Adaptive bitrate as a stage, not kernel. It registers one chooser
|
|
6
|
+
* consulted at arbitration step 5 and one constraint source for
|
|
7
|
+
* emergencies; it never mutates another source's constraints and playback
|
|
8
|
+
* works identically without it, at the lowest permitted rendition.
|
|
9
|
+
*
|
|
10
|
+
* The chooser is a pure function of its arguments: every input comes from
|
|
11
|
+
* kernel telemetry, so replaying a trace through the same composition
|
|
12
|
+
* reproduces every decision. The emergency path lives in a slice reducer
|
|
13
|
+
* for the same reason.
|
|
14
|
+
*/
|
|
15
|
+
const DEFAULTS = {
|
|
16
|
+
safetyFactor: .7,
|
|
17
|
+
upBufferSeconds: 8,
|
|
18
|
+
downBufferSeconds: 4,
|
|
19
|
+
emergencyFactor: .5,
|
|
20
|
+
recoveryFactor: 2
|
|
21
|
+
};
|
|
22
|
+
/** The conservative estimate: the minimum of the slow and fast EWMAs. */
|
|
23
|
+
function estimateBps(telemetry) {
|
|
24
|
+
var _telemetry$throughput;
|
|
25
|
+
const slow = telemetry.throughputEwma;
|
|
26
|
+
const fast = (_telemetry$throughput = telemetry.throughputFastEwma) !== null && _telemetry$throughput !== void 0 ? _telemetry$throughput : slow;
|
|
27
|
+
if (slow === 0) return fast;
|
|
28
|
+
if (fast === 0) return slow;
|
|
29
|
+
return Math.min(slow, fast);
|
|
30
|
+
}
|
|
31
|
+
function choose(allowed, telemetry, options) {
|
|
32
|
+
var _allowed$find, _telemetry$bufferAhea, _telemetry$canSwitchT;
|
|
33
|
+
const sorted = [...allowed].sort((a, b) => a.bitrate - b.bitrate);
|
|
34
|
+
const lowestRendition = sorted[0];
|
|
35
|
+
const current = (_allowed$find = allowed.find((r) => r.id === telemetry.current)) !== null && _allowed$find !== void 0 ? _allowed$find : null;
|
|
36
|
+
const estimate = estimateBps(telemetry);
|
|
37
|
+
if (estimate === 0) return (current !== null && current !== void 0 ? current : lowestRendition).id;
|
|
38
|
+
let best = lowestRendition;
|
|
39
|
+
for (const candidate of sorted) if (candidate.bitrate <= estimate * options.safetyFactor) best = candidate;
|
|
40
|
+
if (current === null) return best.id;
|
|
41
|
+
if (best.id === current.id) return current.id;
|
|
42
|
+
const buffer = (_telemetry$bufferAhea = telemetry.bufferAhead) !== null && _telemetry$bufferAhea !== void 0 ? _telemetry$bufferAhea : 0;
|
|
43
|
+
const policy = (_telemetry$canSwitchT = telemetry.canSwitchTo) !== null && _telemetry$canSwitchT !== void 0 ? _telemetry$canSwitchT : canSwitchTo;
|
|
44
|
+
if (best.bitrate > current.bitrate) {
|
|
45
|
+
if (buffer < options.upBufferSeconds) return current.id;
|
|
46
|
+
if (policy(current, best) === "reload") return current.id;
|
|
47
|
+
return best.id;
|
|
48
|
+
}
|
|
49
|
+
if (buffer < options.downBufferSeconds || current.bitrate > estimate) {
|
|
50
|
+
if (policy(current, best) === "reload") return current.id;
|
|
51
|
+
return best.id;
|
|
52
|
+
}
|
|
53
|
+
return current.id;
|
|
54
|
+
}
|
|
55
|
+
const INITIAL = { emergencyCap: null };
|
|
56
|
+
/** Loops a command back into the bus through a zero-delay schedule effect. */
|
|
57
|
+
function feed(message) {
|
|
58
|
+
return {
|
|
59
|
+
kind: "schedule",
|
|
60
|
+
token: "abr:emergency",
|
|
61
|
+
delayMs: 0,
|
|
62
|
+
then: message
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
function activeBitrate(kernel) {
|
|
66
|
+
if (kernel.presentation === null || kernel.quality.active === null) return null;
|
|
67
|
+
for (const period of kernel.presentation.periods) for (const track of period.tracks) for (const rendition of track.renditions) if (rendition.id === kernel.quality.active) return rendition.bitrate;
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
/** The track ABR steers: video where there is one, else audio. */
|
|
71
|
+
function leadTrack(kernel) {
|
|
72
|
+
var _kernel$tracks$active;
|
|
73
|
+
return (_kernel$tracks$active = kernel.tracks.active.get("video")) !== null && _kernel$tracks$active !== void 0 ? _kernel$tracks$active : kernel.tracks.active.get("audio");
|
|
74
|
+
}
|
|
75
|
+
function lowestBitrate(kernel) {
|
|
76
|
+
var _kernel$presentation$, _kernel$presentation;
|
|
77
|
+
let lowest = Number.POSITIVE_INFINITY;
|
|
78
|
+
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) {
|
|
79
|
+
if (track.contentType !== "video") continue;
|
|
80
|
+
for (const rendition of track.renditions) lowest = Math.min(lowest, rendition.bitrate);
|
|
81
|
+
}
|
|
82
|
+
return Number.isFinite(lowest) ? lowest : 0;
|
|
83
|
+
}
|
|
84
|
+
/** Samples smaller than this are jitter-dominated; ignore them for emergencies. */
|
|
85
|
+
const MIN_SAMPLE_BYTES = 1e4;
|
|
86
|
+
function createEmergencyReducer(options) {
|
|
87
|
+
return (slice, msg, kernel) => {
|
|
88
|
+
const state = slice !== null && slice !== void 0 ? slice : INITIAL;
|
|
89
|
+
if (msg.type === "UNLOAD" || msg.type === "DETACH") return [INITIAL, []];
|
|
90
|
+
let raw = null;
|
|
91
|
+
if (msg.type === "THROUGHPUT_SAMPLE") raw = msg.bps;
|
|
92
|
+
else if (msg.type === "SEGMENT_LOADED" && msg.seq >= 0 && msg.trackId === leadTrack(kernel) && msg.rtt > 0 && msg.size >= MIN_SAMPLE_BYTES) raw = msg.size * 8e3 / msg.rtt;
|
|
93
|
+
if (raw === null) return [state, []];
|
|
94
|
+
if (state.emergencyCap === null) {
|
|
95
|
+
const bitrate = activeBitrate(kernel);
|
|
96
|
+
if (bitrate === null || bitrate === 0) return [state, []];
|
|
97
|
+
if (raw >= bitrate * options.emergencyFactor) return [state, []];
|
|
98
|
+
const cap = Math.max(raw, lowestBitrate(kernel));
|
|
99
|
+
return [{ emergencyCap: cap }, [feed({
|
|
100
|
+
type: "CONSTRAIN",
|
|
101
|
+
source: "abr-emergency",
|
|
102
|
+
constraint: { maxBitrate: cap }
|
|
103
|
+
})]];
|
|
104
|
+
}
|
|
105
|
+
if (kernel.stats.throughputFastEwma >= state.emergencyCap * options.recoveryFactor) return [INITIAL, [feed({
|
|
106
|
+
type: "RELEASE_CONSTRAINT",
|
|
107
|
+
source: "abr-emergency"
|
|
108
|
+
})]];
|
|
109
|
+
return [state, []];
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
/** The stage factory. One chooser, one emergency constraint source. */
|
|
113
|
+
function abr(options) {
|
|
114
|
+
const resolved = _objectSpread2(_objectSpread2({}, DEFAULTS), options);
|
|
115
|
+
return {
|
|
116
|
+
name: "abr",
|
|
117
|
+
provides: ["abr"],
|
|
118
|
+
requires: ["scheduler", "track-registry"],
|
|
119
|
+
install(ctx) {
|
|
120
|
+
ctx.registerChooser({ choose: (allowed, telemetry) => choose(allowed, telemetry, resolved) });
|
|
121
|
+
ctx.reduce("abr", createEmergencyReducer(resolved));
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
//#endregion
|
|
126
|
+
export { abr as default };
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
//#region src/stages/abr-cap-size/index.ts
|
|
2
|
+
function abrCapSize() {
|
|
3
|
+
return {
|
|
4
|
+
name: "abr-cap-size",
|
|
5
|
+
requires: ["rendition-select"],
|
|
6
|
+
install(ctx) {
|
|
7
|
+
const observer = new ResizeObserver(([entry]) => {
|
|
8
|
+
if (entry === void 0) return;
|
|
9
|
+
const dpr = Math.min(globalThis.devicePixelRatio || 1, 2);
|
|
10
|
+
ctx.dispatch({
|
|
11
|
+
type: "CONSTRAIN",
|
|
12
|
+
source: "element-size",
|
|
13
|
+
constraint: { maxHeight: entry.contentRect.height * dpr }
|
|
14
|
+
});
|
|
15
|
+
});
|
|
16
|
+
observer.observe(ctx.element);
|
|
17
|
+
return () => observer.disconnect();
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
//#endregion
|
|
22
|
+
export { abrCapSize as default };
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import _objectSpread2 from "../../_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/objectSpread2.js";
|
|
2
|
+
//#region src/stages/abr-persist/index.ts
|
|
3
|
+
const INITIAL = {
|
|
4
|
+
seeded: false,
|
|
5
|
+
lastSaved: 0
|
|
6
|
+
};
|
|
7
|
+
const SAVE_EVENT = "abr-persist:save";
|
|
8
|
+
/** Relative drift that triggers a save. */
|
|
9
|
+
const DRIFT = .2;
|
|
10
|
+
function abrPersist(storage) {
|
|
11
|
+
return {
|
|
12
|
+
name: "abr-persist",
|
|
13
|
+
requires: ["abr"],
|
|
14
|
+
install(ctx) {
|
|
15
|
+
const remembered = storage.get();
|
|
16
|
+
const reduce = (slice, msg, kernel) => {
|
|
17
|
+
const state = slice !== null && slice !== void 0 ? slice : INITIAL;
|
|
18
|
+
if (msg.type === "LOAD" && !state.seeded && remembered !== null && remembered > 0) {
|
|
19
|
+
const effects = [{
|
|
20
|
+
kind: "schedule",
|
|
21
|
+
token: "abr-persist:seed",
|
|
22
|
+
delayMs: 0,
|
|
23
|
+
then: {
|
|
24
|
+
type: "THROUGHPUT_SAMPLE",
|
|
25
|
+
bps: remembered,
|
|
26
|
+
trackId: "abr-persist"
|
|
27
|
+
}
|
|
28
|
+
}];
|
|
29
|
+
return [_objectSpread2(_objectSpread2({}, state), {}, {
|
|
30
|
+
seeded: true,
|
|
31
|
+
lastSaved: remembered
|
|
32
|
+
}), effects];
|
|
33
|
+
}
|
|
34
|
+
if (msg.type === "SEGMENT_LOADED") {
|
|
35
|
+
const current = kernel.stats.throughputEwma;
|
|
36
|
+
if (current > 0 && Math.abs(current - state.lastSaved) > state.lastSaved * DRIFT) return [_objectSpread2(_objectSpread2({}, state), {}, { lastSaved: current }), [{
|
|
37
|
+
kind: "emit",
|
|
38
|
+
event: SAVE_EVENT,
|
|
39
|
+
payload: current
|
|
40
|
+
}]];
|
|
41
|
+
}
|
|
42
|
+
return [state, []];
|
|
43
|
+
};
|
|
44
|
+
ctx.reduce("abr-persist", reduce);
|
|
45
|
+
return ctx.on(SAVE_EVENT, (bps) => {
|
|
46
|
+
if (typeof bps === "number") storage.set(Math.round(bps));
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
//#endregion
|
|
52
|
+
export { abrPersist as default };
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import _asyncToGenerator from "../../_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/asyncToGenerator.js";
|
|
2
|
+
//#region src/stages/aes-128/index.ts
|
|
3
|
+
/** Before the transmux (100) and the codec probe (5), which must read clear bytes. */
|
|
4
|
+
const DECRYPT_ORDER = 1;
|
|
5
|
+
/** The 16-byte IV: the explicit hex one, or the sequence number big-endian. */
|
|
6
|
+
function ivFor(key, seq) {
|
|
7
|
+
const iv = /* @__PURE__ */ new Uint8Array(16);
|
|
8
|
+
if (key.iv !== void 0) {
|
|
9
|
+
const hex = key.iv.slice(-32).padStart(32, "0");
|
|
10
|
+
for (let i = 0; i < 16; i += 1) iv[i] = Number.parseInt(hex.slice(i * 2, i * 2 + 2), 16);
|
|
11
|
+
return iv;
|
|
12
|
+
}
|
|
13
|
+
const view = new DataView(iv.buffer);
|
|
14
|
+
view.setUint32(8, Math.floor(seq / Math.pow(2, 32)));
|
|
15
|
+
view.setUint32(12, seq >>> 0);
|
|
16
|
+
return iv;
|
|
17
|
+
}
|
|
18
|
+
function findSegment(state, renditionId, seq) {
|
|
19
|
+
if (state.presentation === null || renditionId === "") return null;
|
|
20
|
+
for (const period of state.presentation.periods) for (const track of period.tracks) for (const rendition of track.renditions) {
|
|
21
|
+
var _rendition$segments$f;
|
|
22
|
+
if (rendition.id !== renditionId || !Array.isArray(rendition.segments)) continue;
|
|
23
|
+
return (_rendition$segments$f = rendition.segments.find((segment) => segment.seq === seq)) !== null && _rendition$segments$f !== void 0 ? _rendition$segments$f : null;
|
|
24
|
+
}
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
function aes128() {
|
|
28
|
+
return {
|
|
29
|
+
name: "aes-128",
|
|
30
|
+
provides: ["aes-128", "media-transform"],
|
|
31
|
+
install(ctx) {
|
|
32
|
+
const keys = /* @__PURE__ */ new Map();
|
|
33
|
+
function keyFor(uri) {
|
|
34
|
+
let pending = keys.get(uri);
|
|
35
|
+
if (pending === void 0) {
|
|
36
|
+
pending = ctx.request(uri, {}).then(function() {
|
|
37
|
+
var _ref = _asyncToGenerator(function* (response) {
|
|
38
|
+
if (!response.ok) throw new Error(`key fetch failed: HTTP ${response.status}`);
|
|
39
|
+
const raw = yield response.arrayBuffer();
|
|
40
|
+
if (raw.byteLength !== 16) throw new Error(`key is ${raw.byteLength} bytes, not 16`);
|
|
41
|
+
return crypto.subtle.importKey("raw", raw, { name: "AES-CBC" }, false, ["decrypt"]);
|
|
42
|
+
});
|
|
43
|
+
return function(_x) {
|
|
44
|
+
return _ref.apply(this, arguments);
|
|
45
|
+
};
|
|
46
|
+
}()).catch((err) => {
|
|
47
|
+
keys.delete(uri);
|
|
48
|
+
throw err;
|
|
49
|
+
});
|
|
50
|
+
keys.set(uri, pending);
|
|
51
|
+
}
|
|
52
|
+
return pending;
|
|
53
|
+
}
|
|
54
|
+
ctx.registerTransform({
|
|
55
|
+
name: "aes-128",
|
|
56
|
+
order: DECRYPT_ORDER,
|
|
57
|
+
transform(data, meta) {
|
|
58
|
+
return _asyncToGenerator(function* () {
|
|
59
|
+
const segment = findSegment(ctx.getState(), meta.renditionId, meta.seq);
|
|
60
|
+
const key = segment === null || segment === void 0 ? void 0 : segment.key;
|
|
61
|
+
if (key === void 0) return data;
|
|
62
|
+
const cryptoKey = yield keyFor(key.uri);
|
|
63
|
+
const clear = yield crypto.subtle.decrypt({
|
|
64
|
+
name: "AES-CBC",
|
|
65
|
+
iv: ivFor(key, meta.seq)
|
|
66
|
+
}, cryptoKey, data);
|
|
67
|
+
return new Uint8Array(clear);
|
|
68
|
+
})();
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
return () => keys.clear();
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
//#endregion
|
|
76
|
+
export { aes128 as default, ivFor };
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
//#region src/stages/alt-audio/index.ts
|
|
2
|
+
const INITIAL = { preferredLang: null };
|
|
3
|
+
/** Audio tracks with their group parsed from the `group:name` id convention. */
|
|
4
|
+
function audioTracks(kernel) {
|
|
5
|
+
var _kernel$presentation$, _kernel$presentation;
|
|
6
|
+
const out = [];
|
|
7
|
+
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) {
|
|
8
|
+
var _track$lang;
|
|
9
|
+
if (track.contentType !== "audio") continue;
|
|
10
|
+
const colon = track.id.indexOf(":");
|
|
11
|
+
out.push({
|
|
12
|
+
id: track.id,
|
|
13
|
+
group: colon === -1 ? track.id : track.id.slice(0, colon),
|
|
14
|
+
lang: (_track$lang = track.lang) !== null && _track$lang !== void 0 ? _track$lang : null,
|
|
15
|
+
isDefault: track.role === "main"
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
return out;
|
|
19
|
+
}
|
|
20
|
+
/** The audio group the active video rendition's coupling requires, or null. */
|
|
21
|
+
function requiredGroup(kernel) {
|
|
22
|
+
var _kernel$presentation2, _coupling$requires$au;
|
|
23
|
+
const activeVideo = kernel.quality.active;
|
|
24
|
+
if (activeVideo === null) return null;
|
|
25
|
+
const coupling = (_kernel$presentation2 = kernel.presentation) === null || _kernel$presentation2 === void 0 ? void 0 : _kernel$presentation2.couplings.find((c) => c.renditionId === activeVideo);
|
|
26
|
+
return (_coupling$requires$au = coupling === null || coupling === void 0 ? void 0 : coupling.requires.audio) !== null && _coupling$requires$au !== void 0 ? _coupling$requires$au : null;
|
|
27
|
+
}
|
|
28
|
+
/** Picks the audio track in `group`, preferring a language, then default, then first. */
|
|
29
|
+
function pickInGroup(tracks, group, preferredLang) {
|
|
30
|
+
var _ref, _ref2;
|
|
31
|
+
const inGroup = tracks.filter((t) => t.group === group);
|
|
32
|
+
if (inGroup.length === 0) return null;
|
|
33
|
+
return (_ref = (_ref2 = preferredLang !== null ? inGroup.find((t) => t.lang === preferredLang) : void 0) !== null && _ref2 !== void 0 ? _ref2 : inGroup.find((t) => t.isDefault)) !== null && _ref !== void 0 ? _ref : inGroup[0];
|
|
34
|
+
}
|
|
35
|
+
/** Loops a command back into the bus through a zero-delay schedule effect. */
|
|
36
|
+
function select(trackId) {
|
|
37
|
+
return {
|
|
38
|
+
kind: "schedule",
|
|
39
|
+
token: "alt-audio:select",
|
|
40
|
+
delayMs: 0,
|
|
41
|
+
then: {
|
|
42
|
+
type: "SELECT_TRACK",
|
|
43
|
+
trackId
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
const reduceAltAudio = (slice, msg, kernel) => {
|
|
48
|
+
const state = slice !== null && slice !== void 0 ? slice : INITIAL;
|
|
49
|
+
if (msg.type === "LOAD" || msg.type === "UNLOAD" || msg.type === "DETACH") return [INITIAL, []];
|
|
50
|
+
if (msg.type === "SELECT_TRACK") {
|
|
51
|
+
const chosen = audioTracks(kernel).find((t) => t.id === msg.trackId);
|
|
52
|
+
if ((chosen === null || chosen === void 0 ? void 0 : chosen.lang) != null) return [{ preferredLang: chosen.lang }, []];
|
|
53
|
+
return [state, []];
|
|
54
|
+
}
|
|
55
|
+
if (msg.type === "MANIFEST_LOADED" || msg.type === "SEGMENT_LOADED") {
|
|
56
|
+
const group = requiredGroup(kernel);
|
|
57
|
+
if (group === null) return [state, []];
|
|
58
|
+
const active = kernel.tracks.active.get("audio");
|
|
59
|
+
const tracks = audioTracks(kernel);
|
|
60
|
+
const activeInfo = tracks.find((t) => t.id === active);
|
|
61
|
+
if (activeInfo !== void 0 && activeInfo.group === group) return [state, []];
|
|
62
|
+
const target = pickInGroup(tracks, group, state.preferredLang);
|
|
63
|
+
if (target === void 0 || target === null || target.id === active) return [state, []];
|
|
64
|
+
return [state, [select(target.id)]];
|
|
65
|
+
}
|
|
66
|
+
return [state, []];
|
|
67
|
+
};
|
|
68
|
+
/** The stage factory. */
|
|
69
|
+
function altAudio() {
|
|
70
|
+
return {
|
|
71
|
+
name: "alt-audio",
|
|
72
|
+
provides: ["alt-audio"],
|
|
73
|
+
requires: ["scheduler", "codec-switch"],
|
|
74
|
+
install(ctx) {
|
|
75
|
+
ctx.reduce("alt-audio", reduceAltAudio);
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
//#endregion
|
|
80
|
+
export { altAudio as default };
|