@blockcast/mmt-container 0.1.0-main.149f78a4adae
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/README.md +432 -0
- package/dist/.build-stamp +0 -0
- package/dist/__tests__/test-utils.d.ts +71 -0
- package/dist/__tests__/test-utils.d.ts.map +1 -0
- package/dist/align.d.ts +148 -0
- package/dist/align.d.ts.map +1 -0
- package/dist/align.js +88 -0
- package/dist/align.js.map +7 -0
- package/dist/audio-init-parser.d.ts +66 -0
- package/dist/audio-init-parser.d.ts.map +1 -0
- package/dist/audio-init-parser.js +118 -0
- package/dist/audio-init-parser.js.map +7 -0
- package/dist/audio-ring-buffer.d.ts +50 -0
- package/dist/audio-ring-buffer.d.ts.map +1 -0
- package/dist/audio-ring-buffer.js +93 -0
- package/dist/audio-ring-buffer.js.map +7 -0
- package/dist/authored-timing.d.ts +32 -0
- package/dist/authored-timing.d.ts.map +1 -0
- package/dist/authored-timing.js +32 -0
- package/dist/authored-timing.js.map +7 -0
- package/dist/browser-runtime.js +17109 -0
- package/dist/browser-runtime.js.map +7 -0
- package/dist/carp-catalog.d.ts +318 -0
- package/dist/carp-catalog.d.ts.map +1 -0
- package/dist/carp-catalog.js +549 -0
- package/dist/carp-catalog.js.map +7 -0
- package/dist/catalog-fec-params.d.ts +82 -0
- package/dist/catalog-fec-params.d.ts.map +1 -0
- package/dist/catalog-fec-params.js +66 -0
- package/dist/catalog-fec-params.js.map +7 -0
- package/dist/catalog-network-source.d.ts +19 -0
- package/dist/catalog-network-source.d.ts.map +1 -0
- package/dist/catalog-network-source.js +22 -0
- package/dist/catalog-network-source.js.map +7 -0
- package/dist/catalog-validator.d.ts +18 -0
- package/dist/catalog-validator.d.ts.map +1 -0
- package/dist/catalog-validator.js +7747 -0
- package/dist/catalog-validator.js.map +7 -0
- package/dist/cmaf-block-assembler.d.ts +168 -0
- package/dist/cmaf-block-assembler.d.ts.map +1 -0
- package/dist/cmaf-block-assembler.js +1755 -0
- package/dist/cmaf-block-assembler.js.map +7 -0
- package/dist/cmaf-group-batcher.d.ts +38 -0
- package/dist/cmaf-group-batcher.d.ts.map +1 -0
- package/dist/cmaf-group-batcher.js +195 -0
- package/dist/cmaf-group-batcher.js.map +7 -0
- package/dist/cmcd-producer.d.ts +104 -0
- package/dist/cmcd-producer.d.ts.map +1 -0
- package/dist/cmcd-producer.js +207 -0
- package/dist/cmcd-producer.js.map +7 -0
- package/dist/codec-utils.d.ts +235 -0
- package/dist/codec-utils.d.ts.map +1 -0
- package/dist/codec-utils.js +1225 -0
- package/dist/codec-utils.js.map +7 -0
- package/dist/fec-codec.d.ts +32 -0
- package/dist/fec-codec.d.ts.map +1 -0
- package/dist/fec-codec.js +47 -0
- package/dist/fec-codec.js.map +7 -0
- package/dist/fec-manager.d.ts +266 -0
- package/dist/fec-manager.d.ts.map +1 -0
- package/dist/fec-manager.js +1447 -0
- package/dist/fec-manager.js.map +7 -0
- package/dist/fec-starvation-detector.d.ts +59 -0
- package/dist/fec-starvation-detector.d.ts.map +1 -0
- package/dist/fec-starvation-detector.js +75 -0
- package/dist/fec-starvation-detector.js.map +7 -0
- package/dist/fec-worker-setup.d.ts +76 -0
- package/dist/fec-worker-setup.d.ts.map +1 -0
- package/dist/fec-worker-setup.js +603 -0
- package/dist/fec-worker-setup.js.map +7 -0
- package/dist/fmp4-completion.d.ts +30 -0
- package/dist/fmp4-completion.d.ts.map +1 -0
- package/dist/fmp4-completion.js +21 -0
- package/dist/fmp4-completion.js.map +7 -0
- package/dist/fmp4-reader.d.ts +37 -0
- package/dist/fmp4-reader.d.ts.map +1 -0
- package/dist/fmp4-reader.js +100 -0
- package/dist/fmp4-reader.js.map +7 -0
- package/dist/index.d.ts +47 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +330 -0
- package/dist/index.js.map +7 -0
- package/dist/iso-bmff-timing.d.ts +47 -0
- package/dist/iso-bmff-timing.d.ts.map +1 -0
- package/dist/iso-bmff-timing.js +526 -0
- package/dist/iso-bmff-timing.js.map +7 -0
- package/dist/loc.d.ts +68 -0
- package/dist/loc.d.ts.map +1 -0
- package/dist/loc.js +143 -0
- package/dist/loc.js.map +7 -0
- package/dist/manifest-auth-plan.d.ts +30 -0
- package/dist/manifest-auth-plan.d.ts.map +1 -0
- package/dist/manifest-auth-plan.js +1267 -0
- package/dist/manifest-auth-plan.js.map +7 -0
- package/dist/media-router.d.ts +338 -0
- package/dist/media-router.d.ts.map +1 -0
- package/dist/media-router.js +802 -0
- package/dist/media-router.js.map +7 -0
- package/dist/mfu-reassembler.d.ts +264 -0
- package/dist/mfu-reassembler.d.ts.map +1 -0
- package/dist/mfu-reassembler.js +2668 -0
- package/dist/mfu-reassembler.js.map +7 -0
- package/dist/mfu-reassembly-policy.d.ts +24 -0
- package/dist/mfu-reassembly-policy.d.ts.map +1 -0
- package/dist/mfu-reassembly-policy.js +99 -0
- package/dist/mfu-reassembly-policy.js.map +7 -0
- package/dist/mmtp-container-parser.d.ts +304 -0
- package/dist/mmtp-container-parser.d.ts.map +1 -0
- package/dist/mmtp-container-parser.js +5378 -0
- package/dist/mmtp-container-parser.js.map +7 -0
- package/dist/mmtp-container-parser.no-modules.js +7853 -0
- package/dist/mmtp-container-parser.no-modules.js.map +7 -0
- package/dist/mmtp-decode-pipeline.d.ts +96 -0
- package/dist/mmtp-decode-pipeline.d.ts.map +1 -0
- package/dist/mmtp-decode-pipeline.js +5589 -0
- package/dist/mmtp-decode-pipeline.js.map +7 -0
- package/dist/mmtp-router.d.ts +383 -0
- package/dist/mmtp-router.d.ts.map +1 -0
- package/dist/mmtp-router.js +8384 -0
- package/dist/mmtp-router.js.map +7 -0
- package/dist/mmtp-to-cmaf.d.ts +166 -0
- package/dist/mmtp-to-cmaf.d.ts.map +1 -0
- package/dist/mmtp-to-cmaf.js +781 -0
- package/dist/mmtp-to-cmaf.js.map +7 -0
- package/dist/multicast-auth-catalog.d.ts +115 -0
- package/dist/multicast-auth-catalog.d.ts.map +1 -0
- package/dist/multicast-auth-catalog.js +202 -0
- package/dist/multicast-auth-catalog.js.map +7 -0
- package/dist/multicast-input.d.ts +107 -0
- package/dist/multicast-input.d.ts.map +1 -0
- package/dist/multicast-input.js +256 -0
- package/dist/multicast-input.js.map +7 -0
- package/dist/multicast-manager.d.ts +330 -0
- package/dist/multicast-manager.d.ts.map +1 -0
- package/dist/multicast-manager.js +11032 -0
- package/dist/multicast-manager.js.map +7 -0
- package/dist/multicast-transport.d.ts +62 -0
- package/dist/multicast-transport.d.ts.map +1 -0
- package/dist/multicast-transport.js +338 -0
- package/dist/multicast-transport.js.map +7 -0
- package/dist/multicast-unwrap.d.ts +57 -0
- package/dist/multicast-unwrap.d.ts.map +1 -0
- package/dist/multicast-unwrap.js +384 -0
- package/dist/multicast-unwrap.js.map +7 -0
- package/dist/no-modules.d.ts +9 -0
- package/dist/no-modules.d.ts.map +1 -0
- package/dist/no-modules.js +7819 -0
- package/dist/no-modules.js.map +7 -0
- package/dist/phase14-catalog-override.d.ts +126 -0
- package/dist/phase14-catalog-override.d.ts.map +1 -0
- package/dist/phase14-catalog-override.js +155 -0
- package/dist/phase14-catalog-override.js.map +7 -0
- package/dist/repair-fetch.d.ts +58 -0
- package/dist/repair-fetch.d.ts.map +1 -0
- package/dist/repair-fetch.js +117 -0
- package/dist/repair-fetch.js.map +7 -0
- package/dist/sample-combiner.d.ts +182 -0
- package/dist/sample-combiner.d.ts.map +1 -0
- package/dist/sample-combiner.js +571 -0
- package/dist/sample-combiner.js.map +7 -0
- package/dist/signaling.d.ts +29 -0
- package/dist/signaling.d.ts.map +1 -0
- package/dist/signaling.js +232 -0
- package/dist/signaling.js.map +7 -0
- package/dist/source-auth.d.ts +2 -0
- package/dist/source-auth.d.ts.map +1 -0
- package/dist/source-auth.js +1220 -0
- package/dist/source-auth.js.map +7 -0
- package/dist/switching-set-alignment.d.ts +61 -0
- package/dist/switching-set-alignment.d.ts.map +1 -0
- package/dist/switching-set-alignment.js +85 -0
- package/dist/switching-set-alignment.js.map +7 -0
- package/dist/timestamp-codec.d.ts +34 -0
- package/dist/timestamp-codec.d.ts.map +1 -0
- package/dist/timestamp-codec.js +456 -0
- package/dist/timestamp-codec.js.map +7 -0
- package/dist/track-pipeline-setup.d.ts +72 -0
- package/dist/track-pipeline-setup.d.ts.map +1 -0
- package/dist/track-pipeline-setup.js +306 -0
- package/dist/track-pipeline-setup.js.map +7 -0
- package/dist/track-pipeline.d.ts +121 -0
- package/dist/track-pipeline.d.ts.map +1 -0
- package/dist/track-pipeline.js +229 -0
- package/dist/track-pipeline.js.map +7 -0
- package/dist/track-session.d.ts +269 -0
- package/dist/track-session.d.ts.map +1 -0
- package/dist/track-session.js +597 -0
- package/dist/track-session.js.map +7 -0
- package/dist/transport-pool.d.ts +69 -0
- package/dist/transport-pool.d.ts.map +1 -0
- package/dist/transport-pool.js +88 -0
- package/dist/transport-pool.js.map +7 -0
- package/dist/wasm-mfu-reassembler.d.ts +81 -0
- package/dist/wasm-mfu-reassembler.d.ts.map +1 -0
- package/dist/wasm-mfu-reassembler.js +1915 -0
- package/dist/wasm-mfu-reassembler.js.map +7 -0
- package/dist/wasm-mmtp-container-parser.d.ts +10 -0
- package/dist/wasm-mmtp-container-parser.d.ts.map +1 -0
- package/dist/wasm-mmtp-container-parser.js +5635 -0
- package/dist/wasm-mmtp-container-parser.js.map +7 -0
- package/node_modules/@blockcast/fec-worker/README.md +213 -0
- package/node_modules/@blockcast/fec-worker/dist/.build-stamp +0 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.d.ts +80 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.d.ts.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.js +270 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.js.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.d.ts +252 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.d.ts.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.js +11 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.js.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker.d.ts +14 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker.d.ts.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker.js +565 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker.js.map +7 -0
- package/node_modules/@blockcast/fec-worker/dist/index.d.ts +10 -0
- package/node_modules/@blockcast/fec-worker/dist/index.d.ts.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/index.js +8 -0
- package/node_modules/@blockcast/fec-worker/dist/index.js.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.d.ts +20 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.d.ts.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.js +349 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.js.map +7 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.d.ts +104 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.d.ts.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.js +181 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.js.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.d.ts +179 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.d.ts.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.js +47 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.js.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/transfer.d.ts +9 -0
- package/node_modules/@blockcast/fec-worker/dist/transfer.d.ts.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/transfer.js +13 -0
- package/node_modules/@blockcast/fec-worker/dist/transfer.js.map +1 -0
- package/node_modules/@blockcast/fec-worker/package.json +59 -0
- package/node_modules/@blockcast/fec-worker/src/fec-worker-client.ts +309 -0
- package/node_modules/@blockcast/fec-worker/src/fec-worker-types.ts +268 -0
- package/node_modules/@blockcast/fec-worker/src/fec-worker.ts +1048 -0
- package/node_modules/@blockcast/fec-worker/src/index.ts +32 -0
- package/node_modules/@blockcast/fec-worker/src/shred-fec-worker.ts +558 -0
- package/node_modules/@blockcast/fec-worker/src/shred-worker-client.ts +222 -0
- package/node_modules/@blockcast/fec-worker/src/shred-worker-types.ts +194 -0
- package/node_modules/@blockcast/fec-worker/src/transfer.ts +12 -0
- package/node_modules/@blockcast/mmt-alta-parse/README.md +181 -0
- package/node_modules/@blockcast/mmt-alta-parse/dist/.build-stamp +0 -0
- package/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts +57 -0
- package/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-alta-parse/dist/index.js +115 -0
- package/node_modules/@blockcast/mmt-alta-parse/dist/index.js.map +1 -0
- package/node_modules/@blockcast/mmt-alta-parse/package.json +50 -0
- package/node_modules/@blockcast/mmt-alta-parse/src/index.ts +136 -0
- package/node_modules/@blockcast/mmt-base/README.md +120 -0
- package/node_modules/@blockcast/mmt-base/dist/.build-stamp +0 -0
- package/node_modules/@blockcast/mmt-base/dist/index.d.ts +2 -0
- package/node_modules/@blockcast/mmt-base/dist/index.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-base/dist/index.js +2 -0
- package/node_modules/@blockcast/mmt-base/dist/index.js.map +1 -0
- package/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts +275 -0
- package/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-base/dist/mmtp.js +644 -0
- package/node_modules/@blockcast/mmt-base/dist/mmtp.js.map +1 -0
- package/node_modules/@blockcast/mmt-base/package.json +49 -0
- package/node_modules/@blockcast/mmt-base/src/index.ts +1 -0
- package/node_modules/@blockcast/mmt-base/src/mmtp.ts +898 -0
- package/node_modules/@blockcast/mmt-fec/README.md +270 -0
- package/node_modules/@blockcast/mmt-fec/dist/.build-stamp +0 -0
- package/node_modules/@blockcast/mmt-fec/dist/block-manager.d.ts +80 -0
- package/node_modules/@blockcast/mmt-fec/dist/block-manager.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/block-manager.js +294 -0
- package/node_modules/@blockcast/mmt-fec/dist/block-manager.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/block-processor.d.ts +72 -0
- package/node_modules/@blockcast/mmt-fec/dist/block-processor.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/block-processor.js +192 -0
- package/node_modules/@blockcast/mmt-fec/dist/block-processor.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.d.ts +46 -0
- package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.js +96 -0
- package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.d.ts +33 -0
- package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.js +57 -0
- package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.d.ts +185 -0
- package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.js +273 -0
- package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/index.d.ts +22 -0
- package/node_modules/@blockcast/mmt-fec/dist/index.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/index.js +22 -0
- package/node_modules/@blockcast/mmt-fec/dist/index.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.d.ts +20 -0
- package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.js +28 -0
- package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/oti.d.ts +174 -0
- package/node_modules/@blockcast/mmt-fec/dist/oti.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/oti.js +256 -0
- package/node_modules/@blockcast/mmt-fec/dist/oti.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.d.ts +41 -0
- package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.js +81 -0
- package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/README.md +181 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/.build-stamp +0 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts +57 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.js +115 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/package.json +50 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/src/index.ts +136 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/README.md +120 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/.build-stamp +0 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.d.ts +2 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.js +2 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts +275 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.js +644 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/package.json +49 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/index.ts +1 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/mmtp.ts +898 -0
- package/node_modules/@blockcast/mmt-fec/package.json +79 -0
- package/node_modules/@blockcast/mmt-fec/src/block-manager.ts +369 -0
- package/node_modules/@blockcast/mmt-fec/src/block-processor.ts +277 -0
- package/node_modules/@blockcast/mmt-fec/src/cmaf-recovery.ts +127 -0
- package/node_modules/@blockcast/mmt-fec/src/cmaf-symbols.ts +68 -0
- package/node_modules/@blockcast/mmt-fec/src/fec-block-mapper.ts +332 -0
- package/node_modules/@blockcast/mmt-fec/src/index.ts +77 -0
- package/node_modules/@blockcast/mmt-fec/src/loc-symbols.ts +34 -0
- package/node_modules/@blockcast/mmt-fec/src/oti.ts +319 -0
- package/node_modules/@blockcast/mmt-fec/src/reorder-buffer.ts +101 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/.build-stamp +0 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.d.ts +28 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.js +128 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.js.map +1 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/index.d.ts +4 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/index.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/index.js +4 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/index.js.map +1 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.d.ts +37 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.js +179 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.js.map +1 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.d.ts +90 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.js +462 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.js.map +1 -0
- package/node_modules/@blockcast/mmt-manifest-verify/package.json +45 -0
- package/node_modules/@blockcast/mmt-manifest-verify/src/admission.ts +171 -0
- package/node_modules/@blockcast/mmt-manifest-verify/src/index.ts +3 -0
- package/node_modules/@blockcast/mmt-manifest-verify/src/source-auth.ts +230 -0
- package/node_modules/@blockcast/mmt-manifest-verify/src/verifier.ts +636 -0
- package/node_modules/@noble/hashes/LICENSE +21 -0
- package/node_modules/@noble/hashes/README.md +521 -0
- package/node_modules/@noble/hashes/_assert.d.ts +17 -0
- package/node_modules/@noble/hashes/_assert.d.ts.map +1 -0
- package/node_modules/@noble/hashes/_assert.js +18 -0
- package/node_modules/@noble/hashes/_assert.js.map +1 -0
- package/node_modules/@noble/hashes/_blake.d.ts +14 -0
- package/node_modules/@noble/hashes/_blake.d.ts.map +1 -0
- package/node_modules/@noble/hashes/_blake.js +50 -0
- package/node_modules/@noble/hashes/_blake.js.map +1 -0
- package/node_modules/@noble/hashes/_md.d.ts +51 -0
- package/node_modules/@noble/hashes/_md.d.ts.map +1 -0
- package/node_modules/@noble/hashes/_md.js +162 -0
- package/node_modules/@noble/hashes/_md.js.map +1 -0
- package/node_modules/@noble/hashes/_u64.d.ts +55 -0
- package/node_modules/@noble/hashes/_u64.d.ts.map +1 -0
- package/node_modules/@noble/hashes/_u64.js +90 -0
- package/node_modules/@noble/hashes/_u64.js.map +1 -0
- package/node_modules/@noble/hashes/argon2.d.ts +32 -0
- package/node_modules/@noble/hashes/argon2.d.ts.map +1 -0
- package/node_modules/@noble/hashes/argon2.js +401 -0
- package/node_modules/@noble/hashes/argon2.js.map +1 -0
- package/node_modules/@noble/hashes/blake1.d.ts +106 -0
- package/node_modules/@noble/hashes/blake1.d.ts.map +1 -0
- package/node_modules/@noble/hashes/blake1.js +459 -0
- package/node_modules/@noble/hashes/blake1.js.map +1 -0
- package/node_modules/@noble/hashes/blake2.d.ts +116 -0
- package/node_modules/@noble/hashes/blake2.d.ts.map +1 -0
- package/node_modules/@noble/hashes/blake2.js +420 -0
- package/node_modules/@noble/hashes/blake2.js.map +1 -0
- package/node_modules/@noble/hashes/blake2b.d.ts +11 -0
- package/node_modules/@noble/hashes/blake2b.d.ts.map +1 -0
- package/node_modules/@noble/hashes/blake2b.js +14 -0
- package/node_modules/@noble/hashes/blake2b.js.map +1 -0
- package/node_modules/@noble/hashes/blake2s.d.ts +20 -0
- package/node_modules/@noble/hashes/blake2s.d.ts.map +1 -0
- package/node_modules/@noble/hashes/blake2s.js +24 -0
- package/node_modules/@noble/hashes/blake2s.js.map +1 -0
- package/node_modules/@noble/hashes/blake3.d.ts +54 -0
- package/node_modules/@noble/hashes/blake3.d.ts.map +1 -0
- package/node_modules/@noble/hashes/blake3.js +255 -0
- package/node_modules/@noble/hashes/blake3.js.map +1 -0
- package/node_modules/@noble/hashes/crypto.d.ts +2 -0
- package/node_modules/@noble/hashes/crypto.d.ts.map +1 -0
- package/node_modules/@noble/hashes/crypto.js +5 -0
- package/node_modules/@noble/hashes/crypto.js.map +1 -0
- package/node_modules/@noble/hashes/cryptoNode.d.ts +2 -0
- package/node_modules/@noble/hashes/cryptoNode.d.ts.map +1 -0
- package/node_modules/@noble/hashes/cryptoNode.js +18 -0
- package/node_modules/@noble/hashes/cryptoNode.js.map +1 -0
- package/node_modules/@noble/hashes/eskdf.d.ts +47 -0
- package/node_modules/@noble/hashes/eskdf.d.ts.map +1 -0
- package/node_modules/@noble/hashes/eskdf.js +166 -0
- package/node_modules/@noble/hashes/eskdf.js.map +1 -0
- package/node_modules/@noble/hashes/esm/_assert.d.ts +17 -0
- package/node_modules/@noble/hashes/esm/_assert.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/_assert.js +15 -0
- package/node_modules/@noble/hashes/esm/_assert.js.map +1 -0
- package/node_modules/@noble/hashes/esm/_blake.d.ts +14 -0
- package/node_modules/@noble/hashes/esm/_blake.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/_blake.js +45 -0
- package/node_modules/@noble/hashes/esm/_blake.js.map +1 -0
- package/node_modules/@noble/hashes/esm/_md.d.ts +51 -0
- package/node_modules/@noble/hashes/esm/_md.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/_md.js +155 -0
- package/node_modules/@noble/hashes/esm/_md.js.map +1 -0
- package/node_modules/@noble/hashes/esm/_u64.d.ts +55 -0
- package/node_modules/@noble/hashes/esm/_u64.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/_u64.js +67 -0
- package/node_modules/@noble/hashes/esm/_u64.js.map +1 -0
- package/node_modules/@noble/hashes/esm/argon2.d.ts +32 -0
- package/node_modules/@noble/hashes/esm/argon2.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/argon2.js +392 -0
- package/node_modules/@noble/hashes/esm/argon2.js.map +1 -0
- package/node_modules/@noble/hashes/esm/blake1.d.ts +106 -0
- package/node_modules/@noble/hashes/esm/blake1.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/blake1.js +452 -0
- package/node_modules/@noble/hashes/esm/blake1.js.map +1 -0
- package/node_modules/@noble/hashes/esm/blake2.d.ts +116 -0
- package/node_modules/@noble/hashes/esm/blake2.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/blake2.js +413 -0
- package/node_modules/@noble/hashes/esm/blake2.js.map +1 -0
- package/node_modules/@noble/hashes/esm/blake2b.d.ts +11 -0
- package/node_modules/@noble/hashes/esm/blake2b.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/blake2b.js +11 -0
- package/node_modules/@noble/hashes/esm/blake2b.js.map +1 -0
- package/node_modules/@noble/hashes/esm/blake2s.d.ts +20 -0
- package/node_modules/@noble/hashes/esm/blake2s.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/blake2s.js +21 -0
- package/node_modules/@noble/hashes/esm/blake2s.js.map +1 -0
- package/node_modules/@noble/hashes/esm/blake3.d.ts +54 -0
- package/node_modules/@noble/hashes/esm/blake3.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/blake3.js +251 -0
- package/node_modules/@noble/hashes/esm/blake3.js.map +1 -0
- package/node_modules/@noble/hashes/esm/crypto.d.ts +2 -0
- package/node_modules/@noble/hashes/esm/crypto.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/crypto.js +2 -0
- package/node_modules/@noble/hashes/esm/crypto.js.map +1 -0
- package/node_modules/@noble/hashes/esm/cryptoNode.d.ts +2 -0
- package/node_modules/@noble/hashes/esm/cryptoNode.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/cryptoNode.js +15 -0
- package/node_modules/@noble/hashes/esm/cryptoNode.js.map +1 -0
- package/node_modules/@noble/hashes/esm/eskdf.d.ts +47 -0
- package/node_modules/@noble/hashes/esm/eskdf.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/eskdf.js +160 -0
- package/node_modules/@noble/hashes/esm/eskdf.js.map +1 -0
- package/node_modules/@noble/hashes/esm/hkdf.d.ts +36 -0
- package/node_modules/@noble/hashes/esm/hkdf.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/hkdf.js +82 -0
- package/node_modules/@noble/hashes/esm/hkdf.js.map +1 -0
- package/node_modules/@noble/hashes/esm/hmac.d.ts +35 -0
- package/node_modules/@noble/hashes/esm/hmac.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/hmac.js +86 -0
- package/node_modules/@noble/hashes/esm/hmac.js.map +1 -0
- package/node_modules/@noble/hashes/esm/index.d.ts +2 -0
- package/node_modules/@noble/hashes/esm/index.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/index.js +33 -0
- package/node_modules/@noble/hashes/esm/index.js.map +1 -0
- package/node_modules/@noble/hashes/esm/legacy.d.ts +71 -0
- package/node_modules/@noble/hashes/esm/legacy.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/legacy.js +281 -0
- package/node_modules/@noble/hashes/esm/legacy.js.map +1 -0
- package/node_modules/@noble/hashes/esm/package.json +10 -0
- package/node_modules/@noble/hashes/esm/pbkdf2.d.ts +23 -0
- package/node_modules/@noble/hashes/esm/pbkdf2.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/pbkdf2.js +97 -0
- package/node_modules/@noble/hashes/esm/pbkdf2.js.map +1 -0
- package/node_modules/@noble/hashes/esm/ripemd160.d.ts +13 -0
- package/node_modules/@noble/hashes/esm/ripemd160.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/ripemd160.js +13 -0
- package/node_modules/@noble/hashes/esm/ripemd160.js.map +1 -0
- package/node_modules/@noble/hashes/esm/scrypt.d.ts +34 -0
- package/node_modules/@noble/hashes/esm/scrypt.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/scrypt.js +228 -0
- package/node_modules/@noble/hashes/esm/scrypt.js.map +1 -0
- package/node_modules/@noble/hashes/esm/sha1.d.ts +11 -0
- package/node_modules/@noble/hashes/esm/sha1.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/sha1.js +11 -0
- package/node_modules/@noble/hashes/esm/sha1.js.map +1 -0
- package/node_modules/@noble/hashes/esm/sha2.d.ts +159 -0
- package/node_modules/@noble/hashes/esm/sha2.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/sha2.js +375 -0
- package/node_modules/@noble/hashes/esm/sha2.js.map +1 -0
- package/node_modules/@noble/hashes/esm/sha256.d.ts +20 -0
- package/node_modules/@noble/hashes/esm/sha256.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/sha256.js +20 -0
- package/node_modules/@noble/hashes/esm/sha256.js.map +1 -0
- package/node_modules/@noble/hashes/esm/sha3-addons.d.ts +142 -0
- package/node_modules/@noble/hashes/esm/sha3-addons.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/sha3-addons.js +393 -0
- package/node_modules/@noble/hashes/esm/sha3-addons.js.map +1 -0
- package/node_modules/@noble/hashes/esm/sha3.d.ts +53 -0
- package/node_modules/@noble/hashes/esm/sha3.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/sha3.js +234 -0
- package/node_modules/@noble/hashes/esm/sha3.js.map +1 -0
- package/node_modules/@noble/hashes/esm/sha512.d.ts +26 -0
- package/node_modules/@noble/hashes/esm/sha512.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/sha512.js +26 -0
- package/node_modules/@noble/hashes/esm/sha512.js.map +1 -0
- package/node_modules/@noble/hashes/esm/utils.d.ts +161 -0
- package/node_modules/@noble/hashes/esm/utils.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/utils.js +281 -0
- package/node_modules/@noble/hashes/esm/utils.js.map +1 -0
- package/node_modules/@noble/hashes/hkdf.d.ts +36 -0
- package/node_modules/@noble/hashes/hkdf.d.ts.map +1 -0
- package/node_modules/@noble/hashes/hkdf.js +88 -0
- package/node_modules/@noble/hashes/hkdf.js.map +1 -0
- package/node_modules/@noble/hashes/hmac.d.ts +35 -0
- package/node_modules/@noble/hashes/hmac.d.ts.map +1 -0
- package/node_modules/@noble/hashes/hmac.js +91 -0
- package/node_modules/@noble/hashes/hmac.js.map +1 -0
- package/node_modules/@noble/hashes/index.d.ts +1 -0
- package/node_modules/@noble/hashes/index.d.ts.map +1 -0
- package/node_modules/@noble/hashes/index.js +33 -0
- package/node_modules/@noble/hashes/index.js.map +1 -0
- package/node_modules/@noble/hashes/legacy.d.ts +71 -0
- package/node_modules/@noble/hashes/legacy.d.ts.map +1 -0
- package/node_modules/@noble/hashes/legacy.js +287 -0
- package/node_modules/@noble/hashes/legacy.js.map +1 -0
- package/node_modules/@noble/hashes/package.json +266 -0
- package/node_modules/@noble/hashes/pbkdf2.d.ts +23 -0
- package/node_modules/@noble/hashes/pbkdf2.d.ts.map +1 -0
- package/node_modules/@noble/hashes/pbkdf2.js +101 -0
- package/node_modules/@noble/hashes/pbkdf2.js.map +1 -0
- package/node_modules/@noble/hashes/ripemd160.d.ts +13 -0
- package/node_modules/@noble/hashes/ripemd160.d.ts.map +1 -0
- package/node_modules/@noble/hashes/ripemd160.js +16 -0
- package/node_modules/@noble/hashes/ripemd160.js.map +1 -0
- package/node_modules/@noble/hashes/scrypt.d.ts +34 -0
- package/node_modules/@noble/hashes/scrypt.d.ts.map +1 -0
- package/node_modules/@noble/hashes/scrypt.js +232 -0
- package/node_modules/@noble/hashes/scrypt.js.map +1 -0
- package/node_modules/@noble/hashes/sha1.d.ts +11 -0
- package/node_modules/@noble/hashes/sha1.d.ts.map +1 -0
- package/node_modules/@noble/hashes/sha1.js +14 -0
- package/node_modules/@noble/hashes/sha1.js.map +1 -0
- package/node_modules/@noble/hashes/sha2.d.ts +159 -0
- package/node_modules/@noble/hashes/sha2.d.ts.map +1 -0
- package/node_modules/@noble/hashes/sha2.js +384 -0
- package/node_modules/@noble/hashes/sha2.js.map +1 -0
- package/node_modules/@noble/hashes/sha256.d.ts +20 -0
- package/node_modules/@noble/hashes/sha256.d.ts.map +1 -0
- package/node_modules/@noble/hashes/sha256.js +23 -0
- package/node_modules/@noble/hashes/sha256.js.map +1 -0
- package/node_modules/@noble/hashes/sha3-addons.d.ts +142 -0
- package/node_modules/@noble/hashes/sha3-addons.d.ts.map +1 -0
- package/node_modules/@noble/hashes/sha3-addons.js +402 -0
- package/node_modules/@noble/hashes/sha3-addons.js.map +1 -0
- package/node_modules/@noble/hashes/sha3.d.ts +53 -0
- package/node_modules/@noble/hashes/sha3.d.ts.map +1 -0
- package/node_modules/@noble/hashes/sha3.js +239 -0
- package/node_modules/@noble/hashes/sha3.js.map +1 -0
- package/node_modules/@noble/hashes/sha512.d.ts +26 -0
- package/node_modules/@noble/hashes/sha512.d.ts.map +1 -0
- package/node_modules/@noble/hashes/sha512.js +29 -0
- package/node_modules/@noble/hashes/sha512.js.map +1 -0
- package/node_modules/@noble/hashes/src/_assert.ts +22 -0
- package/node_modules/@noble/hashes/src/_blake.ts +50 -0
- package/node_modules/@noble/hashes/src/_md.ts +176 -0
- package/node_modules/@noble/hashes/src/_u64.ts +91 -0
- package/node_modules/@noble/hashes/src/argon2.ts +497 -0
- package/node_modules/@noble/hashes/src/blake1.ts +534 -0
- package/node_modules/@noble/hashes/src/blake2.ts +486 -0
- package/node_modules/@noble/hashes/src/blake2b.ts +10 -0
- package/node_modules/@noble/hashes/src/blake2s.ts +20 -0
- package/node_modules/@noble/hashes/src/blake3.ts +272 -0
- package/node_modules/@noble/hashes/src/crypto.ts +9 -0
- package/node_modules/@noble/hashes/src/cryptoNode.ts +15 -0
- package/node_modules/@noble/hashes/src/eskdf.ts +187 -0
- package/node_modules/@noble/hashes/src/hkdf.ts +88 -0
- package/node_modules/@noble/hashes/src/hmac.ts +94 -0
- package/node_modules/@noble/hashes/src/index.ts +31 -0
- package/node_modules/@noble/hashes/src/legacy.ts +293 -0
- package/node_modules/@noble/hashes/src/pbkdf2.ts +122 -0
- package/node_modules/@noble/hashes/src/ripemd160.ts +12 -0
- package/node_modules/@noble/hashes/src/scrypt.ts +257 -0
- package/node_modules/@noble/hashes/src/sha1.ts +10 -0
- package/node_modules/@noble/hashes/src/sha2.ts +402 -0
- package/node_modules/@noble/hashes/src/sha256.ts +24 -0
- package/node_modules/@noble/hashes/src/sha3-addons.ts +499 -0
- package/node_modules/@noble/hashes/src/sha3.ts +258 -0
- package/node_modules/@noble/hashes/src/sha512.ts +34 -0
- package/node_modules/@noble/hashes/src/utils.ts +395 -0
- package/node_modules/@noble/hashes/utils.d.ts +161 -0
- package/node_modules/@noble/hashes/utils.d.ts.map +1 -0
- package/node_modules/@noble/hashes/utils.js +313 -0
- package/node_modules/@noble/hashes/utils.js.map +1 -0
- package/package.json +203 -0
- package/schemas/catalog.schema.json +283 -0
- package/src/align.ts +235 -0
- package/src/audio-init-parser.ts +189 -0
- package/src/audio-ring-buffer.ts +120 -0
- package/src/authored-timing.ts +63 -0
- package/src/carp-catalog.ts +776 -0
- package/src/catalog-fec-params.ts +167 -0
- package/src/catalog-network-source.ts +49 -0
- package/src/catalog-validator.ts +34 -0
- package/src/cmaf-block-assembler.ts +1058 -0
- package/src/cmaf-group-batcher.ts +104 -0
- package/src/cmcd-producer.ts +329 -0
- package/src/codec-utils.ts +1539 -0
- package/src/fec-codec.ts +61 -0
- package/src/fec-manager.ts +1939 -0
- package/src/fec-starvation-detector.ts +128 -0
- package/src/fec-worker-setup.ts +177 -0
- package/src/fmp4-completion.ts +47 -0
- package/src/fmp4-reader.ts +112 -0
- package/src/index.ts +443 -0
- package/src/iso-bmff-timing.ts +688 -0
- package/src/loc.ts +181 -0
- package/src/manifest-auth-plan.ts +107 -0
- package/src/media-router.ts +1185 -0
- package/src/mfu-reassembler.ts +2842 -0
- package/src/mfu-reassembly-policy.ts +134 -0
- package/src/mmtp-container-parser.ts +1498 -0
- package/src/mmtp-decode-pipeline.ts +315 -0
- package/src/mmtp-router.ts +3027 -0
- package/src/mmtp-to-cmaf.ts +956 -0
- package/src/multicast-auth-catalog.ts +340 -0
- package/src/multicast-input.ts +439 -0
- package/src/multicast-manager.ts +1503 -0
- package/src/multicast-transport.ts +320 -0
- package/src/multicast-unwrap.ts +132 -0
- package/src/no-modules.ts +20 -0
- package/src/phase14-catalog-override.ts +336 -0
- package/src/repair-fetch.ts +217 -0
- package/src/sample-combiner.ts +846 -0
- package/src/signaling.ts +78 -0
- package/src/source-auth.ts +1 -0
- package/src/switching-set-alignment.ts +109 -0
- package/src/timestamp-codec.ts +265 -0
- package/src/track-pipeline-setup.ts +189 -0
- package/src/track-pipeline.ts +332 -0
- package/src/track-session.ts +778 -0
- package/src/transport-pool.ts +128 -0
- package/src/wasm-mfu-reassembler.ts +372 -0
- package/src/wasm-mmtp-container-parser.ts +23 -0
- package/test-vectors/align.json +199 -0
- package/test-vectors/catalog/README.md +25 -0
- package/test-vectors/catalog/negative/legacy-selection-params.json +15 -0
- package/test-vectors/catalog/negative/missing-mmtp-fields.json +12 -0
- package/test-vectors/catalog/negative/multicast-auth-padded-key.json +37 -0
- package/test-vectors/catalog/negative/multicast-auth-reused-track-format.json +53 -0
- package/test-vectors/catalog/negative/multicast-auth-trailing-pad-bits.json +37 -0
- package/test-vectors/catalog/negative/multicast-endpoint-missing-protocol-and-source.json +24 -0
- package/test-vectors/catalog/negative/network-source-object.json +25 -0
- package/test-vectors/catalog/negative/raptorq-unaligned-symbol.json +26 -0
- package/test-vectors/catalog/negative/repair-track-legacy-shape.json +18 -0
- package/test-vectors/catalog/negative/track-role-empty.json +16 -0
- package/test-vectors/catalog/negative/track-role-non-string.json +16 -0
- package/test-vectors/catalog/positive/fec-multicast.json +51 -0
- package/test-vectors/catalog/positive/flat-av.json +30 -0
- package/test-vectors/catalog/positive/multicast-auth-rotation.json +55 -0
- package/test-vectors/catalog/positive/ticks-and-mixed-timescales.json +39 -0
- package/test-vectors/catalog/positive/track-role.json +49 -0
- package/test-vectors/catalog/releases/moqcast-native-v16-v1/catalog.json +65 -0
- package/test-vectors/catalog/releases/moqcast-native-v16-v1.archive.sha256 +1 -0
- package/test-vectors/catalog-multicast-auth-v1.json +26 -0
- package/test-vectors/catalog-validation.json +148 -0
- package/test-vectors/catalog-validator-public-api.mjs +25 -0
- package/test-vectors/generate-source-auth-fixture.mjs +114 -0
- package/test-vectors/source-auth-v1.json +61 -0
- package/test-vectors/subsample-placement-v1.json +230 -0
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FecStarvationDetector — post-cutover source-starvation detection (BLO-9413/D4).
|
|
3
|
+
*
|
|
4
|
+
* The packet-presence watchdog (MulticastTransport, 5s) only catches TOTAL
|
|
5
|
+
* silence: any packet — including FEC repair — resets it. The observed
|
|
6
|
+
* BLO-9413 failure delivered repair symbols continuously while ZERO source
|
|
7
|
+
* symbols arrived (`sourceSymbols:0, repairSymbols:551, blocksComplete:0`):
|
|
8
|
+
* the watchdog stayed fed forever while nothing reconstructable reached the
|
|
9
|
+
* decoder. This detector closes that hole by watching delivery progress and
|
|
10
|
+
* driving the designed-but-previously-uncalled TrackSession loss arcs:
|
|
11
|
+
*
|
|
12
|
+
* starvation sustained ≥ windowMs → onStarvation() → session.lossDetected()
|
|
13
|
+
* block progress resumes → onRecovery() → session.lossRecovered()
|
|
14
|
+
*
|
|
15
|
+
* TrackSession's own FEC block-span hysteresis then decides whether a recovery
|
|
16
|
+
* cancels the failback — this detector deliberately does NOT add a second
|
|
17
|
+
* hysteresis layer.
|
|
18
|
+
*
|
|
19
|
+
* Push-fed: call update() with each FecTrackStats-shaped snapshot (e.g. from
|
|
20
|
+
* MulticastManager.setOnFecStatsUpdate or a host sampler). Hosts that can also
|
|
21
|
+
* observe decoded/appended media should include a monotonic mediaFrames count:
|
|
22
|
+
* media progress is delivery progress even if sparse FEC block counters do not
|
|
23
|
+
* advance in the same sample window. Evaluation happens only on update — a
|
|
24
|
+
* fully dead transport stops producing updates and stays the transport
|
|
25
|
+
* watchdog's responsibility (total-silence backstop).
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
/** Monotonic counters sampled from the FEC layer (FecTrackStats subset). */
|
|
29
|
+
export interface FecStarvationSnapshot {
|
|
30
|
+
sourceSymbols: number
|
|
31
|
+
repairSymbols: number
|
|
32
|
+
blocksComplete: number
|
|
33
|
+
blocksRecovered: number
|
|
34
|
+
/** Optional host-observed decoded/appended media frames for this packetId. */
|
|
35
|
+
mediaFrames?: number
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export interface FecStarvationDetectorConfig {
|
|
39
|
+
/**
|
|
40
|
+
* How long starvation must persist before onStarvation fires. Derive from
|
|
41
|
+
* the stream's FEC block-span config — no magic defaults, matching the
|
|
42
|
+
* TrackSession hysteresis convention.
|
|
43
|
+
*/
|
|
44
|
+
windowMs: number
|
|
45
|
+
/** Starvation sustained ≥ windowMs. Fires once per starvation episode. */
|
|
46
|
+
onStarvation(): void
|
|
47
|
+
/** Healthy delivery resumed after onStarvation fired. Fires once per episode. */
|
|
48
|
+
onRecovery(): void
|
|
49
|
+
/** Injectable clock for tests. Defaults to Date.now. */
|
|
50
|
+
now?: () => number
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export class FecStarvationDetector {
|
|
54
|
+
#config: FecStarvationDetectorConfig
|
|
55
|
+
#now: () => number
|
|
56
|
+
#last: FecStarvationSnapshot | null = null
|
|
57
|
+
#lastSampleAt = 0
|
|
58
|
+
#starvedSince: number | null = null
|
|
59
|
+
#latched = false
|
|
60
|
+
|
|
61
|
+
constructor(config: FecStarvationDetectorConfig) {
|
|
62
|
+
if (config.windowMs <= 0) {
|
|
63
|
+
throw new Error(
|
|
64
|
+
`[FecStarvationDetector] windowMs=${config.windowMs}. Derive a positive window ` +
|
|
65
|
+
`from the stream's FEC block-span config — a non-positive ` +
|
|
66
|
+
`window would fire on the first repair packet of a healthy stream.`
|
|
67
|
+
)
|
|
68
|
+
}
|
|
69
|
+
this.#config = config
|
|
70
|
+
this.#now = config.now ?? Date.now
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/** True while a starvation episode is active (onStarvation fired, no recovery yet). */
|
|
74
|
+
get isStarved(): boolean { return this.#latched }
|
|
75
|
+
|
|
76
|
+
update(snapshot: FecStarvationSnapshot): void {
|
|
77
|
+
const last = this.#last
|
|
78
|
+
const prevSampleAt = this.#lastSampleAt
|
|
79
|
+
const now = this.#now()
|
|
80
|
+
this.#last = { ...snapshot }
|
|
81
|
+
this.#lastSampleAt = now
|
|
82
|
+
if (last === null) return // first sample = baseline only
|
|
83
|
+
|
|
84
|
+
const srcDelta = snapshot.sourceSymbols - last.sourceSymbols
|
|
85
|
+
const repDelta = snapshot.repairSymbols - last.repairSymbols
|
|
86
|
+
const doneDelta =
|
|
87
|
+
(snapshot.blocksComplete - last.blocksComplete) +
|
|
88
|
+
(snapshot.blocksRecovered - last.blocksRecovered)
|
|
89
|
+
const mediaDelta = (snapshot.mediaFrames ?? 0) - (last.mediaFrames ?? 0)
|
|
90
|
+
|
|
91
|
+
const packetsFlowing = srcDelta > 0 || repDelta > 0
|
|
92
|
+
if (!packetsFlowing && mediaDelta <= 0) return // total silence — transport watchdog's domain
|
|
93
|
+
|
|
94
|
+
// Starving: traffic arrives but nothing reconstructable comes out. Source
|
|
95
|
+
// and repair symbols arrive at symbol cadence while complete/recovered
|
|
96
|
+
// blocks arrive at block cadence; requiring source and block deltas in the
|
|
97
|
+
// same snapshot false-fails healthy live streams. A repaired block is still
|
|
98
|
+
// decodable media, and host-observed frame progress is even stronger
|
|
99
|
+
// evidence, so either resets the starvation clock.
|
|
100
|
+
const starving = doneDelta === 0 && mediaDelta <= 0
|
|
101
|
+
|
|
102
|
+
if (starving) {
|
|
103
|
+
// The episode began when delivery was last known healthy — the previous
|
|
104
|
+
// sample's timestamp, not this sample's arrival (the deltas in THIS
|
|
105
|
+
// sample describe the interval since then).
|
|
106
|
+
if (this.#starvedSince === null) this.#starvedSince = prevSampleAt
|
|
107
|
+
if (!this.#latched && now - this.#starvedSince >= this.#config.windowMs) {
|
|
108
|
+
this.#latched = true
|
|
109
|
+
this.#config.onStarvation()
|
|
110
|
+
}
|
|
111
|
+
return
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Healthy sample: completed or recovered blocks are reaching the decoder.
|
|
115
|
+
this.#starvedSince = null
|
|
116
|
+
if (this.#latched) {
|
|
117
|
+
this.#latched = false
|
|
118
|
+
this.#config.onRecovery()
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/** Reset episode state (e.g. on transport switch / re-join). Keeps no baseline. */
|
|
123
|
+
reset(): void {
|
|
124
|
+
this.#last = null
|
|
125
|
+
this.#starvedSince = null
|
|
126
|
+
this.#latched = false
|
|
127
|
+
}
|
|
128
|
+
}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared fec-setup helper.
|
|
3
|
+
*
|
|
4
|
+
* Wires a FecWorkerClient into a MulticastManager for a specific track.
|
|
5
|
+
* Both moq-lib (`hang-mmt-fec/js/watch/src/element.ts`) and moqtail
|
|
6
|
+
* (`moqtail-private/apps/client-js/src/lib/player.ts`) call this from their
|
|
7
|
+
* SessionManager `fec-setup` handler so the Worker+ALTA setup lives in one
|
|
8
|
+
* place instead of being duplicated across ~80 lines per player.
|
|
9
|
+
*
|
|
10
|
+
* Callers are responsible for holding the returned `dispose()` and calling it
|
|
11
|
+
* from their `fec-teardown` path (and/or effect cleanup).
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import type { FecWorkerClient, FecTrackConfig } from '@blockcast/fec-worker'
|
|
15
|
+
import { deriveFecInterleaveDepth } from '@blockcast/mmt-fec'
|
|
16
|
+
import type { MulticastManager } from './multicast-manager.js'
|
|
17
|
+
import { computeFecDeliveryWindowMs } from './track-session.js'
|
|
18
|
+
|
|
19
|
+
/** Asset URLs the helper needs. Callers pass the already-resolved set. */
|
|
20
|
+
export interface FecWorkerAssetUrls {
|
|
21
|
+
/** URL to the fec-worker entry bundle (new Worker() target). */
|
|
22
|
+
fecWorker: string
|
|
23
|
+
/** URL to the RaptorQ WASM module (compiled via compileStreaming). */
|
|
24
|
+
rqWasm: string
|
|
25
|
+
/** URL to the ALTA WASM module. Fetched only when an ALTA key is provided. */
|
|
26
|
+
altaWasm: string
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export interface FecWorkerSetupOptions {
|
|
30
|
+
/** MulticastManager that should receive the configured Worker. */
|
|
31
|
+
multicastManager: MulticastManager
|
|
32
|
+
/** MMTP packetId this track occupies (from catalog). */
|
|
33
|
+
packetId: number
|
|
34
|
+
/** Human-readable track name (catalog key). */
|
|
35
|
+
trackName: string
|
|
36
|
+
/** Track type from catalog. Never inferred from name. */
|
|
37
|
+
trackType: 'video' | 'audio'
|
|
38
|
+
/** FEC K from catalog (source symbols per block). */
|
|
39
|
+
fecK: number
|
|
40
|
+
/** Symbol size in bytes (T) — the ALTA-adjusted value if ALTA is signed. */
|
|
41
|
+
fecSymbolSize: number
|
|
42
|
+
/** Repair symbols per block (P). */
|
|
43
|
+
fecRepairCount: number
|
|
44
|
+
/** Interleave depth in ms. */
|
|
45
|
+
fecInterleaveMs: number
|
|
46
|
+
/** Duration of one FEC media unit in ms (video frame or audio access unit). */
|
|
47
|
+
mediaUnitDurationMs: number
|
|
48
|
+
/** Optional repair track name (MoQ). Forwarded to FecTrackConfig. */
|
|
49
|
+
repairTrackName?: string
|
|
50
|
+
/** Audio sample rate (optional — audio tracks only). */
|
|
51
|
+
sampleRate?: number
|
|
52
|
+
/** Codec string (optional; "unknown" is acceptable for first setup). */
|
|
53
|
+
codec?: string
|
|
54
|
+
/** Video framerate (optional metadata forwarded to the worker). */
|
|
55
|
+
framerate?: number
|
|
56
|
+
/** Base64 SPKI public key (optional). Accepts padded/unpadded, std or url-safe alphabet. */
|
|
57
|
+
altaPublicKeySpki?: string
|
|
58
|
+
/** Absolute or origin-relative asset URLs. */
|
|
59
|
+
assetUrls: FecWorkerAssetUrls
|
|
60
|
+
/** Optional FecWorkerClient factory — main use is test injection. */
|
|
61
|
+
clientFactory?: (workerUrl: URL) => FecWorkerClient
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export interface FecWorkerSetupResult {
|
|
65
|
+
/** The configured client (already registered with MulticastManager). */
|
|
66
|
+
client: FecWorkerClient
|
|
67
|
+
/** True when the ALTA public key decoded and the ALTA WASM compiled. */
|
|
68
|
+
altaEnabled: boolean
|
|
69
|
+
/** Releases the Worker and removes it from MulticastManager routing. */
|
|
70
|
+
dispose: () => void
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Configure a FecWorkerClient and attach it to `multicastManager` via
|
|
75
|
+
* `setFecWorker(packetId, client, trackType, config, trackName)`. Worker-path takes precedence
|
|
76
|
+
* over any sync WASM decoder already registered for the same packetId —
|
|
77
|
+
* sync decoders remain as a fallback.
|
|
78
|
+
*
|
|
79
|
+
* Any loader failure is re-thrown so the caller can log and leave the sync
|
|
80
|
+
* WASM decoder active as fallback (same pattern both players used before).
|
|
81
|
+
*/
|
|
82
|
+
export async function setupFecWorkerForTrack(
|
|
83
|
+
opts: FecWorkerSetupOptions,
|
|
84
|
+
): Promise<FecWorkerSetupResult> {
|
|
85
|
+
const interleaveDepthBlocks = deriveFecInterleaveDepth(
|
|
86
|
+
opts.fecInterleaveMs,
|
|
87
|
+
opts.mediaUnitDurationMs,
|
|
88
|
+
)
|
|
89
|
+
const deliveryWindowMs = computeFecDeliveryWindowMs({
|
|
90
|
+
interleaveDepthMs: opts.fecInterleaveMs,
|
|
91
|
+
sourceSymbols: opts.fecK,
|
|
92
|
+
repairSymbols: opts.fecRepairCount,
|
|
93
|
+
symbolSize: opts.fecSymbolSize,
|
|
94
|
+
mediaUnitsPerSecond: 1000 / opts.mediaUnitDurationMs,
|
|
95
|
+
})
|
|
96
|
+
// Resolve URL against location.origin when available (browser runtime).
|
|
97
|
+
// Absolute URLs pass through unchanged per the URL() spec.
|
|
98
|
+
const origin =
|
|
99
|
+
typeof location !== 'undefined' && location.origin ? location.origin : 'http://localhost'
|
|
100
|
+
const workerUrl = new URL(opts.assetUrls.fecWorker, origin)
|
|
101
|
+
|
|
102
|
+
const FecWorkerCtor = await import('@blockcast/fec-worker')
|
|
103
|
+
const client = opts.clientFactory
|
|
104
|
+
? opts.clientFactory(workerUrl)
|
|
105
|
+
: new FecWorkerCtor.FecWorkerClient(workerUrl)
|
|
106
|
+
|
|
107
|
+
// Compile RaptorQ WASM once; ALTA WASM only when we have a key to decode.
|
|
108
|
+
const rqWasm = await WebAssembly.compileStreaming(fetch(opts.assetUrls.rqWasm))
|
|
109
|
+
|
|
110
|
+
let altaKeyBuffer: ArrayBuffer | undefined
|
|
111
|
+
let altaWasmModule: WebAssembly.Module | undefined
|
|
112
|
+
if (opts.altaPublicKeySpki) {
|
|
113
|
+
const b64 = opts.altaPublicKeySpki.replace(/-/g, '+').replace(/_/g, '/')
|
|
114
|
+
const padded = b64.padEnd(Math.ceil(b64.length / 4) * 4, '=')
|
|
115
|
+
try {
|
|
116
|
+
const keyBytes = Uint8Array.from(atob(padded), c => c.charCodeAt(0))
|
|
117
|
+
// SPKI size range: Ed25519=44, P-256=91; tolerate 32..=256 for forward-compat.
|
|
118
|
+
if (keyBytes.length >= 32 && keyBytes.length <= 256) {
|
|
119
|
+
altaKeyBuffer = keyBytes.buffer
|
|
120
|
+
altaWasmModule = await WebAssembly.compileStreaming(fetch(opts.assetUrls.altaWasm))
|
|
121
|
+
} else {
|
|
122
|
+
console.warn(
|
|
123
|
+
`[fec-worker-setup] ALTA SPKI wrong length for "${opts.trackName}": ` +
|
|
124
|
+
`${keyBytes.length} (expected 32..256) — ALTA disabled`,
|
|
125
|
+
)
|
|
126
|
+
}
|
|
127
|
+
} catch (e) {
|
|
128
|
+
console.warn(`[fec-worker-setup] ALTA key decode / WASM compile failed for "${opts.trackName}":`, e)
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
const altaEnabled = !!(altaKeyBuffer && altaWasmModule)
|
|
133
|
+
const fecTrackConfig = {
|
|
134
|
+
codec: opts.codec ?? 'unknown',
|
|
135
|
+
trackName: opts.trackName,
|
|
136
|
+
trackType: opts.trackType,
|
|
137
|
+
framerate: opts.framerate,
|
|
138
|
+
sampleRate: opts.sampleRate,
|
|
139
|
+
algorithm: 'raptor',
|
|
140
|
+
k: opts.fecK,
|
|
141
|
+
repairCount: opts.fecRepairCount,
|
|
142
|
+
symbolSize: opts.fecSymbolSize,
|
|
143
|
+
interleaveDepth: interleaveDepthBlocks,
|
|
144
|
+
interleaveMs: opts.fecInterleaveMs,
|
|
145
|
+
deliveryWindowMs,
|
|
146
|
+
fecMode: 'subframe' as const,
|
|
147
|
+
repairTrack: opts.repairTrackName,
|
|
148
|
+
altaEnabled,
|
|
149
|
+
relayBlockSigEnabled: false,
|
|
150
|
+
} as unknown as FecTrackConfig
|
|
151
|
+
|
|
152
|
+
client.configure(fecTrackConfig, rqWasm, altaKeyBuffer, altaWasmModule)
|
|
153
|
+
opts.multicastManager.setFecWorker(opts.packetId, client, opts.trackType, {
|
|
154
|
+
k: opts.fecK,
|
|
155
|
+
symbolSize: opts.fecSymbolSize,
|
|
156
|
+
interleaveDepthMs: opts.fecInterleaveMs,
|
|
157
|
+
// FEC timing is expressed in media units. For audio this is the access-unit
|
|
158
|
+
// cadence (for example 1024/48kHz), not a video-only framerate field.
|
|
159
|
+
fps: 1000 / opts.mediaUnitDurationMs,
|
|
160
|
+
timeoutMs: deliveryWindowMs,
|
|
161
|
+
}, opts.trackName)
|
|
162
|
+
|
|
163
|
+
let disposed = false
|
|
164
|
+
return {
|
|
165
|
+
client,
|
|
166
|
+
altaEnabled,
|
|
167
|
+
dispose: () => {
|
|
168
|
+
if (disposed) return
|
|
169
|
+
disposed = true
|
|
170
|
+
try {
|
|
171
|
+
client.dispose()
|
|
172
|
+
} catch {
|
|
173
|
+
/* dispose errors are non-fatal */
|
|
174
|
+
}
|
|
175
|
+
},
|
|
176
|
+
}
|
|
177
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* fMP4 data-unit completion policy (BLO-13291).
|
|
3
|
+
*
|
|
4
|
+
* FFmpeg's `mmt` muxer in fMP4-fragments mode (mfu_mode=0, mmtenc_fmp4.c
|
|
5
|
+
* send_media_fragment) delivers one complete moof+mdat (optionally
|
|
6
|
+
* sidx-prefixed) per MPU data unit, split across FI=1/2/3 MMTP fragments.
|
|
7
|
+
* Neither wire counter can prove the chain is byte-complete:
|
|
8
|
+
*
|
|
9
|
+
* - MPU payload header byte 3 is the eight-bit fragment counter. It proves
|
|
10
|
+
* ordering, but cannot declare the total byte length of a fragmented DU.
|
|
11
|
+
* - Each fragment's payload_length bounds that packet only; it does not declare
|
|
12
|
+
* the total size of the multi-packet fMP4 data unit.
|
|
13
|
+
* - packet_sequence_number has legitimate gaps: repair and signaling packets
|
|
14
|
+
* consume sequence slots in the same flow at every FEC block boundary.
|
|
15
|
+
*
|
|
16
|
+
* The data unit is self-describing instead: ISOBMFF top-level box headers
|
|
17
|
+
* declare their 32-bit sizes. A candidate assembly is complete exactly when
|
|
18
|
+
* it parses as a whole number of known top-level boxes covering its full
|
|
19
|
+
* length. Any interior hole shifts subsequent box headers (type/size garbage)
|
|
20
|
+
* or leaves a declared size overrunning the buffer; missing tail bytes leave
|
|
21
|
+
* the final box short.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
/** Top-level box types the MMT fMP4 writers emit around a data unit. */
|
|
25
|
+
const TOP_LEVEL_BOX_TYPES = new Set(['ftyp', 'styp', 'moov', 'moof', 'mdat', 'sidx', 'free', 'skip', 'prft', 'emsg'])
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* True when `candidate` parses as one or more complete top-level ISOBMFF
|
|
29
|
+
* boxes covering exactly its byte length. size==0 ("to end of file") and
|
|
30
|
+
* size==1 (64-bit largesize) are treated as unverifiable and return false —
|
|
31
|
+
* the MMT muxers never emit them for streamed data units.
|
|
32
|
+
*/
|
|
33
|
+
export function isCompleteFmp4DataUnit(candidate: Uint8Array): boolean {
|
|
34
|
+
if (candidate.length < 8) return false
|
|
35
|
+
const dv = new DataView(candidate.buffer, candidate.byteOffset, candidate.byteLength)
|
|
36
|
+
let pos = 0
|
|
37
|
+
while (pos < candidate.length) {
|
|
38
|
+
if (pos + 8 > candidate.length) return false
|
|
39
|
+
const size = dv.getUint32(pos)
|
|
40
|
+
if (size < 8) return false
|
|
41
|
+
const type = String.fromCharCode(candidate[pos + 4]!, candidate[pos + 5]!, candidate[pos + 6]!, candidate[pos + 7]!)
|
|
42
|
+
if (!TOP_LEVEL_BOX_TYPES.has(type)) return false
|
|
43
|
+
if (pos + size > candidate.length) return false
|
|
44
|
+
pos += size
|
|
45
|
+
}
|
|
46
|
+
return pos === candidate.length
|
|
47
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal ISOBMFF box reader. NOT a full MP4 parser — just enough to walk
|
|
3
|
+
* the box tree and pull out fields that libmmt's fMP4 writers emit.
|
|
4
|
+
* Used by unit tests; not part of the runtime pipeline.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
export type Box = {
|
|
8
|
+
type: string
|
|
9
|
+
start: number
|
|
10
|
+
end: number
|
|
11
|
+
payloadStart: number
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function walkBoxes(data: Uint8Array, start = 0, end = data.length): Box[] {
|
|
15
|
+
const out: Box[] = []
|
|
16
|
+
const dv = new DataView(data.buffer, data.byteOffset, data.byteLength)
|
|
17
|
+
let pos = start
|
|
18
|
+
while (pos + 8 <= end) {
|
|
19
|
+
const size = dv.getUint32(pos)
|
|
20
|
+
const type = String.fromCharCode(data[pos + 4], data[pos + 5], data[pos + 6], data[pos + 7])
|
|
21
|
+
if (size < 8 || pos + size > end) break
|
|
22
|
+
out.push({ type, start: pos, end: pos + size, payloadStart: pos + 8 })
|
|
23
|
+
pos += size
|
|
24
|
+
}
|
|
25
|
+
return out
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export function findBox(boxes: Box[], type: string): Box | undefined {
|
|
29
|
+
return boxes.find(b => b.type === type)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function childrenOf(data: Uint8Array, box: Box): Box[] {
|
|
33
|
+
return walkBoxes(data, box.payloadStart, box.end)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export function readFullBox(data: Uint8Array, box: Box): { version: number; flags: number; bodyStart: number } {
|
|
37
|
+
const dv = new DataView(data.buffer, data.byteOffset, data.byteLength)
|
|
38
|
+
const verFlags = dv.getUint32(box.payloadStart)
|
|
39
|
+
return { version: verFlags >>> 24, flags: verFlags & 0xffffff, bodyStart: box.payloadStart + 4 }
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export function readTfdtBaseMediaDecodeTime(segment: Uint8Array): number {
|
|
43
|
+
const moof = findBox(walkBoxes(segment), 'moof')!
|
|
44
|
+
const traf = findBox(childrenOf(segment, moof), 'traf')!
|
|
45
|
+
const tfdt = findBox(childrenOf(segment, traf), 'tfdt')!
|
|
46
|
+
const { version, bodyStart } = readFullBox(segment, tfdt)
|
|
47
|
+
const dv = new DataView(segment.buffer, segment.byteOffset, segment.byteLength)
|
|
48
|
+
if (version === 1) {
|
|
49
|
+
const hi = dv.getUint32(bodyStart)
|
|
50
|
+
const lo = dv.getUint32(bodyStart + 4)
|
|
51
|
+
return hi * 0x100000000 + lo
|
|
52
|
+
}
|
|
53
|
+
return dv.getUint32(bodyStart)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export type TrunSample = {
|
|
57
|
+
duration: number
|
|
58
|
+
size: number
|
|
59
|
+
flags: number
|
|
60
|
+
compositionTimeOffset: number
|
|
61
|
+
}
|
|
62
|
+
export type TrunInfo = {
|
|
63
|
+
version: number
|
|
64
|
+
flags: number
|
|
65
|
+
sampleCount: number
|
|
66
|
+
dataOffset: number
|
|
67
|
+
samples: TrunSample[]
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export function readTrun(segment: Uint8Array): TrunInfo {
|
|
71
|
+
const moof = findBox(walkBoxes(segment), 'moof')!
|
|
72
|
+
const traf = findBox(childrenOf(segment, moof), 'traf')!
|
|
73
|
+
const trun = findBox(childrenOf(segment, traf), 'trun')!
|
|
74
|
+
const { version, flags, bodyStart } = readFullBox(segment, trun)
|
|
75
|
+
const dv = new DataView(segment.buffer, segment.byteOffset, segment.byteLength)
|
|
76
|
+
const sampleCount = dv.getUint32(bodyStart)
|
|
77
|
+
let cursor = bodyStart + 4
|
|
78
|
+
let dataOffset = 0
|
|
79
|
+
if (flags & 0x000001) { dataOffset = dv.getInt32(cursor); cursor += 4 }
|
|
80
|
+
const hasDuration = !!(flags & 0x000100)
|
|
81
|
+
const hasSize = !!(flags & 0x000200)
|
|
82
|
+
const hasFlags = !!(flags & 0x000400)
|
|
83
|
+
const hasCompositionTimeOffset = !!(flags & 0x000800)
|
|
84
|
+
const samples: TrunSample[] = []
|
|
85
|
+
for (let i = 0; i < sampleCount; i++) {
|
|
86
|
+
const s: TrunSample = { duration: 0, size: 0, flags: 0, compositionTimeOffset: 0 }
|
|
87
|
+
if (hasDuration) { s.duration = dv.getUint32(cursor); cursor += 4 }
|
|
88
|
+
if (hasSize) { s.size = dv.getUint32(cursor); cursor += 4 }
|
|
89
|
+
if (hasFlags) { s.flags = dv.getUint32(cursor); cursor += 4 }
|
|
90
|
+
if (hasCompositionTimeOffset) {
|
|
91
|
+
s.compositionTimeOffset = version === 1
|
|
92
|
+
? dv.getInt32(cursor)
|
|
93
|
+
: dv.getUint32(cursor)
|
|
94
|
+
cursor += 4
|
|
95
|
+
}
|
|
96
|
+
samples.push(s)
|
|
97
|
+
}
|
|
98
|
+
return { version, flags, sampleCount, dataOffset, samples }
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export function readMfhdSequence(segment: Uint8Array): number {
|
|
102
|
+
const moof = findBox(walkBoxes(segment), 'moof')!
|
|
103
|
+
const mfhd = findBox(childrenOf(segment, moof), 'mfhd')!
|
|
104
|
+
const { bodyStart } = readFullBox(segment, mfhd)
|
|
105
|
+
const dv = new DataView(segment.buffer, segment.byteOffset, segment.byteLength)
|
|
106
|
+
return dv.getUint32(bodyStart)
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export function readMdatSize(segment: Uint8Array): number {
|
|
110
|
+
const mdat = findBox(walkBoxes(segment), 'mdat')!
|
|
111
|
+
return mdat.end - mdat.payloadStart
|
|
112
|
+
}
|