@blockcast/mmt-container 0.1.0 → 0.3.0-main.ef68de90edb3

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 (799) hide show
  1. package/README.md +524 -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 +152 -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 +80 -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/block-policy.d.ts +314 -0
  22. package/dist/block-policy.d.ts.map +1 -0
  23. package/dist/block-policy.js +466 -0
  24. package/dist/block-policy.js.map +7 -0
  25. package/dist/browser-runtime.js +26549 -0
  26. package/dist/browser-runtime.js.map +7 -0
  27. package/dist/carp-catalog.d.ts +429 -0
  28. package/dist/carp-catalog.d.ts.map +1 -0
  29. package/dist/carp-catalog.js +985 -0
  30. package/dist/carp-catalog.js.map +7 -0
  31. package/dist/catalog-fec-params.d.ts +275 -0
  32. package/dist/catalog-fec-params.d.ts.map +1 -0
  33. package/dist/catalog-fec-params.js +702 -0
  34. package/dist/catalog-fec-params.js.map +7 -0
  35. package/dist/catalog-network-source.d.ts +42 -0
  36. package/dist/catalog-network-source.d.ts.map +1 -0
  37. package/dist/catalog-network-source.js +47 -0
  38. package/dist/catalog-network-source.js.map +7 -0
  39. package/dist/catalog-validator.d.ts +18 -0
  40. package/dist/catalog-validator.d.ts.map +1 -0
  41. package/dist/catalog-validator.js +7747 -0
  42. package/dist/catalog-validator.js.map +7 -0
  43. package/dist/cmaf-block-assembler.d.ts +285 -0
  44. package/dist/cmaf-block-assembler.d.ts.map +1 -0
  45. package/dist/cmaf-block-assembler.js +1966 -0
  46. package/dist/cmaf-block-assembler.js.map +7 -0
  47. package/dist/cmaf-group-batcher.d.ts +38 -0
  48. package/dist/cmaf-group-batcher.d.ts.map +1 -0
  49. package/dist/cmaf-group-batcher.js +176 -0
  50. package/dist/cmaf-group-batcher.js.map +7 -0
  51. package/dist/cmcd-producer.d.ts +104 -0
  52. package/dist/cmcd-producer.d.ts.map +1 -0
  53. package/dist/cmcd-producer.js +183 -0
  54. package/dist/cmcd-producer.js.map +7 -0
  55. package/dist/codec-utils.d.ts +384 -0
  56. package/dist/codec-utils.d.ts.map +1 -0
  57. package/dist/codec-utils.js +1546 -0
  58. package/dist/codec-utils.js.map +7 -0
  59. package/dist/conceal-timeline.d.ts +146 -0
  60. package/dist/conceal-timeline.d.ts.map +1 -0
  61. package/dist/conceal-timeline.js +137 -0
  62. package/dist/conceal-timeline.js.map +7 -0
  63. package/dist/delivery-gap.d.ts +75 -0
  64. package/dist/delivery-gap.d.ts.map +1 -0
  65. package/dist/delivery-gap.js +88 -0
  66. package/dist/delivery-gap.js.map +7 -0
  67. package/dist/duplicate-ledger.d.ts +197 -0
  68. package/dist/duplicate-ledger.d.ts.map +1 -0
  69. package/dist/duplicate-ledger.js +226 -0
  70. package/dist/duplicate-ledger.js.map +7 -0
  71. package/dist/fec-codec.d.ts +32 -0
  72. package/dist/fec-codec.d.ts.map +1 -0
  73. package/dist/fec-codec.js +47 -0
  74. package/dist/fec-codec.js.map +7 -0
  75. package/dist/fec-manager.d.ts +583 -0
  76. package/dist/fec-manager.d.ts.map +1 -0
  77. package/dist/fec-manager.js +3899 -0
  78. package/dist/fec-manager.js.map +7 -0
  79. package/dist/fec-starvation-detector.d.ts +59 -0
  80. package/dist/fec-starvation-detector.d.ts.map +1 -0
  81. package/dist/fec-starvation-detector.js +60 -0
  82. package/dist/fec-starvation-detector.js.map +7 -0
  83. package/dist/fec-state.d.ts +131 -0
  84. package/dist/fec-state.d.ts.map +1 -0
  85. package/dist/fec-state.js +87 -0
  86. package/dist/fec-state.js.map +7 -0
  87. package/dist/fec-worker-setup.d.ts +94 -0
  88. package/dist/fec-worker-setup.d.ts.map +1 -0
  89. package/dist/fec-worker-setup.js +673 -0
  90. package/dist/fec-worker-setup.js.map +7 -0
  91. package/dist/fmp4-completion.d.ts +30 -0
  92. package/dist/fmp4-completion.d.ts.map +1 -0
  93. package/dist/fmp4-completion.js +21 -0
  94. package/dist/fmp4-completion.js.map +7 -0
  95. package/dist/fmp4-reader.d.ts +37 -0
  96. package/dist/fmp4-reader.d.ts.map +1 -0
  97. package/dist/fmp4-reader.js +100 -0
  98. package/dist/fmp4-reader.js.map +7 -0
  99. package/dist/index.d.ts +44 -3
  100. package/dist/index.d.ts.map +1 -1
  101. package/dist/index.js +460 -14
  102. package/dist/index.js.map +7 -1
  103. package/dist/iso-block-locator.d.ts +118 -0
  104. package/dist/iso-block-locator.d.ts.map +1 -0
  105. package/dist/iso-block-locator.js +289 -0
  106. package/dist/iso-block-locator.js.map +7 -0
  107. package/dist/iso-bmff-timing.d.ts +78 -0
  108. package/dist/iso-bmff-timing.d.ts.map +1 -0
  109. package/dist/iso-bmff-timing.js +593 -0
  110. package/dist/iso-bmff-timing.js.map +7 -0
  111. package/dist/loc.d.ts +70 -75
  112. package/dist/loc.d.ts.map +1 -1
  113. package/dist/loc.js +106 -192
  114. package/dist/loc.js.map +7 -1
  115. package/dist/manifest-auth-plan.d.ts +30 -0
  116. package/dist/manifest-auth-plan.d.ts.map +1 -0
  117. package/dist/manifest-auth-plan.js +1266 -0
  118. package/dist/manifest-auth-plan.js.map +7 -0
  119. package/dist/media-router.d.ts +262 -0
  120. package/dist/media-router.d.ts.map +1 -0
  121. package/dist/media-router.js +584 -0
  122. package/dist/media-router.js.map +7 -0
  123. package/dist/mfu-reassembler.d.ts +313 -9
  124. package/dist/mfu-reassembler.d.ts.map +1 -1
  125. package/dist/mfu-reassembler.js +3051 -285
  126. package/dist/mfu-reassembler.js.map +7 -1
  127. package/dist/mfu-reassembly-policy.d.ts +24 -0
  128. package/dist/mfu-reassembly-policy.d.ts.map +1 -0
  129. package/dist/mfu-reassembly-policy.js +99 -0
  130. package/dist/mfu-reassembly-policy.js.map +7 -0
  131. package/dist/mmtp-container-parser.d.ts +568 -0
  132. package/dist/mmtp-container-parser.d.ts.map +1 -0
  133. package/dist/mmtp-container-parser.js +6580 -0
  134. package/dist/mmtp-container-parser.js.map +7 -0
  135. package/dist/mmtp-container-parser.no-modules.js +9616 -0
  136. package/dist/mmtp-container-parser.no-modules.js.map +7 -0
  137. package/dist/mmtp-decode-pipeline.d.ts +138 -0
  138. package/dist/mmtp-decode-pipeline.d.ts.map +1 -0
  139. package/dist/mmtp-decode-pipeline.js +6814 -0
  140. package/dist/mmtp-decode-pipeline.js.map +7 -0
  141. package/dist/mmtp-router.d.ts +679 -0
  142. package/dist/mmtp-router.d.ts.map +1 -0
  143. package/dist/mmtp-router.js +11278 -0
  144. package/dist/mmtp-router.js.map +7 -0
  145. package/dist/mmtp-to-cmaf.d.ts +187 -0
  146. package/dist/mmtp-to-cmaf.d.ts.map +1 -0
  147. package/dist/mmtp-to-cmaf.js +716 -0
  148. package/dist/mmtp-to-cmaf.js.map +7 -0
  149. package/dist/multicast-auth-catalog.d.ts +115 -0
  150. package/dist/multicast-auth-catalog.d.ts.map +1 -0
  151. package/dist/multicast-auth-catalog.js +202 -0
  152. package/dist/multicast-auth-catalog.js.map +7 -0
  153. package/dist/multicast-input.d.ts +141 -0
  154. package/dist/multicast-input.d.ts.map +1 -0
  155. package/dist/multicast-input.js +390 -0
  156. package/dist/multicast-input.js.map +7 -0
  157. package/dist/multicast-manager.d.ts +669 -0
  158. package/dist/multicast-manager.d.ts.map +1 -0
  159. package/dist/multicast-manager.js +19101 -0
  160. package/dist/multicast-manager.js.map +7 -0
  161. package/dist/multicast-transport.d.ts +271 -0
  162. package/dist/multicast-transport.d.ts.map +1 -0
  163. package/dist/multicast-transport.js +2264 -0
  164. package/dist/multicast-transport.js.map +7 -0
  165. package/dist/multicast-unwrap.d.ts +57 -0
  166. package/dist/multicast-unwrap.d.ts.map +1 -0
  167. package/dist/multicast-unwrap.js +418 -0
  168. package/dist/multicast-unwrap.js.map +7 -0
  169. package/dist/no-modules.d.ts +10 -0
  170. package/dist/no-modules.d.ts.map +1 -0
  171. package/dist/no-modules.js +9491 -0
  172. package/dist/no-modules.js.map +7 -0
  173. package/dist/phase14-catalog-override.d.ts +126 -0
  174. package/dist/phase14-catalog-override.d.ts.map +1 -0
  175. package/dist/phase14-catalog-override.js +155 -0
  176. package/dist/phase14-catalog-override.js.map +7 -0
  177. package/dist/repair-fetch.d.ts +270 -0
  178. package/dist/repair-fetch.d.ts.map +1 -0
  179. package/dist/repair-fetch.js +381 -0
  180. package/dist/repair-fetch.js.map +7 -0
  181. package/dist/repair-layers.d.ts +158 -0
  182. package/dist/repair-layers.d.ts.map +1 -0
  183. package/dist/repair-layers.js +344 -0
  184. package/dist/repair-layers.js.map +7 -0
  185. package/dist/sample-combiner.d.ts +212 -0
  186. package/dist/sample-combiner.d.ts.map +1 -0
  187. package/dist/sample-combiner.js +595 -0
  188. package/dist/sample-combiner.js.map +7 -0
  189. package/dist/signaling.d.ts +29 -0
  190. package/dist/signaling.d.ts.map +1 -0
  191. package/dist/signaling.js +572 -0
  192. package/dist/signaling.js.map +7 -0
  193. package/dist/source-auth.d.ts +2 -0
  194. package/dist/source-auth.d.ts.map +1 -0
  195. package/dist/source-auth.js +1209 -0
  196. package/dist/source-auth.js.map +7 -0
  197. package/dist/switching-set-alignment.d.ts +61 -0
  198. package/dist/switching-set-alignment.d.ts.map +1 -0
  199. package/dist/switching-set-alignment.js +70 -0
  200. package/dist/switching-set-alignment.js.map +7 -0
  201. package/dist/timestamp-codec.d.ts +34 -0
  202. package/dist/timestamp-codec.d.ts.map +1 -0
  203. package/dist/timestamp-codec.js +473 -0
  204. package/dist/timestamp-codec.js.map +7 -0
  205. package/dist/track-pipeline-setup.d.ts +83 -0
  206. package/dist/track-pipeline-setup.d.ts.map +1 -0
  207. package/dist/track-pipeline-setup.js +291 -0
  208. package/dist/track-pipeline-setup.js.map +7 -0
  209. package/dist/track-pipeline.d.ts +121 -0
  210. package/dist/track-pipeline.d.ts.map +1 -0
  211. package/dist/track-pipeline.js +209 -0
  212. package/dist/track-pipeline.js.map +7 -0
  213. package/dist/track-session.d.ts +414 -0
  214. package/dist/track-session.d.ts.map +1 -0
  215. package/dist/track-session.js +754 -0
  216. package/dist/track-session.js.map +7 -0
  217. package/dist/transport-pool.d.ts +69 -0
  218. package/dist/transport-pool.d.ts.map +1 -0
  219. package/dist/transport-pool.js +74 -0
  220. package/dist/transport-pool.js.map +7 -0
  221. package/dist/wasm-mfu-reassembler.d.ts +97 -0
  222. package/dist/wasm-mfu-reassembler.d.ts.map +1 -0
  223. package/dist/wasm-mfu-reassembler.js +2133 -0
  224. package/dist/wasm-mfu-reassembler.js.map +7 -0
  225. package/dist/wasm-mmtp-container-parser.d.ts +10 -0
  226. package/dist/wasm-mmtp-container-parser.d.ts.map +1 -0
  227. package/dist/wasm-mmtp-container-parser.js +6834 -0
  228. package/dist/wasm-mmtp-container-parser.js.map +7 -0
  229. package/node_modules/@blockcast/fec-worker/README.md +223 -0
  230. package/node_modules/@blockcast/fec-worker/dist/.build-stamp +0 -0
  231. package/node_modules/@blockcast/fec-worker/dist/block-order.d.ts +38 -0
  232. package/node_modules/@blockcast/fec-worker/dist/block-order.d.ts.map +1 -0
  233. package/node_modules/@blockcast/fec-worker/dist/block-order.js +78 -0
  234. package/node_modules/@blockcast/fec-worker/dist/block-order.js.map +1 -0
  235. package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.d.ts +93 -0
  236. package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.d.ts.map +1 -0
  237. package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.js +346 -0
  238. package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.js.map +1 -0
  239. package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.d.ts +380 -0
  240. package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.d.ts.map +1 -0
  241. package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.js +11 -0
  242. package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.js.map +1 -0
  243. package/node_modules/@blockcast/fec-worker/dist/fec-worker.d.ts +14 -0
  244. package/node_modules/@blockcast/fec-worker/dist/fec-worker.d.ts.map +1 -0
  245. package/node_modules/@blockcast/fec-worker/dist/fec-worker.js +859 -0
  246. package/node_modules/@blockcast/fec-worker/dist/fec-worker.js.map +7 -0
  247. package/node_modules/@blockcast/fec-worker/dist/index.d.ts +10 -0
  248. package/node_modules/@blockcast/fec-worker/dist/index.d.ts.map +1 -0
  249. package/node_modules/@blockcast/fec-worker/dist/index.js +8 -0
  250. package/node_modules/@blockcast/fec-worker/dist/index.js.map +1 -0
  251. package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.d.ts +20 -0
  252. package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.d.ts.map +1 -0
  253. package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.js +370 -0
  254. package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.js.map +7 -0
  255. package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.d.ts +104 -0
  256. package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.d.ts.map +1 -0
  257. package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.js +181 -0
  258. package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.js.map +1 -0
  259. package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.d.ts +194 -0
  260. package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.d.ts.map +1 -0
  261. package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.js +62 -0
  262. package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.js.map +1 -0
  263. package/node_modules/@blockcast/fec-worker/dist/transfer.d.ts +9 -0
  264. package/node_modules/@blockcast/fec-worker/dist/transfer.d.ts.map +1 -0
  265. package/node_modules/@blockcast/fec-worker/dist/transfer.js +13 -0
  266. package/node_modules/@blockcast/fec-worker/dist/transfer.js.map +1 -0
  267. package/node_modules/@blockcast/fec-worker/package.json +59 -0
  268. package/node_modules/@blockcast/fec-worker/src/block-order.ts +93 -0
  269. package/node_modules/@blockcast/fec-worker/src/fec-worker-client.ts +392 -0
  270. package/node_modules/@blockcast/fec-worker/src/fec-worker-types.ts +399 -0
  271. package/node_modules/@blockcast/fec-worker/src/fec-worker.ts +1502 -0
  272. package/node_modules/@blockcast/fec-worker/src/index.ts +35 -0
  273. package/node_modules/@blockcast/fec-worker/src/shred-fec-worker.ts +589 -0
  274. package/node_modules/@blockcast/fec-worker/src/shred-worker-client.ts +222 -0
  275. package/node_modules/@blockcast/fec-worker/src/shred-worker-types.ts +209 -0
  276. package/node_modules/@blockcast/fec-worker/src/transfer.ts +12 -0
  277. package/node_modules/@blockcast/mmt-alta-parse/README.md +181 -0
  278. package/node_modules/@blockcast/mmt-alta-parse/dist/.build-stamp +0 -0
  279. package/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts +57 -0
  280. package/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts.map +1 -0
  281. package/node_modules/@blockcast/mmt-alta-parse/dist/index.js +115 -0
  282. package/node_modules/@blockcast/mmt-alta-parse/dist/index.js.map +1 -0
  283. package/node_modules/@blockcast/mmt-alta-parse/package.json +50 -0
  284. package/node_modules/@blockcast/mmt-alta-parse/src/index.ts +136 -0
  285. package/node_modules/@blockcast/mmt-base/README.md +134 -0
  286. package/node_modules/@blockcast/mmt-base/dist/.build-stamp +0 -0
  287. package/node_modules/@blockcast/mmt-base/dist/fec-block-profile.d.ts +55 -0
  288. package/node_modules/@blockcast/mmt-base/dist/fec-block-profile.d.ts.map +1 -0
  289. package/node_modules/@blockcast/mmt-base/dist/fec-block-profile.js +128 -0
  290. package/node_modules/@blockcast/mmt-base/dist/fec-block-profile.js.map +1 -0
  291. package/node_modules/@blockcast/mmt-base/dist/index.d.ts +7 -0
  292. package/node_modules/@blockcast/mmt-base/dist/index.d.ts.map +1 -0
  293. package/node_modules/@blockcast/mmt-base/dist/index.js +7 -0
  294. package/node_modules/@blockcast/mmt-base/dist/index.js.map +1 -0
  295. package/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts +292 -0
  296. package/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts.map +1 -0
  297. package/node_modules/@blockcast/mmt-base/dist/mmtp.js +612 -0
  298. package/node_modules/@blockcast/mmt-base/dist/mmtp.js.map +1 -0
  299. package/node_modules/@blockcast/mmt-base/dist/net-constants.d.ts +18 -0
  300. package/node_modules/@blockcast/mmt-base/dist/net-constants.d.ts.map +1 -0
  301. package/node_modules/@blockcast/mmt-base/dist/net-constants.js +18 -0
  302. package/node_modules/@blockcast/mmt-base/dist/net-constants.js.map +1 -0
  303. package/node_modules/@blockcast/mmt-base/dist/ntp-short.d.ts +47 -0
  304. package/node_modules/@blockcast/mmt-base/dist/ntp-short.d.ts.map +1 -0
  305. package/node_modules/@blockcast/mmt-base/dist/ntp-short.js +54 -0
  306. package/node_modules/@blockcast/mmt-base/dist/ntp-short.js.map +1 -0
  307. package/node_modules/@blockcast/mmt-base/dist/serial-number.d.ts +57 -0
  308. package/node_modules/@blockcast/mmt-base/dist/serial-number.d.ts.map +1 -0
  309. package/node_modules/@blockcast/mmt-base/dist/serial-number.js +98 -0
  310. package/node_modules/@blockcast/mmt-base/dist/serial-number.js.map +1 -0
  311. package/node_modules/@blockcast/mmt-base/dist/signalling.d.ts +312 -0
  312. package/node_modules/@blockcast/mmt-base/dist/signalling.d.ts.map +1 -0
  313. package/node_modules/@blockcast/mmt-base/dist/signalling.js +637 -0
  314. package/node_modules/@blockcast/mmt-base/dist/signalling.js.map +1 -0
  315. package/node_modules/@blockcast/mmt-base/package.json +49 -0
  316. package/node_modules/@blockcast/mmt-base/src/fec-block-profile.ts +145 -0
  317. package/node_modules/@blockcast/mmt-base/src/index.ts +6 -0
  318. package/node_modules/@blockcast/mmt-base/src/mmtp.ts +892 -0
  319. package/node_modules/@blockcast/mmt-base/src/net-constants.ts +17 -0
  320. package/node_modules/@blockcast/mmt-base/src/ntp-short.ts +67 -0
  321. package/node_modules/@blockcast/mmt-base/src/serial-number.ts +107 -0
  322. package/node_modules/@blockcast/mmt-base/src/signalling.ts +862 -0
  323. package/node_modules/@blockcast/mmt-fec/README.md +271 -0
  324. package/node_modules/@blockcast/mmt-fec/dist/.build-stamp +0 -0
  325. package/node_modules/@blockcast/mmt-fec/dist/block-manager.d.ts +82 -0
  326. package/node_modules/@blockcast/mmt-fec/dist/block-manager.d.ts.map +1 -0
  327. package/node_modules/@blockcast/mmt-fec/dist/block-manager.js +296 -0
  328. package/node_modules/@blockcast/mmt-fec/dist/block-manager.js.map +1 -0
  329. package/node_modules/@blockcast/mmt-fec/dist/block-processor.d.ts +106 -0
  330. package/node_modules/@blockcast/mmt-fec/dist/block-processor.d.ts.map +1 -0
  331. package/node_modules/@blockcast/mmt-fec/dist/block-processor.js +288 -0
  332. package/node_modules/@blockcast/mmt-fec/dist/block-processor.js.map +1 -0
  333. package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.d.ts +46 -0
  334. package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.d.ts.map +1 -0
  335. package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.js +96 -0
  336. package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.js.map +1 -0
  337. package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.d.ts +33 -0
  338. package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.d.ts.map +1 -0
  339. package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.js +57 -0
  340. package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.js.map +1 -0
  341. package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.d.ts +205 -0
  342. package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.d.ts.map +1 -0
  343. package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.js +240 -0
  344. package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.js.map +1 -0
  345. package/node_modules/@blockcast/mmt-fec/dist/index.d.ts +28 -0
  346. package/node_modules/@blockcast/mmt-fec/dist/index.d.ts.map +1 -0
  347. package/node_modules/@blockcast/mmt-fec/dist/index.js +28 -0
  348. package/node_modules/@blockcast/mmt-fec/dist/index.js.map +1 -0
  349. package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.d.ts +20 -0
  350. package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.d.ts.map +1 -0
  351. package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.js +28 -0
  352. package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.js.map +1 -0
  353. package/node_modules/@blockcast/mmt-fec/dist/oti.d.ts +258 -0
  354. package/node_modules/@blockcast/mmt-fec/dist/oti.d.ts.map +1 -0
  355. package/node_modules/@blockcast/mmt-fec/dist/oti.js +382 -0
  356. package/node_modules/@blockcast/mmt-fec/dist/oti.js.map +1 -0
  357. package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.d.ts +41 -0
  358. package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.d.ts.map +1 -0
  359. package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.js +81 -0
  360. package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.js.map +1 -0
  361. package/node_modules/@blockcast/mmt-fec/dist/repair-group.d.ts +82 -0
  362. package/node_modules/@blockcast/mmt-fec/dist/repair-group.d.ts.map +1 -0
  363. package/node_modules/@blockcast/mmt-fec/dist/repair-group.js +170 -0
  364. package/node_modules/@blockcast/mmt-fec/dist/repair-group.js.map +1 -0
  365. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/README.md +181 -0
  366. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/.build-stamp +0 -0
  367. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts +57 -0
  368. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts.map +1 -0
  369. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.js +115 -0
  370. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.js.map +1 -0
  371. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/package.json +50 -0
  372. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/src/index.ts +136 -0
  373. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/README.md +134 -0
  374. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/.build-stamp +0 -0
  375. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/fec-block-profile.d.ts +55 -0
  376. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/fec-block-profile.d.ts.map +1 -0
  377. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/fec-block-profile.js +128 -0
  378. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/fec-block-profile.js.map +1 -0
  379. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.d.ts +7 -0
  380. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.d.ts.map +1 -0
  381. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.js +7 -0
  382. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.js.map +1 -0
  383. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts +292 -0
  384. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts.map +1 -0
  385. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.js +612 -0
  386. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.js.map +1 -0
  387. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/net-constants.d.ts +18 -0
  388. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/net-constants.d.ts.map +1 -0
  389. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/net-constants.js +18 -0
  390. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/net-constants.js.map +1 -0
  391. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/ntp-short.d.ts +47 -0
  392. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/ntp-short.d.ts.map +1 -0
  393. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/ntp-short.js +54 -0
  394. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/ntp-short.js.map +1 -0
  395. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/serial-number.d.ts +57 -0
  396. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/serial-number.d.ts.map +1 -0
  397. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/serial-number.js +98 -0
  398. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/serial-number.js.map +1 -0
  399. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/signalling.d.ts +312 -0
  400. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/signalling.d.ts.map +1 -0
  401. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/signalling.js +637 -0
  402. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/signalling.js.map +1 -0
  403. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/package.json +49 -0
  404. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/fec-block-profile.ts +145 -0
  405. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/index.ts +6 -0
  406. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/mmtp.ts +892 -0
  407. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/net-constants.ts +17 -0
  408. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/ntp-short.ts +67 -0
  409. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/serial-number.ts +107 -0
  410. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/signalling.ts +862 -0
  411. package/node_modules/@blockcast/mmt-fec/package.json +79 -0
  412. package/node_modules/@blockcast/mmt-fec/src/block-manager.ts +371 -0
  413. package/node_modules/@blockcast/mmt-fec/src/block-processor.ts +439 -0
  414. package/node_modules/@blockcast/mmt-fec/src/cmaf-recovery.ts +127 -0
  415. package/node_modules/@blockcast/mmt-fec/src/cmaf-symbols.ts +68 -0
  416. package/node_modules/@blockcast/mmt-fec/src/fec-block-mapper.ts +310 -0
  417. package/node_modules/@blockcast/mmt-fec/src/index.ts +94 -0
  418. package/node_modules/@blockcast/mmt-fec/src/loc-symbols.ts +34 -0
  419. package/node_modules/@blockcast/mmt-fec/src/oti.ts +463 -0
  420. package/node_modules/@blockcast/mmt-fec/src/reorder-buffer.ts +101 -0
  421. package/node_modules/@blockcast/mmt-fec/src/repair-group.ts +195 -0
  422. package/node_modules/@blockcast/mmt-manifest-verify/dist/.build-stamp +0 -0
  423. package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.d.ts +28 -0
  424. package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.d.ts.map +1 -0
  425. package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.js +128 -0
  426. package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.js.map +1 -0
  427. package/node_modules/@blockcast/mmt-manifest-verify/dist/index.d.ts +4 -0
  428. package/node_modules/@blockcast/mmt-manifest-verify/dist/index.d.ts.map +1 -0
  429. package/node_modules/@blockcast/mmt-manifest-verify/dist/index.js +4 -0
  430. package/node_modules/@blockcast/mmt-manifest-verify/dist/index.js.map +1 -0
  431. package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.d.ts +37 -0
  432. package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.d.ts.map +1 -0
  433. package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.js +179 -0
  434. package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.js.map +1 -0
  435. package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.d.ts +99 -0
  436. package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.d.ts.map +1 -0
  437. package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.js +492 -0
  438. package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.js.map +1 -0
  439. package/node_modules/@blockcast/mmt-manifest-verify/package.json +45 -0
  440. package/node_modules/@blockcast/mmt-manifest-verify/src/admission.ts +171 -0
  441. package/node_modules/@blockcast/mmt-manifest-verify/src/index.ts +3 -0
  442. package/node_modules/@blockcast/mmt-manifest-verify/src/source-auth.ts +230 -0
  443. package/node_modules/@blockcast/mmt-manifest-verify/src/verifier.ts +669 -0
  444. package/node_modules/@noble/hashes/LICENSE +21 -0
  445. package/node_modules/@noble/hashes/README.md +521 -0
  446. package/node_modules/@noble/hashes/_assert.d.ts +17 -0
  447. package/node_modules/@noble/hashes/_assert.d.ts.map +1 -0
  448. package/node_modules/@noble/hashes/_assert.js +18 -0
  449. package/node_modules/@noble/hashes/_assert.js.map +1 -0
  450. package/node_modules/@noble/hashes/_blake.d.ts +14 -0
  451. package/node_modules/@noble/hashes/_blake.d.ts.map +1 -0
  452. package/node_modules/@noble/hashes/_blake.js +50 -0
  453. package/node_modules/@noble/hashes/_blake.js.map +1 -0
  454. package/node_modules/@noble/hashes/_md.d.ts +51 -0
  455. package/node_modules/@noble/hashes/_md.d.ts.map +1 -0
  456. package/node_modules/@noble/hashes/_md.js +162 -0
  457. package/node_modules/@noble/hashes/_md.js.map +1 -0
  458. package/node_modules/@noble/hashes/_u64.d.ts +55 -0
  459. package/node_modules/@noble/hashes/_u64.d.ts.map +1 -0
  460. package/node_modules/@noble/hashes/_u64.js +90 -0
  461. package/node_modules/@noble/hashes/_u64.js.map +1 -0
  462. package/node_modules/@noble/hashes/argon2.d.ts +32 -0
  463. package/node_modules/@noble/hashes/argon2.d.ts.map +1 -0
  464. package/node_modules/@noble/hashes/argon2.js +401 -0
  465. package/node_modules/@noble/hashes/argon2.js.map +1 -0
  466. package/node_modules/@noble/hashes/blake1.d.ts +106 -0
  467. package/node_modules/@noble/hashes/blake1.d.ts.map +1 -0
  468. package/node_modules/@noble/hashes/blake1.js +459 -0
  469. package/node_modules/@noble/hashes/blake1.js.map +1 -0
  470. package/node_modules/@noble/hashes/blake2.d.ts +116 -0
  471. package/node_modules/@noble/hashes/blake2.d.ts.map +1 -0
  472. package/node_modules/@noble/hashes/blake2.js +420 -0
  473. package/node_modules/@noble/hashes/blake2.js.map +1 -0
  474. package/node_modules/@noble/hashes/blake2b.d.ts +11 -0
  475. package/node_modules/@noble/hashes/blake2b.d.ts.map +1 -0
  476. package/node_modules/@noble/hashes/blake2b.js +14 -0
  477. package/node_modules/@noble/hashes/blake2b.js.map +1 -0
  478. package/node_modules/@noble/hashes/blake2s.d.ts +20 -0
  479. package/node_modules/@noble/hashes/blake2s.d.ts.map +1 -0
  480. package/node_modules/@noble/hashes/blake2s.js +24 -0
  481. package/node_modules/@noble/hashes/blake2s.js.map +1 -0
  482. package/node_modules/@noble/hashes/blake3.d.ts +54 -0
  483. package/node_modules/@noble/hashes/blake3.d.ts.map +1 -0
  484. package/node_modules/@noble/hashes/blake3.js +255 -0
  485. package/node_modules/@noble/hashes/blake3.js.map +1 -0
  486. package/node_modules/@noble/hashes/crypto.d.ts +2 -0
  487. package/node_modules/@noble/hashes/crypto.d.ts.map +1 -0
  488. package/node_modules/@noble/hashes/crypto.js +5 -0
  489. package/node_modules/@noble/hashes/crypto.js.map +1 -0
  490. package/node_modules/@noble/hashes/cryptoNode.d.ts +2 -0
  491. package/node_modules/@noble/hashes/cryptoNode.d.ts.map +1 -0
  492. package/node_modules/@noble/hashes/cryptoNode.js +18 -0
  493. package/node_modules/@noble/hashes/cryptoNode.js.map +1 -0
  494. package/node_modules/@noble/hashes/eskdf.d.ts +47 -0
  495. package/node_modules/@noble/hashes/eskdf.d.ts.map +1 -0
  496. package/node_modules/@noble/hashes/eskdf.js +166 -0
  497. package/node_modules/@noble/hashes/eskdf.js.map +1 -0
  498. package/node_modules/@noble/hashes/esm/_assert.d.ts +17 -0
  499. package/node_modules/@noble/hashes/esm/_assert.d.ts.map +1 -0
  500. package/node_modules/@noble/hashes/esm/_assert.js +15 -0
  501. package/node_modules/@noble/hashes/esm/_assert.js.map +1 -0
  502. package/node_modules/@noble/hashes/esm/_blake.d.ts +14 -0
  503. package/node_modules/@noble/hashes/esm/_blake.d.ts.map +1 -0
  504. package/node_modules/@noble/hashes/esm/_blake.js +45 -0
  505. package/node_modules/@noble/hashes/esm/_blake.js.map +1 -0
  506. package/node_modules/@noble/hashes/esm/_md.d.ts +51 -0
  507. package/node_modules/@noble/hashes/esm/_md.d.ts.map +1 -0
  508. package/node_modules/@noble/hashes/esm/_md.js +155 -0
  509. package/node_modules/@noble/hashes/esm/_md.js.map +1 -0
  510. package/node_modules/@noble/hashes/esm/_u64.d.ts +55 -0
  511. package/node_modules/@noble/hashes/esm/_u64.d.ts.map +1 -0
  512. package/node_modules/@noble/hashes/esm/_u64.js +67 -0
  513. package/node_modules/@noble/hashes/esm/_u64.js.map +1 -0
  514. package/node_modules/@noble/hashes/esm/argon2.d.ts +32 -0
  515. package/node_modules/@noble/hashes/esm/argon2.d.ts.map +1 -0
  516. package/node_modules/@noble/hashes/esm/argon2.js +392 -0
  517. package/node_modules/@noble/hashes/esm/argon2.js.map +1 -0
  518. package/node_modules/@noble/hashes/esm/blake1.d.ts +106 -0
  519. package/node_modules/@noble/hashes/esm/blake1.d.ts.map +1 -0
  520. package/node_modules/@noble/hashes/esm/blake1.js +452 -0
  521. package/node_modules/@noble/hashes/esm/blake1.js.map +1 -0
  522. package/node_modules/@noble/hashes/esm/blake2.d.ts +116 -0
  523. package/node_modules/@noble/hashes/esm/blake2.d.ts.map +1 -0
  524. package/node_modules/@noble/hashes/esm/blake2.js +413 -0
  525. package/node_modules/@noble/hashes/esm/blake2.js.map +1 -0
  526. package/node_modules/@noble/hashes/esm/blake2b.d.ts +11 -0
  527. package/node_modules/@noble/hashes/esm/blake2b.d.ts.map +1 -0
  528. package/node_modules/@noble/hashes/esm/blake2b.js +11 -0
  529. package/node_modules/@noble/hashes/esm/blake2b.js.map +1 -0
  530. package/node_modules/@noble/hashes/esm/blake2s.d.ts +20 -0
  531. package/node_modules/@noble/hashes/esm/blake2s.d.ts.map +1 -0
  532. package/node_modules/@noble/hashes/esm/blake2s.js +21 -0
  533. package/node_modules/@noble/hashes/esm/blake2s.js.map +1 -0
  534. package/node_modules/@noble/hashes/esm/blake3.d.ts +54 -0
  535. package/node_modules/@noble/hashes/esm/blake3.d.ts.map +1 -0
  536. package/node_modules/@noble/hashes/esm/blake3.js +251 -0
  537. package/node_modules/@noble/hashes/esm/blake3.js.map +1 -0
  538. package/node_modules/@noble/hashes/esm/crypto.d.ts +2 -0
  539. package/node_modules/@noble/hashes/esm/crypto.d.ts.map +1 -0
  540. package/node_modules/@noble/hashes/esm/crypto.js +2 -0
  541. package/node_modules/@noble/hashes/esm/crypto.js.map +1 -0
  542. package/node_modules/@noble/hashes/esm/cryptoNode.d.ts +2 -0
  543. package/node_modules/@noble/hashes/esm/cryptoNode.d.ts.map +1 -0
  544. package/node_modules/@noble/hashes/esm/cryptoNode.js +15 -0
  545. package/node_modules/@noble/hashes/esm/cryptoNode.js.map +1 -0
  546. package/node_modules/@noble/hashes/esm/eskdf.d.ts +47 -0
  547. package/node_modules/@noble/hashes/esm/eskdf.d.ts.map +1 -0
  548. package/node_modules/@noble/hashes/esm/eskdf.js +160 -0
  549. package/node_modules/@noble/hashes/esm/eskdf.js.map +1 -0
  550. package/node_modules/@noble/hashes/esm/hkdf.d.ts +36 -0
  551. package/node_modules/@noble/hashes/esm/hkdf.d.ts.map +1 -0
  552. package/node_modules/@noble/hashes/esm/hkdf.js +82 -0
  553. package/node_modules/@noble/hashes/esm/hkdf.js.map +1 -0
  554. package/node_modules/@noble/hashes/esm/hmac.d.ts +35 -0
  555. package/node_modules/@noble/hashes/esm/hmac.d.ts.map +1 -0
  556. package/node_modules/@noble/hashes/esm/hmac.js +86 -0
  557. package/node_modules/@noble/hashes/esm/hmac.js.map +1 -0
  558. package/node_modules/@noble/hashes/esm/index.d.ts +2 -0
  559. package/node_modules/@noble/hashes/esm/index.d.ts.map +1 -0
  560. package/node_modules/@noble/hashes/esm/index.js +33 -0
  561. package/node_modules/@noble/hashes/esm/index.js.map +1 -0
  562. package/node_modules/@noble/hashes/esm/legacy.d.ts +71 -0
  563. package/node_modules/@noble/hashes/esm/legacy.d.ts.map +1 -0
  564. package/node_modules/@noble/hashes/esm/legacy.js +281 -0
  565. package/node_modules/@noble/hashes/esm/legacy.js.map +1 -0
  566. package/node_modules/@noble/hashes/esm/package.json +10 -0
  567. package/node_modules/@noble/hashes/esm/pbkdf2.d.ts +23 -0
  568. package/node_modules/@noble/hashes/esm/pbkdf2.d.ts.map +1 -0
  569. package/node_modules/@noble/hashes/esm/pbkdf2.js +97 -0
  570. package/node_modules/@noble/hashes/esm/pbkdf2.js.map +1 -0
  571. package/node_modules/@noble/hashes/esm/ripemd160.d.ts +13 -0
  572. package/node_modules/@noble/hashes/esm/ripemd160.d.ts.map +1 -0
  573. package/node_modules/@noble/hashes/esm/ripemd160.js +13 -0
  574. package/node_modules/@noble/hashes/esm/ripemd160.js.map +1 -0
  575. package/node_modules/@noble/hashes/esm/scrypt.d.ts +34 -0
  576. package/node_modules/@noble/hashes/esm/scrypt.d.ts.map +1 -0
  577. package/node_modules/@noble/hashes/esm/scrypt.js +228 -0
  578. package/node_modules/@noble/hashes/esm/scrypt.js.map +1 -0
  579. package/node_modules/@noble/hashes/esm/sha1.d.ts +11 -0
  580. package/node_modules/@noble/hashes/esm/sha1.d.ts.map +1 -0
  581. package/node_modules/@noble/hashes/esm/sha1.js +11 -0
  582. package/node_modules/@noble/hashes/esm/sha1.js.map +1 -0
  583. package/node_modules/@noble/hashes/esm/sha2.d.ts +159 -0
  584. package/node_modules/@noble/hashes/esm/sha2.d.ts.map +1 -0
  585. package/node_modules/@noble/hashes/esm/sha2.js +375 -0
  586. package/node_modules/@noble/hashes/esm/sha2.js.map +1 -0
  587. package/node_modules/@noble/hashes/esm/sha256.d.ts +20 -0
  588. package/node_modules/@noble/hashes/esm/sha256.d.ts.map +1 -0
  589. package/node_modules/@noble/hashes/esm/sha256.js +20 -0
  590. package/node_modules/@noble/hashes/esm/sha256.js.map +1 -0
  591. package/node_modules/@noble/hashes/esm/sha3-addons.d.ts +142 -0
  592. package/node_modules/@noble/hashes/esm/sha3-addons.d.ts.map +1 -0
  593. package/node_modules/@noble/hashes/esm/sha3-addons.js +393 -0
  594. package/node_modules/@noble/hashes/esm/sha3-addons.js.map +1 -0
  595. package/node_modules/@noble/hashes/esm/sha3.d.ts +53 -0
  596. package/node_modules/@noble/hashes/esm/sha3.d.ts.map +1 -0
  597. package/node_modules/@noble/hashes/esm/sha3.js +234 -0
  598. package/node_modules/@noble/hashes/esm/sha3.js.map +1 -0
  599. package/node_modules/@noble/hashes/esm/sha512.d.ts +26 -0
  600. package/node_modules/@noble/hashes/esm/sha512.d.ts.map +1 -0
  601. package/node_modules/@noble/hashes/esm/sha512.js +26 -0
  602. package/node_modules/@noble/hashes/esm/sha512.js.map +1 -0
  603. package/node_modules/@noble/hashes/esm/utils.d.ts +161 -0
  604. package/node_modules/@noble/hashes/esm/utils.d.ts.map +1 -0
  605. package/node_modules/@noble/hashes/esm/utils.js +281 -0
  606. package/node_modules/@noble/hashes/esm/utils.js.map +1 -0
  607. package/node_modules/@noble/hashes/hkdf.d.ts +36 -0
  608. package/node_modules/@noble/hashes/hkdf.d.ts.map +1 -0
  609. package/node_modules/@noble/hashes/hkdf.js +88 -0
  610. package/node_modules/@noble/hashes/hkdf.js.map +1 -0
  611. package/node_modules/@noble/hashes/hmac.d.ts +35 -0
  612. package/node_modules/@noble/hashes/hmac.d.ts.map +1 -0
  613. package/node_modules/@noble/hashes/hmac.js +91 -0
  614. package/node_modules/@noble/hashes/hmac.js.map +1 -0
  615. package/node_modules/@noble/hashes/index.d.ts +1 -0
  616. package/node_modules/@noble/hashes/index.d.ts.map +1 -0
  617. package/node_modules/@noble/hashes/index.js +33 -0
  618. package/node_modules/@noble/hashes/index.js.map +1 -0
  619. package/node_modules/@noble/hashes/legacy.d.ts +71 -0
  620. package/node_modules/@noble/hashes/legacy.d.ts.map +1 -0
  621. package/node_modules/@noble/hashes/legacy.js +287 -0
  622. package/node_modules/@noble/hashes/legacy.js.map +1 -0
  623. package/node_modules/@noble/hashes/package.json +266 -0
  624. package/node_modules/@noble/hashes/pbkdf2.d.ts +23 -0
  625. package/node_modules/@noble/hashes/pbkdf2.d.ts.map +1 -0
  626. package/node_modules/@noble/hashes/pbkdf2.js +101 -0
  627. package/node_modules/@noble/hashes/pbkdf2.js.map +1 -0
  628. package/node_modules/@noble/hashes/ripemd160.d.ts +13 -0
  629. package/node_modules/@noble/hashes/ripemd160.d.ts.map +1 -0
  630. package/node_modules/@noble/hashes/ripemd160.js +16 -0
  631. package/node_modules/@noble/hashes/ripemd160.js.map +1 -0
  632. package/node_modules/@noble/hashes/scrypt.d.ts +34 -0
  633. package/node_modules/@noble/hashes/scrypt.d.ts.map +1 -0
  634. package/node_modules/@noble/hashes/scrypt.js +232 -0
  635. package/node_modules/@noble/hashes/scrypt.js.map +1 -0
  636. package/node_modules/@noble/hashes/sha1.d.ts +11 -0
  637. package/node_modules/@noble/hashes/sha1.d.ts.map +1 -0
  638. package/node_modules/@noble/hashes/sha1.js +14 -0
  639. package/node_modules/@noble/hashes/sha1.js.map +1 -0
  640. package/node_modules/@noble/hashes/sha2.d.ts +159 -0
  641. package/node_modules/@noble/hashes/sha2.d.ts.map +1 -0
  642. package/node_modules/@noble/hashes/sha2.js +384 -0
  643. package/node_modules/@noble/hashes/sha2.js.map +1 -0
  644. package/node_modules/@noble/hashes/sha256.d.ts +20 -0
  645. package/node_modules/@noble/hashes/sha256.d.ts.map +1 -0
  646. package/node_modules/@noble/hashes/sha256.js +23 -0
  647. package/node_modules/@noble/hashes/sha256.js.map +1 -0
  648. package/node_modules/@noble/hashes/sha3-addons.d.ts +142 -0
  649. package/node_modules/@noble/hashes/sha3-addons.d.ts.map +1 -0
  650. package/node_modules/@noble/hashes/sha3-addons.js +402 -0
  651. package/node_modules/@noble/hashes/sha3-addons.js.map +1 -0
  652. package/node_modules/@noble/hashes/sha3.d.ts +53 -0
  653. package/node_modules/@noble/hashes/sha3.d.ts.map +1 -0
  654. package/node_modules/@noble/hashes/sha3.js +239 -0
  655. package/node_modules/@noble/hashes/sha3.js.map +1 -0
  656. package/node_modules/@noble/hashes/sha512.d.ts +26 -0
  657. package/node_modules/@noble/hashes/sha512.d.ts.map +1 -0
  658. package/node_modules/@noble/hashes/sha512.js +29 -0
  659. package/node_modules/@noble/hashes/sha512.js.map +1 -0
  660. package/node_modules/@noble/hashes/src/_assert.ts +22 -0
  661. package/node_modules/@noble/hashes/src/_blake.ts +50 -0
  662. package/node_modules/@noble/hashes/src/_md.ts +176 -0
  663. package/node_modules/@noble/hashes/src/_u64.ts +91 -0
  664. package/node_modules/@noble/hashes/src/argon2.ts +497 -0
  665. package/node_modules/@noble/hashes/src/blake1.ts +534 -0
  666. package/node_modules/@noble/hashes/src/blake2.ts +486 -0
  667. package/node_modules/@noble/hashes/src/blake2b.ts +10 -0
  668. package/node_modules/@noble/hashes/src/blake2s.ts +20 -0
  669. package/node_modules/@noble/hashes/src/blake3.ts +272 -0
  670. package/node_modules/@noble/hashes/src/crypto.ts +9 -0
  671. package/node_modules/@noble/hashes/src/cryptoNode.ts +15 -0
  672. package/node_modules/@noble/hashes/src/eskdf.ts +187 -0
  673. package/node_modules/@noble/hashes/src/hkdf.ts +88 -0
  674. package/node_modules/@noble/hashes/src/hmac.ts +94 -0
  675. package/node_modules/@noble/hashes/src/index.ts +31 -0
  676. package/node_modules/@noble/hashes/src/legacy.ts +293 -0
  677. package/node_modules/@noble/hashes/src/pbkdf2.ts +122 -0
  678. package/node_modules/@noble/hashes/src/ripemd160.ts +12 -0
  679. package/node_modules/@noble/hashes/src/scrypt.ts +257 -0
  680. package/node_modules/@noble/hashes/src/sha1.ts +10 -0
  681. package/node_modules/@noble/hashes/src/sha2.ts +402 -0
  682. package/node_modules/@noble/hashes/src/sha256.ts +24 -0
  683. package/node_modules/@noble/hashes/src/sha3-addons.ts +499 -0
  684. package/node_modules/@noble/hashes/src/sha3.ts +258 -0
  685. package/node_modules/@noble/hashes/src/sha512.ts +34 -0
  686. package/node_modules/@noble/hashes/src/utils.ts +395 -0
  687. package/node_modules/@noble/hashes/utils.d.ts +161 -0
  688. package/node_modules/@noble/hashes/utils.d.ts.map +1 -0
  689. package/node_modules/@noble/hashes/utils.js +313 -0
  690. package/node_modules/@noble/hashes/utils.js.map +1 -0
  691. package/package.json +179 -8
  692. package/schemas/catalog.schema.json +357 -0
  693. package/src/align.ts +239 -0
  694. package/src/audio-init-parser.ts +189 -0
  695. package/src/audio-ring-buffer.ts +120 -0
  696. package/src/authored-timing.ts +63 -0
  697. package/src/block-policy.ts +903 -0
  698. package/src/carp-catalog.ts +1065 -0
  699. package/src/catalog-fec-params.ts +729 -0
  700. package/src/catalog-network-source.ts +74 -0
  701. package/src/catalog-validator.ts +34 -0
  702. package/src/cmaf-block-assembler.ts +1255 -0
  703. package/src/cmaf-group-batcher.ts +104 -0
  704. package/src/cmcd-producer.ts +329 -0
  705. package/src/codec-utils.ts +1984 -0
  706. package/src/conceal-timeline.ts +293 -0
  707. package/src/delivery-gap.ts +147 -0
  708. package/src/duplicate-ledger.ts +372 -0
  709. package/src/fec-codec.ts +61 -0
  710. package/src/fec-manager.ts +4298 -0
  711. package/src/fec-starvation-detector.ts +128 -0
  712. package/src/fec-state.ts +219 -0
  713. package/src/fec-worker-setup.ts +283 -0
  714. package/src/fmp4-completion.ts +47 -0
  715. package/src/fmp4-reader.ts +112 -0
  716. package/src/index.ts +590 -21
  717. package/src/iso-block-locator.ts +329 -0
  718. package/src/iso-bmff-timing.ts +813 -0
  719. package/src/loc.ts +128 -154
  720. package/src/manifest-auth-plan.ts +107 -0
  721. package/src/media-router.ts +841 -0
  722. package/src/mfu-reassembler.ts +3480 -155
  723. package/src/mfu-reassembly-policy.ts +134 -0
  724. package/src/mmtp-container-parser.ts +2380 -0
  725. package/src/mmtp-decode-pipeline.ts +406 -0
  726. package/src/mmtp-router.ts +4860 -0
  727. package/src/mmtp-to-cmaf.ts +977 -0
  728. package/src/multicast-auth-catalog.ts +340 -0
  729. package/src/multicast-input.ts +793 -0
  730. package/src/multicast-manager.ts +2783 -0
  731. package/src/multicast-transport.ts +1058 -0
  732. package/src/multicast-unwrap.ts +132 -0
  733. package/src/no-modules.ts +21 -0
  734. package/src/phase14-catalog-override.ts +336 -0
  735. package/src/repair-fetch.ts +772 -0
  736. package/src/repair-layers.ts +533 -0
  737. package/src/sample-combiner.ts +938 -0
  738. package/src/signaling.ts +78 -0
  739. package/src/source-auth.ts +1 -0
  740. package/src/switching-set-alignment.ts +109 -0
  741. package/src/timestamp-codec.ts +265 -0
  742. package/src/track-pipeline-setup.ts +205 -0
  743. package/src/track-pipeline.ts +332 -0
  744. package/src/track-session.ts +1010 -0
  745. package/src/transport-pool.ts +128 -0
  746. package/src/wasm-mfu-reassembler.ts +405 -0
  747. package/src/wasm-mmtp-container-parser.ts +23 -0
  748. package/test-vectors/align.json +199 -0
  749. package/test-vectors/catalog/README.md +106 -0
  750. package/test-vectors/catalog/negative/archive-origin-with-path.json +33 -0
  751. package/test-vectors/catalog/negative/archive-unknown-field.json +34 -0
  752. package/test-vectors/catalog/negative/fec-block-profile-missing.json +51 -0
  753. package/test-vectors/catalog/negative/fec-block-profile-unknown.json +52 -0
  754. package/test-vectors/catalog/negative/fec-enhancement-repair-removed.json +28 -0
  755. package/test-vectors/catalog/negative/fec-repair-layer-geometry.json +33 -0
  756. package/test-vectors/catalog/negative/fec-repair-layer-missing-symbols.json +31 -0
  757. package/test-vectors/catalog/negative/fec-repair-multiple-depends.json +32 -0
  758. package/test-vectors/catalog/negative/fec-repair-overlay-with-layer.json +34 -0
  759. package/test-vectors/catalog/negative/fec-repair-priority-out-of-band.json +24 -0
  760. package/test-vectors/catalog/negative/fec-repair-source-symbols-without-scope.json +33 -0
  761. package/test-vectors/catalog/negative/legacy-selection-params.json +15 -0
  762. package/test-vectors/catalog/negative/media-track-repair-layer.json +16 -0
  763. package/test-vectors/catalog/negative/missing-mmtp-fields.json +12 -0
  764. package/test-vectors/catalog/negative/multicast-auth-padded-key.json +37 -0
  765. package/test-vectors/catalog/negative/multicast-auth-reused-track-format.json +53 -0
  766. package/test-vectors/catalog/negative/multicast-auth-trailing-pad-bits.json +37 -0
  767. package/test-vectors/catalog/negative/multicast-endpoint-missing-protocol-and-source.json +24 -0
  768. package/test-vectors/catalog/negative/multicast-network-source-empty.json +44 -0
  769. package/test-vectors/catalog/negative/multicast-packet-id-signaling.json +26 -0
  770. package/test-vectors/catalog/negative/network-source-object.json +25 -0
  771. package/test-vectors/catalog/negative/raptorq-source-symbols-over-max.json +24 -0
  772. package/test-vectors/catalog/negative/raptorq-unaligned-symbol.json +27 -0
  773. package/test-vectors/catalog/negative/repair-track-legacy-shape.json +19 -0
  774. package/test-vectors/catalog/negative/track-role-empty.json +16 -0
  775. package/test-vectors/catalog/negative/track-role-non-string.json +16 -0
  776. package/test-vectors/catalog/positive/archive-origin.json +34 -0
  777. package/test-vectors/catalog/positive/fec-iso-ssbg1.json +52 -0
  778. package/test-vectors/catalog/positive/fec-layered-repair.json +106 -0
  779. package/test-vectors/catalog/positive/fec-multicast.json +52 -0
  780. package/test-vectors/catalog/positive/flat-av.json +30 -0
  781. package/test-vectors/catalog/positive/multicast-auth-rotation.json +55 -0
  782. package/test-vectors/catalog/positive/multicast-native-ssm-no-network-source.json +43 -0
  783. package/test-vectors/catalog/positive/ticks-and-mixed-timescales.json +39 -0
  784. package/test-vectors/catalog/positive/track-role.json +49 -0
  785. package/test-vectors/catalog/releases/moqcast-native-v16-v1/catalog.json +65 -0
  786. package/test-vectors/catalog/releases/moqcast-native-v16-v1.archive.sha256 +1 -0
  787. package/test-vectors/catalog-multicast-auth-v1.json +26 -0
  788. package/test-vectors/catalog-validation.json +732 -0
  789. package/test-vectors/catalog-validator-public-api.mjs +25 -0
  790. package/test-vectors/generate-source-auth-fixture.mjs +114 -0
  791. package/test-vectors/hevc-x265-repeat-headers-v1.json +40 -0
  792. package/test-vectors/source-auth-v1.json +61 -0
  793. package/test-vectors/source-contiguity-v1.json +131 -0
  794. package/test-vectors/subsample-placement-v1.json +230 -0
  795. package/dist/mmtp.d.ts +0 -73
  796. package/dist/mmtp.d.ts.map +0 -1
  797. package/dist/mmtp.js +0 -210
  798. package/dist/mmtp.js.map +0 -1
  799. package/src/mmtp.ts +0 -277
@@ -0,0 +1,892 @@
1
+ import {
2
+ MMTP_EXT_TYPE_ALTA_AUTH as _LEAF_MMTP_EXT_TYPE_ALTA_AUTH,
3
+ MMTP_EXT_TRAILER_HEADER_SIZE as _LEAF_MMTP_EXT_TRAILER_HEADER_SIZE,
4
+ extractAltaTrailer as _leafExtractAltaTrailer,
5
+ type AltaTrailer as _LeafAltaTrailer,
6
+ } from '@blockcast/mmt-alta-parse'
7
+
8
+ /**
9
+ * @mmt/container - MMTP Parser
10
+ *
11
+ * MMTP (MMT Protocol) packet parser based on ISO/IEC 23008-1:2023 Section 9.2
12
+ *
13
+ * MMTP header format (12 bytes):
14
+ * - Byte 0: V(2) | C(1) | FEC_type(2) | r(1) | X(1) | R(1)
15
+ * - Byte 1: reserved(2) | packet_type(6)
16
+ * - Bytes 2-3: packet_id (big-endian)
17
+ * - Bytes 4-7: timestamp (big-endian, 32-bit)
18
+ * - Bytes 8-11: sequence_number (big-endian)
19
+ *
20
+ * FEC_type values:
21
+ * - 0: No FEC / source packet
22
+ * - 1: FEC mode 0 (source with FEC payload ID)
23
+ * - 2: FEC repair packet mode 0
24
+ * - 3: FEC repair packet mode 1
25
+ *
26
+ * @packageDocumentation
27
+ */
28
+
29
+ export interface MMTPHeader {
30
+ version: number
31
+ /** Packet type: 0x00=MPU, 0x02=Signaling, 0x03=Repair */
32
+ packetType: number
33
+ packetId: number
34
+ timestamp: bigint
35
+ sequenceNumber: number
36
+ payloadLength: number
37
+ fecType: number
38
+ /** C flag: header carries a 32-bit packet_counter. */
39
+ packetCounterFlag: boolean
40
+ packetCounter?: number
41
+ /** X flag: header carries an extension header and value. */
42
+ extensionFlag: boolean
43
+ extension?: { type: number; data: Uint8Array }
44
+ /** Byte offset at which the MMTP payload begins. */
45
+ headerLength: number
46
+ /** Random Access Point flag - indicates keyframe (ISO 23008-1, byte 0 bit 0) */
47
+ rapFlag: boolean
48
+ }
49
+
50
+ export interface MPUHeader {
51
+ mpuSequenceNumber: number
52
+ fragmentationIndicator: number // FI: 0=complete, 1=first, 2=middle, 3=last
53
+ /** 8-bit MPU fragment_counter from byte 3. */
54
+ fragmentCounter: number
55
+ /** T flag: 1=timed media (14-byte MFU DU header), 0=non-timed (4-byte header) */
56
+ timedFlag: number
57
+ /** A flag: aggregated MPU payload. This strict profile requires A=0. */
58
+ aggregationFlag: boolean
59
+ /** MPU payload_length (bytes 0-1): bytes after the length field, including
60
+ * the remaining six MPU-header bytes and all data-unit bytes. */
61
+ payloadLength: number
62
+ }
63
+
64
+ export interface MFUDuHeader {
65
+ movieFragmentSequenceNumber: number
66
+ sampleNumber: number
67
+ offset: number
68
+ priority: number
69
+ dependencyCounter: number
70
+ }
71
+
72
+ export interface MMTPPacket {
73
+ header: MMTPHeader
74
+ payload: Uint8Array
75
+ }
76
+
77
+ export const MMTP_HEADER_SIZE = 12
78
+ export const MPU_HEADER_SIZE = 8
79
+ export const MFU_DU_HEADER_SIZE_TIMED = 14 // T=1: timed media (video/audio samples)
80
+ export const MFU_DU_HEADER_SIZE_NONTIMED = 4 // T=0: non-timed media (item_id only)
81
+
82
+ const MPU_LENGTH_FIELD_SIZE = 2
83
+ const MPU_HEADER_REMAINDER_SIZE = MPU_HEADER_SIZE - MPU_LENGTH_FIELD_SIZE
84
+ const SOURCE_FEC_PAYLOAD_ID_SIZE = 4
85
+
86
+ // MMTP Packet Types (ISO/IEC 23008-1:2023 Section 9.2.2)
87
+ export const PACKET_TYPE_MPU = 0x00
88
+ export const PACKET_TYPE_SIGNALING = 0x02
89
+ export const PACKET_TYPE_REPAIR = 0x03
90
+
91
+ // AL-FEC Signaling Message ID (ISO/IEC 23008-1:2023 Amendment 1:2025)
92
+ export const ALFEC_MESSAGE_ID = 0x0203
93
+
94
+ /**
95
+ * MMTP `packet_id` of the signaling flow, which carries PACKET_TYPE_SIGNALING
96
+ * packets such as the AL-FEC message (ALFEC_MESSAGE_ID). The FFmpeg `moq_mmt`
97
+ * muxer sends that message on this packet_id into the same multicast group as
98
+ * the media, and moqcast-draft (PR #44) makes advertising it for a track a
99
+ * MUST NOT. A track's packet_id is therefore 1..MMTP_PACKET_ID_MAX.
100
+ */
101
+ export const MMTP_SIGNALING_PACKET_ID = 0
102
+
103
+ /** Largest value of the 16-bit MMTP `packet_id` header field. */
104
+ export const MMTP_PACKET_ID_MAX = 0xffff
105
+
106
+ // FEC Code IDs
107
+ export const FEC_CODE_XOR = 1
108
+ export const FEC_CODE_RAPTORQ = 2
109
+
110
+ /**
111
+ * Parse MMTP header from buffer
112
+ */
113
+ export function parseMMTPHeader(buffer: Uint8Array): MMTPHeader {
114
+ if (buffer.length < MMTP_HEADER_SIZE) {
115
+ throw new Error(`MMTP packet too small: ${buffer.length} bytes`)
116
+ }
117
+
118
+ const view = new DataView(buffer.buffer, buffer.byteOffset, buffer.byteLength)
119
+
120
+ const version = (buffer[0]! >> 6) & 0x03
121
+ if (version !== 0) {
122
+ throw new Error(`Unsupported MMTP version: ${version}`)
123
+ }
124
+
125
+ // Extract FEC type from byte 0, bits 3-4
126
+ const fecType = (buffer[0]! >> 3) & 0x03
127
+ const packetCounterFlag = (buffer[0]! & 0x20) !== 0
128
+ const extensionFlag = (buffer[0]! & 0x02) !== 0
129
+
130
+ // Extract RAP flag from byte 0, bit 0 (R bit - Random Access Point)
131
+ const rapFlag = (buffer[0]! & 0x01) === 1
132
+
133
+ // ISO/IEC 23008-1:2023 Figure 8 (V=0) places reserved(2) before
134
+ // packet_type(6), so packet_type occupies the low six bits of byte 1.
135
+ const packetType = buffer[1]! & 0x3F
136
+
137
+ let offset = 2
138
+
139
+ // Packet ID (2 bytes, big-endian)
140
+ const packetId = view.getUint16(offset, false)
141
+ offset += 2
142
+
143
+ // Timestamp (4 bytes, big-endian)
144
+ const timestamp = BigInt(view.getUint32(offset, false))
145
+ offset += 4
146
+
147
+ // Sequence number (4 bytes, big-endian)
148
+ const sequenceNumber = view.getUint32(offset, false)
149
+ offset += 4
150
+
151
+ let packetCounter: number | undefined
152
+ if (packetCounterFlag) {
153
+ if (offset + 4 > buffer.length) throw new Error('MMTP packet truncated in packet_counter')
154
+ packetCounter = view.getUint32(offset, false)
155
+ offset += 4
156
+ }
157
+
158
+ let extension: { type: number; data: Uint8Array } | undefined
159
+ if (extensionFlag) {
160
+ if (offset + 4 > buffer.length) throw new Error('MMTP packet truncated in header extension')
161
+ const type = view.getUint16(offset, false)
162
+ const length = view.getUint16(offset + 2, false)
163
+ offset += 4
164
+ if (offset + length > buffer.length) throw new Error('MMTP packet truncated in header extension value')
165
+ extension = { type, data: buffer.subarray(offset, offset + length) }
166
+ offset += length
167
+ }
168
+
169
+ return {
170
+ version,
171
+ packetType,
172
+ packetId,
173
+ timestamp,
174
+ sequenceNumber,
175
+ payloadLength: buffer.length - offset,
176
+ fecType,
177
+ packetCounterFlag,
178
+ packetCounter,
179
+ extensionFlag,
180
+ extension,
181
+ headerLength: offset,
182
+ rapFlag,
183
+ }
184
+ }
185
+
186
+ /**
187
+ * The MMTP `packet_id` of `buffer`, or null exactly when parseMMTPHeader would
188
+ * throw for it (short buffer, V != 0, truncated packet_counter or header
189
+ * extension).
190
+ *
191
+ * This is the per-packet filter a receiver runs before any other work, so it
192
+ * builds no header object, DataView or BigInt timestamp (BLO-36599). Use
193
+ * parseMMTPHeader when any other header field is needed.
194
+ */
195
+ export function readMMTPPacketId(buffer: Uint8Array): number | null {
196
+ if (buffer.length < MMTP_HEADER_SIZE) return null
197
+ const flags = buffer[0]!
198
+ if (((flags >> 6) & 0x03) !== 0) return null
199
+ let offset = MMTP_HEADER_SIZE
200
+ if ((flags & 0x20) !== 0) {
201
+ if (offset + 4 > buffer.length) return null
202
+ offset += 4
203
+ }
204
+ if ((flags & 0x02) !== 0) {
205
+ if (offset + 4 > buffer.length) return null
206
+ const length = (buffer[offset + 2]! << 8) | buffer[offset + 3]!
207
+ if (offset + 4 + length > buffer.length) return null
208
+ }
209
+ return (buffer[2]! << 8) | buffer[3]!
210
+ }
211
+
212
+ /**
213
+ * Unwrap MMTP packet to extract payload
214
+ */
215
+ export function unwrapMMTP(buffer: Uint8Array): MMTPPacket {
216
+ const header = parseMMTPHeader(buffer)
217
+ const payload = buffer.subarray(header.headerLength)
218
+
219
+ return { header, payload }
220
+ }
221
+
222
+ /**
223
+ * Parse MPU header from payload
224
+ * ISO/IEC 23008-1:2023 Section 9.2.3.3
225
+ *
226
+ * MPU Header format (8 bytes) as written by FFmpeg/libmmt:
227
+ * - Bytes 0-1: payload_length (16 bits, big-endian)
228
+ * - Byte 2: FT(4) | T(1) | FI(2) | A(1)
229
+ * - Byte 3: fragment_counter (8 bits)
230
+ * - Bytes 4-7: MPU_sequence_number (32 bits, big-endian)
231
+ */
232
+ export function parseMPUHeader(payload: Uint8Array): MPUHeader {
233
+ if (payload.length < MPU_HEADER_SIZE) {
234
+ throw new Error(`Payload too small for MPU header: ${payload.length} bytes`)
235
+ }
236
+
237
+ const view = new DataView(payload.buffer, payload.byteOffset, payload.byteLength)
238
+
239
+ // Bytes 0-1: payload_length (16 bits, big-endian)
240
+ const payloadLength = view.getUint16(0, false)
241
+
242
+ // Byte 2: FT(4) | T(1) | FI(2) | A(1)
243
+ const flagsByte = payload[2]!
244
+ const timedFlag = (flagsByte >> 3) & 0x01
245
+ const fragmentationIndicator = (flagsByte >> 1) & 0x03
246
+ const aggregationFlag = (flagsByte & 0x01) !== 0
247
+
248
+ // Byte 3: fragment_counter (8 bits). The high bit is part of the counter in
249
+ // the current libmmt/FFmpeg writer ABI.
250
+ const fragmentCounter = payload[3]!
251
+
252
+ // Bytes 4-7: MPU_sequence_number (32 bits, big-endian)
253
+ const mpuSequenceNumber = view.getUint32(4, false)
254
+
255
+ return {
256
+ mpuSequenceNumber,
257
+ fragmentationIndicator,
258
+ fragmentCounter,
259
+ timedFlag,
260
+ aggregationFlag,
261
+ payloadLength,
262
+ }
263
+ }
264
+
265
+ export function parseTimedMfuDuHeader(payload: Uint8Array, offset: number): MFUDuHeader | null {
266
+ if (offset < 0 || offset + MFU_DU_HEADER_SIZE_TIMED > payload.length) return null
267
+ const view = new DataView(payload.buffer, payload.byteOffset + offset, MFU_DU_HEADER_SIZE_TIMED)
268
+ return {
269
+ movieFragmentSequenceNumber: view.getUint32(0, false),
270
+ sampleNumber: view.getUint32(4, false),
271
+ offset: view.getUint32(8, false),
272
+ priority: payload[offset + 12]!,
273
+ dependencyCounter: payload[offset + 13]!,
274
+ }
275
+ }
276
+
277
+ /**
278
+ * Why `extractMFUPayload` refused a packet.
279
+ *
280
+ * These identifiers are part of the public contract: callers surface them in
281
+ * diagnostics, so renaming one is a breaking change.
282
+ */
283
+ export type MFURejectionGate =
284
+ | 'packet-shorter-than-mmtp-plus-mpu-header'
285
+ | 'mmtp-header-unparseable'
286
+ | 'not-an-mpu-packet'
287
+ | 'payload-shorter-than-mpu-header'
288
+ | 'aggregation-flag-set'
289
+ | 'mpu-payload-length-below-header-remainder'
290
+ | 'mpu-declared-end-exceeds-payload'
291
+ | 'mfu-offset-at-or-past-declared-end'
292
+ | 'source-fec-payload-id-width-mismatch'
293
+ | 'declared-trailers-unresolved'
294
+
295
+ export interface MFURejection {
296
+ gate: MFURejectionGate
297
+ /** Human-readable detail, including the byte arithmetic that decided it. */
298
+ detail: string
299
+ }
300
+
301
+ interface MfuPayloadLayout {
302
+ hasMfuDuHeader: boolean
303
+ mfuOffset: number
304
+ dataEnd: number
305
+ }
306
+
307
+ function resolveMfuPayloadLayout(
308
+ mpu: MPUHeader,
309
+ fragmentType: number,
310
+ payload: Uint8Array,
311
+ ): { layout: MfuPayloadLayout } | { rejection: MFURejection } {
312
+ if (mpu.payloadLength < MPU_HEADER_REMAINDER_SIZE) {
313
+ return {
314
+ rejection: {
315
+ gate: 'mpu-payload-length-below-header-remainder',
316
+ detail: `payload_length=${mpu.payloadLength} < ${MPU_HEADER_REMAINDER_SIZE}`,
317
+ },
318
+ }
319
+ }
320
+
321
+ // ISO/IEC 23008-1 defines payload_length from immediately after its own
322
+ // two-byte field. It therefore includes the remaining six MPU-header bytes.
323
+ const declaredEnd = MPU_LENGTH_FIELD_SIZE + mpu.payloadLength
324
+ if (declaredEnd > payload.length) {
325
+ return {
326
+ rejection: {
327
+ gate: 'mpu-declared-end-exceeds-payload',
328
+ detail:
329
+ `payload_length=${mpu.payloadLength} implies end=${declaredEnd}, ` +
330
+ `payload is ${payload.length} bytes`,
331
+ },
332
+ }
333
+ }
334
+
335
+ const hasHeader = fragmentType === 2 && mpu.fragmentationIndicator <= 1
336
+ const mfuHeaderSize = mpu.timedFlag ? MFU_DU_HEADER_SIZE_TIMED : MFU_DU_HEADER_SIZE_NONTIMED
337
+ const mfuOffset = MPU_HEADER_SIZE + (hasHeader ? mfuHeaderSize : 0)
338
+ if (mfuOffset >= declaredEnd) {
339
+ return {
340
+ rejection: {
341
+ gate: 'mfu-offset-at-or-past-declared-end',
342
+ detail: `mfuOffset=${mfuOffset} >= declaredEnd=${declaredEnd}`,
343
+ },
344
+ }
345
+ }
346
+
347
+ return {
348
+ layout: {
349
+ hasMfuDuHeader: hasHeader,
350
+ mfuOffset,
351
+ dataEnd: declaredEnd,
352
+ },
353
+ }
354
+ }
355
+
356
+ function isEmptyOrExactAltaTrailer(payload: Uint8Array, start: number, end: number): boolean {
357
+ if (start === end) return true
358
+ if (start < 0 || end > payload.length || start + _LEAF_MMTP_EXT_TRAILER_HEADER_SIZE > end) {
359
+ return false
360
+ }
361
+
362
+ const view = new DataView(
363
+ payload.buffer,
364
+ payload.byteOffset + start,
365
+ end - start,
366
+ )
367
+ if (view.getUint16(0, false) !== _LEAF_MMTP_EXT_TYPE_ALTA_AUTH) return false
368
+
369
+ const authLength = view.getUint16(2, false)
370
+ return start + _LEAF_MMTP_EXT_TRAILER_HEADER_SIZE + authLength === end
371
+ }
372
+
373
+ interface DeclaredTrailerLayout {
374
+ hasFecId: boolean
375
+ }
376
+
377
+ function resolveDeclaredTrailers(
378
+ payload: Uint8Array,
379
+ declaredEnd: number,
380
+ fecType: number,
381
+ options?: { skipFecId?: boolean },
382
+ ): DeclaredTrailerLayout | null {
383
+ if (declaredEnd > payload.length) return null
384
+
385
+ if (options?.skipFecId) {
386
+ return isEmptyOrExactAltaTrailer(payload, declaredEnd, payload.length)
387
+ ? { hasFecId: false }
388
+ : null
389
+ }
390
+
391
+ if (fecType === 1) {
392
+ const fecStart = payload.length - SOURCE_FEC_PAYLOAD_ID_SIZE
393
+ if (fecStart < declaredEnd || !isEmptyOrExactAltaTrailer(payload, declaredEnd, fecStart)) {
394
+ return null
395
+ }
396
+ return { hasFecId: true }
397
+ }
398
+ if (fecType !== 0) return null
399
+
400
+ if (isEmptyOrExactAltaTrailer(payload, declaredEnd, payload.length)) {
401
+ return { hasFecId: false }
402
+ }
403
+
404
+ return null
405
+ }
406
+
407
+ /**
408
+ * Extract NAL unit payload from MMTP packet
409
+ */
410
+ export function extractNALUnit(mmtpPacket: Uint8Array): Uint8Array {
411
+ const extraction = extractMFUPayload(mmtpPacket)
412
+ if (!extraction) throw new Error('Malformed MMTP MPU payload')
413
+ return extraction.data
414
+ }
415
+
416
+ /** Result of extracting MFU payload from an MMTP packet */
417
+ export interface MFUExtraction {
418
+ /** MMTP header fields */
419
+ header: MMTPHeader
420
+ /** MPU header fields */
421
+ mpu: MPUHeader
422
+ /** Fragment type (FT field, 4 bits): 0=metadata, 2=MFU data */
423
+ fragmentType: number
424
+ /** MFU payload data (video/audio bytes, headers stripped, FEC ID excluded) */
425
+ data: Uint8Array
426
+ /** Parsed timed MFU DU header when present, otherwise null */
427
+ mfuDuHeader: MFUDuHeader | null
428
+ /** Non-timed MFU Item_ID when the 4-byte DU header is present. */
429
+ itemId: number | null
430
+ /** Source FEC Payload ID if present (`FEC_type == 1`), or null */
431
+ fecPayloadId: { ssId: number } | null
432
+ }
433
+
434
+ /**
435
+ * Extract MFU payload from a raw MMTP packet.
436
+ *
437
+ * Handles all the byte arithmetic for:
438
+ * - MMTP header (12 bytes)
439
+ * - MPU sub-header (8 bytes, payloadLength field)
440
+ * - MFU DU header (14 bytes timed / 4 bytes non-timed, only for FI ≤ 1)
441
+ * - Source FEC Payload ID (4 bytes at end, only when `FEC_type == 1`)
442
+ *
443
+ * `payloadLength` is the ISO length-after-field value: six remaining MPU-header
444
+ * bytes, then the MFU DU header when present, then media. ALTA and Source FEC
445
+ * trailers are outside that declared span and must consume the exact suffix.
446
+ *
447
+ * @param mmtpPacket Raw MMTP packet (from multicast or MoQ)
448
+ * @param options.skipFecId When true, do NOT subtract the 4-byte Source FEC Payload ID
449
+ * from the payload boundary, even if fecType >= 1 in the MMTP header. Use this for
450
+ * FEC-recovered symbols where the FEC PID was already stripped before WASM decoding
451
+ * but the fecType bits in byte 0 still reflect the original packet (FEC Type=1 per
452
+ * draft-ramadan-moq-mmt-00 §3.1).
453
+ * @returns Extracted MFU data + metadata, or null if packet is too small
454
+ */
455
+ interface MfuPlan {
456
+ header: MMTPHeader
457
+ payload: Uint8Array
458
+ mpu: MPUHeader
459
+ fragmentType: number
460
+ layout: MfuPayloadLayout
461
+ trailerLayout: DeclaredTrailerLayout
462
+ }
463
+
464
+ /**
465
+ * Single source of truth for whether a packet yields an MFU payload.
466
+ *
467
+ * `extractMFUPayload` and `explainMFURejection` both delegate here, so the
468
+ * reason reported to operators can never drift from the decision the parser
469
+ * actually made.
470
+ */
471
+ function planMfuExtraction(
472
+ mmtpPacket: Uint8Array,
473
+ options?: { skipFecId?: boolean },
474
+ parsedHeader?: MMTPHeader,
475
+ ): { plan: MfuPlan } | { rejection: MFURejection } {
476
+ if (mmtpPacket.length < MMTP_HEADER_SIZE + MPU_HEADER_SIZE) {
477
+ return {
478
+ rejection: {
479
+ gate: 'packet-shorter-than-mmtp-plus-mpu-header',
480
+ detail: `${mmtpPacket.length} bytes < ${MMTP_HEADER_SIZE + MPU_HEADER_SIZE}`,
481
+ },
482
+ }
483
+ }
484
+
485
+ let header: MMTPHeader
486
+ if (parsedHeader) {
487
+ header = parsedHeader
488
+ } else {
489
+ try {
490
+ header = parseMMTPHeader(mmtpPacket)
491
+ } catch (error) {
492
+ return {
493
+ rejection: {
494
+ gate: 'mmtp-header-unparseable',
495
+ detail: error instanceof Error ? error.message : String(error),
496
+ },
497
+ }
498
+ }
499
+ }
500
+ if (header.packetType !== PACKET_TYPE_MPU) {
501
+ return {
502
+ rejection: {
503
+ gate: 'not-an-mpu-packet',
504
+ detail: `packetType=0x${header.packetType.toString(16).padStart(2, '0')}`,
505
+ },
506
+ }
507
+ }
508
+
509
+ const payload = mmtpPacket.subarray(header.headerLength)
510
+ if (payload.length < MPU_HEADER_SIZE) {
511
+ return {
512
+ rejection: {
513
+ gate: 'payload-shorter-than-mpu-header',
514
+ detail: `${payload.length} bytes < ${MPU_HEADER_SIZE}`,
515
+ },
516
+ }
517
+ }
518
+
519
+ const mpu = parseMPUHeader(payload)
520
+ if (mpu.aggregationFlag) {
521
+ return {
522
+ rejection: { gate: 'aggregation-flag-set', detail: 'strict profile requires A=0' },
523
+ }
524
+ }
525
+
526
+ // Fragment type from byte 2 upper nibble (not returned by parseMPUHeader)
527
+ const fragmentType = (payload[2]! >> 4) & 0x0f
528
+
529
+ const layoutResult = resolveMfuPayloadLayout(mpu, fragmentType, payload)
530
+ if ('rejection' in layoutResult) return layoutResult
531
+ const { layout } = layoutResult
532
+
533
+ const trailerLayout = resolveDeclaredTrailers(
534
+ payload,
535
+ layout.dataEnd,
536
+ header.fecType,
537
+ options,
538
+ )
539
+ if (!trailerLayout) {
540
+ // The most common cause is a producer whose Source FEC Payload ID width
541
+ // disagrees with ISO/IEC 23008-1 §C.5.2. Name that explicitly rather than
542
+ // leaving operators to infer it from a generic trailer error.
543
+ if (!options?.skipFecId && header.fecType === 1) {
544
+ const observed = payload.length - layout.dataEnd
545
+ if (observed !== SOURCE_FEC_PAYLOAD_ID_SIZE) {
546
+ return {
547
+ rejection: {
548
+ gate: 'source-fec-payload-id-width-mismatch',
549
+ detail:
550
+ `producer wrote a ${observed}-byte Source FEC Payload ID, ` +
551
+ `ISO/IEC 23008-1 §C.5.2 requires ${SOURCE_FEC_PAYLOAD_ID_SIZE} ` +
552
+ `(payload=${payload.length}, declaredEnd=${layout.dataEnd})`,
553
+ },
554
+ }
555
+ }
556
+ }
557
+ return {
558
+ rejection: {
559
+ gate: 'declared-trailers-unresolved',
560
+ detail:
561
+ `trailer bytes [${layout.dataEnd}, ${payload.length}) are neither empty ` +
562
+ `nor an exact ALTA trailer (fecType=${header.fecType})`,
563
+ },
564
+ }
565
+ }
566
+
567
+ return { plan: { header, payload, mpu, fragmentType, layout, trailerLayout } }
568
+ }
569
+
570
+ /**
571
+ * Report why `extractMFUPayload` would refuse this packet, or null if it would
572
+ * accept it.
573
+ *
574
+ * `extractMFUPayload` returns bare `null` on ten distinct conditions, which
575
+ * makes a producer/consumer framing disagreement indistinguishable from a
576
+ * publisher that never started — both render as silence. Use this wherever
577
+ * that distinction matters: diagnostics, contract tests, and operator-facing
578
+ * logs.
579
+ */
580
+ export function explainMFURejection(
581
+ mmtpPacket: Uint8Array,
582
+ options?: { skipFecId?: boolean },
583
+ ): MFURejection | null {
584
+ const result = planMfuExtraction(mmtpPacket, options)
585
+ return 'rejection' in result ? result.rejection : null
586
+ }
587
+
588
+ export function extractMFUPayload(
589
+ mmtpPacket: Uint8Array,
590
+ options?: { skipFecId?: boolean },
591
+ ): MFUExtraction | null {
592
+ return extractPlannedMfu(mmtpPacket, planMfuExtraction(mmtpPacket, options))
593
+ }
594
+
595
+ /**
596
+ * extractMFUPayload for a caller that already holds this packet's parsed MMTP
597
+ * header, so the header is not parsed a second time (BLO-36599).
598
+ *
599
+ * `header` must be `parseMMTPHeader(mmtpPacket)` of this same packet; the
600
+ * result is then identical to `extractMFUPayload(mmtpPacket, options)`.
601
+ */
602
+ export function extractMFUPayloadWithHeader(
603
+ mmtpPacket: Uint8Array,
604
+ header: MMTPHeader,
605
+ options?: { skipFecId?: boolean },
606
+ ): MFUExtraction | null {
607
+ return extractPlannedMfu(mmtpPacket, planMfuExtraction(mmtpPacket, options, header))
608
+ }
609
+
610
+ function extractPlannedMfu(
611
+ mmtpPacket: Uint8Array,
612
+ result: { plan: MfuPlan } | { rejection: MFURejection },
613
+ ): MFUExtraction | null {
614
+ if ('rejection' in result) return null
615
+ const { header, payload, mpu, fragmentType, layout, trailerLayout } = result.plan
616
+
617
+ const mfuDuHeaderPresent = layout.hasMfuDuHeader
618
+ const mfuOffset = layout.mfuOffset
619
+ const dataEnd = layout.dataEnd
620
+
621
+ const mfuDuHeader =
622
+ mfuDuHeaderPresent && mpu.timedFlag === 1
623
+ ? parseTimedMfuDuHeader(payload, MPU_HEADER_SIZE)
624
+ : null
625
+ const itemId =
626
+ mfuDuHeaderPresent && mpu.timedFlag === 0
627
+ ? new DataView(payload.buffer, payload.byteOffset + MPU_HEADER_SIZE, 4).getUint32(0, false)
628
+ : null
629
+
630
+ const data = payload.subarray(mfuOffset, dataEnd)
631
+
632
+ const fecPayloadId = trailerLayout.hasFecId
633
+ ? {
634
+ ssId: new DataView(
635
+ mmtpPacket.buffer,
636
+ mmtpPacket.byteOffset + mmtpPacket.length - SOURCE_FEC_PAYLOAD_ID_SIZE,
637
+ SOURCE_FEC_PAYLOAD_ID_SIZE,
638
+ ).getUint32(0, false),
639
+ }
640
+ : null
641
+
642
+ return { header, mpu, fragmentType, data, mfuDuHeader, itemId, fecPayloadId }
643
+ }
644
+
645
+ /**
646
+ * Extract timestamp from MMTP packet
647
+ */
648
+ export function extractTimestamp(mmtpPacket: Uint8Array): bigint {
649
+ const { header } = unwrapMMTP(mmtpPacket)
650
+ return header.timestamp
651
+ }
652
+
653
+ /**
654
+ * Check if MMTP packet is an FEC repair packet
655
+ * FEC_type 2 and 3 are repair packets
656
+ */
657
+ export function isFecRepairPacket(mmtpPacket: Uint8Array): boolean {
658
+ if (mmtpPacket.length < 1) return false
659
+ const fecType = (mmtpPacket[0]! >> 3) & 0x03
660
+ return fecType >= 2
661
+ }
662
+
663
+ /**
664
+ * Extract Source FEC Payload ID (SS_ID) from the last 4 bytes of an MMTP
665
+ * source packet per ISO/IEC 23008-1:2023 Section C.5.2 Figure C.10.
666
+ *
667
+ * SS_ID is a flat 32-bit monotonic counter (incremented by 1 per packet
668
+ * for ssbg_mode0 and ssbg_mode1). Block membership and ESI use the
669
+ * configured K; repair SS_Start identifies the first SS_ID of the block and
670
+ * SSB_length records the authored source-symbol count:
671
+ * SBN = floor(SS_ID / K), ESI = SS_ID % K
672
+ * SS_Start = SBN * K (first SS_ID of the block)
673
+ *
674
+ * This matches FFmpeg moqenc_mmt.c, the drafts (draft-ramadan-moq-fec §6.2),
675
+ * and ATSC A/331 §8.1.2.5 which defers to ISO 23008-1 Annex C.
676
+ */
677
+ export function extractFecPayloadId(mmtpPacket: Uint8Array): { ssId: number } | null {
678
+ const header = parseHeaderForSourceFecId(mmtpPacket)
679
+ return header ? sourceFecPayloadIdOf(mmtpPacket, header) : null
680
+ }
681
+
682
+ /**
683
+ * Return true when FEC_type=1 and the exact suffix after the ISO-declared MPU
684
+ * payload contains a four-byte Source FEC Payload ID.
685
+ */
686
+ export function hasSourceFecPayloadId(mmtpPacket: Uint8Array): boolean {
687
+ const header = parseHeaderForSourceFecId(mmtpPacket)
688
+ return header !== null && sourceFecPayloadIdOf(mmtpPacket, header) !== null
689
+ }
690
+
691
+ function parseHeaderForSourceFecId(mmtpPacket: Uint8Array): MMTPHeader | null {
692
+ if (mmtpPacket.length < MMTP_HEADER_SIZE + MPU_HEADER_SIZE) return null
693
+ try {
694
+ return parseMMTPHeader(mmtpPacket)
695
+ } catch {
696
+ return null
697
+ }
698
+ }
699
+
700
+ /**
701
+ * The Source FEC Payload ID of a packet whose MMTP header the caller already
702
+ * parsed, or null when the packet carries none: present only when FEC_type=1
703
+ * and the exact suffix after the ISO-declared MPU payload holds the four-byte
704
+ * ID (ISO/IEC 23008-1 §C.5.2). Same answer as extractFecPayloadId, without a
705
+ * second header parse (BLO-36599).
706
+ *
707
+ * `header` must be `parseMMTPHeader(mmtpPacket)` of this same packet.
708
+ */
709
+ export function sourceFecPayloadIdOf(
710
+ mmtpPacket: Uint8Array,
711
+ header: MMTPHeader,
712
+ ): { ssId: number } | null {
713
+ if (mmtpPacket.length < MMTP_HEADER_SIZE + MPU_HEADER_SIZE) return null
714
+ if (header.packetType !== PACKET_TYPE_MPU) return null
715
+
716
+ const payload = mmtpPacket.subarray(header.headerLength)
717
+ if (payload.length < MPU_HEADER_SIZE) return null
718
+ const payloadLength = (payload[0]! << 8) | payload[1]!
719
+ if (payloadLength < MPU_HEADER_REMAINDER_SIZE) return null
720
+ const declaredEnd = MPU_LENGTH_FIELD_SIZE + payloadLength
721
+ if (!resolveDeclaredTrailers(payload, declaredEnd, header.fecType)?.hasFecId) return null
722
+
723
+ // Flat 4-byte SS_ID: encoder writes block_id * K + symbol_id
724
+ const off = mmtpPacket.length - SOURCE_FEC_PAYLOAD_ID_SIZE
725
+ return {
726
+ ssId:
727
+ ((mmtpPacket[off]! << 24) |
728
+ (mmtpPacket[off + 1]! << 16) |
729
+ (mmtpPacket[off + 2]! << 8) |
730
+ mmtpPacket[off + 3]!) >>>
731
+ 0,
732
+ }
733
+ }
734
+
735
+ /**
736
+ * MMTP header-extension ext_type assigned to the detached ALTA authenticator
737
+ * trailer (Path 2 / 08-07). Carried in an `[ext_type][ext_length][auth]`
738
+ * block appended after the MPU's declared payload bytes, before the 4-byte
739
+ * Source FEC Payload ID. MMTP X-bit stays 0 — non-ALTA MMTP receivers treat
740
+ * the trailer as bytes past `payload_length` and skip it (per ISO 23008-1
741
+ * §9.2.2 "may be discarded without impacting correct processing").
742
+ */
743
+ // Re-export the ALTA trailer helper from the zero-dep leaf package. The leaf
744
+ // owns the implementation so container and FEC consumers share one parser
745
+ // without creating a package cycle.
746
+ export const MMTP_EXT_TYPE_ALTA_AUTH = _LEAF_MMTP_EXT_TYPE_ALTA_AUTH
747
+ export const MMTP_EXT_TRAILER_HEADER_SIZE = _LEAF_MMTP_EXT_TRAILER_HEADER_SIZE
748
+ export type AltaTrailer = _LeafAltaTrailer
749
+ export const extractAltaTrailer = _leafExtractAltaTrailer
750
+
751
+ /** Size of Repair FEC Payload ID per ISO/IEC 23008-1 Section C.5.3 */
752
+ export const REPAIR_FEC_PID_SIZE = 13
753
+
754
+ /**
755
+ * Parse the 13-byte Repair FEC Payload ID after the complete dynamic MMTP header.
756
+ * `parsedHeader`, when given, must be `parseMMTPHeader(mmtpPacket)` of this
757
+ * same packet; it spares the second header parse (BLO-36599).
758
+ */
759
+ function readRepairFecPayloadIdFields(mmtpPacket: Uint8Array, parsedHeader?: MMTPHeader): {
760
+ packetId: number; ssStart: number; rsbLength: number; rsId: number; ssbLength: number; dataOffset: number
761
+ } | null {
762
+ let header: MMTPHeader
763
+ if (parsedHeader) {
764
+ header = parsedHeader
765
+ } else {
766
+ try {
767
+ header = parseMMTPHeader(mmtpPacket)
768
+ } catch {
769
+ return null
770
+ }
771
+ }
772
+ if (header.packetType !== PACKET_TYPE_REPAIR || header.fecType !== 2) return null
773
+
774
+ const off = header.headerLength
775
+ if (mmtpPacket.length < off + REPAIR_FEC_PID_SIZE) return null
776
+ const ssStart =
777
+ ((mmtpPacket[off]! << 24) |
778
+ (mmtpPacket[off + 1]! << 16) |
779
+ (mmtpPacket[off + 2]! << 8) |
780
+ mmtpPacket[off + 3]!) >>>
781
+ 0 // 32 bits
782
+ const rsbLength = (mmtpPacket[off + 4]! << 16) | (mmtpPacket[off + 5]! << 8) | mmtpPacket[off + 6]! // 24 bits
783
+ const rsId = (mmtpPacket[off + 7]! << 16) | (mmtpPacket[off + 8]! << 8) | mmtpPacket[off + 9]! // 24 bits
784
+ const ssbLength = (mmtpPacket[off + 10]! << 16) | (mmtpPacket[off + 11]! << 8) | mmtpPacket[off + 12]! // 24 bits
785
+ return {
786
+ packetId: header.packetId,
787
+ ssStart,
788
+ rsbLength,
789
+ rsId,
790
+ ssbLength,
791
+ dataOffset: off + REPAIR_FEC_PID_SIZE,
792
+ }
793
+ }
794
+
795
+ /**
796
+ * Extract Repair FEC Payload ID from a raw-multicast MMTP repair packet.
797
+ * Per ISO/IEC 23008-1:2023 Section C.5.3 (ssbg_mode0, one-stage, no FFSRP_TS):
798
+ * [MMTP header][SS_Start:4][RSB_length:3][RS_ID:3][SSB_length:3][repair data]
799
+ * OTI is delivered via AL-FEC signaling message (Table C.3), not per-packet.
800
+ *
801
+ * Byte 1 is reserved(2)|packet_type(6) for V=0, so repair type 0x03 is 0x03.
802
+ * Pre-migration high-bits bytes (0x0c) are rejected — no compatibility decode.
803
+ */
804
+ export function extractRepairFecPayloadId(mmtpPacket: Uint8Array): {
805
+ ssStart: number; rsbLength: number; rsId: number; ssbLength: number
806
+ } | null {
807
+ const fields = readRepairFecPayloadIdFields(mmtpPacket)
808
+ if (!fields) return null
809
+ return {
810
+ ssStart: fields.ssStart,
811
+ rsbLength: fields.rsbLength,
812
+ rsId: fields.rsId,
813
+ ssbLength: fields.ssbLength,
814
+ }
815
+ }
816
+
817
+ /** Parsed MoQ repair frame per ISO/IEC 23008-1 Section C.4.3 + C.5.3 */
818
+ export interface MoqRepairFrame {
819
+ /** MMTP packetId (1=video, 2=audio) — for routing to correct FEC decoder */
820
+ packetId: number
821
+ /** SS_Start (32 bits): SS_ID of first source symbol in block */
822
+ ssStart: number
823
+ /** RSB_length (24 bits): number of repair symbols (P) */
824
+ rsbLength: number
825
+ /** RS_ID (24 bits): repair symbol index (0-based) */
826
+ rsId: number
827
+ /** SSB_length (24 bits): authored source-symbol count (1..=configured K) */
828
+ ssbLength: number
829
+ /** Repair symbol data after the dynamic MMTP header and 13-byte FEC payload ID. */
830
+ symbolData: Uint8Array
831
+ }
832
+
833
+ /**
834
+ * Parse a MoQ repair frame (ISO/IEC 23008-1 Annex C format).
835
+ *
836
+ * Wire format per ISO 23008-1 §C.4.3 + §C.5.3:
837
+ * MMTP Header: fixed 12 bytes plus C/X optional fields
838
+ * then SS_Start (4 bytes) → block identifier
839
+ * then RSB_length (3 bytes) → P
840
+ * then RS_ID (3 bytes) → ESI = K + RS_ID
841
+ * then SSB_length (3 bytes) → authored source-symbol count (1..=K)
842
+ * then Repair Symbol Data (T bytes)
843
+ *
844
+ * @param frame - Raw MoQ repair frame bytes
845
+ * @returns Parsed frame or null if invalid
846
+ */
847
+ export function parseMoqRepairFrame(frame: Uint8Array): MoqRepairFrame | null {
848
+ return moqRepairFrameFrom(frame, readRepairFecPayloadIdFields(frame))
849
+ }
850
+
851
+ /**
852
+ * parseMoqRepairFrame for a caller that already holds this frame's parsed MMTP
853
+ * header, so the header is not parsed a second time (BLO-36599). The router's
854
+ * multicast repair branch uses it: one repair packet in every K + P otherwise
855
+ * paid two header parses.
856
+ *
857
+ * `header` must be `parseMMTPHeader(frame)` of this same frame; the result is
858
+ * then identical to `parseMoqRepairFrame(frame)`.
859
+ */
860
+ export function parseMoqRepairFrameWithHeader(
861
+ frame: Uint8Array,
862
+ header: MMTPHeader,
863
+ ): MoqRepairFrame | null {
864
+ return moqRepairFrameFrom(frame, readRepairFecPayloadIdFields(frame, header))
865
+ }
866
+
867
+ function moqRepairFrameFrom(
868
+ frame: Uint8Array,
869
+ repairId: ReturnType<typeof readRepairFecPayloadIdFields>,
870
+ ): MoqRepairFrame | null {
871
+ if (!repairId) return null
872
+
873
+ const symbolData = frame.subarray(repairId.dataOffset)
874
+ if (
875
+ repairId.rsbLength === 0 ||
876
+ repairId.ssbLength === 0 ||
877
+ repairId.rsId >= repairId.rsbLength ||
878
+ symbolData.length === 0
879
+ ) return null
880
+
881
+ return {
882
+ packetId: repairId.packetId,
883
+ ssStart: repairId.ssStart,
884
+ rsbLength: repairId.rsbLength,
885
+ rsId: repairId.rsId,
886
+ ssbLength: repairId.ssbLength,
887
+ symbolData,
888
+ }
889
+ }
890
+
891
+ // The signalling-message parsers (9.3.4.2 payload header, AL-FEC message,
892
+ // PA/MPT) live in ./signalling.ts.