@blockcast/mmt-container 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +524 -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 +80 -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/block-policy.d.ts +314 -0
- package/dist/block-policy.d.ts.map +1 -0
- package/dist/block-policy.js +466 -0
- package/dist/block-policy.js.map +7 -0
- package/dist/browser-runtime.js +26549 -0
- package/dist/browser-runtime.js.map +7 -0
- package/dist/carp-catalog.d.ts +429 -0
- package/dist/carp-catalog.d.ts.map +1 -0
- package/dist/carp-catalog.js +985 -0
- package/dist/carp-catalog.js.map +7 -0
- package/dist/catalog-fec-params.d.ts +275 -0
- package/dist/catalog-fec-params.d.ts.map +1 -0
- package/dist/catalog-fec-params.js +702 -0
- package/dist/catalog-fec-params.js.map +7 -0
- package/dist/catalog-network-source.d.ts +42 -0
- package/dist/catalog-network-source.d.ts.map +1 -0
- package/dist/catalog-network-source.js +47 -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 +285 -0
- package/dist/cmaf-block-assembler.d.ts.map +1 -0
- package/dist/cmaf-block-assembler.js +1966 -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 +176 -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 +183 -0
- package/dist/cmcd-producer.js.map +7 -0
- package/dist/codec-utils.d.ts +384 -0
- package/dist/codec-utils.d.ts.map +1 -0
- package/dist/codec-utils.js +1546 -0
- package/dist/codec-utils.js.map +7 -0
- package/dist/conceal-timeline.d.ts +146 -0
- package/dist/conceal-timeline.d.ts.map +1 -0
- package/dist/conceal-timeline.js +137 -0
- package/dist/conceal-timeline.js.map +7 -0
- package/dist/delivery-gap.d.ts +75 -0
- package/dist/delivery-gap.d.ts.map +1 -0
- package/dist/delivery-gap.js +88 -0
- package/dist/delivery-gap.js.map +7 -0
- package/dist/duplicate-ledger.d.ts +197 -0
- package/dist/duplicate-ledger.d.ts.map +1 -0
- package/dist/duplicate-ledger.js +226 -0
- package/dist/duplicate-ledger.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 +583 -0
- package/dist/fec-manager.d.ts.map +1 -0
- package/dist/fec-manager.js +3899 -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 +60 -0
- package/dist/fec-starvation-detector.js.map +7 -0
- package/dist/fec-state.d.ts +131 -0
- package/dist/fec-state.d.ts.map +1 -0
- package/dist/fec-state.js +87 -0
- package/dist/fec-state.js.map +7 -0
- package/dist/fec-worker-setup.d.ts +94 -0
- package/dist/fec-worker-setup.d.ts.map +1 -0
- package/dist/fec-worker-setup.js +673 -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 +44 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +460 -14
- package/dist/index.js.map +7 -1
- package/dist/iso-block-locator.d.ts +118 -0
- package/dist/iso-block-locator.d.ts.map +1 -0
- package/dist/iso-block-locator.js +289 -0
- package/dist/iso-block-locator.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 +593 -0
- package/dist/iso-bmff-timing.js.map +7 -0
- package/dist/loc.d.ts +70 -75
- package/dist/loc.d.ts.map +1 -1
- package/dist/loc.js +106 -192
- package/dist/loc.js.map +7 -1
- 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 +1266 -0
- package/dist/manifest-auth-plan.js.map +7 -0
- package/dist/media-router.d.ts +262 -0
- package/dist/media-router.d.ts.map +1 -0
- package/dist/media-router.js +584 -0
- package/dist/media-router.js.map +7 -0
- package/dist/mfu-reassembler.d.ts +313 -9
- package/dist/mfu-reassembler.d.ts.map +1 -1
- package/dist/mfu-reassembler.js +3051 -285
- package/dist/mfu-reassembler.js.map +7 -1
- 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 +568 -0
- package/dist/mmtp-container-parser.d.ts.map +1 -0
- package/dist/mmtp-container-parser.js +6580 -0
- package/dist/mmtp-container-parser.js.map +7 -0
- package/dist/mmtp-container-parser.no-modules.js +9616 -0
- package/dist/mmtp-container-parser.no-modules.js.map +7 -0
- package/dist/mmtp-decode-pipeline.d.ts +138 -0
- package/dist/mmtp-decode-pipeline.d.ts.map +1 -0
- package/dist/mmtp-decode-pipeline.js +6814 -0
- package/dist/mmtp-decode-pipeline.js.map +7 -0
- package/dist/mmtp-router.d.ts +679 -0
- package/dist/mmtp-router.d.ts.map +1 -0
- package/dist/mmtp-router.js +11278 -0
- package/dist/mmtp-router.js.map +7 -0
- package/dist/mmtp-to-cmaf.d.ts +187 -0
- package/dist/mmtp-to-cmaf.d.ts.map +1 -0
- package/dist/mmtp-to-cmaf.js +716 -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 +141 -0
- package/dist/multicast-input.d.ts.map +1 -0
- package/dist/multicast-input.js +390 -0
- package/dist/multicast-input.js.map +7 -0
- package/dist/multicast-manager.d.ts +669 -0
- package/dist/multicast-manager.d.ts.map +1 -0
- package/dist/multicast-manager.js +19101 -0
- package/dist/multicast-manager.js.map +7 -0
- package/dist/multicast-transport.d.ts +271 -0
- package/dist/multicast-transport.d.ts.map +1 -0
- package/dist/multicast-transport.js +2264 -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 +418 -0
- package/dist/multicast-unwrap.js.map +7 -0
- package/dist/no-modules.d.ts +10 -0
- package/dist/no-modules.d.ts.map +1 -0
- package/dist/no-modules.js +9491 -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 +270 -0
- package/dist/repair-fetch.d.ts.map +1 -0
- package/dist/repair-fetch.js +381 -0
- package/dist/repair-fetch.js.map +7 -0
- package/dist/repair-layers.d.ts +158 -0
- package/dist/repair-layers.d.ts.map +1 -0
- package/dist/repair-layers.js +344 -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 +595 -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 +572 -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 +1209 -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 +70 -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 +473 -0
- package/dist/timestamp-codec.js.map +7 -0
- package/dist/track-pipeline-setup.d.ts +83 -0
- package/dist/track-pipeline-setup.d.ts.map +1 -0
- package/dist/track-pipeline-setup.js +291 -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 +209 -0
- package/dist/track-pipeline.js.map +7 -0
- package/dist/track-session.d.ts +414 -0
- package/dist/track-session.d.ts.map +1 -0
- package/dist/track-session.js +754 -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 +74 -0
- package/dist/transport-pool.js.map +7 -0
- package/dist/wasm-mfu-reassembler.d.ts +97 -0
- package/dist/wasm-mfu-reassembler.d.ts.map +1 -0
- package/dist/wasm-mfu-reassembler.js +2133 -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 +6834 -0
- package/dist/wasm-mmtp-container-parser.js.map +7 -0
- package/node_modules/@blockcast/fec-worker/README.md +223 -0
- package/node_modules/@blockcast/fec-worker/dist/.build-stamp +0 -0
- package/node_modules/@blockcast/fec-worker/dist/block-order.d.ts +38 -0
- package/node_modules/@blockcast/fec-worker/dist/block-order.d.ts.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/block-order.js +78 -0
- package/node_modules/@blockcast/fec-worker/dist/block-order.js.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.d.ts +93 -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 +346 -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 +380 -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 +859 -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 +370 -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 +194 -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 +62 -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/block-order.ts +93 -0
- package/node_modules/@blockcast/fec-worker/src/fec-worker-client.ts +392 -0
- package/node_modules/@blockcast/fec-worker/src/fec-worker-types.ts +399 -0
- package/node_modules/@blockcast/fec-worker/src/fec-worker.ts +1502 -0
- package/node_modules/@blockcast/fec-worker/src/index.ts +35 -0
- package/node_modules/@blockcast/fec-worker/src/shred-fec-worker.ts +589 -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 +209 -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 +134 -0
- package/node_modules/@blockcast/mmt-base/dist/.build-stamp +0 -0
- package/node_modules/@blockcast/mmt-base/dist/fec-block-profile.d.ts +55 -0
- package/node_modules/@blockcast/mmt-base/dist/fec-block-profile.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-base/dist/fec-block-profile.js +128 -0
- package/node_modules/@blockcast/mmt-base/dist/fec-block-profile.js.map +1 -0
- package/node_modules/@blockcast/mmt-base/dist/index.d.ts +7 -0
- package/node_modules/@blockcast/mmt-base/dist/index.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-base/dist/index.js +7 -0
- package/node_modules/@blockcast/mmt-base/dist/index.js.map +1 -0
- package/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts +292 -0
- package/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-base/dist/mmtp.js +612 -0
- package/node_modules/@blockcast/mmt-base/dist/mmtp.js.map +1 -0
- package/node_modules/@blockcast/mmt-base/dist/net-constants.d.ts +18 -0
- package/node_modules/@blockcast/mmt-base/dist/net-constants.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-base/dist/net-constants.js +18 -0
- package/node_modules/@blockcast/mmt-base/dist/net-constants.js.map +1 -0
- package/node_modules/@blockcast/mmt-base/dist/ntp-short.d.ts +47 -0
- package/node_modules/@blockcast/mmt-base/dist/ntp-short.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-base/dist/ntp-short.js +54 -0
- package/node_modules/@blockcast/mmt-base/dist/ntp-short.js.map +1 -0
- package/node_modules/@blockcast/mmt-base/dist/serial-number.d.ts +57 -0
- package/node_modules/@blockcast/mmt-base/dist/serial-number.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-base/dist/serial-number.js +98 -0
- package/node_modules/@blockcast/mmt-base/dist/serial-number.js.map +1 -0
- package/node_modules/@blockcast/mmt-base/dist/signalling.d.ts +312 -0
- package/node_modules/@blockcast/mmt-base/dist/signalling.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-base/dist/signalling.js +637 -0
- package/node_modules/@blockcast/mmt-base/dist/signalling.js.map +1 -0
- package/node_modules/@blockcast/mmt-base/package.json +49 -0
- package/node_modules/@blockcast/mmt-base/src/fec-block-profile.ts +145 -0
- package/node_modules/@blockcast/mmt-base/src/index.ts +6 -0
- package/node_modules/@blockcast/mmt-base/src/mmtp.ts +892 -0
- package/node_modules/@blockcast/mmt-base/src/net-constants.ts +17 -0
- package/node_modules/@blockcast/mmt-base/src/ntp-short.ts +67 -0
- package/node_modules/@blockcast/mmt-base/src/serial-number.ts +107 -0
- package/node_modules/@blockcast/mmt-base/src/signalling.ts +862 -0
- package/node_modules/@blockcast/mmt-fec/README.md +271 -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 +106 -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 +288 -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 +205 -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 +240 -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 +28 -0
- package/node_modules/@blockcast/mmt-fec/dist/index.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/index.js +28 -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 +258 -0
- package/node_modules/@blockcast/mmt-fec/dist/oti.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/oti.js +382 -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/dist/repair-group.d.ts +82 -0
- package/node_modules/@blockcast/mmt-fec/dist/repair-group.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/repair-group.js +170 -0
- package/node_modules/@blockcast/mmt-fec/dist/repair-group.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 +134 -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/fec-block-profile.d.ts +55 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/fec-block-profile.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/fec-block-profile.js +128 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/fec-block-profile.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.d.ts +7 -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 +7 -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 +292 -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 +612 -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/dist/net-constants.d.ts +18 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/net-constants.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/net-constants.js +18 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/net-constants.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/ntp-short.d.ts +47 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/ntp-short.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/ntp-short.js +54 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/ntp-short.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/serial-number.d.ts +57 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/serial-number.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/serial-number.js +98 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/serial-number.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/signalling.d.ts +312 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/signalling.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/signalling.js +637 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/signalling.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/fec-block-profile.ts +145 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/index.ts +6 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/mmtp.ts +892 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/net-constants.ts +17 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/ntp-short.ts +67 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/serial-number.ts +107 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/signalling.ts +862 -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 +439 -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 +310 -0
- package/node_modules/@blockcast/mmt-fec/src/index.ts +94 -0
- package/node_modules/@blockcast/mmt-fec/src/loc-symbols.ts +34 -0
- package/node_modules/@blockcast/mmt-fec/src/oti.ts +463 -0
- package/node_modules/@blockcast/mmt-fec/src/reorder-buffer.ts +101 -0
- package/node_modules/@blockcast/mmt-fec/src/repair-group.ts +195 -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 +179 -8
- package/schemas/catalog.schema.json +357 -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/block-policy.ts +903 -0
- package/src/carp-catalog.ts +1065 -0
- package/src/catalog-fec-params.ts +729 -0
- package/src/catalog-network-source.ts +74 -0
- package/src/catalog-validator.ts +34 -0
- package/src/cmaf-block-assembler.ts +1255 -0
- package/src/cmaf-group-batcher.ts +104 -0
- package/src/cmcd-producer.ts +329 -0
- package/src/codec-utils.ts +1984 -0
- package/src/conceal-timeline.ts +293 -0
- package/src/delivery-gap.ts +147 -0
- package/src/duplicate-ledger.ts +372 -0
- package/src/fec-codec.ts +61 -0
- package/src/fec-manager.ts +4298 -0
- package/src/fec-starvation-detector.ts +128 -0
- package/src/fec-state.ts +219 -0
- package/src/fec-worker-setup.ts +283 -0
- package/src/fmp4-completion.ts +47 -0
- package/src/fmp4-reader.ts +112 -0
- package/src/index.ts +590 -21
- package/src/iso-block-locator.ts +329 -0
- package/src/iso-bmff-timing.ts +813 -0
- package/src/loc.ts +128 -154
- package/src/manifest-auth-plan.ts +107 -0
- package/src/media-router.ts +841 -0
- package/src/mfu-reassembler.ts +3480 -155
- package/src/mfu-reassembly-policy.ts +134 -0
- package/src/mmtp-container-parser.ts +2380 -0
- package/src/mmtp-decode-pipeline.ts +406 -0
- package/src/mmtp-router.ts +4860 -0
- package/src/mmtp-to-cmaf.ts +977 -0
- package/src/multicast-auth-catalog.ts +340 -0
- package/src/multicast-input.ts +793 -0
- package/src/multicast-manager.ts +2783 -0
- package/src/multicast-transport.ts +1058 -0
- package/src/multicast-unwrap.ts +132 -0
- package/src/no-modules.ts +21 -0
- package/src/phase14-catalog-override.ts +336 -0
- package/src/repair-fetch.ts +772 -0
- package/src/repair-layers.ts +533 -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 +205 -0
- package/src/track-pipeline.ts +332 -0
- package/src/track-session.ts +1010 -0
- package/src/transport-pool.ts +128 -0
- package/src/wasm-mfu-reassembler.ts +405 -0
- package/src/wasm-mmtp-container-parser.ts +23 -0
- package/test-vectors/align.json +199 -0
- package/test-vectors/catalog/README.md +106 -0
- package/test-vectors/catalog/negative/archive-origin-with-path.json +33 -0
- package/test-vectors/catalog/negative/archive-unknown-field.json +34 -0
- package/test-vectors/catalog/negative/fec-block-profile-missing.json +51 -0
- package/test-vectors/catalog/negative/fec-block-profile-unknown.json +52 -0
- package/test-vectors/catalog/negative/fec-enhancement-repair-removed.json +28 -0
- package/test-vectors/catalog/negative/fec-repair-layer-geometry.json +33 -0
- package/test-vectors/catalog/negative/fec-repair-layer-missing-symbols.json +31 -0
- package/test-vectors/catalog/negative/fec-repair-multiple-depends.json +32 -0
- package/test-vectors/catalog/negative/fec-repair-overlay-with-layer.json +34 -0
- package/test-vectors/catalog/negative/fec-repair-priority-out-of-band.json +24 -0
- package/test-vectors/catalog/negative/fec-repair-source-symbols-without-scope.json +33 -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/multicast-network-source-empty.json +44 -0
- package/test-vectors/catalog/negative/multicast-packet-id-signaling.json +26 -0
- package/test-vectors/catalog/negative/network-source-object.json +25 -0
- package/test-vectors/catalog/negative/raptorq-source-symbols-over-max.json +24 -0
- package/test-vectors/catalog/negative/raptorq-unaligned-symbol.json +27 -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/archive-origin.json +34 -0
- package/test-vectors/catalog/positive/fec-iso-ssbg1.json +52 -0
- package/test-vectors/catalog/positive/fec-layered-repair.json +106 -0
- package/test-vectors/catalog/positive/fec-multicast.json +52 -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/multicast-native-ssm-no-network-source.json +43 -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 +732 -0
- package/test-vectors/catalog-validator-public-api.mjs +25 -0
- package/test-vectors/generate-source-auth-fixture.mjs +114 -0
- package/test-vectors/hevc-x265-repeat-headers-v1.json +40 -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
- package/dist/mmtp.d.ts +0 -73
- package/dist/mmtp.d.ts.map +0 -1
- package/dist/mmtp.js +0 -210
- package/dist/mmtp.js.map +0 -1
- package/src/mmtp.ts +0 -277
|
@@ -0,0 +1,729 @@
|
|
|
1
|
+
// Catalog → per-track FEC geometry resolution.
|
|
2
|
+
//
|
|
3
|
+
// Moved from hang-mmt-fec's js/watch/src/track-fec-params.ts so every player
|
|
4
|
+
// (moq-lib/hang, moqtail, shaka MSF) resolves catalog FEC semantics through
|
|
5
|
+
// one shared implementation — players keep only wiring, not MMT/catalog
|
|
6
|
+
// interpretation. Structural track shape ({ name, type }) keeps this module
|
|
7
|
+
// player-agnostic.
|
|
8
|
+
|
|
9
|
+
import {
|
|
10
|
+
FEC_BLOCK_PROFILES,
|
|
11
|
+
isFecBlockProfile,
|
|
12
|
+
parseFecBlockProfile,
|
|
13
|
+
type FecBlockProfile,
|
|
14
|
+
} from "@blockcast/mmt-base";
|
|
15
|
+
import { catalogFecInterleaveMs, type FecInterleaveCatalog } from "@blockcast/mmt-fec";
|
|
16
|
+
import { resolveGroupDurationMs } from "./carp-catalog.js";
|
|
17
|
+
import { MIN_INTERLEAVE_DEPTH_MS, catalogDeclaresFec, isoBlockSpanUsable } from "./fec-state.js";
|
|
18
|
+
import {
|
|
19
|
+
assembleRepairLayers,
|
|
20
|
+
assertRepairTrackReachable,
|
|
21
|
+
describeRepairTrack,
|
|
22
|
+
rejectRepairFieldsOnMediaTrack,
|
|
23
|
+
rejectRepairTrackGeometry,
|
|
24
|
+
repairReachability,
|
|
25
|
+
dependsTarget,
|
|
26
|
+
readFecBlockProfile,
|
|
27
|
+
RepairContractError,
|
|
28
|
+
type RepairLayerParams,
|
|
29
|
+
type RepairLayersResolution,
|
|
30
|
+
type RepairOverlayParams,
|
|
31
|
+
type RepairSourceGeometry,
|
|
32
|
+
type RepairTrackDescriptor,
|
|
33
|
+
throwRepairContractError,
|
|
34
|
+
validateRepairTrackFields,
|
|
35
|
+
} from "./repair-layers.js";
|
|
36
|
+
import type { RepairTarget } from "./repair-fetch.js";
|
|
37
|
+
|
|
38
|
+
export { catalogFecInterleaveMs, type FecInterleaveCatalog };
|
|
39
|
+
export { FEC_BLOCK_PROFILES, isFecBlockProfile, parseFecBlockProfile, type FecBlockProfile };
|
|
40
|
+
export {
|
|
41
|
+
assembleRepairLayers,
|
|
42
|
+
assertRepairTrackReachable,
|
|
43
|
+
repairReachability,
|
|
44
|
+
type AssembleRepairLayersOptions,
|
|
45
|
+
type RepairReachability,
|
|
46
|
+
dependsTarget,
|
|
47
|
+
describeRepairTrack,
|
|
48
|
+
readFecBlockProfile,
|
|
49
|
+
rejectRepairFieldsOnMediaTrack,
|
|
50
|
+
rejectRepairTrackGeometry,
|
|
51
|
+
REPAIR_TRACK_GEOMETRY_KEYS,
|
|
52
|
+
REPAIR_TRACK_ONLY_KEYS,
|
|
53
|
+
validateRepairTrackFields,
|
|
54
|
+
DEFAULT_REPAIR_PRIORITY,
|
|
55
|
+
MAX_ENCODING_SYMBOL_ID,
|
|
56
|
+
MAX_RAPTORQ_SOURCE_SYMBOLS,
|
|
57
|
+
MAX_REPAIR_SYMBOLS,
|
|
58
|
+
REPAIR_PRIORITY_MAX,
|
|
59
|
+
REPAIR_PRIORITY_MIN,
|
|
60
|
+
RepairContractError,
|
|
61
|
+
type RepairContractCode,
|
|
62
|
+
type RepairContractFail,
|
|
63
|
+
type RepairLayerParams,
|
|
64
|
+
type RepairLayersResolution,
|
|
65
|
+
type RepairOverlayParams,
|
|
66
|
+
type RepairSourceGeometry,
|
|
67
|
+
type RepairTrackDescriptor,
|
|
68
|
+
} from "./repair-layers.js";
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Minimal structural shape of a resolved endpoint track. Callers may carry
|
|
72
|
+
* extra fields (e.g. hang's ResolvedEndpointTrack adds `pid`) — the resolver
|
|
73
|
+
* only reads `name` and `type`.
|
|
74
|
+
*/
|
|
75
|
+
export type CatalogTrackRef = {
|
|
76
|
+
name: string;
|
|
77
|
+
type: "video" | "audio" | (string & {});
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
type FecCatalog = FecInterleaveCatalog & {
|
|
81
|
+
algorithm?: unknown;
|
|
82
|
+
/** FEC block profile token (BLO-35597): required on a declared FEC
|
|
83
|
+
* instance, read through `readFecBlockProfile`. */
|
|
84
|
+
blockProfile?: unknown;
|
|
85
|
+
sourceSymbols?: number;
|
|
86
|
+
repairSymbols?: number;
|
|
87
|
+
symbolSize?: number;
|
|
88
|
+
/** Signaled jitter/reorder allowance in ms (added to the block span). */
|
|
89
|
+
reorderToleranceMs?: number;
|
|
90
|
+
/** Layer 0 repair track. Further layers and overlays describe themselves
|
|
91
|
+
* (draft-ramadan-moq-fec §6.3): MSF `tracks[]` entries with
|
|
92
|
+
* `packaging: "fec-repair"`, or hang `repair.renditions` entries, that
|
|
93
|
+
* `depend` on this rendition. */
|
|
94
|
+
repairTrack?: string;
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
/** One self-describing repair rendition of the hang catalog's `repair` block
|
|
98
|
+
* (draft-ramadan-moq-fec §6.3). Mirrors the MSF fec-repair track fields. */
|
|
99
|
+
export type RepairRenditionCatalog = {
|
|
100
|
+
depends?: unknown;
|
|
101
|
+
repairLayer?: unknown;
|
|
102
|
+
repairSymbols?: unknown;
|
|
103
|
+
priority?: unknown;
|
|
104
|
+
scope?: unknown;
|
|
105
|
+
sourceSymbols?: unknown;
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
/** The container fields the FEC and group-duration readers consult. */
|
|
109
|
+
type ContainerCatalog = { kind?: unknown; timescale?: unknown };
|
|
110
|
+
|
|
111
|
+
type RenditionCatalog = KeyframeCadenceCatalog & {
|
|
112
|
+
container?: ContainerCatalog;
|
|
113
|
+
fec?: FecCatalog;
|
|
114
|
+
framerate?: unknown;
|
|
115
|
+
sampleRate?: unknown;
|
|
116
|
+
samplerate?: unknown;
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
type CatalogWithRenditions = {
|
|
120
|
+
video?: { renditions?: Record<string, RenditionCatalog> };
|
|
121
|
+
audio?: { renditions?: Record<string, RenditionCatalog> };
|
|
122
|
+
/** hang-native repair renditions: every repair track beyond layer 0. */
|
|
123
|
+
repair?: { renditions?: Record<string, RepairRenditionCatalog> };
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
/** An MSF/CMSF catalog: `tracks[]` entries, each self-describing. */
|
|
127
|
+
type CatalogWithTracks = {
|
|
128
|
+
tracks?: unknown;
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
/** Either catalog dialect `resolveRepairLayers` reads. */
|
|
132
|
+
export type RepairLayerCatalog = CatalogWithRenditions | CatalogWithTracks;
|
|
133
|
+
|
|
134
|
+
export type GroupDurationCatalog = {
|
|
135
|
+
groupDurationTicks?: number;
|
|
136
|
+
groupDurationMs?: number;
|
|
137
|
+
timescale?: number;
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
/** Rendition fields the group-duration reader consumes. */
|
|
141
|
+
export type GroupDurationRendition = GroupDurationCatalog & {
|
|
142
|
+
container?: ContainerCatalog;
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Largest tick count per Hz of timescale whose millisecond duration
|
|
147
|
+
* `resolveGroupDurationMs` still accepts: `(ticks / timescale) * 1000` must not
|
|
148
|
+
* exceed `Number.MAX_SAFE_INTEGER`, so `ticks <= timescale * (MAX_SAFE / 1000)`
|
|
149
|
+
* (Hz times seconds is ticks).
|
|
150
|
+
*/
|
|
151
|
+
const MAX_SAFE_TICKS_PER_HZ = Number.MAX_SAFE_INTEGER / 1000;
|
|
152
|
+
|
|
153
|
+
/** A positive safe-integer Hz timescale, or undefined. */
|
|
154
|
+
function timescaleHz(value: unknown): number | undefined {
|
|
155
|
+
return typeof value === "number" && Number.isSafeInteger(value) && value > 0 ? value : undefined;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* A rendition's publisher group duration in ms, or undefined when the catalog
|
|
160
|
+
* carries none.
|
|
161
|
+
*
|
|
162
|
+
* `groupDurationTicks` over a timescale wins when both are present, through
|
|
163
|
+
* `resolveGroupDurationMs` (draft-ramadan-moq-mmt-00 §4.4.4). The timescale is
|
|
164
|
+
* the MMTP container's when the rendition declares one, else the rendition's
|
|
165
|
+
* own `timescale`. Only the ticks are forwarded: a catalog `groupDurationMs`
|
|
166
|
+
* is often a rounded fraction (21.33 for 1024/48000), which the ticks path
|
|
167
|
+
* never reads but `resolveGroupDurationMs` would reject as a non-integral ms.
|
|
168
|
+
* Ticks with no usable timescale, and ticks that `resolveGroupDurationMs`
|
|
169
|
+
* would reject, fall back to `groupDurationMs` rather than guessing a clock.
|
|
170
|
+
* That rejection is on the product, not the operand: the count must be a safe
|
|
171
|
+
* integer and `(ticks / timescale) * 1000` must stay within
|
|
172
|
+
* `Number.MAX_SAFE_INTEGER`, which a safe-integer count can still exceed when
|
|
173
|
+
* `timescale < 1000`, so the guard below bounds the count by
|
|
174
|
+
* `timescale * (Number.MAX_SAFE_INTEGER / 1000)` and the reader never throws.
|
|
175
|
+
* The production catalog signals both fields on every rendition and no
|
|
176
|
+
* rendition-level timescale, so the `groupDurationMs` fallback is the path it
|
|
177
|
+
* takes.
|
|
178
|
+
*/
|
|
179
|
+
export function catalogGroupDurationMs(rendition: GroupDurationRendition | undefined): number | undefined {
|
|
180
|
+
if (!rendition) return undefined;
|
|
181
|
+
const ticks = numericField(rendition.groupDurationTicks);
|
|
182
|
+
const ms = numericField(rendition.groupDurationMs);
|
|
183
|
+
const timescale =
|
|
184
|
+
timescaleHz(rendition.container?.kind === "mmtp" ? rendition.container.timescale : undefined) ??
|
|
185
|
+
timescaleHz(rendition.timescale);
|
|
186
|
+
if (
|
|
187
|
+
ticks !== undefined &&
|
|
188
|
+
timescale !== undefined &&
|
|
189
|
+
Number.isSafeInteger(ticks) &&
|
|
190
|
+
ticks <= timescale * MAX_SAFE_TICKS_PER_HZ
|
|
191
|
+
) {
|
|
192
|
+
return resolveGroupDurationMs({ groupDurationTicks: ticks }, timescale);
|
|
193
|
+
}
|
|
194
|
+
return ms;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* The group duration of the catalog rendition an endpoint track was resolved
|
|
199
|
+
* from, by type and name (the same lookup `resolveCatalogTrackFec` performs
|
|
200
|
+
* for FEC geometry). Undefined when the rendition is missing or carries no
|
|
201
|
+
* group duration, so a caller that needs one can fail closed by name.
|
|
202
|
+
*/
|
|
203
|
+
export function resolveCatalogTrackGroupDurationMs(
|
|
204
|
+
catalog: CatalogWithRenditions | undefined,
|
|
205
|
+
track: CatalogTrackRef,
|
|
206
|
+
): number | undefined {
|
|
207
|
+
const renditions = track.type === "audio" ? catalog?.audio?.renditions : catalog?.video?.renditions;
|
|
208
|
+
return catalogGroupDurationMs(renditions?.[track.name]);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
export type KeyframeCadenceCatalog = GroupDurationCatalog & {
|
|
212
|
+
keyframeDurationTicks?: number;
|
|
213
|
+
keyframeDurationMs?: number;
|
|
214
|
+
keyframeIntervalTicks?: number;
|
|
215
|
+
keyframeIntervalMs?: number;
|
|
216
|
+
gopDurationTicks?: number;
|
|
217
|
+
gopDurationMs?: number;
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* Why a track's catalog `fec` block resolved to no FEC although it is not a
|
|
222
|
+
* plain no-FEC declaration (BLO-35597): it declares an FEC instance but names
|
|
223
|
+
* no `blockProfile`, or it names a token that is not a known profile
|
|
224
|
+
* (`track_fec_block_profile`), or it names `iso-ssbg1-v1` without the block
|
|
225
|
+
* span that bounds that profile's block location (`track_fec`, on
|
|
226
|
+
* `interleaveDepthMs`). The profile selects the block math and is never
|
|
227
|
+
* defaulted or inferred, and the span is never borrowed from another track, so
|
|
228
|
+
* such a track carries no FEC geometry and no repair track, and it is the only
|
|
229
|
+
* track affected: every other track of the catalog resolves as usual.
|
|
230
|
+
*/
|
|
231
|
+
export type TrackFecUnavailable = {
|
|
232
|
+
/** The repair-contract code a catalog validator reports for the same field. */
|
|
233
|
+
readonly code: "track_fec_block_profile" | "track_fec";
|
|
234
|
+
/** JSON path of the offending field: `blockProfile`, or `interleaveDepthMs`. */
|
|
235
|
+
readonly path: string;
|
|
236
|
+
/** What is wrong, worded as the `RepairContractError` a validator throws. */
|
|
237
|
+
readonly message: string;
|
|
238
|
+
};
|
|
239
|
+
|
|
240
|
+
export type TrackFecParams = {
|
|
241
|
+
fecK: number;
|
|
242
|
+
/** The catalog `fec.blockProfile` (BLO-35597, ISO/IEC 23008-1 Annex C).
|
|
243
|
+
* Present exactly when the track has FEC (`fecK > 0`) and absent on no
|
|
244
|
+
* FEC: it selects the block math (`k-padded-v1`: SS_Start = SBN*K over
|
|
245
|
+
* zero-padded K-symbol blocks; `iso-ssbg1-v1`: ssbg_mode1, K' =
|
|
246
|
+
* SSB_length, consecutive SS_IDs), so it is never defaulted. A declared
|
|
247
|
+
* instance that names no known profile has no FEC; `fecUnavailable` says
|
|
248
|
+
* why. */
|
|
249
|
+
fecBlockProfile?: FecBlockProfile;
|
|
250
|
+
/** Present exactly when the track's `fec` block names no usable
|
|
251
|
+
* `blockProfile`, or names `iso-ssbg1-v1` without a usable block span
|
|
252
|
+
* (see `TrackFecUnavailable`). The track then resolves to
|
|
253
|
+
* no FEC (`fecK` 0, no `fecBlockProfile`, no repair track) and this is
|
|
254
|
+
* the reason a caller surfaces. Absent on every other track, with FEC or
|
|
255
|
+
* without. */
|
|
256
|
+
fecUnavailable?: TrackFecUnavailable;
|
|
257
|
+
/** P_0: repair symbols per block on layer 0 (the track-level repairSymbols). */
|
|
258
|
+
fecRepairCount: number;
|
|
259
|
+
/** Total repair symbols per block across the BASE layers: the wire
|
|
260
|
+
* RSB_length on every base layer packet. Equals fecRepairCount on a
|
|
261
|
+
* single-layer track. A keyframe overlay is a separate FEC instance with
|
|
262
|
+
* its own RSB_length and is not included. */
|
|
263
|
+
fecTotalRepairCount: number;
|
|
264
|
+
fecSymbolSize: number;
|
|
265
|
+
fecInterleaveMs: number;
|
|
266
|
+
/** Catalog fec.reorderToleranceMs — signaled jitter/reorder allowance, ADDED
|
|
267
|
+
* to the block span to form a deadline. Deliberately `number | undefined`
|
|
268
|
+
* and NOT floored to 0: a declared 0 ("this path needs no slack") and an
|
|
269
|
+
* absent value ("the encoder never said") must stay distinguishable, or a
|
|
270
|
+
* consumer that wants to fail loud on absence silently reads a default
|
|
271
|
+
* instead — which is exactly how the magic 3.0 survived. */
|
|
272
|
+
fecReorderToleranceMs?: number;
|
|
273
|
+
repairTrackName?: string;
|
|
274
|
+
/** Every base repair layer in order, layer 0 first, with derived RS_ID
|
|
275
|
+
* offsets. Present whenever repairTrackName is. */
|
|
276
|
+
repairLayers?: readonly RepairLayerParams[];
|
|
277
|
+
/** Keyframe overlay instances declared for this track. Present (possibly
|
|
278
|
+
* empty) whenever repairLayers is. */
|
|
279
|
+
repairOverlays?: readonly RepairOverlayParams[];
|
|
280
|
+
fps?: number;
|
|
281
|
+
sampleRate?: number;
|
|
282
|
+
};
|
|
283
|
+
|
|
284
|
+
const NO_FEC: TrackFecParams = {
|
|
285
|
+
fecK: 0,
|
|
286
|
+
fecRepairCount: 0,
|
|
287
|
+
fecTotalRepairCount: 0,
|
|
288
|
+
fecSymbolSize: 0,
|
|
289
|
+
fecInterleaveMs: 0,
|
|
290
|
+
};
|
|
291
|
+
|
|
292
|
+
/**
|
|
293
|
+
* Repair symbols per block a receiver has actually joined: the sum of
|
|
294
|
+
* `repairSymbols` over the BASE layers whose repair track it joined
|
|
295
|
+
* (draft-ramadan-moq-fec 6.3). This is a symbol count, not a count of layers.
|
|
296
|
+
*
|
|
297
|
+
* A keyframe overlay is a separate FEC instance with its own K, its own
|
|
298
|
+
* RSB_length and its own RS_ID space, so it is never added here however it was
|
|
299
|
+
* joined. Counting it would overstate the base instance's P and misreport
|
|
300
|
+
* CMCD `x-bc-fec-p`.
|
|
301
|
+
*
|
|
302
|
+
* Falls back to P_0 when the track declares no layers, which is the
|
|
303
|
+
* single-layer identity rather than a default: with one layer, P_0 is the
|
|
304
|
+
* total.
|
|
305
|
+
*/
|
|
306
|
+
export function joinedRepairSymbolCount(
|
|
307
|
+
params: Pick<TrackFecParams, "fecRepairCount" | "repairLayers">,
|
|
308
|
+
joinedRepairTrackNames: Iterable<string>,
|
|
309
|
+
): number {
|
|
310
|
+
const layers = params.repairLayers;
|
|
311
|
+
if (layers === undefined || layers.length === 0) return params.fecRepairCount;
|
|
312
|
+
const joined = new Set(joinedRepairTrackNames);
|
|
313
|
+
let total = 0;
|
|
314
|
+
for (const layer of layers) {
|
|
315
|
+
if (joined.has(layer.repairTrackName)) total += layer.repairSymbols;
|
|
316
|
+
}
|
|
317
|
+
return total;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
function recordOf(value: unknown): Record<string, unknown> | undefined {
|
|
321
|
+
return typeof value === "object" && value !== null && !Array.isArray(value) ? (value as Record<string, unknown>) : undefined;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
/** The MSF `tracks[]` view of a catalog, or undefined for the hang dialect. */
|
|
325
|
+
function msfTracks(catalog: RepairLayerCatalog): { tracks: Record<string, unknown>[] } | undefined {
|
|
326
|
+
const raw = (catalog as CatalogWithTracks).tracks;
|
|
327
|
+
if (!Array.isArray(raw)) return undefined;
|
|
328
|
+
return { tracks: raw.map((t) => recordOf(t) ?? {}) };
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
/**
|
|
332
|
+
* Resolve every repair track of one source track: base layers with derived
|
|
333
|
+
* RS_ID offsets and keyframe overlays (draft-ramadan-moq-fec §6.3), from either
|
|
334
|
+
* catalog dialect.
|
|
335
|
+
*
|
|
336
|
+
* - MSF `tracks[]`: the source is the entry named `source`; repair tracks are
|
|
337
|
+
* `packaging: "fec-repair"` entries. Layer 0 is the source's
|
|
338
|
+
* `fec.repairTrack`; layers 1..n and overlays `depend` on the source.
|
|
339
|
+
* - hang: the source is a `video`/`audio` rendition; repair tracks beyond
|
|
340
|
+
* layer 0 are `repair.renditions` entries that `depend` on it.
|
|
341
|
+
*
|
|
342
|
+
* Returns undefined when the source carries no FEC repair track and nothing
|
|
343
|
+
* depends on it. Throws `RepairContractError` (code + JSON path) on any
|
|
344
|
+
* violation, including a repair rendition whose `depends` names a rendition
|
|
345
|
+
* without FEC, so a player fails closed before joining any repair track.
|
|
346
|
+
*/
|
|
347
|
+
export function resolveRepairLayers(
|
|
348
|
+
catalog: RepairLayerCatalog | undefined,
|
|
349
|
+
source: string | CatalogTrackRef,
|
|
350
|
+
): RepairLayersResolution | undefined {
|
|
351
|
+
if (!catalog) return undefined;
|
|
352
|
+
const sourceName = typeof source === "string" ? source : source.name;
|
|
353
|
+
|
|
354
|
+
// hang dialect first. When a catalog carries hang-native rendition blocks
|
|
355
|
+
// beside a tracks[] switching-set index (the unified ABR ladder catalog),
|
|
356
|
+
// the rendition blocks are authoritative, exactly as they are for hang's own
|
|
357
|
+
// catalog decode. A typed ref resolves only within its own role.
|
|
358
|
+
const hang = catalog as CatalogWithRenditions;
|
|
359
|
+
const roles: Array<"video" | "audio"> =
|
|
360
|
+
typeof source === "string"
|
|
361
|
+
? ["video", "audio"]
|
|
362
|
+
: source.type === "audio"
|
|
363
|
+
? ["audio"]
|
|
364
|
+
: source.type === "video"
|
|
365
|
+
? ["video"]
|
|
366
|
+
: ["video", "audio"];
|
|
367
|
+
const role = roles.find((r) => recordOf(hang[r]?.renditions?.[sourceName]) !== undefined);
|
|
368
|
+
if (role !== undefined) {
|
|
369
|
+
const renditionPath = `$.${role}.renditions[${JSON.stringify(sourceName)}]`;
|
|
370
|
+
const rendition = recordOf(hang[role]!.renditions![sourceName])!;
|
|
371
|
+
rejectRepairFieldsOnMediaTrack(renditionPath, rendition, throwRepairContractError);
|
|
372
|
+
const repairRenditions = recordOf(hang.repair?.renditions) ?? {};
|
|
373
|
+
const descriptors: RepairTrackDescriptor[] = Object.entries(repairRenditions).map(([name, entry]) => {
|
|
374
|
+
const path = `$.repair.renditions[${JSON.stringify(name)}]`;
|
|
375
|
+
const fields = recordOf(entry);
|
|
376
|
+
if (fields === undefined) {
|
|
377
|
+
throwRepairContractError("track_repair_layer", path, "a repair rendition must be an object");
|
|
378
|
+
}
|
|
379
|
+
rejectRepairTrackGeometry(path, fields, throwRepairContractError);
|
|
380
|
+
return describeRepairTrack(name, path, fields);
|
|
381
|
+
});
|
|
382
|
+
const fecOfRendition = (entry: unknown): Record<string, unknown> | undefined => {
|
|
383
|
+
const fec = recordOf(recordOf(entry)?.["fec"]);
|
|
384
|
+
return fec !== undefined && fec["algorithm"] !== "none" ? fec : undefined;
|
|
385
|
+
};
|
|
386
|
+
const mediaRenditions = [
|
|
387
|
+
...Object.values(recordOf(hang.video?.renditions) ?? {}),
|
|
388
|
+
...Object.values(recordOf(hang.audio?.renditions) ?? {}),
|
|
389
|
+
];
|
|
390
|
+
const reachability = repairReachability(mediaRenditions.map((entry) => recordOf(entry)?.["fec"]));
|
|
391
|
+
for (const d of descriptors) {
|
|
392
|
+
validateRepairTrackFields(d, throwRepairContractError);
|
|
393
|
+
assertRepairTrackReachable(d, reachability, throwRepairContractError);
|
|
394
|
+
const target = dependsTarget(d);
|
|
395
|
+
if (target === undefined) continue;
|
|
396
|
+
const targetFec =
|
|
397
|
+
fecOfRendition(hang.video?.renditions?.[target]) ?? fecOfRendition(hang.audio?.renditions?.[target]);
|
|
398
|
+
if (targetFec === undefined) {
|
|
399
|
+
throwRepairContractError(
|
|
400
|
+
"track_repair_depends",
|
|
401
|
+
`${d.path}.depends`,
|
|
402
|
+
`${JSON.stringify(target)} is not a video or audio rendition with FEC`,
|
|
403
|
+
);
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
return assembleRepairLayers(
|
|
407
|
+
geometryOf(sourceName, `${renditionPath}.fec`, recordOf(rendition["fec"])),
|
|
408
|
+
descriptors,
|
|
409
|
+
throwRepairContractError,
|
|
410
|
+
);
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
const msf = msfTracks(catalog);
|
|
414
|
+
const msfIndex = msf ? msf.tracks.findIndex((t) => t["name"] === sourceName) : -1;
|
|
415
|
+
if (!msf || msfIndex < 0) return undefined;
|
|
416
|
+
const track = msf.tracks[msfIndex]!;
|
|
417
|
+
const fec = recordOf(track["fec"]);
|
|
418
|
+
const packagingOf = (t: Record<string, unknown>): unknown => t["packaging"];
|
|
419
|
+
const fecOfTrack = (t: Record<string, unknown> | undefined): Record<string, unknown> | undefined => {
|
|
420
|
+
const trackFec = recordOf(t?.["fec"]);
|
|
421
|
+
return trackFec !== undefined && trackFec["algorithm"] !== "none" ? trackFec : undefined;
|
|
422
|
+
};
|
|
423
|
+
// Rule 8 on the resolver path too: a repair track carries no block geometry
|
|
424
|
+
// and a media track carries no repair-track fields. Without this a repair
|
|
425
|
+
// track with its own `fec` would count as a FEC source below and name
|
|
426
|
+
// itself as layer 0, so rule 9 would never see it.
|
|
427
|
+
const descriptors: RepairTrackDescriptor[] = [];
|
|
428
|
+
const mediaTracks: Record<string, unknown>[] = [];
|
|
429
|
+
msf.tracks.forEach((t, i) => {
|
|
430
|
+
const path = `$.tracks[${i}]`;
|
|
431
|
+
if (packagingOf(t) === "fec-repair") {
|
|
432
|
+
rejectRepairTrackGeometry(path, t, throwRepairContractError);
|
|
433
|
+
if (typeof t["name"] === "string") descriptors.push(describeRepairTrack(t["name"], path, t));
|
|
434
|
+
return;
|
|
435
|
+
}
|
|
436
|
+
rejectRepairFieldsOnMediaTrack(path, t, throwRepairContractError);
|
|
437
|
+
mediaTracks.push(t);
|
|
438
|
+
});
|
|
439
|
+
const reachability = repairReachability(mediaTracks.map((t) => t["fec"]));
|
|
440
|
+
for (const d of descriptors) {
|
|
441
|
+
validateRepairTrackFields(d, throwRepairContractError);
|
|
442
|
+
assertRepairTrackReachable(d, reachability, throwRepairContractError);
|
|
443
|
+
const target = dependsTarget(d);
|
|
444
|
+
if (target === undefined) continue;
|
|
445
|
+
const targetTrack = msf.tracks.find((t) => t["name"] === target);
|
|
446
|
+
if (targetTrack === undefined || packagingOf(targetTrack) !== "mmtp" || fecOfTrack(targetTrack) === undefined) {
|
|
447
|
+
throwRepairContractError(
|
|
448
|
+
"track_repair_depends",
|
|
449
|
+
`${d.path}.depends`,
|
|
450
|
+
`${JSON.stringify(target)} is not an mmtp track with FEC`,
|
|
451
|
+
);
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
return assembleRepairLayers(geometryOf(sourceName, `$.tracks[${msfIndex}].fec`, fec), descriptors, throwRepairContractError, {
|
|
455
|
+
layerZeroMustBeDeclared: true,
|
|
456
|
+
});
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
/** A MoQ Transport priority (0..255, lower first), or null. */
|
|
460
|
+
function moqtPriority(value: unknown): number | null {
|
|
461
|
+
return Number.isSafeInteger(value) && (value as number) >= 0 && (value as number) <= 255 ? (value as number) : null;
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
/**
|
|
465
|
+
* The on-demand repair target of one source track, read from the catalog:
|
|
466
|
+
* its base layer 0 repair track and the two catalog priorities
|
|
467
|
+
* draft-ramadan-moq-fec §11.4.5 derives the FETCH's SUBSCRIBER_PRIORITY from
|
|
468
|
+
* (see `repairFetchSubscriberPriority`). This is what a player's
|
|
469
|
+
* `ResolveRepairTarget` returns once it knows which track owns the block.
|
|
470
|
+
*
|
|
471
|
+
* - `repairPriority`: layer 0's catalog `priority`, or 240 when it declares
|
|
472
|
+
* none; that value is defined by draft-ramadan-moq-fec §10, not chosen
|
|
473
|
+
* here (`resolveRepairLayers` applies it).
|
|
474
|
+
* - `sourcePriority`: the source track's MSF `tracks[]` entry `priority`
|
|
475
|
+
* (MoQ Transport scale). A catalog with no MSF entry for the track (a hang-only catalog,
|
|
476
|
+
* whose renditions carry no MoQ Transport priority) yields null, and the
|
|
477
|
+
* keyframe repair FETCH is then sent without the parameter.
|
|
478
|
+
*
|
|
479
|
+
* Returns null when the track has no repair track.
|
|
480
|
+
*
|
|
481
|
+
* @throws RepairContractError exactly as `resolveRepairLayers` does.
|
|
482
|
+
*/
|
|
483
|
+
export function catalogRepairTarget(
|
|
484
|
+
catalog: RepairLayerCatalog | undefined,
|
|
485
|
+
source: string | CatalogTrackRef,
|
|
486
|
+
): RepairTarget | null {
|
|
487
|
+
const repair = resolveRepairLayers(catalog, source);
|
|
488
|
+
const layerZero = repair?.baseLayers[0];
|
|
489
|
+
if (!catalog || !layerZero) return null;
|
|
490
|
+
const sourceName = typeof source === "string" ? source : source.name;
|
|
491
|
+
const msf = msfTracks(catalog);
|
|
492
|
+
const entry = msf?.tracks.find((t) => t["name"] === sourceName);
|
|
493
|
+
const sourcePriority =
|
|
494
|
+
entry === undefined ? null : moqtPriority(entry["priority"]);
|
|
495
|
+
return { repairTrack: layerZero.repairTrackName, sourcePriority, repairPriority: layerZero.priority };
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
function geometryOf(name: string, path: string, fec: Record<string, unknown> | undefined): RepairSourceGeometry {
|
|
499
|
+
return {
|
|
500
|
+
name,
|
|
501
|
+
path,
|
|
502
|
+
algorithm: fec?.["algorithm"],
|
|
503
|
+
sourceSymbols: fec?.["sourceSymbols"],
|
|
504
|
+
repairSymbols: fec?.["repairSymbols"],
|
|
505
|
+
repairTrack: fec?.["repairTrack"],
|
|
506
|
+
};
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
function numericField(value: unknown): number | undefined {
|
|
510
|
+
const n = typeof value === "number" ? value : typeof value === "string" ? Number(value) : Number.NaN;
|
|
511
|
+
return Number.isFinite(n) && n > 0 ? n : undefined;
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
/** Like `numericField` but admits an explicit 0, and still rejects absent,
|
|
515
|
+
* negative and non-finite input. Absence returns undefined so callers can
|
|
516
|
+
* tell "declared none" from "never declared". */
|
|
517
|
+
function nonNegativeField(value: unknown): number | undefined {
|
|
518
|
+
const n = typeof value === "number" ? value : typeof value === "string" ? Number(value) : Number.NaN;
|
|
519
|
+
return Number.isFinite(n) && n >= 0 ? n : undefined;
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
/**
|
|
523
|
+
* The track-scoped reading of `readFecBlockProfile` (BLO-35597): the same one
|
|
524
|
+
* rule every catalog reader applies (a declared FEC instance names a known
|
|
525
|
+
* profile; a block declaring none may omit it, but a token it carries must be
|
|
526
|
+
* known), with its one failure, `track_fec_block_profile`, returned as the
|
|
527
|
+
* track's reason instead of thrown. A profile problem costs only its own
|
|
528
|
+
* track: it never aborts resolving the catalog's other tracks, and the token
|
|
529
|
+
* is still never defaulted or inferred.
|
|
530
|
+
*/
|
|
531
|
+
function blockProfileUnavailable(
|
|
532
|
+
value: unknown,
|
|
533
|
+
path: string,
|
|
534
|
+
declaresFecInstance: boolean,
|
|
535
|
+
): TrackFecUnavailable | undefined {
|
|
536
|
+
try {
|
|
537
|
+
readFecBlockProfile(value, path, declaresFecInstance, throwRepairContractError);
|
|
538
|
+
return undefined;
|
|
539
|
+
} catch (error) {
|
|
540
|
+
if (!(error instanceof RepairContractError) || error.code !== "track_fec_block_profile") throw error;
|
|
541
|
+
return Object.freeze({ code: "track_fec_block_profile", path: error.path, message: error.message });
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
/**
|
|
546
|
+
* An `iso-ssbg1-v1` instance without a usable block span (`isoBlockSpanUsable`)
|
|
547
|
+
* has no FEC for its track alone, instead of resolving to a configuration the
|
|
548
|
+
* FEC manager refuses for every track it holds.
|
|
549
|
+
*/
|
|
550
|
+
function isoSpanUnavailable(fec: unknown, path: string, declaresFecInstance: boolean): TrackFecUnavailable | undefined {
|
|
551
|
+
if (!declaresFecInstance || isoBlockSpanUsable(fec)) return undefined;
|
|
552
|
+
return Object.freeze({
|
|
553
|
+
code: "track_fec",
|
|
554
|
+
path,
|
|
555
|
+
message:
|
|
556
|
+
`[repair-layers:track_fec] ${path}: iso-ssbg1-v1 requires a block span of at least ` +
|
|
557
|
+
`${MIN_INTERLEAVE_DEPTH_MS} ms, which bounds its block location`,
|
|
558
|
+
});
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
/**
|
|
562
|
+
* Per-track FEC geometry, or `NO_FEC` when the rendition declares none (no
|
|
563
|
+
* `fec`, or `algorithm: "none"`) or names no usable `blockProfile` or, under
|
|
564
|
+
* `iso-ssbg1-v1`, no usable block span; the latter two carry `fecUnavailable`.
|
|
565
|
+
*
|
|
566
|
+
* @throws RepairContractError from `resolveRepairLayers` when the rendition
|
|
567
|
+
* declares a `fec` block (any algorithm, `none` included) and the catalog's
|
|
568
|
+
* repair contract is malformed, and `track_fec` when its `fec` declares an FEC
|
|
569
|
+
* instance whose `sourceSymbols` or `symbolSize` is not a positive integer;
|
|
570
|
+
* see `resolveCatalogTrackFec`. An absent or unknown `blockProfile`, or an
|
|
571
|
+
* `iso-ssbg1-v1` span that is absent or below `MIN_INTERLEAVE_DEPTH_MS`, never
|
|
572
|
+
* throws: it is this track's `fecUnavailable`.
|
|
573
|
+
*/
|
|
574
|
+
function fecParams(
|
|
575
|
+
catalog: CatalogWithRenditions | undefined,
|
|
576
|
+
track: CatalogTrackRef | undefined,
|
|
577
|
+
rendition: RenditionCatalog | undefined,
|
|
578
|
+
fps?: number,
|
|
579
|
+
sampleRate?: number,
|
|
580
|
+
): TrackFecParams {
|
|
581
|
+
const mediaRate = sampleRate === undefined ? { fps } : { fps, sampleRate };
|
|
582
|
+
const fec = rendition?.fec;
|
|
583
|
+
// Every caller passes a track with its rendition.
|
|
584
|
+
if (!fec || !track) return { ...NO_FEC, ...mediaRate };
|
|
585
|
+
// The repair contract is enforced for every declared `fec` block, including
|
|
586
|
+
// one that declares no FEC instance (a repair layer may not depend on it).
|
|
587
|
+
const repair = resolveRepairLayers(catalog, track);
|
|
588
|
+
const fecPath = `$.${track.type}.renditions[${JSON.stringify(track.name)}].fec`;
|
|
589
|
+
// One predicate for "this track has FEC", shared with resolveFecState: K
|
|
590
|
+
// and T are positive integers, the algorithm is not `none`, and the block
|
|
591
|
+
// profile is known.
|
|
592
|
+
if (!catalogDeclaresFec(fec)) {
|
|
593
|
+
const declaresFecInstance = fec.algorithm !== "none";
|
|
594
|
+
const kValid = Number.isSafeInteger(fec.sourceSymbols) && (fec.sourceSymbols ?? 0) > 0;
|
|
595
|
+
const tValid = Number.isSafeInteger(fec.symbolSize) && (fec.symbolSize ?? 0) > 0;
|
|
596
|
+
if (declaresFecInstance && !(kValid && tValid)) {
|
|
597
|
+
// Any algorithm but `none` declares an FEC instance, so geometry a
|
|
598
|
+
// decoder cannot configure is a malformed catalog, not "no FEC".
|
|
599
|
+
// Returning NO_FEC would silently drop the track's repair
|
|
600
|
+
// subscription (repairTrackName, repairLayers, repairOverlays).
|
|
601
|
+
throwRepairContractError(
|
|
602
|
+
"track_fec",
|
|
603
|
+
`${fecPath}.${kValid ? "symbolSize" : "sourceSymbols"}`,
|
|
604
|
+
"must be a positive integer",
|
|
605
|
+
);
|
|
606
|
+
}
|
|
607
|
+
// What remains is `algorithm: "none"` (which carries no profile; a token
|
|
608
|
+
// it does carry must still be known) or a declared instance naming no
|
|
609
|
+
// known profile. Neither has FEC; an unusable profile says why, for this
|
|
610
|
+
// track alone.
|
|
611
|
+
const fecUnavailable =
|
|
612
|
+
blockProfileUnavailable(fec.blockProfile, `${fecPath}.blockProfile`, declaresFecInstance) ??
|
|
613
|
+
isoSpanUnavailable(fec, `${fecPath}.interleaveDepthMs`, declaresFecInstance);
|
|
614
|
+
return fecUnavailable === undefined ? { ...NO_FEC, ...mediaRate } : { ...NO_FEC, ...mediaRate, fecUnavailable };
|
|
615
|
+
}
|
|
616
|
+
// The predicate held, so the profile is known: this read cannot fail.
|
|
617
|
+
const fecBlockProfile = readFecBlockProfile(fec.blockProfile, `${fecPath}.blockProfile`, true, throwRepairContractError);
|
|
618
|
+
return {
|
|
619
|
+
fecK: fec.sourceSymbols ?? 0,
|
|
620
|
+
fecBlockProfile,
|
|
621
|
+
fecRepairCount: fec.repairSymbols ?? 0,
|
|
622
|
+
// The wire RSB_length: every base layer's packets carry the base total (§7.1).
|
|
623
|
+
fecTotalRepairCount: repair?.totalBaseRepairSymbols ?? fec.repairSymbols ?? 0,
|
|
624
|
+
fecSymbolSize: fec.symbolSize ?? 0,
|
|
625
|
+
// interleaveDepthMs is the FEC block span in MILLISECONDS (§5.1) — the
|
|
626
|
+
// only interleave key the catalog carries post-BLO-14526. Receivers
|
|
627
|
+
// derive D by positive round-half-up of span / GOP duration where needed.
|
|
628
|
+
fecInterleaveMs: catalogFecInterleaveMs(fec) ?? 0,
|
|
629
|
+
// Additive, never a multiplier on the span: jitter belongs to the network
|
|
630
|
+
// path and the span belongs to the encoder, so scaling one by the other
|
|
631
|
+
// hands one network different slack per track. `numericField` rejects 0,
|
|
632
|
+
// so it cannot be reused here — a declared 0 is a legitimate value.
|
|
633
|
+
fecReorderToleranceMs: nonNegativeField(fec.reorderToleranceMs),
|
|
634
|
+
repairTrackName: fec.repairTrack,
|
|
635
|
+
repairLayers: repair?.baseLayers,
|
|
636
|
+
repairOverlays: repair?.overlays,
|
|
637
|
+
...mediaRate,
|
|
638
|
+
};
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
/**
|
|
642
|
+
* Resolves per-track FEC geometry from the catalog for the active endpoint tracks.
|
|
643
|
+
*
|
|
644
|
+
* `video`/`audio` (and the top-level names and `catalogFps`) describe the
|
|
645
|
+
* FIRST video and audio track of `tracks`. `forTrack` resolves any track from
|
|
646
|
+
* its OWN rendition, scoped by its type: a second video track (an ABR rung or
|
|
647
|
+
* simulcast variant, possibly sharing a packetId) gets its own framerate,
|
|
648
|
+
* interleave and repair layers, never the first rendition's. A track with no
|
|
649
|
+
* rendition of its type resolves to no FEC (`fecK` 0) and no media rate.
|
|
650
|
+
*
|
|
651
|
+
* The block profile is track-scoped (BLO-35597). A rendition whose `fec`
|
|
652
|
+
* declares an FEC instance but names no `blockProfile`, or whose `fec` (a
|
|
653
|
+
* `none` block included) names a token that is not a known profile, resolves
|
|
654
|
+
* to no FEC: `fecK` 0, no `fecBlockProfile`, no repair track, and
|
|
655
|
+
* `fecUnavailable` carrying the `track_fec_block_profile` reason at the
|
|
656
|
+
* field's JSON path for the caller to surface. Every other track resolves as
|
|
657
|
+
* usual. The profile is never defaulted or inferred; `algorithm: "none"` may
|
|
658
|
+
* omit it.
|
|
659
|
+
*
|
|
660
|
+
* @throws RepairContractError `track_fec` when a rendition's `fec` declares an
|
|
661
|
+
* FEC instance (any `algorithm` but `none`) whose `sourceSymbols` or
|
|
662
|
+
* `symbolSize` is not a positive integer, and when a rendition that declares a
|
|
663
|
+
* `fec` block (any algorithm, `none` included) carries a repair contract that
|
|
664
|
+
* violates draft-ramadan-moq-fec 6.3 (a gap or
|
|
665
|
+
* duplicate in the layer chain, a bad `depends` target, an unreachable repair
|
|
666
|
+
* track, a bound violation). Because the hang dialect validates every `repair.renditions`
|
|
667
|
+
* entry of the catalog, resolving the video track fails on a malformed audio
|
|
668
|
+
* repair rendition too. This is deliberate: a player must fail closed before it
|
|
669
|
+
* joins any repair track. Callers that used to treat this function as total
|
|
670
|
+
* must catch it and surface the catalog error.
|
|
671
|
+
*/
|
|
672
|
+
export function resolveCatalogTrackFec(
|
|
673
|
+
catalog: CatalogWithRenditions | undefined,
|
|
674
|
+
tracks: readonly CatalogTrackRef[],
|
|
675
|
+
): {
|
|
676
|
+
videoTrackName?: string;
|
|
677
|
+
audioTrackName?: string;
|
|
678
|
+
missingVideoRendition?: string;
|
|
679
|
+
missingAudioRendition?: string;
|
|
680
|
+
videoForKeyframeRepair?: KeyframeCadenceCatalog;
|
|
681
|
+
catalogFps?: number;
|
|
682
|
+
video: TrackFecParams;
|
|
683
|
+
audio: TrackFecParams;
|
|
684
|
+
forTrack(track: CatalogTrackRef): TrackFecParams;
|
|
685
|
+
} {
|
|
686
|
+
const videoTrackName = tracks.find((t) => t.type === "video")?.name;
|
|
687
|
+
const audioTrackName = tracks.find((t) => t.type === "audio")?.name;
|
|
688
|
+
const videoRenditions = catalog?.video?.renditions;
|
|
689
|
+
const audioRenditions = catalog?.audio?.renditions;
|
|
690
|
+
const video = videoTrackName ? videoRenditions?.[videoTrackName] : undefined;
|
|
691
|
+
const audio = audioTrackName ? audioRenditions?.[audioTrackName] : undefined;
|
|
692
|
+
const catalogFps = numericField(video?.framerate);
|
|
693
|
+
const sampleRate = numericField(audio?.sampleRate ?? audio?.samplerate);
|
|
694
|
+
const audioFps = sampleRate ? sampleRate / 1024 : undefined;
|
|
695
|
+
const videoParams = fecParams(catalog, videoTrackName ? { name: videoTrackName, type: "video" } : undefined, video, catalogFps);
|
|
696
|
+
const audioParams = fecParams(
|
|
697
|
+
catalog,
|
|
698
|
+
audioTrackName ? { name: audioTrackName, type: "audio" } : undefined,
|
|
699
|
+
audio,
|
|
700
|
+
audioFps,
|
|
701
|
+
sampleRate,
|
|
702
|
+
);
|
|
703
|
+
|
|
704
|
+
const forTrack = (track: CatalogTrackRef): TrackFecParams => {
|
|
705
|
+
if (track.type === "audio") {
|
|
706
|
+
if (track.name === audioTrackName) return audioParams;
|
|
707
|
+
const rendition = audioRenditions?.[track.name];
|
|
708
|
+
if (!rendition) return { ...NO_FEC };
|
|
709
|
+
const rate = numericField(rendition.sampleRate ?? rendition.samplerate);
|
|
710
|
+
return fecParams(catalog, { name: track.name, type: "audio" }, rendition, rate ? rate / 1024 : undefined, rate);
|
|
711
|
+
}
|
|
712
|
+
if (track.name === videoTrackName) return videoParams;
|
|
713
|
+
const rendition = videoRenditions?.[track.name];
|
|
714
|
+
if (!rendition) return { ...NO_FEC };
|
|
715
|
+
return fecParams(catalog, { name: track.name, type: "video" }, rendition, numericField(rendition.framerate));
|
|
716
|
+
};
|
|
717
|
+
|
|
718
|
+
return {
|
|
719
|
+
videoTrackName,
|
|
720
|
+
audioTrackName,
|
|
721
|
+
missingVideoRendition: videoTrackName && videoRenditions && !video ? videoTrackName : undefined,
|
|
722
|
+
missingAudioRendition: audioTrackName && audioRenditions && !audio ? audioTrackName : undefined,
|
|
723
|
+
videoForKeyframeRepair: video,
|
|
724
|
+
catalogFps,
|
|
725
|
+
video: videoParams,
|
|
726
|
+
audio: audioParams,
|
|
727
|
+
forTrack,
|
|
728
|
+
};
|
|
729
|
+
}
|