@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.
Files changed (678) hide show
  1. package/README.md +432 -0
  2. package/dist/.build-stamp +0 -0
  3. package/dist/__tests__/test-utils.d.ts +71 -0
  4. package/dist/__tests__/test-utils.d.ts.map +1 -0
  5. package/dist/align.d.ts +148 -0
  6. package/dist/align.d.ts.map +1 -0
  7. package/dist/align.js +88 -0
  8. package/dist/align.js.map +7 -0
  9. package/dist/audio-init-parser.d.ts +66 -0
  10. package/dist/audio-init-parser.d.ts.map +1 -0
  11. package/dist/audio-init-parser.js +118 -0
  12. package/dist/audio-init-parser.js.map +7 -0
  13. package/dist/audio-ring-buffer.d.ts +50 -0
  14. package/dist/audio-ring-buffer.d.ts.map +1 -0
  15. package/dist/audio-ring-buffer.js +93 -0
  16. package/dist/audio-ring-buffer.js.map +7 -0
  17. package/dist/authored-timing.d.ts +32 -0
  18. package/dist/authored-timing.d.ts.map +1 -0
  19. package/dist/authored-timing.js +32 -0
  20. package/dist/authored-timing.js.map +7 -0
  21. package/dist/browser-runtime.js +17109 -0
  22. package/dist/browser-runtime.js.map +7 -0
  23. package/dist/carp-catalog.d.ts +318 -0
  24. package/dist/carp-catalog.d.ts.map +1 -0
  25. package/dist/carp-catalog.js +549 -0
  26. package/dist/carp-catalog.js.map +7 -0
  27. package/dist/catalog-fec-params.d.ts +82 -0
  28. package/dist/catalog-fec-params.d.ts.map +1 -0
  29. package/dist/catalog-fec-params.js +66 -0
  30. package/dist/catalog-fec-params.js.map +7 -0
  31. package/dist/catalog-network-source.d.ts +19 -0
  32. package/dist/catalog-network-source.d.ts.map +1 -0
  33. package/dist/catalog-network-source.js +22 -0
  34. package/dist/catalog-network-source.js.map +7 -0
  35. package/dist/catalog-validator.d.ts +18 -0
  36. package/dist/catalog-validator.d.ts.map +1 -0
  37. package/dist/catalog-validator.js +7747 -0
  38. package/dist/catalog-validator.js.map +7 -0
  39. package/dist/cmaf-block-assembler.d.ts +168 -0
  40. package/dist/cmaf-block-assembler.d.ts.map +1 -0
  41. package/dist/cmaf-block-assembler.js +1755 -0
  42. package/dist/cmaf-block-assembler.js.map +7 -0
  43. package/dist/cmaf-group-batcher.d.ts +38 -0
  44. package/dist/cmaf-group-batcher.d.ts.map +1 -0
  45. package/dist/cmaf-group-batcher.js +195 -0
  46. package/dist/cmaf-group-batcher.js.map +7 -0
  47. package/dist/cmcd-producer.d.ts +104 -0
  48. package/dist/cmcd-producer.d.ts.map +1 -0
  49. package/dist/cmcd-producer.js +207 -0
  50. package/dist/cmcd-producer.js.map +7 -0
  51. package/dist/codec-utils.d.ts +235 -0
  52. package/dist/codec-utils.d.ts.map +1 -0
  53. package/dist/codec-utils.js +1225 -0
  54. package/dist/codec-utils.js.map +7 -0
  55. package/dist/fec-codec.d.ts +32 -0
  56. package/dist/fec-codec.d.ts.map +1 -0
  57. package/dist/fec-codec.js +47 -0
  58. package/dist/fec-codec.js.map +7 -0
  59. package/dist/fec-manager.d.ts +266 -0
  60. package/dist/fec-manager.d.ts.map +1 -0
  61. package/dist/fec-manager.js +1447 -0
  62. package/dist/fec-manager.js.map +7 -0
  63. package/dist/fec-starvation-detector.d.ts +59 -0
  64. package/dist/fec-starvation-detector.d.ts.map +1 -0
  65. package/dist/fec-starvation-detector.js +75 -0
  66. package/dist/fec-starvation-detector.js.map +7 -0
  67. package/dist/fec-worker-setup.d.ts +76 -0
  68. package/dist/fec-worker-setup.d.ts.map +1 -0
  69. package/dist/fec-worker-setup.js +603 -0
  70. package/dist/fec-worker-setup.js.map +7 -0
  71. package/dist/fmp4-completion.d.ts +30 -0
  72. package/dist/fmp4-completion.d.ts.map +1 -0
  73. package/dist/fmp4-completion.js +21 -0
  74. package/dist/fmp4-completion.js.map +7 -0
  75. package/dist/fmp4-reader.d.ts +37 -0
  76. package/dist/fmp4-reader.d.ts.map +1 -0
  77. package/dist/fmp4-reader.js +100 -0
  78. package/dist/fmp4-reader.js.map +7 -0
  79. package/dist/index.d.ts +47 -0
  80. package/dist/index.d.ts.map +1 -0
  81. package/dist/index.js +330 -0
  82. package/dist/index.js.map +7 -0
  83. package/dist/iso-bmff-timing.d.ts +47 -0
  84. package/dist/iso-bmff-timing.d.ts.map +1 -0
  85. package/dist/iso-bmff-timing.js +526 -0
  86. package/dist/iso-bmff-timing.js.map +7 -0
  87. package/dist/loc.d.ts +68 -0
  88. package/dist/loc.d.ts.map +1 -0
  89. package/dist/loc.js +143 -0
  90. package/dist/loc.js.map +7 -0
  91. package/dist/manifest-auth-plan.d.ts +30 -0
  92. package/dist/manifest-auth-plan.d.ts.map +1 -0
  93. package/dist/manifest-auth-plan.js +1267 -0
  94. package/dist/manifest-auth-plan.js.map +7 -0
  95. package/dist/media-router.d.ts +338 -0
  96. package/dist/media-router.d.ts.map +1 -0
  97. package/dist/media-router.js +802 -0
  98. package/dist/media-router.js.map +7 -0
  99. package/dist/mfu-reassembler.d.ts +264 -0
  100. package/dist/mfu-reassembler.d.ts.map +1 -0
  101. package/dist/mfu-reassembler.js +2668 -0
  102. package/dist/mfu-reassembler.js.map +7 -0
  103. package/dist/mfu-reassembly-policy.d.ts +24 -0
  104. package/dist/mfu-reassembly-policy.d.ts.map +1 -0
  105. package/dist/mfu-reassembly-policy.js +99 -0
  106. package/dist/mfu-reassembly-policy.js.map +7 -0
  107. package/dist/mmtp-container-parser.d.ts +304 -0
  108. package/dist/mmtp-container-parser.d.ts.map +1 -0
  109. package/dist/mmtp-container-parser.js +5378 -0
  110. package/dist/mmtp-container-parser.js.map +7 -0
  111. package/dist/mmtp-container-parser.no-modules.js +7853 -0
  112. package/dist/mmtp-container-parser.no-modules.js.map +7 -0
  113. package/dist/mmtp-decode-pipeline.d.ts +96 -0
  114. package/dist/mmtp-decode-pipeline.d.ts.map +1 -0
  115. package/dist/mmtp-decode-pipeline.js +5589 -0
  116. package/dist/mmtp-decode-pipeline.js.map +7 -0
  117. package/dist/mmtp-router.d.ts +383 -0
  118. package/dist/mmtp-router.d.ts.map +1 -0
  119. package/dist/mmtp-router.js +8384 -0
  120. package/dist/mmtp-router.js.map +7 -0
  121. package/dist/mmtp-to-cmaf.d.ts +166 -0
  122. package/dist/mmtp-to-cmaf.d.ts.map +1 -0
  123. package/dist/mmtp-to-cmaf.js +781 -0
  124. package/dist/mmtp-to-cmaf.js.map +7 -0
  125. package/dist/multicast-auth-catalog.d.ts +115 -0
  126. package/dist/multicast-auth-catalog.d.ts.map +1 -0
  127. package/dist/multicast-auth-catalog.js +202 -0
  128. package/dist/multicast-auth-catalog.js.map +7 -0
  129. package/dist/multicast-input.d.ts +107 -0
  130. package/dist/multicast-input.d.ts.map +1 -0
  131. package/dist/multicast-input.js +256 -0
  132. package/dist/multicast-input.js.map +7 -0
  133. package/dist/multicast-manager.d.ts +330 -0
  134. package/dist/multicast-manager.d.ts.map +1 -0
  135. package/dist/multicast-manager.js +11032 -0
  136. package/dist/multicast-manager.js.map +7 -0
  137. package/dist/multicast-transport.d.ts +62 -0
  138. package/dist/multicast-transport.d.ts.map +1 -0
  139. package/dist/multicast-transport.js +338 -0
  140. package/dist/multicast-transport.js.map +7 -0
  141. package/dist/multicast-unwrap.d.ts +57 -0
  142. package/dist/multicast-unwrap.d.ts.map +1 -0
  143. package/dist/multicast-unwrap.js +384 -0
  144. package/dist/multicast-unwrap.js.map +7 -0
  145. package/dist/no-modules.d.ts +9 -0
  146. package/dist/no-modules.d.ts.map +1 -0
  147. package/dist/no-modules.js +7819 -0
  148. package/dist/no-modules.js.map +7 -0
  149. package/dist/phase14-catalog-override.d.ts +126 -0
  150. package/dist/phase14-catalog-override.d.ts.map +1 -0
  151. package/dist/phase14-catalog-override.js +155 -0
  152. package/dist/phase14-catalog-override.js.map +7 -0
  153. package/dist/repair-fetch.d.ts +58 -0
  154. package/dist/repair-fetch.d.ts.map +1 -0
  155. package/dist/repair-fetch.js +117 -0
  156. package/dist/repair-fetch.js.map +7 -0
  157. package/dist/sample-combiner.d.ts +182 -0
  158. package/dist/sample-combiner.d.ts.map +1 -0
  159. package/dist/sample-combiner.js +571 -0
  160. package/dist/sample-combiner.js.map +7 -0
  161. package/dist/signaling.d.ts +29 -0
  162. package/dist/signaling.d.ts.map +1 -0
  163. package/dist/signaling.js +232 -0
  164. package/dist/signaling.js.map +7 -0
  165. package/dist/source-auth.d.ts +2 -0
  166. package/dist/source-auth.d.ts.map +1 -0
  167. package/dist/source-auth.js +1220 -0
  168. package/dist/source-auth.js.map +7 -0
  169. package/dist/switching-set-alignment.d.ts +61 -0
  170. package/dist/switching-set-alignment.d.ts.map +1 -0
  171. package/dist/switching-set-alignment.js +85 -0
  172. package/dist/switching-set-alignment.js.map +7 -0
  173. package/dist/timestamp-codec.d.ts +34 -0
  174. package/dist/timestamp-codec.d.ts.map +1 -0
  175. package/dist/timestamp-codec.js +456 -0
  176. package/dist/timestamp-codec.js.map +7 -0
  177. package/dist/track-pipeline-setup.d.ts +72 -0
  178. package/dist/track-pipeline-setup.d.ts.map +1 -0
  179. package/dist/track-pipeline-setup.js +306 -0
  180. package/dist/track-pipeline-setup.js.map +7 -0
  181. package/dist/track-pipeline.d.ts +121 -0
  182. package/dist/track-pipeline.d.ts.map +1 -0
  183. package/dist/track-pipeline.js +229 -0
  184. package/dist/track-pipeline.js.map +7 -0
  185. package/dist/track-session.d.ts +269 -0
  186. package/dist/track-session.d.ts.map +1 -0
  187. package/dist/track-session.js +597 -0
  188. package/dist/track-session.js.map +7 -0
  189. package/dist/transport-pool.d.ts +69 -0
  190. package/dist/transport-pool.d.ts.map +1 -0
  191. package/dist/transport-pool.js +88 -0
  192. package/dist/transport-pool.js.map +7 -0
  193. package/dist/wasm-mfu-reassembler.d.ts +81 -0
  194. package/dist/wasm-mfu-reassembler.d.ts.map +1 -0
  195. package/dist/wasm-mfu-reassembler.js +1915 -0
  196. package/dist/wasm-mfu-reassembler.js.map +7 -0
  197. package/dist/wasm-mmtp-container-parser.d.ts +10 -0
  198. package/dist/wasm-mmtp-container-parser.d.ts.map +1 -0
  199. package/dist/wasm-mmtp-container-parser.js +5635 -0
  200. package/dist/wasm-mmtp-container-parser.js.map +7 -0
  201. package/node_modules/@blockcast/fec-worker/README.md +213 -0
  202. package/node_modules/@blockcast/fec-worker/dist/.build-stamp +0 -0
  203. package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.d.ts +80 -0
  204. package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.d.ts.map +1 -0
  205. package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.js +270 -0
  206. package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.js.map +1 -0
  207. package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.d.ts +252 -0
  208. package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.d.ts.map +1 -0
  209. package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.js +11 -0
  210. package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.js.map +1 -0
  211. package/node_modules/@blockcast/fec-worker/dist/fec-worker.d.ts +14 -0
  212. package/node_modules/@blockcast/fec-worker/dist/fec-worker.d.ts.map +1 -0
  213. package/node_modules/@blockcast/fec-worker/dist/fec-worker.js +565 -0
  214. package/node_modules/@blockcast/fec-worker/dist/fec-worker.js.map +7 -0
  215. package/node_modules/@blockcast/fec-worker/dist/index.d.ts +10 -0
  216. package/node_modules/@blockcast/fec-worker/dist/index.d.ts.map +1 -0
  217. package/node_modules/@blockcast/fec-worker/dist/index.js +8 -0
  218. package/node_modules/@blockcast/fec-worker/dist/index.js.map +1 -0
  219. package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.d.ts +20 -0
  220. package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.d.ts.map +1 -0
  221. package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.js +349 -0
  222. package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.js.map +7 -0
  223. package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.d.ts +104 -0
  224. package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.d.ts.map +1 -0
  225. package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.js +181 -0
  226. package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.js.map +1 -0
  227. package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.d.ts +179 -0
  228. package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.d.ts.map +1 -0
  229. package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.js +47 -0
  230. package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.js.map +1 -0
  231. package/node_modules/@blockcast/fec-worker/dist/transfer.d.ts +9 -0
  232. package/node_modules/@blockcast/fec-worker/dist/transfer.d.ts.map +1 -0
  233. package/node_modules/@blockcast/fec-worker/dist/transfer.js +13 -0
  234. package/node_modules/@blockcast/fec-worker/dist/transfer.js.map +1 -0
  235. package/node_modules/@blockcast/fec-worker/package.json +59 -0
  236. package/node_modules/@blockcast/fec-worker/src/fec-worker-client.ts +309 -0
  237. package/node_modules/@blockcast/fec-worker/src/fec-worker-types.ts +268 -0
  238. package/node_modules/@blockcast/fec-worker/src/fec-worker.ts +1048 -0
  239. package/node_modules/@blockcast/fec-worker/src/index.ts +32 -0
  240. package/node_modules/@blockcast/fec-worker/src/shred-fec-worker.ts +558 -0
  241. package/node_modules/@blockcast/fec-worker/src/shred-worker-client.ts +222 -0
  242. package/node_modules/@blockcast/fec-worker/src/shred-worker-types.ts +194 -0
  243. package/node_modules/@blockcast/fec-worker/src/transfer.ts +12 -0
  244. package/node_modules/@blockcast/mmt-alta-parse/README.md +181 -0
  245. package/node_modules/@blockcast/mmt-alta-parse/dist/.build-stamp +0 -0
  246. package/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts +57 -0
  247. package/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts.map +1 -0
  248. package/node_modules/@blockcast/mmt-alta-parse/dist/index.js +115 -0
  249. package/node_modules/@blockcast/mmt-alta-parse/dist/index.js.map +1 -0
  250. package/node_modules/@blockcast/mmt-alta-parse/package.json +50 -0
  251. package/node_modules/@blockcast/mmt-alta-parse/src/index.ts +136 -0
  252. package/node_modules/@blockcast/mmt-base/README.md +120 -0
  253. package/node_modules/@blockcast/mmt-base/dist/.build-stamp +0 -0
  254. package/node_modules/@blockcast/mmt-base/dist/index.d.ts +2 -0
  255. package/node_modules/@blockcast/mmt-base/dist/index.d.ts.map +1 -0
  256. package/node_modules/@blockcast/mmt-base/dist/index.js +2 -0
  257. package/node_modules/@blockcast/mmt-base/dist/index.js.map +1 -0
  258. package/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts +275 -0
  259. package/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts.map +1 -0
  260. package/node_modules/@blockcast/mmt-base/dist/mmtp.js +644 -0
  261. package/node_modules/@blockcast/mmt-base/dist/mmtp.js.map +1 -0
  262. package/node_modules/@blockcast/mmt-base/package.json +49 -0
  263. package/node_modules/@blockcast/mmt-base/src/index.ts +1 -0
  264. package/node_modules/@blockcast/mmt-base/src/mmtp.ts +898 -0
  265. package/node_modules/@blockcast/mmt-fec/README.md +270 -0
  266. package/node_modules/@blockcast/mmt-fec/dist/.build-stamp +0 -0
  267. package/node_modules/@blockcast/mmt-fec/dist/block-manager.d.ts +80 -0
  268. package/node_modules/@blockcast/mmt-fec/dist/block-manager.d.ts.map +1 -0
  269. package/node_modules/@blockcast/mmt-fec/dist/block-manager.js +294 -0
  270. package/node_modules/@blockcast/mmt-fec/dist/block-manager.js.map +1 -0
  271. package/node_modules/@blockcast/mmt-fec/dist/block-processor.d.ts +72 -0
  272. package/node_modules/@blockcast/mmt-fec/dist/block-processor.d.ts.map +1 -0
  273. package/node_modules/@blockcast/mmt-fec/dist/block-processor.js +192 -0
  274. package/node_modules/@blockcast/mmt-fec/dist/block-processor.js.map +1 -0
  275. package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.d.ts +46 -0
  276. package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.d.ts.map +1 -0
  277. package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.js +96 -0
  278. package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.js.map +1 -0
  279. package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.d.ts +33 -0
  280. package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.d.ts.map +1 -0
  281. package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.js +57 -0
  282. package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.js.map +1 -0
  283. package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.d.ts +185 -0
  284. package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.d.ts.map +1 -0
  285. package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.js +273 -0
  286. package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.js.map +1 -0
  287. package/node_modules/@blockcast/mmt-fec/dist/index.d.ts +22 -0
  288. package/node_modules/@blockcast/mmt-fec/dist/index.d.ts.map +1 -0
  289. package/node_modules/@blockcast/mmt-fec/dist/index.js +22 -0
  290. package/node_modules/@blockcast/mmt-fec/dist/index.js.map +1 -0
  291. package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.d.ts +20 -0
  292. package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.d.ts.map +1 -0
  293. package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.js +28 -0
  294. package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.js.map +1 -0
  295. package/node_modules/@blockcast/mmt-fec/dist/oti.d.ts +174 -0
  296. package/node_modules/@blockcast/mmt-fec/dist/oti.d.ts.map +1 -0
  297. package/node_modules/@blockcast/mmt-fec/dist/oti.js +256 -0
  298. package/node_modules/@blockcast/mmt-fec/dist/oti.js.map +1 -0
  299. package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.d.ts +41 -0
  300. package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.d.ts.map +1 -0
  301. package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.js +81 -0
  302. package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.js.map +1 -0
  303. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/README.md +181 -0
  304. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/.build-stamp +0 -0
  305. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts +57 -0
  306. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts.map +1 -0
  307. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.js +115 -0
  308. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.js.map +1 -0
  309. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/package.json +50 -0
  310. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/src/index.ts +136 -0
  311. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/README.md +120 -0
  312. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/.build-stamp +0 -0
  313. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.d.ts +2 -0
  314. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.d.ts.map +1 -0
  315. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.js +2 -0
  316. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.js.map +1 -0
  317. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts +275 -0
  318. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts.map +1 -0
  319. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.js +644 -0
  320. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.js.map +1 -0
  321. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/package.json +49 -0
  322. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/index.ts +1 -0
  323. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/mmtp.ts +898 -0
  324. package/node_modules/@blockcast/mmt-fec/package.json +79 -0
  325. package/node_modules/@blockcast/mmt-fec/src/block-manager.ts +369 -0
  326. package/node_modules/@blockcast/mmt-fec/src/block-processor.ts +277 -0
  327. package/node_modules/@blockcast/mmt-fec/src/cmaf-recovery.ts +127 -0
  328. package/node_modules/@blockcast/mmt-fec/src/cmaf-symbols.ts +68 -0
  329. package/node_modules/@blockcast/mmt-fec/src/fec-block-mapper.ts +332 -0
  330. package/node_modules/@blockcast/mmt-fec/src/index.ts +77 -0
  331. package/node_modules/@blockcast/mmt-fec/src/loc-symbols.ts +34 -0
  332. package/node_modules/@blockcast/mmt-fec/src/oti.ts +319 -0
  333. package/node_modules/@blockcast/mmt-fec/src/reorder-buffer.ts +101 -0
  334. package/node_modules/@blockcast/mmt-manifest-verify/dist/.build-stamp +0 -0
  335. package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.d.ts +28 -0
  336. package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.d.ts.map +1 -0
  337. package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.js +128 -0
  338. package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.js.map +1 -0
  339. package/node_modules/@blockcast/mmt-manifest-verify/dist/index.d.ts +4 -0
  340. package/node_modules/@blockcast/mmt-manifest-verify/dist/index.d.ts.map +1 -0
  341. package/node_modules/@blockcast/mmt-manifest-verify/dist/index.js +4 -0
  342. package/node_modules/@blockcast/mmt-manifest-verify/dist/index.js.map +1 -0
  343. package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.d.ts +37 -0
  344. package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.d.ts.map +1 -0
  345. package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.js +179 -0
  346. package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.js.map +1 -0
  347. package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.d.ts +90 -0
  348. package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.d.ts.map +1 -0
  349. package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.js +462 -0
  350. package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.js.map +1 -0
  351. package/node_modules/@blockcast/mmt-manifest-verify/package.json +45 -0
  352. package/node_modules/@blockcast/mmt-manifest-verify/src/admission.ts +171 -0
  353. package/node_modules/@blockcast/mmt-manifest-verify/src/index.ts +3 -0
  354. package/node_modules/@blockcast/mmt-manifest-verify/src/source-auth.ts +230 -0
  355. package/node_modules/@blockcast/mmt-manifest-verify/src/verifier.ts +636 -0
  356. package/node_modules/@noble/hashes/LICENSE +21 -0
  357. package/node_modules/@noble/hashes/README.md +521 -0
  358. package/node_modules/@noble/hashes/_assert.d.ts +17 -0
  359. package/node_modules/@noble/hashes/_assert.d.ts.map +1 -0
  360. package/node_modules/@noble/hashes/_assert.js +18 -0
  361. package/node_modules/@noble/hashes/_assert.js.map +1 -0
  362. package/node_modules/@noble/hashes/_blake.d.ts +14 -0
  363. package/node_modules/@noble/hashes/_blake.d.ts.map +1 -0
  364. package/node_modules/@noble/hashes/_blake.js +50 -0
  365. package/node_modules/@noble/hashes/_blake.js.map +1 -0
  366. package/node_modules/@noble/hashes/_md.d.ts +51 -0
  367. package/node_modules/@noble/hashes/_md.d.ts.map +1 -0
  368. package/node_modules/@noble/hashes/_md.js +162 -0
  369. package/node_modules/@noble/hashes/_md.js.map +1 -0
  370. package/node_modules/@noble/hashes/_u64.d.ts +55 -0
  371. package/node_modules/@noble/hashes/_u64.d.ts.map +1 -0
  372. package/node_modules/@noble/hashes/_u64.js +90 -0
  373. package/node_modules/@noble/hashes/_u64.js.map +1 -0
  374. package/node_modules/@noble/hashes/argon2.d.ts +32 -0
  375. package/node_modules/@noble/hashes/argon2.d.ts.map +1 -0
  376. package/node_modules/@noble/hashes/argon2.js +401 -0
  377. package/node_modules/@noble/hashes/argon2.js.map +1 -0
  378. package/node_modules/@noble/hashes/blake1.d.ts +106 -0
  379. package/node_modules/@noble/hashes/blake1.d.ts.map +1 -0
  380. package/node_modules/@noble/hashes/blake1.js +459 -0
  381. package/node_modules/@noble/hashes/blake1.js.map +1 -0
  382. package/node_modules/@noble/hashes/blake2.d.ts +116 -0
  383. package/node_modules/@noble/hashes/blake2.d.ts.map +1 -0
  384. package/node_modules/@noble/hashes/blake2.js +420 -0
  385. package/node_modules/@noble/hashes/blake2.js.map +1 -0
  386. package/node_modules/@noble/hashes/blake2b.d.ts +11 -0
  387. package/node_modules/@noble/hashes/blake2b.d.ts.map +1 -0
  388. package/node_modules/@noble/hashes/blake2b.js +14 -0
  389. package/node_modules/@noble/hashes/blake2b.js.map +1 -0
  390. package/node_modules/@noble/hashes/blake2s.d.ts +20 -0
  391. package/node_modules/@noble/hashes/blake2s.d.ts.map +1 -0
  392. package/node_modules/@noble/hashes/blake2s.js +24 -0
  393. package/node_modules/@noble/hashes/blake2s.js.map +1 -0
  394. package/node_modules/@noble/hashes/blake3.d.ts +54 -0
  395. package/node_modules/@noble/hashes/blake3.d.ts.map +1 -0
  396. package/node_modules/@noble/hashes/blake3.js +255 -0
  397. package/node_modules/@noble/hashes/blake3.js.map +1 -0
  398. package/node_modules/@noble/hashes/crypto.d.ts +2 -0
  399. package/node_modules/@noble/hashes/crypto.d.ts.map +1 -0
  400. package/node_modules/@noble/hashes/crypto.js +5 -0
  401. package/node_modules/@noble/hashes/crypto.js.map +1 -0
  402. package/node_modules/@noble/hashes/cryptoNode.d.ts +2 -0
  403. package/node_modules/@noble/hashes/cryptoNode.d.ts.map +1 -0
  404. package/node_modules/@noble/hashes/cryptoNode.js +18 -0
  405. package/node_modules/@noble/hashes/cryptoNode.js.map +1 -0
  406. package/node_modules/@noble/hashes/eskdf.d.ts +47 -0
  407. package/node_modules/@noble/hashes/eskdf.d.ts.map +1 -0
  408. package/node_modules/@noble/hashes/eskdf.js +166 -0
  409. package/node_modules/@noble/hashes/eskdf.js.map +1 -0
  410. package/node_modules/@noble/hashes/esm/_assert.d.ts +17 -0
  411. package/node_modules/@noble/hashes/esm/_assert.d.ts.map +1 -0
  412. package/node_modules/@noble/hashes/esm/_assert.js +15 -0
  413. package/node_modules/@noble/hashes/esm/_assert.js.map +1 -0
  414. package/node_modules/@noble/hashes/esm/_blake.d.ts +14 -0
  415. package/node_modules/@noble/hashes/esm/_blake.d.ts.map +1 -0
  416. package/node_modules/@noble/hashes/esm/_blake.js +45 -0
  417. package/node_modules/@noble/hashes/esm/_blake.js.map +1 -0
  418. package/node_modules/@noble/hashes/esm/_md.d.ts +51 -0
  419. package/node_modules/@noble/hashes/esm/_md.d.ts.map +1 -0
  420. package/node_modules/@noble/hashes/esm/_md.js +155 -0
  421. package/node_modules/@noble/hashes/esm/_md.js.map +1 -0
  422. package/node_modules/@noble/hashes/esm/_u64.d.ts +55 -0
  423. package/node_modules/@noble/hashes/esm/_u64.d.ts.map +1 -0
  424. package/node_modules/@noble/hashes/esm/_u64.js +67 -0
  425. package/node_modules/@noble/hashes/esm/_u64.js.map +1 -0
  426. package/node_modules/@noble/hashes/esm/argon2.d.ts +32 -0
  427. package/node_modules/@noble/hashes/esm/argon2.d.ts.map +1 -0
  428. package/node_modules/@noble/hashes/esm/argon2.js +392 -0
  429. package/node_modules/@noble/hashes/esm/argon2.js.map +1 -0
  430. package/node_modules/@noble/hashes/esm/blake1.d.ts +106 -0
  431. package/node_modules/@noble/hashes/esm/blake1.d.ts.map +1 -0
  432. package/node_modules/@noble/hashes/esm/blake1.js +452 -0
  433. package/node_modules/@noble/hashes/esm/blake1.js.map +1 -0
  434. package/node_modules/@noble/hashes/esm/blake2.d.ts +116 -0
  435. package/node_modules/@noble/hashes/esm/blake2.d.ts.map +1 -0
  436. package/node_modules/@noble/hashes/esm/blake2.js +413 -0
  437. package/node_modules/@noble/hashes/esm/blake2.js.map +1 -0
  438. package/node_modules/@noble/hashes/esm/blake2b.d.ts +11 -0
  439. package/node_modules/@noble/hashes/esm/blake2b.d.ts.map +1 -0
  440. package/node_modules/@noble/hashes/esm/blake2b.js +11 -0
  441. package/node_modules/@noble/hashes/esm/blake2b.js.map +1 -0
  442. package/node_modules/@noble/hashes/esm/blake2s.d.ts +20 -0
  443. package/node_modules/@noble/hashes/esm/blake2s.d.ts.map +1 -0
  444. package/node_modules/@noble/hashes/esm/blake2s.js +21 -0
  445. package/node_modules/@noble/hashes/esm/blake2s.js.map +1 -0
  446. package/node_modules/@noble/hashes/esm/blake3.d.ts +54 -0
  447. package/node_modules/@noble/hashes/esm/blake3.d.ts.map +1 -0
  448. package/node_modules/@noble/hashes/esm/blake3.js +251 -0
  449. package/node_modules/@noble/hashes/esm/blake3.js.map +1 -0
  450. package/node_modules/@noble/hashes/esm/crypto.d.ts +2 -0
  451. package/node_modules/@noble/hashes/esm/crypto.d.ts.map +1 -0
  452. package/node_modules/@noble/hashes/esm/crypto.js +2 -0
  453. package/node_modules/@noble/hashes/esm/crypto.js.map +1 -0
  454. package/node_modules/@noble/hashes/esm/cryptoNode.d.ts +2 -0
  455. package/node_modules/@noble/hashes/esm/cryptoNode.d.ts.map +1 -0
  456. package/node_modules/@noble/hashes/esm/cryptoNode.js +15 -0
  457. package/node_modules/@noble/hashes/esm/cryptoNode.js.map +1 -0
  458. package/node_modules/@noble/hashes/esm/eskdf.d.ts +47 -0
  459. package/node_modules/@noble/hashes/esm/eskdf.d.ts.map +1 -0
  460. package/node_modules/@noble/hashes/esm/eskdf.js +160 -0
  461. package/node_modules/@noble/hashes/esm/eskdf.js.map +1 -0
  462. package/node_modules/@noble/hashes/esm/hkdf.d.ts +36 -0
  463. package/node_modules/@noble/hashes/esm/hkdf.d.ts.map +1 -0
  464. package/node_modules/@noble/hashes/esm/hkdf.js +82 -0
  465. package/node_modules/@noble/hashes/esm/hkdf.js.map +1 -0
  466. package/node_modules/@noble/hashes/esm/hmac.d.ts +35 -0
  467. package/node_modules/@noble/hashes/esm/hmac.d.ts.map +1 -0
  468. package/node_modules/@noble/hashes/esm/hmac.js +86 -0
  469. package/node_modules/@noble/hashes/esm/hmac.js.map +1 -0
  470. package/node_modules/@noble/hashes/esm/index.d.ts +2 -0
  471. package/node_modules/@noble/hashes/esm/index.d.ts.map +1 -0
  472. package/node_modules/@noble/hashes/esm/index.js +33 -0
  473. package/node_modules/@noble/hashes/esm/index.js.map +1 -0
  474. package/node_modules/@noble/hashes/esm/legacy.d.ts +71 -0
  475. package/node_modules/@noble/hashes/esm/legacy.d.ts.map +1 -0
  476. package/node_modules/@noble/hashes/esm/legacy.js +281 -0
  477. package/node_modules/@noble/hashes/esm/legacy.js.map +1 -0
  478. package/node_modules/@noble/hashes/esm/package.json +10 -0
  479. package/node_modules/@noble/hashes/esm/pbkdf2.d.ts +23 -0
  480. package/node_modules/@noble/hashes/esm/pbkdf2.d.ts.map +1 -0
  481. package/node_modules/@noble/hashes/esm/pbkdf2.js +97 -0
  482. package/node_modules/@noble/hashes/esm/pbkdf2.js.map +1 -0
  483. package/node_modules/@noble/hashes/esm/ripemd160.d.ts +13 -0
  484. package/node_modules/@noble/hashes/esm/ripemd160.d.ts.map +1 -0
  485. package/node_modules/@noble/hashes/esm/ripemd160.js +13 -0
  486. package/node_modules/@noble/hashes/esm/ripemd160.js.map +1 -0
  487. package/node_modules/@noble/hashes/esm/scrypt.d.ts +34 -0
  488. package/node_modules/@noble/hashes/esm/scrypt.d.ts.map +1 -0
  489. package/node_modules/@noble/hashes/esm/scrypt.js +228 -0
  490. package/node_modules/@noble/hashes/esm/scrypt.js.map +1 -0
  491. package/node_modules/@noble/hashes/esm/sha1.d.ts +11 -0
  492. package/node_modules/@noble/hashes/esm/sha1.d.ts.map +1 -0
  493. package/node_modules/@noble/hashes/esm/sha1.js +11 -0
  494. package/node_modules/@noble/hashes/esm/sha1.js.map +1 -0
  495. package/node_modules/@noble/hashes/esm/sha2.d.ts +159 -0
  496. package/node_modules/@noble/hashes/esm/sha2.d.ts.map +1 -0
  497. package/node_modules/@noble/hashes/esm/sha2.js +375 -0
  498. package/node_modules/@noble/hashes/esm/sha2.js.map +1 -0
  499. package/node_modules/@noble/hashes/esm/sha256.d.ts +20 -0
  500. package/node_modules/@noble/hashes/esm/sha256.d.ts.map +1 -0
  501. package/node_modules/@noble/hashes/esm/sha256.js +20 -0
  502. package/node_modules/@noble/hashes/esm/sha256.js.map +1 -0
  503. package/node_modules/@noble/hashes/esm/sha3-addons.d.ts +142 -0
  504. package/node_modules/@noble/hashes/esm/sha3-addons.d.ts.map +1 -0
  505. package/node_modules/@noble/hashes/esm/sha3-addons.js +393 -0
  506. package/node_modules/@noble/hashes/esm/sha3-addons.js.map +1 -0
  507. package/node_modules/@noble/hashes/esm/sha3.d.ts +53 -0
  508. package/node_modules/@noble/hashes/esm/sha3.d.ts.map +1 -0
  509. package/node_modules/@noble/hashes/esm/sha3.js +234 -0
  510. package/node_modules/@noble/hashes/esm/sha3.js.map +1 -0
  511. package/node_modules/@noble/hashes/esm/sha512.d.ts +26 -0
  512. package/node_modules/@noble/hashes/esm/sha512.d.ts.map +1 -0
  513. package/node_modules/@noble/hashes/esm/sha512.js +26 -0
  514. package/node_modules/@noble/hashes/esm/sha512.js.map +1 -0
  515. package/node_modules/@noble/hashes/esm/utils.d.ts +161 -0
  516. package/node_modules/@noble/hashes/esm/utils.d.ts.map +1 -0
  517. package/node_modules/@noble/hashes/esm/utils.js +281 -0
  518. package/node_modules/@noble/hashes/esm/utils.js.map +1 -0
  519. package/node_modules/@noble/hashes/hkdf.d.ts +36 -0
  520. package/node_modules/@noble/hashes/hkdf.d.ts.map +1 -0
  521. package/node_modules/@noble/hashes/hkdf.js +88 -0
  522. package/node_modules/@noble/hashes/hkdf.js.map +1 -0
  523. package/node_modules/@noble/hashes/hmac.d.ts +35 -0
  524. package/node_modules/@noble/hashes/hmac.d.ts.map +1 -0
  525. package/node_modules/@noble/hashes/hmac.js +91 -0
  526. package/node_modules/@noble/hashes/hmac.js.map +1 -0
  527. package/node_modules/@noble/hashes/index.d.ts +1 -0
  528. package/node_modules/@noble/hashes/index.d.ts.map +1 -0
  529. package/node_modules/@noble/hashes/index.js +33 -0
  530. package/node_modules/@noble/hashes/index.js.map +1 -0
  531. package/node_modules/@noble/hashes/legacy.d.ts +71 -0
  532. package/node_modules/@noble/hashes/legacy.d.ts.map +1 -0
  533. package/node_modules/@noble/hashes/legacy.js +287 -0
  534. package/node_modules/@noble/hashes/legacy.js.map +1 -0
  535. package/node_modules/@noble/hashes/package.json +266 -0
  536. package/node_modules/@noble/hashes/pbkdf2.d.ts +23 -0
  537. package/node_modules/@noble/hashes/pbkdf2.d.ts.map +1 -0
  538. package/node_modules/@noble/hashes/pbkdf2.js +101 -0
  539. package/node_modules/@noble/hashes/pbkdf2.js.map +1 -0
  540. package/node_modules/@noble/hashes/ripemd160.d.ts +13 -0
  541. package/node_modules/@noble/hashes/ripemd160.d.ts.map +1 -0
  542. package/node_modules/@noble/hashes/ripemd160.js +16 -0
  543. package/node_modules/@noble/hashes/ripemd160.js.map +1 -0
  544. package/node_modules/@noble/hashes/scrypt.d.ts +34 -0
  545. package/node_modules/@noble/hashes/scrypt.d.ts.map +1 -0
  546. package/node_modules/@noble/hashes/scrypt.js +232 -0
  547. package/node_modules/@noble/hashes/scrypt.js.map +1 -0
  548. package/node_modules/@noble/hashes/sha1.d.ts +11 -0
  549. package/node_modules/@noble/hashes/sha1.d.ts.map +1 -0
  550. package/node_modules/@noble/hashes/sha1.js +14 -0
  551. package/node_modules/@noble/hashes/sha1.js.map +1 -0
  552. package/node_modules/@noble/hashes/sha2.d.ts +159 -0
  553. package/node_modules/@noble/hashes/sha2.d.ts.map +1 -0
  554. package/node_modules/@noble/hashes/sha2.js +384 -0
  555. package/node_modules/@noble/hashes/sha2.js.map +1 -0
  556. package/node_modules/@noble/hashes/sha256.d.ts +20 -0
  557. package/node_modules/@noble/hashes/sha256.d.ts.map +1 -0
  558. package/node_modules/@noble/hashes/sha256.js +23 -0
  559. package/node_modules/@noble/hashes/sha256.js.map +1 -0
  560. package/node_modules/@noble/hashes/sha3-addons.d.ts +142 -0
  561. package/node_modules/@noble/hashes/sha3-addons.d.ts.map +1 -0
  562. package/node_modules/@noble/hashes/sha3-addons.js +402 -0
  563. package/node_modules/@noble/hashes/sha3-addons.js.map +1 -0
  564. package/node_modules/@noble/hashes/sha3.d.ts +53 -0
  565. package/node_modules/@noble/hashes/sha3.d.ts.map +1 -0
  566. package/node_modules/@noble/hashes/sha3.js +239 -0
  567. package/node_modules/@noble/hashes/sha3.js.map +1 -0
  568. package/node_modules/@noble/hashes/sha512.d.ts +26 -0
  569. package/node_modules/@noble/hashes/sha512.d.ts.map +1 -0
  570. package/node_modules/@noble/hashes/sha512.js +29 -0
  571. package/node_modules/@noble/hashes/sha512.js.map +1 -0
  572. package/node_modules/@noble/hashes/src/_assert.ts +22 -0
  573. package/node_modules/@noble/hashes/src/_blake.ts +50 -0
  574. package/node_modules/@noble/hashes/src/_md.ts +176 -0
  575. package/node_modules/@noble/hashes/src/_u64.ts +91 -0
  576. package/node_modules/@noble/hashes/src/argon2.ts +497 -0
  577. package/node_modules/@noble/hashes/src/blake1.ts +534 -0
  578. package/node_modules/@noble/hashes/src/blake2.ts +486 -0
  579. package/node_modules/@noble/hashes/src/blake2b.ts +10 -0
  580. package/node_modules/@noble/hashes/src/blake2s.ts +20 -0
  581. package/node_modules/@noble/hashes/src/blake3.ts +272 -0
  582. package/node_modules/@noble/hashes/src/crypto.ts +9 -0
  583. package/node_modules/@noble/hashes/src/cryptoNode.ts +15 -0
  584. package/node_modules/@noble/hashes/src/eskdf.ts +187 -0
  585. package/node_modules/@noble/hashes/src/hkdf.ts +88 -0
  586. package/node_modules/@noble/hashes/src/hmac.ts +94 -0
  587. package/node_modules/@noble/hashes/src/index.ts +31 -0
  588. package/node_modules/@noble/hashes/src/legacy.ts +293 -0
  589. package/node_modules/@noble/hashes/src/pbkdf2.ts +122 -0
  590. package/node_modules/@noble/hashes/src/ripemd160.ts +12 -0
  591. package/node_modules/@noble/hashes/src/scrypt.ts +257 -0
  592. package/node_modules/@noble/hashes/src/sha1.ts +10 -0
  593. package/node_modules/@noble/hashes/src/sha2.ts +402 -0
  594. package/node_modules/@noble/hashes/src/sha256.ts +24 -0
  595. package/node_modules/@noble/hashes/src/sha3-addons.ts +499 -0
  596. package/node_modules/@noble/hashes/src/sha3.ts +258 -0
  597. package/node_modules/@noble/hashes/src/sha512.ts +34 -0
  598. package/node_modules/@noble/hashes/src/utils.ts +395 -0
  599. package/node_modules/@noble/hashes/utils.d.ts +161 -0
  600. package/node_modules/@noble/hashes/utils.d.ts.map +1 -0
  601. package/node_modules/@noble/hashes/utils.js +313 -0
  602. package/node_modules/@noble/hashes/utils.js.map +1 -0
  603. package/package.json +203 -0
  604. package/schemas/catalog.schema.json +283 -0
  605. package/src/align.ts +235 -0
  606. package/src/audio-init-parser.ts +189 -0
  607. package/src/audio-ring-buffer.ts +120 -0
  608. package/src/authored-timing.ts +63 -0
  609. package/src/carp-catalog.ts +776 -0
  610. package/src/catalog-fec-params.ts +167 -0
  611. package/src/catalog-network-source.ts +49 -0
  612. package/src/catalog-validator.ts +34 -0
  613. package/src/cmaf-block-assembler.ts +1058 -0
  614. package/src/cmaf-group-batcher.ts +104 -0
  615. package/src/cmcd-producer.ts +329 -0
  616. package/src/codec-utils.ts +1539 -0
  617. package/src/fec-codec.ts +61 -0
  618. package/src/fec-manager.ts +1939 -0
  619. package/src/fec-starvation-detector.ts +128 -0
  620. package/src/fec-worker-setup.ts +177 -0
  621. package/src/fmp4-completion.ts +47 -0
  622. package/src/fmp4-reader.ts +112 -0
  623. package/src/index.ts +443 -0
  624. package/src/iso-bmff-timing.ts +688 -0
  625. package/src/loc.ts +181 -0
  626. package/src/manifest-auth-plan.ts +107 -0
  627. package/src/media-router.ts +1185 -0
  628. package/src/mfu-reassembler.ts +2842 -0
  629. package/src/mfu-reassembly-policy.ts +134 -0
  630. package/src/mmtp-container-parser.ts +1498 -0
  631. package/src/mmtp-decode-pipeline.ts +315 -0
  632. package/src/mmtp-router.ts +3027 -0
  633. package/src/mmtp-to-cmaf.ts +956 -0
  634. package/src/multicast-auth-catalog.ts +340 -0
  635. package/src/multicast-input.ts +439 -0
  636. package/src/multicast-manager.ts +1503 -0
  637. package/src/multicast-transport.ts +320 -0
  638. package/src/multicast-unwrap.ts +132 -0
  639. package/src/no-modules.ts +20 -0
  640. package/src/phase14-catalog-override.ts +336 -0
  641. package/src/repair-fetch.ts +217 -0
  642. package/src/sample-combiner.ts +846 -0
  643. package/src/signaling.ts +78 -0
  644. package/src/source-auth.ts +1 -0
  645. package/src/switching-set-alignment.ts +109 -0
  646. package/src/timestamp-codec.ts +265 -0
  647. package/src/track-pipeline-setup.ts +189 -0
  648. package/src/track-pipeline.ts +332 -0
  649. package/src/track-session.ts +778 -0
  650. package/src/transport-pool.ts +128 -0
  651. package/src/wasm-mfu-reassembler.ts +372 -0
  652. package/src/wasm-mmtp-container-parser.ts +23 -0
  653. package/test-vectors/align.json +199 -0
  654. package/test-vectors/catalog/README.md +25 -0
  655. package/test-vectors/catalog/negative/legacy-selection-params.json +15 -0
  656. package/test-vectors/catalog/negative/missing-mmtp-fields.json +12 -0
  657. package/test-vectors/catalog/negative/multicast-auth-padded-key.json +37 -0
  658. package/test-vectors/catalog/negative/multicast-auth-reused-track-format.json +53 -0
  659. package/test-vectors/catalog/negative/multicast-auth-trailing-pad-bits.json +37 -0
  660. package/test-vectors/catalog/negative/multicast-endpoint-missing-protocol-and-source.json +24 -0
  661. package/test-vectors/catalog/negative/network-source-object.json +25 -0
  662. package/test-vectors/catalog/negative/raptorq-unaligned-symbol.json +26 -0
  663. package/test-vectors/catalog/negative/repair-track-legacy-shape.json +18 -0
  664. package/test-vectors/catalog/negative/track-role-empty.json +16 -0
  665. package/test-vectors/catalog/negative/track-role-non-string.json +16 -0
  666. package/test-vectors/catalog/positive/fec-multicast.json +51 -0
  667. package/test-vectors/catalog/positive/flat-av.json +30 -0
  668. package/test-vectors/catalog/positive/multicast-auth-rotation.json +55 -0
  669. package/test-vectors/catalog/positive/ticks-and-mixed-timescales.json +39 -0
  670. package/test-vectors/catalog/positive/track-role.json +49 -0
  671. package/test-vectors/catalog/releases/moqcast-native-v16-v1/catalog.json +65 -0
  672. package/test-vectors/catalog/releases/moqcast-native-v16-v1.archive.sha256 +1 -0
  673. package/test-vectors/catalog-multicast-auth-v1.json +26 -0
  674. package/test-vectors/catalog-validation.json +148 -0
  675. package/test-vectors/catalog-validator-public-api.mjs +25 -0
  676. package/test-vectors/generate-source-auth-fixture.mjs +114 -0
  677. package/test-vectors/source-auth-v1.json +61 -0
  678. 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":"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"}
@@ -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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"}