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,188 @@
|
|
|
1
|
+
import { parse } from '../dash-cmaf/parse.js';
|
|
2
|
+
import { registerLiveNamespace } from '../live-shared.js';
|
|
3
|
+
const MPD_TOKEN = 'dash:live:mpd';
|
|
4
|
+
const UTC_TOKEN = 'dash:live:utc';
|
|
5
|
+
const TICK_TOKEN = 'dash-live:reload';
|
|
6
|
+
const CLOCK_TOKEN = 'dash-live:clock';
|
|
7
|
+
/** Fallback hold-back when the MPD suggests nothing, in seconds. */
|
|
8
|
+
const DEFAULT_HOLD_BACK = 10;
|
|
9
|
+
/** Fallback DVR depth, in seconds. */
|
|
10
|
+
const DEFAULT_TIME_SHIFT = 60;
|
|
11
|
+
/** Window movement below this is not worth a fact, in seconds. */
|
|
12
|
+
const WINDOW_QUANTUM = 0.5;
|
|
13
|
+
const INITIAL = {
|
|
14
|
+
manifestUrl: null,
|
|
15
|
+
skew: null,
|
|
16
|
+
utcPending: false,
|
|
17
|
+
tickPending: false,
|
|
18
|
+
clockPending: false,
|
|
19
|
+
lastWindowEnd: -1,
|
|
20
|
+
lastWallClock: null,
|
|
21
|
+
};
|
|
22
|
+
/** The window arithmetic; null when it cannot move or is not worth a fact. */
|
|
23
|
+
function windowUpdate(state, live) {
|
|
24
|
+
if (live.availabilityStart === undefined || state.lastWallClock === null)
|
|
25
|
+
return null;
|
|
26
|
+
const now = state.lastWallClock + (state.skew ?? 0);
|
|
27
|
+
const end = now - live.availabilityStart;
|
|
28
|
+
if (end <= 0 || Math.abs(end - state.lastWindowEnd) < WINDOW_QUANTUM)
|
|
29
|
+
return null;
|
|
30
|
+
const start = Math.max(0, end - (live.timeShiftDepth ?? DEFAULT_TIME_SHIFT));
|
|
31
|
+
const edge = Math.max(start, end - (live.holdBack ?? DEFAULT_HOLD_BACK));
|
|
32
|
+
return {
|
|
33
|
+
next: { ...state, lastWindowEnd: end },
|
|
34
|
+
fact: feed({ type: 'LIVE_WINDOW_CHANGED', start, end, edge }),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Whether this slice owns the presentation's live window: a dynamic MPD,
|
|
39
|
+
* which ISO 23009-1 requires to carry availabilityStartTime. An HLS live
|
|
40
|
+
* presentation is live too but has no availability start; its window is
|
|
41
|
+
* read from playlists by hls-live, and reloading its master as an MPD on
|
|
42
|
+
* a one-second clock is only noise.
|
|
43
|
+
*/
|
|
44
|
+
function drivesWindow(presentation) {
|
|
45
|
+
return presentation?.isLive === true && presentation.live?.availabilityStart !== undefined;
|
|
46
|
+
}
|
|
47
|
+
/** Loops a message back into the bus through a zero-delay schedule effect. */
|
|
48
|
+
function feed(message) {
|
|
49
|
+
// biome-ignore lint/suspicious/noThenProperty: `then` is the schedule effect's field name from the message taxonomy
|
|
50
|
+
return { kind: 'schedule', token: 'dash-live:loopback', delayMs: 0, then: message };
|
|
51
|
+
}
|
|
52
|
+
function tick(delaySeconds) {
|
|
53
|
+
return {
|
|
54
|
+
kind: 'schedule',
|
|
55
|
+
token: TICK_TOKEN,
|
|
56
|
+
delayMs: Math.max(500, delaySeconds * 1000),
|
|
57
|
+
// biome-ignore lint/suspicious/noThenProperty: `then` is the schedule effect's field name from the message taxonomy
|
|
58
|
+
then: { type: 'TICK', token: TICK_TOKEN },
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
/** The one-second clock loop that slides the window while playback stalls. */
|
|
62
|
+
function clockTick() {
|
|
63
|
+
return {
|
|
64
|
+
kind: 'schedule',
|
|
65
|
+
token: CLOCK_TOKEN,
|
|
66
|
+
delayMs: 1000,
|
|
67
|
+
// biome-ignore lint/suspicious/noThenProperty: `then` is the schedule effect's field name from the message taxonomy
|
|
68
|
+
then: { type: 'TICK', token: CLOCK_TOKEN },
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
const reduceDashLive = (slice, msg, kernel) => {
|
|
72
|
+
let state = slice ?? INITIAL;
|
|
73
|
+
// Any stamped fact refreshes the clock cache first, so every later
|
|
74
|
+
// branch computes with the newest wall time.
|
|
75
|
+
if ((msg.type === 'TIME_UPDATE' || msg.type === 'SEGMENT_LOADED') &&
|
|
76
|
+
msg.wallClock !== undefined) {
|
|
77
|
+
state = { ...state, lastWallClock: msg.wallClock };
|
|
78
|
+
}
|
|
79
|
+
if (msg.type === 'LOAD')
|
|
80
|
+
return [{ ...INITIAL, manifestUrl: msg.url }, []];
|
|
81
|
+
if (msg.type === 'UNLOAD' || msg.type === 'DETACH')
|
|
82
|
+
return [INITIAL, []];
|
|
83
|
+
if (msg.type === 'MANIFEST_LOADED') {
|
|
84
|
+
if (!drivesWindow(msg.presentation))
|
|
85
|
+
return [state, []];
|
|
86
|
+
const effects = [];
|
|
87
|
+
let next = state;
|
|
88
|
+
const server = msg.presentation.live.timeServer;
|
|
89
|
+
if (server !== undefined && state.skew === null && !state.utcPending) {
|
|
90
|
+
if (server.scheme.endsWith(':direct') || server.scheme.endsWith(':direct:2014')) {
|
|
91
|
+
// The value is the date itself; skew resolves on the next fact
|
|
92
|
+
// carrying a wall clock. Treated as zero until then.
|
|
93
|
+
next = { ...next, skew: null };
|
|
94
|
+
}
|
|
95
|
+
else if (server.value !== '') {
|
|
96
|
+
effects.push({ kind: 'fetch', token: UTC_TOKEN, url: server.value });
|
|
97
|
+
next = { ...next, utcPending: true };
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
if (!next.tickPending) {
|
|
101
|
+
effects.push(tick(msg.presentation.live.updatePeriod ?? 4));
|
|
102
|
+
next = { ...next, tickPending: true };
|
|
103
|
+
}
|
|
104
|
+
if (!next.clockPending) {
|
|
105
|
+
effects.push(clockTick());
|
|
106
|
+
next = { ...next, clockPending: true };
|
|
107
|
+
}
|
|
108
|
+
const window = windowUpdate(next, msg.presentation.live);
|
|
109
|
+
if (window !== null) {
|
|
110
|
+
next = window.next;
|
|
111
|
+
effects.push(window.fact);
|
|
112
|
+
}
|
|
113
|
+
return [next, effects];
|
|
114
|
+
}
|
|
115
|
+
if (msg.type === 'TICK' && msg.token === CLOCK_TOKEN) {
|
|
116
|
+
if (!drivesWindow(kernel.presentation)) {
|
|
117
|
+
return [{ ...state, clockPending: false }, []];
|
|
118
|
+
}
|
|
119
|
+
let next = { ...state, clockPending: true };
|
|
120
|
+
if (msg.wallClock !== undefined)
|
|
121
|
+
next = { ...next, lastWallClock: msg.wallClock };
|
|
122
|
+
const effects = [clockTick()];
|
|
123
|
+
const live = kernel.presentation.live;
|
|
124
|
+
if (live !== undefined) {
|
|
125
|
+
const window = windowUpdate(next, live);
|
|
126
|
+
if (window !== null) {
|
|
127
|
+
next = window.next;
|
|
128
|
+
effects.push(window.fact);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return [next, effects];
|
|
132
|
+
}
|
|
133
|
+
if (msg.type === 'TICK' && msg.token === TICK_TOKEN) {
|
|
134
|
+
if (state.manifestUrl === null || !drivesWindow(kernel.presentation)) {
|
|
135
|
+
return [{ ...state, tickPending: false }, []];
|
|
136
|
+
}
|
|
137
|
+
return [
|
|
138
|
+
{ ...state, tickPending: false },
|
|
139
|
+
[{ kind: 'fetch', token: MPD_TOKEN, url: state.manifestUrl }],
|
|
140
|
+
];
|
|
141
|
+
}
|
|
142
|
+
if (msg.type === 'SEGMENT_LOADED' && msg.trackId === UTC_TOKEN) {
|
|
143
|
+
const serverTime = Date.parse(new TextDecoder().decode(msg.bytes).trim());
|
|
144
|
+
if (!Number.isFinite(serverTime) || msg.wallClock === undefined) {
|
|
145
|
+
return [{ ...state, utcPending: false }, []];
|
|
146
|
+
}
|
|
147
|
+
return [{ ...state, skew: serverTime / 1000 - msg.wallClock, utcPending: false }, []];
|
|
148
|
+
}
|
|
149
|
+
if (msg.type === 'SEGMENT_LOADED' && msg.trackId === MPD_TOKEN) {
|
|
150
|
+
if (state.manifestUrl === null)
|
|
151
|
+
return [state, []];
|
|
152
|
+
const result = parse(new TextDecoder().decode(msg.bytes), state.manifestUrl);
|
|
153
|
+
const effects = [];
|
|
154
|
+
let next = state;
|
|
155
|
+
if (result.presentation !== null) {
|
|
156
|
+
effects.push(feed({ type: 'MANIFEST_LOADED', presentation: result.presentation }));
|
|
157
|
+
if (result.presentation.isLive && result.presentation.live !== undefined) {
|
|
158
|
+
const window = windowUpdate(next, result.presentation.live);
|
|
159
|
+
if (window !== null) {
|
|
160
|
+
next = window.next;
|
|
161
|
+
effects.push(window.fact);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return [next, effects];
|
|
166
|
+
}
|
|
167
|
+
// Every wall-clock-stamped fact can slide the window.
|
|
168
|
+
if ((msg.type === 'TIME_UPDATE' || msg.type === 'SEGMENT_LOADED') &&
|
|
169
|
+
drivesWindow(kernel.presentation)) {
|
|
170
|
+
const window = windowUpdate(state, kernel.presentation.live);
|
|
171
|
+
if (window !== null)
|
|
172
|
+
return [window.next, [window.fact]];
|
|
173
|
+
}
|
|
174
|
+
return [state, []];
|
|
175
|
+
};
|
|
176
|
+
/** The stage factory. Requires dash-cmaf; the loader enforces it. */
|
|
177
|
+
export default function dashLive() {
|
|
178
|
+
return {
|
|
179
|
+
name: 'dash-live',
|
|
180
|
+
provides: ['dash-live'],
|
|
181
|
+
requires: ['dash-cmaf'],
|
|
182
|
+
install(ctx) {
|
|
183
|
+
ctx.reduce('dash-live', reduceDashLive);
|
|
184
|
+
registerLiveNamespace(ctx);
|
|
185
|
+
},
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/protocols/dash-live/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The hls-cmaf protocol adapter as a stage. Inert module: exports a
|
|
3
|
+
* factory, registers nothing at import time.
|
|
4
|
+
*
|
|
5
|
+
* The choreography is a slice reducer, so the whole protocol lives inside
|
|
6
|
+
* the message loop and the trace: manifest bytes arrive as SEGMENT_LOADED
|
|
7
|
+
* facts, parsing is pure, and results loop back through zero-delay
|
|
8
|
+
* schedule effects carrying MANIFEST_LOADED. Media playlists fetch under
|
|
9
|
+
* `hls:pl:` tokens the transport correlates back by token.
|
|
10
|
+
*/
|
|
11
|
+
import type { Stage } from '../../types/stage.js';
|
|
12
|
+
/**
|
|
13
|
+
* The stage factory. `mattebox({ stages: [hlsCmaf()] })` is all a consumer
|
|
14
|
+
* needs for HLS-CMAF VOD.
|
|
15
|
+
*/
|
|
16
|
+
export default function hlsCmaf(): Stage;
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/protocols/hls-cmaf/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AA6LlD;;;GAGG;AACH,MAAM,CAAC,OAAO,UAAU,OAAO,IAAI,KAAK,CAQvC"}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The hls-cmaf protocol adapter as a stage. Inert module: exports a
|
|
3
|
+
* factory, registers nothing at import time.
|
|
4
|
+
*
|
|
5
|
+
* The choreography is a slice reducer, so the whole protocol lives inside
|
|
6
|
+
* the message loop and the trace: manifest bytes arrive as SEGMENT_LOADED
|
|
7
|
+
* facts, parsing is pure, and results loop back through zero-delay
|
|
8
|
+
* schedule effects carrying MANIFEST_LOADED. Media playlists fetch under
|
|
9
|
+
* `hls:pl:` tokens the transport correlates back by token.
|
|
10
|
+
*/
|
|
11
|
+
import { normalizeMimeType } from '../../kernel/mime.js';
|
|
12
|
+
import { mergePlaylist, parse, parseMediaPlaylist } from './parse.js';
|
|
13
|
+
const PLAYLIST_TOKEN = 'hls:pl:';
|
|
14
|
+
/** The playlist MIME types, RFC 8216 §4: the registered type and the three in common use. */
|
|
15
|
+
const MANIFEST_TYPES = [
|
|
16
|
+
'application/vnd.apple.mpegurl',
|
|
17
|
+
'application/x-mpegurl',
|
|
18
|
+
'audio/mpegurl',
|
|
19
|
+
'audio/x-mpegurl',
|
|
20
|
+
];
|
|
21
|
+
const INITIAL = { manifestUrl: null, mimeType: null, pending: {} };
|
|
22
|
+
/**
|
|
23
|
+
* Whether this adapter owns the manifest bytes. An explicit mimeType
|
|
24
|
+
* decides alone: a foreign type declines without reading, an own type
|
|
25
|
+
* parses without sniffing, so a broken playlist reports a parse failure
|
|
26
|
+
* instead of falling through. Without one, RFC 8216 §4.3.1.1: the first
|
|
27
|
+
* line of every playlist is #EXTM3U.
|
|
28
|
+
*/
|
|
29
|
+
function claims(state, text) {
|
|
30
|
+
if (state.mimeType !== null)
|
|
31
|
+
return MANIFEST_TYPES.includes(state.mimeType);
|
|
32
|
+
return text.trimStart().startsWith('#EXTM3U');
|
|
33
|
+
}
|
|
34
|
+
function findRendition(presentation, renditionId) {
|
|
35
|
+
for (const period of presentation.periods) {
|
|
36
|
+
for (const track of period.tracks) {
|
|
37
|
+
for (const rendition of track.renditions) {
|
|
38
|
+
if (rendition.id === renditionId)
|
|
39
|
+
return { rendition, track };
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* The renditions whose media playlists still need fetching: every rendition of
|
|
47
|
+
* every active track. Fetching only the "chosen" one is not enough, because ABR
|
|
48
|
+
* (or any switch policy) selects independently and can pick a rendition this
|
|
49
|
+
* slice would not have; its segments would then stay empty and the scheduler
|
|
50
|
+
* would stall the moment ABR ramped onto it, which looks like playback dying
|
|
51
|
+
* once the buffer drains. Fetching all of an active track's playlists means the
|
|
52
|
+
* rendition ABR lands on is already loaded, and a switch never stalls.
|
|
53
|
+
*/
|
|
54
|
+
function neededPlaylists(kernel) {
|
|
55
|
+
const presentation = kernel.presentation;
|
|
56
|
+
if (presentation === null)
|
|
57
|
+
return [];
|
|
58
|
+
const activeIds = new Set(['video', 'audio', 'text']
|
|
59
|
+
.map((contentType) => kernel.tracks.active.get(contentType))
|
|
60
|
+
.filter((id) => id !== undefined));
|
|
61
|
+
const needed = [];
|
|
62
|
+
for (const period of presentation.periods) {
|
|
63
|
+
for (const track of period.tracks) {
|
|
64
|
+
if (!activeIds.has(track.id))
|
|
65
|
+
continue;
|
|
66
|
+
for (const rendition of track.renditions) {
|
|
67
|
+
if (rendition.playlistUrl !== undefined &&
|
|
68
|
+
Array.isArray(rendition.segments) &&
|
|
69
|
+
rendition.segments.length === 0) {
|
|
70
|
+
needed.push(rendition);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return needed;
|
|
76
|
+
}
|
|
77
|
+
/** Loops a message back into the bus through a zero-delay schedule effect. */
|
|
78
|
+
function feed(message) {
|
|
79
|
+
// biome-ignore lint/suspicious/noThenProperty: `then` is the schedule effect's field name from the message taxonomy
|
|
80
|
+
return { kind: 'schedule', token: 'hls:loopback', delayMs: 0, then: message };
|
|
81
|
+
}
|
|
82
|
+
function loopBack(presentation) {
|
|
83
|
+
return feed({ type: 'MANIFEST_LOADED', presentation });
|
|
84
|
+
}
|
|
85
|
+
const reduceHls = (slice, msg, kernel) => {
|
|
86
|
+
const state = slice ?? INITIAL;
|
|
87
|
+
if (msg.type === 'LOAD') {
|
|
88
|
+
return [
|
|
89
|
+
{
|
|
90
|
+
manifestUrl: msg.url,
|
|
91
|
+
mimeType: msg.mimeType === undefined ? null : normalizeMimeType(msg.mimeType),
|
|
92
|
+
pending: {},
|
|
93
|
+
},
|
|
94
|
+
[],
|
|
95
|
+
];
|
|
96
|
+
}
|
|
97
|
+
if (msg.type === 'UNLOAD' || msg.type === 'DETACH') {
|
|
98
|
+
return [INITIAL, []];
|
|
99
|
+
}
|
|
100
|
+
if (msg.type === 'SEGMENT_LOADED' && msg.trackId === 'manifest' && state.manifestUrl !== null) {
|
|
101
|
+
const text = new TextDecoder().decode(msg.bytes);
|
|
102
|
+
// Declining returns no effect; the kernel reports bytes nobody claims.
|
|
103
|
+
if (!claims(state, text))
|
|
104
|
+
return [state, []];
|
|
105
|
+
const result = parse(text, state.manifestUrl);
|
|
106
|
+
if (result.presentation === null) {
|
|
107
|
+
return [
|
|
108
|
+
state,
|
|
109
|
+
[
|
|
110
|
+
feed({
|
|
111
|
+
type: 'MANIFEST_FAILED',
|
|
112
|
+
error: result.error ?? {
|
|
113
|
+
category: 'manifest',
|
|
114
|
+
code: 'MANIFEST_PARSE_FAILED',
|
|
115
|
+
fatal: true,
|
|
116
|
+
recoverable: false,
|
|
117
|
+
},
|
|
118
|
+
}),
|
|
119
|
+
],
|
|
120
|
+
];
|
|
121
|
+
}
|
|
122
|
+
return [state, [loopBack(result.presentation)]];
|
|
123
|
+
}
|
|
124
|
+
if (msg.type === 'SEGMENT_LOADED' && msg.trackId.startsWith(PLAYLIST_TOKEN)) {
|
|
125
|
+
const renditionId = state.pending[msg.trackId];
|
|
126
|
+
if (renditionId === undefined || kernel.presentation === null)
|
|
127
|
+
return [state, []];
|
|
128
|
+
const site = findRendition(kernel.presentation, renditionId);
|
|
129
|
+
const pending = { ...state.pending };
|
|
130
|
+
delete pending[msg.trackId];
|
|
131
|
+
if (site === null || site.rendition.playlistUrl === undefined) {
|
|
132
|
+
return [{ ...state, pending }, []];
|
|
133
|
+
}
|
|
134
|
+
const text = new TextDecoder().decode(msg.bytes);
|
|
135
|
+
const media = parseMediaPlaylist(text, site.rendition.playlistUrl);
|
|
136
|
+
if (media.playlist === null) {
|
|
137
|
+
return [
|
|
138
|
+
{ ...state, pending },
|
|
139
|
+
[
|
|
140
|
+
feed({
|
|
141
|
+
type: 'MANIFEST_FAILED',
|
|
142
|
+
error: media.error ?? {
|
|
143
|
+
category: 'manifest',
|
|
144
|
+
code: 'MANIFEST_PARSE_FAILED',
|
|
145
|
+
fatal: true,
|
|
146
|
+
recoverable: false,
|
|
147
|
+
},
|
|
148
|
+
}),
|
|
149
|
+
],
|
|
150
|
+
];
|
|
151
|
+
}
|
|
152
|
+
const merged = mergePlaylist(kernel.presentation, renditionId, media.playlist);
|
|
153
|
+
return [{ ...state, pending }, [loopBack(merged)]];
|
|
154
|
+
}
|
|
155
|
+
// After a manifest lands, a selection changes, or time moves, fetch any
|
|
156
|
+
// media playlist the current selection still lacks. Selection is its own
|
|
157
|
+
// trigger: on a paused or stalled element no TIME_UPDATE ever comes, and
|
|
158
|
+
// a track whose playlist never loads is one the element can never play.
|
|
159
|
+
if (msg.type === 'MANIFEST_LOADED' || msg.type === 'SELECT_TRACK' || msg.type === 'TIME_UPDATE') {
|
|
160
|
+
const needed = neededPlaylists(kernel).filter((rendition) => !Object.values(state.pending).includes(rendition.id));
|
|
161
|
+
if (needed.length === 0)
|
|
162
|
+
return [state, []];
|
|
163
|
+
const effects = [];
|
|
164
|
+
const pending = { ...state.pending };
|
|
165
|
+
for (const rendition of needed) {
|
|
166
|
+
const token = `${PLAYLIST_TOKEN}${rendition.id}`;
|
|
167
|
+
if (pending[token] !== undefined)
|
|
168
|
+
continue;
|
|
169
|
+
pending[token] = rendition.id;
|
|
170
|
+
effects.push({ kind: 'fetch', token, url: rendition.playlistUrl });
|
|
171
|
+
}
|
|
172
|
+
return [{ ...state, pending }, effects];
|
|
173
|
+
}
|
|
174
|
+
return [state, []];
|
|
175
|
+
};
|
|
176
|
+
/**
|
|
177
|
+
* The stage factory. `mattebox({ stages: [hlsCmaf()] })` is all a consumer
|
|
178
|
+
* needs for HLS-CMAF VOD.
|
|
179
|
+
*/
|
|
180
|
+
export default function hlsCmaf() {
|
|
181
|
+
return {
|
|
182
|
+
name: 'hls-cmaf',
|
|
183
|
+
provides: ['hls-cmaf', ...MANIFEST_TYPES],
|
|
184
|
+
install(ctx) {
|
|
185
|
+
ctx.reduce('hls', reduceHls);
|
|
186
|
+
},
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/protocols/hls-cmaf/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Line-based m3u8 tokenizer. RFC 8216 §4. The attribute-list tokenizer is
|
|
3
|
+
* a real one: quoted values may contain commas, so splitting on ',' fails
|
|
4
|
+
* on real manifests.
|
|
5
|
+
*/
|
|
6
|
+
export interface TagLine {
|
|
7
|
+
readonly kind: 'tag';
|
|
8
|
+
readonly name: string;
|
|
9
|
+
/** The raw text after the colon, untokenized. */
|
|
10
|
+
readonly value: string;
|
|
11
|
+
readonly attributes: Readonly<Record<string, string>>;
|
|
12
|
+
}
|
|
13
|
+
export interface UriLine {
|
|
14
|
+
readonly kind: 'uri';
|
|
15
|
+
readonly uri: string;
|
|
16
|
+
}
|
|
17
|
+
export type Line = TagLine | UriLine;
|
|
18
|
+
/**
|
|
19
|
+
* RFC 8216 §4.2: comma-separated KEY=VALUE pairs where a quoted-string
|
|
20
|
+
* value may contain commas. Walk characters; never split.
|
|
21
|
+
*/
|
|
22
|
+
export declare function parseAttributeList(text: string): Record<string, string>;
|
|
23
|
+
/** Tokenizes a playlist into tag and URI lines. Comments and blanks drop. */
|
|
24
|
+
export declare function lex(text: string): readonly Line[];
|
|
25
|
+
//# sourceMappingURL=lexer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lexer.d.ts","sourceRoot":"","sources":["../../../src/protocols/hls-cmaf/lexer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,iDAAiD;IACjD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACvD;AAED,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,IAAI,GAAG,OAAO,GAAG,OAAO,CAAC;AAarC;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA6BvE;AAED,6EAA6E;AAC7E,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,IAAI,EAAE,CAqBjD"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Line-based m3u8 tokenizer. RFC 8216 §4. The attribute-list tokenizer is
|
|
3
|
+
* a real one: quoted values may contain commas, so splitting on ',' fails
|
|
4
|
+
* on real manifests.
|
|
5
|
+
*/
|
|
6
|
+
/** Tags with attribute lists; everything else keeps its raw value. */
|
|
7
|
+
const ATTRIBUTE_TAGS = new Set([
|
|
8
|
+
'EXT-X-STREAM-INF',
|
|
9
|
+
'EXT-X-MEDIA',
|
|
10
|
+
'EXT-X-MAP',
|
|
11
|
+
'EXT-X-KEY',
|
|
12
|
+
'EXT-X-SESSION-KEY',
|
|
13
|
+
'EXT-X-I-FRAME-STREAM-INF',
|
|
14
|
+
'EXT-X-CONTENT-STEERING',
|
|
15
|
+
]);
|
|
16
|
+
/**
|
|
17
|
+
* RFC 8216 §4.2: comma-separated KEY=VALUE pairs where a quoted-string
|
|
18
|
+
* value may contain commas. Walk characters; never split.
|
|
19
|
+
*/
|
|
20
|
+
export function parseAttributeList(text) {
|
|
21
|
+
const out = {};
|
|
22
|
+
let at = 0;
|
|
23
|
+
while (at < text.length) {
|
|
24
|
+
const eq = text.indexOf('=', at);
|
|
25
|
+
if (eq === -1)
|
|
26
|
+
break;
|
|
27
|
+
const key = text.slice(at, eq).trim();
|
|
28
|
+
at = eq + 1;
|
|
29
|
+
let value;
|
|
30
|
+
if (text[at] === '"') {
|
|
31
|
+
const close = text.indexOf('"', at + 1);
|
|
32
|
+
if (close === -1) {
|
|
33
|
+
value = text.slice(at + 1);
|
|
34
|
+
at = text.length;
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
value = text.slice(at + 1, close);
|
|
38
|
+
at = close + 1;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
let end = text.indexOf(',', at);
|
|
43
|
+
if (end === -1)
|
|
44
|
+
end = text.length;
|
|
45
|
+
value = text.slice(at, end).trim();
|
|
46
|
+
at = end;
|
|
47
|
+
}
|
|
48
|
+
if (key !== '')
|
|
49
|
+
out[key] = value;
|
|
50
|
+
// Skip the separating comma, when present.
|
|
51
|
+
if (text[at] === ',')
|
|
52
|
+
at += 1;
|
|
53
|
+
}
|
|
54
|
+
return out;
|
|
55
|
+
}
|
|
56
|
+
/** Tokenizes a playlist into tag and URI lines. Comments and blanks drop. */
|
|
57
|
+
export function lex(text) {
|
|
58
|
+
const lines = [];
|
|
59
|
+
for (const raw of text.split(/\r?\n/)) {
|
|
60
|
+
const line = raw.trim();
|
|
61
|
+
if (line === '')
|
|
62
|
+
continue;
|
|
63
|
+
if (!line.startsWith('#')) {
|
|
64
|
+
lines.push({ kind: 'uri', uri: line });
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
if (!line.startsWith('#EXT'))
|
|
68
|
+
continue; // a comment
|
|
69
|
+
const colon = line.indexOf(':');
|
|
70
|
+
const name = colon === -1 ? line.slice(1) : line.slice(1, colon);
|
|
71
|
+
const value = colon === -1 ? '' : line.slice(colon + 1);
|
|
72
|
+
lines.push({
|
|
73
|
+
kind: 'tag',
|
|
74
|
+
name,
|
|
75
|
+
value,
|
|
76
|
+
attributes: ATTRIBUTE_TAGS.has(name) ? parseAttributeList(value) : {},
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
return lines;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=lexer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lexer.js","sourceRoot":"","sources":["../../../src/protocols/hls-cmaf/lexer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* m3u8 into the IR. Pure: no fetching, no state, no side effects. URLs are
|
|
3
|
+
* resolved here, against the playlist's own URL, and stored absolute;
|
|
4
|
+
* downstream code never does URL arithmetic.
|
|
5
|
+
*
|
|
6
|
+
* The HLS variant problem: EXT-X-STREAM-INF describes a bundle of one
|
|
7
|
+
* video rendition plus an audio group plus a subtitle group. The adapter
|
|
8
|
+
* decomposes variants into a video track with renditions, hoists
|
|
9
|
+
* EXT-X-MEDIA entries into their own tracks, and records the bundle in the
|
|
10
|
+
* coupling table as data. Generic descriptors only; the kernel routes.
|
|
11
|
+
*/
|
|
12
|
+
import type { MatteboxError } from '../../types/error.js';
|
|
13
|
+
import type { Presentation, ProtectionInfo, Segment, SegmentRef } from '../../types/ir.js';
|
|
14
|
+
export interface ParseResult {
|
|
15
|
+
readonly presentation: Presentation | null;
|
|
16
|
+
readonly error: MatteboxError | null;
|
|
17
|
+
}
|
|
18
|
+
export interface MediaPlaylist {
|
|
19
|
+
readonly segments: readonly Segment[];
|
|
20
|
+
readonly init: SegmentRef | null;
|
|
21
|
+
readonly targetDuration: number;
|
|
22
|
+
readonly mediaSequence: number;
|
|
23
|
+
readonly endlist: boolean;
|
|
24
|
+
readonly playlistType: string | null;
|
|
25
|
+
readonly protection: ProtectionInfo | null;
|
|
26
|
+
/** From the first EXT-X-PROGRAM-DATE-TIME: `wallClock` epoch seconds at `presentationTime`. */
|
|
27
|
+
readonly dateAnchor?: {
|
|
28
|
+
readonly wallClock: number;
|
|
29
|
+
readonly presentationTime: number;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export interface MediaPlaylistResult {
|
|
33
|
+
readonly playlist: MediaPlaylist | null;
|
|
34
|
+
readonly error: MatteboxError | null;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Rewrites the legacy decimal AVC codec form some packagers still emit into
|
|
38
|
+
* the RFC 6381 hex form MSE demands. `avc1.66.30` (profile 66, level 30) is
|
|
39
|
+
* accepted by Firefox but rejected by Chrome's isTypeSupported, which is why a
|
|
40
|
+
* stream like Unified Streaming's plays audio but no video on one browser and
|
|
41
|
+
* nothing on the other. The constraint byte is not carried in this form, so it
|
|
42
|
+
* is emitted as zero; the real flags ride in the avcC the transmux writes.
|
|
43
|
+
*/
|
|
44
|
+
export declare function normalizeAvcCodec(codec: string): string;
|
|
45
|
+
/** parse a media playlist body into segments. */
|
|
46
|
+
export declare function parseMediaPlaylist(text: string, baseUrl: string): MediaPlaylistResult;
|
|
47
|
+
/** parse either playlist form into a Presentation. Never throws. */
|
|
48
|
+
export declare function parse(text: string, baseUrl: string): ParseResult;
|
|
49
|
+
/**
|
|
50
|
+
* Immutably merges a fetched media playlist into the rendition that
|
|
51
|
+
* referenced it. Duration, liveness, init, and protection all come from
|
|
52
|
+
* the media playlist; the presentation learns them here. On a live refresh
|
|
53
|
+
* the new window is rebased onto the running timeline first, so segment start
|
|
54
|
+
* times stay absolute across reloads.
|
|
55
|
+
*/
|
|
56
|
+
export declare function mergePlaylist(presentation: Presentation, renditionId: string, playlist: MediaPlaylist): Presentation;
|
|
57
|
+
//# sourceMappingURL=parse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../../src/protocols/hls-cmaf/parse.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAGV,YAAY,EACZ,cAAc,EAEd,OAAO,EAGP,UAAU,EAEX,MAAM,mBAAmB,CAAC;AAI3B,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,YAAY,EAAE,YAAY,GAAG,IAAI,CAAC;IAC3C,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAAC;CACtC;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;IACtC,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,UAAU,EAAE,cAAc,GAAG,IAAI,CAAC;IAC3C,+FAA+F;IAC/F,QAAQ,CAAC,UAAU,CAAC,EAAE;QAAE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAA;KAAE,CAAC;CACzF;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAC;IACxC,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAAC;CACtC;AAkED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKvD;AAiBD,iDAAiD;AACjD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,mBAAmB,CAsHrF;AAiBD,oEAAoE;AACpE,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,WAAW,CA4PhE;AA+BD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,YAAY,EAAE,YAAY,EAC1B,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,aAAa,GACtB,YAAY,CAqEd"}
|