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,211 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* H.264 Annex B to AVCC. The elementary stream separates NAL units with
|
|
3
|
+
* start codes; MSE wants them length-prefixed, with the parameter sets moved
|
|
4
|
+
* into the avcC box instead of the sample data. This module splits NALs,
|
|
5
|
+
* pulls the SPS and PPS, and reads the coded dimensions out of the SPS so
|
|
6
|
+
* the init segment is honest. Exp-Golomb reads are bounded by the bitstream
|
|
7
|
+
* length, so a truncated SPS yields zeroes rather than a runaway loop.
|
|
8
|
+
*/
|
|
9
|
+
export const NAL_TYPE = {
|
|
10
|
+
nonIdrSlice: 1,
|
|
11
|
+
idrSlice: 5,
|
|
12
|
+
sei: 6,
|
|
13
|
+
sps: 7,
|
|
14
|
+
pps: 8,
|
|
15
|
+
accessUnitDelimiter: 9,
|
|
16
|
+
};
|
|
17
|
+
/** Splits an Annex B buffer into raw NAL units, start codes removed. */
|
|
18
|
+
export function splitNalUnits(data) {
|
|
19
|
+
const nals = [];
|
|
20
|
+
const length = data.byteLength;
|
|
21
|
+
let start = -1;
|
|
22
|
+
let i = 0;
|
|
23
|
+
while (i + 2 < length) {
|
|
24
|
+
if (data[i] === 0 && data[i + 1] === 0 && data[i + 2] === 1) {
|
|
25
|
+
if (start !== -1)
|
|
26
|
+
nals.push(data.subarray(start, i));
|
|
27
|
+
i += 3;
|
|
28
|
+
start = i;
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
i += 1;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
if (start !== -1 && start < length)
|
|
35
|
+
nals.push(data.subarray(start, length));
|
|
36
|
+
// NALs are kept whole between start codes. Trailing zero bytes are left in
|
|
37
|
+
// place: a decoder stops at the rbsp_stop bit and ignores what follows, and
|
|
38
|
+
// a slice's CABAC zero words are genuine content that must not be trimmed.
|
|
39
|
+
// Over-trimming the last slice truncates the lower macroblock rows, which is
|
|
40
|
+
// exactly how a multi-slice frame corrupts halfway down.
|
|
41
|
+
return nals.filter((nal) => nal.byteLength > 0);
|
|
42
|
+
}
|
|
43
|
+
export function nalType(nal) {
|
|
44
|
+
return (nal[0] ?? 0) & 0x1f;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Turns one PES payload's NALs into an access unit. Parameter sets are
|
|
48
|
+
* surfaced for the init segment and dropped from the sample; slices and SEI
|
|
49
|
+
* become length-prefixed AVCC. An IDR slice marks the sample as a keyframe.
|
|
50
|
+
*/
|
|
51
|
+
export function toAccessUnit(annexB) {
|
|
52
|
+
return accessUnitFromNals(splitNalUnits(annexB));
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Builds one access unit from its already-split NAL units. Access units do not
|
|
56
|
+
* align with PES packet boundaries in the wild, so the demux splits the whole
|
|
57
|
+
* elementary stream and groups NALs into units by access-unit delimiter; this
|
|
58
|
+
* turns one such group into an AVCC sample.
|
|
59
|
+
*/
|
|
60
|
+
export function accessUnitFromNals(nals) {
|
|
61
|
+
let sps = null;
|
|
62
|
+
let pps = null;
|
|
63
|
+
let isKeyframe = false;
|
|
64
|
+
const sampleNals = [];
|
|
65
|
+
const sei = [];
|
|
66
|
+
for (const nal of nals) {
|
|
67
|
+
const type = nalType(nal);
|
|
68
|
+
if (type === NAL_TYPE.sps)
|
|
69
|
+
sps = nal;
|
|
70
|
+
else if (type === NAL_TYPE.pps)
|
|
71
|
+
pps = nal;
|
|
72
|
+
else if (type === NAL_TYPE.accessUnitDelimiter)
|
|
73
|
+
continue;
|
|
74
|
+
else {
|
|
75
|
+
if (type === NAL_TYPE.idrSlice)
|
|
76
|
+
isKeyframe = true;
|
|
77
|
+
if (type === NAL_TYPE.sei)
|
|
78
|
+
sei.push(nal);
|
|
79
|
+
sampleNals.push(nal);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
let length = 0;
|
|
83
|
+
for (const nal of sampleNals)
|
|
84
|
+
length += 4 + nal.byteLength;
|
|
85
|
+
const avcc = new Uint8Array(length);
|
|
86
|
+
const view = new DataView(avcc.buffer);
|
|
87
|
+
let offset = 0;
|
|
88
|
+
for (const nal of sampleNals) {
|
|
89
|
+
view.setUint32(offset, nal.byteLength);
|
|
90
|
+
avcc.set(nal, offset + 4);
|
|
91
|
+
offset += 4 + nal.byteLength;
|
|
92
|
+
}
|
|
93
|
+
return { avcc, isKeyframe, sps, pps, sei };
|
|
94
|
+
}
|
|
95
|
+
/** Strips H.264 emulation-prevention bytes (00 00 03 -> 00 00) for RBSP reads. */
|
|
96
|
+
function toRbsp(nal) {
|
|
97
|
+
const out = new Uint8Array(nal.byteLength);
|
|
98
|
+
let count = 0;
|
|
99
|
+
let zeros = 0;
|
|
100
|
+
for (let i = 1; i < nal.byteLength; i += 1) {
|
|
101
|
+
const byte = nal[i];
|
|
102
|
+
if (zeros >= 2 && byte === 0x03) {
|
|
103
|
+
zeros = 0;
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
out[count] = byte;
|
|
107
|
+
count += 1;
|
|
108
|
+
zeros = byte === 0 ? zeros + 1 : 0;
|
|
109
|
+
}
|
|
110
|
+
return out.subarray(0, count);
|
|
111
|
+
}
|
|
112
|
+
class BitReader {
|
|
113
|
+
data;
|
|
114
|
+
byte = 0;
|
|
115
|
+
bit = 0;
|
|
116
|
+
constructor(data) {
|
|
117
|
+
this.data = data;
|
|
118
|
+
}
|
|
119
|
+
readBit() {
|
|
120
|
+
if (this.byte >= this.data.byteLength)
|
|
121
|
+
return 0;
|
|
122
|
+
const value = (this.data[this.byte] >> (7 - this.bit)) & 1;
|
|
123
|
+
this.bit += 1;
|
|
124
|
+
if (this.bit === 8) {
|
|
125
|
+
this.bit = 0;
|
|
126
|
+
this.byte += 1;
|
|
127
|
+
}
|
|
128
|
+
return value;
|
|
129
|
+
}
|
|
130
|
+
readBits(count) {
|
|
131
|
+
let value = 0;
|
|
132
|
+
for (let i = 0; i < count; i += 1)
|
|
133
|
+
value = (value << 1) | this.readBit();
|
|
134
|
+
return value >>> 0;
|
|
135
|
+
}
|
|
136
|
+
/** Unsigned Exp-Golomb, bounded so a malformed stream cannot loop forever. */
|
|
137
|
+
readUe() {
|
|
138
|
+
let leadingZeros = 0;
|
|
139
|
+
while (leadingZeros < 32 && this.byte < this.data.byteLength && this.readBit() === 0) {
|
|
140
|
+
leadingZeros += 1;
|
|
141
|
+
}
|
|
142
|
+
if (leadingZeros === 0)
|
|
143
|
+
return 0;
|
|
144
|
+
return (1 << leadingZeros) - 1 + this.readBits(leadingZeros);
|
|
145
|
+
}
|
|
146
|
+
readSe() {
|
|
147
|
+
const value = this.readUe();
|
|
148
|
+
return value & 1 ? (value + 1) >> 1 : -(value >> 1);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
/** Reads coded width and height from an SPS NAL, cropping applied. */
|
|
152
|
+
export function spsDimensions(sps) {
|
|
153
|
+
// toRbsp already drops the one-byte NAL header, so the RBSP begins at
|
|
154
|
+
// profile_idc; reading from there directly keeps every field aligned.
|
|
155
|
+
const reader = new BitReader(toRbsp(sps));
|
|
156
|
+
const profileIdc = reader.readBits(8);
|
|
157
|
+
reader.readBits(8); // constraint flags and reserved
|
|
158
|
+
reader.readBits(8); // level_idc
|
|
159
|
+
reader.readUe(); // seq_parameter_set_id
|
|
160
|
+
let chromaFormat = 1;
|
|
161
|
+
if ([100, 110, 122, 244, 44, 83, 86, 118, 128, 138, 139, 134, 135].includes(profileIdc)) {
|
|
162
|
+
chromaFormat = reader.readUe();
|
|
163
|
+
if (chromaFormat === 3)
|
|
164
|
+
reader.readBits(1);
|
|
165
|
+
reader.readUe(); // bit_depth_luma_minus8
|
|
166
|
+
reader.readUe(); // bit_depth_chroma_minus8
|
|
167
|
+
reader.readBits(1); // qpprime_y_zero_transform_bypass_flag
|
|
168
|
+
if (reader.readBits(1)) {
|
|
169
|
+
// seq_scaling_matrix_present_flag; the lists are skipped, the loop is
|
|
170
|
+
// bounded so a hostile flag cannot spin.
|
|
171
|
+
const count = chromaFormat === 3 ? 12 : 8;
|
|
172
|
+
for (let i = 0; i < count; i += 1)
|
|
173
|
+
if (reader.readBits(1))
|
|
174
|
+
reader.readUe();
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
reader.readUe(); // log2_max_frame_num_minus4
|
|
178
|
+
const picOrderCntType = reader.readUe();
|
|
179
|
+
if (picOrderCntType === 0)
|
|
180
|
+
reader.readUe();
|
|
181
|
+
else if (picOrderCntType === 1) {
|
|
182
|
+
reader.readBits(1);
|
|
183
|
+
reader.readSe();
|
|
184
|
+
reader.readSe();
|
|
185
|
+
const numRefFrames = reader.readUe();
|
|
186
|
+
for (let i = 0; i < numRefFrames && i < 256; i += 1)
|
|
187
|
+
reader.readSe();
|
|
188
|
+
}
|
|
189
|
+
reader.readUe(); // max_num_ref_frames
|
|
190
|
+
reader.readBits(1); // gaps_in_frame_num_value_allowed_flag
|
|
191
|
+
const picWidthInMbs = reader.readUe() + 1;
|
|
192
|
+
const picHeightInMapUnits = reader.readUe() + 1;
|
|
193
|
+
const frameMbsOnly = reader.readBits(1);
|
|
194
|
+
if (frameMbsOnly === 0)
|
|
195
|
+
reader.readBits(1); // mb_adaptive_frame_field_flag
|
|
196
|
+
reader.readBits(1); // direct_8x8_inference_flag
|
|
197
|
+
let cropLeft = 0;
|
|
198
|
+
let cropRight = 0;
|
|
199
|
+
let cropTop = 0;
|
|
200
|
+
let cropBottom = 0;
|
|
201
|
+
if (reader.readBits(1)) {
|
|
202
|
+
cropLeft = reader.readUe();
|
|
203
|
+
cropRight = reader.readUe();
|
|
204
|
+
cropTop = reader.readUe();
|
|
205
|
+
cropBottom = reader.readUe();
|
|
206
|
+
}
|
|
207
|
+
const width = picWidthInMbs * 16 - (cropLeft + cropRight) * 2;
|
|
208
|
+
const height = (2 - frameMbsOnly) * picHeightInMapUnits * 16 - (cropTop + cropBottom) * 2;
|
|
209
|
+
return { width: Math.max(0, width), height: Math.max(0, height) };
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=h264.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"h264.js","sourceRoot":"","sources":["../../../src/containers/ts-transmux/h264.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ts-transmux as a loadable stage. It contributes exactly one thing to the
|
|
3
|
+
* engine: a transform step for MPEG-TS media bytes. The kernel learns nothing
|
|
4
|
+
* about TS. The protocol adapter that fed a `video/mp2t` playlist learns
|
|
5
|
+
* nothing either; the media playlist's segment bytes flow through the same
|
|
6
|
+
* transform pipeline as everything else, and this step rewrites the ones that
|
|
7
|
+
* are transport streams.
|
|
8
|
+
*
|
|
9
|
+
* The `media-transform` capability is what tells the composition root to wire
|
|
10
|
+
* the append path through the transform pipeline; `media-time-normalized`
|
|
11
|
+
* tells the scheduler the rewritten media time equals presentation time. A
|
|
12
|
+
* CMAF composition never provides either, so its append path is untouched.
|
|
13
|
+
*/
|
|
14
|
+
import type { Stage } from '../../types/stage.js';
|
|
15
|
+
import { type TransmuxRunnerOptions } from './runner.js';
|
|
16
|
+
export default function tsTransmux(options?: TransmuxRunnerOptions): Stage;
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/containers/ts-transmux/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAGlD,OAAO,EAAwB,KAAK,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAK/E,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,OAAO,GAAE,qBAA0B,GAAG,KAAK,CAwB7E"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { captionsWanted, deliverCaptions } from '../captions.js';
|
|
2
|
+
import { looksLikeTransportStream } from './demux.js';
|
|
3
|
+
import { createTransmuxRunner } from './runner.js';
|
|
4
|
+
/** Runs after decrypt-class steps (lower order) and before caption extraction. */
|
|
5
|
+
const TRANSMUX_ORDER = 100;
|
|
6
|
+
export default function tsTransmux(options = {}) {
|
|
7
|
+
return {
|
|
8
|
+
name: 'ts-transmux',
|
|
9
|
+
provides: ['ts-transmux', 'media-transform', 'media-time-normalized'],
|
|
10
|
+
install(ctx) {
|
|
11
|
+
const runner = createTransmuxRunner(options);
|
|
12
|
+
ctx.registerTransform({
|
|
13
|
+
name: 'ts-transmux',
|
|
14
|
+
order: TRANSMUX_ORDER,
|
|
15
|
+
async transform(data, meta) {
|
|
16
|
+
// Only media, and only actual transport streams: an fMP4 segment
|
|
17
|
+
// sniffs false and passes straight through, no Worker round-trip.
|
|
18
|
+
if (meta.contentType !== 'video' && meta.contentType !== 'audio')
|
|
19
|
+
return data;
|
|
20
|
+
if (!looksLikeTransportStream(data))
|
|
21
|
+
return data;
|
|
22
|
+
// Only extract SEI captions when a caption stage is loaded, so a
|
|
23
|
+
// caption-free composition pays nothing for them.
|
|
24
|
+
const result = await runner.run(data, meta.start, captionsWanted());
|
|
25
|
+
if (result.captions.length > 0)
|
|
26
|
+
deliverCaptions(result.captions);
|
|
27
|
+
return result.bytes ?? data;
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
return () => runner.dispose();
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/containers/ts-transmux/index.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAA8B,MAAM,aAAa,CAAC;AAE/E,kFAAkF;AAClF,MAAM,cAAc,GAAG,GAAG,CAAC;AAE3B,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,UAAiC,EAAE;IACpE,OAAO;QACL,IAAI,EAAE,aAAa;QACnB,QAAQ,EAAE,CAAC,aAAa,EAAE,iBAAiB,EAAE,uBAAuB,CAAC;QACrE,OAAO,CAAC,GAAG;YACT,MAAM,MAAM,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;YAC7C,GAAG,CAAC,iBAAiB,CAAC;gBACpB,IAAI,EAAE,aAAa;gBACnB,KAAK,EAAE,cAAc;gBACrB,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI;oBACxB,iEAAiE;oBACjE,kEAAkE;oBAClE,IAAI,IAAI,CAAC,WAAW,KAAK,OAAO,IAAI,IAAI,CAAC,WAAW,KAAK,OAAO;wBAAE,OAAO,IAAI,CAAC;oBAC9E,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC;wBAAE,OAAO,IAAI,CAAC;oBACjD,iEAAiE;oBACjE,kDAAkD;oBAClD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;oBACpE,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;wBAAE,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;oBACjE,OAAO,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC;gBAC9B,CAAC;aACF,CAAC,CAAC;YACH,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QAChC,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The boundary between the transform step and where the demux actually runs.
|
|
3
|
+
* A Worker keeps the hot path off the main thread; when the build cannot emit
|
|
4
|
+
* a Worker chunk, or the environment has no Worker, or a custom-URL Worker
|
|
5
|
+
* fails to start, the same pure transmux runs synchronously on the main
|
|
6
|
+
* thread. Both paths call the identical function, so the bytes match whatever
|
|
7
|
+
* route a given browser takes; only the timing differs.
|
|
8
|
+
*/
|
|
9
|
+
import { type TransmuxResult } from './transmux.js';
|
|
10
|
+
export interface TransmuxRunnerOptions {
|
|
11
|
+
/** A custom Worker URL for strict-CSP hosts that serve the chunk themselves. */
|
|
12
|
+
readonly workerUrl?: string | URL;
|
|
13
|
+
/** Forces synchronous main-thread execution; used by tests and headless runs. */
|
|
14
|
+
readonly disableWorker?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export interface TransmuxRunner {
|
|
17
|
+
run(bytes: Uint8Array, presentationStart: number, wantCaptions?: boolean): Promise<TransmuxResult>;
|
|
18
|
+
/** Which path the most recent run took, for diagnostics and the handoff. */
|
|
19
|
+
path(): 'worker' | 'main';
|
|
20
|
+
dispose(): void;
|
|
21
|
+
}
|
|
22
|
+
export declare function createTransmuxRunner(options?: TransmuxRunnerOptions): TransmuxRunner;
|
|
23
|
+
//# sourceMappingURL=runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../src/containers/ts-transmux/runner.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,KAAK,cAAc,EAAY,MAAM,eAAe,CAAC;AAE9D,MAAM,WAAW,qBAAqB;IACpC,gFAAgF;IAChF,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC;IAClC,iFAAiF;IACjF,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;CAClC;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,CACD,KAAK,EAAE,UAAU,EACjB,iBAAiB,EAAE,MAAM,EACzB,YAAY,CAAC,EAAE,OAAO,GACrB,OAAO,CAAC,cAAc,CAAC,CAAC;IAC3B,4EAA4E;IAC5E,IAAI,IAAI,QAAQ,GAAG,MAAM,CAAC;IAC1B,OAAO,IAAI,IAAI,CAAC;CACjB;AAwBD,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,qBAA0B,GAAG,cAAc,CAkFxF"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The boundary between the transform step and where the demux actually runs.
|
|
3
|
+
* A Worker keeps the hot path off the main thread; when the build cannot emit
|
|
4
|
+
* a Worker chunk, or the environment has no Worker, or a custom-URL Worker
|
|
5
|
+
* fails to start, the same pure transmux runs synchronously on the main
|
|
6
|
+
* thread. Both paths call the identical function, so the bytes match whatever
|
|
7
|
+
* route a given browser takes; only the timing differs.
|
|
8
|
+
*/
|
|
9
|
+
import { transmux } from './transmux.js';
|
|
10
|
+
function runOnMainThread(bytes, presentationStart, wantCaptions) {
|
|
11
|
+
return transmux(bytes, presentationStart, wantCaptions);
|
|
12
|
+
}
|
|
13
|
+
export function createTransmuxRunner(options = {}) {
|
|
14
|
+
let worker = null;
|
|
15
|
+
let workerBroken = options.disableWorker === true;
|
|
16
|
+
let lastPath = 'main';
|
|
17
|
+
let nextId = 1;
|
|
18
|
+
const pending = new Map();
|
|
19
|
+
function ensureWorker() {
|
|
20
|
+
if (workerBroken)
|
|
21
|
+
return null;
|
|
22
|
+
if (worker !== null)
|
|
23
|
+
return worker;
|
|
24
|
+
try {
|
|
25
|
+
worker =
|
|
26
|
+
options.workerUrl !== undefined
|
|
27
|
+
? new Worker(options.workerUrl, { type: 'module' })
|
|
28
|
+
: new Worker(new URL('./transmux.worker.js', import.meta.url), { type: 'module' });
|
|
29
|
+
worker.onmessage = (event) => {
|
|
30
|
+
const entry = pending.get(event.data.id);
|
|
31
|
+
if (entry === undefined)
|
|
32
|
+
return;
|
|
33
|
+
pending.delete(event.data.id);
|
|
34
|
+
entry.resolve({
|
|
35
|
+
bytes: event.data.bytes === null ? null : new Uint8Array(event.data.bytes),
|
|
36
|
+
notTransportStream: event.data.notTransportStream,
|
|
37
|
+
empty: event.data.bytes === null && !event.data.notTransportStream,
|
|
38
|
+
captions: event.data.captions,
|
|
39
|
+
});
|
|
40
|
+
};
|
|
41
|
+
worker.onerror = () => {
|
|
42
|
+
// A Worker that fails to start (a 404 on the chunk, a strict CSP) or
|
|
43
|
+
// throws takes every subsequent run onto the main thread, and every
|
|
44
|
+
// request already waiting on it is resolved there rather than left to
|
|
45
|
+
// hang: a broken Worker must never stall the pipeline.
|
|
46
|
+
workerBroken = true;
|
|
47
|
+
worker = null;
|
|
48
|
+
for (const [id, entry] of pending) {
|
|
49
|
+
pending.delete(id);
|
|
50
|
+
entry.resolve(runOnMainThread(entry.bytes, entry.presentationStart, entry.wantCaptions));
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
workerBroken = true;
|
|
56
|
+
worker = null;
|
|
57
|
+
}
|
|
58
|
+
return worker;
|
|
59
|
+
}
|
|
60
|
+
return {
|
|
61
|
+
run(bytes, presentationStart, wantCaptions = false) {
|
|
62
|
+
const active = ensureWorker();
|
|
63
|
+
if (active === null) {
|
|
64
|
+
lastPath = 'main';
|
|
65
|
+
return Promise.resolve(runOnMainThread(bytes, presentationStart, wantCaptions));
|
|
66
|
+
}
|
|
67
|
+
lastPath = 'worker';
|
|
68
|
+
const id = nextId;
|
|
69
|
+
nextId += 1;
|
|
70
|
+
const copy = bytes.slice();
|
|
71
|
+
return new Promise((resolve) => {
|
|
72
|
+
// Keep the inputs on the pending entry so an onerror after this point
|
|
73
|
+
// can resolve it on the main thread rather than hang.
|
|
74
|
+
pending.set(id, { resolve, bytes, presentationStart, wantCaptions });
|
|
75
|
+
try {
|
|
76
|
+
active.postMessage({ id, bytes: copy.buffer, presentationStart, wantCaptions }, [
|
|
77
|
+
copy.buffer,
|
|
78
|
+
]);
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
pending.delete(id);
|
|
82
|
+
workerBroken = true;
|
|
83
|
+
worker = null;
|
|
84
|
+
lastPath = 'main';
|
|
85
|
+
resolve(runOnMainThread(bytes, presentationStart, wantCaptions));
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
},
|
|
89
|
+
path() {
|
|
90
|
+
return lastPath;
|
|
91
|
+
},
|
|
92
|
+
dispose() {
|
|
93
|
+
worker?.terminate();
|
|
94
|
+
worker = null;
|
|
95
|
+
pending.clear();
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../../src/containers/ts-transmux/runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The transmux core: MPEG-TS bytes to a self-contained fragmented MP4. Each
|
|
3
|
+
* call is independent and pure, so identical input plus identical
|
|
4
|
+
* presentation start yields identical output, on the main thread or in the
|
|
5
|
+
* Worker. A muxed segment produces one init with a video and an audio track
|
|
6
|
+
* and one media fragment carrying both, so a single SourceBuffer decodes it.
|
|
7
|
+
*
|
|
8
|
+
* Segment timing is anchored to the playlist presentation start, not the raw
|
|
9
|
+
* PES timestamps: legacy TS streams begin at an arbitrary PTS, and aligning
|
|
10
|
+
* baseMediaDecodeTime to the playlist is what keeps the buffer where the
|
|
11
|
+
* scheduler expects it. Sample durations still come from the PES timeline.
|
|
12
|
+
*/
|
|
13
|
+
import type { CcPacket } from '../captions.js';
|
|
14
|
+
export interface TransmuxResult {
|
|
15
|
+
/** The fMP4 bytes, or null when the input was not a transport stream. */
|
|
16
|
+
readonly bytes: Uint8Array | null;
|
|
17
|
+
readonly notTransportStream: boolean;
|
|
18
|
+
/** True when the stream was TS but carried nothing playable. */
|
|
19
|
+
readonly empty: boolean;
|
|
20
|
+
/** CEA-608/708 caption packets from the video SEI, when captions were requested. */
|
|
21
|
+
readonly captions: readonly CcPacket[];
|
|
22
|
+
}
|
|
23
|
+
export declare function transmux(input: Uint8Array, presentationStart?: number, wantCaptions?: boolean): TransmuxResult;
|
|
24
|
+
//# sourceMappingURL=transmux.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transmux.d.ts","sourceRoot":"","sources":["../../../src/containers/ts-transmux/transmux.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AA4B/C,MAAM,WAAW,cAAc;IAC7B,yEAAyE;IACzE,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;IACrC,gEAAgE;IAChE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,oFAAoF;IACpF,QAAQ,CAAC,QAAQ,EAAE,SAAS,QAAQ,EAAE,CAAC;CACxC;AAoLD,wBAAgB,QAAQ,CACtB,KAAK,EAAE,UAAU,EACjB,iBAAiB,SAAI,EACrB,YAAY,UAAQ,GACnB,cAAc,CA+BhB"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The transmux core: MPEG-TS bytes to a self-contained fragmented MP4. Each
|
|
3
|
+
* call is independent and pure, so identical input plus identical
|
|
4
|
+
* presentation start yields identical output, on the main thread or in the
|
|
5
|
+
* Worker. A muxed segment produces one init with a video and an audio track
|
|
6
|
+
* and one media fragment carrying both, so a single SourceBuffer decodes it.
|
|
7
|
+
*
|
|
8
|
+
* Segment timing is anchored to the playlist presentation start, not the raw
|
|
9
|
+
* PES timestamps: legacy TS streams begin at an arbitrary PTS, and aligning
|
|
10
|
+
* baseMediaDecodeTime to the playlist is what keeps the buffer where the
|
|
11
|
+
* scheduler expects it. Sample durations still come from the PES timeline.
|
|
12
|
+
*/
|
|
13
|
+
import { parseAdts } from '../adts.js';
|
|
14
|
+
import { writeInitSegment, writeMediaSegment, } from '../fmp4/writer.js';
|
|
15
|
+
import { ccTriplesFromSei } from '../sei.js';
|
|
16
|
+
import { demux, unrollTimestamps } from './demux.js';
|
|
17
|
+
import { accessUnitFromNals, NAL_TYPE, nalType, splitNalUnits, spsDimensions, toAccessUnit, } from './h264.js';
|
|
18
|
+
const VIDEO_TIMESCALE = 90000;
|
|
19
|
+
const VIDEO_TRACK_ID = 1;
|
|
20
|
+
const AUDIO_TRACK_ID = 2;
|
|
21
|
+
/** Fallback duration for a lone trailing video sample: 30 fps in 90 kHz. */
|
|
22
|
+
const DEFAULT_FRAME_DURATION = 3000;
|
|
23
|
+
function concat(parts) {
|
|
24
|
+
let length = 0;
|
|
25
|
+
for (const part of parts)
|
|
26
|
+
length += part.byteLength;
|
|
27
|
+
const out = new Uint8Array(length);
|
|
28
|
+
let offset = 0;
|
|
29
|
+
for (const part of parts) {
|
|
30
|
+
out.set(part, offset);
|
|
31
|
+
offset += part.byteLength;
|
|
32
|
+
}
|
|
33
|
+
return out;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Reframes video access units. Access units do not align with PES packet
|
|
37
|
+
* boundaries in the wild: a picture's tail spills into the next PES packet,
|
|
38
|
+
* whose header carries the next picture's timestamps. So the elementary stream
|
|
39
|
+
* is concatenated and split into units by access-unit delimiter, and each unit
|
|
40
|
+
* takes the timestamps of the PES packet its delimiter falls in. A stream with
|
|
41
|
+
* no delimiters falls back to one unit per PES, which is correct when the muxer
|
|
42
|
+
* did align them.
|
|
43
|
+
*/
|
|
44
|
+
function frameAccessUnits(packets) {
|
|
45
|
+
let total = 0;
|
|
46
|
+
for (const p of packets)
|
|
47
|
+
total += p.data.byteLength;
|
|
48
|
+
const es = new Uint8Array(total);
|
|
49
|
+
const boundaries = [];
|
|
50
|
+
let offset = 0;
|
|
51
|
+
for (const p of packets) {
|
|
52
|
+
boundaries.push({ offset, pts: p.pts, dts: p.dts });
|
|
53
|
+
es.set(p.data, offset);
|
|
54
|
+
offset += p.data.byteLength;
|
|
55
|
+
}
|
|
56
|
+
const nals = splitNalUnits(es);
|
|
57
|
+
const hasAud = nals.some((n) => nalType(n) === NAL_TYPE.accessUnitDelimiter);
|
|
58
|
+
if (!hasAud) {
|
|
59
|
+
return packets.map((p) => ({ unit: toAccessUnit(p.data), pts: p.pts, dts: p.dts }));
|
|
60
|
+
}
|
|
61
|
+
const framed = [];
|
|
62
|
+
let group = [];
|
|
63
|
+
let groupOffset = 0;
|
|
64
|
+
let boundaryIndex = 0;
|
|
65
|
+
const flush = () => {
|
|
66
|
+
if (group.length === 0)
|
|
67
|
+
return;
|
|
68
|
+
// Advance to the PES packet whose payload contains this unit's delimiter.
|
|
69
|
+
while (boundaryIndex + 1 < boundaries.length &&
|
|
70
|
+
boundaries[boundaryIndex + 1].offset <= groupOffset) {
|
|
71
|
+
boundaryIndex += 1;
|
|
72
|
+
}
|
|
73
|
+
const b = boundaries[boundaryIndex];
|
|
74
|
+
framed.push({ unit: accessUnitFromNals(group), pts: b.pts, dts: b.dts });
|
|
75
|
+
group = [];
|
|
76
|
+
};
|
|
77
|
+
for (const nal of nals) {
|
|
78
|
+
if (nalType(nal) === NAL_TYPE.accessUnitDelimiter && group.length > 0)
|
|
79
|
+
flush();
|
|
80
|
+
if (group.length === 0)
|
|
81
|
+
groupOffset = nal.byteOffset - es.byteOffset;
|
|
82
|
+
group.push(nal);
|
|
83
|
+
}
|
|
84
|
+
flush();
|
|
85
|
+
return framed;
|
|
86
|
+
}
|
|
87
|
+
function buildVideo(packets, presentationStart, wantCaptions) {
|
|
88
|
+
if (packets.length === 0)
|
|
89
|
+
return null;
|
|
90
|
+
const framed = frameAccessUnits(packets);
|
|
91
|
+
const units = framed.map((f) => f.unit);
|
|
92
|
+
let sps = null;
|
|
93
|
+
let pps = null;
|
|
94
|
+
for (const unit of units) {
|
|
95
|
+
if (unit.sps !== null)
|
|
96
|
+
sps = unit.sps;
|
|
97
|
+
if (unit.pps !== null)
|
|
98
|
+
pps = unit.pps;
|
|
99
|
+
}
|
|
100
|
+
// No parameter sets means this segment opened mid-GOP; without them there
|
|
101
|
+
// is no honest init segment. Legacy HLS keys segments to a keyframe, so
|
|
102
|
+
// this is the dirty-stream path, registered for recovery.
|
|
103
|
+
if (sps === null || pps === null)
|
|
104
|
+
return null;
|
|
105
|
+
const dts = unrollTimestamps(framed.map((f) => f.dts));
|
|
106
|
+
const pts = unrollTimestamps(framed.map((f) => f.pts));
|
|
107
|
+
const base = Math.round(presentationStart * VIDEO_TIMESCALE);
|
|
108
|
+
// Captions ride the video SEI; each access unit's triples display at that
|
|
109
|
+
// frame's presentation time, anchored to the playlist start like the media.
|
|
110
|
+
const captions = [];
|
|
111
|
+
if (wantCaptions) {
|
|
112
|
+
const firstPts = pts[0] ?? 0;
|
|
113
|
+
for (let i = 0; i < units.length; i += 1) {
|
|
114
|
+
const unit = units[i];
|
|
115
|
+
if (unit.sei.length === 0)
|
|
116
|
+
continue;
|
|
117
|
+
const triples = unit.sei.flatMap((nal) => ccTriplesFromSei(nal));
|
|
118
|
+
if (triples.length === 0)
|
|
119
|
+
continue;
|
|
120
|
+
const time = presentationStart + (pts[i] - firstPts) / VIDEO_TIMESCALE;
|
|
121
|
+
captions.push({ time, triples });
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
const samples = [];
|
|
125
|
+
for (let i = 0; i < units.length; i += 1) {
|
|
126
|
+
const duration = i + 1 < units.length
|
|
127
|
+
? Math.max(0, dts[i + 1] - dts[i])
|
|
128
|
+
: DEFAULT_FRAME_DURATION;
|
|
129
|
+
samples.push({
|
|
130
|
+
data: units[i].avcc,
|
|
131
|
+
duration: duration || DEFAULT_FRAME_DURATION,
|
|
132
|
+
// Composition time offset, PTS minus DTS. This is negative for a B-frame
|
|
133
|
+
// that decodes after a frame it displays before; the trun is version 1,
|
|
134
|
+
// whose cts field is signed, so the negative value is written and read
|
|
135
|
+
// back correctly. Clamping it here collapses reordered frames onto one
|
|
136
|
+
// presentation time and the decoder loses reference-frame state.
|
|
137
|
+
cts: pts[i] - dts[i],
|
|
138
|
+
isKeyframe: units[i].isKeyframe,
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
const { width, height } = spsDimensions(sps);
|
|
142
|
+
const config = {
|
|
143
|
+
id: VIDEO_TRACK_ID,
|
|
144
|
+
kind: 'video',
|
|
145
|
+
timescale: VIDEO_TIMESCALE,
|
|
146
|
+
sps,
|
|
147
|
+
pps,
|
|
148
|
+
width,
|
|
149
|
+
height,
|
|
150
|
+
};
|
|
151
|
+
return {
|
|
152
|
+
config,
|
|
153
|
+
fragment: { trackId: VIDEO_TRACK_ID, baseMediaDecodeTime: base, samples },
|
|
154
|
+
captions,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
function buildAudio(packets, presentationStart) {
|
|
158
|
+
if (packets.length === 0)
|
|
159
|
+
return null;
|
|
160
|
+
const adts = parseAdts(concat(packets.map((p) => p.data)));
|
|
161
|
+
if (adts.frames.length === 0)
|
|
162
|
+
return null;
|
|
163
|
+
const base = Math.round(presentationStart * adts.sampleRate);
|
|
164
|
+
const samples = adts.frames.map((frame) => ({
|
|
165
|
+
data: frame.data,
|
|
166
|
+
duration: 1024,
|
|
167
|
+
cts: 0,
|
|
168
|
+
isKeyframe: true,
|
|
169
|
+
}));
|
|
170
|
+
const config = {
|
|
171
|
+
id: AUDIO_TRACK_ID,
|
|
172
|
+
kind: 'audio',
|
|
173
|
+
timescale: adts.sampleRate,
|
|
174
|
+
audioObjectType: adts.audioObjectType,
|
|
175
|
+
samplingFrequencyIndex: adts.samplingFrequencyIndex,
|
|
176
|
+
channelConfig: adts.channelConfig,
|
|
177
|
+
};
|
|
178
|
+
return { config, fragment: { trackId: AUDIO_TRACK_ID, baseMediaDecodeTime: base, samples } };
|
|
179
|
+
}
|
|
180
|
+
export function transmux(input, presentationStart = 0, wantCaptions = false) {
|
|
181
|
+
const streams = demux(input);
|
|
182
|
+
if (streams.notTransportStream) {
|
|
183
|
+
return { bytes: null, notTransportStream: true, empty: false, captions: [] };
|
|
184
|
+
}
|
|
185
|
+
const video = buildVideo(streams.video, presentationStart, wantCaptions);
|
|
186
|
+
const audio = buildAudio(streams.audio, presentationStart);
|
|
187
|
+
if (video === null && audio === null) {
|
|
188
|
+
return { bytes: null, notTransportStream: false, empty: true, captions: [] };
|
|
189
|
+
}
|
|
190
|
+
const configs = [];
|
|
191
|
+
const fragments = [];
|
|
192
|
+
if (video !== null) {
|
|
193
|
+
configs.push(video.config);
|
|
194
|
+
fragments.push(video.fragment);
|
|
195
|
+
}
|
|
196
|
+
if (audio !== null) {
|
|
197
|
+
configs.push(audio.config);
|
|
198
|
+
fragments.push(audio.fragment);
|
|
199
|
+
}
|
|
200
|
+
// The mfhd sequence number derives from the presentation start so it is
|
|
201
|
+
// deterministic per segment and rises across a presentation.
|
|
202
|
+
const sequenceNumber = Math.max(1, Math.round(presentationStart) + 1);
|
|
203
|
+
const init = writeInitSegment(configs);
|
|
204
|
+
const media = writeMediaSegment(sequenceNumber, fragments);
|
|
205
|
+
return {
|
|
206
|
+
bytes: concat([init, media]),
|
|
207
|
+
notTransportStream: false,
|
|
208
|
+
empty: false,
|
|
209
|
+
captions: video?.captions ?? [],
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=transmux.js.map
|