@blockcast/mmt-container 0.3.0 → 0.4.0-main.1e94b11199ea
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 +14816 -14254
- 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 +32 -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 +52 -30
- package/dist/fec-manager.d.ts.map +1 -1
- package/dist/fec-manager.js +338 -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 +14 -11
- package/dist/mmtp-container-parser.d.ts.map +1 -1
- package/dist/mmtp-container-parser.js +126 -99
- package/dist/mmtp-container-parser.js.map +4 -4
- package/dist/mmtp-container-parser.no-modules.js +154 -108
- package/dist/mmtp-container-parser.no-modules.js.map +4 -4
- package/dist/mmtp-decode-pipeline.js +126 -99
- package/dist/mmtp-decode-pipeline.js.map +4 -4
- package/dist/mmtp-router.d.ts +51 -29
- package/dist/mmtp-router.d.ts.map +1 -1
- package/dist/mmtp-router.js +260 -326
- 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 +72 -6
- package/dist/multicast-manager.d.ts.map +1 -1
- package/dist/multicast-manager.js +882 -673
- 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 +150 -106
- package/dist/no-modules.js.map +4 -4
- package/dist/repair-fetch.d.ts +116 -21
- package/dist/repair-fetch.d.ts.map +1 -1
- package/dist/repair-fetch.js +114 -34
- 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 +126 -99
- 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 +51 -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 +457 -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 +106 -20
- package/src/mmtp-router.ts +189 -330
- package/src/multicast-manager.ts +265 -86
- package/src/multicast-transport.ts +16 -9
- package/src/repair-fetch.ts +273 -43
- package/src/repair-layers.ts +28 -8
- package/src/track-session.ts +28 -9
- package/test-vectors/catalog/README.md +44 -18
- 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 +2 -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/section-codes.json +33 -0
- 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;
|
|
@@ -417,6 +418,33 @@ export interface BlockPolicyStats {
|
|
|
417
418
|
deltaRepairsDeferred: number;
|
|
418
419
|
/** Repair requests sent no FETCH (see the `repair-skipped` event). */
|
|
419
420
|
repairsSkipped: number;
|
|
421
|
+
/** `repairsSkipped` by reason: the reliable path offered no RTT. */
|
|
422
|
+
repairsSkippedRttUnmeasured: number;
|
|
423
|
+
/** `repairsSkipped` by reason: the RTT did not fit the time left to the deadline. */
|
|
424
|
+
repairsSkippedRttExceedsBudget: number;
|
|
425
|
+
/** `repairsSkipped` by reason: the player gave no presentation delay. */
|
|
426
|
+
repairsSkippedPresentationDelayUnavailable: number;
|
|
427
|
+
/**
|
|
428
|
+
* The most recent skip: its reason, the measured RTT (null when
|
|
429
|
+
* unmeasured), the time that was left to the deadline, and the request's
|
|
430
|
+
* repair priority (0 keyframe/unknown, 1 audio, 2 delta; null when the
|
|
431
|
+
* scheduler did not say). Null until a request is skipped.
|
|
432
|
+
*/
|
|
433
|
+
lastRepairSkip: {
|
|
434
|
+
readonly reason: RepairSkipReason;
|
|
435
|
+
readonly rttMs: number | null;
|
|
436
|
+
readonly budgetMs: number;
|
|
437
|
+
readonly priority: RepairPriority | null;
|
|
438
|
+
} | null;
|
|
439
|
+
/** Repair FETCHes sent for keyframe/unknown (P0) blocks, every attempt counted. */
|
|
440
|
+
keyframeRepairFetchesSent: number;
|
|
441
|
+
/**
|
|
442
|
+
* Requests the keyframe late-repair budget extended past the presentation
|
|
443
|
+
* deadline (each one can hold the stream behind its block that long).
|
|
444
|
+
*/
|
|
445
|
+
keyframeBudgetHolds: number;
|
|
446
|
+
/** Sum of those extensions in ms: the most video the budget could hold. */
|
|
447
|
+
keyframeBudgetHoldMs: number;
|
|
420
448
|
deltaBlocksFailed: number;
|
|
421
449
|
audioBlocksRecoveredInband: number;
|
|
422
450
|
audioBlocksRecoveredQuic: number;
|
|
@@ -451,6 +479,13 @@ function newBlockPolicyStats(
|
|
|
451
479
|
deltaRepairsPreempted: 0,
|
|
452
480
|
deltaRepairsDeferred: 0,
|
|
453
481
|
repairsSkipped: 0,
|
|
482
|
+
repairsSkippedRttUnmeasured: 0,
|
|
483
|
+
repairsSkippedRttExceedsBudget: 0,
|
|
484
|
+
repairsSkippedPresentationDelayUnavailable: 0,
|
|
485
|
+
lastRepairSkip: null,
|
|
486
|
+
keyframeRepairFetchesSent: 0,
|
|
487
|
+
keyframeBudgetHolds: 0,
|
|
488
|
+
keyframeBudgetHoldMs: 0,
|
|
454
489
|
deltaBlocksFailed: 0,
|
|
455
490
|
audioBlocksRecoveredInband: 0,
|
|
456
491
|
audioBlocksRecoveredQuic: 0,
|
|
@@ -932,7 +967,10 @@ function projectFecDiagnosticBlock(block: FecBlockSnapshot) {
|
|
|
932
967
|
lastSymbolTs: block.lastSymbolTs,
|
|
933
968
|
...(block.completedTs === undefined ? {} : { completedTs: block.completedTs }),
|
|
934
969
|
deadlineTs: block.deadlineTs,
|
|
935
|
-
|
|
970
|
+
// ponytail: the per-packet authenticator is gone, so this is always 0. It
|
|
971
|
+
// stays only because pim-multicast-gateway's normalizeSubscriptionDiagnostics
|
|
972
|
+
// still requires a number here; drop it once that validator stops asking.
|
|
973
|
+
altaVerified: 0,
|
|
936
974
|
relayBlockSigValid: block.relayBlockSigValid,
|
|
937
975
|
};
|
|
938
976
|
}
|
|
@@ -963,7 +1001,6 @@ function projectFecDiagnosticConfig(config: FecTrackConfig) {
|
|
|
963
1001
|
interleaveMs: config.interleaveMs,
|
|
964
1002
|
fecMode: config.fecMode,
|
|
965
1003
|
...(config.repairTrack === undefined ? {} : { repairTrack: config.repairTrack }),
|
|
966
|
-
altaEnabled: config.altaEnabled,
|
|
967
1004
|
relayBlockSigEnabled: config.relayBlockSigEnabled,
|
|
968
1005
|
};
|
|
969
1006
|
}
|
|
@@ -1042,13 +1079,14 @@ function repairTrackNamesBySource(
|
|
|
1042
1079
|
bySource.set(source, names);
|
|
1043
1080
|
};
|
|
1044
1081
|
for (const track of tracks) {
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1082
|
+
// The explicit pointer counts whether or not the source's FEC config is
|
|
1083
|
+
// usable (an unimplemented block profile leaves the track without FEC,
|
|
1084
|
+
// not without its repair track): ownership is membership, not
|
|
1085
|
+
// decodability, so no isFecCatalogConfig gate here.
|
|
1086
|
+
const repairTrack = typeof track.fec === "object" && track.fec !== null
|
|
1087
|
+
? (track.fec as { readonly repairTrack?: unknown }).repairTrack
|
|
1088
|
+
: undefined;
|
|
1089
|
+
if (typeof repairTrack === "string") add(track.name, repairTrack);
|
|
1052
1090
|
if (track.packaging === "fec-repair" && Array.isArray(track.depends) && track.depends.length === 1) {
|
|
1053
1091
|
add(track.depends[0]!, track.name);
|
|
1054
1092
|
}
|
|
@@ -1059,6 +1097,7 @@ function repairTrackNamesBySource(
|
|
|
1059
1097
|
export class MulticastManager {
|
|
1060
1098
|
readonly #fec: FECManager;
|
|
1061
1099
|
readonly #router: MmtpRouter;
|
|
1100
|
+
#hostMfuTimeoutMs: number | null;
|
|
1062
1101
|
readonly #transport: MulticastTransport<MmtpIngressContext>;
|
|
1063
1102
|
#reportedFecDiagnosticsFailure = false;
|
|
1064
1103
|
|
|
@@ -1170,6 +1209,7 @@ export class MulticastManager {
|
|
|
1170
1209
|
this.#emitRepairLifecycle(decision);
|
|
1171
1210
|
},
|
|
1172
1211
|
});
|
|
1212
|
+
this.#hostMfuTimeoutMs = this.#router.reassembler.timeoutMs;
|
|
1173
1213
|
this.#transport = new MulticastTransport<MmtpIngressContext>((packet, ingress) => {
|
|
1174
1214
|
this.#router.feedPacket(packet, "multicast", undefined, ingress);
|
|
1175
1215
|
});
|
|
@@ -1434,7 +1474,6 @@ export class MulticastManager {
|
|
|
1434
1474
|
...(this.#streamFecBaseline ? [this.#streamFecBaseline] : []),
|
|
1435
1475
|
...this.#trackFecTiming.values(),
|
|
1436
1476
|
];
|
|
1437
|
-
if (contributions.length === 0) return;
|
|
1438
1477
|
|
|
1439
1478
|
let deliveryWindowMs: number | undefined;
|
|
1440
1479
|
let minimumFailbackWindowMs: number | undefined;
|
|
@@ -1451,11 +1490,7 @@ export class MulticastManager {
|
|
|
1451
1490
|
c.minimumFailbackWindowMs,
|
|
1452
1491
|
);
|
|
1453
1492
|
}
|
|
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.
|
|
1493
|
+
// Only a positive catalog span contributes elapsed FEC timing.
|
|
1459
1494
|
const interleaveOk =
|
|
1460
1495
|
c.interleaveDepthMs !== undefined &&
|
|
1461
1496
|
c.interleaveDepthMs >= MIN_INTERLEAVE_DEPTH_MS;
|
|
@@ -1479,15 +1514,11 @@ export class MulticastManager {
|
|
|
1479
1514
|
deliveryWindowMs === undefined
|
|
1480
1515
|
? minimumFailbackWindowMs
|
|
1481
1516
|
: Math.max(deliveryWindowMs, minimumFailbackWindowMs ?? 0);
|
|
1482
|
-
|
|
1483
|
-
|
|
1484
|
-
|
|
1485
|
-
|
|
1486
|
-
|
|
1487
|
-
}
|
|
1488
|
-
if (reorderWindowFrames !== undefined) {
|
|
1489
|
-
this.#router.setReorderWindow(reorderWindowFrames);
|
|
1490
|
-
}
|
|
1517
|
+
// Without a positive span or host failback floor, disable the silence watchdog.
|
|
1518
|
+
this.#transport.setFailbackWindowMs(failbackWindowMs ?? null);
|
|
1519
|
+
// No FEC deadline: restore the host's independent reassembly policy.
|
|
1520
|
+
this.#router.setMfuTimeoutMs(mfuTimeoutMs ?? this.#hostMfuTimeoutMs);
|
|
1521
|
+
this.#router.setReorderWindow(reorderWindowFrames ?? 0);
|
|
1491
1522
|
}
|
|
1492
1523
|
|
|
1493
1524
|
/**
|
|
@@ -1535,10 +1566,10 @@ export class MulticastManager {
|
|
|
1535
1566
|
`[MulticastManager] configureTrackFec(${packetId}) catalogTrackName must be non-empty when given`,
|
|
1536
1567
|
);
|
|
1537
1568
|
}
|
|
1538
|
-
if (config.fecK === undefined
|
|
1569
|
+
if (config.fecK === undefined) {
|
|
1539
1570
|
throw new Error(
|
|
1540
|
-
`[MulticastManager] configureTrackFec(${packetId}) requires fecK
|
|
1541
|
-
"
|
|
1571
|
+
`[MulticastManager] configureTrackFec(${packetId}) requires fecK. ` +
|
|
1572
|
+
"Derive the per-track FEC geometry from the " +
|
|
1542
1573
|
"stream catalog.",
|
|
1543
1574
|
);
|
|
1544
1575
|
}
|
|
@@ -1547,7 +1578,10 @@ export class MulticastManager {
|
|
|
1547
1578
|
`[MulticastManager] configureTrackFec(${packetId}) fecBlockProfile`,
|
|
1548
1579
|
);
|
|
1549
1580
|
assertPositiveGeometry("fecK", config.fecK);
|
|
1550
|
-
|
|
1581
|
+
const interleaveDepthMs = config.fecInterleaveDepthMs ?? 0;
|
|
1582
|
+
if (!Number.isSafeInteger(interleaveDepthMs) || interleaveDepthMs < 0) {
|
|
1583
|
+
throw new Error("[MulticastManager] fecInterleaveDepthMs must be a non-negative safe integer");
|
|
1584
|
+
}
|
|
1551
1585
|
assertPositiveGeometry("fecSymbolSize", config.fecSymbolSize);
|
|
1552
1586
|
assertPositiveGeometry("fps", config.fps);
|
|
1553
1587
|
assertPositiveGeometry("bandwidth", config.bandwidth);
|
|
@@ -1578,9 +1612,9 @@ export class MulticastManager {
|
|
|
1578
1612
|
// (configureTrack/timeoutMsForPacket); it just never had the repair-symbol
|
|
1579
1613
|
// and bandwidth inputs needed to compute one.
|
|
1580
1614
|
const deliveryWindowMs =
|
|
1581
|
-
|
|
1615
|
+
interleaveDepthMs >= MIN_INTERLEAVE_DEPTH_MS
|
|
1582
1616
|
? computeFecDeliveryWindowMs({
|
|
1583
|
-
interleaveDepthMs
|
|
1617
|
+
interleaveDepthMs,
|
|
1584
1618
|
sourceSymbols: config.fecK,
|
|
1585
1619
|
repairSymbols: config.fecRepairSymbols,
|
|
1586
1620
|
symbolSize: config.fecSymbolSize,
|
|
@@ -1593,12 +1627,12 @@ export class MulticastManager {
|
|
|
1593
1627
|
// The block classifier's geometry comes from the raw catalog cadence
|
|
1594
1628
|
// fields; a track whose media kind is not known yet classifies fail-closed.
|
|
1595
1629
|
const trackKind = config.trackKind ?? this.#router.trackKindFor(packetId);
|
|
1596
|
-
const geometry = trackKind === undefined
|
|
1630
|
+
const geometry = trackKind === undefined || interleaveDepthMs === 0
|
|
1597
1631
|
? undefined
|
|
1598
1632
|
: deriveBlockClassifierGeometry({
|
|
1599
1633
|
trackKind,
|
|
1600
1634
|
framerate: config.fps,
|
|
1601
|
-
interleaveDepthMs
|
|
1635
|
+
interleaveDepthMs,
|
|
1602
1636
|
timescale: config.timescale,
|
|
1603
1637
|
keyframeIntervalTicks: config.keyframeIntervalTicks,
|
|
1604
1638
|
keyframeIntervalMs: config.keyframeIntervalMs,
|
|
@@ -1607,7 +1641,7 @@ export class MulticastManager {
|
|
|
1607
1641
|
blockProfile,
|
|
1608
1642
|
k: config.fecK,
|
|
1609
1643
|
symbolSize: config.fecSymbolSize,
|
|
1610
|
-
interleaveDepthMs
|
|
1644
|
+
interleaveDepthMs,
|
|
1611
1645
|
fps: config.fps,
|
|
1612
1646
|
timeoutMs: deliveryWindowMs,
|
|
1613
1647
|
...(trackKind === undefined ? {} : { trackKind }),
|
|
@@ -1619,7 +1653,7 @@ export class MulticastManager {
|
|
|
1619
1653
|
|
|
1620
1654
|
this.#trackFecTiming.set(packetId, {
|
|
1621
1655
|
deliveryWindowMs,
|
|
1622
|
-
interleaveDepthMs
|
|
1656
|
+
interleaveDepthMs,
|
|
1623
1657
|
fps: config.fps,
|
|
1624
1658
|
k: config.fecK,
|
|
1625
1659
|
repairSymbols: config.fecRepairSymbols,
|
|
@@ -1642,6 +1676,10 @@ export class MulticastManager {
|
|
|
1642
1676
|
| "minimumFailbackWindowMs"
|
|
1643
1677
|
>,
|
|
1644
1678
|
) {
|
|
1679
|
+
const interleaveDepthMs = config.fecInterleaveDepthMs ?? 0;
|
|
1680
|
+
if (!Number.isSafeInteger(interleaveDepthMs) || interleaveDepthMs < 0) {
|
|
1681
|
+
throw new Error("[MulticastManager] fecInterleaveDepthMs must be a non-negative safe integer");
|
|
1682
|
+
}
|
|
1645
1683
|
const minimumFailbackWindowMs = config.minimumFailbackWindowMs;
|
|
1646
1684
|
if (
|
|
1647
1685
|
minimumFailbackWindowMs !== undefined &&
|
|
@@ -1671,7 +1709,7 @@ export class MulticastManager {
|
|
|
1671
1709
|
config.fecInterleaveDepthMs &&
|
|
1672
1710
|
config.fecInterleaveDepthMs >= MIN_INTERLEAVE_DEPTH_MS
|
|
1673
1711
|
? computeFecDeliveryWindowMs({
|
|
1674
|
-
interleaveDepthMs
|
|
1712
|
+
interleaveDepthMs,
|
|
1675
1713
|
sourceSymbols: config.fecK,
|
|
1676
1714
|
repairSymbols: config.fecRepairSymbols,
|
|
1677
1715
|
symbolSize: config.fecSymbolSize,
|
|
@@ -1683,7 +1721,7 @@ export class MulticastManager {
|
|
|
1683
1721
|
this.#fec.configure({
|
|
1684
1722
|
k: config.fecK,
|
|
1685
1723
|
symbolSize: config.fecSymbolSize,
|
|
1686
|
-
interleaveDepthMs
|
|
1724
|
+
interleaveDepthMs,
|
|
1687
1725
|
fps: config.fps,
|
|
1688
1726
|
timeoutMs: deliveryWindowMs,
|
|
1689
1727
|
});
|
|
@@ -1698,28 +1736,28 @@ export class MulticastManager {
|
|
|
1698
1736
|
// narrow them below what this baseline already guarantees.
|
|
1699
1737
|
this.#streamFecBaseline = {
|
|
1700
1738
|
deliveryWindowMs,
|
|
1701
|
-
interleaveDepthMs
|
|
1739
|
+
interleaveDepthMs,
|
|
1702
1740
|
fps: config.fps,
|
|
1703
1741
|
k: config.fecK,
|
|
1704
1742
|
repairSymbols: config.fecRepairSymbols,
|
|
1705
1743
|
minimumFailbackWindowMs,
|
|
1706
1744
|
};
|
|
1707
1745
|
this.#applyStreamGlobalFecTiming();
|
|
1708
|
-
// Wire FecBlockMapper to MmtpRouter
|
|
1746
|
+
// Wire the stream-global FecBlockMapper to MmtpRouter. Under iso-ssbg1-v1
|
|
1747
|
+
// (the only profile) the mapper locates no source symbol: a source is
|
|
1748
|
+
// placed only once a repair states its block (SS_Start, SSB_length), and
|
|
1749
|
+
// FecBlockMapper.fromSsId refuses every FEC stream. The router reads the
|
|
1750
|
+
// mapper only for the stream's block profile and K_max when no FEC
|
|
1751
|
+
// manager answers for the packet.
|
|
1709
1752
|
//
|
|
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.
|
|
1753
|
+
// gopDurationMs is the per-frame interval (1000/fps), never the
|
|
1754
|
+
// interleaveDepthMs: the mapper derives its interleave depth D from their
|
|
1755
|
+
// ratio, and passing interleaveDepthMs collapses D to 1 (BLO-3323 L14).
|
|
1718
1756
|
const k = config.fecK;
|
|
1719
1757
|
const interleaveMs = config.fecInterleaveDepthMs;
|
|
1720
1758
|
const fps = config.fps;
|
|
1721
|
-
// The stream-global mapper
|
|
1722
|
-
//
|
|
1759
|
+
// The stream-global mapper exists only for a stream whose catalog names a
|
|
1760
|
+
// block profile; parseFecBlockProfile refuses the retired k-padded-v1.
|
|
1723
1761
|
const blockProfile = config.fecBlockProfile === undefined
|
|
1724
1762
|
? undefined
|
|
1725
1763
|
: parseFecBlockProfile(config.fecBlockProfile, "[MulticastManager] configureFec fecBlockProfile");
|
|
@@ -1771,6 +1809,7 @@ export class MulticastManager {
|
|
|
1771
1809
|
|
|
1772
1810
|
setMfuTimeoutMs(ms: number): void {
|
|
1773
1811
|
this.#router.setMfuTimeoutMs(ms);
|
|
1812
|
+
this.#hostMfuTimeoutMs = this.#router.reassembler.timeoutMs;
|
|
1774
1813
|
}
|
|
1775
1814
|
|
|
1776
1815
|
setTrackCodec(packetId: number, codec: string) {
|
|
@@ -1798,6 +1837,7 @@ export class MulticastManager {
|
|
|
1798
1837
|
onTrackPacket(packetId: number, cb: TrackPacketCallback) {
|
|
1799
1838
|
this.#router.onTrackPacket(packetId, cb);
|
|
1800
1839
|
}
|
|
1840
|
+
/** @deprecated Use onTrackInit(packetId, cb); see MmtpRouter.onInitSegment. */
|
|
1801
1841
|
onInitSegment(cb: (data: Uint8Array) => void) {
|
|
1802
1842
|
this.#router.onInitSegment(cb);
|
|
1803
1843
|
}
|
|
@@ -1821,7 +1861,7 @@ export class MulticastManager {
|
|
|
1821
1861
|
|
|
1822
1862
|
enableMseAssembler(
|
|
1823
1863
|
packetId: number,
|
|
1824
|
-
config:
|
|
1864
|
+
config: BlockAssemblerConfig,
|
|
1825
1865
|
catalogTrackName?: string,
|
|
1826
1866
|
) {
|
|
1827
1867
|
return this.#router.enableMseAssembler(packetId, config, catalogTrackName);
|
|
@@ -1906,21 +1946,11 @@ export class MulticastManager {
|
|
|
1906
1946
|
),
|
|
1907
1947
|
),
|
|
1908
1948
|
};
|
|
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;
|
|
1949
|
+
// The single relay inlet: the player/UI override, or the catalog's
|
|
1950
|
+
// `multicast.networkSource[{type:"amt"}]` relay, which
|
|
1951
|
+
// `endpointToMulticastConfig` (packages/transport
|
|
1952
|
+
// multicast-catalog-policy.ts) resolves into `amtRelay` via `findAmtRelay`.
|
|
1953
|
+
const amtRelay = config.amtRelay;
|
|
1924
1954
|
const transportConfig = {
|
|
1925
1955
|
sourceAddress: config.sourceAddress,
|
|
1926
1956
|
groupAddress: config.groupAddress,
|
|
@@ -1933,9 +1963,8 @@ export class MulticastManager {
|
|
|
1933
1963
|
// endpoint-config.ts) deliberately has no implicit relay port — it throws
|
|
1934
1964
|
// and `MulticastTransport.join` resolves false — so the default is
|
|
1935
1965
|
// 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.
|
|
1966
|
+
// readers do it. This is the last of the three readers: `resolveNetworkSource`
|
|
1967
|
+
// emits a port-less relay shape.
|
|
1939
1968
|
// Keyed on the resolved relay, so a DRIAD entry — which pins no relay —
|
|
1940
1969
|
// never has a port manufactured for it. Blank counts as no relay, the
|
|
1941
1970
|
// same test `catalogAmtNetworkSource` applies (it trims, then skips) and
|
|
@@ -2210,7 +2239,10 @@ export class MulticastManager {
|
|
|
2210
2239
|
}
|
|
2211
2240
|
}
|
|
2212
2241
|
|
|
2213
|
-
/**
|
|
2242
|
+
/**
|
|
2243
|
+
* Release what the manager and FEC hold for a stream whose packet ID the
|
|
2244
|
+
* router retired, or whose FEC a catalog reconfiguration no longer configures.
|
|
2245
|
+
*/
|
|
2214
2246
|
#releaseRetiredStream(stream: MmtpStreamIdentity): void {
|
|
2215
2247
|
// Repair transports abort I/O for a stream on a reset notice
|
|
2216
2248
|
// (wireRepairFetch); a retired stream's repair fetches end with it.
|
|
@@ -2232,10 +2264,10 @@ export class MulticastManager {
|
|
|
2232
2264
|
for (const [key, stats] of [...this.#blockPolicyStats]) {
|
|
2233
2265
|
if (stats.packetId === stream.packetId) this.#blockPolicyStats.delete(key);
|
|
2234
2266
|
}
|
|
2235
|
-
|
|
2236
|
-
|
|
2237
|
-
|
|
2238
|
-
this.#
|
|
2267
|
+
if (this.#trackFecTiming.delete(stream.packetId)) {
|
|
2268
|
+
this.#applyStreamGlobalFecTiming();
|
|
2269
|
+
}
|
|
2270
|
+
this.#multiTrackFecTracks.delete(stream.packetId);
|
|
2239
2271
|
this.#fec.releasePacket(stream.packetId);
|
|
2240
2272
|
}
|
|
2241
2273
|
|
|
@@ -2302,6 +2334,21 @@ export class MulticastManager {
|
|
|
2302
2334
|
* D-17: Builds altGroup → track-name index for getSwitchingSet().
|
|
2303
2335
|
* D-26: Registers packetId → TrackRole on MmtpRouter for block-complete fanout.
|
|
2304
2336
|
*
|
|
2337
|
+
* FEC availability is per track (draft-ramadan-moq-fec §5.1). A media track
|
|
2338
|
+
* whose `fec` names no implemented `blockProfile` (only `iso-ssbg1-v1` is
|
|
2339
|
+
* implemented; the retired `k-padded-v1` is not), or an `iso-ssbg1-v1` span
|
|
2340
|
+
* it cannot use, is consumed without FEC: it gets no decoder, and none of
|
|
2341
|
+
* its repair tracks (layer 0 by `fec.repairTrack`, further layers and the
|
|
2342
|
+
* overlay by `depends`) is given an owner, so the router drops their packets
|
|
2343
|
+
* before any decoder. Those legs keep the `repair` role and their owner's
|
|
2344
|
+
* switching set. Neither the call nor any other track's FEC fails on that
|
|
2345
|
+
* account; `trackFecUnavailable(name)` reports the reason. FEC a previous
|
|
2346
|
+
* call configured on a packetId this call does not is released
|
|
2347
|
+
* (FECManager.releasePacket); frames its release gate held are delivered in
|
|
2348
|
+
* order, each gap stalled. FEC wired by hand (setFecDecoder) is left alone.
|
|
2349
|
+
* Geometry a decoder could not configure (K, P, T, `repairTrack`,
|
|
2350
|
+
* algorithm) still throws.
|
|
2351
|
+
*
|
|
2305
2352
|
* @param catalog - Multi-track catalog (tracks array with name, altGroup, fec, packetId).
|
|
2306
2353
|
* @param wasmDecoderSource - One WASM FEC decoder for a single FEC stream, or
|
|
2307
2354
|
* a factory returning a distinct decoder per stream.
|
|
@@ -2325,6 +2372,44 @@ export class MulticastManager {
|
|
|
2325
2372
|
// mis-roled or rejected on its name, and would land in its own altGroup
|
|
2326
2373
|
// rather than its owner's.
|
|
2327
2374
|
const repairNamesBySource = repairTrackNamesBySource(catalog.tracks);
|
|
2375
|
+
// §5.1: classify each media track's FEC before roles are resolved. A track
|
|
2376
|
+
// whose FEC is unavailable still names its layer 0 by `fec.repairTrack`;
|
|
2377
|
+
// that pointer is a catalog fact about the leg, not about the profile, so
|
|
2378
|
+
// the leg stays roled `repair` in its owner's group rather than falling
|
|
2379
|
+
// through to its name. It is never given an owner below.
|
|
2380
|
+
const declaredRepairNames = new Set<string>();
|
|
2381
|
+
for (const names of repairNamesBySource.values()) {
|
|
2382
|
+
for (const name of names) declaredRepairNames.add(name);
|
|
2383
|
+
}
|
|
2384
|
+
const fecUnavailableByTrack = new Map<string, TrackFecUnavailable>();
|
|
2385
|
+
for (let i = 0; i < catalog.tracks.length; i++) {
|
|
2386
|
+
const track = catalog.tracks[i]!;
|
|
2387
|
+
if (
|
|
2388
|
+
track.fec === undefined ||
|
|
2389
|
+
track.packaging === "fec-repair" ||
|
|
2390
|
+
declaredRepairNames.has(track.name)
|
|
2391
|
+
) {
|
|
2392
|
+
continue;
|
|
2393
|
+
}
|
|
2394
|
+
const fecUnavailable = catalogFecUnavailable(track.fec, `$.tracks[${i}].fec`);
|
|
2395
|
+
if (fecUnavailable === undefined) continue;
|
|
2396
|
+
fecUnavailableByTrack.set(track.name, fecUnavailable);
|
|
2397
|
+
const layerZero = (track.fec as { repairTrack?: unknown }).repairTrack;
|
|
2398
|
+
if (typeof layerZero === "string" && layerZero.length > 0) {
|
|
2399
|
+
const names = repairNamesBySource.get(track.name) ?? new Set<string>();
|
|
2400
|
+
names.add(layerZero);
|
|
2401
|
+
repairNamesBySource.set(track.name, names);
|
|
2402
|
+
}
|
|
2403
|
+
}
|
|
2404
|
+
// Every repair leg of a source without FEC goes unowned, including one a
|
|
2405
|
+
// source with FEC also names: the router could not tell the two sources'
|
|
2406
|
+
// symbols apart on it, and the unavailable source's must reach no decoder.
|
|
2407
|
+
const unownedRepairNames = new Set<string>();
|
|
2408
|
+
for (const sourceName of fecUnavailableByTrack.keys()) {
|
|
2409
|
+
for (const repairName of repairNamesBySource.get(sourceName) ?? []) {
|
|
2410
|
+
unownedRepairNames.add(repairName);
|
|
2411
|
+
}
|
|
2412
|
+
}
|
|
2328
2413
|
const repairOwnerGroup = new Map<string, string>();
|
|
2329
2414
|
const repairOwnerAltGroup = new Map<string, number | undefined>();
|
|
2330
2415
|
for (const track of catalog.tracks) {
|
|
@@ -2390,11 +2475,15 @@ export class MulticastManager {
|
|
|
2390
2475
|
for (let i = 0; i < catalog.tracks.length; i++) {
|
|
2391
2476
|
const track = catalog.tracks[i]!;
|
|
2392
2477
|
if (resolvedRoles[i] === "repair" || track.fec === undefined) continue;
|
|
2393
|
-
|
|
2478
|
+
// Malformed geometry fails the call whatever the profile says; an
|
|
2479
|
+
// unavailable profile or span only costs this track its FEC (§5.1).
|
|
2480
|
+
const unavailable = fecUnavailableByTrack.has(track.name);
|
|
2481
|
+
if (!(unavailable ? isFecCatalogGeometry(track.fec) : isFecCatalogConfig(track.fec))) {
|
|
2394
2482
|
throw new Error(
|
|
2395
2483
|
`[MulticastManager] invalid fec config for track '${track.name}'`,
|
|
2396
2484
|
);
|
|
2397
2485
|
}
|
|
2486
|
+
if (unavailable) continue;
|
|
2398
2487
|
if (track.packetId !== undefined) fecTrackIndexes.push(i);
|
|
2399
2488
|
}
|
|
2400
2489
|
|
|
@@ -2424,10 +2513,32 @@ export class MulticastManager {
|
|
|
2424
2513
|
}
|
|
2425
2514
|
}
|
|
2426
2515
|
|
|
2427
|
-
// Reset switching-set index
|
|
2516
|
+
// Reset switching-set index, repair packetId set and FEC availability.
|
|
2428
2517
|
this.#switchingSets.clear();
|
|
2429
2518
|
this.#repairPacketIds.clear();
|
|
2430
2519
|
this.#router.clearRepairPacketIdOwners();
|
|
2520
|
+
// FEC a previous call configured that this one does not (the source is
|
|
2521
|
+
// gone, lost its `fec`, or its FEC is now unavailable) must not stay
|
|
2522
|
+
// installed: its symbols would still be read as block coordinates and
|
|
2523
|
+
// held for repair legs that no longer have an owner. FEC a caller wired
|
|
2524
|
+
// by hand is not this call's to release.
|
|
2525
|
+
const fecPacketIds = new Set([...fecDecoders.keys()].map((i) => catalog.tracks[i]!.packetId));
|
|
2526
|
+
// The record survives a throw below: a packet this call configures again
|
|
2527
|
+
// is overwritten by its set(), and a released one is dropped by
|
|
2528
|
+
// #releaseRetiredStream.
|
|
2529
|
+
for (const [packetId, catalogTrackName] of this.#multiTrackFecTracks) {
|
|
2530
|
+
if (fecPacketIds.has(packetId)) continue;
|
|
2531
|
+
if (!this.#fec.isTrackConfigured(packetId)) {
|
|
2532
|
+
this.#multiTrackFecTracks.delete(packetId);
|
|
2533
|
+
continue;
|
|
2534
|
+
}
|
|
2535
|
+
this.#router.releaseFecPacket(packetId);
|
|
2536
|
+
this.#releaseRetiredStream({ packetId, catalogTrackName });
|
|
2537
|
+
}
|
|
2538
|
+
this.#fecUnavailableByTrack.clear();
|
|
2539
|
+
for (const [name, reason] of fecUnavailableByTrack) {
|
|
2540
|
+
this.#fecUnavailableByTrack.set(name, reason);
|
|
2541
|
+
}
|
|
2431
2542
|
const catalogTracksByName = new Map(
|
|
2432
2543
|
catalog.tracks.map((track) => [track.name, track] as const),
|
|
2433
2544
|
);
|
|
@@ -2460,8 +2571,9 @@ export class MulticastManager {
|
|
|
2460
2571
|
continue;
|
|
2461
2572
|
}
|
|
2462
2573
|
|
|
2463
|
-
// D-07: Apply per-track FEC config for non-repair tracks.
|
|
2464
|
-
|
|
2574
|
+
// D-07: Apply per-track FEC config for non-repair tracks. A track whose
|
|
2575
|
+
// FEC is unavailable (§5.1) is consumed like a track without `fec`.
|
|
2576
|
+
if (track.fec !== undefined && !fecUnavailableByTrack.has(track.name)) {
|
|
2465
2577
|
const fecCfg = track.fec as FecCatalogConfig;
|
|
2466
2578
|
// Every repair layer and the keyframe overlay route to this source's
|
|
2467
2579
|
// decoder, not only layer 0. A layer whose packetId had no registered
|
|
@@ -2469,6 +2581,7 @@ export class MulticastManager {
|
|
|
2469
2581
|
// two sources whose RS_ID ranges overlap would be indistinguishable.
|
|
2470
2582
|
if (track.packetId !== undefined) {
|
|
2471
2583
|
for (const repairName of repairNamesBySource.get(track.name) ?? []) {
|
|
2584
|
+
if (unownedRepairNames.has(repairName)) continue;
|
|
2472
2585
|
const repairTrack = catalogTracksByName.get(repairName);
|
|
2473
2586
|
if (repairTrack?.packetId !== undefined) {
|
|
2474
2587
|
this.#router.setRepairPacketIdOwner(repairTrack.packetId, track.packetId);
|
|
@@ -2493,17 +2606,18 @@ export class MulticastManager {
|
|
|
2493
2606
|
blockProfile,
|
|
2494
2607
|
k: fecCfg.sourceSymbols,
|
|
2495
2608
|
symbolSize: fecCfg.symbolSize,
|
|
2496
|
-
interleaveDepthMs: fecCfg.interleaveDepthMs,
|
|
2609
|
+
interleaveDepthMs: fecCfg.interleaveDepthMs ?? 0,
|
|
2497
2610
|
fps: track.framerate,
|
|
2498
2611
|
trackKind: "video",
|
|
2499
2612
|
},
|
|
2500
2613
|
track.name,
|
|
2501
2614
|
);
|
|
2615
|
+
this.#multiTrackFecTracks.set(track.packetId, track.name);
|
|
2502
2616
|
this.#configureTrackMapper(track.packetId, {
|
|
2503
2617
|
blockProfile,
|
|
2504
2618
|
k: fecCfg.sourceSymbols,
|
|
2505
2619
|
symbolSize: fecCfg.symbolSize,
|
|
2506
|
-
interleaveDepthMs: fecCfg.interleaveDepthMs,
|
|
2620
|
+
interleaveDepthMs: fecCfg.interleaveDepthMs ?? 0,
|
|
2507
2621
|
fps: track.framerate,
|
|
2508
2622
|
});
|
|
2509
2623
|
this.#router.setPacketIdType(track.packetId, "video");
|
|
@@ -2512,6 +2626,27 @@ export class MulticastManager {
|
|
|
2512
2626
|
}
|
|
2513
2627
|
}
|
|
2514
2628
|
|
|
2629
|
+
/**
|
|
2630
|
+
* Why `configureMultiTrack` consumes the named catalog track without FEC
|
|
2631
|
+
* although its `fec` block declares one (draft-ramadan-moq-fec §5.1): no
|
|
2632
|
+
* implemented `blockProfile` (`track_fec_block_profile_unimplemented`, e.g.
|
|
2633
|
+
* the retired `k-padded-v1`; `track_fec_block_profile` when absent), or an
|
|
2634
|
+
* invalid `iso-ssbg1-v1` span (`track_fec`). Absent/zero spans keep in-band
|
|
2635
|
+
* decoding enabled. The same reason the hang
|
|
2636
|
+
* resolver reports (`catalogFecUnavailable`). Undefined for every other
|
|
2637
|
+
* track, and for every track before the first call; each call replaces the
|
|
2638
|
+
* previous call's answers.
|
|
2639
|
+
*/
|
|
2640
|
+
trackFecUnavailable(trackName: string): TrackFecUnavailable | undefined {
|
|
2641
|
+
return this.#fecUnavailableByTrack.get(trackName);
|
|
2642
|
+
}
|
|
2643
|
+
|
|
2644
|
+
/** Per-track FEC availability from the last `configureMultiTrack` call. */
|
|
2645
|
+
readonly #fecUnavailableByTrack = new Map<string, TrackFecUnavailable>();
|
|
2646
|
+
|
|
2647
|
+
/** packetId → catalog track name of the FEC the last `configureMultiTrack` installed. */
|
|
2648
|
+
readonly #multiTrackFecTracks = new Map<number, string>();
|
|
2649
|
+
|
|
2515
2650
|
/**
|
|
2516
2651
|
* Return the track names belonging to the given altGroup switching set.
|
|
2517
2652
|
* D-17: altGroup groups base+delta+repair into one switching set.
|
|
@@ -2570,12 +2705,22 @@ export class MulticastManager {
|
|
|
2570
2705
|
/** Record a repair request the scheduler sent no FETCH for. */
|
|
2571
2706
|
noteRepairSkipped(
|
|
2572
2707
|
reason: RepairSkipReason,
|
|
2573
|
-
measurement: { readonly rttMs: number | null; readonly budgetMs: number },
|
|
2708
|
+
measurement: { readonly rttMs: number | null; readonly budgetMs: number; readonly priority?: RepairPriority },
|
|
2574
2709
|
sbn: number,
|
|
2575
2710
|
packetId: number,
|
|
2576
2711
|
catalogTrackName?: string,
|
|
2577
2712
|
): void {
|
|
2578
|
-
this.#statsFor(packetId, catalogTrackName)
|
|
2713
|
+
const stats = this.#statsFor(packetId, catalogTrackName);
|
|
2714
|
+
stats.repairsSkipped++;
|
|
2715
|
+
if (reason === "rtt-unmeasured") stats.repairsSkippedRttUnmeasured++;
|
|
2716
|
+
else if (reason === "rtt-exceeds-budget") stats.repairsSkippedRttExceedsBudget++;
|
|
2717
|
+
else stats.repairsSkippedPresentationDelayUnavailable++;
|
|
2718
|
+
stats.lastRepairSkip = {
|
|
2719
|
+
reason,
|
|
2720
|
+
rttMs: measurement.rttMs,
|
|
2721
|
+
budgetMs: measurement.budgetMs,
|
|
2722
|
+
priority: measurement.priority ?? null,
|
|
2723
|
+
};
|
|
2579
2724
|
this.#emitRepairLifecycle({
|
|
2580
2725
|
version: 2,
|
|
2581
2726
|
type: "repair-skipped",
|
|
@@ -2586,6 +2731,37 @@ export class MulticastManager {
|
|
|
2586
2731
|
});
|
|
2587
2732
|
}
|
|
2588
2733
|
|
|
2734
|
+
/**
|
|
2735
|
+
* Arrival time of the earliest frame the in-order release gate holds for
|
|
2736
|
+
* the stream: the gate releases it as a discontinuity once
|
|
2737
|
+
* `terminalRetentionMsForPacket` has passed since then.
|
|
2738
|
+
*/
|
|
2739
|
+
earliestGatedFrameAtMs(packetId: number, catalogTrackName?: string): number | undefined {
|
|
2740
|
+
return this.#router.fecReleaseEarliestHeldAtMs(packetId, catalogTrackName);
|
|
2741
|
+
}
|
|
2742
|
+
|
|
2743
|
+
/** Record a keyframe late-repair budget the scheduler granted a block. */
|
|
2744
|
+
noteKeyframeBudgetGranted(
|
|
2745
|
+
extensionMs: number,
|
|
2746
|
+
_sbn: number,
|
|
2747
|
+
packetId: number,
|
|
2748
|
+
catalogTrackName?: string,
|
|
2749
|
+
): void {
|
|
2750
|
+
const stats = this.#statsFor(packetId, catalogTrackName);
|
|
2751
|
+
stats.keyframeBudgetHolds++;
|
|
2752
|
+
stats.keyframeBudgetHoldMs += extensionMs;
|
|
2753
|
+
}
|
|
2754
|
+
|
|
2755
|
+
/** Record a repair FETCH the scheduler admitted and sent. */
|
|
2756
|
+
noteRepairFetchSent(
|
|
2757
|
+
priority: RepairPriority,
|
|
2758
|
+
_sbn: number,
|
|
2759
|
+
packetId: number,
|
|
2760
|
+
catalogTrackName?: string,
|
|
2761
|
+
): void {
|
|
2762
|
+
if (priority === 0) this.#statsFor(packetId, catalogTrackName).keyframeRepairFetchesSent++;
|
|
2763
|
+
}
|
|
2764
|
+
|
|
2589
2765
|
/**
|
|
2590
2766
|
* Record a repair-scheduler decision about a delta block: preempted for
|
|
2591
2767
|
* keyframe/audio work, or never dispatched before its block resolved.
|
|
@@ -2620,7 +2796,10 @@ export class MulticastManager {
|
|
|
2620
2796
|
const out: Record<string, BlockPolicyStats> = {};
|
|
2621
2797
|
for (const [key, stats] of this.#blockPolicyStats) {
|
|
2622
2798
|
if (stats.epoch !== this.#fec.epochFor(stats.packetId)) continue;
|
|
2623
|
-
out[key] = {
|
|
2799
|
+
out[key] = {
|
|
2800
|
+
...stats,
|
|
2801
|
+
lastRepairSkip: stats.lastRepairSkip === null ? null : { ...stats.lastRepairSkip },
|
|
2802
|
+
};
|
|
2624
2803
|
}
|
|
2625
2804
|
return out;
|
|
2626
2805
|
}
|