@blockcast/mmt-container 0.1.0-main.0399efef1f07
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 +152 -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 +20087 -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 +873 -0
- package/dist/carp-catalog.js.map +7 -0
- package/dist/catalog-fec-params.d.ts +202 -0
- package/dist/catalog-fec-params.d.ts.map +1 -0
- package/dist/catalog-fec-params.js +568 -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 +217 -0
- package/dist/cmaf-block-assembler.d.ts.map +1 -0
- package/dist/cmaf-block-assembler.js +1769 -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 +248 -0
- package/dist/codec-utils.d.ts.map +1 -0
- package/dist/codec-utils.js +1268 -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 +307 -0
- package/dist/fec-manager.d.ts.map +1 -0
- package/dist/fec-manager.js +1530 -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 +88 -0
- package/dist/fec-worker-setup.d.ts.map +1 -0
- package/dist/fec-worker-setup.js +614 -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 +380 -0
- package/dist/index.js.map +7 -0
- package/dist/iso-bmff-timing.d.ts +78 -0
- package/dist/iso-bmff-timing.d.ts.map +1 -0
- package/dist/iso-bmff-timing.js +618 -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 +1285 -0
- package/dist/manifest-auth-plan.js.map +7 -0
- package/dist/media-router.d.ts +251 -0
- package/dist/media-router.d.ts.map +1 -0
- package/dist/media-router.js +624 -0
- package/dist/media-router.js.map +7 -0
- package/dist/mfu-reassembler.d.ts +396 -0
- package/dist/mfu-reassembler.d.ts.map +1 -0
- package/dist/mfu-reassembler.js +3085 -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 +434 -0
- package/dist/mmtp-container-parser.d.ts.map +1 -0
- package/dist/mmtp-container-parser.js +6164 -0
- package/dist/mmtp-container-parser.js.map +7 -0
- package/dist/mmtp-container-parser.no-modules.js +8999 -0
- package/dist/mmtp-container-parser.no-modules.js.map +7 -0
- package/dist/mmtp-decode-pipeline.d.ts +132 -0
- package/dist/mmtp-decode-pipeline.d.ts.map +1 -0
- package/dist/mmtp-decode-pipeline.js +6413 -0
- package/dist/mmtp-decode-pipeline.js.map +7 -0
- package/dist/mmtp-router.d.ts +390 -0
- package/dist/mmtp-router.d.ts.map +1 -0
- package/dist/mmtp-router.js +9242 -0
- package/dist/mmtp-router.js.map +7 -0
- package/dist/mmtp-to-cmaf.d.ts +181 -0
- package/dist/mmtp-to-cmaf.d.ts.map +1 -0
- package/dist/mmtp-to-cmaf.js +802 -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 +369 -0
- package/dist/multicast-manager.d.ts.map +1 -0
- package/dist/multicast-manager.js +13400 -0
- package/dist/multicast-manager.js.map +7 -0
- package/dist/multicast-transport.d.ts +61 -0
- package/dist/multicast-transport.d.ts.map +1 -0
- package/dist/multicast-transport.js +1665 -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 +8965 -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 +127 -0
- package/dist/repair-fetch.js.map +7 -0
- package/dist/repair-layers.d.ts +141 -0
- package/dist/repair-layers.d.ts.map +1 -0
- package/dist/repair-layers.js +303 -0
- package/dist/repair-layers.js.map +7 -0
- package/dist/sample-combiner.d.ts +212 -0
- package/dist/sample-combiner.d.ts.map +1 -0
- package/dist/sample-combiner.js +616 -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 +1238 -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 +398 -0
- package/dist/track-session.d.ts.map +1 -0
- package/dist/track-session.js +767 -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 +92 -0
- package/dist/wasm-mfu-reassembler.d.ts.map +1 -0
- package/dist/wasm-mfu-reassembler.js +2139 -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 +6418 -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 +87 -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 +279 -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 +319 -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 +276 -0
- package/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-base/dist/mmtp.js +645 -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 +899 -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 +82 -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 +296 -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 +172 -0
- package/node_modules/@blockcast/mmt-fec/dist/oti.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/oti.js +254 -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 +276 -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 +645 -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 +899 -0
- package/node_modules/@blockcast/mmt-fec/package.json +79 -0
- package/node_modules/@blockcast/mmt-fec/src/block-manager.ts +371 -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 +317 -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 +99 -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 +492 -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 +669 -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 +360 -0
- package/src/align.ts +239 -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 +845 -0
- package/src/catalog-fec-params.ts +535 -0
- package/src/catalog-network-source.ts +49 -0
- package/src/catalog-validator.ts +34 -0
- package/src/cmaf-block-assembler.ts +1167 -0
- package/src/cmaf-group-batcher.ts +104 -0
- package/src/cmcd-producer.ts +334 -0
- package/src/codec-utils.ts +1611 -0
- package/src/fec-codec.ts +61 -0
- package/src/fec-manager.ts +2081 -0
- package/src/fec-starvation-detector.ts +128 -0
- package/src/fec-worker-setup.ts +213 -0
- package/src/fmp4-completion.ts +47 -0
- package/src/fmp4-reader.ts +112 -0
- package/src/index.ts +486 -0
- package/src/iso-bmff-timing.ts +813 -0
- package/src/loc.ts +181 -0
- package/src/manifest-auth-plan.ts +107 -0
- package/src/media-router.ts +795 -0
- package/src/mfu-reassembler.ts +3741 -0
- package/src/mfu-reassembly-policy.ts +134 -0
- package/src/mmtp-container-parser.ts +1836 -0
- package/src/mmtp-decode-pipeline.ts +389 -0
- package/src/mmtp-router.ts +3136 -0
- package/src/mmtp-to-cmaf.ts +1024 -0
- package/src/multicast-auth-catalog.ts +340 -0
- package/src/multicast-input.ts +439 -0
- package/src/multicast-manager.ts +1720 -0
- package/src/multicast-transport.ts +321 -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 +238 -0
- package/src/repair-layers.ts +490 -0
- package/src/sample-combiner.ts +938 -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 +994 -0
- package/src/transport-pool.ts +128 -0
- package/src/wasm-mfu-reassembler.ts +389 -0
- package/src/wasm-mmtp-container-parser.ts +23 -0
- package/test-vectors/align.json +199 -0
- package/test-vectors/catalog/README.md +40 -0
- package/test-vectors/catalog/negative/fec-enhancement-repair-removed.json +27 -0
- package/test-vectors/catalog/negative/fec-repair-layer-geometry.json +32 -0
- package/test-vectors/catalog/negative/fec-repair-layer-missing-symbols.json +30 -0
- package/test-vectors/catalog/negative/fec-repair-multiple-depends.json +31 -0
- package/test-vectors/catalog/negative/fec-repair-overlay-with-layer.json +33 -0
- package/test-vectors/catalog/negative/fec-repair-priority-out-of-band.json +23 -0
- package/test-vectors/catalog/negative/fec-repair-source-symbols-without-scope.json +32 -0
- package/test-vectors/catalog/negative/legacy-selection-params.json +15 -0
- package/test-vectors/catalog/negative/media-track-repair-layer.json +16 -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-source-symbols-over-max.json +23 -0
- package/test-vectors/catalog/negative/raptorq-unaligned-symbol.json +26 -0
- package/test-vectors/catalog/negative/repair-track-legacy-shape.json +19 -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-layered-repair.json +104 -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/source-contiguity-v1.json +131 -0
- package/test-vectors/subsample-placement-v1.json +230 -0
|
@@ -0,0 +1,490 @@
|
|
|
1
|
+
// Layered and overlay FEC repair contract (draft-ramadan-moq-fec §6.3).
|
|
2
|
+
//
|
|
3
|
+
// One source track may carry several repair tracks. Every base layer is
|
|
4
|
+
// generated from the same source partition (RaptorQ, K, T, interleaveDepthMs,
|
|
5
|
+
// reorderToleranceMs) and differs from its siblings only in its repair symbol
|
|
6
|
+
// count P_i. Layer i owns the Repair Symbol IDs [O_i, O_i + P_i) with
|
|
7
|
+
// O_i = sum(P_j, j < i), and ESI = K + RS_ID, so any subset of layers combines
|
|
8
|
+
// into one decode. A keyframe overlay is a second, independent FEC instance
|
|
9
|
+
// covering only random access point fragments, with its own K and P and its
|
|
10
|
+
// own RS_ID space starting at 0.
|
|
11
|
+
//
|
|
12
|
+
// Repair tracks describe themselves (`depends`, `repairLayer`, `scope`); names
|
|
13
|
+
// carry no meaning. This module holds the one rule set both catalog dialects
|
|
14
|
+
// (MSF `tracks[]` and hang `repair.renditions`) resolve through, so the CMSF
|
|
15
|
+
// validator and the player resolver cannot drift apart.
|
|
16
|
+
//
|
|
17
|
+
// The one dialect difference is where layer 0 lives. In MSF, `fec.repairTrack`
|
|
18
|
+
// must name a `fec-repair` track in `tracks[]`, so a dangling pointer fails
|
|
19
|
+
// closed (`layerZeroMustBeDeclared`). In hang, layer 0 is named only by the
|
|
20
|
+
// rendition's `fec.repairTrack` and needs no `repair.renditions` entry; an
|
|
21
|
+
// entry there is optional and, when present, must agree with the source.
|
|
22
|
+
|
|
23
|
+
/** Lowest MoQT-scale priority a repair track may declare. */
|
|
24
|
+
export const REPAIR_PRIORITY_MIN = 192;
|
|
25
|
+
/** Highest MoQT-scale priority a repair track may declare. */
|
|
26
|
+
export const REPAIR_PRIORITY_MAX = 255;
|
|
27
|
+
/** Priority of a base layer 0 track that declares none. */
|
|
28
|
+
export const DEFAULT_REPAIR_PRIORITY = 240;
|
|
29
|
+
/** RFC 6330 §4.4.1.2: the largest number of source symbols in one RaptorQ source block. */
|
|
30
|
+
export const MAX_RAPTORQ_SOURCE_SYMBOLS = 56403;
|
|
31
|
+
/** The 24-bit RS_ID field (§7.1) bounds the repair total of one FEC instance. */
|
|
32
|
+
export const MAX_REPAIR_SYMBOLS = 0xffffff;
|
|
33
|
+
/** The 24-bit ESI bounds K + totalP - 1 for one FEC instance. */
|
|
34
|
+
export const MAX_ENCODING_SYMBOL_ID = 0xffffff;
|
|
35
|
+
|
|
36
|
+
export type RepairContractCode =
|
|
37
|
+
| "track_fec"
|
|
38
|
+
| "track_repair_track"
|
|
39
|
+
| "track_repair_depends"
|
|
40
|
+
| "track_repair_layer"
|
|
41
|
+
| "track_repair_priority"
|
|
42
|
+
| "track_repair_overlay"
|
|
43
|
+
| "track_repair_geometry"
|
|
44
|
+
| "track_fec_bounds";
|
|
45
|
+
|
|
46
|
+
/** Reports one contract violation and never returns. */
|
|
47
|
+
export type RepairContractFail = (code: RepairContractCode, path: string, message: string) => never;
|
|
48
|
+
|
|
49
|
+
export class RepairContractError extends Error {
|
|
50
|
+
constructor(
|
|
51
|
+
public readonly code: RepairContractCode,
|
|
52
|
+
public readonly path: string,
|
|
53
|
+
message: string,
|
|
54
|
+
) {
|
|
55
|
+
super(`[repair-layers:${code}] ${path}: ${message}`);
|
|
56
|
+
this.name = "RepairContractError";
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export const throwRepairContractError: RepairContractFail = (code, path, message) => {
|
|
61
|
+
throw new RepairContractError(code, path, message);
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
/** The self-describing fields of one repair track entry, in either dialect. */
|
|
65
|
+
export type RepairTrackDescriptor = {
|
|
66
|
+
/** Track (MSF) or rendition (hang) name. */
|
|
67
|
+
name: string;
|
|
68
|
+
/** JSON path of the entry, for error reporting. */
|
|
69
|
+
path: string;
|
|
70
|
+
depends?: unknown;
|
|
71
|
+
repairLayer?: unknown;
|
|
72
|
+
repairSymbols?: unknown;
|
|
73
|
+
priority?: unknown;
|
|
74
|
+
scope?: unknown;
|
|
75
|
+
sourceSymbols?: unknown;
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
/** The source track's `fec` object as the layer contract reads it. */
|
|
79
|
+
export type RepairSourceGeometry = {
|
|
80
|
+
/** Source track or rendition name. */
|
|
81
|
+
name: string;
|
|
82
|
+
/** JSON path of the `fec` object, for error reporting. */
|
|
83
|
+
path: string;
|
|
84
|
+
algorithm?: unknown;
|
|
85
|
+
/** K. */
|
|
86
|
+
sourceSymbols?: unknown;
|
|
87
|
+
/** P_0. */
|
|
88
|
+
repairSymbols?: unknown;
|
|
89
|
+
/** Layer 0 track name. */
|
|
90
|
+
repairTrack?: unknown;
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
/** A resolved base repair layer with its derived RS_ID range. */
|
|
94
|
+
export type RepairLayerParams = {
|
|
95
|
+
/** Layer index; 0 is the track named by the source's `fec.repairTrack`. */
|
|
96
|
+
layer: number;
|
|
97
|
+
repairTrackName: string;
|
|
98
|
+
/** P_i: repair symbols per block carried by this layer. */
|
|
99
|
+
repairSymbols: number;
|
|
100
|
+
/** O_i = sum(P_j for j < i): the first RS_ID this layer carries. ESI = K + RS_ID. */
|
|
101
|
+
rsIdOffset: number;
|
|
102
|
+
/** MoQT-scale priority (lower first); 240 when layer 0 declares none. */
|
|
103
|
+
priority: number;
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
/** A resolved keyframe overlay: a separate FEC instance over RAP fragments only. */
|
|
107
|
+
export type RepairOverlayParams = {
|
|
108
|
+
repairTrackName: string;
|
|
109
|
+
scope: "keyframe";
|
|
110
|
+
/** K_overlay: source symbols of the overlay instance. */
|
|
111
|
+
sourceSymbols: number;
|
|
112
|
+
/** P_overlay: repair symbols per overlay block; also the overlay's own RSB_length. */
|
|
113
|
+
repairSymbols: number;
|
|
114
|
+
/** MoQT-scale priority, independent of the base layer chain. */
|
|
115
|
+
priority: number;
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
export type RepairLayersResolution = {
|
|
119
|
+
sourceTrackName: string;
|
|
120
|
+
/** Base layers in layer order, layer 0 first. Never empty. */
|
|
121
|
+
baseLayers: readonly RepairLayerParams[];
|
|
122
|
+
/** Keyframe overlay instances, in catalog order. Empty when none is declared. */
|
|
123
|
+
/** At most one entry: the wire carries one overlay trailer per RAP packet. */
|
|
124
|
+
overlays: readonly RepairOverlayParams[];
|
|
125
|
+
/** Sum of P over base layers: the wire RSB_length on every base layer packet. */
|
|
126
|
+
totalBaseRepairSymbols: number;
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
const REPAIR_FIELDS = ["depends", "repairLayer", "repairSymbols", "priority", "scope", "sourceSymbols"] as const;
|
|
130
|
+
|
|
131
|
+
/** Track-level block geometry keys a repair track must not carry (§6.3 rule 8): geometry is the source's. */
|
|
132
|
+
export const REPAIR_TRACK_GEOMETRY_KEYS = [
|
|
133
|
+
"mmtpMode",
|
|
134
|
+
"timescale",
|
|
135
|
+
"groupDurationMs",
|
|
136
|
+
"groupDurationTicks",
|
|
137
|
+
"keyframeIntervalMs",
|
|
138
|
+
"keyframeIntervalTicks",
|
|
139
|
+
"fec",
|
|
140
|
+
"symbolSize",
|
|
141
|
+
"interleaveDepthMs",
|
|
142
|
+
] as const;
|
|
143
|
+
|
|
144
|
+
/** Self-describing repair fields that only a repair track or repair rendition may carry. */
|
|
145
|
+
export const REPAIR_TRACK_ONLY_KEYS = ["repairLayer", "repairSymbols", "sourceSymbols", "scope"] as const;
|
|
146
|
+
|
|
147
|
+
/** Rule 8: a repair track (MSF) or repair rendition (hang) carries no block geometry. */
|
|
148
|
+
export function rejectRepairTrackGeometry(path: string, fields: Record<string, unknown>, fail: RepairContractFail): void {
|
|
149
|
+
for (const key of REPAIR_TRACK_GEOMETRY_KEYS) {
|
|
150
|
+
if (fields[key] !== undefined) {
|
|
151
|
+
fail(
|
|
152
|
+
"track_repair_geometry",
|
|
153
|
+
`${path}.${key}`,
|
|
154
|
+
"a repair track carries no block geometry; it is shared with the source track's fec object",
|
|
155
|
+
);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/** Which repair tracks a catalog can reach, for rule 9 (no orphan repair track). */
|
|
161
|
+
export type RepairReachability = {
|
|
162
|
+
/** True once any track or rendition carries `fec` with an algorithm other than `none`. */
|
|
163
|
+
declaresFecSource: boolean;
|
|
164
|
+
/** Every non-empty `fec.repairTrack` a FEC source names: the layer-0 tracks. */
|
|
165
|
+
layerZeroNames: ReadonlySet<string>;
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Derive rule 9's inputs from the raw `fec` objects of every media track (MSF,
|
|
170
|
+
* packaging other than `fec-repair`) or media rendition (hang) in a catalog.
|
|
171
|
+
* Callers must not pass repair tracks: rule 8 forbids `fec` on them, and a
|
|
172
|
+
* repair track that carried one would otherwise name itself as its own
|
|
173
|
+
* layer 0 and slip past rule 9. One derivation for the validator and both
|
|
174
|
+
* resolver dialects, so an empty-string pointer or an `algorithm: "none"`
|
|
175
|
+
* source is read the same way everywhere.
|
|
176
|
+
*/
|
|
177
|
+
export function repairReachability(fecObjects: Iterable<unknown>): RepairReachability {
|
|
178
|
+
let declaresFecSource = false;
|
|
179
|
+
const layerZeroNames = new Set<string>();
|
|
180
|
+
for (const candidate of fecObjects) {
|
|
181
|
+
if (typeof candidate !== "object" || candidate === null || Array.isArray(candidate)) continue;
|
|
182
|
+
const fec = candidate as Record<string, unknown>;
|
|
183
|
+
if (fec["algorithm"] === "none") continue;
|
|
184
|
+
declaresFecSource = true;
|
|
185
|
+
const repairTrack = fec["repairTrack"];
|
|
186
|
+
if (typeof repairTrack === "string" && repairTrack.length > 0) layerZeroNames.add(repairTrack);
|
|
187
|
+
}
|
|
188
|
+
return { declaresFecSource, layerZeroNames };
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Rule 9: once a catalog declares a FEC source, a repair track that declares no
|
|
193
|
+
* `depends` must be some source's layer 0. A catalog with no FEC source may
|
|
194
|
+
* still carry a naming-era repair track that nothing joins.
|
|
195
|
+
*/
|
|
196
|
+
export function assertRepairTrackReachable(
|
|
197
|
+
descriptor: RepairTrackDescriptor,
|
|
198
|
+
reachability: RepairReachability,
|
|
199
|
+
fail: RepairContractFail,
|
|
200
|
+
): void {
|
|
201
|
+
if (dependsTarget(descriptor) !== undefined) return;
|
|
202
|
+
if (reachability.declaresFecSource && !reachability.layerZeroNames.has(descriptor.name)) {
|
|
203
|
+
fail(
|
|
204
|
+
"track_repair_depends",
|
|
205
|
+
`${descriptor.path}.depends`,
|
|
206
|
+
"no source names this repair track in fec.repairTrack and it declares no depends",
|
|
207
|
+
);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/** A media track (MSF) or media rendition (hang) carries no repair-track fields. */
|
|
212
|
+
export function rejectRepairFieldsOnMediaTrack(path: string, fields: Record<string, unknown>, fail: RepairContractFail): void {
|
|
213
|
+
for (const key of REPAIR_TRACK_ONLY_KEYS) {
|
|
214
|
+
if (fields[key] !== undefined) {
|
|
215
|
+
fail("track_repair_layer", `${path}.${key}`, `${key} is a repair track field`);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/** Pick the self-describing repair fields out of a raw track or rendition record. */
|
|
221
|
+
export function describeRepairTrack(name: string, path: string, fields: Record<string, unknown>): RepairTrackDescriptor {
|
|
222
|
+
const descriptor: RepairTrackDescriptor = { name, path };
|
|
223
|
+
for (const field of REPAIR_FIELDS) {
|
|
224
|
+
if (field in fields) descriptor[field] = fields[field];
|
|
225
|
+
}
|
|
226
|
+
return descriptor;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
function isSafeInteger(value: unknown): value is number {
|
|
230
|
+
return typeof value === "number" && Number.isSafeInteger(value);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
function positiveInteger(value: unknown): value is number {
|
|
234
|
+
return isSafeInteger(value) && value > 0;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/** The single source a repair track names in `depends`, once its shape has been validated. */
|
|
238
|
+
export function dependsTarget(descriptor: RepairTrackDescriptor): string | undefined {
|
|
239
|
+
const depends = descriptor.depends;
|
|
240
|
+
return Array.isArray(depends) && depends.length === 1 && typeof depends[0] === "string" && depends[0].length > 0
|
|
241
|
+
? depends[0]
|
|
242
|
+
: undefined;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* Validate the shape of one repair track's self-describing fields, independent
|
|
247
|
+
* of any source. Cross-track rules (layer 0 agreement, contiguity, priority
|
|
248
|
+
* order, bounds) live in `assembleRepairLayers`.
|
|
249
|
+
*/
|
|
250
|
+
export function validateRepairTrackFields(descriptor: RepairTrackDescriptor, fail: RepairContractFail): void {
|
|
251
|
+
const { path } = descriptor;
|
|
252
|
+
if (descriptor.depends !== undefined && dependsTarget(descriptor) === undefined) {
|
|
253
|
+
fail("track_repair_depends", `${path}.depends`, "must name exactly one source track");
|
|
254
|
+
}
|
|
255
|
+
if (descriptor.repairLayer !== undefined && (!isSafeInteger(descriptor.repairLayer) || descriptor.repairLayer < 0)) {
|
|
256
|
+
fail("track_repair_layer", `${path}.repairLayer`, "must be a non-negative integer");
|
|
257
|
+
}
|
|
258
|
+
if (
|
|
259
|
+
descriptor.repairSymbols !== undefined &&
|
|
260
|
+
(!positiveInteger(descriptor.repairSymbols) || descriptor.repairSymbols > MAX_REPAIR_SYMBOLS)
|
|
261
|
+
) {
|
|
262
|
+
fail("track_repair_layer", `${path}.repairSymbols`, `must be a positive integer at most ${MAX_REPAIR_SYMBOLS}`);
|
|
263
|
+
}
|
|
264
|
+
if (
|
|
265
|
+
descriptor.priority !== undefined &&
|
|
266
|
+
(!isSafeInteger(descriptor.priority) ||
|
|
267
|
+
descriptor.priority < REPAIR_PRIORITY_MIN ||
|
|
268
|
+
descriptor.priority > REPAIR_PRIORITY_MAX)
|
|
269
|
+
) {
|
|
270
|
+
fail(
|
|
271
|
+
"track_repair_priority",
|
|
272
|
+
`${path}.priority`,
|
|
273
|
+
`must be an integer from ${REPAIR_PRIORITY_MIN} to ${REPAIR_PRIORITY_MAX} (MoQT scale, lower first)`,
|
|
274
|
+
);
|
|
275
|
+
}
|
|
276
|
+
if (descriptor.scope !== undefined) {
|
|
277
|
+
if (descriptor.scope !== "keyframe") {
|
|
278
|
+
fail("track_repair_overlay", `${path}.scope`, 'must be "keyframe"');
|
|
279
|
+
}
|
|
280
|
+
if (descriptor.repairLayer !== undefined) {
|
|
281
|
+
fail("track_repair_overlay", `${path}.repairLayer`, "an overlay is a separate FEC instance and carries no repairLayer");
|
|
282
|
+
}
|
|
283
|
+
for (const field of ["depends", "sourceSymbols", "repairSymbols", "priority"] as const) {
|
|
284
|
+
if (descriptor[field] === undefined) {
|
|
285
|
+
fail("track_repair_overlay", `${path}.${field}`, `an overlay must declare ${field}`);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
if (descriptor.sourceSymbols !== undefined) {
|
|
290
|
+
if (descriptor.scope === undefined) {
|
|
291
|
+
fail("track_repair_overlay", `${path}.sourceSymbols`, "only an overlay (scope: keyframe) declares its own sourceSymbols");
|
|
292
|
+
}
|
|
293
|
+
if (!positiveInteger(descriptor.sourceSymbols) || descriptor.sourceSymbols > MAX_RAPTORQ_SOURCE_SYMBOLS) {
|
|
294
|
+
fail(
|
|
295
|
+
"track_fec_bounds",
|
|
296
|
+
`${path}.sourceSymbols`,
|
|
297
|
+
`must be a positive integer at most ${MAX_RAPTORQ_SOURCE_SYMBOLS} (RFC 6330 source block limit)`,
|
|
298
|
+
);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
if (isSafeInteger(descriptor.repairLayer) && descriptor.repairLayer >= 1) {
|
|
302
|
+
for (const field of ["depends", "repairSymbols", "priority"] as const) {
|
|
303
|
+
if (descriptor[field] === undefined) {
|
|
304
|
+
fail("track_repair_layer", `${path}.${field}`, `repair layer ${descriptor.repairLayer} must declare ${field}`);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
/**
|
|
311
|
+
* Resolve the base layers and overlays of one source track and derive each
|
|
312
|
+
* base layer's RS_ID offset. Fails closed on every §6.3 rule violation through
|
|
313
|
+
* `fail`, which receives the code and the JSON path of the offending field.
|
|
314
|
+
*
|
|
315
|
+
* `descriptors` are every repair track (or repair rendition) in the catalog,
|
|
316
|
+
* already shape-checked by `validateRepairTrackFields`. Returns undefined when
|
|
317
|
+
* the source names no layer 0 and nothing depends on it.
|
|
318
|
+
*/
|
|
319
|
+
export type AssembleRepairLayersOptions = {
|
|
320
|
+
/**
|
|
321
|
+
* MSF: `fec.repairTrack` must name one of `descriptors` (a `fec-repair`
|
|
322
|
+
* track), so a dangling pointer fails closed with `track_repair_track`.
|
|
323
|
+
* hang: layer 0 lives outside `repair.renditions`, so leave this unset.
|
|
324
|
+
*/
|
|
325
|
+
layerZeroMustBeDeclared?: boolean;
|
|
326
|
+
};
|
|
327
|
+
|
|
328
|
+
export function assembleRepairLayers(
|
|
329
|
+
source: RepairSourceGeometry,
|
|
330
|
+
descriptors: readonly RepairTrackDescriptor[],
|
|
331
|
+
fail: RepairContractFail = throwRepairContractError,
|
|
332
|
+
options: AssembleRepairLayersOptions = {},
|
|
333
|
+
): RepairLayersResolution | undefined {
|
|
334
|
+
const layerZeroName =
|
|
335
|
+
typeof source.repairTrack === "string" && source.repairTrack.length > 0 ? source.repairTrack : undefined;
|
|
336
|
+
const layerZero = layerZeroName === undefined ? undefined : descriptors.find((d) => d.name === layerZeroName);
|
|
337
|
+
if (layerZeroName !== undefined && layerZero === undefined && options.layerZeroMustBeDeclared) {
|
|
338
|
+
fail("track_repair_track", `${source.path}.repairTrack`, `unknown FEC repair track ${JSON.stringify(layerZeroName)}`);
|
|
339
|
+
}
|
|
340
|
+
const dependents = descriptors.filter((d) => d.name !== layerZeroName && dependsTarget(d) === source.name);
|
|
341
|
+
const k = positiveInteger(source.sourceSymbols) ? source.sourceSymbols : 0;
|
|
342
|
+
// RFC 6330 bounds every RaptorQ source block, with or without a repair track.
|
|
343
|
+
if (source.algorithm === "raptorq" && k > MAX_RAPTORQ_SOURCE_SYMBOLS) {
|
|
344
|
+
fail(
|
|
345
|
+
"track_fec_bounds",
|
|
346
|
+
`${source.path}.sourceSymbols`,
|
|
347
|
+
`must be at most ${MAX_RAPTORQ_SOURCE_SYMBOLS} (RFC 6330 source block limit)`,
|
|
348
|
+
);
|
|
349
|
+
}
|
|
350
|
+
if (layerZeroName === undefined) {
|
|
351
|
+
if (dependents.length === 0) return undefined;
|
|
352
|
+
fail(
|
|
353
|
+
"track_repair_layer",
|
|
354
|
+
`${dependents[0]!.path}.depends`,
|
|
355
|
+
`repair layers of ${JSON.stringify(source.name)} require a layer 0 (fec.repairTrack) on the source`,
|
|
356
|
+
);
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
const layered = dependents.length > 0;
|
|
360
|
+
let layerZeroSymbols = 0;
|
|
361
|
+
if (positiveInteger(source.repairSymbols)) {
|
|
362
|
+
layerZeroSymbols = source.repairSymbols;
|
|
363
|
+
} else if (layered) {
|
|
364
|
+
fail("track_fec", `${source.path}.repairSymbols`, "layered or overlay repair needs a positive integer repairSymbols on layer 0");
|
|
365
|
+
}
|
|
366
|
+
if (layered && !positiveInteger(source.sourceSymbols)) {
|
|
367
|
+
fail("track_fec", `${source.path}.sourceSymbols`, "layered or overlay repair needs a positive integer sourceSymbols on the source");
|
|
368
|
+
}
|
|
369
|
+
if (layered && source.algorithm !== "raptorq") {
|
|
370
|
+
fail(
|
|
371
|
+
"track_fec",
|
|
372
|
+
`${source.path}.algorithm`,
|
|
373
|
+
"repair layers and overlays are defined only for raptorq: a block code fixes its codeword length, so symbols of a larger P are not symbols of the code a receiver holding fewer layers decodes",
|
|
374
|
+
);
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
let layerZeroPriority = DEFAULT_REPAIR_PRIORITY;
|
|
378
|
+
if (layerZero !== undefined) {
|
|
379
|
+
if (layerZero.depends !== undefined && dependsTarget(layerZero) !== source.name) {
|
|
380
|
+
fail(
|
|
381
|
+
"track_repair_depends",
|
|
382
|
+
`${layerZero.path}.depends`,
|
|
383
|
+
`layer 0 of ${JSON.stringify(source.name)} must depend on that source`,
|
|
384
|
+
);
|
|
385
|
+
}
|
|
386
|
+
if (layerZero.repairLayer !== undefined && layerZero.repairLayer !== 0) {
|
|
387
|
+
fail("track_repair_layer", `${layerZero.path}.repairLayer`, "the track named by fec.repairTrack is layer 0");
|
|
388
|
+
}
|
|
389
|
+
if (layerZero.scope !== undefined) {
|
|
390
|
+
fail("track_repair_overlay", `${layerZero.path}.scope`, "the track named by fec.repairTrack is base layer 0, not an overlay");
|
|
391
|
+
}
|
|
392
|
+
if (layerZero.repairSymbols !== undefined && layerZero.repairSymbols !== layerZeroSymbols) {
|
|
393
|
+
fail(
|
|
394
|
+
"track_repair_layer",
|
|
395
|
+
`${layerZero.path}.repairSymbols`,
|
|
396
|
+
`must agree with the source's fec.repairSymbols (${layerZeroSymbols})`,
|
|
397
|
+
);
|
|
398
|
+
}
|
|
399
|
+
if (typeof layerZero.priority === "number") layerZeroPriority = layerZero.priority;
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
const baseLayers: RepairLayerParams[] = [
|
|
403
|
+
{ layer: 0, repairTrackName: layerZeroName!, repairSymbols: layerZeroSymbols, rsIdOffset: 0, priority: layerZeroPriority },
|
|
404
|
+
];
|
|
405
|
+
// Clarification 7 fixes the wire: a RAP packet carries exactly two Source
|
|
406
|
+
// FEC Payload IDs, base first and overlay last, and the receiver strips a
|
|
407
|
+
// fixed trailer length. A second overlay would need a third trailer that
|
|
408
|
+
// the draft does not define, so one overlay per source is the contract.
|
|
409
|
+
const overlays: RepairOverlayParams[] = [];
|
|
410
|
+
for (const d of dependents) {
|
|
411
|
+
if (d.scope === undefined && d.repairLayer === undefined) {
|
|
412
|
+
fail(
|
|
413
|
+
"track_repair_layer",
|
|
414
|
+
`${d.path}.repairLayer`,
|
|
415
|
+
`a repair track that depends on ${JSON.stringify(source.name)} must declare repairLayer (1..n) or scope: "keyframe"`,
|
|
416
|
+
);
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
const layerTracks = dependents
|
|
420
|
+
.filter((d) => d.scope === undefined)
|
|
421
|
+
.sort((a, b) => (a.repairLayer as number) - (b.repairLayer as number));
|
|
422
|
+
for (const d of dependents) {
|
|
423
|
+
if (d.scope !== "keyframe") continue;
|
|
424
|
+
if (overlays.length === 1) {
|
|
425
|
+
fail(
|
|
426
|
+
"track_repair_overlay",
|
|
427
|
+
`${d.path}.scope`,
|
|
428
|
+
`${JSON.stringify(source.name)} already has keyframe overlay ${JSON.stringify(overlays[0]!.repairTrackName)}: a RAP packet carries exactly two Source FEC Payload IDs (base, then overlay), so one overlay per source`,
|
|
429
|
+
);
|
|
430
|
+
}
|
|
431
|
+
const sourceSymbols = d.sourceSymbols as number;
|
|
432
|
+
const repairSymbols = d.repairSymbols as number;
|
|
433
|
+
if (sourceSymbols + repairSymbols - 1 > MAX_ENCODING_SYMBOL_ID) {
|
|
434
|
+
fail(
|
|
435
|
+
"track_fec_bounds",
|
|
436
|
+
`${d.path}.repairSymbols`,
|
|
437
|
+
`overlay sourceSymbols + repairSymbols - 1 exceeds the 24-bit ESI space (${MAX_ENCODING_SYMBOL_ID})`,
|
|
438
|
+
);
|
|
439
|
+
}
|
|
440
|
+
overlays.push({ repairTrackName: d.name, scope: "keyframe", sourceSymbols, repairSymbols, priority: d.priority as number });
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
let offset = layerZeroSymbols;
|
|
444
|
+
let previousPriority = layerZeroPriority;
|
|
445
|
+
layerTracks.forEach((d, i) => {
|
|
446
|
+
const expected = i + 1;
|
|
447
|
+
if (d.repairLayer === 0) {
|
|
448
|
+
fail("track_repair_layer", `${d.path}.repairLayer`, `layer 0 of ${JSON.stringify(source.name)} is ${JSON.stringify(layerZeroName)}, named by fec.repairTrack`);
|
|
449
|
+
}
|
|
450
|
+
if (d.repairLayer !== expected) {
|
|
451
|
+
fail(
|
|
452
|
+
"track_repair_layer",
|
|
453
|
+
`${d.path}.repairLayer`,
|
|
454
|
+
i > 0 && d.repairLayer === layerTracks[i - 1]!.repairLayer
|
|
455
|
+
? `repair layer ${d.repairLayer} is declared twice for ${JSON.stringify(source.name)}`
|
|
456
|
+
: `repair layers must be contiguous from 1: expected ${expected}, found ${d.repairLayer}`,
|
|
457
|
+
);
|
|
458
|
+
}
|
|
459
|
+
const priority = d.priority as number;
|
|
460
|
+
if (priority < previousPriority) {
|
|
461
|
+
fail(
|
|
462
|
+
"track_repair_priority",
|
|
463
|
+
`${d.path}.priority`,
|
|
464
|
+
`must be at least ${previousPriority}, the priority of layer ${expected - 1}: priority is monotonic non-decreasing with layer index`,
|
|
465
|
+
);
|
|
466
|
+
}
|
|
467
|
+
previousPriority = priority;
|
|
468
|
+
const repairSymbols = d.repairSymbols as number;
|
|
469
|
+
baseLayers.push({ layer: expected, repairTrackName: d.name, repairSymbols, rsIdOffset: offset, priority });
|
|
470
|
+
offset += repairSymbols;
|
|
471
|
+
});
|
|
472
|
+
|
|
473
|
+
const totalBaseRepairSymbols = offset;
|
|
474
|
+
if (totalBaseRepairSymbols > MAX_REPAIR_SYMBOLS) {
|
|
475
|
+
fail(
|
|
476
|
+
"track_fec_bounds",
|
|
477
|
+
`${layerTracks.length === 0 ? source.path : layerTracks[layerTracks.length - 1]!.path}.repairSymbols`,
|
|
478
|
+
`total repair symbols across base layers exceeds the 24-bit RS_ID space (${MAX_REPAIR_SYMBOLS})`,
|
|
479
|
+
);
|
|
480
|
+
}
|
|
481
|
+
if (k + totalBaseRepairSymbols - 1 > MAX_ENCODING_SYMBOL_ID) {
|
|
482
|
+
fail(
|
|
483
|
+
"track_fec_bounds",
|
|
484
|
+
`${source.path}.sourceSymbols`,
|
|
485
|
+
`sourceSymbols + total base repair symbols - 1 exceeds the 24-bit ESI space (${MAX_ENCODING_SYMBOL_ID})`,
|
|
486
|
+
);
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
return { sourceTrackName: source.name, baseLayers, overlays, totalBaseRepairSymbols };
|
|
490
|
+
}
|