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,263 @@
|
|
|
1
|
+
import _objectSpread2 from "../_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/objectSpread2.js";
|
|
2
|
+
import { segmentAtTime } from "./timeline.js";
|
|
3
|
+
import { bufferedEndFrom } from "./scheduler.js";
|
|
4
|
+
//#region src/kernel/rendition-select.ts
|
|
5
|
+
/** The lead time before which a `soon` switch never disturbs the buffer. */
|
|
6
|
+
const SOON_LEAD_SECONDS = 1.5;
|
|
7
|
+
const GAP_TOLERANCE = .25;
|
|
8
|
+
function matches(rendition, constraint) {
|
|
9
|
+
var _rendition$height, _rendition$width, _rendition$frameRate, _constraint$excludeId;
|
|
10
|
+
if (constraint.maxHeight !== void 0 && ((_rendition$height = rendition.height) !== null && _rendition$height !== void 0 ? _rendition$height : 0) > constraint.maxHeight) return false;
|
|
11
|
+
if (constraint.maxWidth !== void 0 && ((_rendition$width = rendition.width) !== null && _rendition$width !== void 0 ? _rendition$width : 0) > constraint.maxWidth) return false;
|
|
12
|
+
if (constraint.maxBitrate !== void 0 && rendition.bitrate > constraint.maxBitrate) return false;
|
|
13
|
+
if (constraint.minBitrate !== void 0 && rendition.bitrate < constraint.minBitrate) return false;
|
|
14
|
+
if (constraint.maxFrameRate !== void 0 && ((_rendition$frameRate = rendition.frameRate) !== null && _rendition$frameRate !== void 0 ? _rendition$frameRate : 0) > constraint.maxFrameRate) return false;
|
|
15
|
+
if ((_constraint$excludeId = constraint.excludeIds) === null || _constraint$excludeId === void 0 ? void 0 : _constraint$excludeId.includes(rendition.id)) return false;
|
|
16
|
+
if (constraint.codecs !== void 0) {
|
|
17
|
+
const codec = rendition.codecs;
|
|
18
|
+
if (codec === null || !constraint.codecs.some((allowed) => codec.startsWith(allowed))) return false;
|
|
19
|
+
}
|
|
20
|
+
if (constraint.filter !== void 0 && !constraint.filter(rendition)) return false;
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
function intersect(renditions, constraints) {
|
|
24
|
+
return renditions.filter((rendition) => constraints.every(([, c]) => matches(rendition, c)));
|
|
25
|
+
}
|
|
26
|
+
function closestByBitrate(allowed, target) {
|
|
27
|
+
let best = allowed[0];
|
|
28
|
+
for (const candidate of allowed) if (Math.abs(candidate.bitrate - target.bitrate) < Math.abs(best.bitrate - target.bitrate)) best = candidate;
|
|
29
|
+
return best;
|
|
30
|
+
}
|
|
31
|
+
function lowest(allowed) {
|
|
32
|
+
let best = allowed[0];
|
|
33
|
+
for (const candidate of allowed) if (candidate.bitrate < best.bitrate) best = candidate;
|
|
34
|
+
return best;
|
|
35
|
+
}
|
|
36
|
+
/** The strict arbitration order from docs/08. Never deviate; never return zero renditions. */
|
|
37
|
+
function arbitrate(ctx) {
|
|
38
|
+
const events = [];
|
|
39
|
+
if (ctx.renditions.length === 0) return {
|
|
40
|
+
result: {
|
|
41
|
+
allowed: [],
|
|
42
|
+
droppedConstraints: [],
|
|
43
|
+
selected: null,
|
|
44
|
+
reason: "lowest-permitted"
|
|
45
|
+
},
|
|
46
|
+
events
|
|
47
|
+
};
|
|
48
|
+
let active = [...ctx.constraints.entries()];
|
|
49
|
+
let allowed = intersect(ctx.renditions, active);
|
|
50
|
+
const dropped = [];
|
|
51
|
+
while (allowed.length === 0 && active.length > 0) {
|
|
52
|
+
const droppedEntry = active[active.length - 1];
|
|
53
|
+
dropped.push(droppedEntry[0]);
|
|
54
|
+
active = active.slice(0, -1);
|
|
55
|
+
allowed = intersect(ctx.renditions, active);
|
|
56
|
+
}
|
|
57
|
+
if (dropped.length > 0) events.push({
|
|
58
|
+
kind: "emit",
|
|
59
|
+
event: "quality:constraints-unsatisfiable",
|
|
60
|
+
payload: { dropped }
|
|
61
|
+
});
|
|
62
|
+
const coupled = allowed.filter((rendition) => {
|
|
63
|
+
const coupling = ctx.couplings.find((c) => c.renditionId === rendition.id);
|
|
64
|
+
if (coupling === void 0) return true;
|
|
65
|
+
for (const [contentType, requiredTrack] of Object.entries(coupling.requires)) {
|
|
66
|
+
var _ctx$availableGroups, _ctx$availableGroups2;
|
|
67
|
+
const activeTrack = ctx.activeTracks.get(contentType);
|
|
68
|
+
const matchesActive = activeTrack === requiredTrack || (activeTrack === null || activeTrack === void 0 ? void 0 : activeTrack.startsWith(`${requiredTrack}:`)) === true;
|
|
69
|
+
if (activeTrack === void 0 || matchesActive) continue;
|
|
70
|
+
if (!(((_ctx$availableGroups = ctx.availableGroups) === null || _ctx$availableGroups === void 0 ? void 0 : _ctx$availableGroups.has(`${contentType}:${requiredTrack}`)) === true || ((_ctx$availableGroups2 = ctx.availableGroups) === null || _ctx$availableGroups2 === void 0 ? void 0 : _ctx$availableGroups2.has(requiredTrack)) === true)) return false;
|
|
71
|
+
}
|
|
72
|
+
return true;
|
|
73
|
+
});
|
|
74
|
+
if (coupled.length > 0) allowed = coupled;
|
|
75
|
+
else events.push({
|
|
76
|
+
kind: "emit",
|
|
77
|
+
event: "quality:coupling-unsatisfiable",
|
|
78
|
+
payload: { active: Object.fromEntries(ctx.activeTracks) }
|
|
79
|
+
});
|
|
80
|
+
const allowedIds = allowed.map((r) => r.id);
|
|
81
|
+
if (ctx.pinned !== null) {
|
|
82
|
+
if (allowedIds.includes(ctx.pinned)) return {
|
|
83
|
+
result: {
|
|
84
|
+
allowed: allowedIds,
|
|
85
|
+
droppedConstraints: dropped,
|
|
86
|
+
selected: ctx.pinned,
|
|
87
|
+
reason: "pin"
|
|
88
|
+
},
|
|
89
|
+
events
|
|
90
|
+
};
|
|
91
|
+
const target = ctx.renditions.find((r) => r.id === ctx.pinned);
|
|
92
|
+
if (target !== void 0) {
|
|
93
|
+
const clamped = closestByBitrate(allowed, target);
|
|
94
|
+
events.push({
|
|
95
|
+
kind: "emit",
|
|
96
|
+
event: "quality:pin-unsatisfiable",
|
|
97
|
+
payload: {
|
|
98
|
+
pinned: ctx.pinned,
|
|
99
|
+
resolved: clamped.id
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
return {
|
|
103
|
+
result: {
|
|
104
|
+
allowed: allowedIds,
|
|
105
|
+
droppedConstraints: dropped,
|
|
106
|
+
selected: clamped.id,
|
|
107
|
+
reason: "pin"
|
|
108
|
+
},
|
|
109
|
+
events
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
if (ctx.abr != null) {
|
|
114
|
+
const choice = ctx.abr.choose(allowed, ctx.telemetry);
|
|
115
|
+
if (allowedIds.includes(choice)) return {
|
|
116
|
+
result: {
|
|
117
|
+
allowed: allowedIds,
|
|
118
|
+
droppedConstraints: dropped,
|
|
119
|
+
selected: choice,
|
|
120
|
+
reason: "abr"
|
|
121
|
+
},
|
|
122
|
+
events
|
|
123
|
+
};
|
|
124
|
+
events.push({
|
|
125
|
+
kind: "emit",
|
|
126
|
+
event: "quality:abr-invalid",
|
|
127
|
+
payload: {
|
|
128
|
+
choice,
|
|
129
|
+
allowed: allowedIds
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
if (ctx.current !== null && allowedIds.includes(ctx.current)) return {
|
|
134
|
+
result: {
|
|
135
|
+
allowed: allowedIds,
|
|
136
|
+
droppedConstraints: dropped,
|
|
137
|
+
selected: ctx.current,
|
|
138
|
+
reason: "unchanged"
|
|
139
|
+
},
|
|
140
|
+
events
|
|
141
|
+
};
|
|
142
|
+
return {
|
|
143
|
+
result: {
|
|
144
|
+
allowed: allowedIds,
|
|
145
|
+
droppedConstraints: dropped,
|
|
146
|
+
selected: lowest(allowed).id,
|
|
147
|
+
reason: "lowest-permitted"
|
|
148
|
+
},
|
|
149
|
+
events
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
function createArbiter() {
|
|
153
|
+
let lastVersion = NaN;
|
|
154
|
+
let lastOutcome = null;
|
|
155
|
+
let lastPlaying = null;
|
|
156
|
+
return {
|
|
157
|
+
run(ctx, version) {
|
|
158
|
+
if (lastOutcome !== null && version === lastVersion) return _objectSpread2(_objectSpread2({}, lastOutcome), {}, { computed: false });
|
|
159
|
+
lastOutcome = arbitrate(ctx);
|
|
160
|
+
lastVersion = version;
|
|
161
|
+
lastPlaying = null;
|
|
162
|
+
return _objectSpread2(_objectSpread2({}, lastOutcome), {}, { computed: true });
|
|
163
|
+
},
|
|
164
|
+
playingAt(log, currentTime) {
|
|
165
|
+
var _found, _found$rendition;
|
|
166
|
+
if (lastPlaying !== null && currentTime >= lastPlaying.start && currentTime < lastPlaying.end) return lastPlaying.rendition;
|
|
167
|
+
let found = null;
|
|
168
|
+
for (const [range, renditionId] of log) if (range.start <= currentTime && currentTime < range.end) found = {
|
|
169
|
+
rendition: renditionId,
|
|
170
|
+
start: range.start,
|
|
171
|
+
end: range.end
|
|
172
|
+
};
|
|
173
|
+
lastPlaying = (_found = found) !== null && _found !== void 0 ? _found : {
|
|
174
|
+
rendition: null,
|
|
175
|
+
start: currentTime,
|
|
176
|
+
end: currentTime
|
|
177
|
+
};
|
|
178
|
+
return (_found$rendition = found === null || found === void 0 ? void 0 : found.rendition) !== null && _found$rendition !== void 0 ? _found$rendition : null;
|
|
179
|
+
}
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
/** The four-character sample entry a codec string names, before any profile suffix. */
|
|
183
|
+
function codecFamily(codecs) {
|
|
184
|
+
var _codecs$split$0$trim, _codecs$split$;
|
|
185
|
+
if (codecs === null) return null;
|
|
186
|
+
const first = (_codecs$split$0$trim = (_codecs$split$ = codecs.split(",")[0]) === null || _codecs$split$ === void 0 ? void 0 : _codecs$split$.trim()) !== null && _codecs$split$0$trim !== void 0 ? _codecs$split$0$trim : "";
|
|
187
|
+
const dot = first.indexOf(".");
|
|
188
|
+
return dot === -1 ? first : first.slice(0, dot);
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* The kernel's default answer to entanglement #2. codec-switch refines it
|
|
192
|
+
* with real compatibility knowledge (Stage 15); until then: identical codec
|
|
193
|
+
* strings are seamless, a profile or level change inside one family is a
|
|
194
|
+
* changeType-class switch (every ladder rung carries its own profile
|
|
195
|
+
* string, so abr could never move under an identity rule), and a family
|
|
196
|
+
* change reloads.
|
|
197
|
+
*/
|
|
198
|
+
function canSwitchTo(current, target) {
|
|
199
|
+
if (current === null) return "seamless";
|
|
200
|
+
if (current.codecs !== null && current.codecs === target.codecs) return "seamless";
|
|
201
|
+
const family = codecFamily(current.codecs);
|
|
202
|
+
if (family !== null && family === codecFamily(target.codecs)) return "changeType";
|
|
203
|
+
return "reload";
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* The apply strategies from docs/08. `next` costs nothing and waits out
|
|
207
|
+
* the buffer. `soon` flushes from the next segment boundary after
|
|
208
|
+
* currentTime plus a lead, so the switch is usually invisible. `now` pays
|
|
209
|
+
* a visible stall for immediacy.
|
|
210
|
+
*
|
|
211
|
+
* The plan never fetches. Flushing shrinks the buffered ranges, the
|
|
212
|
+
* updateend fact drives the scheduling loop, and the loop refills from the
|
|
213
|
+
* flush point with the init-before-media ordering a direct fetch here
|
|
214
|
+
* would bypass. A pin to a rendition whose playlist is not merged yet
|
|
215
|
+
* flushes the same way and refills once the playlist lands.
|
|
216
|
+
*/
|
|
217
|
+
function planPinApply(input) {
|
|
218
|
+
if (input.strategy === "next") return {
|
|
219
|
+
effects: [],
|
|
220
|
+
requests: [],
|
|
221
|
+
tokenSeq: input.tokenSeq
|
|
222
|
+
};
|
|
223
|
+
const effects = input.inflightTokens.map((token) => ({
|
|
224
|
+
kind: "abort",
|
|
225
|
+
token
|
|
226
|
+
}));
|
|
227
|
+
if (input.strategy === "soon") {
|
|
228
|
+
const bufferedEnd = bufferedEndFrom(input.ranges, input.currentTime, GAP_TOLERANCE);
|
|
229
|
+
const lead = input.currentTime + SOON_LEAD_SECONDS;
|
|
230
|
+
if (bufferedEnd > lead) {
|
|
231
|
+
const boundarySegment = segmentAtTime(input.rendition.segments, lead, input.period.start);
|
|
232
|
+
const safePoint = boundarySegment === null ? lead : boundarySegment.start > lead ? boundarySegment.start : boundarySegment.start + boundarySegment.duration;
|
|
233
|
+
effects.push({
|
|
234
|
+
kind: "remove",
|
|
235
|
+
sbId: input.sbId,
|
|
236
|
+
start: safePoint,
|
|
237
|
+
end: Infinity
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
return {
|
|
241
|
+
effects,
|
|
242
|
+
requests: [],
|
|
243
|
+
tokenSeq: input.tokenSeq
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
effects.push({
|
|
247
|
+
kind: "remove",
|
|
248
|
+
sbId: input.sbId,
|
|
249
|
+
start: input.currentTime,
|
|
250
|
+
end: Infinity
|
|
251
|
+
});
|
|
252
|
+
effects.push({
|
|
253
|
+
kind: "seekElement",
|
|
254
|
+
to: input.currentTime
|
|
255
|
+
});
|
|
256
|
+
return {
|
|
257
|
+
effects,
|
|
258
|
+
requests: [],
|
|
259
|
+
tokenSeq: input.tokenSeq
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
//#endregion
|
|
263
|
+
export { arbitrate, canSwitchTo, codecFamily, createArbiter, planPinApply };
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import _objectSpread2 from "../_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/objectSpread2.js";
|
|
2
|
+
import { buildEpochs, epochForSeq, segmentAtTime, timestampOffsetFor } from "./timeline.js";
|
|
3
|
+
//#region src/kernel/scheduler.ts
|
|
4
|
+
const DEFAULT_GAP_TOLERANCE = .25;
|
|
5
|
+
/**
|
|
6
|
+
* The end of continuous buffer from `time`, merging gaps below the
|
|
7
|
+
* tolerance. Returns `time` itself when nothing is buffered there.
|
|
8
|
+
*/
|
|
9
|
+
function bufferedEndFrom(ranges, time, tolerance) {
|
|
10
|
+
let end = time;
|
|
11
|
+
let advanced = true;
|
|
12
|
+
while (advanced) {
|
|
13
|
+
advanced = false;
|
|
14
|
+
for (const range of ranges) if (range.start <= end + tolerance && range.end > end) {
|
|
15
|
+
end = range.end;
|
|
16
|
+
advanced = true;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return end;
|
|
20
|
+
}
|
|
21
|
+
/** The buffered range holding the segment's midpoint, the sign it was appended, or null. */
|
|
22
|
+
function coveringMidpoint(ranges, segment) {
|
|
23
|
+
var _ranges$find;
|
|
24
|
+
const mid = segment.start + segment.duration / 2;
|
|
25
|
+
return (_ranges$find = ranges.find((range) => range.start <= mid && range.end > mid)) !== null && _ranges$find !== void 0 ? _ranges$find : null;
|
|
26
|
+
}
|
|
27
|
+
function schedule(input) {
|
|
28
|
+
var _input$gapToleranceSe;
|
|
29
|
+
const tolerance = (_input$gapToleranceSe = input.gapToleranceSeconds) !== null && _input$gapToleranceSe !== void 0 ? _input$gapToleranceSe : DEFAULT_GAP_TOLERANCE;
|
|
30
|
+
const effects = [];
|
|
31
|
+
const requests = [];
|
|
32
|
+
let tokenSeq = input.tokenSeq;
|
|
33
|
+
for (const track of input.tracks) {
|
|
34
|
+
if (track.inflight.length > 0) continue;
|
|
35
|
+
const bufferedEnd = bufferedEndFrom(track.ranges, input.currentTime, tolerance);
|
|
36
|
+
if (bufferedEnd - input.currentTime >= input.bufferGoal) continue;
|
|
37
|
+
let target = Math.max(bufferedEnd, input.currentTime);
|
|
38
|
+
if (input.liveWindow != null && target < input.liveWindow.start) target = input.liveWindow.start;
|
|
39
|
+
let segment = segmentAtTime(track.rendition.segments, target + tolerance, track.period.start);
|
|
40
|
+
let frontier = bufferedEnd;
|
|
41
|
+
while (segment !== null) {
|
|
42
|
+
const covering = coveringMidpoint(track.ranges, segment);
|
|
43
|
+
if (covering === null) break;
|
|
44
|
+
frontier = Math.max(frontier, covering.end);
|
|
45
|
+
if (frontier - input.currentTime >= input.bufferGoal) {
|
|
46
|
+
segment = null;
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
segment = segmentAtTime(track.rendition.segments, segment.start + segment.duration + tolerance, track.period.start);
|
|
50
|
+
}
|
|
51
|
+
if (segment === null) continue;
|
|
52
|
+
if (input.liveWindow != null && segment.start + segment.duration > input.liveWindow.end) continue;
|
|
53
|
+
const epochs = buildEpochs([{
|
|
54
|
+
period: track.period,
|
|
55
|
+
rendition: track.rendition
|
|
56
|
+
}]);
|
|
57
|
+
const epoch = epochForSeq(epochs, segment.seq);
|
|
58
|
+
tokenSeq += 1;
|
|
59
|
+
const token = `t${tokenSeq}:${track.trackId}:${segment.seq}`;
|
|
60
|
+
effects.push(_objectSpread2({
|
|
61
|
+
kind: "fetch",
|
|
62
|
+
token,
|
|
63
|
+
url: segment.url
|
|
64
|
+
}, segment.byteRange !== void 0 ? { range: segment.byteRange } : {}));
|
|
65
|
+
requests.push(_objectSpread2(_objectSpread2({
|
|
66
|
+
token,
|
|
67
|
+
trackId: track.trackId,
|
|
68
|
+
seq: segment.seq,
|
|
69
|
+
url: segment.url,
|
|
70
|
+
renditionId: track.rendition.id,
|
|
71
|
+
segmentStart: segment.start,
|
|
72
|
+
segmentDuration: segment.duration
|
|
73
|
+
}, track.sbId !== void 0 ? { sbId: track.sbId } : {}), input.mediaTimeNormalized === true ? { timestampOffset: 0 } : epoch !== null ? { timestampOffset: timestampOffsetFor(epoch) } : {}));
|
|
74
|
+
}
|
|
75
|
+
return {
|
|
76
|
+
effects,
|
|
77
|
+
requests,
|
|
78
|
+
tokenSeq
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
//#endregion
|
|
82
|
+
export { bufferedEndFrom, schedule };
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
//#region src/kernel/sinks/mse-sink.ts
|
|
2
|
+
/** The sbId naming convention: one SourceBuffer per media content type. */
|
|
3
|
+
function sbIdFor(contentType) {
|
|
4
|
+
return `sb:${contentType}`;
|
|
5
|
+
}
|
|
6
|
+
function createMseSink(contentType, deps) {
|
|
7
|
+
const sbId = sbIdFor(contentType);
|
|
8
|
+
return {
|
|
9
|
+
contentType,
|
|
10
|
+
accept(_trackId, data) {
|
|
11
|
+
return [{
|
|
12
|
+
kind: "append",
|
|
13
|
+
sbId,
|
|
14
|
+
data
|
|
15
|
+
}];
|
|
16
|
+
},
|
|
17
|
+
ranges(_trackId) {
|
|
18
|
+
return deps.buffered(sbId);
|
|
19
|
+
},
|
|
20
|
+
clear(_trackId, start, end) {
|
|
21
|
+
return [{
|
|
22
|
+
kind: "remove",
|
|
23
|
+
sbId,
|
|
24
|
+
start,
|
|
25
|
+
end
|
|
26
|
+
}];
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
//#endregion
|
|
31
|
+
export { createMseSink, sbIdFor };
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
//#region src/kernel/sinks/text-track-sink.ts
|
|
2
|
+
/** Applies the WebVTT settings string's known keys onto a native cue. */
|
|
3
|
+
function applySettings(cue, settings) {
|
|
4
|
+
if (settings === void 0) return;
|
|
5
|
+
for (const part of settings.split(/\s+/)) {
|
|
6
|
+
const [key, value] = part.split(":");
|
|
7
|
+
if (value === void 0) continue;
|
|
8
|
+
const percent = value.endsWith("%") ? Number(value.slice(0, -1)) : null;
|
|
9
|
+
switch (key) {
|
|
10
|
+
case "line":
|
|
11
|
+
cue.line = percent !== null && percent !== void 0 ? percent : Number(value);
|
|
12
|
+
if (percent !== null) cue.snapToLines = false;
|
|
13
|
+
break;
|
|
14
|
+
case "position":
|
|
15
|
+
if (percent !== null) cue.position = percent;
|
|
16
|
+
break;
|
|
17
|
+
case "size":
|
|
18
|
+
if (percent !== null) cue.size = percent;
|
|
19
|
+
break;
|
|
20
|
+
case "align":
|
|
21
|
+
cue.align = value;
|
|
22
|
+
break;
|
|
23
|
+
case "vertical": cue.vertical = value;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function mergeRange(coverage, added) {
|
|
28
|
+
const merged = [];
|
|
29
|
+
let pending = added;
|
|
30
|
+
for (const range of [...coverage].sort((a, b) => a.start - b.start)) if (range.end < pending.start || range.start > pending.end) merged.push(range);
|
|
31
|
+
else pending = {
|
|
32
|
+
start: Math.min(range.start, pending.start),
|
|
33
|
+
end: Math.max(range.end, pending.end)
|
|
34
|
+
};
|
|
35
|
+
merged.push(pending);
|
|
36
|
+
return merged.sort((a, b) => a.start - b.start);
|
|
37
|
+
}
|
|
38
|
+
function createCueSink(contentType, kind, deps) {
|
|
39
|
+
const tracks = /* @__PURE__ */ new Map();
|
|
40
|
+
/**
|
|
41
|
+
* A native track for the id. The element has no removeTextTrack, so a
|
|
42
|
+
* previous attach on the same element (a rebuild, an element swap back)
|
|
43
|
+
* leaves its tracks behind; one with our kind and label is adopted and
|
|
44
|
+
* emptied rather than duplicated in the browser's caption menu.
|
|
45
|
+
*/
|
|
46
|
+
/** Empties a native track. `cues` reads null while disabled; hidden makes them removable. */
|
|
47
|
+
function empty(textTrack) {
|
|
48
|
+
textTrack.mode = "hidden";
|
|
49
|
+
const { cues } = textTrack;
|
|
50
|
+
if (cues !== null) for (let i = cues.length - 1; i >= 0; i -= 1) {
|
|
51
|
+
const cue = cues[i];
|
|
52
|
+
if (cue !== void 0) textTrack.removeCue(cue);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
function adopt(label) {
|
|
56
|
+
for (const existing of deps.element.textTracks) {
|
|
57
|
+
if (existing.kind !== kind || existing.label !== label) continue;
|
|
58
|
+
empty(existing);
|
|
59
|
+
return existing;
|
|
60
|
+
}
|
|
61
|
+
return deps.element.addTextTrack(kind, label);
|
|
62
|
+
}
|
|
63
|
+
function retire(trackId) {
|
|
64
|
+
const entry = tracks.get(trackId);
|
|
65
|
+
if (entry === void 0) return;
|
|
66
|
+
empty(entry.textTrack);
|
|
67
|
+
entry.textTrack.mode = "disabled";
|
|
68
|
+
tracks.delete(trackId);
|
|
69
|
+
}
|
|
70
|
+
function ensure(trackId) {
|
|
71
|
+
let entry = tracks.get(trackId);
|
|
72
|
+
if (entry === void 0) {
|
|
73
|
+
var _deps$label;
|
|
74
|
+
const textTrack = adopt(`${(_deps$label = deps.label) !== null && _deps$label !== void 0 ? _deps$label : "mattebox"}:${trackId}`);
|
|
75
|
+
textTrack.mode = "hidden";
|
|
76
|
+
entry = {
|
|
77
|
+
textTrack,
|
|
78
|
+
coverage: [],
|
|
79
|
+
ids: /* @__PURE__ */ new Set()
|
|
80
|
+
};
|
|
81
|
+
tracks.set(trackId, entry);
|
|
82
|
+
}
|
|
83
|
+
return entry;
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
contentType,
|
|
87
|
+
accept(trackId, data, meta) {
|
|
88
|
+
const entry = ensure(trackId);
|
|
89
|
+
if (!meta.isInit) entry.coverage = mergeRange(entry.coverage, {
|
|
90
|
+
start: meta.start,
|
|
91
|
+
end: meta.start + meta.duration
|
|
92
|
+
});
|
|
93
|
+
if (deps.parse === void 0) return [];
|
|
94
|
+
const cues = deps.parse(new Uint8Array(data), meta);
|
|
95
|
+
if (cues.length === 0) return [];
|
|
96
|
+
return [{
|
|
97
|
+
kind: "emitCues",
|
|
98
|
+
trackId,
|
|
99
|
+
cues
|
|
100
|
+
}];
|
|
101
|
+
},
|
|
102
|
+
ranges(trackId) {
|
|
103
|
+
var _tracks$get$coverage, _tracks$get;
|
|
104
|
+
return (_tracks$get$coverage = (_tracks$get = tracks.get(trackId)) === null || _tracks$get === void 0 ? void 0 : _tracks$get.coverage) !== null && _tracks$get$coverage !== void 0 ? _tracks$get$coverage : [];
|
|
105
|
+
},
|
|
106
|
+
clear(trackId, start, end) {
|
|
107
|
+
const entry = tracks.get(trackId);
|
|
108
|
+
if (entry === void 0) return [];
|
|
109
|
+
const { cues } = entry.textTrack;
|
|
110
|
+
if (cues !== null) for (let i = cues.length - 1; i >= 0; i -= 1) {
|
|
111
|
+
const cue = cues[i];
|
|
112
|
+
if (cue !== void 0 && cue.startTime >= start && cue.endTime <= end) {
|
|
113
|
+
entry.textTrack.removeCue(cue);
|
|
114
|
+
if (cue.id !== "") entry.ids.delete(cue.id);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
entry.coverage = entry.coverage.flatMap((range) => {
|
|
118
|
+
if (range.end <= start || range.start >= end) return [range];
|
|
119
|
+
const kept = [];
|
|
120
|
+
if (range.start < start) kept.push({
|
|
121
|
+
start: range.start,
|
|
122
|
+
end: start
|
|
123
|
+
});
|
|
124
|
+
if (range.end > end) kept.push({
|
|
125
|
+
start: end,
|
|
126
|
+
end: range.end
|
|
127
|
+
});
|
|
128
|
+
return kept;
|
|
129
|
+
});
|
|
130
|
+
return [];
|
|
131
|
+
},
|
|
132
|
+
handleEmitCues(trackId, cues) {
|
|
133
|
+
const entry = ensure(trackId);
|
|
134
|
+
for (const cue of cues) {
|
|
135
|
+
var _cue$text;
|
|
136
|
+
if (cue.id !== void 0 && entry.ids.has(cue.id)) continue;
|
|
137
|
+
const vtt = new VTTCue(cue.start, cue.end, (_cue$text = cue.text) !== null && _cue$text !== void 0 ? _cue$text : "");
|
|
138
|
+
if (cue.id !== void 0) {
|
|
139
|
+
vtt.id = cue.id;
|
|
140
|
+
entry.ids.add(cue.id);
|
|
141
|
+
}
|
|
142
|
+
applySettings(vtt, cue.settings);
|
|
143
|
+
entry.textTrack.addCue(vtt);
|
|
144
|
+
}
|
|
145
|
+
},
|
|
146
|
+
declare(trackId) {
|
|
147
|
+
return ensure(trackId).textTrack;
|
|
148
|
+
},
|
|
149
|
+
nativeTrack(trackId) {
|
|
150
|
+
var _tracks$get$textTrack, _tracks$get2;
|
|
151
|
+
return (_tracks$get$textTrack = (_tracks$get2 = tracks.get(trackId)) === null || _tracks$get2 === void 0 ? void 0 : _tracks$get2.textTrack) !== null && _tracks$get$textTrack !== void 0 ? _tracks$get$textTrack : null;
|
|
152
|
+
},
|
|
153
|
+
trackIds() {
|
|
154
|
+
return [...tracks.keys()];
|
|
155
|
+
},
|
|
156
|
+
retire,
|
|
157
|
+
dispose() {
|
|
158
|
+
for (const trackId of [...tracks.keys()]) retire(trackId);
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
/** Subtitles and captions to a native TextTrack. */
|
|
163
|
+
function createTextTrackSink(deps) {
|
|
164
|
+
return createCueSink("text", "subtitles", deps);
|
|
165
|
+
}
|
|
166
|
+
//#endregion
|
|
167
|
+
export { createCueSink, createTextTrackSink };
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
//#region src/kernel/timeline.ts
|
|
2
|
+
function isIndexed(addressing) {
|
|
3
|
+
return !Array.isArray(addressing) && addressing.kind === "indexed";
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* An on-demand addressing whose index box has not been fetched yet: it
|
|
7
|
+
* carries no resolvable segments. Once the adapter parses the index it swaps
|
|
8
|
+
* this for an explicit array, so every consumer treats it as empty until then.
|
|
9
|
+
*/
|
|
10
|
+
function isUnresolved(addressing) {
|
|
11
|
+
return !Array.isArray(addressing) && addressing.kind === "sidx";
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Epochs for one rendition timeline across periods. A period boundary opens
|
|
15
|
+
* an epoch; inside a period, every segment flagged `discontinuity` opens
|
|
16
|
+
* another. One code path for both.
|
|
17
|
+
*/
|
|
18
|
+
function buildEpochs(parts) {
|
|
19
|
+
const epochs = [];
|
|
20
|
+
for (const { period, rendition } of parts) {
|
|
21
|
+
const addressing = rendition.segments;
|
|
22
|
+
if (isIndexed(addressing)) {
|
|
23
|
+
var _addressing$presentat;
|
|
24
|
+
const pto = ((_addressing$presentat = addressing.presentationTimeOffset) !== null && _addressing$presentat !== void 0 ? _addressing$presentat : 0) / addressing.timescale;
|
|
25
|
+
epochs.push({
|
|
26
|
+
periodId: period.id,
|
|
27
|
+
firstSeq: addressing.startSeq,
|
|
28
|
+
presentationStart: period.start,
|
|
29
|
+
mediaStart: pto
|
|
30
|
+
});
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
if (isUnresolved(addressing)) continue;
|
|
34
|
+
let open = false;
|
|
35
|
+
for (const segment of addressing) if (!open || segment.discontinuity === true) {
|
|
36
|
+
const mediaStart = open ? 0 : segment.start - period.start;
|
|
37
|
+
epochs.push({
|
|
38
|
+
periodId: period.id,
|
|
39
|
+
firstSeq: segment.seq,
|
|
40
|
+
presentationStart: segment.start,
|
|
41
|
+
mediaStart
|
|
42
|
+
});
|
|
43
|
+
open = true;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return epochs;
|
|
47
|
+
}
|
|
48
|
+
/** The epoch a sequence number belongs to, or null before the first epoch. */
|
|
49
|
+
function epochForSeq(epochs, seq) {
|
|
50
|
+
let match = null;
|
|
51
|
+
for (const epoch of epochs) if (epoch.firstSeq <= seq) match = epoch;
|
|
52
|
+
return match;
|
|
53
|
+
}
|
|
54
|
+
/** The timestampOffset an append from this epoch requires. */
|
|
55
|
+
function timestampOffsetFor(epoch) {
|
|
56
|
+
return epoch.presentationStart - epoch.mediaStart;
|
|
57
|
+
}
|
|
58
|
+
/** Materializes one segment from an indexed form. Null outside the window. */
|
|
59
|
+
function segmentAt(addressing, seq, periodStart = 0) {
|
|
60
|
+
var _addressing$presentat2;
|
|
61
|
+
if (!isIndexed(addressing)) {
|
|
62
|
+
var _find;
|
|
63
|
+
if (isUnresolved(addressing)) return null;
|
|
64
|
+
return (_find = addressing.find((segment) => segment.seq === seq)) !== null && _find !== void 0 ? _find : null;
|
|
65
|
+
}
|
|
66
|
+
if (seq < addressing.startSeq) return null;
|
|
67
|
+
if (addressing.endSeq !== null && seq > addressing.endSeq) return null;
|
|
68
|
+
const { timescale } = addressing;
|
|
69
|
+
const pto = (_addressing$presentat2 = addressing.presentationTimeOffset) !== null && _addressing$presentat2 !== void 0 ? _addressing$presentat2 : 0;
|
|
70
|
+
let startUnits;
|
|
71
|
+
let durationUnits;
|
|
72
|
+
if (addressing.timeline !== null) {
|
|
73
|
+
let cursor = addressing.startSeq;
|
|
74
|
+
let found = null;
|
|
75
|
+
for (const run of addressing.timeline) {
|
|
76
|
+
if (seq < cursor + run.count) {
|
|
77
|
+
found = {
|
|
78
|
+
start: run.start + (seq - cursor) * run.duration,
|
|
79
|
+
duration: run.duration
|
|
80
|
+
};
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
cursor += run.count;
|
|
84
|
+
}
|
|
85
|
+
if (found === null) return null;
|
|
86
|
+
startUnits = found.start;
|
|
87
|
+
durationUnits = found.duration;
|
|
88
|
+
} else if (addressing.segmentDuration !== null) {
|
|
89
|
+
durationUnits = addressing.segmentDuration;
|
|
90
|
+
startUnits = pto + (seq - addressing.startSeq) * durationUnits;
|
|
91
|
+
} else return null;
|
|
92
|
+
const url = addressing.urlTemplate.replace(/\$(Number|Time)(?:%0(\d+)d)?\$/g, (_, name, width) => {
|
|
93
|
+
const text = String(name === "Number" ? seq : startUnits);
|
|
94
|
+
return width === void 0 ? text : text.padStart(Number(width), "0");
|
|
95
|
+
}).replaceAll("$$", "$");
|
|
96
|
+
return {
|
|
97
|
+
seq,
|
|
98
|
+
start: periodStart + (startUnits - pto) / timescale,
|
|
99
|
+
duration: durationUnits / timescale,
|
|
100
|
+
url
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
/** The first segment whose interval contains or follows `time`, or null past the end. */
|
|
104
|
+
function segmentAtTime(addressing, time, periodStart = 0) {
|
|
105
|
+
if (!isIndexed(addressing)) {
|
|
106
|
+
if (isUnresolved(addressing)) return null;
|
|
107
|
+
for (const segment of addressing) if (segment.start + segment.duration > time) return segment;
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
if (addressing.timeline === null && addressing.segmentDuration !== null) {
|
|
111
|
+
const dur = addressing.segmentDuration / addressing.timescale;
|
|
112
|
+
const relative = Math.max(0, time - periodStart);
|
|
113
|
+
const seq = addressing.startSeq + Math.floor(relative / dur);
|
|
114
|
+
return segmentAt(addressing, Math.max(seq, addressing.startSeq), periodStart);
|
|
115
|
+
}
|
|
116
|
+
let seq = addressing.startSeq;
|
|
117
|
+
const last = addressing.endSeq;
|
|
118
|
+
while (last === null || seq <= last) {
|
|
119
|
+
const segment = segmentAt(addressing, seq, periodStart);
|
|
120
|
+
if (segment === null) return null;
|
|
121
|
+
if (segment.start + segment.duration > time) return segment;
|
|
122
|
+
seq += 1;
|
|
123
|
+
}
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
//#endregion
|
|
127
|
+
export { buildEpochs, epochForSeq, segmentAt, segmentAtTime, timestampOffsetFor };
|