@blockcast/mmt-container 0.1.0-main.149f78a4adae
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +432 -0
- package/dist/.build-stamp +0 -0
- package/dist/__tests__/test-utils.d.ts +71 -0
- package/dist/__tests__/test-utils.d.ts.map +1 -0
- package/dist/align.d.ts +148 -0
- package/dist/align.d.ts.map +1 -0
- package/dist/align.js +88 -0
- package/dist/align.js.map +7 -0
- package/dist/audio-init-parser.d.ts +66 -0
- package/dist/audio-init-parser.d.ts.map +1 -0
- package/dist/audio-init-parser.js +118 -0
- package/dist/audio-init-parser.js.map +7 -0
- package/dist/audio-ring-buffer.d.ts +50 -0
- package/dist/audio-ring-buffer.d.ts.map +1 -0
- package/dist/audio-ring-buffer.js +93 -0
- package/dist/audio-ring-buffer.js.map +7 -0
- package/dist/authored-timing.d.ts +32 -0
- package/dist/authored-timing.d.ts.map +1 -0
- package/dist/authored-timing.js +32 -0
- package/dist/authored-timing.js.map +7 -0
- package/dist/browser-runtime.js +17109 -0
- package/dist/browser-runtime.js.map +7 -0
- package/dist/carp-catalog.d.ts +318 -0
- package/dist/carp-catalog.d.ts.map +1 -0
- package/dist/carp-catalog.js +549 -0
- package/dist/carp-catalog.js.map +7 -0
- package/dist/catalog-fec-params.d.ts +82 -0
- package/dist/catalog-fec-params.d.ts.map +1 -0
- package/dist/catalog-fec-params.js +66 -0
- package/dist/catalog-fec-params.js.map +7 -0
- package/dist/catalog-network-source.d.ts +19 -0
- package/dist/catalog-network-source.d.ts.map +1 -0
- package/dist/catalog-network-source.js +22 -0
- package/dist/catalog-network-source.js.map +7 -0
- package/dist/catalog-validator.d.ts +18 -0
- package/dist/catalog-validator.d.ts.map +1 -0
- package/dist/catalog-validator.js +7747 -0
- package/dist/catalog-validator.js.map +7 -0
- package/dist/cmaf-block-assembler.d.ts +168 -0
- package/dist/cmaf-block-assembler.d.ts.map +1 -0
- package/dist/cmaf-block-assembler.js +1755 -0
- package/dist/cmaf-block-assembler.js.map +7 -0
- package/dist/cmaf-group-batcher.d.ts +38 -0
- package/dist/cmaf-group-batcher.d.ts.map +1 -0
- package/dist/cmaf-group-batcher.js +195 -0
- package/dist/cmaf-group-batcher.js.map +7 -0
- package/dist/cmcd-producer.d.ts +104 -0
- package/dist/cmcd-producer.d.ts.map +1 -0
- package/dist/cmcd-producer.js +207 -0
- package/dist/cmcd-producer.js.map +7 -0
- package/dist/codec-utils.d.ts +235 -0
- package/dist/codec-utils.d.ts.map +1 -0
- package/dist/codec-utils.js +1225 -0
- package/dist/codec-utils.js.map +7 -0
- package/dist/fec-codec.d.ts +32 -0
- package/dist/fec-codec.d.ts.map +1 -0
- package/dist/fec-codec.js +47 -0
- package/dist/fec-codec.js.map +7 -0
- package/dist/fec-manager.d.ts +266 -0
- package/dist/fec-manager.d.ts.map +1 -0
- package/dist/fec-manager.js +1447 -0
- package/dist/fec-manager.js.map +7 -0
- package/dist/fec-starvation-detector.d.ts +59 -0
- package/dist/fec-starvation-detector.d.ts.map +1 -0
- package/dist/fec-starvation-detector.js +75 -0
- package/dist/fec-starvation-detector.js.map +7 -0
- package/dist/fec-worker-setup.d.ts +76 -0
- package/dist/fec-worker-setup.d.ts.map +1 -0
- package/dist/fec-worker-setup.js +603 -0
- package/dist/fec-worker-setup.js.map +7 -0
- package/dist/fmp4-completion.d.ts +30 -0
- package/dist/fmp4-completion.d.ts.map +1 -0
- package/dist/fmp4-completion.js +21 -0
- package/dist/fmp4-completion.js.map +7 -0
- package/dist/fmp4-reader.d.ts +37 -0
- package/dist/fmp4-reader.d.ts.map +1 -0
- package/dist/fmp4-reader.js +100 -0
- package/dist/fmp4-reader.js.map +7 -0
- package/dist/index.d.ts +47 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +330 -0
- package/dist/index.js.map +7 -0
- package/dist/iso-bmff-timing.d.ts +47 -0
- package/dist/iso-bmff-timing.d.ts.map +1 -0
- package/dist/iso-bmff-timing.js +526 -0
- package/dist/iso-bmff-timing.js.map +7 -0
- package/dist/loc.d.ts +68 -0
- package/dist/loc.d.ts.map +1 -0
- package/dist/loc.js +143 -0
- package/dist/loc.js.map +7 -0
- package/dist/manifest-auth-plan.d.ts +30 -0
- package/dist/manifest-auth-plan.d.ts.map +1 -0
- package/dist/manifest-auth-plan.js +1267 -0
- package/dist/manifest-auth-plan.js.map +7 -0
- package/dist/media-router.d.ts +338 -0
- package/dist/media-router.d.ts.map +1 -0
- package/dist/media-router.js +802 -0
- package/dist/media-router.js.map +7 -0
- package/dist/mfu-reassembler.d.ts +264 -0
- package/dist/mfu-reassembler.d.ts.map +1 -0
- package/dist/mfu-reassembler.js +2668 -0
- package/dist/mfu-reassembler.js.map +7 -0
- package/dist/mfu-reassembly-policy.d.ts +24 -0
- package/dist/mfu-reassembly-policy.d.ts.map +1 -0
- package/dist/mfu-reassembly-policy.js +99 -0
- package/dist/mfu-reassembly-policy.js.map +7 -0
- package/dist/mmtp-container-parser.d.ts +304 -0
- package/dist/mmtp-container-parser.d.ts.map +1 -0
- package/dist/mmtp-container-parser.js +5378 -0
- package/dist/mmtp-container-parser.js.map +7 -0
- package/dist/mmtp-container-parser.no-modules.js +7853 -0
- package/dist/mmtp-container-parser.no-modules.js.map +7 -0
- package/dist/mmtp-decode-pipeline.d.ts +96 -0
- package/dist/mmtp-decode-pipeline.d.ts.map +1 -0
- package/dist/mmtp-decode-pipeline.js +5589 -0
- package/dist/mmtp-decode-pipeline.js.map +7 -0
- package/dist/mmtp-router.d.ts +383 -0
- package/dist/mmtp-router.d.ts.map +1 -0
- package/dist/mmtp-router.js +8384 -0
- package/dist/mmtp-router.js.map +7 -0
- package/dist/mmtp-to-cmaf.d.ts +166 -0
- package/dist/mmtp-to-cmaf.d.ts.map +1 -0
- package/dist/mmtp-to-cmaf.js +781 -0
- package/dist/mmtp-to-cmaf.js.map +7 -0
- package/dist/multicast-auth-catalog.d.ts +115 -0
- package/dist/multicast-auth-catalog.d.ts.map +1 -0
- package/dist/multicast-auth-catalog.js +202 -0
- package/dist/multicast-auth-catalog.js.map +7 -0
- package/dist/multicast-input.d.ts +107 -0
- package/dist/multicast-input.d.ts.map +1 -0
- package/dist/multicast-input.js +256 -0
- package/dist/multicast-input.js.map +7 -0
- package/dist/multicast-manager.d.ts +330 -0
- package/dist/multicast-manager.d.ts.map +1 -0
- package/dist/multicast-manager.js +11032 -0
- package/dist/multicast-manager.js.map +7 -0
- package/dist/multicast-transport.d.ts +62 -0
- package/dist/multicast-transport.d.ts.map +1 -0
- package/dist/multicast-transport.js +338 -0
- package/dist/multicast-transport.js.map +7 -0
- package/dist/multicast-unwrap.d.ts +57 -0
- package/dist/multicast-unwrap.d.ts.map +1 -0
- package/dist/multicast-unwrap.js +384 -0
- package/dist/multicast-unwrap.js.map +7 -0
- package/dist/no-modules.d.ts +9 -0
- package/dist/no-modules.d.ts.map +1 -0
- package/dist/no-modules.js +7819 -0
- package/dist/no-modules.js.map +7 -0
- package/dist/phase14-catalog-override.d.ts +126 -0
- package/dist/phase14-catalog-override.d.ts.map +1 -0
- package/dist/phase14-catalog-override.js +155 -0
- package/dist/phase14-catalog-override.js.map +7 -0
- package/dist/repair-fetch.d.ts +58 -0
- package/dist/repair-fetch.d.ts.map +1 -0
- package/dist/repair-fetch.js +117 -0
- package/dist/repair-fetch.js.map +7 -0
- package/dist/sample-combiner.d.ts +182 -0
- package/dist/sample-combiner.d.ts.map +1 -0
- package/dist/sample-combiner.js +571 -0
- package/dist/sample-combiner.js.map +7 -0
- package/dist/signaling.d.ts +29 -0
- package/dist/signaling.d.ts.map +1 -0
- package/dist/signaling.js +232 -0
- package/dist/signaling.js.map +7 -0
- package/dist/source-auth.d.ts +2 -0
- package/dist/source-auth.d.ts.map +1 -0
- package/dist/source-auth.js +1220 -0
- package/dist/source-auth.js.map +7 -0
- package/dist/switching-set-alignment.d.ts +61 -0
- package/dist/switching-set-alignment.d.ts.map +1 -0
- package/dist/switching-set-alignment.js +85 -0
- package/dist/switching-set-alignment.js.map +7 -0
- package/dist/timestamp-codec.d.ts +34 -0
- package/dist/timestamp-codec.d.ts.map +1 -0
- package/dist/timestamp-codec.js +456 -0
- package/dist/timestamp-codec.js.map +7 -0
- package/dist/track-pipeline-setup.d.ts +72 -0
- package/dist/track-pipeline-setup.d.ts.map +1 -0
- package/dist/track-pipeline-setup.js +306 -0
- package/dist/track-pipeline-setup.js.map +7 -0
- package/dist/track-pipeline.d.ts +121 -0
- package/dist/track-pipeline.d.ts.map +1 -0
- package/dist/track-pipeline.js +229 -0
- package/dist/track-pipeline.js.map +7 -0
- package/dist/track-session.d.ts +269 -0
- package/dist/track-session.d.ts.map +1 -0
- package/dist/track-session.js +597 -0
- package/dist/track-session.js.map +7 -0
- package/dist/transport-pool.d.ts +69 -0
- package/dist/transport-pool.d.ts.map +1 -0
- package/dist/transport-pool.js +88 -0
- package/dist/transport-pool.js.map +7 -0
- package/dist/wasm-mfu-reassembler.d.ts +81 -0
- package/dist/wasm-mfu-reassembler.d.ts.map +1 -0
- package/dist/wasm-mfu-reassembler.js +1915 -0
- package/dist/wasm-mfu-reassembler.js.map +7 -0
- package/dist/wasm-mmtp-container-parser.d.ts +10 -0
- package/dist/wasm-mmtp-container-parser.d.ts.map +1 -0
- package/dist/wasm-mmtp-container-parser.js +5635 -0
- package/dist/wasm-mmtp-container-parser.js.map +7 -0
- package/node_modules/@blockcast/fec-worker/README.md +213 -0
- package/node_modules/@blockcast/fec-worker/dist/.build-stamp +0 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.d.ts +80 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.d.ts.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.js +270 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.js.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.d.ts +252 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.d.ts.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.js +11 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.js.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker.d.ts +14 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker.d.ts.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker.js +565 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker.js.map +7 -0
- package/node_modules/@blockcast/fec-worker/dist/index.d.ts +10 -0
- package/node_modules/@blockcast/fec-worker/dist/index.d.ts.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/index.js +8 -0
- package/node_modules/@blockcast/fec-worker/dist/index.js.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.d.ts +20 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.d.ts.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.js +349 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.js.map +7 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.d.ts +104 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.d.ts.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.js +181 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.js.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.d.ts +179 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.d.ts.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.js +47 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.js.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/transfer.d.ts +9 -0
- package/node_modules/@blockcast/fec-worker/dist/transfer.d.ts.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/transfer.js +13 -0
- package/node_modules/@blockcast/fec-worker/dist/transfer.js.map +1 -0
- package/node_modules/@blockcast/fec-worker/package.json +59 -0
- package/node_modules/@blockcast/fec-worker/src/fec-worker-client.ts +309 -0
- package/node_modules/@blockcast/fec-worker/src/fec-worker-types.ts +268 -0
- package/node_modules/@blockcast/fec-worker/src/fec-worker.ts +1048 -0
- package/node_modules/@blockcast/fec-worker/src/index.ts +32 -0
- package/node_modules/@blockcast/fec-worker/src/shred-fec-worker.ts +558 -0
- package/node_modules/@blockcast/fec-worker/src/shred-worker-client.ts +222 -0
- package/node_modules/@blockcast/fec-worker/src/shred-worker-types.ts +194 -0
- package/node_modules/@blockcast/fec-worker/src/transfer.ts +12 -0
- package/node_modules/@blockcast/mmt-alta-parse/README.md +181 -0
- package/node_modules/@blockcast/mmt-alta-parse/dist/.build-stamp +0 -0
- package/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts +57 -0
- package/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-alta-parse/dist/index.js +115 -0
- package/node_modules/@blockcast/mmt-alta-parse/dist/index.js.map +1 -0
- package/node_modules/@blockcast/mmt-alta-parse/package.json +50 -0
- package/node_modules/@blockcast/mmt-alta-parse/src/index.ts +136 -0
- package/node_modules/@blockcast/mmt-base/README.md +120 -0
- package/node_modules/@blockcast/mmt-base/dist/.build-stamp +0 -0
- package/node_modules/@blockcast/mmt-base/dist/index.d.ts +2 -0
- package/node_modules/@blockcast/mmt-base/dist/index.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-base/dist/index.js +2 -0
- package/node_modules/@blockcast/mmt-base/dist/index.js.map +1 -0
- package/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts +275 -0
- package/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-base/dist/mmtp.js +644 -0
- package/node_modules/@blockcast/mmt-base/dist/mmtp.js.map +1 -0
- package/node_modules/@blockcast/mmt-base/package.json +49 -0
- package/node_modules/@blockcast/mmt-base/src/index.ts +1 -0
- package/node_modules/@blockcast/mmt-base/src/mmtp.ts +898 -0
- package/node_modules/@blockcast/mmt-fec/README.md +270 -0
- package/node_modules/@blockcast/mmt-fec/dist/.build-stamp +0 -0
- package/node_modules/@blockcast/mmt-fec/dist/block-manager.d.ts +80 -0
- package/node_modules/@blockcast/mmt-fec/dist/block-manager.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/block-manager.js +294 -0
- package/node_modules/@blockcast/mmt-fec/dist/block-manager.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/block-processor.d.ts +72 -0
- package/node_modules/@blockcast/mmt-fec/dist/block-processor.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/block-processor.js +192 -0
- package/node_modules/@blockcast/mmt-fec/dist/block-processor.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.d.ts +46 -0
- package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.js +96 -0
- package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.d.ts +33 -0
- package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.js +57 -0
- package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.d.ts +185 -0
- package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.js +273 -0
- package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/index.d.ts +22 -0
- package/node_modules/@blockcast/mmt-fec/dist/index.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/index.js +22 -0
- package/node_modules/@blockcast/mmt-fec/dist/index.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.d.ts +20 -0
- package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.js +28 -0
- package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/oti.d.ts +174 -0
- package/node_modules/@blockcast/mmt-fec/dist/oti.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/oti.js +256 -0
- package/node_modules/@blockcast/mmt-fec/dist/oti.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.d.ts +41 -0
- package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.js +81 -0
- package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/README.md +181 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/.build-stamp +0 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts +57 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.js +115 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/package.json +50 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/src/index.ts +136 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/README.md +120 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/.build-stamp +0 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.d.ts +2 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.js +2 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts +275 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.js +644 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/package.json +49 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/index.ts +1 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/mmtp.ts +898 -0
- package/node_modules/@blockcast/mmt-fec/package.json +79 -0
- package/node_modules/@blockcast/mmt-fec/src/block-manager.ts +369 -0
- package/node_modules/@blockcast/mmt-fec/src/block-processor.ts +277 -0
- package/node_modules/@blockcast/mmt-fec/src/cmaf-recovery.ts +127 -0
- package/node_modules/@blockcast/mmt-fec/src/cmaf-symbols.ts +68 -0
- package/node_modules/@blockcast/mmt-fec/src/fec-block-mapper.ts +332 -0
- package/node_modules/@blockcast/mmt-fec/src/index.ts +77 -0
- package/node_modules/@blockcast/mmt-fec/src/loc-symbols.ts +34 -0
- package/node_modules/@blockcast/mmt-fec/src/oti.ts +319 -0
- package/node_modules/@blockcast/mmt-fec/src/reorder-buffer.ts +101 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/.build-stamp +0 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.d.ts +28 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.js +128 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.js.map +1 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/index.d.ts +4 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/index.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/index.js +4 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/index.js.map +1 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.d.ts +37 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.js +179 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.js.map +1 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.d.ts +90 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.js +462 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.js.map +1 -0
- package/node_modules/@blockcast/mmt-manifest-verify/package.json +45 -0
- package/node_modules/@blockcast/mmt-manifest-verify/src/admission.ts +171 -0
- package/node_modules/@blockcast/mmt-manifest-verify/src/index.ts +3 -0
- package/node_modules/@blockcast/mmt-manifest-verify/src/source-auth.ts +230 -0
- package/node_modules/@blockcast/mmt-manifest-verify/src/verifier.ts +636 -0
- package/node_modules/@noble/hashes/LICENSE +21 -0
- package/node_modules/@noble/hashes/README.md +521 -0
- package/node_modules/@noble/hashes/_assert.d.ts +17 -0
- package/node_modules/@noble/hashes/_assert.d.ts.map +1 -0
- package/node_modules/@noble/hashes/_assert.js +18 -0
- package/node_modules/@noble/hashes/_assert.js.map +1 -0
- package/node_modules/@noble/hashes/_blake.d.ts +14 -0
- package/node_modules/@noble/hashes/_blake.d.ts.map +1 -0
- package/node_modules/@noble/hashes/_blake.js +50 -0
- package/node_modules/@noble/hashes/_blake.js.map +1 -0
- package/node_modules/@noble/hashes/_md.d.ts +51 -0
- package/node_modules/@noble/hashes/_md.d.ts.map +1 -0
- package/node_modules/@noble/hashes/_md.js +162 -0
- package/node_modules/@noble/hashes/_md.js.map +1 -0
- package/node_modules/@noble/hashes/_u64.d.ts +55 -0
- package/node_modules/@noble/hashes/_u64.d.ts.map +1 -0
- package/node_modules/@noble/hashes/_u64.js +90 -0
- package/node_modules/@noble/hashes/_u64.js.map +1 -0
- package/node_modules/@noble/hashes/argon2.d.ts +32 -0
- package/node_modules/@noble/hashes/argon2.d.ts.map +1 -0
- package/node_modules/@noble/hashes/argon2.js +401 -0
- package/node_modules/@noble/hashes/argon2.js.map +1 -0
- package/node_modules/@noble/hashes/blake1.d.ts +106 -0
- package/node_modules/@noble/hashes/blake1.d.ts.map +1 -0
- package/node_modules/@noble/hashes/blake1.js +459 -0
- package/node_modules/@noble/hashes/blake1.js.map +1 -0
- package/node_modules/@noble/hashes/blake2.d.ts +116 -0
- package/node_modules/@noble/hashes/blake2.d.ts.map +1 -0
- package/node_modules/@noble/hashes/blake2.js +420 -0
- package/node_modules/@noble/hashes/blake2.js.map +1 -0
- package/node_modules/@noble/hashes/blake2b.d.ts +11 -0
- package/node_modules/@noble/hashes/blake2b.d.ts.map +1 -0
- package/node_modules/@noble/hashes/blake2b.js +14 -0
- package/node_modules/@noble/hashes/blake2b.js.map +1 -0
- package/node_modules/@noble/hashes/blake2s.d.ts +20 -0
- package/node_modules/@noble/hashes/blake2s.d.ts.map +1 -0
- package/node_modules/@noble/hashes/blake2s.js +24 -0
- package/node_modules/@noble/hashes/blake2s.js.map +1 -0
- package/node_modules/@noble/hashes/blake3.d.ts +54 -0
- package/node_modules/@noble/hashes/blake3.d.ts.map +1 -0
- package/node_modules/@noble/hashes/blake3.js +255 -0
- package/node_modules/@noble/hashes/blake3.js.map +1 -0
- package/node_modules/@noble/hashes/crypto.d.ts +2 -0
- package/node_modules/@noble/hashes/crypto.d.ts.map +1 -0
- package/node_modules/@noble/hashes/crypto.js +5 -0
- package/node_modules/@noble/hashes/crypto.js.map +1 -0
- package/node_modules/@noble/hashes/cryptoNode.d.ts +2 -0
- package/node_modules/@noble/hashes/cryptoNode.d.ts.map +1 -0
- package/node_modules/@noble/hashes/cryptoNode.js +18 -0
- package/node_modules/@noble/hashes/cryptoNode.js.map +1 -0
- package/node_modules/@noble/hashes/eskdf.d.ts +47 -0
- package/node_modules/@noble/hashes/eskdf.d.ts.map +1 -0
- package/node_modules/@noble/hashes/eskdf.js +166 -0
- package/node_modules/@noble/hashes/eskdf.js.map +1 -0
- package/node_modules/@noble/hashes/esm/_assert.d.ts +17 -0
- package/node_modules/@noble/hashes/esm/_assert.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/_assert.js +15 -0
- package/node_modules/@noble/hashes/esm/_assert.js.map +1 -0
- package/node_modules/@noble/hashes/esm/_blake.d.ts +14 -0
- package/node_modules/@noble/hashes/esm/_blake.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/_blake.js +45 -0
- package/node_modules/@noble/hashes/esm/_blake.js.map +1 -0
- package/node_modules/@noble/hashes/esm/_md.d.ts +51 -0
- package/node_modules/@noble/hashes/esm/_md.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/_md.js +155 -0
- package/node_modules/@noble/hashes/esm/_md.js.map +1 -0
- package/node_modules/@noble/hashes/esm/_u64.d.ts +55 -0
- package/node_modules/@noble/hashes/esm/_u64.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/_u64.js +67 -0
- package/node_modules/@noble/hashes/esm/_u64.js.map +1 -0
- package/node_modules/@noble/hashes/esm/argon2.d.ts +32 -0
- package/node_modules/@noble/hashes/esm/argon2.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/argon2.js +392 -0
- package/node_modules/@noble/hashes/esm/argon2.js.map +1 -0
- package/node_modules/@noble/hashes/esm/blake1.d.ts +106 -0
- package/node_modules/@noble/hashes/esm/blake1.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/blake1.js +452 -0
- package/node_modules/@noble/hashes/esm/blake1.js.map +1 -0
- package/node_modules/@noble/hashes/esm/blake2.d.ts +116 -0
- package/node_modules/@noble/hashes/esm/blake2.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/blake2.js +413 -0
- package/node_modules/@noble/hashes/esm/blake2.js.map +1 -0
- package/node_modules/@noble/hashes/esm/blake2b.d.ts +11 -0
- package/node_modules/@noble/hashes/esm/blake2b.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/blake2b.js +11 -0
- package/node_modules/@noble/hashes/esm/blake2b.js.map +1 -0
- package/node_modules/@noble/hashes/esm/blake2s.d.ts +20 -0
- package/node_modules/@noble/hashes/esm/blake2s.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/blake2s.js +21 -0
- package/node_modules/@noble/hashes/esm/blake2s.js.map +1 -0
- package/node_modules/@noble/hashes/esm/blake3.d.ts +54 -0
- package/node_modules/@noble/hashes/esm/blake3.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/blake3.js +251 -0
- package/node_modules/@noble/hashes/esm/blake3.js.map +1 -0
- package/node_modules/@noble/hashes/esm/crypto.d.ts +2 -0
- package/node_modules/@noble/hashes/esm/crypto.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/crypto.js +2 -0
- package/node_modules/@noble/hashes/esm/crypto.js.map +1 -0
- package/node_modules/@noble/hashes/esm/cryptoNode.d.ts +2 -0
- package/node_modules/@noble/hashes/esm/cryptoNode.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/cryptoNode.js +15 -0
- package/node_modules/@noble/hashes/esm/cryptoNode.js.map +1 -0
- package/node_modules/@noble/hashes/esm/eskdf.d.ts +47 -0
- package/node_modules/@noble/hashes/esm/eskdf.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/eskdf.js +160 -0
- package/node_modules/@noble/hashes/esm/eskdf.js.map +1 -0
- package/node_modules/@noble/hashes/esm/hkdf.d.ts +36 -0
- package/node_modules/@noble/hashes/esm/hkdf.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/hkdf.js +82 -0
- package/node_modules/@noble/hashes/esm/hkdf.js.map +1 -0
- package/node_modules/@noble/hashes/esm/hmac.d.ts +35 -0
- package/node_modules/@noble/hashes/esm/hmac.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/hmac.js +86 -0
- package/node_modules/@noble/hashes/esm/hmac.js.map +1 -0
- package/node_modules/@noble/hashes/esm/index.d.ts +2 -0
- package/node_modules/@noble/hashes/esm/index.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/index.js +33 -0
- package/node_modules/@noble/hashes/esm/index.js.map +1 -0
- package/node_modules/@noble/hashes/esm/legacy.d.ts +71 -0
- package/node_modules/@noble/hashes/esm/legacy.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/legacy.js +281 -0
- package/node_modules/@noble/hashes/esm/legacy.js.map +1 -0
- package/node_modules/@noble/hashes/esm/package.json +10 -0
- package/node_modules/@noble/hashes/esm/pbkdf2.d.ts +23 -0
- package/node_modules/@noble/hashes/esm/pbkdf2.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/pbkdf2.js +97 -0
- package/node_modules/@noble/hashes/esm/pbkdf2.js.map +1 -0
- package/node_modules/@noble/hashes/esm/ripemd160.d.ts +13 -0
- package/node_modules/@noble/hashes/esm/ripemd160.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/ripemd160.js +13 -0
- package/node_modules/@noble/hashes/esm/ripemd160.js.map +1 -0
- package/node_modules/@noble/hashes/esm/scrypt.d.ts +34 -0
- package/node_modules/@noble/hashes/esm/scrypt.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/scrypt.js +228 -0
- package/node_modules/@noble/hashes/esm/scrypt.js.map +1 -0
- package/node_modules/@noble/hashes/esm/sha1.d.ts +11 -0
- package/node_modules/@noble/hashes/esm/sha1.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/sha1.js +11 -0
- package/node_modules/@noble/hashes/esm/sha1.js.map +1 -0
- package/node_modules/@noble/hashes/esm/sha2.d.ts +159 -0
- package/node_modules/@noble/hashes/esm/sha2.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/sha2.js +375 -0
- package/node_modules/@noble/hashes/esm/sha2.js.map +1 -0
- package/node_modules/@noble/hashes/esm/sha256.d.ts +20 -0
- package/node_modules/@noble/hashes/esm/sha256.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/sha256.js +20 -0
- package/node_modules/@noble/hashes/esm/sha256.js.map +1 -0
- package/node_modules/@noble/hashes/esm/sha3-addons.d.ts +142 -0
- package/node_modules/@noble/hashes/esm/sha3-addons.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/sha3-addons.js +393 -0
- package/node_modules/@noble/hashes/esm/sha3-addons.js.map +1 -0
- package/node_modules/@noble/hashes/esm/sha3.d.ts +53 -0
- package/node_modules/@noble/hashes/esm/sha3.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/sha3.js +234 -0
- package/node_modules/@noble/hashes/esm/sha3.js.map +1 -0
- package/node_modules/@noble/hashes/esm/sha512.d.ts +26 -0
- package/node_modules/@noble/hashes/esm/sha512.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/sha512.js +26 -0
- package/node_modules/@noble/hashes/esm/sha512.js.map +1 -0
- package/node_modules/@noble/hashes/esm/utils.d.ts +161 -0
- package/node_modules/@noble/hashes/esm/utils.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/utils.js +281 -0
- package/node_modules/@noble/hashes/esm/utils.js.map +1 -0
- package/node_modules/@noble/hashes/hkdf.d.ts +36 -0
- package/node_modules/@noble/hashes/hkdf.d.ts.map +1 -0
- package/node_modules/@noble/hashes/hkdf.js +88 -0
- package/node_modules/@noble/hashes/hkdf.js.map +1 -0
- package/node_modules/@noble/hashes/hmac.d.ts +35 -0
- package/node_modules/@noble/hashes/hmac.d.ts.map +1 -0
- package/node_modules/@noble/hashes/hmac.js +91 -0
- package/node_modules/@noble/hashes/hmac.js.map +1 -0
- package/node_modules/@noble/hashes/index.d.ts +1 -0
- package/node_modules/@noble/hashes/index.d.ts.map +1 -0
- package/node_modules/@noble/hashes/index.js +33 -0
- package/node_modules/@noble/hashes/index.js.map +1 -0
- package/node_modules/@noble/hashes/legacy.d.ts +71 -0
- package/node_modules/@noble/hashes/legacy.d.ts.map +1 -0
- package/node_modules/@noble/hashes/legacy.js +287 -0
- package/node_modules/@noble/hashes/legacy.js.map +1 -0
- package/node_modules/@noble/hashes/package.json +266 -0
- package/node_modules/@noble/hashes/pbkdf2.d.ts +23 -0
- package/node_modules/@noble/hashes/pbkdf2.d.ts.map +1 -0
- package/node_modules/@noble/hashes/pbkdf2.js +101 -0
- package/node_modules/@noble/hashes/pbkdf2.js.map +1 -0
- package/node_modules/@noble/hashes/ripemd160.d.ts +13 -0
- package/node_modules/@noble/hashes/ripemd160.d.ts.map +1 -0
- package/node_modules/@noble/hashes/ripemd160.js +16 -0
- package/node_modules/@noble/hashes/ripemd160.js.map +1 -0
- package/node_modules/@noble/hashes/scrypt.d.ts +34 -0
- package/node_modules/@noble/hashes/scrypt.d.ts.map +1 -0
- package/node_modules/@noble/hashes/scrypt.js +232 -0
- package/node_modules/@noble/hashes/scrypt.js.map +1 -0
- package/node_modules/@noble/hashes/sha1.d.ts +11 -0
- package/node_modules/@noble/hashes/sha1.d.ts.map +1 -0
- package/node_modules/@noble/hashes/sha1.js +14 -0
- package/node_modules/@noble/hashes/sha1.js.map +1 -0
- package/node_modules/@noble/hashes/sha2.d.ts +159 -0
- package/node_modules/@noble/hashes/sha2.d.ts.map +1 -0
- package/node_modules/@noble/hashes/sha2.js +384 -0
- package/node_modules/@noble/hashes/sha2.js.map +1 -0
- package/node_modules/@noble/hashes/sha256.d.ts +20 -0
- package/node_modules/@noble/hashes/sha256.d.ts.map +1 -0
- package/node_modules/@noble/hashes/sha256.js +23 -0
- package/node_modules/@noble/hashes/sha256.js.map +1 -0
- package/node_modules/@noble/hashes/sha3-addons.d.ts +142 -0
- package/node_modules/@noble/hashes/sha3-addons.d.ts.map +1 -0
- package/node_modules/@noble/hashes/sha3-addons.js +402 -0
- package/node_modules/@noble/hashes/sha3-addons.js.map +1 -0
- package/node_modules/@noble/hashes/sha3.d.ts +53 -0
- package/node_modules/@noble/hashes/sha3.d.ts.map +1 -0
- package/node_modules/@noble/hashes/sha3.js +239 -0
- package/node_modules/@noble/hashes/sha3.js.map +1 -0
- package/node_modules/@noble/hashes/sha512.d.ts +26 -0
- package/node_modules/@noble/hashes/sha512.d.ts.map +1 -0
- package/node_modules/@noble/hashes/sha512.js +29 -0
- package/node_modules/@noble/hashes/sha512.js.map +1 -0
- package/node_modules/@noble/hashes/src/_assert.ts +22 -0
- package/node_modules/@noble/hashes/src/_blake.ts +50 -0
- package/node_modules/@noble/hashes/src/_md.ts +176 -0
- package/node_modules/@noble/hashes/src/_u64.ts +91 -0
- package/node_modules/@noble/hashes/src/argon2.ts +497 -0
- package/node_modules/@noble/hashes/src/blake1.ts +534 -0
- package/node_modules/@noble/hashes/src/blake2.ts +486 -0
- package/node_modules/@noble/hashes/src/blake2b.ts +10 -0
- package/node_modules/@noble/hashes/src/blake2s.ts +20 -0
- package/node_modules/@noble/hashes/src/blake3.ts +272 -0
- package/node_modules/@noble/hashes/src/crypto.ts +9 -0
- package/node_modules/@noble/hashes/src/cryptoNode.ts +15 -0
- package/node_modules/@noble/hashes/src/eskdf.ts +187 -0
- package/node_modules/@noble/hashes/src/hkdf.ts +88 -0
- package/node_modules/@noble/hashes/src/hmac.ts +94 -0
- package/node_modules/@noble/hashes/src/index.ts +31 -0
- package/node_modules/@noble/hashes/src/legacy.ts +293 -0
- package/node_modules/@noble/hashes/src/pbkdf2.ts +122 -0
- package/node_modules/@noble/hashes/src/ripemd160.ts +12 -0
- package/node_modules/@noble/hashes/src/scrypt.ts +257 -0
- package/node_modules/@noble/hashes/src/sha1.ts +10 -0
- package/node_modules/@noble/hashes/src/sha2.ts +402 -0
- package/node_modules/@noble/hashes/src/sha256.ts +24 -0
- package/node_modules/@noble/hashes/src/sha3-addons.ts +499 -0
- package/node_modules/@noble/hashes/src/sha3.ts +258 -0
- package/node_modules/@noble/hashes/src/sha512.ts +34 -0
- package/node_modules/@noble/hashes/src/utils.ts +395 -0
- package/node_modules/@noble/hashes/utils.d.ts +161 -0
- package/node_modules/@noble/hashes/utils.d.ts.map +1 -0
- package/node_modules/@noble/hashes/utils.js +313 -0
- package/node_modules/@noble/hashes/utils.js.map +1 -0
- package/package.json +203 -0
- package/schemas/catalog.schema.json +283 -0
- package/src/align.ts +235 -0
- package/src/audio-init-parser.ts +189 -0
- package/src/audio-ring-buffer.ts +120 -0
- package/src/authored-timing.ts +63 -0
- package/src/carp-catalog.ts +776 -0
- package/src/catalog-fec-params.ts +167 -0
- package/src/catalog-network-source.ts +49 -0
- package/src/catalog-validator.ts +34 -0
- package/src/cmaf-block-assembler.ts +1058 -0
- package/src/cmaf-group-batcher.ts +104 -0
- package/src/cmcd-producer.ts +329 -0
- package/src/codec-utils.ts +1539 -0
- package/src/fec-codec.ts +61 -0
- package/src/fec-manager.ts +1939 -0
- package/src/fec-starvation-detector.ts +128 -0
- package/src/fec-worker-setup.ts +177 -0
- package/src/fmp4-completion.ts +47 -0
- package/src/fmp4-reader.ts +112 -0
- package/src/index.ts +443 -0
- package/src/iso-bmff-timing.ts +688 -0
- package/src/loc.ts +181 -0
- package/src/manifest-auth-plan.ts +107 -0
- package/src/media-router.ts +1185 -0
- package/src/mfu-reassembler.ts +2842 -0
- package/src/mfu-reassembly-policy.ts +134 -0
- package/src/mmtp-container-parser.ts +1498 -0
- package/src/mmtp-decode-pipeline.ts +315 -0
- package/src/mmtp-router.ts +3027 -0
- package/src/mmtp-to-cmaf.ts +956 -0
- package/src/multicast-auth-catalog.ts +340 -0
- package/src/multicast-input.ts +439 -0
- package/src/multicast-manager.ts +1503 -0
- package/src/multicast-transport.ts +320 -0
- package/src/multicast-unwrap.ts +132 -0
- package/src/no-modules.ts +20 -0
- package/src/phase14-catalog-override.ts +336 -0
- package/src/repair-fetch.ts +217 -0
- package/src/sample-combiner.ts +846 -0
- package/src/signaling.ts +78 -0
- package/src/source-auth.ts +1 -0
- package/src/switching-set-alignment.ts +109 -0
- package/src/timestamp-codec.ts +265 -0
- package/src/track-pipeline-setup.ts +189 -0
- package/src/track-pipeline.ts +332 -0
- package/src/track-session.ts +778 -0
- package/src/transport-pool.ts +128 -0
- package/src/wasm-mfu-reassembler.ts +372 -0
- package/src/wasm-mmtp-container-parser.ts +23 -0
- package/test-vectors/align.json +199 -0
- package/test-vectors/catalog/README.md +25 -0
- package/test-vectors/catalog/negative/legacy-selection-params.json +15 -0
- package/test-vectors/catalog/negative/missing-mmtp-fields.json +12 -0
- package/test-vectors/catalog/negative/multicast-auth-padded-key.json +37 -0
- package/test-vectors/catalog/negative/multicast-auth-reused-track-format.json +53 -0
- package/test-vectors/catalog/negative/multicast-auth-trailing-pad-bits.json +37 -0
- package/test-vectors/catalog/negative/multicast-endpoint-missing-protocol-and-source.json +24 -0
- package/test-vectors/catalog/negative/network-source-object.json +25 -0
- package/test-vectors/catalog/negative/raptorq-unaligned-symbol.json +26 -0
- package/test-vectors/catalog/negative/repair-track-legacy-shape.json +18 -0
- package/test-vectors/catalog/negative/track-role-empty.json +16 -0
- package/test-vectors/catalog/negative/track-role-non-string.json +16 -0
- package/test-vectors/catalog/positive/fec-multicast.json +51 -0
- package/test-vectors/catalog/positive/flat-av.json +30 -0
- package/test-vectors/catalog/positive/multicast-auth-rotation.json +55 -0
- package/test-vectors/catalog/positive/ticks-and-mixed-timescales.json +39 -0
- package/test-vectors/catalog/positive/track-role.json +49 -0
- package/test-vectors/catalog/releases/moqcast-native-v16-v1/catalog.json +65 -0
- package/test-vectors/catalog/releases/moqcast-native-v16-v1.archive.sha256 +1 -0
- package/test-vectors/catalog-multicast-auth-v1.json +26 -0
- package/test-vectors/catalog-validation.json +148 -0
- package/test-vectors/catalog-validator-public-api.mjs +25 -0
- package/test-vectors/generate-source-auth-fixture.mjs +114 -0
- package/test-vectors/source-auth-v1.json +61 -0
- package/test-vectors/subsample-placement-v1.json +230 -0
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RFC 6330 Object Transmission Information (OTI) utilities.
|
|
3
|
+
*
|
|
4
|
+
* Shared OTI encoding/decoding for both moq-lib and moqtail players.
|
|
5
|
+
* Eliminates duplicated OTI byte manipulation across codebases.
|
|
6
|
+
*/
|
|
7
|
+
export interface OTIParams {
|
|
8
|
+
/** Transfer length F (total source block size in bytes) */
|
|
9
|
+
transferLength: number;
|
|
10
|
+
/** Symbol size T (bytes per symbol) */
|
|
11
|
+
symbolSize: number;
|
|
12
|
+
/** Number of source blocks Z */
|
|
13
|
+
sourceBlocks: number;
|
|
14
|
+
/** Number of sub-blocks N */
|
|
15
|
+
subBlocks: number;
|
|
16
|
+
/** Symbol alignment Al */
|
|
17
|
+
alignment: number;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Build a 12-byte RFC 6330 Common + Scheme-Specific OTI from parameters.
|
|
21
|
+
*
|
|
22
|
+
* Wire format (per RFC 6330 §4.3.1 + §4.3.3):
|
|
23
|
+
* byte 0: F high byte (bit 32 — transfer length is 40-bit)
|
|
24
|
+
* bytes 1-4: F low 32 bits (big-endian)
|
|
25
|
+
* byte 5: reserved (0)
|
|
26
|
+
* bytes 6-7: T (symbol size, big-endian)
|
|
27
|
+
* byte 8: Z (source blocks)
|
|
28
|
+
* bytes 9-10: N (sub-blocks, big-endian)
|
|
29
|
+
* byte 11: Al (alignment)
|
|
30
|
+
*/
|
|
31
|
+
export declare function buildOTI(params: OTIParams): Uint8Array;
|
|
32
|
+
/**
|
|
33
|
+
* Build OTI from catalog FEC config (K and T).
|
|
34
|
+
* F = K × T (interleaved encoder convention from FFmpeg moqenc_mmt.c).
|
|
35
|
+
*/
|
|
36
|
+
export declare function buildOTIFromCatalog(K: number, T: number): Uint8Array;
|
|
37
|
+
/**
|
|
38
|
+
* Parse a 12-byte OTI into structured parameters.
|
|
39
|
+
*/
|
|
40
|
+
export declare function parseOTI(oti: Uint8Array): OTIParams & {
|
|
41
|
+
K: number;
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Resolve a catalog FEC block's interleave window in milliseconds.
|
|
45
|
+
*
|
|
46
|
+
* The catalog carries exactly ONE interleave field: `interleaveDepthMs`, the
|
|
47
|
+
* full FEC block span in MILLISECONDS (draft-ramadan-moq-fec §5.1). Receivers
|
|
48
|
+
* derive the block count D with `deriveFecInterleaveDepth`.
|
|
49
|
+
*
|
|
50
|
+
* Absent or non-positive → undefined; callers treat that as unconfigured and
|
|
51
|
+
* error rather than guess. The legacy `interleaveDepth` frame-count key and
|
|
52
|
+
* the `interleaveMs` alias were removed in the BLO-14526 clean cut — producers
|
|
53
|
+
* emit milliseconds only, and there is deliberately NO fallback read.
|
|
54
|
+
*/
|
|
55
|
+
export type FecInterleaveCatalog = {
|
|
56
|
+
interleaveDepthMs?: number;
|
|
57
|
+
};
|
|
58
|
+
export declare function catalogFecInterleaveMs(fec: FecInterleaveCatalog | undefined): number | undefined;
|
|
59
|
+
/**
|
|
60
|
+
* Derive the integer FEC interleave depth D from a catalog block span and the
|
|
61
|
+
* duration of one media unit.
|
|
62
|
+
*
|
|
63
|
+
* `interleaveDepthMs` is nearest-millisecond catalog signaling while media
|
|
64
|
+
* unit durations are commonly fractional. Invert that quantization with
|
|
65
|
+
* positive-value round-half-up semantics:
|
|
66
|
+
*
|
|
67
|
+
* D = max(1, floor(interleaveDepthMs / mediaUnitDurationMs + 0.5))
|
|
68
|
+
*
|
|
69
|
+
* `Math.ceil` is not equivalent: 4000 / 33.333 is slightly greater than 120,
|
|
70
|
+
* but represents D=120 rather than D=121.
|
|
71
|
+
*/
|
|
72
|
+
export declare function deriveFecInterleaveDepth(interleaveDepthMs: number, mediaUnitDurationMs: number): number;
|
|
73
|
+
/**
|
|
74
|
+
* Compute the full FEC block completion timeout from the interleave window.
|
|
75
|
+
*
|
|
76
|
+
* The catalog's `interleaveDepthMs` IS the full FEC block span in
|
|
77
|
+
* milliseconds (draft-ramadan-moq-fec §5.1): producers emit
|
|
78
|
+
* D × unit-duration, and every symbol of a block — source and repair —
|
|
79
|
+
* arrives within that span. The full-block timeout is therefore
|
|
80
|
+
* K-INDEPENDENT:
|
|
81
|
+
*
|
|
82
|
+
* timeout = interleaveDepthMs * safetyFactor
|
|
83
|
+
*
|
|
84
|
+
* The retired per-symbol-window model multiplied the interleave value by
|
|
85
|
+
* (K-1); under §5.1 semantics that overshoots ~(K-1)× (K=32 @ 133ms →
|
|
86
|
+
* ~12.4s instead of ~0.4s). A caller that genuinely needs a per-sub-block
|
|
87
|
+
* deadline scales the block span by K_sub / K instead — do NOT reintroduce
|
|
88
|
+
* (K-1) here.
|
|
89
|
+
*
|
|
90
|
+
* @param interleaveDepthMs - Full FEC block span in ms (catalog fec.interleaveDepthMs)
|
|
91
|
+
* @param safetyFactor - Jitter margin (default 3.0)
|
|
92
|
+
* @returns Timeout in milliseconds
|
|
93
|
+
*/
|
|
94
|
+
export declare function computeFecTimeout(interleaveDepthMs: number, safetyFactor?: number): number;
|
|
95
|
+
/**
|
|
96
|
+
* Absolute deadline for one FEC block.
|
|
97
|
+
*
|
|
98
|
+
* deadline = firstAcceptedAtMs + interleaveDepthMs + reorderToleranceMs
|
|
99
|
+
*
|
|
100
|
+
* Two properties matter, and both are contract, not preference:
|
|
101
|
+
*
|
|
102
|
+
* 1. The anchor is an ABSOLUTE receiver-local timestamp of the first accepted
|
|
103
|
+
* packet of the block -- not "now when we noticed", and not a duration a
|
|
104
|
+
* caller starts counting at an unspecified moment. A relative timeout
|
|
105
|
+
* cannot say WHEN a block was due, so it cannot yield playback latency and
|
|
106
|
+
* it cannot be compared across two consumers that started their timers at
|
|
107
|
+
* different instants.
|
|
108
|
+
*
|
|
109
|
+
* 2. The reorder/jitter allowance is ADDITIVE and SIGNALED, never a multiplier
|
|
110
|
+
* on the span. Jitter is a property of the network path; the FEC block span
|
|
111
|
+
* is a property of the encoder. Multiplying them couples two independent
|
|
112
|
+
* quantities: at a 133ms video span a x3 factor grants 266ms of slack, and
|
|
113
|
+
* at a 43ms audio span only 86ms -- for the same network. The tolerance
|
|
114
|
+
* therefore arrives as its own catalog value and is added once.
|
|
115
|
+
*
|
|
116
|
+
* Both arguments are required. There is no default tolerance: a missing value
|
|
117
|
+
* is an encoder/catalog bug and must surface at the boundary, not be papered
|
|
118
|
+
* over with a constant here.
|
|
119
|
+
*
|
|
120
|
+
* @param firstAcceptedAtMs - Receiver-local ms timestamp of the block's first accepted packet
|
|
121
|
+
* @param interleaveDepthMs - Full FEC block span in ms (catalog fec.interleaveDepthMs)
|
|
122
|
+
* @param reorderToleranceMs - Declared jitter/reorder allowance in ms (catalog fec.reorderToleranceMs)
|
|
123
|
+
* @returns Absolute receiver-local deadline in milliseconds
|
|
124
|
+
*/
|
|
125
|
+
export declare function fecBlockDeadlineMs(params: {
|
|
126
|
+
firstAcceptedAtMs: number;
|
|
127
|
+
interleaveDepthMs: number;
|
|
128
|
+
reorderToleranceMs: number;
|
|
129
|
+
}): number;
|
|
130
|
+
/**
|
|
131
|
+
* Relative budget for one FEC block: span + declared tolerance.
|
|
132
|
+
*
|
|
133
|
+
* Only for consumers whose interface genuinely takes a duration (the WASM
|
|
134
|
+
* reassembler's `timeoutMs`). Anything that can hold a timestamp should use
|
|
135
|
+
* `fecBlockDeadlineMs` instead, so the anchor stays explicit and latency stays
|
|
136
|
+
* extractable. This is deliberately NOT `span * factor` -- see the note on
|
|
137
|
+
* `fecBlockDeadlineMs` for why the tolerance is additive.
|
|
138
|
+
*/
|
|
139
|
+
export declare function fecBlockBudgetMs(interleaveDepthMs: number, reorderToleranceMs: number): number;
|
|
140
|
+
/**
|
|
141
|
+
* Playback latency for a block, from the same anchor the deadline uses.
|
|
142
|
+
*
|
|
143
|
+
* latency = presentedAtMs - firstAcceptedAtMs
|
|
144
|
+
*
|
|
145
|
+
* Both timestamps are receiver-local, so this needs NO publisher/receiver
|
|
146
|
+
* clock agreement. That is the point of anchoring the deadline absolutely:
|
|
147
|
+
* publisher-stamped media time and receiver BCTM disagree by roughly the
|
|
148
|
+
* quantity we are trying to measure, which makes any cross-host subtraction
|
|
149
|
+
* unusable at a 33ms target. This subtraction is immune to that skew.
|
|
150
|
+
*
|
|
151
|
+
* It measures first-accepted-packet to presentation. It is NOT glass-to-glass
|
|
152
|
+
* and must not be reported as such -- capture and encode sit outside both
|
|
153
|
+
* timestamps.
|
|
154
|
+
*/
|
|
155
|
+
export declare function playbackLatencyMs(params: {
|
|
156
|
+
presentedAtMs: number;
|
|
157
|
+
firstAcceptedAtMs: number;
|
|
158
|
+
}): number;
|
|
159
|
+
/**
|
|
160
|
+
* Extract FEC parameters from an MMTP repair packet.
|
|
161
|
+
*
|
|
162
|
+
* Per ISO/IEC 23008-1 Section C.5.3, the 13-byte Repair FEC Payload ID
|
|
163
|
+
* follows the complete MMTP header, including optional C/X fields.
|
|
164
|
+
*
|
|
165
|
+
* Returns raw fields — caller passes directly to WASM add_repair(ss_start, ssb_length, rs_id, data).
|
|
166
|
+
* No SBN/ESI derivation — the WASM decoder handles block assignment.
|
|
167
|
+
*/
|
|
168
|
+
export declare function parseRepairPacket(packet: Uint8Array): {
|
|
169
|
+
ssStart: number;
|
|
170
|
+
ssbLength: number;
|
|
171
|
+
rsId: number;
|
|
172
|
+
repairData: Uint8Array;
|
|
173
|
+
} | null;
|
|
174
|
+
//# sourceMappingURL=oti.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oti.d.ts","sourceRoot":"","sources":["../src/oti.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,WAAW,SAAS;IACzB,2DAA2D;IAC3D,cAAc,EAAE,MAAM,CAAC;IACvB,uCAAuC;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,gCAAgC;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,6BAA6B;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,0BAA0B;IAC1B,SAAS,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,UAAU,CAwBtD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,UAAU,CAWpE;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,UAAU,GAAG,SAAS,GAAG;IAAE,CAAC,EAAE,MAAM,CAAA;CAAE,CAYnE;AAwBD;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,oBAAoB,GAAG;IAClC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,wBAAgB,sBAAsB,CACrC,GAAG,EAAE,oBAAoB,GAAG,SAAS,GACnC,MAAM,GAAG,SAAS,CAGpB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,wBAAwB,CACvC,iBAAiB,EAAE,MAAM,EACzB,mBAAmB,EAAE,MAAM,GACzB,MAAM,CAQR;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,iBAAiB,CAChC,iBAAiB,EAAE,MAAM,EACzB,YAAY,GAAE,MAAY,GACxB,MAAM,CAOR;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE;IAC1C,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kBAAkB,EAAE,MAAM,CAAC;CAC3B,GAAG,MAAM,CAMT;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,iBAAiB,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,GAAG,MAAM,CAkB9F;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAYtG;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,UAAU,GAAG;IACtD,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,UAAU,CAAC;CACzE,GAAG,IAAI,CASP"}
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RFC 6330 Object Transmission Information (OTI) utilities.
|
|
3
|
+
*
|
|
4
|
+
* Shared OTI encoding/decoding for both moq-lib and moqtail players.
|
|
5
|
+
* Eliminates duplicated OTI byte manipulation across codebases.
|
|
6
|
+
*/
|
|
7
|
+
import { parseMoqRepairFrame } from "@blockcast/mmt-base";
|
|
8
|
+
/**
|
|
9
|
+
* Build a 12-byte RFC 6330 Common + Scheme-Specific OTI from parameters.
|
|
10
|
+
*
|
|
11
|
+
* Wire format (per RFC 6330 §4.3.1 + §4.3.3):
|
|
12
|
+
* byte 0: F high byte (bit 32 — transfer length is 40-bit)
|
|
13
|
+
* bytes 1-4: F low 32 bits (big-endian)
|
|
14
|
+
* byte 5: reserved (0)
|
|
15
|
+
* bytes 6-7: T (symbol size, big-endian)
|
|
16
|
+
* byte 8: Z (source blocks)
|
|
17
|
+
* bytes 9-10: N (sub-blocks, big-endian)
|
|
18
|
+
* byte 11: Al (alignment)
|
|
19
|
+
*/
|
|
20
|
+
export function buildOTI(params) {
|
|
21
|
+
const { transferLength: F, symbolSize: T, sourceBlocks: Z, subBlocks: N, alignment: Al, } = params;
|
|
22
|
+
validateOTIFields(F, T, Z, N, Al);
|
|
23
|
+
const oti = new Uint8Array(12);
|
|
24
|
+
// F: 40-bit big-endian (byte 0 = high, bytes 1-4 = low 32)
|
|
25
|
+
oti[0] = (F / 0x100000000) & 0xFF;
|
|
26
|
+
oti[1] = (F >>> 24) & 0xFF;
|
|
27
|
+
oti[2] = (F >>> 16) & 0xFF;
|
|
28
|
+
oti[3] = (F >>> 8) & 0xFF;
|
|
29
|
+
oti[4] = F & 0xFF;
|
|
30
|
+
// byte 5: reserved
|
|
31
|
+
oti[6] = (T >>> 8) & 0xFF;
|
|
32
|
+
oti[7] = T & 0xFF;
|
|
33
|
+
oti[8] = Z & 0xFF;
|
|
34
|
+
oti[9] = (N >>> 8) & 0xFF;
|
|
35
|
+
oti[10] = N & 0xFF;
|
|
36
|
+
oti[11] = Al & 0xFF;
|
|
37
|
+
return oti;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Build OTI from catalog FEC config (K and T).
|
|
41
|
+
* F = K × T (interleaved encoder convention from FFmpeg moqenc_mmt.c).
|
|
42
|
+
*/
|
|
43
|
+
export function buildOTIFromCatalog(K, T) {
|
|
44
|
+
if (!Number.isInteger(K) || K <= 0 || K > 56_403) {
|
|
45
|
+
throw new Error(`K must be an integer in 1..56403 (got ${K})`);
|
|
46
|
+
}
|
|
47
|
+
return buildOTI({
|
|
48
|
+
transferLength: K * T,
|
|
49
|
+
symbolSize: T,
|
|
50
|
+
sourceBlocks: 1,
|
|
51
|
+
subBlocks: 1,
|
|
52
|
+
alignment: 8,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Parse a 12-byte OTI into structured parameters.
|
|
57
|
+
*/
|
|
58
|
+
export function parseOTI(oti) {
|
|
59
|
+
if (oti.length !== 12)
|
|
60
|
+
throw new Error(`OTI must be exactly 12 bytes (got ${oti.length})`);
|
|
61
|
+
if (oti[5] !== 0)
|
|
62
|
+
throw new Error(`OTI reserved byte 5 must be zero (got ${oti[5]})`);
|
|
63
|
+
const F = ((oti[0] & 0xFF) * 0x100000000) +
|
|
64
|
+
(((oti[1] << 24) | (oti[2] << 16) | (oti[3] << 8) | oti[4]) >>> 0);
|
|
65
|
+
const T = (oti[6] << 8) | oti[7];
|
|
66
|
+
const Z = oti[8];
|
|
67
|
+
const N = (oti[9] << 8) | oti[10];
|
|
68
|
+
const Al = oti[11];
|
|
69
|
+
validateOTIFields(F, T, Z, N, Al);
|
|
70
|
+
const K = Math.ceil(Math.ceil(F / T) / Z);
|
|
71
|
+
return { transferLength: F, symbolSize: T, sourceBlocks: Z, subBlocks: N, alignment: Al, K };
|
|
72
|
+
}
|
|
73
|
+
function validateOTIFields(F, T, Z, N, Al) {
|
|
74
|
+
if (!Number.isSafeInteger(F) || F <= 0 || F > 0xffffffffff) {
|
|
75
|
+
throw new Error(`F must be a positive 40-bit integer (got ${F})`);
|
|
76
|
+
}
|
|
77
|
+
if (!Number.isInteger(T) || T <= 0 || T > 0xffff) {
|
|
78
|
+
throw new Error(`T must be an integer in 1..65535 (got ${T})`);
|
|
79
|
+
}
|
|
80
|
+
if (!Number.isInteger(Z) || Z <= 0 || Z > 0xff) {
|
|
81
|
+
throw new Error(`Z must be an integer in 1..255 (got ${Z})`);
|
|
82
|
+
}
|
|
83
|
+
if (!Number.isInteger(N) || N <= 0 || N > 0xffff) {
|
|
84
|
+
throw new Error(`N must be an integer in 1..65535 (got ${N})`);
|
|
85
|
+
}
|
|
86
|
+
if (!Number.isInteger(Al) || Al <= 0 || Al > 0xff || T % Al !== 0) {
|
|
87
|
+
throw new Error(`Al must be an integer in 1..255 that divides T (got Al=${Al}, T=${T})`);
|
|
88
|
+
}
|
|
89
|
+
const K = Math.ceil(Math.ceil(F / T) / Z);
|
|
90
|
+
if (K > 56_403) {
|
|
91
|
+
throw new Error(`OTI requires K=${K}, above the RFC 6330 systematic limit 56403`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
export function catalogFecInterleaveMs(fec) {
|
|
95
|
+
const ms = fec?.interleaveDepthMs;
|
|
96
|
+
return typeof ms === "number" && ms > 0 ? ms : undefined;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Derive the integer FEC interleave depth D from a catalog block span and the
|
|
100
|
+
* duration of one media unit.
|
|
101
|
+
*
|
|
102
|
+
* `interleaveDepthMs` is nearest-millisecond catalog signaling while media
|
|
103
|
+
* unit durations are commonly fractional. Invert that quantization with
|
|
104
|
+
* positive-value round-half-up semantics:
|
|
105
|
+
*
|
|
106
|
+
* D = max(1, floor(interleaveDepthMs / mediaUnitDurationMs + 0.5))
|
|
107
|
+
*
|
|
108
|
+
* `Math.ceil` is not equivalent: 4000 / 33.333 is slightly greater than 120,
|
|
109
|
+
* but represents D=120 rather than D=121.
|
|
110
|
+
*/
|
|
111
|
+
export function deriveFecInterleaveDepth(interleaveDepthMs, mediaUnitDurationMs) {
|
|
112
|
+
if (!Number.isFinite(interleaveDepthMs) || interleaveDepthMs <= 0) {
|
|
113
|
+
throw new Error(`[FEC] interleaveDepthMs must be finite and > 0 (got ${interleaveDepthMs})`);
|
|
114
|
+
}
|
|
115
|
+
if (!Number.isFinite(mediaUnitDurationMs) || mediaUnitDurationMs <= 0) {
|
|
116
|
+
throw new Error(`[FEC] mediaUnitDurationMs must be finite and > 0 (got ${mediaUnitDurationMs})`);
|
|
117
|
+
}
|
|
118
|
+
return Math.max(1, Math.floor(interleaveDepthMs / mediaUnitDurationMs + 0.5));
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Compute the full FEC block completion timeout from the interleave window.
|
|
122
|
+
*
|
|
123
|
+
* The catalog's `interleaveDepthMs` IS the full FEC block span in
|
|
124
|
+
* milliseconds (draft-ramadan-moq-fec §5.1): producers emit
|
|
125
|
+
* D × unit-duration, and every symbol of a block — source and repair —
|
|
126
|
+
* arrives within that span. The full-block timeout is therefore
|
|
127
|
+
* K-INDEPENDENT:
|
|
128
|
+
*
|
|
129
|
+
* timeout = interleaveDepthMs * safetyFactor
|
|
130
|
+
*
|
|
131
|
+
* The retired per-symbol-window model multiplied the interleave value by
|
|
132
|
+
* (K-1); under §5.1 semantics that overshoots ~(K-1)× (K=32 @ 133ms →
|
|
133
|
+
* ~12.4s instead of ~0.4s). A caller that genuinely needs a per-sub-block
|
|
134
|
+
* deadline scales the block span by K_sub / K instead — do NOT reintroduce
|
|
135
|
+
* (K-1) here.
|
|
136
|
+
*
|
|
137
|
+
* @param interleaveDepthMs - Full FEC block span in ms (catalog fec.interleaveDepthMs)
|
|
138
|
+
* @param safetyFactor - Jitter margin (default 3.0)
|
|
139
|
+
* @returns Timeout in milliseconds
|
|
140
|
+
*/
|
|
141
|
+
export function computeFecTimeout(interleaveDepthMs, safetyFactor = 3.0) {
|
|
142
|
+
if (interleaveDepthMs <= 0) {
|
|
143
|
+
throw new Error(`[FEC] interleaveDepthMs must be > 0 (got ${interleaveDepthMs}ms). Fix encoder config.`);
|
|
144
|
+
}
|
|
145
|
+
// interleaveDepthMs IS the block span. K=4, D=4 at 30fps:
|
|
146
|
+
// interleaveDepthMs = 133ms → timeout = ceil(133 * 3) = 399ms.
|
|
147
|
+
return Math.ceil(interleaveDepthMs * safetyFactor);
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Absolute deadline for one FEC block.
|
|
151
|
+
*
|
|
152
|
+
* deadline = firstAcceptedAtMs + interleaveDepthMs + reorderToleranceMs
|
|
153
|
+
*
|
|
154
|
+
* Two properties matter, and both are contract, not preference:
|
|
155
|
+
*
|
|
156
|
+
* 1. The anchor is an ABSOLUTE receiver-local timestamp of the first accepted
|
|
157
|
+
* packet of the block -- not "now when we noticed", and not a duration a
|
|
158
|
+
* caller starts counting at an unspecified moment. A relative timeout
|
|
159
|
+
* cannot say WHEN a block was due, so it cannot yield playback latency and
|
|
160
|
+
* it cannot be compared across two consumers that started their timers at
|
|
161
|
+
* different instants.
|
|
162
|
+
*
|
|
163
|
+
* 2. The reorder/jitter allowance is ADDITIVE and SIGNALED, never a multiplier
|
|
164
|
+
* on the span. Jitter is a property of the network path; the FEC block span
|
|
165
|
+
* is a property of the encoder. Multiplying them couples two independent
|
|
166
|
+
* quantities: at a 133ms video span a x3 factor grants 266ms of slack, and
|
|
167
|
+
* at a 43ms audio span only 86ms -- for the same network. The tolerance
|
|
168
|
+
* therefore arrives as its own catalog value and is added once.
|
|
169
|
+
*
|
|
170
|
+
* Both arguments are required. There is no default tolerance: a missing value
|
|
171
|
+
* is an encoder/catalog bug and must surface at the boundary, not be papered
|
|
172
|
+
* over with a constant here.
|
|
173
|
+
*
|
|
174
|
+
* @param firstAcceptedAtMs - Receiver-local ms timestamp of the block's first accepted packet
|
|
175
|
+
* @param interleaveDepthMs - Full FEC block span in ms (catalog fec.interleaveDepthMs)
|
|
176
|
+
* @param reorderToleranceMs - Declared jitter/reorder allowance in ms (catalog fec.reorderToleranceMs)
|
|
177
|
+
* @returns Absolute receiver-local deadline in milliseconds
|
|
178
|
+
*/
|
|
179
|
+
export function fecBlockDeadlineMs(params) {
|
|
180
|
+
const { firstAcceptedAtMs, interleaveDepthMs, reorderToleranceMs } = params;
|
|
181
|
+
if (!Number.isFinite(firstAcceptedAtMs)) {
|
|
182
|
+
throw new Error(`[FEC] firstAcceptedAtMs must be finite (got ${firstAcceptedAtMs}).`);
|
|
183
|
+
}
|
|
184
|
+
return firstAcceptedAtMs + fecBlockBudgetMs(interleaveDepthMs, reorderToleranceMs);
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Relative budget for one FEC block: span + declared tolerance.
|
|
188
|
+
*
|
|
189
|
+
* Only for consumers whose interface genuinely takes a duration (the WASM
|
|
190
|
+
* reassembler's `timeoutMs`). Anything that can hold a timestamp should use
|
|
191
|
+
* `fecBlockDeadlineMs` instead, so the anchor stays explicit and latency stays
|
|
192
|
+
* extractable. This is deliberately NOT `span * factor` -- see the note on
|
|
193
|
+
* `fecBlockDeadlineMs` for why the tolerance is additive.
|
|
194
|
+
*/
|
|
195
|
+
export function fecBlockBudgetMs(interleaveDepthMs, reorderToleranceMs) {
|
|
196
|
+
// Finite, not merely > 0: Infinity satisfies `> 0` and would yield an
|
|
197
|
+
// infinite budget, which fecBlockDeadlineMs then turns into a deadline no
|
|
198
|
+
// block can ever miss -- the eviction bound silently stops bounding. The
|
|
199
|
+
// tolerance check below already required finiteness; this is the same bar
|
|
200
|
+
// for the encoder's span.
|
|
201
|
+
if (!Number.isFinite(interleaveDepthMs) || !(interleaveDepthMs > 0)) {
|
|
202
|
+
throw new Error(`[FEC] interleaveDepthMs must be a finite value > 0 (got ${interleaveDepthMs}ms). Fix encoder config.`);
|
|
203
|
+
}
|
|
204
|
+
if (!(reorderToleranceMs >= 0) || !Number.isFinite(reorderToleranceMs)) {
|
|
205
|
+
throw new Error(`[FEC] reorderToleranceMs must be a finite value >= 0 (got ${reorderToleranceMs}ms). ` +
|
|
206
|
+
`It is a catalog value (fec.reorderToleranceMs), not a local default.`);
|
|
207
|
+
}
|
|
208
|
+
return Math.ceil(interleaveDepthMs + reorderToleranceMs);
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Playback latency for a block, from the same anchor the deadline uses.
|
|
212
|
+
*
|
|
213
|
+
* latency = presentedAtMs - firstAcceptedAtMs
|
|
214
|
+
*
|
|
215
|
+
* Both timestamps are receiver-local, so this needs NO publisher/receiver
|
|
216
|
+
* clock agreement. That is the point of anchoring the deadline absolutely:
|
|
217
|
+
* publisher-stamped media time and receiver BCTM disagree by roughly the
|
|
218
|
+
* quantity we are trying to measure, which makes any cross-host subtraction
|
|
219
|
+
* unusable at a 33ms target. This subtraction is immune to that skew.
|
|
220
|
+
*
|
|
221
|
+
* It measures first-accepted-packet to presentation. It is NOT glass-to-glass
|
|
222
|
+
* and must not be reported as such -- capture and encode sit outside both
|
|
223
|
+
* timestamps.
|
|
224
|
+
*/
|
|
225
|
+
export function playbackLatencyMs(params) {
|
|
226
|
+
const { presentedAtMs, firstAcceptedAtMs } = params;
|
|
227
|
+
if (!Number.isFinite(presentedAtMs) || !Number.isFinite(firstAcceptedAtMs)) {
|
|
228
|
+
throw new Error(`[FEC] playback latency needs two finite timestamps (got ${presentedAtMs}, ${firstAcceptedAtMs}).`);
|
|
229
|
+
}
|
|
230
|
+
if (presentedAtMs < firstAcceptedAtMs) {
|
|
231
|
+
throw new Error(`[FEC] presentedAtMs ${presentedAtMs} precedes firstAcceptedAtMs ${firstAcceptedAtMs}; ` +
|
|
232
|
+
`the two timestamps must come from one receiver-local clock.`);
|
|
233
|
+
}
|
|
234
|
+
return presentedAtMs - firstAcceptedAtMs;
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Extract FEC parameters from an MMTP repair packet.
|
|
238
|
+
*
|
|
239
|
+
* Per ISO/IEC 23008-1 Section C.5.3, the 13-byte Repair FEC Payload ID
|
|
240
|
+
* follows the complete MMTP header, including optional C/X fields.
|
|
241
|
+
*
|
|
242
|
+
* Returns raw fields — caller passes directly to WASM add_repair(ss_start, ssb_length, rs_id, data).
|
|
243
|
+
* No SBN/ESI derivation — the WASM decoder handles block assignment.
|
|
244
|
+
*/
|
|
245
|
+
export function parseRepairPacket(packet) {
|
|
246
|
+
const parsed = parseMoqRepairFrame(packet);
|
|
247
|
+
if (!parsed)
|
|
248
|
+
return null;
|
|
249
|
+
return {
|
|
250
|
+
ssStart: parsed.ssStart,
|
|
251
|
+
ssbLength: parsed.ssbLength,
|
|
252
|
+
rsId: parsed.rsId,
|
|
253
|
+
repairData: parsed.symbolData,
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
//# sourceMappingURL=oti.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oti.js","sourceRoot":"","sources":["../src/oti.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAe1D;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACzC,MAAM,EACL,cAAc,EAAE,CAAC,EACjB,UAAU,EAAE,CAAC,EACb,YAAY,EAAE,CAAC,EACf,SAAS,EAAE,CAAC,EACZ,SAAS,EAAE,EAAE,GACb,GAAG,MAAM,CAAC;IACX,iBAAiB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IAClC,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;IAC/B,2DAA2D;IAC3D,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,GAAG,IAAI,CAAC;IAClC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;IAC3B,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;IAC3B,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC;IAC1B,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;IAClB,mBAAmB;IACnB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC;IAC1B,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;IAClB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;IAClB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC;IAC1B,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;IACnB,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;IACpB,OAAO,GAAG,CAAC;AACZ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,CAAS,EAAE,CAAS;IACvD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,GAAG,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,QAAQ,CAAC;QACf,cAAc,EAAE,CAAC,GAAG,CAAC;QACrB,UAAU,EAAE,CAAC;QACb,YAAY,EAAE,CAAC;QACf,SAAS,EAAE,CAAC;QACZ,SAAS,EAAE,CAAC;KACZ,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,GAAe;IACvC,IAAI,GAAG,CAAC,MAAM,KAAK,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;IAC3F,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACtF,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,WAAW,CAAC;QACxC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IACpE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IACjC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IACjB,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC;IAClC,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC;IACnB,iBAAiB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IAClC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1C,OAAO,EAAE,cAAc,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;AAC9F,CAAC;AAED,SAAS,iBAAiB,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,EAAU;IAChF,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,YAAY,EAAE,CAAC;QAC5D,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,GAAG,CAAC,CAAC;IACnE,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,GAAG,CAAC,CAAC;IAChE,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,GAAG,CAAC,CAAC;IAC9D,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,GAAG,CAAC,CAAC;IAChE,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC;QACnE,MAAM,IAAI,KAAK,CAAC,0DAA0D,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IAC1F,CAAC;IACD,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1C,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,6CAA6C,CAAC,CAAC;IACnF,CAAC;AACF,CAAC;AAkBD,MAAM,UAAU,sBAAsB,CACrC,GAAqC;IAErC,MAAM,EAAE,GAAG,GAAG,EAAE,iBAAiB,CAAC;IAClC,OAAO,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AAC1D,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,wBAAwB,CACvC,iBAAyB,EACzB,mBAA2B;IAE3B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,IAAI,iBAAiB,IAAI,CAAC,EAAE,CAAC;QACnE,MAAM,IAAI,KAAK,CAAC,uDAAuD,iBAAiB,GAAG,CAAC,CAAC;IAC9F,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAC,IAAI,mBAAmB,IAAI,CAAC,EAAE,CAAC;QACvE,MAAM,IAAI,KAAK,CAAC,yDAAyD,mBAAmB,GAAG,CAAC,CAAC;IAClG,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,iBAAiB,GAAG,mBAAmB,GAAG,GAAG,CAAC,CAAC,CAAC;AAC/E,CAAC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,iBAAiB,CAChC,iBAAyB,EACzB,eAAuB,GAAG;IAE1B,IAAI,iBAAiB,IAAI,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,4CAA4C,iBAAiB,0BAA0B,CAAC,CAAC;IAC1G,CAAC;IACD,0DAA0D;IAC1D,+DAA+D;IAC/D,OAAO,IAAI,CAAC,IAAI,CAAC,iBAAiB,GAAG,YAAY,CAAC,CAAC;AACpD,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAIlC;IACA,MAAM,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,GAAG,MAAM,CAAC;IAC5E,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,+CAA+C,iBAAiB,IAAI,CAAC,CAAC;IACvF,CAAC;IACD,OAAO,iBAAiB,GAAG,gBAAgB,CAAC,iBAAiB,EAAE,kBAAkB,CAAC,CAAC;AACpF,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAAC,iBAAyB,EAAE,kBAA0B;IACrF,sEAAsE;IACtE,0EAA0E;IAC1E,yEAAyE;IACzE,0EAA0E;IAC1E,0BAA0B;IAC1B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,iBAAiB,GAAG,CAAC,CAAC,EAAE,CAAC;QACrE,MAAM,IAAI,KAAK,CACd,2DAA2D,iBAAiB,0BAA0B,CACtG,CAAC;IACH,CAAC;IACD,IAAI,CAAC,CAAC,kBAAkB,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;QACxE,MAAM,IAAI,KAAK,CACd,6DAA6D,kBAAkB,OAAO;YACrF,sEAAsE,CACvE,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,iBAAiB,GAAG,kBAAkB,CAAC,CAAC;AAC1D,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAA4D;IAC7F,MAAM,EAAE,aAAa,EAAE,iBAAiB,EAAE,GAAG,MAAM,CAAC;IACpD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAC5E,MAAM,IAAI,KAAK,CAAC,2DAA2D,aAAa,KAAK,iBAAiB,IAAI,CAAC,CAAC;IACrH,CAAC;IACD,IAAI,aAAa,GAAG,iBAAiB,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CACd,uBAAuB,aAAa,+BAA+B,iBAAiB,IAAI;YACvF,6DAA6D,CAC9D,CAAC;IACH,CAAC;IACD,OAAO,aAAa,GAAG,iBAAiB,CAAC;AAC1C,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAkB;IAGnD,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC3C,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,OAAO;QACN,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,UAAU,EAAE,MAAM,CAAC,UAAU;KAC7B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ReorderBuffer — container-agnostic frame reorder buffer for FEC-interleaved streams.
|
|
3
|
+
*
|
|
4
|
+
* FEC interleaving causes frames to complete out of decode order (e.g., frame N+3
|
|
5
|
+
* before N+1). H.264 P-frames reference the previous frame, so feeding out-of-order
|
|
6
|
+
* frames to VideoDecoder produces green artifacts from reference frame mismatch.
|
|
7
|
+
*
|
|
8
|
+
* This buffer accumulates frames and flushes them in sequence order.
|
|
9
|
+
* - In-order frames flush immediately (zero added latency for well-ordered streams).
|
|
10
|
+
* - Out-of-order frames buffer until the gap is filled or the buffer is full.
|
|
11
|
+
* - Keyframes flush all pending frames first (random access point).
|
|
12
|
+
* - Safety timeout force-flushes stalled buffers (missing frame that will never arrive).
|
|
13
|
+
*
|
|
14
|
+
* Used by WebCodecs decode path. NOT needed for MSE (browser handles ordering internally).
|
|
15
|
+
*/
|
|
16
|
+
export interface ReorderBufferConfig<T> {
|
|
17
|
+
/** Maximum frames to buffer before force-flushing oldest. */
|
|
18
|
+
maxSize: number;
|
|
19
|
+
/** Extract sequence number from a frame. */
|
|
20
|
+
getSequence: (frame: T) => number;
|
|
21
|
+
/** Check if a frame is a keyframe (flushes all pending). Optional. */
|
|
22
|
+
isKeyframe?: (frame: T) => boolean;
|
|
23
|
+
}
|
|
24
|
+
export declare class ReorderBuffer<T> {
|
|
25
|
+
#private;
|
|
26
|
+
constructor(config: ReorderBufferConfig<T>);
|
|
27
|
+
/**
|
|
28
|
+
* Push a frame into the buffer. Returns frames ready to decode (in sequence order).
|
|
29
|
+
* May return 0 frames (buffered), 1 frame (in-order), or multiple (gap filled / flush).
|
|
30
|
+
*/
|
|
31
|
+
push(frame: T): T[];
|
|
32
|
+
/**
|
|
33
|
+
* Flush all pending frames in sequence order. Call on keyframe or cleanup.
|
|
34
|
+
*/
|
|
35
|
+
flushAll(): T[];
|
|
36
|
+
/** Number of frames currently buffered (waiting for gap to fill). */
|
|
37
|
+
get pending(): number;
|
|
38
|
+
/** Reset buffer state. */
|
|
39
|
+
reset(): void;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=reorder-buffer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reorder-buffer.d.ts","sourceRoot":"","sources":["../src/reorder-buffer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,WAAW,mBAAmB,CAAC,CAAC;IACrC,6DAA6D;IAC7D,OAAO,EAAE,MAAM,CAAC;IAChB,4CAA4C;IAC5C,WAAW,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,CAAC;IAClC,sEAAsE;IACtE,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,CAAC;CACnC;AAED,qBAAa,aAAa,CAAC,CAAC;;gBAKf,MAAM,EAAE,mBAAmB,CAAC,CAAC,CAAC;IAI1C;;;OAGG;IACH,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE;IAwCnB;;OAEG;IACH,QAAQ,IAAI,CAAC,EAAE;IASf,qEAAqE;IACrE,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,0BAA0B;IAC1B,KAAK,IAAI,IAAI;CAIb"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ReorderBuffer — container-agnostic frame reorder buffer for FEC-interleaved streams.
|
|
3
|
+
*
|
|
4
|
+
* FEC interleaving causes frames to complete out of decode order (e.g., frame N+3
|
|
5
|
+
* before N+1). H.264 P-frames reference the previous frame, so feeding out-of-order
|
|
6
|
+
* frames to VideoDecoder produces green artifacts from reference frame mismatch.
|
|
7
|
+
*
|
|
8
|
+
* This buffer accumulates frames and flushes them in sequence order.
|
|
9
|
+
* - In-order frames flush immediately (zero added latency for well-ordered streams).
|
|
10
|
+
* - Out-of-order frames buffer until the gap is filled or the buffer is full.
|
|
11
|
+
* - Keyframes flush all pending frames first (random access point).
|
|
12
|
+
* - Safety timeout force-flushes stalled buffers (missing frame that will never arrive).
|
|
13
|
+
*
|
|
14
|
+
* Used by WebCodecs decode path. NOT needed for MSE (browser handles ordering internally).
|
|
15
|
+
*/
|
|
16
|
+
export class ReorderBuffer {
|
|
17
|
+
#config;
|
|
18
|
+
#buffer = [];
|
|
19
|
+
#lastFlushedSeq = -1;
|
|
20
|
+
constructor(config) {
|
|
21
|
+
this.#config = config;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Push a frame into the buffer. Returns frames ready to decode (in sequence order).
|
|
25
|
+
* May return 0 frames (buffered), 1 frame (in-order), or multiple (gap filled / flush).
|
|
26
|
+
*/
|
|
27
|
+
push(frame) {
|
|
28
|
+
const { getSequence, isKeyframe, maxSize } = this.#config;
|
|
29
|
+
// Keyframe: flush all pending in order, then emit keyframe
|
|
30
|
+
if (isKeyframe?.(frame)) {
|
|
31
|
+
const flushed = this.flushAll();
|
|
32
|
+
this.#lastFlushedSeq = getSequence(frame);
|
|
33
|
+
flushed.push(frame);
|
|
34
|
+
return flushed;
|
|
35
|
+
}
|
|
36
|
+
const seq = getSequence(frame);
|
|
37
|
+
// Drop truly stale frames (older than what we've already flushed)
|
|
38
|
+
if (seq > 0 && seq <= this.#lastFlushedSeq) {
|
|
39
|
+
return [];
|
|
40
|
+
}
|
|
41
|
+
// Insert into buffer (maintain sorted order)
|
|
42
|
+
this.#buffer.push(frame);
|
|
43
|
+
this.#buffer.sort((a, b) => getSequence(a) - getSequence(b));
|
|
44
|
+
// Flush in-order frames from front
|
|
45
|
+
const flushed = [];
|
|
46
|
+
while (this.#buffer.length > 0) {
|
|
47
|
+
const frontSeq = getSequence(this.#buffer[0]);
|
|
48
|
+
// Flush if: next expected seq, OR nothing flushed yet (bootstrap), OR buffer full
|
|
49
|
+
if (frontSeq <= this.#lastFlushedSeq + 1 || this.#lastFlushedSeq < 0 || this.#buffer.length >= maxSize) {
|
|
50
|
+
const f = this.#buffer.shift();
|
|
51
|
+
this.#lastFlushedSeq = getSequence(f);
|
|
52
|
+
flushed.push(f);
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
break; // gap — wait for missing frame
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return flushed;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Flush all pending frames in sequence order. Call on keyframe or cleanup.
|
|
62
|
+
*/
|
|
63
|
+
flushAll() {
|
|
64
|
+
this.#buffer.sort((a, b) => this.#config.getSequence(a) - this.#config.getSequence(b));
|
|
65
|
+
const flushed = this.#buffer.splice(0);
|
|
66
|
+
if (flushed.length > 0) {
|
|
67
|
+
this.#lastFlushedSeq = this.#config.getSequence(flushed[flushed.length - 1]);
|
|
68
|
+
}
|
|
69
|
+
return flushed;
|
|
70
|
+
}
|
|
71
|
+
/** Number of frames currently buffered (waiting for gap to fill). */
|
|
72
|
+
get pending() {
|
|
73
|
+
return this.#buffer.length;
|
|
74
|
+
}
|
|
75
|
+
/** Reset buffer state. */
|
|
76
|
+
reset() {
|
|
77
|
+
this.#buffer = [];
|
|
78
|
+
this.#lastFlushedSeq = -1;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=reorder-buffer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reorder-buffer.js","sourceRoot":"","sources":["../src/reorder-buffer.ts"],"names":[],"mappings":"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"}
|