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,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CEA-608 in-band captions as a stage. It owns the decoder and the seam to
|
|
3
|
+
* its SEI source: it registers one caption consumer, and whichever source is
|
|
4
|
+
* composed (ts-transmux for TS, nal-scan for fMP4) delivers the byte pairs.
|
|
5
|
+
* The stage imports neither source, only the shared registry, which is what
|
|
6
|
+
* lets one decoder serve both routes (entanglement #1).
|
|
7
|
+
*
|
|
8
|
+
* Decoded captions become native VTTCues on a caption TextTrack, rendered by
|
|
9
|
+
* the browser like any text track. The track is created on the first cue and
|
|
10
|
+
* left off by default; the viewer or the app turns it on.
|
|
11
|
+
*/
|
|
12
|
+
import { registerCaptionConsumer } from '../../containers/captions.js';
|
|
13
|
+
import { Cea608Decoder } from './decode.js';
|
|
14
|
+
export default function textCea608() {
|
|
15
|
+
return {
|
|
16
|
+
name: 'text-cea608',
|
|
17
|
+
provides: ['text-cea608', { contentType: 'text', mimeType: 'application/cea-608' }],
|
|
18
|
+
// Either SEI source satisfies it; the loader resolves the alternative.
|
|
19
|
+
requires: [['ts-transmux', 'nal-scan']],
|
|
20
|
+
install(ctx) {
|
|
21
|
+
const decoder = new Cea608Decoder();
|
|
22
|
+
const element = ctx.element;
|
|
23
|
+
let track = null;
|
|
24
|
+
/** Empties the track. `cues` reads null while disabled; hidden makes them removable. */
|
|
25
|
+
function empty(target) {
|
|
26
|
+
target.mode = 'hidden';
|
|
27
|
+
const { cues } = target;
|
|
28
|
+
if (cues === null)
|
|
29
|
+
return;
|
|
30
|
+
for (let i = cues.length - 1; i >= 0; i -= 1) {
|
|
31
|
+
const cue = cues[i];
|
|
32
|
+
if (cue !== undefined)
|
|
33
|
+
target.removeCue(cue);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
function ensureTrack() {
|
|
37
|
+
if (track === null) {
|
|
38
|
+
// The element cannot drop a TextTrack, so a previous attach on the
|
|
39
|
+
// same element (a rebuild) left one behind: adopt it, emptied,
|
|
40
|
+
// rather than add a duplicate to the browser's caption menu.
|
|
41
|
+
for (const existing of element.textTracks) {
|
|
42
|
+
if (existing.kind === 'captions' && existing.label === 'CC1') {
|
|
43
|
+
track = existing;
|
|
44
|
+
empty(track);
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
track ??= element.addTextTrack('captions', 'CC1', 'en');
|
|
49
|
+
// Present but not rendered until the viewer selects it.
|
|
50
|
+
track.mode = 'hidden';
|
|
51
|
+
}
|
|
52
|
+
return track;
|
|
53
|
+
}
|
|
54
|
+
const unregister = registerCaptionConsumer((packets) => {
|
|
55
|
+
for (const packet of packets) {
|
|
56
|
+
for (const triple of packet.triples) {
|
|
57
|
+
// CEA-608 field 1 carries CC1, the primary channel this decodes.
|
|
58
|
+
if (triple.type === 0)
|
|
59
|
+
decoder.push(triple.a, triple.b, packet.time);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
const cues = decoder.drain();
|
|
63
|
+
if (cues.length === 0)
|
|
64
|
+
return;
|
|
65
|
+
const VttCue = globalThis.VTTCue;
|
|
66
|
+
if (VttCue === undefined)
|
|
67
|
+
return;
|
|
68
|
+
const target = ensureTrack();
|
|
69
|
+
for (const cue of cues) {
|
|
70
|
+
target.addCue(new VttCue(cue.start, cue.end, cue.text));
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
return () => {
|
|
74
|
+
unregister();
|
|
75
|
+
if (track !== null) {
|
|
76
|
+
empty(track);
|
|
77
|
+
track.mode = 'disabled';
|
|
78
|
+
track = null;
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/stages/text-cea608/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/stages/text-webvtt/index.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAOlD,MAAM,CAAC,OAAO,UAAU,UAAU,IAAI,KAAK,CAgE1C"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebVTT as a stage: a parser for text/vtt and the text sink registration
|
|
3
|
+
* that makes text tracks selectable. Cues become native VTTCues through the
|
|
4
|
+
* kernel's TextTrackSink; the browser renders, styles, and exposes the
|
|
5
|
+
* caption UI, which is why this stage stays small.
|
|
6
|
+
*
|
|
7
|
+
* The stage also keeps the element's TextTrackList and the engine's text
|
|
8
|
+
* selection in step, both ways. Every text track exists natively from the
|
|
9
|
+
* manifest on, so the browser's caption menu lists all of them; the active
|
|
10
|
+
* one is `showing`, the rest `disabled`. A pick in that menu selects in the
|
|
11
|
+
* engine, and switching captions off there deselects.
|
|
12
|
+
*/
|
|
13
|
+
import { createTextTrackSink } from '../../kernel/sinks/text-track-sink.js';
|
|
14
|
+
import { parseVtt } from './parse.js';
|
|
15
|
+
function parseSegment(data, _meta) {
|
|
16
|
+
return parseVtt(new TextDecoder().decode(data)).cues;
|
|
17
|
+
}
|
|
18
|
+
export default function textWebvtt() {
|
|
19
|
+
return {
|
|
20
|
+
name: 'text-webvtt',
|
|
21
|
+
provides: ['text-webvtt', { contentType: 'text', mimeType: 'text/vtt' }],
|
|
22
|
+
requires: ['scheduler'],
|
|
23
|
+
install(ctx) {
|
|
24
|
+
const { element } = ctx;
|
|
25
|
+
// One sink per attach, built here rather than in the factory so the
|
|
26
|
+
// mirror below can declare tracks before any segment is fetched.
|
|
27
|
+
const sink = createTextTrackSink({ element, parse: parseSegment });
|
|
28
|
+
ctx.registerParser('text/vtt', parseSegment);
|
|
29
|
+
ctx.registerSink('text', () => sink);
|
|
30
|
+
function textTracks() {
|
|
31
|
+
const presentation = ctx.getState().presentation;
|
|
32
|
+
if (presentation === null)
|
|
33
|
+
return [];
|
|
34
|
+
return presentation.periods.flatMap((period) => period.tracks.filter((track) => track.contentType === 'text'));
|
|
35
|
+
}
|
|
36
|
+
function activeId() {
|
|
37
|
+
return ctx.getState().tracks.active.get('text');
|
|
38
|
+
}
|
|
39
|
+
// Engine to element. A track no longer in the presentation (a new
|
|
40
|
+
// source on the same engine) is retired first, so its last cue does
|
|
41
|
+
// not outlive it on screen.
|
|
42
|
+
function mirror() {
|
|
43
|
+
const active = activeId();
|
|
44
|
+
const current = new Set(textTracks().map((track) => track.id));
|
|
45
|
+
for (const id of sink.trackIds()) {
|
|
46
|
+
if (!current.has(id))
|
|
47
|
+
sink.retire(id);
|
|
48
|
+
}
|
|
49
|
+
for (const track of textTracks()) {
|
|
50
|
+
const native = sink.declare(track.id);
|
|
51
|
+
const mode = track.id === active ? 'showing' : 'disabled';
|
|
52
|
+
if (native.mode !== mode)
|
|
53
|
+
native.mode = mode;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// Element to engine. Fires for the mirror's own writes too; those
|
|
57
|
+
// find the element already in step and dispatch nothing.
|
|
58
|
+
function onNativeChange() {
|
|
59
|
+
const active = activeId();
|
|
60
|
+
const showing = textTracks().find((track) => sink.nativeTrack(track.id)?.mode === 'showing');
|
|
61
|
+
if (showing !== undefined) {
|
|
62
|
+
if (showing.id !== active)
|
|
63
|
+
ctx.dispatch({ type: 'SELECT_TRACK', trackId: showing.id });
|
|
64
|
+
}
|
|
65
|
+
else if (active !== undefined) {
|
|
66
|
+
ctx.dispatch({ type: 'DESELECT_TRACK', contentType: 'text' });
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
ctx.on('tracks:changed', mirror);
|
|
70
|
+
ctx.on('tracks:selected', (payload) => {
|
|
71
|
+
if (payload.contentType === 'text')
|
|
72
|
+
mirror();
|
|
73
|
+
});
|
|
74
|
+
element.textTracks.addEventListener('change', onNativeChange);
|
|
75
|
+
return () => {
|
|
76
|
+
element.textTracks.removeEventListener('change', onNativeChange);
|
|
77
|
+
sink.dispose();
|
|
78
|
+
};
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/stages/text-webvtt/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebVTT into cue descriptors. Pure, plain-VTT only: the HLS X-TIMESTAMP-MAP
|
|
3
|
+
* header is a segmented-delivery concern that text-webvtt-segmented rewrites
|
|
4
|
+
* away as a byte transform before this parser ever sees the text.
|
|
5
|
+
*
|
|
6
|
+
* Malformed cues are skipped, never thrown: one bad cue must not cost the
|
|
7
|
+
* segment. Every cue carries a deterministic id so re-delivered segments
|
|
8
|
+
* dedup at the sink.
|
|
9
|
+
*/
|
|
10
|
+
import type { CueDescriptor } from '../../types/messages.js';
|
|
11
|
+
/** `HH:MM:SS.mmm` or `MM:SS.mmm` to seconds, or null. */
|
|
12
|
+
export declare function parseTimestamp(text: string): number | null;
|
|
13
|
+
export interface VttParseResult {
|
|
14
|
+
readonly cues: readonly CueDescriptor[];
|
|
15
|
+
/** Cue blocks skipped as malformed; surfaced as a warning, never an error. */
|
|
16
|
+
readonly skipped: number;
|
|
17
|
+
}
|
|
18
|
+
export declare function parseVtt(text: string): VttParseResult;
|
|
19
|
+
//# sourceMappingURL=parse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../../src/stages/text-webvtt/parse.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAE7D,yDAAyD;AACzD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAK1D;AAWD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,SAAS,aAAa,EAAE,CAAC;IACxC,8EAA8E;IAC9E,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CA2CrD"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/** `HH:MM:SS.mmm` or `MM:SS.mmm` to seconds, or null. */
|
|
2
|
+
export function parseTimestamp(text) {
|
|
3
|
+
const match = /^(?:(\d+):)?([0-5]\d):([0-5]\d)\.(\d{3})$/.exec(text.trim());
|
|
4
|
+
if (match === null)
|
|
5
|
+
return null;
|
|
6
|
+
const [, hours, minutes, seconds, millis] = match;
|
|
7
|
+
return Number(hours ?? 0) * 3600 + Number(minutes) * 60 + Number(seconds) + Number(millis) / 1000;
|
|
8
|
+
}
|
|
9
|
+
/** djb2 over the cue text; enough identity for dedup, not cryptography. */
|
|
10
|
+
function hash(text) {
|
|
11
|
+
let value = 5381;
|
|
12
|
+
for (let i = 0; i < text.length; i += 1) {
|
|
13
|
+
value = ((value << 5) + value + text.charCodeAt(i)) >>> 0;
|
|
14
|
+
}
|
|
15
|
+
return value.toString(36);
|
|
16
|
+
}
|
|
17
|
+
export function parseVtt(text) {
|
|
18
|
+
// Strip a BOM; the signature check is on the first line proper.
|
|
19
|
+
const body = text.charCodeAt(0) === 0xfeff ? text.slice(1) : text;
|
|
20
|
+
if (!body.startsWith('WEBVTT'))
|
|
21
|
+
return { cues: [], skipped: 0 };
|
|
22
|
+
const cues = [];
|
|
23
|
+
let skipped = 0;
|
|
24
|
+
// Blocks separated by blank lines; the first block is the header.
|
|
25
|
+
const blocks = body.split(/\r?\n\r?\n/).slice(1);
|
|
26
|
+
for (const block of blocks) {
|
|
27
|
+
const lines = block.split(/\r?\n/).filter((line) => line !== '');
|
|
28
|
+
if (lines.length === 0)
|
|
29
|
+
continue;
|
|
30
|
+
const first = lines[0];
|
|
31
|
+
if (first.startsWith('NOTE') || first.startsWith('STYLE') || first.startsWith('REGION')) {
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
// An optional id line precedes the timing line.
|
|
35
|
+
const timingIndex = lines.findIndex((line) => line.includes('-->'));
|
|
36
|
+
if (timingIndex === -1 || timingIndex > 1) {
|
|
37
|
+
skipped += 1;
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
const id = timingIndex === 1 ? first : undefined;
|
|
41
|
+
const timing = lines[timingIndex];
|
|
42
|
+
const [startText, rest] = timing.split('-->');
|
|
43
|
+
const settingsMatch = (rest ?? '').trim().split(/\s+/);
|
|
44
|
+
const start = parseTimestamp(startText ?? '');
|
|
45
|
+
const end = parseTimestamp(settingsMatch[0] ?? '');
|
|
46
|
+
if (start === null || end === null || end <= start) {
|
|
47
|
+
skipped += 1;
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
const settings = settingsMatch.slice(1).join(' ');
|
|
51
|
+
const cueText = lines.slice(timingIndex + 1).join('\n');
|
|
52
|
+
cues.push({
|
|
53
|
+
id: id ?? `${Math.round(start * 1000)}-${Math.round(end * 1000)}-${hash(cueText)}`,
|
|
54
|
+
start,
|
|
55
|
+
end,
|
|
56
|
+
text: cueText,
|
|
57
|
+
...(settings !== '' ? { settings } : {}),
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
return { cues, skipped };
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=parse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.js","sourceRoot":"","sources":["../../../src/stages/text-webvtt/parse.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Stage } from '../../types/stage.js';
|
|
2
|
+
/** Applies the segment's X-TIMESTAMP-MAP to every cue timing, in text. */
|
|
3
|
+
export declare function shiftTimestampMap(text: string): string;
|
|
4
|
+
export default function textWebvttSegmented(): Stage;
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/stages/text-webvtt-segmented/index.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAqBlD,0EAA0E;AAC1E,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAmBtD;AAQD,MAAM,CAAC,OAAO,UAAU,mBAAmB,IAAI,KAAK,CAmBnD"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
const MPEGTS_TIMESCALE = 90_000;
|
|
2
|
+
function timestampToSeconds(text) {
|
|
3
|
+
const [rest, millis] = text.split('.');
|
|
4
|
+
const parts = (rest ?? '').split(':').map(Number);
|
|
5
|
+
const [h, m, s] = parts.length === 3 ? parts : [0, ...parts];
|
|
6
|
+
return (h ?? 0) * 3600 + (m ?? 0) * 60 + (s ?? 0) + Number(millis ?? 0) / 1000;
|
|
7
|
+
}
|
|
8
|
+
function secondsToTimestamp(seconds) {
|
|
9
|
+
const clamped = Math.max(0, seconds);
|
|
10
|
+
const h = Math.floor(clamped / 3600);
|
|
11
|
+
const m = Math.floor((clamped % 3600) / 60);
|
|
12
|
+
const s = Math.floor(clamped % 60);
|
|
13
|
+
const ms = Math.round((clamped - Math.floor(clamped)) * 1000);
|
|
14
|
+
const pad = (value, width) => String(value).padStart(width, '0');
|
|
15
|
+
return `${pad(h, 2)}:${pad(m, 2)}:${pad(s, 2)}.${pad(ms, 3)}`;
|
|
16
|
+
}
|
|
17
|
+
/** Applies the segment's X-TIMESTAMP-MAP to every cue timing, in text. */
|
|
18
|
+
export function shiftTimestampMap(text) {
|
|
19
|
+
const header = /X-TIMESTAMP-MAP=([^\r\n]+)/.exec(text);
|
|
20
|
+
if (header === null)
|
|
21
|
+
return text;
|
|
22
|
+
let local = 0;
|
|
23
|
+
let mpegts = 0;
|
|
24
|
+
for (const part of header[1].split(',')) {
|
|
25
|
+
const [key, value] = splitOnce(part.trim());
|
|
26
|
+
if (key === 'LOCAL')
|
|
27
|
+
local = timestampToSeconds(value);
|
|
28
|
+
if (key === 'MPEGTS')
|
|
29
|
+
mpegts = Number(value);
|
|
30
|
+
}
|
|
31
|
+
const offset = mpegts / MPEGTS_TIMESCALE - local;
|
|
32
|
+
const stripped = text.replace(/X-TIMESTAMP-MAP=[^\r\n]*\r?\n?/, '');
|
|
33
|
+
return stripped.replace(/((?:\d+:)?[0-5]\d:[0-5]\d\.\d{3})(\s+-->\s+)((?:\d+:)?[0-5]\d:[0-5]\d\.\d{3})/g, (_, start, arrow, end) => `${secondsToTimestamp(timestampToSeconds(start) + offset)}${arrow}${secondsToTimestamp(timestampToSeconds(end) + offset)}`);
|
|
34
|
+
}
|
|
35
|
+
function splitOnce(part) {
|
|
36
|
+
const index = part.indexOf(':');
|
|
37
|
+
if (index === -1)
|
|
38
|
+
return [part, ''];
|
|
39
|
+
return [part.slice(0, index), part.slice(index + 1)];
|
|
40
|
+
}
|
|
41
|
+
export default function textWebvttSegmented() {
|
|
42
|
+
return {
|
|
43
|
+
name: 'text-webvtt-segmented',
|
|
44
|
+
provides: ['text-webvtt-segmented'],
|
|
45
|
+
requires: ['text-webvtt'],
|
|
46
|
+
install(ctx) {
|
|
47
|
+
ctx.registerTransform({
|
|
48
|
+
name: 'vtt-timestamp-map',
|
|
49
|
+
// Early: decrypt-class steps use lower orders, parsing happens last.
|
|
50
|
+
order: 50,
|
|
51
|
+
transform(data, meta) {
|
|
52
|
+
if (meta.contentType !== 'text')
|
|
53
|
+
return data;
|
|
54
|
+
const text = new TextDecoder().decode(data);
|
|
55
|
+
if (!text.includes('X-TIMESTAMP-MAP'))
|
|
56
|
+
return data;
|
|
57
|
+
return new TextEncoder().encode(shiftTimestampMap(text));
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/stages/text-webvtt-segmented/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thumbnails: the trick-play images a scrubbing UI shows. The common shape is
|
|
3
|
+
* a WebVTT track whose cues point at sprite-sheet tiles with an #xywh media
|
|
4
|
+
* fragment. This stage parses such a track and answers "which tile covers this
|
|
5
|
+
* time" through `engine.thumbnails`. It fetches through the transport seam, so
|
|
6
|
+
* request hooks (auth, cmcd, steering) apply to the thumbnail track too.
|
|
7
|
+
*
|
|
8
|
+
* It does not auto-discover the track from the manifest; HLS image playlists
|
|
9
|
+
* are a separate parse. The app points it at a track URL, which is what the
|
|
10
|
+
* playground does.
|
|
11
|
+
*/
|
|
12
|
+
import type { Stage } from '../../types/stage.js';
|
|
13
|
+
/** One thumbnail: the tile's image URL and its rectangle within the sprite. */
|
|
14
|
+
export interface Thumbnail {
|
|
15
|
+
readonly url: string;
|
|
16
|
+
readonly start: number;
|
|
17
|
+
readonly end: number;
|
|
18
|
+
readonly x: number;
|
|
19
|
+
readonly y: number;
|
|
20
|
+
readonly width: number;
|
|
21
|
+
readonly height: number;
|
|
22
|
+
}
|
|
23
|
+
/** Parses a WebVTT thumbnail track into tiles, resolving URLs against a base. */
|
|
24
|
+
export declare function parseThumbnailTrack(text: string, baseUrl: string): Thumbnail[];
|
|
25
|
+
export interface ThumbnailsApi {
|
|
26
|
+
/** Fetches and parses a WebVTT thumbnail track at a URL. */
|
|
27
|
+
load(url: string): Promise<number>;
|
|
28
|
+
/** The tile covering a presentation time, or null. */
|
|
29
|
+
at(time: number): Thumbnail | null;
|
|
30
|
+
/** Every parsed tile, in order. */
|
|
31
|
+
readonly all: readonly Thumbnail[];
|
|
32
|
+
}
|
|
33
|
+
export default function thumbnails(): Stage;
|
|
34
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/stages/thumbnails/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAElD,+EAA+E;AAC/E,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAQD,iFAAiF;AACjF,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,CAwB9E;AAED,MAAM,WAAW,aAAa;IAC5B,4DAA4D;IAC5D,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACnC,sDAAsD;IACtD,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IACnC,mCAAmC;IACnC,QAAQ,CAAC,GAAG,EAAE,SAAS,SAAS,EAAE,CAAC;CACpC;AAED,MAAM,CAAC,OAAO,UAAU,UAAU,IAAI,KAAK,CAwB1C"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
function timestamp(text) {
|
|
2
|
+
const parts = text.trim().split(':').map(Number);
|
|
3
|
+
const [h, m, s] = parts.length === 3 ? parts : [0, ...parts];
|
|
4
|
+
return (h ?? 0) * 3600 + (m ?? 0) * 60 + (s ?? 0);
|
|
5
|
+
}
|
|
6
|
+
/** Parses a WebVTT thumbnail track into tiles, resolving URLs against a base. */
|
|
7
|
+
export function parseThumbnailTrack(text, baseUrl) {
|
|
8
|
+
const thumbnails = [];
|
|
9
|
+
const blocks = text.replace(/\r/g, '').split('\n\n');
|
|
10
|
+
for (const block of blocks) {
|
|
11
|
+
const lines = block.split('\n').filter((line) => line !== '');
|
|
12
|
+
const timing = lines.find((line) => line.includes('-->'));
|
|
13
|
+
const target = lines.find((line) => !line.includes('-->') && line !== 'WEBVTT' && line !== '');
|
|
14
|
+
if (timing === undefined || target === undefined)
|
|
15
|
+
continue;
|
|
16
|
+
const [from, to] = timing.split('-->');
|
|
17
|
+
const start = timestamp(from ?? '');
|
|
18
|
+
const end = timestamp(to ?? '');
|
|
19
|
+
const [rawUrl, fragment] = target.split('#');
|
|
20
|
+
const url = new URL(rawUrl ?? '', baseUrl).href;
|
|
21
|
+
let [x, y, width, height] = [0, 0, 0, 0];
|
|
22
|
+
const xywh = /xywh=(?:pixel:)?(\d+),(\d+),(\d+),(\d+)/.exec(fragment ?? '');
|
|
23
|
+
if (xywh !== null) {
|
|
24
|
+
x = Number(xywh[1]);
|
|
25
|
+
y = Number(xywh[2]);
|
|
26
|
+
width = Number(xywh[3]);
|
|
27
|
+
height = Number(xywh[4]);
|
|
28
|
+
}
|
|
29
|
+
thumbnails.push({ url, start, end, x, y, width, height });
|
|
30
|
+
}
|
|
31
|
+
return thumbnails;
|
|
32
|
+
}
|
|
33
|
+
export default function thumbnails() {
|
|
34
|
+
return {
|
|
35
|
+
name: 'thumbnails',
|
|
36
|
+
provides: ['thumbnails'],
|
|
37
|
+
requires: ['transport'],
|
|
38
|
+
install(ctx) {
|
|
39
|
+
let tiles = [];
|
|
40
|
+
const api = {
|
|
41
|
+
async load(url) {
|
|
42
|
+
const response = await ctx.request(url, { method: 'GET' });
|
|
43
|
+
const text = await response.text();
|
|
44
|
+
tiles = parseThumbnailTrack(text, url);
|
|
45
|
+
return tiles.length;
|
|
46
|
+
},
|
|
47
|
+
at(time) {
|
|
48
|
+
return tiles.find((tile) => time >= tile.start && time < tile.end) ?? null;
|
|
49
|
+
},
|
|
50
|
+
get all() {
|
|
51
|
+
return tiles;
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
ctx.registerNamespace('thumbnails', api);
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/stages/thumbnails/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The error taxonomy. The native MediaError has four codes; this is the real
|
|
3
|
+
* one. This module imports nothing so that messages can carry errors without
|
|
4
|
+
* a dependency cycle.
|
|
5
|
+
*/
|
|
6
|
+
export type ErrorCategory = 'network' | 'manifest' | 'media' | 'drm' | 'config' | 'internal';
|
|
7
|
+
export type NetworkErrorCode = 'NETWORK_FAILED' | 'NETWORK_TIMEOUT' | 'NETWORK_HTTP_STATUS' | 'NETWORK_ABORTED';
|
|
8
|
+
export type ManifestErrorCode = 'MANIFEST_PARSE_FAILED' | 'MANIFEST_UNSUPPORTED' | 'MANIFEST_EMPTY' | 'MANIFEST_REFRESH_FAILED';
|
|
9
|
+
export type MediaErrorCode = 'MEDIA_APPEND_FAILED' | 'MEDIA_CONTAINER_INVALID' | 'MEDIA_QUOTA_EXCEEDED' | 'MEDIA_CODEC_UNSUPPORTED' | 'MEDIA_DECODE_ERROR' | 'MEDIA_SOURCE_CLOSED';
|
|
10
|
+
export type DrmErrorCode = 'DRM_KEY_SYSTEM_UNAVAILABLE' | 'DRM_LICENSE_FAILED' | 'DRM_KEY_EXPIRED' | 'DRM_KEY_STATUS_ERROR' | 'DRM_OUTPUT_RESTRICTED' | 'DRM_SESSION_FAILED' | 'DRM_INIT_DATA_INVALID';
|
|
11
|
+
export type ConfigErrorCode = 'CONFIG_INVALID' | 'CONFIG_STAGE_REQUIREMENT_MISSING' | 'CONFIG_ELEMENT_OCCUPIED';
|
|
12
|
+
export type InternalErrorCode = 'INTERNAL_ASSERTION';
|
|
13
|
+
export type ErrorCode = NetworkErrorCode | ManifestErrorCode | MediaErrorCode | DrmErrorCode | ConfigErrorCode | InternalErrorCode;
|
|
14
|
+
/**
|
|
15
|
+
* A Mattebox error. Plain data, not an Error subclass, so it can travel in
|
|
16
|
+
* facts and in the trace.
|
|
17
|
+
*/
|
|
18
|
+
export interface MatteboxError {
|
|
19
|
+
readonly category: ErrorCategory;
|
|
20
|
+
readonly code: ErrorCode;
|
|
21
|
+
readonly fatal: boolean;
|
|
22
|
+
/** Whether the `recovery` stage could act on it. */
|
|
23
|
+
readonly recoverable: boolean;
|
|
24
|
+
readonly cause?: unknown;
|
|
25
|
+
readonly context?: Readonly<Record<string, unknown>>;
|
|
26
|
+
/**
|
|
27
|
+
* The diagnostic ring buffer, attached when a fatal error surfaces.
|
|
28
|
+
* Typed loosely here because TraceEntry lives above this module in the
|
|
29
|
+
* type graph; `TracedError` in kernel.ts is the precise shape.
|
|
30
|
+
*/
|
|
31
|
+
readonly trace?: readonly unknown[];
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../src/types/error.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,UAAU,GAAG,OAAO,GAAG,KAAK,GAAG,QAAQ,GAAG,UAAU,CAAC;AAE7F,MAAM,MAAM,gBAAgB,GACxB,gBAAgB,GAChB,iBAAiB,GACjB,qBAAqB,GACrB,iBAAiB,CAAC;AAEtB,MAAM,MAAM,iBAAiB,GACzB,uBAAuB,GACvB,sBAAsB,GACtB,gBAAgB,GAChB,yBAAyB,CAAC;AAE9B,MAAM,MAAM,cAAc,GACtB,qBAAqB,GACrB,yBAAyB,GACzB,sBAAsB,GACtB,yBAAyB,GACzB,oBAAoB,GACpB,qBAAqB,CAAC;AAE1B,MAAM,MAAM,YAAY,GACpB,4BAA4B,GAC5B,oBAAoB,GACpB,iBAAiB,GACjB,sBAAsB,GACtB,uBAAuB,GACvB,oBAAoB,GACpB,uBAAuB,CAAC;AAE5B,MAAM,MAAM,eAAe,GACvB,gBAAgB,GAChB,kCAAkC,GAClC,yBAAyB,CAAC;AAE9B,MAAM,MAAM,iBAAiB,GAAG,oBAAoB,CAAC;AAErD,MAAM,MAAM,SAAS,GACjB,gBAAgB,GAChB,iBAAiB,GACjB,cAAc,GACd,YAAY,GACZ,eAAe,GACf,iBAAiB,CAAC;AAEtB;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IACjC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,oDAAoD;IACpD,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACrD;;;;OAIG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC;CACrC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error.js","sourceRoot":"","sources":["../../src/types/error.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The facade: flat and namespaced. Stages extend it by registering
|
|
3
|
+
* namespaces, never by assigning onto it. The engine never shadows a
|
|
4
|
+
* standard HTMLMediaElement member; `media` hands back the element itself.
|
|
5
|
+
*/
|
|
6
|
+
import type { ContentType, Track, TrackId } from './ir.js';
|
|
7
|
+
import type { KernelConfig, KernelState, TracedError, TraceEntry } from './kernel.js';
|
|
8
|
+
import type { Command } from './messages.js';
|
|
9
|
+
import type { QualityApi } from './quality.js';
|
|
10
|
+
import type { Listener, Stage, TransportRequestDraftView, Unsubscribe } from './stage.js';
|
|
11
|
+
/**
|
|
12
|
+
* Generic track enumeration and selection. Chromium never shipped
|
|
13
|
+
* AudioTrackList, so the engine owns the list and mirrors into native
|
|
14
|
+
* where present.
|
|
15
|
+
*/
|
|
16
|
+
export interface TracksApi {
|
|
17
|
+
readonly available: readonly Track[];
|
|
18
|
+
active(contentType: ContentType): Track | null;
|
|
19
|
+
select(trackId: TrackId): void;
|
|
20
|
+
/** Stops a cue pipeline and clears its cues. Valid for text and metadata; video and audio always keep a selection. */
|
|
21
|
+
deselect(contentType: ContentType): void;
|
|
22
|
+
}
|
|
23
|
+
export interface StatsApi {
|
|
24
|
+
/** Exponentially weighted moving average of measured throughput, in bits per second. */
|
|
25
|
+
readonly throughput: number;
|
|
26
|
+
/** The diagnostic ring buffer, oldest first. Include it in every error report. */
|
|
27
|
+
trace(): readonly TraceEntry[];
|
|
28
|
+
/** The current kernel state, read-only. Diagnosability surface: the playground's panels draw from it. */
|
|
29
|
+
snapshot(): Readonly<KernelState>;
|
|
30
|
+
}
|
|
31
|
+
/** The mutable request draft transport hooks receive. Structural twin of the transport module's type. */
|
|
32
|
+
export type { TransportRequestDraftView } from './stage.js';
|
|
33
|
+
export interface TransportResponseView {
|
|
34
|
+
readonly token: string;
|
|
35
|
+
readonly url: string;
|
|
36
|
+
readonly status: number | null;
|
|
37
|
+
readonly rtt: number;
|
|
38
|
+
readonly size: number;
|
|
39
|
+
readonly outcome: 'success' | 'failure' | 'timeout';
|
|
40
|
+
readonly attempt: number;
|
|
41
|
+
}
|
|
42
|
+
/** Network-layer configuration: hooks and overrides the transport applies. */
|
|
43
|
+
export interface TransportConfig {
|
|
44
|
+
readonly retry?: {
|
|
45
|
+
readonly maxAttempts?: number;
|
|
46
|
+
readonly baseDelayMs?: number;
|
|
47
|
+
readonly factor?: number;
|
|
48
|
+
readonly maxDelayMs?: number;
|
|
49
|
+
readonly retryStatuses?: readonly number[];
|
|
50
|
+
};
|
|
51
|
+
/** Replaces the network entirely: the fault-injection point. */
|
|
52
|
+
readonly fetchImpl?: (url: string, init: RequestInit) => Promise<Response>;
|
|
53
|
+
readonly requestHooks?: ReadonlyArray<(req: TransportRequestDraftView) => void>;
|
|
54
|
+
readonly responseHooks?: ReadonlyArray<(res: TransportResponseView) => void>;
|
|
55
|
+
}
|
|
56
|
+
export interface LoadOptions {
|
|
57
|
+
/**
|
|
58
|
+
* The manifest's MIME type, when the caller knows it. Authoritative: a
|
|
59
|
+
* type no composed adapter accepts fails the load before any fetch with
|
|
60
|
+
* MANIFEST_UNSUPPORTED, and an accepted type routes the bytes to that
|
|
61
|
+
* adapter without sniffing. Omitted, the adapters sniff the bytes.
|
|
62
|
+
*/
|
|
63
|
+
readonly mimeType?: string;
|
|
64
|
+
}
|
|
65
|
+
export interface MatteboxOptions {
|
|
66
|
+
/** Stage factories to install, in order. Omitted means kernel only, which is a complete working player. */
|
|
67
|
+
readonly stages?: readonly Stage[];
|
|
68
|
+
/** Kernel tuning overrides. Every knob has a default. */
|
|
69
|
+
readonly config?: Partial<KernelConfig>;
|
|
70
|
+
/** Network hooks and overrides: cmcd, content steering, fault injection. */
|
|
71
|
+
readonly transport?: TransportConfig;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* The kernel-owned facade surface. Namespaces contributed by stages
|
|
75
|
+
* ('live', 'drm', 'thumbnails', ...) are absent unless the stage is loaded;
|
|
76
|
+
* `'live' in engine` is the feature test. See `Mattebox` in the package
|
|
77
|
+
* entry, which layers the merged namespaces on top of this.
|
|
78
|
+
*/
|
|
79
|
+
export interface MatteboxBase {
|
|
80
|
+
/** The attached element, unwrapped, or null before attach. */
|
|
81
|
+
readonly media: HTMLMediaElement | null;
|
|
82
|
+
readonly quality: QualityApi;
|
|
83
|
+
readonly tracks: TracksApi;
|
|
84
|
+
readonly stats: StatsApi;
|
|
85
|
+
/** The last fatal error, with the trace attached, or null. */
|
|
86
|
+
readonly error: TracedError | null;
|
|
87
|
+
attach(el: HTMLMediaElement): Promise<void>;
|
|
88
|
+
/** Idempotent and safe to call from an error state. */
|
|
89
|
+
detach(): Promise<void>;
|
|
90
|
+
load(url: string, options?: LoadOptions): void;
|
|
91
|
+
unload(): void;
|
|
92
|
+
dispatch(cmd: Command): void;
|
|
93
|
+
/** Every capability the loaded stages provide. */
|
|
94
|
+
capabilities(): Iterable<string>;
|
|
95
|
+
/**
|
|
96
|
+
* Whether a composed adapter parses manifests of this MIME type. Case and
|
|
97
|
+
* parameters are ignored. Pair it with the element's own `canPlayType`
|
|
98
|
+
* to route a source between the engine and native playback; the engine
|
|
99
|
+
* never sets `src` itself.
|
|
100
|
+
*/
|
|
101
|
+
accepts(mimeType: string): boolean;
|
|
102
|
+
on(event: string, fn: Listener): Unsubscribe;
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=facade.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"facade.d.ts","sourceRoot":"","sources":["../../src/types/facade.ts"],"names":[],"mappings":"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"}
|