@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
package/src/signaling.ts
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MMTP Signaling Parser for Multicast
|
|
3
|
+
*
|
|
4
|
+
* Provides packet type detection and AL-FEC signaling message parsing.
|
|
5
|
+
* Used by the multicast pipeline to classify and route MMTP packets.
|
|
6
|
+
*
|
|
7
|
+
* Packet types (ISO/IEC 23008-1:2023 Section 9.2.2):
|
|
8
|
+
* - 0x00: MPU (Media Processing Unit) - video/audio data
|
|
9
|
+
* - 0x02: Signaling - control messages including AL-FEC config
|
|
10
|
+
* - 0x03: Repair - FEC repair symbols
|
|
11
|
+
*/
|
|
12
|
+
import {
|
|
13
|
+
ALFEC_MESSAGE_ID,
|
|
14
|
+
FEC_CODE_RAPTORQ,
|
|
15
|
+
FEC_CODE_XOR,
|
|
16
|
+
PACKET_TYPE_MPU,
|
|
17
|
+
PACKET_TYPE_REPAIR,
|
|
18
|
+
PACKET_TYPE_SIGNALING,
|
|
19
|
+
parseAlFecMessage,
|
|
20
|
+
} from "@blockcast/mmt-base";
|
|
21
|
+
|
|
22
|
+
export {
|
|
23
|
+
ALFEC_MESSAGE_ID,
|
|
24
|
+
FEC_CODE_RAPTORQ,
|
|
25
|
+
FEC_CODE_XOR,
|
|
26
|
+
PACKET_TYPE_MPU,
|
|
27
|
+
PACKET_TYPE_REPAIR,
|
|
28
|
+
PACKET_TYPE_SIGNALING,
|
|
29
|
+
parseAlFecMessage,
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
export type PacketClass = "source" | "signaling" | "repair" | "unknown";
|
|
33
|
+
|
|
34
|
+
/** Get the MMTP packet type from raw multicast packet bytes.
|
|
35
|
+
*
|
|
36
|
+
* ISO/IEC 23008-1:2023 Figure 8 (V=0): byte 1 is
|
|
37
|
+
* reserved(2)|packet_type(6), so signaling is 0x02 and repair is 0x03.
|
|
38
|
+
* Pre-migration FFmpeg high-bits bytes (0x08/0x0c) are NOT accepted:
|
|
39
|
+
* writers and readers move together in the pinned smoke train.
|
|
40
|
+
*/
|
|
41
|
+
export function getPacketType(mmtpPacket: Uint8Array): number {
|
|
42
|
+
if (mmtpPacket.length < 2) return -1;
|
|
43
|
+
return mmtpPacket[1] & 0x3f;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** Check if packet is a signaling packet (type 0x02). */
|
|
47
|
+
export function isSignalingPacket(mmtpPacket: Uint8Array): boolean {
|
|
48
|
+
return getPacketType(mmtpPacket) === PACKET_TYPE_SIGNALING;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** Determine if packet is a source (video/audio) packet. */
|
|
52
|
+
export function isSourcePacket(mmtpPacket: Uint8Array): boolean {
|
|
53
|
+
if (mmtpPacket.length < 2) return false;
|
|
54
|
+
const packetType = mmtpPacket[1] & 0x3f;
|
|
55
|
+
const fecType = (mmtpPacket[0] >> 3) & 0x03;
|
|
56
|
+
return packetType === 0x00 && fecType <= 1;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** Classify MMTP packet for multicast pipeline routing. */
|
|
60
|
+
export function classifyPacket(mmtpPacket: Uint8Array): PacketClass {
|
|
61
|
+
if (mmtpPacket.length < 2) return "unknown";
|
|
62
|
+
const packetType = mmtpPacket[1] & 0x3f;
|
|
63
|
+
const fecType = (mmtpPacket[0] >> 3) & 0x03;
|
|
64
|
+
if ((mmtpPacket[0] >> 6) !== 0) return "unknown";
|
|
65
|
+
switch (packetType) {
|
|
66
|
+
case 0x00:
|
|
67
|
+
if (mmtpPacket.length < 20) return "unknown";
|
|
68
|
+
if (fecType >= 2) return "repair";
|
|
69
|
+
return "source";
|
|
70
|
+
case 0x02:
|
|
71
|
+
return "signaling";
|
|
72
|
+
case 0x03:
|
|
73
|
+
if (mmtpPacket.length < 20) return "unknown";
|
|
74
|
+
return "repair";
|
|
75
|
+
default:
|
|
76
|
+
return "unknown";
|
|
77
|
+
}
|
|
78
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from '@blockcast/mmt-manifest-verify'
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SwitchingSetMonitor — subscriber-side per-group alignment check between
|
|
3
|
+
* /base and /delta tracks in a CMAF switching set.
|
|
4
|
+
*
|
|
5
|
+
* Phase 14 D-15: log-only on drift (does NOT reject stream, does NOT throw).
|
|
6
|
+
* Phase 14 D-16: tolerance = Math.floor(1_000_000 / framerate / 2) microseconds.
|
|
7
|
+
* Hardcoded tolerance is FORBIDDEN — derives from framerate only.
|
|
8
|
+
* Phase 14 D-17: altGroup groups base+delta+repair into one switching set.
|
|
9
|
+
* Phase 14 T-14-03 mitigation: at most ONE misalignment emit per groupId pair.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
export interface SwitchingSetMonitorOptions {
|
|
13
|
+
/** REQUIRED — throws if missing or ≤ 0 (error on bad init, CLAUDE.md). */
|
|
14
|
+
framerate: number
|
|
15
|
+
/** Fired when base and delta timestamps for the same groupId differ by more than toleranceUs. */
|
|
16
|
+
onMisaligned?: (evt: { groupId: number; driftUs: number }) => void
|
|
17
|
+
/** Fired when base and delta are at different group numbers simultaneously (via reportGroupMismatch). */
|
|
18
|
+
onGroupNumberMismatch?: (evt: { baseGroupId: number; deltaGroupId: number }) => void
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/** Internal state for a pending base+delta group pair. */
|
|
22
|
+
type PendingGroup = { baseTs?: number; deltaTs?: number; emitted: boolean }
|
|
23
|
+
|
|
24
|
+
export class SwitchingSetMonitor {
|
|
25
|
+
/**
|
|
26
|
+
* Half-frame-duration tolerance in microseconds.
|
|
27
|
+
* Derivation: Math.floor(1_000_000 / framerate / 2)
|
|
28
|
+
* D-16: no hardcoded tolerance — framerate is the only input.
|
|
29
|
+
*/
|
|
30
|
+
readonly toleranceUs: number
|
|
31
|
+
|
|
32
|
+
#pending: Map<number, PendingGroup> = new Map()
|
|
33
|
+
#onMisaligned: ((evt: { groupId: number; driftUs: number }) => void) | undefined
|
|
34
|
+
#onGroupNumberMismatch: ((evt: { baseGroupId: number; deltaGroupId: number }) => void) | undefined
|
|
35
|
+
#disposed = false
|
|
36
|
+
|
|
37
|
+
constructor(opts: SwitchingSetMonitorOptions) {
|
|
38
|
+
if (
|
|
39
|
+
!opts ||
|
|
40
|
+
typeof opts.framerate !== 'number' ||
|
|
41
|
+
!Number.isFinite(opts.framerate) ||
|
|
42
|
+
opts.framerate <= 0
|
|
43
|
+
) {
|
|
44
|
+
throw new Error('[SwitchingSetMonitor] framerate required and must be > 0')
|
|
45
|
+
}
|
|
46
|
+
// D-16: derive from framerate — no hardcoded literal tolerance.
|
|
47
|
+
this.toleranceUs = Math.floor(1_000_000 / opts.framerate / 2)
|
|
48
|
+
this.#onMisaligned = opts.onMisaligned
|
|
49
|
+
this.#onGroupNumberMismatch = opts.onGroupNumberMismatch
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Notify the monitor that a group's first frame has arrived on a given role's track.
|
|
54
|
+
*
|
|
55
|
+
* When both base and delta have been seen for the same groupId, the timestamps are
|
|
56
|
+
* compared. If the absolute drift exceeds toleranceUs, onMisaligned fires.
|
|
57
|
+
*
|
|
58
|
+
* T-14-03: at most one emit per groupId pair (first-call-wins coalescing).
|
|
59
|
+
* D-15: no throw on misalignment — log-only semantics.
|
|
60
|
+
*/
|
|
61
|
+
notifyGroup(role: 'base' | 'delta', groupId: number, firstFrameTimestampUs: number): void {
|
|
62
|
+
if (this.#disposed) return
|
|
63
|
+
|
|
64
|
+
let entry = this.#pending.get(groupId)
|
|
65
|
+
if (!entry) {
|
|
66
|
+
entry = { emitted: false }
|
|
67
|
+
this.#pending.set(groupId, entry)
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
if (role === 'base') {
|
|
71
|
+
entry.baseTs = firstFrameTimestampUs
|
|
72
|
+
} else {
|
|
73
|
+
entry.deltaTs = firstFrameTimestampUs
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Only evaluate when both sides have been received AND not yet emitted.
|
|
77
|
+
if (entry.baseTs !== undefined && entry.deltaTs !== undefined && !entry.emitted) {
|
|
78
|
+
const driftUs = Math.abs(entry.baseTs - entry.deltaTs)
|
|
79
|
+
if (driftUs > this.toleranceUs) {
|
|
80
|
+
entry.emitted = true // T-14-03: coalesce — one emit per groupId pair
|
|
81
|
+
this.#onMisaligned?.({ groupId, driftUs })
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Report a group-number mismatch observed at the caller level.
|
|
88
|
+
*
|
|
89
|
+
* Called when the caller observes that base's current group ID differs from
|
|
90
|
+
* delta's at the same wall-clock moment. This is a distinct concern from
|
|
91
|
+
* timestamp drift within a matched group — handled by a separate callback
|
|
92
|
+
* path (onGroupNumberMismatch) to keep each method single-purpose.
|
|
93
|
+
*
|
|
94
|
+
* Plan 03 wires this from player subscribe callbacks.
|
|
95
|
+
*/
|
|
96
|
+
reportGroupMismatch(baseGroupId: number, deltaGroupId: number): void {
|
|
97
|
+
if (this.#disposed) return
|
|
98
|
+
this.#onGroupNumberMismatch?.({ baseGroupId, deltaGroupId })
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Dispose the monitor and clear all buffered pending groups.
|
|
103
|
+
* After dispose(), subsequent notifyGroup/reportGroupMismatch calls are no-ops.
|
|
104
|
+
*/
|
|
105
|
+
dispose(): void {
|
|
106
|
+
this.#disposed = true
|
|
107
|
+
this.#pending.clear()
|
|
108
|
+
}
|
|
109
|
+
}
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Container Timestamp Codec
|
|
3
|
+
*
|
|
4
|
+
* Encodes and decodes timestamps across container formats:
|
|
5
|
+
* - "legacy": QUIC VarInt encoded (variable length 1-8 bytes)
|
|
6
|
+
* - "raw": Fixed 8-byte BigUint64
|
|
7
|
+
* - "mmtp" / "mmtp-fec": 12-byte MMTP header with embedded timestamp
|
|
8
|
+
* - "loc": LOC extension header encoding
|
|
9
|
+
* - "fmp4": Not yet implemented
|
|
10
|
+
*/
|
|
11
|
+
import { extractNALUnit, extractTimestamp } from "@blockcast/mmt-base";
|
|
12
|
+
|
|
13
|
+
export type ContainerFormat = "legacy" | "raw" | "mmtp" | "mmtp-fec" | "loc" | "fmp4";
|
|
14
|
+
|
|
15
|
+
const DEFAULT_CONTAINER: ContainerFormat = "legacy";
|
|
16
|
+
|
|
17
|
+
/** Encodes a timestamp in microseconds according to the specified container format. */
|
|
18
|
+
export function encodeTimestamp(timestamp: number, container: ContainerFormat = DEFAULT_CONTAINER): Uint8Array {
|
|
19
|
+
switch (container) {
|
|
20
|
+
case "legacy":
|
|
21
|
+
return encodeVarInt(timestamp);
|
|
22
|
+
case "raw":
|
|
23
|
+
return encodeU64(timestamp);
|
|
24
|
+
case "mmtp":
|
|
25
|
+
case "mmtp-fec":
|
|
26
|
+
return encodeU64(timestamp);
|
|
27
|
+
case "loc":
|
|
28
|
+
return encodeLocTimestamp(timestamp);
|
|
29
|
+
case "fmp4":
|
|
30
|
+
throw new Error("fmp4 container not yet implemented");
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Decodes a timestamp from a buffer according to the specified container format.
|
|
36
|
+
* @returns [timestamp in microseconds, remaining buffer after timestamp]
|
|
37
|
+
*/
|
|
38
|
+
export function decodeTimestamp(buffer: Uint8Array, container: ContainerFormat = DEFAULT_CONTAINER): [number, Uint8Array] {
|
|
39
|
+
switch (container) {
|
|
40
|
+
case "legacy": {
|
|
41
|
+
const [value, remaining] = decodeVarInt(buffer);
|
|
42
|
+
return [value, remaining];
|
|
43
|
+
}
|
|
44
|
+
case "raw": {
|
|
45
|
+
const [value, remaining] = decodeU64(buffer);
|
|
46
|
+
return [value, remaining];
|
|
47
|
+
}
|
|
48
|
+
case "mmtp":
|
|
49
|
+
case "mmtp-fec": {
|
|
50
|
+
const timestamp = extractTimestamp(buffer);
|
|
51
|
+
const payload = extractNALUnit(buffer);
|
|
52
|
+
return [Number(timestamp), payload];
|
|
53
|
+
}
|
|
54
|
+
case "loc": {
|
|
55
|
+
const [ts, payload] = decodeLocTimestamp(buffer);
|
|
56
|
+
return [ts, payload];
|
|
57
|
+
}
|
|
58
|
+
case "fmp4":
|
|
59
|
+
throw new Error("fmp4 container not yet implemented");
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** Gets the size in bytes of an encoded timestamp for the given container format. */
|
|
64
|
+
export function getTimestampSize(container: ContainerFormat = DEFAULT_CONTAINER): number {
|
|
65
|
+
switch (container) {
|
|
66
|
+
case "legacy":
|
|
67
|
+
return 8;
|
|
68
|
+
case "raw":
|
|
69
|
+
return 8;
|
|
70
|
+
case "mmtp":
|
|
71
|
+
case "mmtp-fec":
|
|
72
|
+
return 12;
|
|
73
|
+
case "loc":
|
|
74
|
+
// [ExtID=2][ts][ExtID=4][kf]: two 1-byte IDs + a varint timestamp
|
|
75
|
+
// (<=8 bytes) + a 1-byte keyframe flag.
|
|
76
|
+
return 11;
|
|
77
|
+
case "fmp4":
|
|
78
|
+
throw new Error("fmp4 container not yet implemented");
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// LEGACY VARINT IMPLEMENTATION
|
|
83
|
+
const MAX_U6 = 2 ** 6 - 1;
|
|
84
|
+
const MAX_U14 = 2 ** 14 - 1;
|
|
85
|
+
const MAX_U30 = 2 ** 30 - 1;
|
|
86
|
+
const MAX_U53 = Number.MAX_SAFE_INTEGER;
|
|
87
|
+
|
|
88
|
+
function decodeVarInt(buf: Uint8Array): [number, Uint8Array] {
|
|
89
|
+
const size = 1 << ((buf[0] & 0xc0) >> 6);
|
|
90
|
+
const view = new DataView(buf.buffer, buf.byteOffset, size);
|
|
91
|
+
const remain = new Uint8Array(buf.buffer, buf.byteOffset + size, buf.byteLength - size);
|
|
92
|
+
let v: number;
|
|
93
|
+
if (size === 1) {
|
|
94
|
+
v = buf[0] & 0x3f;
|
|
95
|
+
} else if (size === 2) {
|
|
96
|
+
v = view.getUint16(0) & 0x3fff;
|
|
97
|
+
} else if (size === 4) {
|
|
98
|
+
v = view.getUint32(0) & 0x3fffffff;
|
|
99
|
+
} else if (size === 8) {
|
|
100
|
+
v = Number(view.getBigUint64(0) & 0x3fffffffffffffffn);
|
|
101
|
+
} else {
|
|
102
|
+
throw new Error("impossible");
|
|
103
|
+
}
|
|
104
|
+
return [v, remain];
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function encodeVarInt(v: number): Uint8Array {
|
|
108
|
+
if (v > MAX_U53) throw new RangeError("value too large for varint");
|
|
109
|
+
let size: 1 | 2 | 4 | 8;
|
|
110
|
+
if (v <= MAX_U6) {
|
|
111
|
+
size = 1;
|
|
112
|
+
} else if (v <= MAX_U14) {
|
|
113
|
+
size = 2;
|
|
114
|
+
} else if (v <= MAX_U30) {
|
|
115
|
+
size = 4;
|
|
116
|
+
} else {
|
|
117
|
+
size = 8;
|
|
118
|
+
}
|
|
119
|
+
const arr = new Uint8Array(size);
|
|
120
|
+
const view = new DataView(arr.buffer, arr.byteOffset, size);
|
|
121
|
+
const prefixMap: Record<1 | 2 | 4 | 8, number> = { 1: 0b00, 2: 0b01, 4: 0b10, 8: 0b11 };
|
|
122
|
+
const prefix = prefixMap[size];
|
|
123
|
+
if (size === 1) {
|
|
124
|
+
view.setUint8(0, (prefix << 6) | v);
|
|
125
|
+
} else if (size === 2) {
|
|
126
|
+
view.setUint16(0, (prefix << 14) | v);
|
|
127
|
+
} else if (size === 4) {
|
|
128
|
+
view.setUint32(0, (prefix << 30) | v);
|
|
129
|
+
} else if (size === 8) {
|
|
130
|
+
view.setBigUint64(0, (BigInt(prefix) << 62n) | BigInt(v));
|
|
131
|
+
}
|
|
132
|
+
return arr;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// U64 IMPLEMENTATION
|
|
136
|
+
function decodeU64(buf: Uint8Array): [number, Uint8Array] {
|
|
137
|
+
const view = new DataView(buf.buffer, buf.byteOffset, 8);
|
|
138
|
+
const remain = new Uint8Array(buf.buffer, buf.byteOffset + 8, buf.byteLength - 8);
|
|
139
|
+
const v = Number(view.getBigUint64(0));
|
|
140
|
+
return [v, remain];
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
function encodeU64(v: number): Uint8Array {
|
|
144
|
+
const arr = new Uint8Array(8);
|
|
145
|
+
const view = new DataView(arr.buffer, arr.byteOffset, 8);
|
|
146
|
+
view.setBigUint64(0, BigInt(v));
|
|
147
|
+
return arr;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// LOC TIMESTAMP IMPLEMENTATION
|
|
151
|
+
//
|
|
152
|
+
// The LOC wire format is defined by hang's `ContainerMode::Loc` encoder
|
|
153
|
+
// (hang-mmt-fec/rs/hang/src/container/producer.rs, the `ContainerMode::Loc`
|
|
154
|
+
// arm), which writes a FIXED two-pair extension header and then the payload:
|
|
155
|
+
//
|
|
156
|
+
// [ExtID=2][CaptureTimestamp_us][ExtID=4][keyframe][payload]
|
|
157
|
+
//
|
|
158
|
+
// all four fields QUIC varints. It is exactly two pairs — no count, no length,
|
|
159
|
+
// no terminator — so the reader is deterministic: consume four varints, and the
|
|
160
|
+
// payload starts at the fifth. Do NOT reintroduce a payload sniff (the removed
|
|
161
|
+
// `firstByte === 0x00` heuristic guessed at the boundary, which held for AVCC
|
|
162
|
+
// video and destroyed AAC audio, whose first byte is ID_SCE = 0x00-0x1f).
|
|
163
|
+
//
|
|
164
|
+
// A LOC track advertising `packaging: "loc"` MUST be emitted through
|
|
165
|
+
// `ContainerMode::Loc`. A producer that stamps the catalog but leaves the track
|
|
166
|
+
// in Legacy `[VarInt ts][payload]` mode is broken on the producer side — fix it
|
|
167
|
+
// there rather than making this reader guess which framing it was handed.
|
|
168
|
+
|
|
169
|
+
/** Number of varints in the fixed LOC extension header (2 ID/value pairs). */
|
|
170
|
+
const LOC_HEADER_VARINTS = 4;
|
|
171
|
+
|
|
172
|
+
/** LOC extension IDs (draft-ietf-moq-loc). */
|
|
173
|
+
const LOC_EXT_CAPTURE_TIMESTAMP = 2;
|
|
174
|
+
const LOC_EXT_VIDEO_FRAME_MARKING = 4;
|
|
175
|
+
|
|
176
|
+
/** Decode a LOC frame header.
|
|
177
|
+
* Returns [timestamp in microseconds, remaining payload]. */
|
|
178
|
+
export function decodeLocTimestamp(buffer: Uint8Array): [number, Uint8Array] {
|
|
179
|
+
const { timestamp, payload } = decodeLocHeader(buffer);
|
|
180
|
+
return [timestamp, payload];
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// ── LOC Header Parsing ──────────────────────────────────────────────
|
|
184
|
+
|
|
185
|
+
/** Parsed LOC extension header (CaptureTimestamp + VideoFrameMarking). */
|
|
186
|
+
export interface LocHeader {
|
|
187
|
+
/** Capture timestamp in microseconds (extension ID 2). */
|
|
188
|
+
timestamp: number;
|
|
189
|
+
/** Keyframe flag (extension ID 4, bit 0). */
|
|
190
|
+
keyframe?: boolean;
|
|
191
|
+
/** Payload after the extension header (raw codec bitstream). */
|
|
192
|
+
payload: Uint8Array;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Decode the fixed LOC extension header:
|
|
197
|
+
* `[ExtID=2][timestamp_us][ExtID=4][keyframe][payload]`.
|
|
198
|
+
*
|
|
199
|
+
* Throws if the header is not the two pairs the producer emits — a truncated or
|
|
200
|
+
* mis-framed buffer is a contract break, and returning a plausible-looking
|
|
201
|
+
* payload from it just relocates the failure into the decoder.
|
|
202
|
+
*/
|
|
203
|
+
export function decodeLocHeader(buffer: Uint8Array): LocHeader {
|
|
204
|
+
/** Read one varint, converting an over-run into a contract-break message. */
|
|
205
|
+
const readVarInt = (buf: Uint8Array, field: string): [number, Uint8Array] => {
|
|
206
|
+
if (buf.length === 0) {
|
|
207
|
+
throw new Error(
|
|
208
|
+
`LOC header truncated at ${field}: buffer is ${buffer.byteLength} bytes, ` +
|
|
209
|
+
`expected ${LOC_HEADER_VARINTS} varints`,
|
|
210
|
+
);
|
|
211
|
+
}
|
|
212
|
+
try {
|
|
213
|
+
return decodeVarInt(buf);
|
|
214
|
+
} catch {
|
|
215
|
+
// decodeVarInt builds a DataView sized by the 2-bit prefix; a short
|
|
216
|
+
// tail throws "Invalid DataView length" and hides what actually broke.
|
|
217
|
+
throw new Error(
|
|
218
|
+
`LOC header truncated at ${field}: ${buf.length} byte(s) remain, ` +
|
|
219
|
+
`too few for the declared varint width`,
|
|
220
|
+
);
|
|
221
|
+
}
|
|
222
|
+
};
|
|
223
|
+
|
|
224
|
+
const [tsId, afterTsId] = readVarInt(buffer, "CaptureTimestamp ID");
|
|
225
|
+
// Validate each ID as soon as it is read, so a Legacy-framed buffer reports
|
|
226
|
+
// the contract break rather than an over-run further along the walk.
|
|
227
|
+
if (tsId !== LOC_EXT_CAPTURE_TIMESTAMP) {
|
|
228
|
+
throw new Error(
|
|
229
|
+
`LOC header extension IDs: expected ${LOC_EXT_CAPTURE_TIMESTAMP} ` +
|
|
230
|
+
`(CaptureTimestamp) first, got ${tsId}. The producer is advertising ` +
|
|
231
|
+
`packaging="loc" but not emitting LOC framing — see ` +
|
|
232
|
+
`hang Avc1::set_explicit_container / Aac::set_container.`,
|
|
233
|
+
);
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
const [timestamp, afterTs] = readVarInt(afterTsId, "CaptureTimestamp value");
|
|
237
|
+
const [kfId, afterKfId] = readVarInt(afterTs, "VideoFrameMarking ID");
|
|
238
|
+
if (kfId !== LOC_EXT_VIDEO_FRAME_MARKING) {
|
|
239
|
+
throw new Error(
|
|
240
|
+
`LOC header extension IDs: expected ${LOC_EXT_VIDEO_FRAME_MARKING} ` +
|
|
241
|
+
`(VideoFrameMarking) second, got ${kfId}.`,
|
|
242
|
+
);
|
|
243
|
+
}
|
|
244
|
+
const [kfValue, payload] = readVarInt(afterKfId, "VideoFrameMarking value");
|
|
245
|
+
|
|
246
|
+
return { timestamp, keyframe: (kfValue & 1) === 1, payload };
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/** Encode a LOC frame header: `[ExtID=2][timestamp_us][ExtID=4][keyframe]`. */
|
|
250
|
+
export function encodeLocTimestamp(timestamp: number, keyframe = false): Uint8Array {
|
|
251
|
+
const parts = [
|
|
252
|
+
encodeVarInt(LOC_EXT_CAPTURE_TIMESTAMP),
|
|
253
|
+
encodeVarInt(timestamp),
|
|
254
|
+
encodeVarInt(LOC_EXT_VIDEO_FRAME_MARKING),
|
|
255
|
+
encodeVarInt(keyframe ? 1 : 0),
|
|
256
|
+
];
|
|
257
|
+
const total = parts.reduce((n, p) => n + p.length, 0);
|
|
258
|
+
const out = new Uint8Array(total);
|
|
259
|
+
let off = 0;
|
|
260
|
+
for (const p of parts) {
|
|
261
|
+
out.set(p, off);
|
|
262
|
+
off += p.length;
|
|
263
|
+
}
|
|
264
|
+
return out;
|
|
265
|
+
}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Track Pipeline Setup — shared wiring helper for both players.
|
|
3
|
+
*
|
|
4
|
+
* Provides a one-call setup that connects TrackPipeline to MediaRouter +
|
|
5
|
+
* MulticastManager, including the TrackSourceFactory that adapts multicast
|
|
6
|
+
* frames into the TrackSource interface expected by MediaRouter.setTrackSource().
|
|
7
|
+
*
|
|
8
|
+
* Usage in both moq-lib (element.ts) and moqtail (player.ts):
|
|
9
|
+
*
|
|
10
|
+
* import { setupTrackPipeline, type TrackDescriptor } from '@blockcast/mmt-container';
|
|
11
|
+
*
|
|
12
|
+
* const tracks: TrackDescriptor[] = catalog.getTracks().map(t => ({
|
|
13
|
+
* name: t.name,
|
|
14
|
+
* type: t.role as 'video' | 'audio',
|
|
15
|
+
* packetId: t.packetId,
|
|
16
|
+
* }));
|
|
17
|
+
*
|
|
18
|
+
* const { pipeline, dispose } = setupTrackPipeline({
|
|
19
|
+
* router,
|
|
20
|
+
* multicastManager: mc,
|
|
21
|
+
* tracks,
|
|
22
|
+
* preferences: transportPrefs,
|
|
23
|
+
* capabilities: caps,
|
|
24
|
+
* onTransportChange: (track, from, to) => { ... },
|
|
25
|
+
* });
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
import type { MediaRouter, TrackSource, MigrationPolicy, FrameKind } from './media-router.js'
|
|
29
|
+
import type { MulticastManager } from './multicast-manager.js'
|
|
30
|
+
import {
|
|
31
|
+
TrackPipeline,
|
|
32
|
+
type TrackTransport,
|
|
33
|
+
type TrackTransportPreference,
|
|
34
|
+
type TransportCapabilityReport,
|
|
35
|
+
} from './track-pipeline.js'
|
|
36
|
+
|
|
37
|
+
export { TrackPipeline }
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Catalog-derived track descriptor. Carries the actual track type
|
|
41
|
+
* so the pipeline never guesses from track names.
|
|
42
|
+
*/
|
|
43
|
+
export interface TrackDescriptor {
|
|
44
|
+
/** Track name as it appears in the catalog / MoQ namespace. */
|
|
45
|
+
name: string
|
|
46
|
+
/** Actual media type from catalog role. */
|
|
47
|
+
type: FrameKind
|
|
48
|
+
/** MMTP packet ID (used for MulticastManager per-track callbacks). */
|
|
49
|
+
packetId?: number
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export interface SetupTrackPipelineOptions {
|
|
53
|
+
/** MediaRouter instance (already wired to decoder backends). */
|
|
54
|
+
router: MediaRouter
|
|
55
|
+
/** MulticastManager instance (already joined or about to join). */
|
|
56
|
+
multicastManager: MulticastManager
|
|
57
|
+
/** Catalog-derived track descriptors. */
|
|
58
|
+
tracks: TrackDescriptor[]
|
|
59
|
+
/** Per-track transport preferences. */
|
|
60
|
+
preferences?: TrackTransportPreference[]
|
|
61
|
+
/** Initial capability snapshot (optional; call pipeline.updateCapabilities later). */
|
|
62
|
+
capabilities?: TransportCapabilityReport
|
|
63
|
+
/** Called after each per-track transport switch. */
|
|
64
|
+
onTransportChange?: (
|
|
65
|
+
trackName: string,
|
|
66
|
+
from: TrackTransport | null,
|
|
67
|
+
to: TrackTransport,
|
|
68
|
+
policy: MigrationPolicy,
|
|
69
|
+
) => void
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export interface SetupTrackPipelineResult {
|
|
73
|
+
pipeline: TrackPipeline
|
|
74
|
+
/** Call to tear down the pipeline and all per-track sources. */
|
|
75
|
+
dispose: () => void
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Create and wire a TrackPipeline into existing MediaRouter + MulticastManager.
|
|
80
|
+
*
|
|
81
|
+
* The factory creates TrackSource adapters that:
|
|
82
|
+
* - For 'multicast': subscribe to MulticastManager's per-track frame callbacks
|
|
83
|
+
* and forward through the TrackSource.onFrame interface.
|
|
84
|
+
* - For 'amt': same as multicast (AMT packets flow through MulticastManager.feedPacket).
|
|
85
|
+
* - For 'moq': no per-track source needed (MoQ is the default binary path).
|
|
86
|
+
*/
|
|
87
|
+
export function setupTrackPipeline(opts: SetupTrackPipelineOptions): SetupTrackPipelineResult {
|
|
88
|
+
const { router, multicastManager, tracks, preferences, capabilities, onTransportChange } = opts
|
|
89
|
+
|
|
90
|
+
// Build lookup: trackName → TrackDescriptor
|
|
91
|
+
const trackMap = new Map<string, TrackDescriptor>()
|
|
92
|
+
for (const t of tracks) {
|
|
93
|
+
trackMap.set(t.name, t)
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
const pipeline = new TrackPipeline(router)
|
|
97
|
+
|
|
98
|
+
// Register the TrackSource factory that bridges MulticastManager → TrackSource.
|
|
99
|
+
// Uses TrackDescriptor.type and .packetId — never guesses from track names.
|
|
100
|
+
pipeline.setSourceFactory((trackName: string, transport: TrackTransport): TrackSource | null => {
|
|
101
|
+
if (transport === 'moq') return null // MoQ is default binary path
|
|
102
|
+
|
|
103
|
+
const desc = trackMap.get(trackName)
|
|
104
|
+
if (!desc) {
|
|
105
|
+
console.warn(`[TrackPipeline] Unknown track "${trackName}" — no descriptor registered`)
|
|
106
|
+
return null
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Both 'multicast' and 'amt' route through MulticastManager
|
|
110
|
+
// (AMT packets arrive via feedPacket → same MmtpRouter pipeline)
|
|
111
|
+
return createMulticastTrackSource(multicastManager, desc)
|
|
112
|
+
})
|
|
113
|
+
|
|
114
|
+
if (onTransportChange) {
|
|
115
|
+
pipeline.onTransportChange(onTransportChange)
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
if (preferences) {
|
|
119
|
+
pipeline.setPreferences(preferences)
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
if (capabilities) {
|
|
123
|
+
pipeline.updateCapabilities(capabilities)
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
return {
|
|
127
|
+
pipeline,
|
|
128
|
+
dispose: () => pipeline.dispose(),
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Create a TrackSource adapter that bridges MulticastManager frame callbacks
|
|
134
|
+
* into the TrackSource interface expected by MediaRouter.setTrackSource().
|
|
135
|
+
*
|
|
136
|
+
* Routes using the track descriptor's type and packetId — never name-based.
|
|
137
|
+
* If packetId is available, uses the specific onTrackFrame(packetId) callback
|
|
138
|
+
* for precise per-track routing. Falls back to onVideoFrame/onAudioFrame
|
|
139
|
+
* based on descriptor type.
|
|
140
|
+
*/
|
|
141
|
+
function createMulticastTrackSource(
|
|
142
|
+
manager: MulticastManager,
|
|
143
|
+
desc: TrackDescriptor,
|
|
144
|
+
): TrackSource {
|
|
145
|
+
let frameCb: ((data: Uint8Array, meta: { timestamp: number; keyframe: boolean }) => void) | null = null
|
|
146
|
+
let errorCb: (() => void) | null = null
|
|
147
|
+
let wired = false
|
|
148
|
+
|
|
149
|
+
return {
|
|
150
|
+
name: desc.name,
|
|
151
|
+
|
|
152
|
+
onFrame(cb) {
|
|
153
|
+
frameCb = cb
|
|
154
|
+
|
|
155
|
+
if (!wired) {
|
|
156
|
+
wired = true
|
|
157
|
+
|
|
158
|
+
if (desc.packetId != null) {
|
|
159
|
+
// Precise per-packetId routing (preferred)
|
|
160
|
+
manager.onTrackFrame(desc.packetId, (data, meta) => {
|
|
161
|
+
frameCb?.(data, meta)
|
|
162
|
+
})
|
|
163
|
+
} else if (desc.type === 'video') {
|
|
164
|
+
manager.onVideoFrame((data, meta) => {
|
|
165
|
+
frameCb?.(data, meta)
|
|
166
|
+
})
|
|
167
|
+
} else if (desc.type === 'audio') {
|
|
168
|
+
manager.onAudioFrame((data, meta) => {
|
|
169
|
+
frameCb?.(data, meta)
|
|
170
|
+
})
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
return () => { frameCb = null }
|
|
175
|
+
},
|
|
176
|
+
|
|
177
|
+
onError(cb) {
|
|
178
|
+
errorCb = cb
|
|
179
|
+
manager.onFailback(() => { errorCb?.() })
|
|
180
|
+
return () => { errorCb = null }
|
|
181
|
+
},
|
|
182
|
+
|
|
183
|
+
dispose() {
|
|
184
|
+
frameCb = null
|
|
185
|
+
errorCb = null
|
|
186
|
+
wired = false
|
|
187
|
+
},
|
|
188
|
+
}
|
|
189
|
+
}
|