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,165 @@
|
|
|
1
|
+
//#region src/containers/fmp4/writer.ts
|
|
2
|
+
function fourcc(type) {
|
|
3
|
+
return [
|
|
4
|
+
type.charCodeAt(0),
|
|
5
|
+
type.charCodeAt(1),
|
|
6
|
+
type.charCodeAt(2),
|
|
7
|
+
type.charCodeAt(3)
|
|
8
|
+
];
|
|
9
|
+
}
|
|
10
|
+
/** Concatenates children under a box header. Sizes are computed, never assumed. */
|
|
11
|
+
function box(type, ...children) {
|
|
12
|
+
let length = 8;
|
|
13
|
+
for (const child of children) length += child.byteLength;
|
|
14
|
+
const out = new Uint8Array(length);
|
|
15
|
+
new DataView(out.buffer).setUint32(0, length);
|
|
16
|
+
out.set(fourcc(type), 4);
|
|
17
|
+
let offset = 8;
|
|
18
|
+
for (const child of children) {
|
|
19
|
+
out.set(child, offset);
|
|
20
|
+
offset += child.byteLength;
|
|
21
|
+
}
|
|
22
|
+
return out;
|
|
23
|
+
}
|
|
24
|
+
/** A FullBox: version byte plus 24-bit flags ahead of the payload. */
|
|
25
|
+
function fullBox(type, version, flags, ...children) {
|
|
26
|
+
return box(type, u8(version, flags >> 16 & 255, flags >> 8 & 255, flags & 255), ...children);
|
|
27
|
+
}
|
|
28
|
+
function u8(...values) {
|
|
29
|
+
return Uint8Array.from(values, (v) => v & 255);
|
|
30
|
+
}
|
|
31
|
+
function u16(value) {
|
|
32
|
+
return u8(value >> 8 & 255, value & 255);
|
|
33
|
+
}
|
|
34
|
+
function u32(value) {
|
|
35
|
+
return u8(value >>> 24 & 255, value >> 16 & 255, value >> 8 & 255, value & 255);
|
|
36
|
+
}
|
|
37
|
+
/** A 64-bit unsigned as two 32-bit halves; JS numbers hold this range exactly to 2^53. */
|
|
38
|
+
function u64(value) {
|
|
39
|
+
return concat(u32(Math.floor(value / 4294967296)), u32(value >>> 0));
|
|
40
|
+
}
|
|
41
|
+
function concat(...parts) {
|
|
42
|
+
let length = 0;
|
|
43
|
+
for (const part of parts) length += part.byteLength;
|
|
44
|
+
const out = new Uint8Array(length);
|
|
45
|
+
let offset = 0;
|
|
46
|
+
for (const part of parts) {
|
|
47
|
+
out.set(part, offset);
|
|
48
|
+
offset += part.byteLength;
|
|
49
|
+
}
|
|
50
|
+
return out;
|
|
51
|
+
}
|
|
52
|
+
const UNITY_MATRIX = concat(u32(65536), u32(0), u32(0), u32(0), u32(65536), u32(0), u32(0), u32(0), u32(1073741824));
|
|
53
|
+
function ftyp() {
|
|
54
|
+
return box("ftyp", u8(...fourcc("isom")), u32(512), u8(...fourcc("isom")), u8(...fourcc("iso6")), u8(...fourcc("mp41")));
|
|
55
|
+
}
|
|
56
|
+
function avcC(config) {
|
|
57
|
+
var _sps$, _sps$2, _sps$3;
|
|
58
|
+
const { sps, pps } = config;
|
|
59
|
+
return box("avcC", u8(1, (_sps$ = sps[1]) !== null && _sps$ !== void 0 ? _sps$ : 0, (_sps$2 = sps[2]) !== null && _sps$2 !== void 0 ? _sps$2 : 0, (_sps$3 = sps[3]) !== null && _sps$3 !== void 0 ? _sps$3 : 0), u8(255), u8(225), u16(sps.byteLength), sps, u8(1), u16(pps.byteLength), pps);
|
|
60
|
+
}
|
|
61
|
+
function avc1(config) {
|
|
62
|
+
return box("avc1", u8(0, 0, 0, 0, 0, 0), u16(1), u16(0), u16(0), u32(0), u32(0), u32(0), u16(config.width), u16(config.height), u32(4718592), u32(4718592), u32(0), u16(1), /* @__PURE__ */ new Uint8Array(32), u16(24), u16(65535), avcC(config));
|
|
63
|
+
}
|
|
64
|
+
function esds(config) {
|
|
65
|
+
const asc = u8(config.audioObjectType << 3 | config.samplingFrequencyIndex >> 1, (config.samplingFrequencyIndex & 1) << 7 | config.channelConfig << 3);
|
|
66
|
+
const dsi = concat(u8(5, asc.byteLength), asc);
|
|
67
|
+
const dcd = concat(u8(4, 13 + dsi.byteLength, 64, 21), u8(0, 0, 0), u32(0), u32(0), dsi);
|
|
68
|
+
const sl = u8(6, 1, 2);
|
|
69
|
+
return fullBox("esds", 0, 0, concat(u8(3, 3 + dcd.byteLength + sl.byteLength, 0, 0, 0), dcd, sl));
|
|
70
|
+
}
|
|
71
|
+
function mp4a(config) {
|
|
72
|
+
return box("mp4a", u8(0, 0, 0, 0, 0, 0), u16(1), u32(0), u32(0), u16(config.channelConfig), u16(16), u16(0), u16(0), u32(config.timescale << 16 >>> 0), esds(config));
|
|
73
|
+
}
|
|
74
|
+
function stbl(config) {
|
|
75
|
+
const entry = config.kind === "video" ? avc1(config) : mp4a(config);
|
|
76
|
+
return box("stbl", fullBox("stsd", 0, 0, u32(1), entry), fullBox("stts", 0, 0, u32(0)), fullBox("stsc", 0, 0, u32(0)), fullBox("stsz", 0, 0, u32(0), u32(0)), fullBox("stco", 0, 0, u32(0)));
|
|
77
|
+
}
|
|
78
|
+
function minf(config) {
|
|
79
|
+
return box("minf", config.kind === "video" ? fullBox("vmhd", 0, 1, u16(0), u16(0), u16(0), u16(0)) : fullBox("smhd", 0, 0, u16(0), u16(0)), box("dinf", fullBox("dref", 0, 0, u32(1), fullBox("url ", 0, 1))), stbl(config));
|
|
80
|
+
}
|
|
81
|
+
function hdlr(config) {
|
|
82
|
+
const handler = config.kind === "video" ? "vide" : "soun";
|
|
83
|
+
const name = config.kind === "video" ? "VideoHandler" : "SoundHandler";
|
|
84
|
+
return fullBox("hdlr", 0, 0, u32(0), u8(...fourcc(handler)), u32(0), u32(0), u32(0), concat(u8(...[...name].map((c) => c.charCodeAt(0))), u8(0)));
|
|
85
|
+
}
|
|
86
|
+
function mdia(config) {
|
|
87
|
+
return box("mdia", fullBox("mdhd", 0, 0, u32(0), u32(0), u32(config.timescale), u32(0), u16(21956), u16(0)), hdlr(config), minf(config));
|
|
88
|
+
}
|
|
89
|
+
function tkhd(config) {
|
|
90
|
+
const w = config.kind === "video" ? config.width : 0;
|
|
91
|
+
const h = config.kind === "video" ? config.height : 0;
|
|
92
|
+
return fullBox("tkhd", 0, 7, u32(0), u32(0), u32(config.id), u32(0), u32(0), u32(0), u32(0), u16(0), u16(0), u16(config.kind === "audio" ? 256 : 0), u16(0), UNITY_MATRIX, u32(w << 16 >>> 0), u32(h << 16 >>> 0));
|
|
93
|
+
}
|
|
94
|
+
function trak(config) {
|
|
95
|
+
return box("trak", tkhd(config), mdia(config));
|
|
96
|
+
}
|
|
97
|
+
function mvhd(nextTrackId) {
|
|
98
|
+
return fullBox("mvhd", 0, 0, u32(0), u32(0), u32(9e4), u32(0), u32(65536), u16(256), u16(0), u32(0), u32(0), UNITY_MATRIX, concat(u32(0), u32(0), u32(0), u32(0), u32(0), u32(0)), u32(nextTrackId));
|
|
99
|
+
}
|
|
100
|
+
function mvex(configs) {
|
|
101
|
+
return box("mvex", ...configs.map((config) => fullBox("trex", 0, 0, u32(config.id), u32(1), u32(0), u32(0), u32(0))));
|
|
102
|
+
}
|
|
103
|
+
/** The init segment: ftyp then a moov describing every track. */
|
|
104
|
+
function writeInitSegment(configs) {
|
|
105
|
+
let maxId = 0;
|
|
106
|
+
for (const config of configs) maxId = Math.max(maxId, config.id);
|
|
107
|
+
const moov = box("moov", mvhd(maxId + 1), ...configs.map(trak), mvex(configs));
|
|
108
|
+
return concat(ftyp(), moov);
|
|
109
|
+
}
|
|
110
|
+
const TRUN_FLAGS = 3841;
|
|
111
|
+
const TFHD_FLAGS = 131072;
|
|
112
|
+
function sampleFlags(sample) {
|
|
113
|
+
return sample.isKeyframe ? 33554432 : 16842752;
|
|
114
|
+
}
|
|
115
|
+
function traf(fragment, trunHead) {
|
|
116
|
+
const tfhd = fullBox("tfhd", 0, TFHD_FLAGS, u32(fragment.trackId));
|
|
117
|
+
const tfdt = fullBox("tfdt", 1, 0, u64(fragment.baseMediaDecodeTime));
|
|
118
|
+
const entries = new Uint8Array(fragment.samples.length * 16);
|
|
119
|
+
const view = new DataView(entries.buffer);
|
|
120
|
+
for (let i = 0; i < fragment.samples.length; i += 1) {
|
|
121
|
+
const sample = fragment.samples[i];
|
|
122
|
+
const base = i * 16;
|
|
123
|
+
view.setUint32(base, sample.duration);
|
|
124
|
+
view.setUint32(base + 4, sample.data.byteLength);
|
|
125
|
+
view.setUint32(base + 8, sampleFlags(sample));
|
|
126
|
+
view.setUint32(base + 12, sample.cts);
|
|
127
|
+
}
|
|
128
|
+
return box("traf", tfhd, tfdt, fullBox("trun", 1, TRUN_FLAGS, trunHead, entries));
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* The moof/mdat pair for one or more track fragments. Each trun's data offset
|
|
132
|
+
* is back-patched once the moof size is known, so the offsets are exact
|
|
133
|
+
* regardless of how many tracks the fragment carries or how large the trafs
|
|
134
|
+
* grew. The mdat interleaves tracks in the order given.
|
|
135
|
+
*/
|
|
136
|
+
function writeMediaSegment(sequenceNumber, fragments) {
|
|
137
|
+
const mfhd = fullBox("mfhd", 0, 0, u32(sequenceNumber));
|
|
138
|
+
const trafs = fragments.map((fragment) => traf(fragment, concat(u32(fragment.samples.length), u32(0))));
|
|
139
|
+
const moof = box("moof", mfhd, ...trafs);
|
|
140
|
+
const moofView = new DataView(moof.buffer);
|
|
141
|
+
let trafOffsetInMoof = 8 + mfhd.byteLength;
|
|
142
|
+
let mdatCursor = moof.byteLength + 8;
|
|
143
|
+
for (const [i, fragment] of fragments.entries()) {
|
|
144
|
+
const thisTraf = trafs[i];
|
|
145
|
+
const trunDataOffsetPos = trafOffsetInMoof + 8 + 16 + 20 + 8 + 4 + 4;
|
|
146
|
+
moofView.setUint32(trunDataOffsetPos, mdatCursor);
|
|
147
|
+
let fragmentBytes = 0;
|
|
148
|
+
for (const sample of fragment.samples) fragmentBytes += sample.data.byteLength;
|
|
149
|
+
mdatCursor += fragmentBytes;
|
|
150
|
+
trafOffsetInMoof += thisTraf.byteLength;
|
|
151
|
+
}
|
|
152
|
+
let mdatLength = 0;
|
|
153
|
+
for (const fragment of fragments) for (const sample of fragment.samples) mdatLength += sample.data.byteLength;
|
|
154
|
+
const mdat = new Uint8Array(8 + mdatLength);
|
|
155
|
+
new DataView(mdat.buffer).setUint32(0, mdat.byteLength);
|
|
156
|
+
mdat.set(fourcc("mdat"), 4);
|
|
157
|
+
let offset = 8;
|
|
158
|
+
for (const fragment of fragments) for (const sample of fragment.samples) {
|
|
159
|
+
mdat.set(sample.data, offset);
|
|
160
|
+
offset += sample.data.byteLength;
|
|
161
|
+
}
|
|
162
|
+
return concat(moof, mdat);
|
|
163
|
+
}
|
|
164
|
+
//#endregion
|
|
165
|
+
export { writeInitSegment, writeMediaSegment };
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import _objectSpread2 from "../_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/objectSpread2.js";
|
|
2
|
+
//#region src/containers/id3.ts
|
|
3
|
+
const HEADER_SIZE = 10;
|
|
4
|
+
function isId3(data, offset) {
|
|
5
|
+
return data[offset] === 73 && data[offset + 1] === 68 && data[offset + 2] === 51;
|
|
6
|
+
}
|
|
7
|
+
/** A 28-bit synchsafe integer: four bytes, seven bits each. */
|
|
8
|
+
function synchsafe(data, offset) {
|
|
9
|
+
var _data$offset, _data, _data2, _data3;
|
|
10
|
+
return ((_data$offset = data[offset]) !== null && _data$offset !== void 0 ? _data$offset : 0) << 21 | ((_data = data[offset + 1]) !== null && _data !== void 0 ? _data : 0) << 14 | ((_data2 = data[offset + 2]) !== null && _data2 !== void 0 ? _data2 : 0) << 7 | ((_data3 = data[offset + 3]) !== null && _data3 !== void 0 ? _data3 : 0);
|
|
11
|
+
}
|
|
12
|
+
/** The full byte length of the ID3v2 tag at `offset`, or zero if none is there. */
|
|
13
|
+
function id3TagLength(data, offset = 0) {
|
|
14
|
+
if (offset + HEADER_SIZE > data.byteLength || !isId3(data, offset)) return 0;
|
|
15
|
+
const size = synchsafe(data, offset + 6);
|
|
16
|
+
const total = HEADER_SIZE + size;
|
|
17
|
+
return offset + total <= data.byteLength ? total : 0;
|
|
18
|
+
}
|
|
19
|
+
function frameSize(data, offset, major) {
|
|
20
|
+
var _data$offset2, _data4, _data5, _data6;
|
|
21
|
+
if (major >= 4) return synchsafe(data, offset);
|
|
22
|
+
return ((_data$offset2 = data[offset]) !== null && _data$offset2 !== void 0 ? _data$offset2 : 0) << 24 | ((_data4 = data[offset + 1]) !== null && _data4 !== void 0 ? _data4 : 0) << 16 | ((_data5 = data[offset + 2]) !== null && _data5 !== void 0 ? _data5 : 0) << 8 | ((_data6 = data[offset + 3]) !== null && _data6 !== void 0 ? _data6 : 0);
|
|
23
|
+
}
|
|
24
|
+
/** Parses the frames of one ID3v2 tag. Stops at padding or a bad frame. */
|
|
25
|
+
function parseId3Frames(data, offset = 0) {
|
|
26
|
+
var _data7;
|
|
27
|
+
const total = id3TagLength(data, offset);
|
|
28
|
+
if (total === 0) return [];
|
|
29
|
+
const major = (_data7 = data[offset + 3]) !== null && _data7 !== void 0 ? _data7 : 0;
|
|
30
|
+
const frames = [];
|
|
31
|
+
let cursor = offset + HEADER_SIZE;
|
|
32
|
+
const end = offset + total;
|
|
33
|
+
while (cursor + 10 <= end) {
|
|
34
|
+
var _data$cursor, _data8, _data9, _data10;
|
|
35
|
+
const id = String.fromCharCode((_data$cursor = data[cursor]) !== null && _data$cursor !== void 0 ? _data$cursor : 0, (_data8 = data[cursor + 1]) !== null && _data8 !== void 0 ? _data8 : 0, (_data9 = data[cursor + 2]) !== null && _data9 !== void 0 ? _data9 : 0, (_data10 = data[cursor + 3]) !== null && _data10 !== void 0 ? _data10 : 0);
|
|
36
|
+
if (data[cursor] === 0) break;
|
|
37
|
+
const size = frameSize(data, cursor + 4, major);
|
|
38
|
+
if (size <= 0 || cursor + 10 + size > end) break;
|
|
39
|
+
frames.push({
|
|
40
|
+
id,
|
|
41
|
+
data: data.subarray(cursor + 10, cursor + 10 + size)
|
|
42
|
+
});
|
|
43
|
+
cursor += 10 + size;
|
|
44
|
+
}
|
|
45
|
+
return frames;
|
|
46
|
+
}
|
|
47
|
+
function decodeTextFrame(frame) {
|
|
48
|
+
var _frame$data$;
|
|
49
|
+
const encoding = (_frame$data$ = frame.data[0]) !== null && _frame$data$ !== void 0 ? _frame$data$ : 0;
|
|
50
|
+
const body = frame.data.subarray(1);
|
|
51
|
+
return new TextDecoder(encoding === 1 || encoding === 2 ? "utf-16" : "utf-8").decode(body).replace(/\0+$/, "");
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Turns an ID3 tag's frames into metadata cues at `presentationTime`. Text
|
|
55
|
+
* frames carry their decoded string; every frame keeps its raw bytes on the
|
|
56
|
+
* payload so a consumer can read a format this decoder does not special-case.
|
|
57
|
+
* The cues are zero-length, which is how timed metadata is represented.
|
|
58
|
+
*/
|
|
59
|
+
function id3Cues(data, presentationTime, offset = 0) {
|
|
60
|
+
return parseId3Frames(data, offset).map((frame) => {
|
|
61
|
+
return {
|
|
62
|
+
start: presentationTime,
|
|
63
|
+
end: presentationTime,
|
|
64
|
+
payload: _objectSpread2({
|
|
65
|
+
key: frame.id,
|
|
66
|
+
data: [...frame.data]
|
|
67
|
+
}, frame.id.startsWith("T") || frame.id === "WXXX" ? { value: decodeTextFrame(frame) } : {})
|
|
68
|
+
};
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
//#endregion
|
|
72
|
+
export { id3Cues, id3TagLength, parseId3Frames };
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
//#region src/containers/mp4-box/index.ts
|
|
2
|
+
/** Container boxes the walker descends into. Only ancestors of consumed boxes. */
|
|
3
|
+
const CONTAINERS = /* @__PURE__ */ new Set([
|
|
4
|
+
"moov",
|
|
5
|
+
"trak",
|
|
6
|
+
"mdia",
|
|
7
|
+
"minf",
|
|
8
|
+
"stbl",
|
|
9
|
+
"moof",
|
|
10
|
+
"traf"
|
|
11
|
+
]);
|
|
12
|
+
function malformed(reason, offset) {
|
|
13
|
+
return {
|
|
14
|
+
category: "media",
|
|
15
|
+
code: "MEDIA_CONTAINER_INVALID",
|
|
16
|
+
fatal: false,
|
|
17
|
+
recoverable: false,
|
|
18
|
+
context: {
|
|
19
|
+
reason,
|
|
20
|
+
offset
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
function fourcc(view, offset) {
|
|
25
|
+
return String.fromCharCode(view.getUint8(offset), view.getUint8(offset + 1), view.getUint8(offset + 2), view.getUint8(offset + 3));
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Walks one level plus known containers, depth-first. The visitor sees
|
|
29
|
+
* every box; returning false stops the walk early without error.
|
|
30
|
+
*/
|
|
31
|
+
function walkBoxes(data, visit) {
|
|
32
|
+
const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
|
|
33
|
+
function level(start, end, path) {
|
|
34
|
+
let offset = start;
|
|
35
|
+
while (offset < end) {
|
|
36
|
+
if (end - offset < 8) return malformed("truncated box header", offset);
|
|
37
|
+
let size = view.getUint32(offset);
|
|
38
|
+
let headerSize = 8;
|
|
39
|
+
const type = fourcc(view, offset + 4);
|
|
40
|
+
if (size === 1) {
|
|
41
|
+
if (end - offset < 16) return malformed("truncated 64-bit size", offset);
|
|
42
|
+
const big = view.getBigUint64(offset + 8);
|
|
43
|
+
if (big > BigInt(Number.MAX_SAFE_INTEGER)) return malformed("size overflow", offset);
|
|
44
|
+
size = Number(big);
|
|
45
|
+
headerSize = 16;
|
|
46
|
+
} else if (size === 0) size = end - offset;
|
|
47
|
+
if (size < headerSize) return malformed("box size smaller than header", offset);
|
|
48
|
+
if (offset + size > end) return malformed("box extends past its container", offset);
|
|
49
|
+
const payload = data.subarray(offset + headerSize, offset + size);
|
|
50
|
+
if (visit({
|
|
51
|
+
type,
|
|
52
|
+
start: offset,
|
|
53
|
+
size,
|
|
54
|
+
headerSize,
|
|
55
|
+
payload,
|
|
56
|
+
path
|
|
57
|
+
}) === false) return "stop";
|
|
58
|
+
if (CONTAINERS.has(type)) {
|
|
59
|
+
const nested = level(offset + headerSize, offset + size, path === "" ? type : `${path}/${type}`);
|
|
60
|
+
if (nested !== null) return nested;
|
|
61
|
+
}
|
|
62
|
+
offset += size;
|
|
63
|
+
}
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
const outcome = level(0, data.byteLength, "");
|
|
67
|
+
return { error: outcome === "stop" || outcome === null ? null : outcome };
|
|
68
|
+
}
|
|
69
|
+
/** The first box matching a slash path such as 'moov/trak/mdia/minf/stbl/stsd'. */
|
|
70
|
+
function findBox(data, path) {
|
|
71
|
+
let found = null;
|
|
72
|
+
const parent = path.includes("/") ? path.slice(0, path.lastIndexOf("/")) : "";
|
|
73
|
+
const leaf = path.includes("/") ? path.slice(path.lastIndexOf("/") + 1) : path;
|
|
74
|
+
walkBoxes(data, (box) => {
|
|
75
|
+
if (box.path === parent && box.type === leaf) {
|
|
76
|
+
found = box;
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
return found;
|
|
81
|
+
}
|
|
82
|
+
/** Every box matching the path, in document order. trak repeats, for one. */
|
|
83
|
+
function findBoxes(data, path) {
|
|
84
|
+
const out = [];
|
|
85
|
+
const parent = path.includes("/") ? path.slice(0, path.lastIndexOf("/")) : "";
|
|
86
|
+
const leaf = path.includes("/") ? path.slice(path.lastIndexOf("/") + 1) : path;
|
|
87
|
+
walkBoxes(data, (box) => {
|
|
88
|
+
if (box.path === parent && box.type === leaf) out.push(box);
|
|
89
|
+
});
|
|
90
|
+
return out;
|
|
91
|
+
}
|
|
92
|
+
/** Splits a FullBox payload into version, 24-bit flags, and the body view. */
|
|
93
|
+
function fullBox(payload) {
|
|
94
|
+
if (payload.byteLength < 4) return null;
|
|
95
|
+
return {
|
|
96
|
+
version: payload[0],
|
|
97
|
+
flags: payload[1] << 16 | payload[2] << 8 | payload[3],
|
|
98
|
+
body: payload.subarray(4)
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
/** tfdt: version 1 widens baseMediaDecodeTime to 64 bits. */
|
|
102
|
+
function parseTfdt(payload) {
|
|
103
|
+
const header = fullBox(payload);
|
|
104
|
+
if (header === null) return null;
|
|
105
|
+
const view = new DataView(header.body.buffer, header.body.byteOffset, header.body.byteLength);
|
|
106
|
+
if (header.version === 1) {
|
|
107
|
+
if (header.body.byteLength < 8) return null;
|
|
108
|
+
return {
|
|
109
|
+
version: 1,
|
|
110
|
+
baseMediaDecodeTime: Number(view.getBigUint64(0))
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
if (header.body.byteLength < 4) return null;
|
|
114
|
+
return {
|
|
115
|
+
version: 0,
|
|
116
|
+
baseMediaDecodeTime: view.getUint32(0)
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
/** sidx: version 1 widens the time and offset fields to 64 bits. */
|
|
120
|
+
function parseSidx(payload) {
|
|
121
|
+
const header = fullBox(payload);
|
|
122
|
+
if (header === null) return null;
|
|
123
|
+
const body = header.body;
|
|
124
|
+
const view = new DataView(body.buffer, body.byteOffset, body.byteLength);
|
|
125
|
+
const wide = header.version === 1;
|
|
126
|
+
const fixed = 8 + (wide ? 16 : 8) + 4;
|
|
127
|
+
if (body.byteLength < fixed) return null;
|
|
128
|
+
const referenceId = view.getUint32(0);
|
|
129
|
+
const timescale = view.getUint32(4);
|
|
130
|
+
let at = 8;
|
|
131
|
+
const earliestPresentationTime = wide ? Number(view.getBigUint64(at)) : view.getUint32(at);
|
|
132
|
+
at += wide ? 8 : 4;
|
|
133
|
+
const firstOffset = wide ? Number(view.getBigUint64(at)) : view.getUint32(at);
|
|
134
|
+
at += wide ? 8 : 4;
|
|
135
|
+
at += 2;
|
|
136
|
+
const count = view.getUint16(at);
|
|
137
|
+
at += 2;
|
|
138
|
+
if (body.byteLength < at + count * 12) return null;
|
|
139
|
+
const references = [];
|
|
140
|
+
for (let i = 0; i < count; i += 1) {
|
|
141
|
+
const word = view.getUint32(at);
|
|
142
|
+
references.push({
|
|
143
|
+
referencedSize: word & 2147483647,
|
|
144
|
+
subsegmentDuration: view.getUint32(at + 4),
|
|
145
|
+
startsWithSap: (view.getUint32(at + 8) & 2147483648) !== 0
|
|
146
|
+
});
|
|
147
|
+
at += 12;
|
|
148
|
+
}
|
|
149
|
+
return {
|
|
150
|
+
version: header.version,
|
|
151
|
+
referenceId,
|
|
152
|
+
timescale,
|
|
153
|
+
earliestPresentationTime,
|
|
154
|
+
firstOffset,
|
|
155
|
+
references
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* The media timescale of each track, read from moov/trak (tkhd track id paired
|
|
160
|
+
* with mdhd timescale). CMAF timing normalization needs it to convert a
|
|
161
|
+
* baseMediaDecodeTime between timescale units and seconds.
|
|
162
|
+
*/
|
|
163
|
+
function trackTimescales(init) {
|
|
164
|
+
const map = /* @__PURE__ */ new Map();
|
|
165
|
+
for (const trak of findBoxes(init, "moov/trak")) {
|
|
166
|
+
const tkhd = findBox(trak.payload, "tkhd");
|
|
167
|
+
const mdhd = findBox(trak.payload, "mdia/mdhd");
|
|
168
|
+
if (tkhd === null || mdhd === null) continue;
|
|
169
|
+
const tkView = new DataView(tkhd.payload.buffer, tkhd.payload.byteOffset, tkhd.payload.byteLength);
|
|
170
|
+
const mdView = new DataView(mdhd.payload.buffer, mdhd.payload.byteOffset, mdhd.payload.byteLength);
|
|
171
|
+
const trackAt = tkhd.payload[0] === 1 ? 20 : 12;
|
|
172
|
+
const scaleAt = mdhd.payload[0] === 1 ? 20 : 12;
|
|
173
|
+
if (tkhd.payload.byteLength < trackAt + 4 || mdhd.payload.byteLength < scaleAt + 4) continue;
|
|
174
|
+
const trackId = tkView.getUint32(trackAt);
|
|
175
|
+
const timescale = mdView.getUint32(scaleAt);
|
|
176
|
+
if (timescale > 0) map.set(trackId, timescale);
|
|
177
|
+
}
|
|
178
|
+
return map;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Rewrites every traf's tfdt baseMediaDecodeTime in place so the segment's
|
|
182
|
+
* media clock equals its presentation start. A CMAF live segment carries the
|
|
183
|
+
* real broadcast clock (a huge value); appended with a zero timestampOffset it
|
|
184
|
+
* would land far off the playhead. Normalizing it to `presentationStart` makes
|
|
185
|
+
* the segment land exactly where the manifest places it, the same alignment a
|
|
186
|
+
* TS transmux gives for free. Returns the number of tfdt boxes rewritten.
|
|
187
|
+
*/
|
|
188
|
+
function normalizeTfdt(segment, presentationStart, timescales, fallbackTimescale) {
|
|
189
|
+
let rewritten = 0;
|
|
190
|
+
for (const traf of findBoxes(segment, "moof/traf")) {
|
|
191
|
+
var _ref;
|
|
192
|
+
const tfdt = findBox(traf.payload, "tfdt");
|
|
193
|
+
if (tfdt === null) continue;
|
|
194
|
+
const tfhd = findBox(traf.payload, "tfhd");
|
|
195
|
+
const trackId = tfhd !== null && tfhd.payload.byteLength >= 8 ? new DataView(tfhd.payload.buffer, tfhd.payload.byteOffset, tfhd.payload.byteLength).getUint32(4) : null;
|
|
196
|
+
const timescale = (_ref = trackId !== null ? timescales.get(trackId) : void 0) !== null && _ref !== void 0 ? _ref : fallbackTimescale;
|
|
197
|
+
if (timescale <= 0) continue;
|
|
198
|
+
const target = Math.round(presentationStart * timescale);
|
|
199
|
+
const body = tfdt.payload;
|
|
200
|
+
const view = new DataView(body.buffer, body.byteOffset, body.byteLength);
|
|
201
|
+
if (body[0] === 1) {
|
|
202
|
+
if (body.byteLength >= 12) view.setBigUint64(4, BigInt(target));
|
|
203
|
+
} else if (body.byteLength >= 8) view.setUint32(4, target);
|
|
204
|
+
rewritten += 1;
|
|
205
|
+
}
|
|
206
|
+
return rewritten;
|
|
207
|
+
}
|
|
208
|
+
//#endregion
|
|
209
|
+
export { findBox, findBoxes, fullBox, normalizeTfdt, parseSidx, parseTfdt, trackTimescales, walkBoxes };
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { id3TagLength } from "../id3.js";
|
|
2
|
+
import { SAMPLES_PER_FRAME, parseAdts } from "../adts.js";
|
|
3
|
+
import { writeInitSegment, writeMediaSegment } from "../fmp4/writer.js";
|
|
4
|
+
//#region src/containers/packed-audio/index.ts
|
|
5
|
+
const AUDIO_TRACK_ID = 1;
|
|
6
|
+
const PACK_ORDER = 100;
|
|
7
|
+
/** True when the bytes are bare ADTS AAC, past any leading ID3 tag. */
|
|
8
|
+
function looksLikePackedAudio(data) {
|
|
9
|
+
const offset = id3TagLength(data, 0);
|
|
10
|
+
return offset + 2 <= data.byteLength && data[offset] === 255 && (data[offset + 1] & 246) === 240;
|
|
11
|
+
}
|
|
12
|
+
/** Wraps one packed-audio segment as a self-contained fMP4. Null if unparseable. */
|
|
13
|
+
function packAudio(data, presentationStart) {
|
|
14
|
+
const offset = id3TagLength(data, 0);
|
|
15
|
+
const adts = parseAdts(data.subarray(offset));
|
|
16
|
+
if (adts.frames.length === 0) return null;
|
|
17
|
+
const config = {
|
|
18
|
+
id: AUDIO_TRACK_ID,
|
|
19
|
+
kind: "audio",
|
|
20
|
+
timescale: adts.sampleRate,
|
|
21
|
+
audioObjectType: adts.audioObjectType,
|
|
22
|
+
samplingFrequencyIndex: adts.samplingFrequencyIndex,
|
|
23
|
+
channelConfig: adts.channelConfig
|
|
24
|
+
};
|
|
25
|
+
const samples = adts.frames.map((frame) => ({
|
|
26
|
+
data: frame.data,
|
|
27
|
+
duration: SAMPLES_PER_FRAME,
|
|
28
|
+
cts: 0,
|
|
29
|
+
isKeyframe: true
|
|
30
|
+
}));
|
|
31
|
+
const base = Math.round(presentationStart * adts.sampleRate);
|
|
32
|
+
const sequenceNumber = Math.max(1, Math.round(presentationStart) + 1);
|
|
33
|
+
const init = writeInitSegment([config]);
|
|
34
|
+
const media = writeMediaSegment(sequenceNumber, [{
|
|
35
|
+
trackId: AUDIO_TRACK_ID,
|
|
36
|
+
baseMediaDecodeTime: base,
|
|
37
|
+
samples
|
|
38
|
+
}]);
|
|
39
|
+
const out = new Uint8Array(init.byteLength + media.byteLength);
|
|
40
|
+
out.set(init, 0);
|
|
41
|
+
out.set(media, init.byteLength);
|
|
42
|
+
return out;
|
|
43
|
+
}
|
|
44
|
+
function packedAudio() {
|
|
45
|
+
return {
|
|
46
|
+
name: "packed-audio",
|
|
47
|
+
provides: [
|
|
48
|
+
"packed-audio",
|
|
49
|
+
"media-transform",
|
|
50
|
+
"media-time-normalized"
|
|
51
|
+
],
|
|
52
|
+
install(ctx) {
|
|
53
|
+
ctx.registerTransform({
|
|
54
|
+
name: "packed-audio",
|
|
55
|
+
order: PACK_ORDER,
|
|
56
|
+
transform(data, meta) {
|
|
57
|
+
var _packAudio;
|
|
58
|
+
if (meta.contentType !== "audio") return data;
|
|
59
|
+
if (!looksLikePackedAudio(data)) return data;
|
|
60
|
+
return (_packAudio = packAudio(data, meta.start)) !== null && _packAudio !== void 0 ? _packAudio : data;
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
//#endregion
|
|
67
|
+
export { packedAudio as default, looksLikePackedAudio, packAudio };
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
//#region src/containers/sei.ts
|
|
2
|
+
/** Strips emulation-prevention bytes (00 00 03 -> 00 00) so payload sizes read true. */
|
|
3
|
+
function toRbsp(nal, start) {
|
|
4
|
+
const out = new Uint8Array(nal.byteLength - start);
|
|
5
|
+
let count = 0;
|
|
6
|
+
let zeros = 0;
|
|
7
|
+
for (let i = start; i < nal.byteLength; i += 1) {
|
|
8
|
+
const byte = nal[i];
|
|
9
|
+
if (zeros >= 2 && byte === 3) {
|
|
10
|
+
zeros = 0;
|
|
11
|
+
continue;
|
|
12
|
+
}
|
|
13
|
+
out[count] = byte;
|
|
14
|
+
count += 1;
|
|
15
|
+
zeros = byte === 0 ? zeros + 1 : 0;
|
|
16
|
+
}
|
|
17
|
+
return out.subarray(0, count);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Extracts every CEA-608/708 cc_data triple from one SEI NAL. Returns an empty
|
|
21
|
+
* array for a SEI that carries no ATSC caption user data, and never reads past
|
|
22
|
+
* the buffer: a malformed message stops the walk.
|
|
23
|
+
*/
|
|
24
|
+
function ccTriplesFromSei(seiNal) {
|
|
25
|
+
const rbsp = toRbsp(seiNal, 1);
|
|
26
|
+
const triples = [];
|
|
27
|
+
let offset = 0;
|
|
28
|
+
const length = rbsp.byteLength;
|
|
29
|
+
while (offset < length) {
|
|
30
|
+
let payloadType = 0;
|
|
31
|
+
while (offset < length && rbsp[offset] === 255) {
|
|
32
|
+
payloadType += 255;
|
|
33
|
+
offset += 1;
|
|
34
|
+
}
|
|
35
|
+
if (offset >= length) break;
|
|
36
|
+
payloadType += rbsp[offset];
|
|
37
|
+
offset += 1;
|
|
38
|
+
let payloadSize = 0;
|
|
39
|
+
while (offset < length && rbsp[offset] === 255) {
|
|
40
|
+
payloadSize += 255;
|
|
41
|
+
offset += 1;
|
|
42
|
+
}
|
|
43
|
+
if (offset >= length) break;
|
|
44
|
+
payloadSize += rbsp[offset];
|
|
45
|
+
offset += 1;
|
|
46
|
+
if (offset + payloadSize > length) break;
|
|
47
|
+
if (payloadType === 4) appendAtscCc(rbsp.subarray(offset, offset + payloadSize), triples);
|
|
48
|
+
offset += payloadSize;
|
|
49
|
+
}
|
|
50
|
+
return triples;
|
|
51
|
+
}
|
|
52
|
+
const GA94 = 1195456820;
|
|
53
|
+
function appendAtscCc(payload, out) {
|
|
54
|
+
if (payload.byteLength < 10) return;
|
|
55
|
+
const view = new DataView(payload.buffer, payload.byteOffset, payload.byteLength);
|
|
56
|
+
const country = payload[0];
|
|
57
|
+
const provider = view.getUint16(1);
|
|
58
|
+
const userIdentifier = view.getUint32(3);
|
|
59
|
+
if (country !== 181 || provider !== 49 || userIdentifier !== GA94) return;
|
|
60
|
+
if (payload[7] !== 3) return;
|
|
61
|
+
const ccCount = payload[8] & 31;
|
|
62
|
+
let cursor = 10;
|
|
63
|
+
for (let i = 0; i < ccCount; i += 1) {
|
|
64
|
+
if (cursor + 3 > payload.byteLength) break;
|
|
65
|
+
const flags = payload[cursor];
|
|
66
|
+
const ccValid = (flags & 4) !== 0;
|
|
67
|
+
const ccType = flags & 3;
|
|
68
|
+
const a = payload[cursor + 1];
|
|
69
|
+
const b = payload[cursor + 2];
|
|
70
|
+
cursor += 3;
|
|
71
|
+
if (ccValid) out.push({
|
|
72
|
+
type: ccType,
|
|
73
|
+
a,
|
|
74
|
+
b
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
//#endregion
|
|
79
|
+
export { ccTriplesFromSei };
|