@blockcast/mmt-container 0.3.0 → 0.4.0-main.71d61b2a53f2
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 +33 -16
- package/dist/browser-runtime.js +14743 -14412
- package/dist/browser-runtime.js.map +4 -4
- package/dist/carp-catalog.d.ts +24 -19
- package/dist/carp-catalog.d.ts.map +1 -1
- package/dist/carp-catalog.js +29 -14
- package/dist/carp-catalog.js.map +4 -4
- package/dist/catalog-fec-params.d.ts +88 -28
- package/dist/catalog-fec-params.d.ts.map +1 -1
- package/dist/catalog-fec-params.js +60 -23
- package/dist/catalog-fec-params.js.map +4 -4
- package/dist/catalog-network-source.js +1 -7
- package/dist/catalog-network-source.js.map +4 -4
- package/dist/cmaf-block-assembler.d.ts +0 -2
- package/dist/cmaf-block-assembler.d.ts.map +1 -1
- package/dist/cmaf-block-assembler.js +0 -1
- package/dist/cmaf-block-assembler.js.map +2 -2
- package/dist/cmcd-producer.d.ts.map +1 -1
- package/dist/cmcd-producer.js +0 -4
- package/dist/cmcd-producer.js.map +2 -2
- package/dist/delivery-catalog.d.ts +124 -0
- package/dist/delivery-catalog.d.ts.map +1 -0
- package/dist/delivery-catalog.js +1857 -0
- package/dist/delivery-catalog.js.map +7 -0
- package/dist/delta-fallback-config.d.ts +42 -0
- package/dist/delta-fallback-config.d.ts.map +1 -0
- package/dist/delta-fallback-config.js +59 -0
- package/dist/delta-fallback-config.js.map +7 -0
- package/dist/fec-manager.d.ts +36 -30
- package/dist/fec-manager.d.ts.map +1 -1
- package/dist/fec-manager.js +303 -293
- package/dist/fec-manager.js.map +4 -4
- package/dist/fec-state.d.ts +19 -31
- package/dist/fec-state.d.ts.map +1 -1
- package/dist/fec-state.js +4 -10
- package/dist/fec-state.js.map +4 -4
- package/dist/fec-worker-setup.d.ts +18 -14
- package/dist/fec-worker-setup.d.ts.map +1 -1
- package/dist/fec-worker-setup.js +81 -96
- package/dist/fec-worker-setup.js.map +4 -4
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -0
- package/dist/index.js.map +2 -2
- package/dist/iso-block-locator.js +1 -7
- package/dist/iso-block-locator.js.map +4 -4
- package/dist/media-router.d.ts +20 -8
- package/dist/media-router.d.ts.map +1 -1
- package/dist/media-router.js +46 -21
- package/dist/media-router.js.map +2 -2
- package/dist/mfu-reassembler.js +24 -30
- package/dist/mfu-reassembler.js.map +4 -4
- package/dist/mmtp-container-parser.d.ts +6 -11
- package/dist/mmtp-container-parser.d.ts.map +1 -1
- package/dist/mmtp-container-parser.js +56 -97
- package/dist/mmtp-container-parser.js.map +4 -4
- package/dist/mmtp-container-parser.no-modules.js +78 -105
- package/dist/mmtp-container-parser.no-modules.js.map +4 -4
- package/dist/mmtp-decode-pipeline.js +56 -97
- package/dist/mmtp-decode-pipeline.js.map +4 -4
- package/dist/mmtp-router.d.ts +37 -26
- package/dist/mmtp-router.d.ts.map +1 -1
- package/dist/mmtp-router.js +162 -313
- package/dist/mmtp-router.js.map +4 -4
- package/dist/multicast-input.js +1 -7
- package/dist/multicast-input.js.map +4 -4
- package/dist/multicast-manager.d.ts +34 -6
- package/dist/multicast-manager.d.ts.map +1 -1
- package/dist/multicast-manager.js +709 -658
- package/dist/multicast-manager.js.map +4 -4
- package/dist/multicast-transport.d.ts +1 -1
- package/dist/multicast-transport.d.ts.map +1 -1
- package/dist/multicast-transport.js +44 -26
- package/dist/multicast-transport.js.map +4 -4
- package/dist/multicast-unwrap.js +29 -35
- package/dist/multicast-unwrap.js.map +4 -4
- package/dist/no-modules.js +77 -104
- package/dist/no-modules.js.map +4 -4
- package/dist/repair-fetch.d.ts +30 -19
- package/dist/repair-fetch.d.ts.map +1 -1
- package/dist/repair-fetch.js +33 -24
- package/dist/repair-fetch.js.map +4 -4
- package/dist/repair-layers.d.ts +18 -7
- package/dist/repair-layers.d.ts.map +1 -1
- package/dist/repair-layers.js +12 -10
- package/dist/repair-layers.js.map +4 -4
- package/dist/signaling.js +2 -11
- package/dist/signaling.js.map +4 -4
- package/dist/timestamp-codec.js +24 -30
- package/dist/timestamp-codec.js.map +4 -4
- package/dist/track-session.d.ts +7 -0
- package/dist/track-session.d.ts.map +1 -1
- package/dist/track-session.js +15 -8
- package/dist/track-session.js.map +2 -2
- package/dist/wasm-mfu-reassembler.js +1 -7
- package/dist/wasm-mfu-reassembler.js.map +4 -4
- package/dist/wasm-mmtp-container-parser.js +56 -97
- package/dist/wasm-mmtp-container-parser.js.map +4 -4
- package/package.json +7 -14
- package/schemas/catalog.schema.json +3 -3
- package/src/carp-catalog.ts +46 -24
- package/src/catalog-fec-params.ts +173 -64
- package/src/cmaf-block-assembler.ts +1 -4
- package/src/cmcd-producer.ts +0 -6
- package/src/delivery-catalog.ts +498 -0
- package/src/delta-fallback-config.ts +72 -0
- package/src/fec-manager.ts +414 -334
- package/src/fec-state.ts +20 -32
- package/src/fec-worker-setup.ts +109 -90
- package/src/index.ts +32 -0
- package/src/media-router.ts +59 -21
- package/src/mmtp-container-parser.ts +27 -18
- package/src/mmtp-router.ts +146 -313
- package/src/multicast-manager.ts +184 -83
- package/src/multicast-transport.ts +16 -9
- package/src/repair-fetch.ts +46 -27
- package/src/repair-layers.ts +28 -8
- package/src/track-session.ts +28 -9
- package/test-vectors/catalog/README.md +37 -17
- package/test-vectors/catalog/negative/fec-block-profile-retired.json +52 -0
- package/test-vectors/catalog/negative/fec-enhancement-repair-removed.json +1 -1
- package/test-vectors/catalog/negative/fec-repair-layer-geometry.json +1 -1
- package/test-vectors/catalog/negative/fec-repair-layer-missing-symbols.json +1 -1
- package/test-vectors/catalog/negative/fec-repair-multiple-depends.json +1 -1
- package/test-vectors/catalog/negative/fec-repair-overlay-with-layer.json +1 -1
- package/test-vectors/catalog/negative/fec-repair-priority-out-of-band.json +1 -1
- package/test-vectors/catalog/negative/fec-repair-source-symbols-without-scope.json +1 -1
- package/test-vectors/catalog/negative/multicast-endpoint-relay-address.json +39 -0
- package/test-vectors/catalog/negative/multicast-network-source-empty.json +1 -1
- package/test-vectors/catalog/negative/raptorq-source-symbols-over-max.json +1 -1
- package/test-vectors/catalog/negative/raptorq-unaligned-symbol.json +1 -1
- package/test-vectors/catalog/positive/fec-layered-repair.json +2 -2
- package/test-vectors/catalog/positive/fec-multicast.json +2 -1
- package/test-vectors/catalog/positive/multicast-amt-manual-relay.json +38 -0
- package/test-vectors/catalog/positive/multicast-native-ssm-no-network-source.json +2 -1
- package/test-vectors/catalog-timing.json +356 -0
- package/test-vectors/catalog-validation.json +40 -5
- package/test-vectors/delivery-catalog/README.md +11 -0
- package/test-vectors/delivery-catalog/negative/missing-block-profile.json +58 -0
- package/test-vectors/delivery-catalog/negative/packet-id-signaling.json +59 -0
- package/test-vectors/delivery-catalog/negative/retired-k-padded-block-profile.json +59 -0
- package/test-vectors/delivery-catalog/positive/dash.json +56 -0
- package/test-vectors/delivery-catalog/positive/mmtp-source-only.json +43 -0
- package/node_modules/@blockcast/fec-worker/README.md +0 -223
- package/node_modules/@blockcast/fec-worker/dist/.build-stamp +0 -0
- package/node_modules/@blockcast/fec-worker/dist/block-order.d.ts +0 -38
- package/node_modules/@blockcast/fec-worker/dist/block-order.d.ts.map +0 -1
- package/node_modules/@blockcast/fec-worker/dist/block-order.js +0 -78
- package/node_modules/@blockcast/fec-worker/dist/block-order.js.map +0 -1
- package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.d.ts +0 -93
- package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.d.ts.map +0 -1
- package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.js +0 -346
- package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.js.map +0 -1
- package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.d.ts +0 -380
- package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.d.ts.map +0 -1
- package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.js +0 -11
- package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.js.map +0 -1
- package/node_modules/@blockcast/fec-worker/dist/fec-worker.d.ts +0 -14
- package/node_modules/@blockcast/fec-worker/dist/fec-worker.d.ts.map +0 -1
- package/node_modules/@blockcast/fec-worker/dist/fec-worker.js +0 -859
- package/node_modules/@blockcast/fec-worker/dist/fec-worker.js.map +0 -7
- package/node_modules/@blockcast/fec-worker/dist/index.d.ts +0 -10
- package/node_modules/@blockcast/fec-worker/dist/index.d.ts.map +0 -1
- package/node_modules/@blockcast/fec-worker/dist/index.js +0 -8
- package/node_modules/@blockcast/fec-worker/dist/index.js.map +0 -1
- package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.d.ts +0 -20
- package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.d.ts.map +0 -1
- package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.js +0 -370
- package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.js.map +0 -7
- package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.d.ts +0 -104
- package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.d.ts.map +0 -1
- package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.js +0 -181
- package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.js.map +0 -1
- package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.d.ts +0 -194
- package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.d.ts.map +0 -1
- package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.js +0 -62
- package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.js.map +0 -1
- package/node_modules/@blockcast/fec-worker/dist/transfer.d.ts +0 -9
- package/node_modules/@blockcast/fec-worker/dist/transfer.d.ts.map +0 -1
- package/node_modules/@blockcast/fec-worker/dist/transfer.js +0 -13
- package/node_modules/@blockcast/fec-worker/dist/transfer.js.map +0 -1
- package/node_modules/@blockcast/fec-worker/package.json +0 -59
- package/node_modules/@blockcast/fec-worker/src/block-order.ts +0 -93
- package/node_modules/@blockcast/fec-worker/src/fec-worker-client.ts +0 -392
- package/node_modules/@blockcast/fec-worker/src/fec-worker-types.ts +0 -399
- package/node_modules/@blockcast/fec-worker/src/fec-worker.ts +0 -1502
- package/node_modules/@blockcast/fec-worker/src/index.ts +0 -35
- package/node_modules/@blockcast/fec-worker/src/shred-fec-worker.ts +0 -589
- package/node_modules/@blockcast/fec-worker/src/shred-worker-client.ts +0 -222
- package/node_modules/@blockcast/fec-worker/src/shred-worker-types.ts +0 -209
- package/node_modules/@blockcast/fec-worker/src/transfer.ts +0 -12
- package/node_modules/@blockcast/mmt-alta-parse/README.md +0 -181
- package/node_modules/@blockcast/mmt-alta-parse/dist/.build-stamp +0 -0
- package/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts +0 -57
- package/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-alta-parse/dist/index.js +0 -115
- package/node_modules/@blockcast/mmt-alta-parse/dist/index.js.map +0 -1
- package/node_modules/@blockcast/mmt-alta-parse/package.json +0 -50
- package/node_modules/@blockcast/mmt-alta-parse/src/index.ts +0 -136
- package/node_modules/@blockcast/mmt-base/README.md +0 -134
- package/node_modules/@blockcast/mmt-base/dist/.build-stamp +0 -0
- package/node_modules/@blockcast/mmt-base/dist/fec-block-profile.d.ts +0 -55
- package/node_modules/@blockcast/mmt-base/dist/fec-block-profile.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-base/dist/fec-block-profile.js +0 -128
- package/node_modules/@blockcast/mmt-base/dist/fec-block-profile.js.map +0 -1
- package/node_modules/@blockcast/mmt-base/dist/index.d.ts +0 -7
- package/node_modules/@blockcast/mmt-base/dist/index.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-base/dist/index.js +0 -7
- package/node_modules/@blockcast/mmt-base/dist/index.js.map +0 -1
- package/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts +0 -292
- package/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-base/dist/mmtp.js +0 -612
- package/node_modules/@blockcast/mmt-base/dist/mmtp.js.map +0 -1
- package/node_modules/@blockcast/mmt-base/dist/net-constants.d.ts +0 -18
- package/node_modules/@blockcast/mmt-base/dist/net-constants.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-base/dist/net-constants.js +0 -18
- package/node_modules/@blockcast/mmt-base/dist/net-constants.js.map +0 -1
- package/node_modules/@blockcast/mmt-base/dist/ntp-short.d.ts +0 -47
- package/node_modules/@blockcast/mmt-base/dist/ntp-short.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-base/dist/ntp-short.js +0 -54
- package/node_modules/@blockcast/mmt-base/dist/ntp-short.js.map +0 -1
- package/node_modules/@blockcast/mmt-base/dist/serial-number.d.ts +0 -57
- package/node_modules/@blockcast/mmt-base/dist/serial-number.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-base/dist/serial-number.js +0 -98
- package/node_modules/@blockcast/mmt-base/dist/serial-number.js.map +0 -1
- package/node_modules/@blockcast/mmt-base/dist/signalling.d.ts +0 -312
- package/node_modules/@blockcast/mmt-base/dist/signalling.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-base/dist/signalling.js +0 -637
- package/node_modules/@blockcast/mmt-base/dist/signalling.js.map +0 -1
- package/node_modules/@blockcast/mmt-base/package.json +0 -49
- package/node_modules/@blockcast/mmt-base/src/fec-block-profile.ts +0 -145
- package/node_modules/@blockcast/mmt-base/src/index.ts +0 -6
- package/node_modules/@blockcast/mmt-base/src/mmtp.ts +0 -892
- package/node_modules/@blockcast/mmt-base/src/net-constants.ts +0 -17
- package/node_modules/@blockcast/mmt-base/src/ntp-short.ts +0 -67
- package/node_modules/@blockcast/mmt-base/src/serial-number.ts +0 -107
- package/node_modules/@blockcast/mmt-base/src/signalling.ts +0 -862
- package/node_modules/@blockcast/mmt-fec/README.md +0 -271
- package/node_modules/@blockcast/mmt-fec/dist/.build-stamp +0 -0
- package/node_modules/@blockcast/mmt-fec/dist/block-manager.d.ts +0 -82
- package/node_modules/@blockcast/mmt-fec/dist/block-manager.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-fec/dist/block-manager.js +0 -296
- package/node_modules/@blockcast/mmt-fec/dist/block-manager.js.map +0 -1
- package/node_modules/@blockcast/mmt-fec/dist/block-processor.d.ts +0 -106
- package/node_modules/@blockcast/mmt-fec/dist/block-processor.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-fec/dist/block-processor.js +0 -288
- package/node_modules/@blockcast/mmt-fec/dist/block-processor.js.map +0 -1
- package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.d.ts +0 -46
- package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.js +0 -96
- package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.js.map +0 -1
- package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.d.ts +0 -33
- package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.js +0 -57
- package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.js.map +0 -1
- package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.d.ts +0 -205
- package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.js +0 -240
- package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.js.map +0 -1
- package/node_modules/@blockcast/mmt-fec/dist/index.d.ts +0 -28
- package/node_modules/@blockcast/mmt-fec/dist/index.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-fec/dist/index.js +0 -28
- package/node_modules/@blockcast/mmt-fec/dist/index.js.map +0 -1
- package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.d.ts +0 -20
- package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.js +0 -28
- package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.js.map +0 -1
- package/node_modules/@blockcast/mmt-fec/dist/oti.d.ts +0 -258
- package/node_modules/@blockcast/mmt-fec/dist/oti.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-fec/dist/oti.js +0 -382
- package/node_modules/@blockcast/mmt-fec/dist/oti.js.map +0 -1
- package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.d.ts +0 -41
- package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.js +0 -81
- package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.js.map +0 -1
- package/node_modules/@blockcast/mmt-fec/dist/repair-group.d.ts +0 -82
- package/node_modules/@blockcast/mmt-fec/dist/repair-group.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-fec/dist/repair-group.js +0 -170
- package/node_modules/@blockcast/mmt-fec/dist/repair-group.js.map +0 -1
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/README.md +0 -181
- 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 +0 -57
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.js +0 -115
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.js.map +0 -1
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/package.json +0 -50
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/src/index.ts +0 -136
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/README.md +0 -134
- 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 +0 -55
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/fec-block-profile.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/fec-block-profile.js +0 -128
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/fec-block-profile.js.map +0 -1
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.d.ts +0 -7
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.js +0 -7
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.js.map +0 -1
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts +0 -292
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.js +0 -612
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.js.map +0 -1
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/net-constants.d.ts +0 -18
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/net-constants.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/net-constants.js +0 -18
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/net-constants.js.map +0 -1
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/ntp-short.d.ts +0 -47
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/ntp-short.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/ntp-short.js +0 -54
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/ntp-short.js.map +0 -1
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/serial-number.d.ts +0 -57
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/serial-number.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/serial-number.js +0 -98
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/serial-number.js.map +0 -1
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/signalling.d.ts +0 -312
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/signalling.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/signalling.js +0 -637
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/signalling.js.map +0 -1
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/package.json +0 -49
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/fec-block-profile.ts +0 -145
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/index.ts +0 -6
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/mmtp.ts +0 -892
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/net-constants.ts +0 -17
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/ntp-short.ts +0 -67
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/serial-number.ts +0 -107
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/signalling.ts +0 -862
- package/node_modules/@blockcast/mmt-fec/package.json +0 -79
- package/node_modules/@blockcast/mmt-fec/src/block-manager.ts +0 -371
- package/node_modules/@blockcast/mmt-fec/src/block-processor.ts +0 -439
- package/node_modules/@blockcast/mmt-fec/src/cmaf-recovery.ts +0 -127
- package/node_modules/@blockcast/mmt-fec/src/cmaf-symbols.ts +0 -68
- package/node_modules/@blockcast/mmt-fec/src/fec-block-mapper.ts +0 -310
- package/node_modules/@blockcast/mmt-fec/src/index.ts +0 -94
- package/node_modules/@blockcast/mmt-fec/src/loc-symbols.ts +0 -34
- package/node_modules/@blockcast/mmt-fec/src/oti.ts +0 -463
- package/node_modules/@blockcast/mmt-fec/src/reorder-buffer.ts +0 -101
- package/node_modules/@blockcast/mmt-fec/src/repair-group.ts +0 -195
- package/node_modules/@blockcast/mmt-manifest-verify/dist/.build-stamp +0 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.d.ts +0 -28
- package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.js +0 -128
- package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.js.map +0 -1
- package/node_modules/@blockcast/mmt-manifest-verify/dist/index.d.ts +0 -4
- package/node_modules/@blockcast/mmt-manifest-verify/dist/index.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-manifest-verify/dist/index.js +0 -4
- package/node_modules/@blockcast/mmt-manifest-verify/dist/index.js.map +0 -1
- package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.d.ts +0 -37
- package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.js +0 -179
- package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.js.map +0 -1
- package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.d.ts +0 -99
- package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.js +0 -492
- package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.js.map +0 -1
- package/node_modules/@blockcast/mmt-manifest-verify/package.json +0 -45
- package/node_modules/@blockcast/mmt-manifest-verify/src/admission.ts +0 -171
- package/node_modules/@blockcast/mmt-manifest-verify/src/index.ts +0 -3
- package/node_modules/@blockcast/mmt-manifest-verify/src/source-auth.ts +0 -230
- package/node_modules/@blockcast/mmt-manifest-verify/src/verifier.ts +0 -669
- package/node_modules/@noble/hashes/LICENSE +0 -21
- package/node_modules/@noble/hashes/README.md +0 -521
- package/node_modules/@noble/hashes/_assert.d.ts +0 -17
- package/node_modules/@noble/hashes/_assert.d.ts.map +0 -1
- package/node_modules/@noble/hashes/_assert.js +0 -18
- package/node_modules/@noble/hashes/_assert.js.map +0 -1
- package/node_modules/@noble/hashes/_blake.d.ts +0 -14
- package/node_modules/@noble/hashes/_blake.d.ts.map +0 -1
- package/node_modules/@noble/hashes/_blake.js +0 -50
- package/node_modules/@noble/hashes/_blake.js.map +0 -1
- package/node_modules/@noble/hashes/_md.d.ts +0 -51
- package/node_modules/@noble/hashes/_md.d.ts.map +0 -1
- package/node_modules/@noble/hashes/_md.js +0 -162
- package/node_modules/@noble/hashes/_md.js.map +0 -1
- package/node_modules/@noble/hashes/_u64.d.ts +0 -55
- package/node_modules/@noble/hashes/_u64.d.ts.map +0 -1
- package/node_modules/@noble/hashes/_u64.js +0 -90
- package/node_modules/@noble/hashes/_u64.js.map +0 -1
- package/node_modules/@noble/hashes/argon2.d.ts +0 -32
- package/node_modules/@noble/hashes/argon2.d.ts.map +0 -1
- package/node_modules/@noble/hashes/argon2.js +0 -401
- package/node_modules/@noble/hashes/argon2.js.map +0 -1
- package/node_modules/@noble/hashes/blake1.d.ts +0 -106
- package/node_modules/@noble/hashes/blake1.d.ts.map +0 -1
- package/node_modules/@noble/hashes/blake1.js +0 -459
- package/node_modules/@noble/hashes/blake1.js.map +0 -1
- package/node_modules/@noble/hashes/blake2.d.ts +0 -116
- package/node_modules/@noble/hashes/blake2.d.ts.map +0 -1
- package/node_modules/@noble/hashes/blake2.js +0 -420
- package/node_modules/@noble/hashes/blake2.js.map +0 -1
- package/node_modules/@noble/hashes/blake2b.d.ts +0 -11
- package/node_modules/@noble/hashes/blake2b.d.ts.map +0 -1
- package/node_modules/@noble/hashes/blake2b.js +0 -14
- package/node_modules/@noble/hashes/blake2b.js.map +0 -1
- package/node_modules/@noble/hashes/blake2s.d.ts +0 -20
- package/node_modules/@noble/hashes/blake2s.d.ts.map +0 -1
- package/node_modules/@noble/hashes/blake2s.js +0 -24
- package/node_modules/@noble/hashes/blake2s.js.map +0 -1
- package/node_modules/@noble/hashes/blake3.d.ts +0 -54
- package/node_modules/@noble/hashes/blake3.d.ts.map +0 -1
- package/node_modules/@noble/hashes/blake3.js +0 -255
- package/node_modules/@noble/hashes/blake3.js.map +0 -1
- package/node_modules/@noble/hashes/crypto.d.ts +0 -2
- package/node_modules/@noble/hashes/crypto.d.ts.map +0 -1
- package/node_modules/@noble/hashes/crypto.js +0 -5
- package/node_modules/@noble/hashes/crypto.js.map +0 -1
- package/node_modules/@noble/hashes/cryptoNode.d.ts +0 -2
- package/node_modules/@noble/hashes/cryptoNode.d.ts.map +0 -1
- package/node_modules/@noble/hashes/cryptoNode.js +0 -18
- package/node_modules/@noble/hashes/cryptoNode.js.map +0 -1
- package/node_modules/@noble/hashes/eskdf.d.ts +0 -47
- package/node_modules/@noble/hashes/eskdf.d.ts.map +0 -1
- package/node_modules/@noble/hashes/eskdf.js +0 -166
- package/node_modules/@noble/hashes/eskdf.js.map +0 -1
- package/node_modules/@noble/hashes/esm/_assert.d.ts +0 -17
- package/node_modules/@noble/hashes/esm/_assert.d.ts.map +0 -1
- package/node_modules/@noble/hashes/esm/_assert.js +0 -15
- package/node_modules/@noble/hashes/esm/_assert.js.map +0 -1
- package/node_modules/@noble/hashes/esm/_blake.d.ts +0 -14
- package/node_modules/@noble/hashes/esm/_blake.d.ts.map +0 -1
- package/node_modules/@noble/hashes/esm/_blake.js +0 -45
- package/node_modules/@noble/hashes/esm/_blake.js.map +0 -1
- package/node_modules/@noble/hashes/esm/_md.d.ts +0 -51
- package/node_modules/@noble/hashes/esm/_md.d.ts.map +0 -1
- package/node_modules/@noble/hashes/esm/_md.js +0 -155
- package/node_modules/@noble/hashes/esm/_md.js.map +0 -1
- package/node_modules/@noble/hashes/esm/_u64.d.ts +0 -55
- package/node_modules/@noble/hashes/esm/_u64.d.ts.map +0 -1
- package/node_modules/@noble/hashes/esm/_u64.js +0 -67
- package/node_modules/@noble/hashes/esm/_u64.js.map +0 -1
- package/node_modules/@noble/hashes/esm/argon2.d.ts +0 -32
- package/node_modules/@noble/hashes/esm/argon2.d.ts.map +0 -1
- package/node_modules/@noble/hashes/esm/argon2.js +0 -392
- package/node_modules/@noble/hashes/esm/argon2.js.map +0 -1
- package/node_modules/@noble/hashes/esm/blake1.d.ts +0 -106
- package/node_modules/@noble/hashes/esm/blake1.d.ts.map +0 -1
- package/node_modules/@noble/hashes/esm/blake1.js +0 -452
- package/node_modules/@noble/hashes/esm/blake1.js.map +0 -1
- package/node_modules/@noble/hashes/esm/blake2.d.ts +0 -116
- package/node_modules/@noble/hashes/esm/blake2.d.ts.map +0 -1
- package/node_modules/@noble/hashes/esm/blake2.js +0 -413
- package/node_modules/@noble/hashes/esm/blake2.js.map +0 -1
- package/node_modules/@noble/hashes/esm/blake2b.d.ts +0 -11
- package/node_modules/@noble/hashes/esm/blake2b.d.ts.map +0 -1
- package/node_modules/@noble/hashes/esm/blake2b.js +0 -11
- package/node_modules/@noble/hashes/esm/blake2b.js.map +0 -1
- package/node_modules/@noble/hashes/esm/blake2s.d.ts +0 -20
- package/node_modules/@noble/hashes/esm/blake2s.d.ts.map +0 -1
- package/node_modules/@noble/hashes/esm/blake2s.js +0 -21
- package/node_modules/@noble/hashes/esm/blake2s.js.map +0 -1
- package/node_modules/@noble/hashes/esm/blake3.d.ts +0 -54
- package/node_modules/@noble/hashes/esm/blake3.d.ts.map +0 -1
- package/node_modules/@noble/hashes/esm/blake3.js +0 -251
- package/node_modules/@noble/hashes/esm/blake3.js.map +0 -1
- package/node_modules/@noble/hashes/esm/crypto.d.ts +0 -2
- package/node_modules/@noble/hashes/esm/crypto.d.ts.map +0 -1
- package/node_modules/@noble/hashes/esm/crypto.js +0 -2
- package/node_modules/@noble/hashes/esm/crypto.js.map +0 -1
- package/node_modules/@noble/hashes/esm/cryptoNode.d.ts +0 -2
- package/node_modules/@noble/hashes/esm/cryptoNode.d.ts.map +0 -1
- package/node_modules/@noble/hashes/esm/cryptoNode.js +0 -15
- package/node_modules/@noble/hashes/esm/cryptoNode.js.map +0 -1
- package/node_modules/@noble/hashes/esm/eskdf.d.ts +0 -47
- package/node_modules/@noble/hashes/esm/eskdf.d.ts.map +0 -1
- package/node_modules/@noble/hashes/esm/eskdf.js +0 -160
- package/node_modules/@noble/hashes/esm/eskdf.js.map +0 -1
- package/node_modules/@noble/hashes/esm/hkdf.d.ts +0 -36
- package/node_modules/@noble/hashes/esm/hkdf.d.ts.map +0 -1
- package/node_modules/@noble/hashes/esm/hkdf.js +0 -82
- package/node_modules/@noble/hashes/esm/hkdf.js.map +0 -1
- package/node_modules/@noble/hashes/esm/hmac.d.ts +0 -35
- package/node_modules/@noble/hashes/esm/hmac.d.ts.map +0 -1
- package/node_modules/@noble/hashes/esm/hmac.js +0 -86
- package/node_modules/@noble/hashes/esm/hmac.js.map +0 -1
- package/node_modules/@noble/hashes/esm/index.d.ts +0 -2
- package/node_modules/@noble/hashes/esm/index.d.ts.map +0 -1
- package/node_modules/@noble/hashes/esm/index.js +0 -33
- package/node_modules/@noble/hashes/esm/index.js.map +0 -1
- package/node_modules/@noble/hashes/esm/legacy.d.ts +0 -71
- package/node_modules/@noble/hashes/esm/legacy.d.ts.map +0 -1
- package/node_modules/@noble/hashes/esm/legacy.js +0 -281
- package/node_modules/@noble/hashes/esm/legacy.js.map +0 -1
- package/node_modules/@noble/hashes/esm/package.json +0 -10
- package/node_modules/@noble/hashes/esm/pbkdf2.d.ts +0 -23
- package/node_modules/@noble/hashes/esm/pbkdf2.d.ts.map +0 -1
- package/node_modules/@noble/hashes/esm/pbkdf2.js +0 -97
- package/node_modules/@noble/hashes/esm/pbkdf2.js.map +0 -1
- package/node_modules/@noble/hashes/esm/ripemd160.d.ts +0 -13
- package/node_modules/@noble/hashes/esm/ripemd160.d.ts.map +0 -1
- package/node_modules/@noble/hashes/esm/ripemd160.js +0 -13
- package/node_modules/@noble/hashes/esm/ripemd160.js.map +0 -1
- package/node_modules/@noble/hashes/esm/scrypt.d.ts +0 -34
- package/node_modules/@noble/hashes/esm/scrypt.d.ts.map +0 -1
- package/node_modules/@noble/hashes/esm/scrypt.js +0 -228
- package/node_modules/@noble/hashes/esm/scrypt.js.map +0 -1
- package/node_modules/@noble/hashes/esm/sha1.d.ts +0 -11
- package/node_modules/@noble/hashes/esm/sha1.d.ts.map +0 -1
- package/node_modules/@noble/hashes/esm/sha1.js +0 -11
- package/node_modules/@noble/hashes/esm/sha1.js.map +0 -1
- package/node_modules/@noble/hashes/esm/sha2.d.ts +0 -159
- package/node_modules/@noble/hashes/esm/sha2.d.ts.map +0 -1
- package/node_modules/@noble/hashes/esm/sha2.js +0 -375
- package/node_modules/@noble/hashes/esm/sha2.js.map +0 -1
- package/node_modules/@noble/hashes/esm/sha256.d.ts +0 -20
- package/node_modules/@noble/hashes/esm/sha256.d.ts.map +0 -1
- package/node_modules/@noble/hashes/esm/sha256.js +0 -20
- package/node_modules/@noble/hashes/esm/sha256.js.map +0 -1
- package/node_modules/@noble/hashes/esm/sha3-addons.d.ts +0 -142
- package/node_modules/@noble/hashes/esm/sha3-addons.d.ts.map +0 -1
- package/node_modules/@noble/hashes/esm/sha3-addons.js +0 -393
- package/node_modules/@noble/hashes/esm/sha3-addons.js.map +0 -1
- package/node_modules/@noble/hashes/esm/sha3.d.ts +0 -53
- package/node_modules/@noble/hashes/esm/sha3.d.ts.map +0 -1
- package/node_modules/@noble/hashes/esm/sha3.js +0 -234
- package/node_modules/@noble/hashes/esm/sha3.js.map +0 -1
- package/node_modules/@noble/hashes/esm/sha512.d.ts +0 -26
- package/node_modules/@noble/hashes/esm/sha512.d.ts.map +0 -1
- package/node_modules/@noble/hashes/esm/sha512.js +0 -26
- package/node_modules/@noble/hashes/esm/sha512.js.map +0 -1
- package/node_modules/@noble/hashes/esm/utils.d.ts +0 -161
- package/node_modules/@noble/hashes/esm/utils.d.ts.map +0 -1
- package/node_modules/@noble/hashes/esm/utils.js +0 -281
- package/node_modules/@noble/hashes/esm/utils.js.map +0 -1
- package/node_modules/@noble/hashes/hkdf.d.ts +0 -36
- package/node_modules/@noble/hashes/hkdf.d.ts.map +0 -1
- package/node_modules/@noble/hashes/hkdf.js +0 -88
- package/node_modules/@noble/hashes/hkdf.js.map +0 -1
- package/node_modules/@noble/hashes/hmac.d.ts +0 -35
- package/node_modules/@noble/hashes/hmac.d.ts.map +0 -1
- package/node_modules/@noble/hashes/hmac.js +0 -91
- package/node_modules/@noble/hashes/hmac.js.map +0 -1
- package/node_modules/@noble/hashes/index.d.ts +0 -1
- package/node_modules/@noble/hashes/index.d.ts.map +0 -1
- package/node_modules/@noble/hashes/index.js +0 -33
- package/node_modules/@noble/hashes/index.js.map +0 -1
- package/node_modules/@noble/hashes/legacy.d.ts +0 -71
- package/node_modules/@noble/hashes/legacy.d.ts.map +0 -1
- package/node_modules/@noble/hashes/legacy.js +0 -287
- package/node_modules/@noble/hashes/legacy.js.map +0 -1
- package/node_modules/@noble/hashes/package.json +0 -266
- package/node_modules/@noble/hashes/pbkdf2.d.ts +0 -23
- package/node_modules/@noble/hashes/pbkdf2.d.ts.map +0 -1
- package/node_modules/@noble/hashes/pbkdf2.js +0 -101
- package/node_modules/@noble/hashes/pbkdf2.js.map +0 -1
- package/node_modules/@noble/hashes/ripemd160.d.ts +0 -13
- package/node_modules/@noble/hashes/ripemd160.d.ts.map +0 -1
- package/node_modules/@noble/hashes/ripemd160.js +0 -16
- package/node_modules/@noble/hashes/ripemd160.js.map +0 -1
- package/node_modules/@noble/hashes/scrypt.d.ts +0 -34
- package/node_modules/@noble/hashes/scrypt.d.ts.map +0 -1
- package/node_modules/@noble/hashes/scrypt.js +0 -232
- package/node_modules/@noble/hashes/scrypt.js.map +0 -1
- package/node_modules/@noble/hashes/sha1.d.ts +0 -11
- package/node_modules/@noble/hashes/sha1.d.ts.map +0 -1
- package/node_modules/@noble/hashes/sha1.js +0 -14
- package/node_modules/@noble/hashes/sha1.js.map +0 -1
- package/node_modules/@noble/hashes/sha2.d.ts +0 -159
- package/node_modules/@noble/hashes/sha2.d.ts.map +0 -1
- package/node_modules/@noble/hashes/sha2.js +0 -384
- package/node_modules/@noble/hashes/sha2.js.map +0 -1
- package/node_modules/@noble/hashes/sha256.d.ts +0 -20
- package/node_modules/@noble/hashes/sha256.d.ts.map +0 -1
- package/node_modules/@noble/hashes/sha256.js +0 -23
- package/node_modules/@noble/hashes/sha256.js.map +0 -1
- package/node_modules/@noble/hashes/sha3-addons.d.ts +0 -142
- package/node_modules/@noble/hashes/sha3-addons.d.ts.map +0 -1
- package/node_modules/@noble/hashes/sha3-addons.js +0 -402
- package/node_modules/@noble/hashes/sha3-addons.js.map +0 -1
- package/node_modules/@noble/hashes/sha3.d.ts +0 -53
- package/node_modules/@noble/hashes/sha3.d.ts.map +0 -1
- package/node_modules/@noble/hashes/sha3.js +0 -239
- package/node_modules/@noble/hashes/sha3.js.map +0 -1
- package/node_modules/@noble/hashes/sha512.d.ts +0 -26
- package/node_modules/@noble/hashes/sha512.d.ts.map +0 -1
- package/node_modules/@noble/hashes/sha512.js +0 -29
- package/node_modules/@noble/hashes/sha512.js.map +0 -1
- package/node_modules/@noble/hashes/src/_assert.ts +0 -22
- package/node_modules/@noble/hashes/src/_blake.ts +0 -50
- package/node_modules/@noble/hashes/src/_md.ts +0 -176
- package/node_modules/@noble/hashes/src/_u64.ts +0 -91
- package/node_modules/@noble/hashes/src/argon2.ts +0 -497
- package/node_modules/@noble/hashes/src/blake1.ts +0 -534
- package/node_modules/@noble/hashes/src/blake2.ts +0 -486
- package/node_modules/@noble/hashes/src/blake2b.ts +0 -10
- package/node_modules/@noble/hashes/src/blake2s.ts +0 -20
- package/node_modules/@noble/hashes/src/blake3.ts +0 -272
- package/node_modules/@noble/hashes/src/crypto.ts +0 -9
- package/node_modules/@noble/hashes/src/cryptoNode.ts +0 -15
- package/node_modules/@noble/hashes/src/eskdf.ts +0 -187
- package/node_modules/@noble/hashes/src/hkdf.ts +0 -88
- package/node_modules/@noble/hashes/src/hmac.ts +0 -94
- package/node_modules/@noble/hashes/src/index.ts +0 -31
- package/node_modules/@noble/hashes/src/legacy.ts +0 -293
- package/node_modules/@noble/hashes/src/pbkdf2.ts +0 -122
- package/node_modules/@noble/hashes/src/ripemd160.ts +0 -12
- package/node_modules/@noble/hashes/src/scrypt.ts +0 -257
- package/node_modules/@noble/hashes/src/sha1.ts +0 -10
- package/node_modules/@noble/hashes/src/sha2.ts +0 -402
- package/node_modules/@noble/hashes/src/sha256.ts +0 -24
- package/node_modules/@noble/hashes/src/sha3-addons.ts +0 -499
- package/node_modules/@noble/hashes/src/sha3.ts +0 -258
- package/node_modules/@noble/hashes/src/sha512.ts +0 -34
- package/node_modules/@noble/hashes/src/utils.ts +0 -395
- package/node_modules/@noble/hashes/utils.d.ts +0 -161
- package/node_modules/@noble/hashes/utils.d.ts.map +0 -1
- package/node_modules/@noble/hashes/utils.js +0 -313
- package/node_modules/@noble/hashes/utils.js.map +0 -1
package/src/multicast-manager.ts
CHANGED
|
@@ -77,9 +77,11 @@ import {
|
|
|
77
77
|
parseTrackRole,
|
|
78
78
|
validateSwitchingSet,
|
|
79
79
|
isFecCatalogConfig,
|
|
80
|
+
isFecCatalogGeometry,
|
|
80
81
|
type FecCatalogConfig,
|
|
81
82
|
type TrackRole,
|
|
82
83
|
} from "./carp-catalog.js";
|
|
84
|
+
import { catalogFecUnavailable, type TrackFecUnavailable } from "./catalog-fec-params.js";
|
|
83
85
|
|
|
84
86
|
export interface MulticastEndpointConfig {
|
|
85
87
|
sourceAddress: string;
|
|
@@ -87,11 +89,9 @@ export interface MulticastEndpointConfig {
|
|
|
87
89
|
port: number;
|
|
88
90
|
/** Explicit gateway transport policy. Omitted means gateway-selected auto mode. */
|
|
89
91
|
mode?: 'auto' | 'native' | 'tunnel';
|
|
90
|
-
/** AMT relay hostname/IP from catalog endpoint. */
|
|
91
|
-
relayAddress?: string;
|
|
92
92
|
/** AMT relay port from catalog endpoint. */
|
|
93
93
|
relayPort?: number;
|
|
94
|
-
/** AMT relay hostname/IP
|
|
94
|
+
/** AMT relay hostname/IP: the player/UI override, or the catalog's `multicast.networkSource` AMT relay. */
|
|
95
95
|
amtRelay?: string;
|
|
96
96
|
/** AMT relay port from player/UI overrides. Wins over `relayPort`. */
|
|
97
97
|
amtRelayPort?: number;
|
|
@@ -100,8 +100,9 @@ export interface MulticastEndpointConfig {
|
|
|
100
100
|
/** Exact catalog tracks carried by this physical multicast endpoint. */
|
|
101
101
|
tracks?: MmtpIngressContext["tracks"];
|
|
102
102
|
/**
|
|
103
|
-
* The catalog `fec.blockProfile` (BLO-35597): `
|
|
104
|
-
* `
|
|
103
|
+
* The catalog `fec.blockProfile` (BLO-35597): `iso-ssbg1-v1`, the only
|
|
104
|
+
* profile (the retired `k-padded-v1` token is refused). Required for
|
|
105
|
+
* per-track FEC configuration; never defaulted.
|
|
105
106
|
*/
|
|
106
107
|
fecBlockProfile?: FecBlockProfile;
|
|
107
108
|
fecK?: number;
|
|
@@ -932,7 +933,10 @@ function projectFecDiagnosticBlock(block: FecBlockSnapshot) {
|
|
|
932
933
|
lastSymbolTs: block.lastSymbolTs,
|
|
933
934
|
...(block.completedTs === undefined ? {} : { completedTs: block.completedTs }),
|
|
934
935
|
deadlineTs: block.deadlineTs,
|
|
935
|
-
|
|
936
|
+
// ponytail: the per-packet authenticator is gone, so this is always 0. It
|
|
937
|
+
// stays only because pim-multicast-gateway's normalizeSubscriptionDiagnostics
|
|
938
|
+
// still requires a number here; drop it once that validator stops asking.
|
|
939
|
+
altaVerified: 0,
|
|
936
940
|
relayBlockSigValid: block.relayBlockSigValid,
|
|
937
941
|
};
|
|
938
942
|
}
|
|
@@ -963,7 +967,6 @@ function projectFecDiagnosticConfig(config: FecTrackConfig) {
|
|
|
963
967
|
interleaveMs: config.interleaveMs,
|
|
964
968
|
fecMode: config.fecMode,
|
|
965
969
|
...(config.repairTrack === undefined ? {} : { repairTrack: config.repairTrack }),
|
|
966
|
-
altaEnabled: config.altaEnabled,
|
|
967
970
|
relayBlockSigEnabled: config.relayBlockSigEnabled,
|
|
968
971
|
};
|
|
969
972
|
}
|
|
@@ -1042,13 +1045,14 @@ function repairTrackNamesBySource(
|
|
|
1042
1045
|
bySource.set(source, names);
|
|
1043
1046
|
};
|
|
1044
1047
|
for (const track of tracks) {
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1048
|
+
// The explicit pointer counts whether or not the source's FEC config is
|
|
1049
|
+
// usable (an unimplemented block profile leaves the track without FEC,
|
|
1050
|
+
// not without its repair track): ownership is membership, not
|
|
1051
|
+
// decodability, so no isFecCatalogConfig gate here.
|
|
1052
|
+
const repairTrack = typeof track.fec === "object" && track.fec !== null
|
|
1053
|
+
? (track.fec as { readonly repairTrack?: unknown }).repairTrack
|
|
1054
|
+
: undefined;
|
|
1055
|
+
if (typeof repairTrack === "string") add(track.name, repairTrack);
|
|
1052
1056
|
if (track.packaging === "fec-repair" && Array.isArray(track.depends) && track.depends.length === 1) {
|
|
1053
1057
|
add(track.depends[0]!, track.name);
|
|
1054
1058
|
}
|
|
@@ -1059,6 +1063,7 @@ function repairTrackNamesBySource(
|
|
|
1059
1063
|
export class MulticastManager {
|
|
1060
1064
|
readonly #fec: FECManager;
|
|
1061
1065
|
readonly #router: MmtpRouter;
|
|
1066
|
+
#hostMfuTimeoutMs: number | null;
|
|
1062
1067
|
readonly #transport: MulticastTransport<MmtpIngressContext>;
|
|
1063
1068
|
#reportedFecDiagnosticsFailure = false;
|
|
1064
1069
|
|
|
@@ -1170,6 +1175,7 @@ export class MulticastManager {
|
|
|
1170
1175
|
this.#emitRepairLifecycle(decision);
|
|
1171
1176
|
},
|
|
1172
1177
|
});
|
|
1178
|
+
this.#hostMfuTimeoutMs = this.#router.reassembler.timeoutMs;
|
|
1173
1179
|
this.#transport = new MulticastTransport<MmtpIngressContext>((packet, ingress) => {
|
|
1174
1180
|
this.#router.feedPacket(packet, "multicast", undefined, ingress);
|
|
1175
1181
|
});
|
|
@@ -1434,7 +1440,6 @@ export class MulticastManager {
|
|
|
1434
1440
|
...(this.#streamFecBaseline ? [this.#streamFecBaseline] : []),
|
|
1435
1441
|
...this.#trackFecTiming.values(),
|
|
1436
1442
|
];
|
|
1437
|
-
if (contributions.length === 0) return;
|
|
1438
1443
|
|
|
1439
1444
|
let deliveryWindowMs: number | undefined;
|
|
1440
1445
|
let minimumFailbackWindowMs: number | undefined;
|
|
@@ -1451,11 +1456,7 @@ export class MulticastManager {
|
|
|
1451
1456
|
c.minimumFailbackWindowMs,
|
|
1452
1457
|
);
|
|
1453
1458
|
}
|
|
1454
|
-
// Only a
|
|
1455
|
-
// value is a raw frame count (no fps to convert with) and would collapse
|
|
1456
|
-
// the MFU timeout to ~0 and the reorder window to a single frame; skip
|
|
1457
|
-
// the derivation rather than clamp it, leaving previously-configured
|
|
1458
|
-
// router timing untouched.
|
|
1459
|
+
// Only a positive catalog span contributes elapsed FEC timing.
|
|
1459
1460
|
const interleaveOk =
|
|
1460
1461
|
c.interleaveDepthMs !== undefined &&
|
|
1461
1462
|
c.interleaveDepthMs >= MIN_INTERLEAVE_DEPTH_MS;
|
|
@@ -1479,15 +1480,11 @@ export class MulticastManager {
|
|
|
1479
1480
|
deliveryWindowMs === undefined
|
|
1480
1481
|
? minimumFailbackWindowMs
|
|
1481
1482
|
: Math.max(deliveryWindowMs, minimumFailbackWindowMs ?? 0);
|
|
1482
|
-
|
|
1483
|
-
|
|
1484
|
-
|
|
1485
|
-
|
|
1486
|
-
|
|
1487
|
-
}
|
|
1488
|
-
if (reorderWindowFrames !== undefined) {
|
|
1489
|
-
this.#router.setReorderWindow(reorderWindowFrames);
|
|
1490
|
-
}
|
|
1483
|
+
// Without a positive span or host failback floor, disable the silence watchdog.
|
|
1484
|
+
this.#transport.setFailbackWindowMs(failbackWindowMs ?? null);
|
|
1485
|
+
// No FEC deadline: restore the host's independent reassembly policy.
|
|
1486
|
+
this.#router.setMfuTimeoutMs(mfuTimeoutMs ?? this.#hostMfuTimeoutMs);
|
|
1487
|
+
this.#router.setReorderWindow(reorderWindowFrames ?? 0);
|
|
1491
1488
|
}
|
|
1492
1489
|
|
|
1493
1490
|
/**
|
|
@@ -1535,10 +1532,10 @@ export class MulticastManager {
|
|
|
1535
1532
|
`[MulticastManager] configureTrackFec(${packetId}) catalogTrackName must be non-empty when given`,
|
|
1536
1533
|
);
|
|
1537
1534
|
}
|
|
1538
|
-
if (config.fecK === undefined
|
|
1535
|
+
if (config.fecK === undefined) {
|
|
1539
1536
|
throw new Error(
|
|
1540
|
-
`[MulticastManager] configureTrackFec(${packetId}) requires fecK
|
|
1541
|
-
"
|
|
1537
|
+
`[MulticastManager] configureTrackFec(${packetId}) requires fecK. ` +
|
|
1538
|
+
"Derive the per-track FEC geometry from the " +
|
|
1542
1539
|
"stream catalog.",
|
|
1543
1540
|
);
|
|
1544
1541
|
}
|
|
@@ -1547,7 +1544,10 @@ export class MulticastManager {
|
|
|
1547
1544
|
`[MulticastManager] configureTrackFec(${packetId}) fecBlockProfile`,
|
|
1548
1545
|
);
|
|
1549
1546
|
assertPositiveGeometry("fecK", config.fecK);
|
|
1550
|
-
|
|
1547
|
+
const interleaveDepthMs = config.fecInterleaveDepthMs ?? 0;
|
|
1548
|
+
if (!Number.isSafeInteger(interleaveDepthMs) || interleaveDepthMs < 0) {
|
|
1549
|
+
throw new Error("[MulticastManager] fecInterleaveDepthMs must be a non-negative safe integer");
|
|
1550
|
+
}
|
|
1551
1551
|
assertPositiveGeometry("fecSymbolSize", config.fecSymbolSize);
|
|
1552
1552
|
assertPositiveGeometry("fps", config.fps);
|
|
1553
1553
|
assertPositiveGeometry("bandwidth", config.bandwidth);
|
|
@@ -1578,9 +1578,9 @@ export class MulticastManager {
|
|
|
1578
1578
|
// (configureTrack/timeoutMsForPacket); it just never had the repair-symbol
|
|
1579
1579
|
// and bandwidth inputs needed to compute one.
|
|
1580
1580
|
const deliveryWindowMs =
|
|
1581
|
-
|
|
1581
|
+
interleaveDepthMs >= MIN_INTERLEAVE_DEPTH_MS
|
|
1582
1582
|
? computeFecDeliveryWindowMs({
|
|
1583
|
-
interleaveDepthMs
|
|
1583
|
+
interleaveDepthMs,
|
|
1584
1584
|
sourceSymbols: config.fecK,
|
|
1585
1585
|
repairSymbols: config.fecRepairSymbols,
|
|
1586
1586
|
symbolSize: config.fecSymbolSize,
|
|
@@ -1593,12 +1593,12 @@ export class MulticastManager {
|
|
|
1593
1593
|
// The block classifier's geometry comes from the raw catalog cadence
|
|
1594
1594
|
// fields; a track whose media kind is not known yet classifies fail-closed.
|
|
1595
1595
|
const trackKind = config.trackKind ?? this.#router.trackKindFor(packetId);
|
|
1596
|
-
const geometry = trackKind === undefined
|
|
1596
|
+
const geometry = trackKind === undefined || interleaveDepthMs === 0
|
|
1597
1597
|
? undefined
|
|
1598
1598
|
: deriveBlockClassifierGeometry({
|
|
1599
1599
|
trackKind,
|
|
1600
1600
|
framerate: config.fps,
|
|
1601
|
-
interleaveDepthMs
|
|
1601
|
+
interleaveDepthMs,
|
|
1602
1602
|
timescale: config.timescale,
|
|
1603
1603
|
keyframeIntervalTicks: config.keyframeIntervalTicks,
|
|
1604
1604
|
keyframeIntervalMs: config.keyframeIntervalMs,
|
|
@@ -1607,7 +1607,7 @@ export class MulticastManager {
|
|
|
1607
1607
|
blockProfile,
|
|
1608
1608
|
k: config.fecK,
|
|
1609
1609
|
symbolSize: config.fecSymbolSize,
|
|
1610
|
-
interleaveDepthMs
|
|
1610
|
+
interleaveDepthMs,
|
|
1611
1611
|
fps: config.fps,
|
|
1612
1612
|
timeoutMs: deliveryWindowMs,
|
|
1613
1613
|
...(trackKind === undefined ? {} : { trackKind }),
|
|
@@ -1619,7 +1619,7 @@ export class MulticastManager {
|
|
|
1619
1619
|
|
|
1620
1620
|
this.#trackFecTiming.set(packetId, {
|
|
1621
1621
|
deliveryWindowMs,
|
|
1622
|
-
interleaveDepthMs
|
|
1622
|
+
interleaveDepthMs,
|
|
1623
1623
|
fps: config.fps,
|
|
1624
1624
|
k: config.fecK,
|
|
1625
1625
|
repairSymbols: config.fecRepairSymbols,
|
|
@@ -1642,6 +1642,10 @@ export class MulticastManager {
|
|
|
1642
1642
|
| "minimumFailbackWindowMs"
|
|
1643
1643
|
>,
|
|
1644
1644
|
) {
|
|
1645
|
+
const interleaveDepthMs = config.fecInterleaveDepthMs ?? 0;
|
|
1646
|
+
if (!Number.isSafeInteger(interleaveDepthMs) || interleaveDepthMs < 0) {
|
|
1647
|
+
throw new Error("[MulticastManager] fecInterleaveDepthMs must be a non-negative safe integer");
|
|
1648
|
+
}
|
|
1645
1649
|
const minimumFailbackWindowMs = config.minimumFailbackWindowMs;
|
|
1646
1650
|
if (
|
|
1647
1651
|
minimumFailbackWindowMs !== undefined &&
|
|
@@ -1671,7 +1675,7 @@ export class MulticastManager {
|
|
|
1671
1675
|
config.fecInterleaveDepthMs &&
|
|
1672
1676
|
config.fecInterleaveDepthMs >= MIN_INTERLEAVE_DEPTH_MS
|
|
1673
1677
|
? computeFecDeliveryWindowMs({
|
|
1674
|
-
interleaveDepthMs
|
|
1678
|
+
interleaveDepthMs,
|
|
1675
1679
|
sourceSymbols: config.fecK,
|
|
1676
1680
|
repairSymbols: config.fecRepairSymbols,
|
|
1677
1681
|
symbolSize: config.fecSymbolSize,
|
|
@@ -1683,7 +1687,7 @@ export class MulticastManager {
|
|
|
1683
1687
|
this.#fec.configure({
|
|
1684
1688
|
k: config.fecK,
|
|
1685
1689
|
symbolSize: config.fecSymbolSize,
|
|
1686
|
-
interleaveDepthMs
|
|
1690
|
+
interleaveDepthMs,
|
|
1687
1691
|
fps: config.fps,
|
|
1688
1692
|
timeoutMs: deliveryWindowMs,
|
|
1689
1693
|
});
|
|
@@ -1698,28 +1702,28 @@ export class MulticastManager {
|
|
|
1698
1702
|
// narrow them below what this baseline already guarantees.
|
|
1699
1703
|
this.#streamFecBaseline = {
|
|
1700
1704
|
deliveryWindowMs,
|
|
1701
|
-
interleaveDepthMs
|
|
1705
|
+
interleaveDepthMs,
|
|
1702
1706
|
fps: config.fps,
|
|
1703
1707
|
k: config.fecK,
|
|
1704
1708
|
repairSymbols: config.fecRepairSymbols,
|
|
1705
1709
|
minimumFailbackWindowMs,
|
|
1706
1710
|
};
|
|
1707
1711
|
this.#applyStreamGlobalFecTiming();
|
|
1708
|
-
// Wire FecBlockMapper to MmtpRouter
|
|
1712
|
+
// Wire the stream-global FecBlockMapper to MmtpRouter. Under iso-ssbg1-v1
|
|
1713
|
+
// (the only profile) the mapper locates no source symbol: a source is
|
|
1714
|
+
// placed only once a repair states its block (SS_Start, SSB_length), and
|
|
1715
|
+
// FecBlockMapper.fromSsId refuses every FEC stream. The router reads the
|
|
1716
|
+
// mapper only for the stream's block profile and K_max when no FEC
|
|
1717
|
+
// manager answers for the packet.
|
|
1709
1718
|
//
|
|
1710
|
-
// gopDurationMs
|
|
1711
|
-
// interleaveDepthMs
|
|
1712
|
-
//
|
|
1713
|
-
// (floor(ssId/k), ssId%k) and breaks SBN/ESI derivation for any interleaved
|
|
1714
|
-
// FEC. Surfaced by BLO-3323 L14 (pim-multicast-gateway run 26373805710):
|
|
1715
|
-
// with K=32 + interleaveDepthMs=1000ms but gopDurationMs=1000ms, blocks
|
|
1716
|
-
// completed with only ~8 source + ~8 repair symbols (out of 40 expected at
|
|
1717
|
-
// 25-30fps), so the WASM decoder failed to recover any block at 10% loss.
|
|
1719
|
+
// gopDurationMs is the per-frame interval (1000/fps), never the
|
|
1720
|
+
// interleaveDepthMs: the mapper derives its interleave depth D from their
|
|
1721
|
+
// ratio, and passing interleaveDepthMs collapses D to 1 (BLO-3323 L14).
|
|
1718
1722
|
const k = config.fecK;
|
|
1719
1723
|
const interleaveMs = config.fecInterleaveDepthMs;
|
|
1720
1724
|
const fps = config.fps;
|
|
1721
|
-
// The stream-global mapper
|
|
1722
|
-
//
|
|
1725
|
+
// The stream-global mapper exists only for a stream whose catalog names a
|
|
1726
|
+
// block profile; parseFecBlockProfile refuses the retired k-padded-v1.
|
|
1723
1727
|
const blockProfile = config.fecBlockProfile === undefined
|
|
1724
1728
|
? undefined
|
|
1725
1729
|
: parseFecBlockProfile(config.fecBlockProfile, "[MulticastManager] configureFec fecBlockProfile");
|
|
@@ -1771,6 +1775,7 @@ export class MulticastManager {
|
|
|
1771
1775
|
|
|
1772
1776
|
setMfuTimeoutMs(ms: number): void {
|
|
1773
1777
|
this.#router.setMfuTimeoutMs(ms);
|
|
1778
|
+
this.#hostMfuTimeoutMs = this.#router.reassembler.timeoutMs;
|
|
1774
1779
|
}
|
|
1775
1780
|
|
|
1776
1781
|
setTrackCodec(packetId: number, codec: string) {
|
|
@@ -1798,6 +1803,7 @@ export class MulticastManager {
|
|
|
1798
1803
|
onTrackPacket(packetId: number, cb: TrackPacketCallback) {
|
|
1799
1804
|
this.#router.onTrackPacket(packetId, cb);
|
|
1800
1805
|
}
|
|
1806
|
+
/** @deprecated Use onTrackInit(packetId, cb); see MmtpRouter.onInitSegment. */
|
|
1801
1807
|
onInitSegment(cb: (data: Uint8Array) => void) {
|
|
1802
1808
|
this.#router.onInitSegment(cb);
|
|
1803
1809
|
}
|
|
@@ -1821,7 +1827,7 @@ export class MulticastManager {
|
|
|
1821
1827
|
|
|
1822
1828
|
enableMseAssembler(
|
|
1823
1829
|
packetId: number,
|
|
1824
|
-
config:
|
|
1830
|
+
config: BlockAssemblerConfig,
|
|
1825
1831
|
catalogTrackName?: string,
|
|
1826
1832
|
) {
|
|
1827
1833
|
return this.#router.enableMseAssembler(packetId, config, catalogTrackName);
|
|
@@ -1906,21 +1912,11 @@ export class MulticastManager {
|
|
|
1906
1912
|
),
|
|
1907
1913
|
),
|
|
1908
1914
|
};
|
|
1909
|
-
//
|
|
1910
|
-
//
|
|
1911
|
-
//
|
|
1912
|
-
//
|
|
1913
|
-
|
|
1914
|
-
// `multicast.networkSource[{type:"amt"}]` into it
|
|
1915
|
-
// through `findAmtRelay`.
|
|
1916
|
-
// `relayAddress` — the pre-migration per-endpoint relay, retained so a
|
|
1917
|
-
// catalog published before BLO-37834 still joins.
|
|
1918
|
-
// The override/networkSource value wins, else the legacy endpoint value.
|
|
1919
|
-
// `??`, not `||`, so precedence is deliberately NOT trim-aware: a player
|
|
1920
|
-
// clearing its override field means "no AMT", not "fall back to the legacy
|
|
1921
|
-
// relay". Blank is absent for the port decision below but present here.
|
|
1922
|
-
// Retiring `relayAddress` is the legacy cut (BLO-38068), not this branch.
|
|
1923
|
-
const amtRelay = config.amtRelay ?? config.relayAddress;
|
|
1915
|
+
// The single relay inlet: the player/UI override, or the catalog's
|
|
1916
|
+
// `multicast.networkSource[{type:"amt"}]` relay, which
|
|
1917
|
+
// `endpointToMulticastConfig` (packages/transport
|
|
1918
|
+
// multicast-catalog-policy.ts) resolves into `amtRelay` via `findAmtRelay`.
|
|
1919
|
+
const amtRelay = config.amtRelay;
|
|
1924
1920
|
const transportConfig = {
|
|
1925
1921
|
sourceAddress: config.sourceAddress,
|
|
1926
1922
|
groupAddress: config.groupAddress,
|
|
@@ -1933,9 +1929,8 @@ export class MulticastManager {
|
|
|
1933
1929
|
// endpoint-config.ts) deliberately has no implicit relay port — it throws
|
|
1934
1930
|
// and `MulticastTransport.join` resolves false — so the default is
|
|
1935
1931
|
// resolved HERE and arrives there explicit, exactly as the two catalog
|
|
1936
|
-
// readers do it. This is the last of the three readers:
|
|
1937
|
-
//
|
|
1938
|
-
// port field), and `resolveNetworkSource` emits the same port-less shape.
|
|
1932
|
+
// readers do it. This is the last of the three readers: `resolveNetworkSource`
|
|
1933
|
+
// emits a port-less relay shape.
|
|
1939
1934
|
// Keyed on the resolved relay, so a DRIAD entry — which pins no relay —
|
|
1940
1935
|
// never has a port manufactured for it. Blank counts as no relay, the
|
|
1941
1936
|
// same test `catalogAmtNetworkSource` applies (it trims, then skips) and
|
|
@@ -2210,7 +2205,10 @@ export class MulticastManager {
|
|
|
2210
2205
|
}
|
|
2211
2206
|
}
|
|
2212
2207
|
|
|
2213
|
-
/**
|
|
2208
|
+
/**
|
|
2209
|
+
* Release what the manager and FEC hold for a stream whose packet ID the
|
|
2210
|
+
* router retired, or whose FEC a catalog reconfiguration no longer configures.
|
|
2211
|
+
*/
|
|
2214
2212
|
#releaseRetiredStream(stream: MmtpStreamIdentity): void {
|
|
2215
2213
|
// Repair transports abort I/O for a stream on a reset notice
|
|
2216
2214
|
// (wireRepairFetch); a retired stream's repair fetches end with it.
|
|
@@ -2232,10 +2230,10 @@ export class MulticastManager {
|
|
|
2232
2230
|
for (const [key, stats] of [...this.#blockPolicyStats]) {
|
|
2233
2231
|
if (stats.packetId === stream.packetId) this.#blockPolicyStats.delete(key);
|
|
2234
2232
|
}
|
|
2235
|
-
|
|
2236
|
-
|
|
2237
|
-
|
|
2238
|
-
this.#
|
|
2233
|
+
if (this.#trackFecTiming.delete(stream.packetId)) {
|
|
2234
|
+
this.#applyStreamGlobalFecTiming();
|
|
2235
|
+
}
|
|
2236
|
+
this.#multiTrackFecTracks.delete(stream.packetId);
|
|
2239
2237
|
this.#fec.releasePacket(stream.packetId);
|
|
2240
2238
|
}
|
|
2241
2239
|
|
|
@@ -2302,6 +2300,21 @@ export class MulticastManager {
|
|
|
2302
2300
|
* D-17: Builds altGroup → track-name index for getSwitchingSet().
|
|
2303
2301
|
* D-26: Registers packetId → TrackRole on MmtpRouter for block-complete fanout.
|
|
2304
2302
|
*
|
|
2303
|
+
* FEC availability is per track (draft-ramadan-moq-fec §5.1). A media track
|
|
2304
|
+
* whose `fec` names no implemented `blockProfile` (only `iso-ssbg1-v1` is
|
|
2305
|
+
* implemented; the retired `k-padded-v1` is not), or an `iso-ssbg1-v1` span
|
|
2306
|
+
* it cannot use, is consumed without FEC: it gets no decoder, and none of
|
|
2307
|
+
* its repair tracks (layer 0 by `fec.repairTrack`, further layers and the
|
|
2308
|
+
* overlay by `depends`) is given an owner, so the router drops their packets
|
|
2309
|
+
* before any decoder. Those legs keep the `repair` role and their owner's
|
|
2310
|
+
* switching set. Neither the call nor any other track's FEC fails on that
|
|
2311
|
+
* account; `trackFecUnavailable(name)` reports the reason. FEC a previous
|
|
2312
|
+
* call configured on a packetId this call does not is released
|
|
2313
|
+
* (FECManager.releasePacket); frames its release gate held are delivered in
|
|
2314
|
+
* order, each gap stalled. FEC wired by hand (setFecDecoder) is left alone.
|
|
2315
|
+
* Geometry a decoder could not configure (K, P, T, `repairTrack`,
|
|
2316
|
+
* algorithm) still throws.
|
|
2317
|
+
*
|
|
2305
2318
|
* @param catalog - Multi-track catalog (tracks array with name, altGroup, fec, packetId).
|
|
2306
2319
|
* @param wasmDecoderSource - One WASM FEC decoder for a single FEC stream, or
|
|
2307
2320
|
* a factory returning a distinct decoder per stream.
|
|
@@ -2325,6 +2338,44 @@ export class MulticastManager {
|
|
|
2325
2338
|
// mis-roled or rejected on its name, and would land in its own altGroup
|
|
2326
2339
|
// rather than its owner's.
|
|
2327
2340
|
const repairNamesBySource = repairTrackNamesBySource(catalog.tracks);
|
|
2341
|
+
// §5.1: classify each media track's FEC before roles are resolved. A track
|
|
2342
|
+
// whose FEC is unavailable still names its layer 0 by `fec.repairTrack`;
|
|
2343
|
+
// that pointer is a catalog fact about the leg, not about the profile, so
|
|
2344
|
+
// the leg stays roled `repair` in its owner's group rather than falling
|
|
2345
|
+
// through to its name. It is never given an owner below.
|
|
2346
|
+
const declaredRepairNames = new Set<string>();
|
|
2347
|
+
for (const names of repairNamesBySource.values()) {
|
|
2348
|
+
for (const name of names) declaredRepairNames.add(name);
|
|
2349
|
+
}
|
|
2350
|
+
const fecUnavailableByTrack = new Map<string, TrackFecUnavailable>();
|
|
2351
|
+
for (let i = 0; i < catalog.tracks.length; i++) {
|
|
2352
|
+
const track = catalog.tracks[i]!;
|
|
2353
|
+
if (
|
|
2354
|
+
track.fec === undefined ||
|
|
2355
|
+
track.packaging === "fec-repair" ||
|
|
2356
|
+
declaredRepairNames.has(track.name)
|
|
2357
|
+
) {
|
|
2358
|
+
continue;
|
|
2359
|
+
}
|
|
2360
|
+
const fecUnavailable = catalogFecUnavailable(track.fec, `$.tracks[${i}].fec`);
|
|
2361
|
+
if (fecUnavailable === undefined) continue;
|
|
2362
|
+
fecUnavailableByTrack.set(track.name, fecUnavailable);
|
|
2363
|
+
const layerZero = (track.fec as { repairTrack?: unknown }).repairTrack;
|
|
2364
|
+
if (typeof layerZero === "string" && layerZero.length > 0) {
|
|
2365
|
+
const names = repairNamesBySource.get(track.name) ?? new Set<string>();
|
|
2366
|
+
names.add(layerZero);
|
|
2367
|
+
repairNamesBySource.set(track.name, names);
|
|
2368
|
+
}
|
|
2369
|
+
}
|
|
2370
|
+
// Every repair leg of a source without FEC goes unowned, including one a
|
|
2371
|
+
// source with FEC also names: the router could not tell the two sources'
|
|
2372
|
+
// symbols apart on it, and the unavailable source's must reach no decoder.
|
|
2373
|
+
const unownedRepairNames = new Set<string>();
|
|
2374
|
+
for (const sourceName of fecUnavailableByTrack.keys()) {
|
|
2375
|
+
for (const repairName of repairNamesBySource.get(sourceName) ?? []) {
|
|
2376
|
+
unownedRepairNames.add(repairName);
|
|
2377
|
+
}
|
|
2378
|
+
}
|
|
2328
2379
|
const repairOwnerGroup = new Map<string, string>();
|
|
2329
2380
|
const repairOwnerAltGroup = new Map<string, number | undefined>();
|
|
2330
2381
|
for (const track of catalog.tracks) {
|
|
@@ -2390,11 +2441,15 @@ export class MulticastManager {
|
|
|
2390
2441
|
for (let i = 0; i < catalog.tracks.length; i++) {
|
|
2391
2442
|
const track = catalog.tracks[i]!;
|
|
2392
2443
|
if (resolvedRoles[i] === "repair" || track.fec === undefined) continue;
|
|
2393
|
-
|
|
2444
|
+
// Malformed geometry fails the call whatever the profile says; an
|
|
2445
|
+
// unavailable profile or span only costs this track its FEC (§5.1).
|
|
2446
|
+
const unavailable = fecUnavailableByTrack.has(track.name);
|
|
2447
|
+
if (!(unavailable ? isFecCatalogGeometry(track.fec) : isFecCatalogConfig(track.fec))) {
|
|
2394
2448
|
throw new Error(
|
|
2395
2449
|
`[MulticastManager] invalid fec config for track '${track.name}'`,
|
|
2396
2450
|
);
|
|
2397
2451
|
}
|
|
2452
|
+
if (unavailable) continue;
|
|
2398
2453
|
if (track.packetId !== undefined) fecTrackIndexes.push(i);
|
|
2399
2454
|
}
|
|
2400
2455
|
|
|
@@ -2424,10 +2479,32 @@ export class MulticastManager {
|
|
|
2424
2479
|
}
|
|
2425
2480
|
}
|
|
2426
2481
|
|
|
2427
|
-
// Reset switching-set index
|
|
2482
|
+
// Reset switching-set index, repair packetId set and FEC availability.
|
|
2428
2483
|
this.#switchingSets.clear();
|
|
2429
2484
|
this.#repairPacketIds.clear();
|
|
2430
2485
|
this.#router.clearRepairPacketIdOwners();
|
|
2486
|
+
// FEC a previous call configured that this one does not (the source is
|
|
2487
|
+
// gone, lost its `fec`, or its FEC is now unavailable) must not stay
|
|
2488
|
+
// installed: its symbols would still be read as block coordinates and
|
|
2489
|
+
// held for repair legs that no longer have an owner. FEC a caller wired
|
|
2490
|
+
// by hand is not this call's to release.
|
|
2491
|
+
const fecPacketIds = new Set([...fecDecoders.keys()].map((i) => catalog.tracks[i]!.packetId));
|
|
2492
|
+
// The record survives a throw below: a packet this call configures again
|
|
2493
|
+
// is overwritten by its set(), and a released one is dropped by
|
|
2494
|
+
// #releaseRetiredStream.
|
|
2495
|
+
for (const [packetId, catalogTrackName] of this.#multiTrackFecTracks) {
|
|
2496
|
+
if (fecPacketIds.has(packetId)) continue;
|
|
2497
|
+
if (!this.#fec.isTrackConfigured(packetId)) {
|
|
2498
|
+
this.#multiTrackFecTracks.delete(packetId);
|
|
2499
|
+
continue;
|
|
2500
|
+
}
|
|
2501
|
+
this.#router.releaseFecPacket(packetId);
|
|
2502
|
+
this.#releaseRetiredStream({ packetId, catalogTrackName });
|
|
2503
|
+
}
|
|
2504
|
+
this.#fecUnavailableByTrack.clear();
|
|
2505
|
+
for (const [name, reason] of fecUnavailableByTrack) {
|
|
2506
|
+
this.#fecUnavailableByTrack.set(name, reason);
|
|
2507
|
+
}
|
|
2431
2508
|
const catalogTracksByName = new Map(
|
|
2432
2509
|
catalog.tracks.map((track) => [track.name, track] as const),
|
|
2433
2510
|
);
|
|
@@ -2460,8 +2537,9 @@ export class MulticastManager {
|
|
|
2460
2537
|
continue;
|
|
2461
2538
|
}
|
|
2462
2539
|
|
|
2463
|
-
// D-07: Apply per-track FEC config for non-repair tracks.
|
|
2464
|
-
|
|
2540
|
+
// D-07: Apply per-track FEC config for non-repair tracks. A track whose
|
|
2541
|
+
// FEC is unavailable (§5.1) is consumed like a track without `fec`.
|
|
2542
|
+
if (track.fec !== undefined && !fecUnavailableByTrack.has(track.name)) {
|
|
2465
2543
|
const fecCfg = track.fec as FecCatalogConfig;
|
|
2466
2544
|
// Every repair layer and the keyframe overlay route to this source's
|
|
2467
2545
|
// decoder, not only layer 0. A layer whose packetId had no registered
|
|
@@ -2469,6 +2547,7 @@ export class MulticastManager {
|
|
|
2469
2547
|
// two sources whose RS_ID ranges overlap would be indistinguishable.
|
|
2470
2548
|
if (track.packetId !== undefined) {
|
|
2471
2549
|
for (const repairName of repairNamesBySource.get(track.name) ?? []) {
|
|
2550
|
+
if (unownedRepairNames.has(repairName)) continue;
|
|
2472
2551
|
const repairTrack = catalogTracksByName.get(repairName);
|
|
2473
2552
|
if (repairTrack?.packetId !== undefined) {
|
|
2474
2553
|
this.#router.setRepairPacketIdOwner(repairTrack.packetId, track.packetId);
|
|
@@ -2493,17 +2572,18 @@ export class MulticastManager {
|
|
|
2493
2572
|
blockProfile,
|
|
2494
2573
|
k: fecCfg.sourceSymbols,
|
|
2495
2574
|
symbolSize: fecCfg.symbolSize,
|
|
2496
|
-
interleaveDepthMs: fecCfg.interleaveDepthMs,
|
|
2575
|
+
interleaveDepthMs: fecCfg.interleaveDepthMs ?? 0,
|
|
2497
2576
|
fps: track.framerate,
|
|
2498
2577
|
trackKind: "video",
|
|
2499
2578
|
},
|
|
2500
2579
|
track.name,
|
|
2501
2580
|
);
|
|
2581
|
+
this.#multiTrackFecTracks.set(track.packetId, track.name);
|
|
2502
2582
|
this.#configureTrackMapper(track.packetId, {
|
|
2503
2583
|
blockProfile,
|
|
2504
2584
|
k: fecCfg.sourceSymbols,
|
|
2505
2585
|
symbolSize: fecCfg.symbolSize,
|
|
2506
|
-
interleaveDepthMs: fecCfg.interleaveDepthMs,
|
|
2586
|
+
interleaveDepthMs: fecCfg.interleaveDepthMs ?? 0,
|
|
2507
2587
|
fps: track.framerate,
|
|
2508
2588
|
});
|
|
2509
2589
|
this.#router.setPacketIdType(track.packetId, "video");
|
|
@@ -2512,6 +2592,27 @@ export class MulticastManager {
|
|
|
2512
2592
|
}
|
|
2513
2593
|
}
|
|
2514
2594
|
|
|
2595
|
+
/**
|
|
2596
|
+
* Why `configureMultiTrack` consumes the named catalog track without FEC
|
|
2597
|
+
* although its `fec` block declares one (draft-ramadan-moq-fec §5.1): no
|
|
2598
|
+
* implemented `blockProfile` (`track_fec_block_profile_unimplemented`, e.g.
|
|
2599
|
+
* the retired `k-padded-v1`; `track_fec_block_profile` when absent), or an
|
|
2600
|
+
* invalid `iso-ssbg1-v1` span (`track_fec`). Absent/zero spans keep in-band
|
|
2601
|
+
* decoding enabled. The same reason the hang
|
|
2602
|
+
* resolver reports (`catalogFecUnavailable`). Undefined for every other
|
|
2603
|
+
* track, and for every track before the first call; each call replaces the
|
|
2604
|
+
* previous call's answers.
|
|
2605
|
+
*/
|
|
2606
|
+
trackFecUnavailable(trackName: string): TrackFecUnavailable | undefined {
|
|
2607
|
+
return this.#fecUnavailableByTrack.get(trackName);
|
|
2608
|
+
}
|
|
2609
|
+
|
|
2610
|
+
/** Per-track FEC availability from the last `configureMultiTrack` call. */
|
|
2611
|
+
readonly #fecUnavailableByTrack = new Map<string, TrackFecUnavailable>();
|
|
2612
|
+
|
|
2613
|
+
/** packetId → catalog track name of the FEC the last `configureMultiTrack` installed. */
|
|
2614
|
+
readonly #multiTrackFecTracks = new Map<number, string>();
|
|
2615
|
+
|
|
2515
2616
|
/**
|
|
2516
2617
|
* Return the track names belonging to the given altGroup switching set.
|
|
2517
2618
|
* D-17: altGroup groups base+delta+repair into one switching set.
|
|
@@ -269,7 +269,7 @@ export class MulticastTransport<TPacketContext = never> {
|
|
|
269
269
|
// inside the window, instead of a clear+set pair on every packet.
|
|
270
270
|
#watchdog: ReturnType<typeof setTimeout> | null = null
|
|
271
271
|
#lastPacketAtMs = 0
|
|
272
|
-
#failbackWindowMs: number | null
|
|
272
|
+
#failbackWindowMs: number | null | undefined
|
|
273
273
|
#onTakeover: (() => void) | null = null
|
|
274
274
|
#onFailback: ((reason: MulticastFailbackReason) => void) | null = null
|
|
275
275
|
// Data-plane-live edge: the first packet this join accepted. Everything
|
|
@@ -644,18 +644,24 @@ export class MulticastTransport<TPacketContext = never> {
|
|
|
644
644
|
return this.#dataPlaneLive
|
|
645
645
|
}
|
|
646
646
|
|
|
647
|
-
setFailbackWindowMs(windowMs: number): void {
|
|
648
|
-
if (!Number.isFinite(windowMs) || windowMs <= 0) {
|
|
647
|
+
setFailbackWindowMs(windowMs: number | null): void {
|
|
648
|
+
if (windowMs !== null && (!Number.isFinite(windowMs) || windowMs <= 0)) {
|
|
649
649
|
throw new Error(
|
|
650
650
|
`[MulticastTransport] failbackWindowMs=${windowMs}. ` +
|
|
651
651
|
`Derive a positive failback window from the stream catalog.`,
|
|
652
652
|
)
|
|
653
653
|
}
|
|
654
654
|
this.#failbackWindowMs = windowMs
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
655
|
+
if (windowMs === null) {
|
|
656
|
+
if (this.#watchdog !== null) clearTimeout(this.#watchdog)
|
|
657
|
+
this.#watchdog = null
|
|
658
|
+
return
|
|
659
|
+
}
|
|
660
|
+
// Re-enable against the last packet even when the previous policy disabled
|
|
661
|
+
// the watchdog: a silent live stream may never deliver another packet.
|
|
662
|
+
if (this.#watchdog !== null) clearTimeout(this.#watchdog)
|
|
663
|
+
this.#watchdog = null
|
|
664
|
+
if (this.#dataPlaneLive && this.#onFailback) {
|
|
659
665
|
const silentMs = performance.now() - this.#lastPacketAtMs
|
|
660
666
|
this.#armWatchdog(Math.max(0, Math.ceil(windowMs - silentMs)))
|
|
661
667
|
}
|
|
@@ -1022,7 +1028,8 @@ export class MulticastTransport<TPacketContext = never> {
|
|
|
1022
1028
|
}
|
|
1023
1029
|
if (this.#watchdog !== null) return
|
|
1024
1030
|
if (!this.#onFailback) return
|
|
1025
|
-
if (this.#failbackWindowMs === null)
|
|
1031
|
+
if (this.#failbackWindowMs === null) return
|
|
1032
|
+
if (this.#failbackWindowMs === undefined) {
|
|
1026
1033
|
throw new Error(
|
|
1027
1034
|
'[MulticastTransport] Failback watchdog requires a catalog-derived window',
|
|
1028
1035
|
)
|
|
@@ -1033,7 +1040,7 @@ export class MulticastTransport<TPacketContext = never> {
|
|
|
1033
1040
|
#armWatchdog(delayMs: number): void {
|
|
1034
1041
|
this.#watchdog = setTimeout(() => {
|
|
1035
1042
|
this.#watchdog = null
|
|
1036
|
-
if (this.#disposed || !this.#onFailback || this.#failbackWindowMs
|
|
1043
|
+
if (this.#disposed || !this.#onFailback || this.#failbackWindowMs == null) return
|
|
1037
1044
|
const silentMs = performance.now() - this.#lastPacketAtMs
|
|
1038
1045
|
if (silentMs < this.#failbackWindowMs) {
|
|
1039
1046
|
this.#armWatchdog(Math.ceil(this.#failbackWindowMs - silentMs))
|