@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,78 @@
1
+ /**
2
+ * MMTP Signaling Parser for Multicast
3
+ *
4
+ * Provides packet type detection and AL-FEC signaling message parsing.
5
+ * Used by the multicast pipeline to classify and route MMTP packets.
6
+ *
7
+ * Packet types (ISO/IEC 23008-1:2023 Section 9.2.2):
8
+ * - 0x00: MPU (Media Processing Unit) - video/audio data
9
+ * - 0x02: Signaling - control messages including AL-FEC config
10
+ * - 0x03: Repair - FEC repair symbols
11
+ */
12
+ import {
13
+ ALFEC_MESSAGE_ID,
14
+ FEC_CODE_RAPTORQ,
15
+ FEC_CODE_XOR,
16
+ PACKET_TYPE_MPU,
17
+ PACKET_TYPE_REPAIR,
18
+ PACKET_TYPE_SIGNALING,
19
+ parseAlFecMessage,
20
+ } from "@blockcast/mmt-base";
21
+
22
+ export {
23
+ ALFEC_MESSAGE_ID,
24
+ FEC_CODE_RAPTORQ,
25
+ FEC_CODE_XOR,
26
+ PACKET_TYPE_MPU,
27
+ PACKET_TYPE_REPAIR,
28
+ PACKET_TYPE_SIGNALING,
29
+ parseAlFecMessage,
30
+ };
31
+
32
+ export type PacketClass = "source" | "signaling" | "repair" | "unknown";
33
+
34
+ /** Get the MMTP packet type from raw multicast packet bytes.
35
+ *
36
+ * ISO/IEC 23008-1:2023 Figure 8 (V=0): byte 1 is
37
+ * reserved(2)|packet_type(6), so signaling is 0x02 and repair is 0x03.
38
+ * Pre-migration FFmpeg high-bits bytes (0x08/0x0c) are NOT accepted:
39
+ * writers and readers move together in the pinned smoke train.
40
+ */
41
+ export function getPacketType(mmtpPacket: Uint8Array): number {
42
+ if (mmtpPacket.length < 2) return -1;
43
+ return mmtpPacket[1] & 0x3f;
44
+ }
45
+
46
+ /** Check if packet is a signaling packet (type 0x02). */
47
+ export function isSignalingPacket(mmtpPacket: Uint8Array): boolean {
48
+ return getPacketType(mmtpPacket) === PACKET_TYPE_SIGNALING;
49
+ }
50
+
51
+ /** Determine if packet is a source (video/audio) packet. */
52
+ export function isSourcePacket(mmtpPacket: Uint8Array): boolean {
53
+ if (mmtpPacket.length < 2) return false;
54
+ const packetType = mmtpPacket[1] & 0x3f;
55
+ const fecType = (mmtpPacket[0] >> 3) & 0x03;
56
+ return packetType === 0x00 && fecType <= 1;
57
+ }
58
+
59
+ /** Classify MMTP packet for multicast pipeline routing. */
60
+ export function classifyPacket(mmtpPacket: Uint8Array): PacketClass {
61
+ if (mmtpPacket.length < 2) return "unknown";
62
+ const packetType = mmtpPacket[1] & 0x3f;
63
+ const fecType = (mmtpPacket[0] >> 3) & 0x03;
64
+ if ((mmtpPacket[0] >> 6) !== 0) return "unknown";
65
+ switch (packetType) {
66
+ case 0x00:
67
+ if (mmtpPacket.length < 20) return "unknown";
68
+ if (fecType >= 2) return "repair";
69
+ return "source";
70
+ case 0x02:
71
+ return "signaling";
72
+ case 0x03:
73
+ if (mmtpPacket.length < 20) return "unknown";
74
+ return "repair";
75
+ default:
76
+ return "unknown";
77
+ }
78
+ }
@@ -0,0 +1 @@
1
+ export * from '@blockcast/mmt-manifest-verify'
@@ -0,0 +1,109 @@
1
+ /**
2
+ * SwitchingSetMonitor — subscriber-side per-group alignment check between
3
+ * /base and /delta tracks in a CMAF switching set.
4
+ *
5
+ * Phase 14 D-15: log-only on drift (does NOT reject stream, does NOT throw).
6
+ * Phase 14 D-16: tolerance = Math.floor(1_000_000 / framerate / 2) microseconds.
7
+ * Hardcoded tolerance is FORBIDDEN — derives from framerate only.
8
+ * Phase 14 D-17: altGroup groups base+delta+repair into one switching set.
9
+ * Phase 14 T-14-03 mitigation: at most ONE misalignment emit per groupId pair.
10
+ */
11
+
12
+ export interface SwitchingSetMonitorOptions {
13
+ /** REQUIRED — throws if missing or ≤ 0 (error on bad init, CLAUDE.md). */
14
+ framerate: number
15
+ /** Fired when base and delta timestamps for the same groupId differ by more than toleranceUs. */
16
+ onMisaligned?: (evt: { groupId: number; driftUs: number }) => void
17
+ /** Fired when base and delta are at different group numbers simultaneously (via reportGroupMismatch). */
18
+ onGroupNumberMismatch?: (evt: { baseGroupId: number; deltaGroupId: number }) => void
19
+ }
20
+
21
+ /** Internal state for a pending base+delta group pair. */
22
+ type PendingGroup = { baseTs?: number; deltaTs?: number; emitted: boolean }
23
+
24
+ export class SwitchingSetMonitor {
25
+ /**
26
+ * Half-frame-duration tolerance in microseconds.
27
+ * Derivation: Math.floor(1_000_000 / framerate / 2)
28
+ * D-16: no hardcoded tolerance — framerate is the only input.
29
+ */
30
+ readonly toleranceUs: number
31
+
32
+ #pending: Map<number, PendingGroup> = new Map()
33
+ #onMisaligned: ((evt: { groupId: number; driftUs: number }) => void) | undefined
34
+ #onGroupNumberMismatch: ((evt: { baseGroupId: number; deltaGroupId: number }) => void) | undefined
35
+ #disposed = false
36
+
37
+ constructor(opts: SwitchingSetMonitorOptions) {
38
+ if (
39
+ !opts ||
40
+ typeof opts.framerate !== 'number' ||
41
+ !Number.isFinite(opts.framerate) ||
42
+ opts.framerate <= 0
43
+ ) {
44
+ throw new Error('[SwitchingSetMonitor] framerate required and must be > 0')
45
+ }
46
+ // D-16: derive from framerate — no hardcoded literal tolerance.
47
+ this.toleranceUs = Math.floor(1_000_000 / opts.framerate / 2)
48
+ this.#onMisaligned = opts.onMisaligned
49
+ this.#onGroupNumberMismatch = opts.onGroupNumberMismatch
50
+ }
51
+
52
+ /**
53
+ * Notify the monitor that a group's first frame has arrived on a given role's track.
54
+ *
55
+ * When both base and delta have been seen for the same groupId, the timestamps are
56
+ * compared. If the absolute drift exceeds toleranceUs, onMisaligned fires.
57
+ *
58
+ * T-14-03: at most one emit per groupId pair (first-call-wins coalescing).
59
+ * D-15: no throw on misalignment — log-only semantics.
60
+ */
61
+ notifyGroup(role: 'base' | 'delta', groupId: number, firstFrameTimestampUs: number): void {
62
+ if (this.#disposed) return
63
+
64
+ let entry = this.#pending.get(groupId)
65
+ if (!entry) {
66
+ entry = { emitted: false }
67
+ this.#pending.set(groupId, entry)
68
+ }
69
+
70
+ if (role === 'base') {
71
+ entry.baseTs = firstFrameTimestampUs
72
+ } else {
73
+ entry.deltaTs = firstFrameTimestampUs
74
+ }
75
+
76
+ // Only evaluate when both sides have been received AND not yet emitted.
77
+ if (entry.baseTs !== undefined && entry.deltaTs !== undefined && !entry.emitted) {
78
+ const driftUs = Math.abs(entry.baseTs - entry.deltaTs)
79
+ if (driftUs > this.toleranceUs) {
80
+ entry.emitted = true // T-14-03: coalesce — one emit per groupId pair
81
+ this.#onMisaligned?.({ groupId, driftUs })
82
+ }
83
+ }
84
+ }
85
+
86
+ /**
87
+ * Report a group-number mismatch observed at the caller level.
88
+ *
89
+ * Called when the caller observes that base's current group ID differs from
90
+ * delta's at the same wall-clock moment. This is a distinct concern from
91
+ * timestamp drift within a matched group — handled by a separate callback
92
+ * path (onGroupNumberMismatch) to keep each method single-purpose.
93
+ *
94
+ * Plan 03 wires this from player subscribe callbacks.
95
+ */
96
+ reportGroupMismatch(baseGroupId: number, deltaGroupId: number): void {
97
+ if (this.#disposed) return
98
+ this.#onGroupNumberMismatch?.({ baseGroupId, deltaGroupId })
99
+ }
100
+
101
+ /**
102
+ * Dispose the monitor and clear all buffered pending groups.
103
+ * After dispose(), subsequent notifyGroup/reportGroupMismatch calls are no-ops.
104
+ */
105
+ dispose(): void {
106
+ this.#disposed = true
107
+ this.#pending.clear()
108
+ }
109
+ }
@@ -0,0 +1,265 @@
1
+ /**
2
+ * Container Timestamp Codec
3
+ *
4
+ * Encodes and decodes timestamps across container formats:
5
+ * - "legacy": QUIC VarInt encoded (variable length 1-8 bytes)
6
+ * - "raw": Fixed 8-byte BigUint64
7
+ * - "mmtp" / "mmtp-fec": 12-byte MMTP header with embedded timestamp
8
+ * - "loc": LOC extension header encoding
9
+ * - "fmp4": Not yet implemented
10
+ */
11
+ import { extractNALUnit, extractTimestamp } from "@blockcast/mmt-base";
12
+
13
+ export type ContainerFormat = "legacy" | "raw" | "mmtp" | "mmtp-fec" | "loc" | "fmp4";
14
+
15
+ const DEFAULT_CONTAINER: ContainerFormat = "legacy";
16
+
17
+ /** Encodes a timestamp in microseconds according to the specified container format. */
18
+ export function encodeTimestamp(timestamp: number, container: ContainerFormat = DEFAULT_CONTAINER): Uint8Array {
19
+ switch (container) {
20
+ case "legacy":
21
+ return encodeVarInt(timestamp);
22
+ case "raw":
23
+ return encodeU64(timestamp);
24
+ case "mmtp":
25
+ case "mmtp-fec":
26
+ return encodeU64(timestamp);
27
+ case "loc":
28
+ return encodeLocTimestamp(timestamp);
29
+ case "fmp4":
30
+ throw new Error("fmp4 container not yet implemented");
31
+ }
32
+ }
33
+
34
+ /**
35
+ * Decodes a timestamp from a buffer according to the specified container format.
36
+ * @returns [timestamp in microseconds, remaining buffer after timestamp]
37
+ */
38
+ export function decodeTimestamp(buffer: Uint8Array, container: ContainerFormat = DEFAULT_CONTAINER): [number, Uint8Array] {
39
+ switch (container) {
40
+ case "legacy": {
41
+ const [value, remaining] = decodeVarInt(buffer);
42
+ return [value, remaining];
43
+ }
44
+ case "raw": {
45
+ const [value, remaining] = decodeU64(buffer);
46
+ return [value, remaining];
47
+ }
48
+ case "mmtp":
49
+ case "mmtp-fec": {
50
+ const timestamp = extractTimestamp(buffer);
51
+ const payload = extractNALUnit(buffer);
52
+ return [Number(timestamp), payload];
53
+ }
54
+ case "loc": {
55
+ const [ts, payload] = decodeLocTimestamp(buffer);
56
+ return [ts, payload];
57
+ }
58
+ case "fmp4":
59
+ throw new Error("fmp4 container not yet implemented");
60
+ }
61
+ }
62
+
63
+ /** Gets the size in bytes of an encoded timestamp for the given container format. */
64
+ export function getTimestampSize(container: ContainerFormat = DEFAULT_CONTAINER): number {
65
+ switch (container) {
66
+ case "legacy":
67
+ return 8;
68
+ case "raw":
69
+ return 8;
70
+ case "mmtp":
71
+ case "mmtp-fec":
72
+ return 12;
73
+ case "loc":
74
+ // [ExtID=2][ts][ExtID=4][kf]: two 1-byte IDs + a varint timestamp
75
+ // (<=8 bytes) + a 1-byte keyframe flag.
76
+ return 11;
77
+ case "fmp4":
78
+ throw new Error("fmp4 container not yet implemented");
79
+ }
80
+ }
81
+
82
+ // LEGACY VARINT IMPLEMENTATION
83
+ const MAX_U6 = 2 ** 6 - 1;
84
+ const MAX_U14 = 2 ** 14 - 1;
85
+ const MAX_U30 = 2 ** 30 - 1;
86
+ const MAX_U53 = Number.MAX_SAFE_INTEGER;
87
+
88
+ function decodeVarInt(buf: Uint8Array): [number, Uint8Array] {
89
+ const size = 1 << ((buf[0] & 0xc0) >> 6);
90
+ const view = new DataView(buf.buffer, buf.byteOffset, size);
91
+ const remain = new Uint8Array(buf.buffer, buf.byteOffset + size, buf.byteLength - size);
92
+ let v: number;
93
+ if (size === 1) {
94
+ v = buf[0] & 0x3f;
95
+ } else if (size === 2) {
96
+ v = view.getUint16(0) & 0x3fff;
97
+ } else if (size === 4) {
98
+ v = view.getUint32(0) & 0x3fffffff;
99
+ } else if (size === 8) {
100
+ v = Number(view.getBigUint64(0) & 0x3fffffffffffffffn);
101
+ } else {
102
+ throw new Error("impossible");
103
+ }
104
+ return [v, remain];
105
+ }
106
+
107
+ function encodeVarInt(v: number): Uint8Array {
108
+ if (v > MAX_U53) throw new RangeError("value too large for varint");
109
+ let size: 1 | 2 | 4 | 8;
110
+ if (v <= MAX_U6) {
111
+ size = 1;
112
+ } else if (v <= MAX_U14) {
113
+ size = 2;
114
+ } else if (v <= MAX_U30) {
115
+ size = 4;
116
+ } else {
117
+ size = 8;
118
+ }
119
+ const arr = new Uint8Array(size);
120
+ const view = new DataView(arr.buffer, arr.byteOffset, size);
121
+ const prefixMap: Record<1 | 2 | 4 | 8, number> = { 1: 0b00, 2: 0b01, 4: 0b10, 8: 0b11 };
122
+ const prefix = prefixMap[size];
123
+ if (size === 1) {
124
+ view.setUint8(0, (prefix << 6) | v);
125
+ } else if (size === 2) {
126
+ view.setUint16(0, (prefix << 14) | v);
127
+ } else if (size === 4) {
128
+ view.setUint32(0, (prefix << 30) | v);
129
+ } else if (size === 8) {
130
+ view.setBigUint64(0, (BigInt(prefix) << 62n) | BigInt(v));
131
+ }
132
+ return arr;
133
+ }
134
+
135
+ // U64 IMPLEMENTATION
136
+ function decodeU64(buf: Uint8Array): [number, Uint8Array] {
137
+ const view = new DataView(buf.buffer, buf.byteOffset, 8);
138
+ const remain = new Uint8Array(buf.buffer, buf.byteOffset + 8, buf.byteLength - 8);
139
+ const v = Number(view.getBigUint64(0));
140
+ return [v, remain];
141
+ }
142
+
143
+ function encodeU64(v: number): Uint8Array {
144
+ const arr = new Uint8Array(8);
145
+ const view = new DataView(arr.buffer, arr.byteOffset, 8);
146
+ view.setBigUint64(0, BigInt(v));
147
+ return arr;
148
+ }
149
+
150
+ // LOC TIMESTAMP IMPLEMENTATION
151
+ //
152
+ // The LOC wire format is defined by hang's `ContainerMode::Loc` encoder
153
+ // (hang-mmt-fec/rs/hang/src/container/producer.rs, the `ContainerMode::Loc`
154
+ // arm), which writes a FIXED two-pair extension header and then the payload:
155
+ //
156
+ // [ExtID=2][CaptureTimestamp_us][ExtID=4][keyframe][payload]
157
+ //
158
+ // all four fields QUIC varints. It is exactly two pairs — no count, no length,
159
+ // no terminator — so the reader is deterministic: consume four varints, and the
160
+ // payload starts at the fifth. Do NOT reintroduce a payload sniff (the removed
161
+ // `firstByte === 0x00` heuristic guessed at the boundary, which held for AVCC
162
+ // video and destroyed AAC audio, whose first byte is ID_SCE = 0x00-0x1f).
163
+ //
164
+ // A LOC track advertising `packaging: "loc"` MUST be emitted through
165
+ // `ContainerMode::Loc`. A producer that stamps the catalog but leaves the track
166
+ // in Legacy `[VarInt ts][payload]` mode is broken on the producer side — fix it
167
+ // there rather than making this reader guess which framing it was handed.
168
+
169
+ /** Number of varints in the fixed LOC extension header (2 ID/value pairs). */
170
+ const LOC_HEADER_VARINTS = 4;
171
+
172
+ /** LOC extension IDs (draft-ietf-moq-loc). */
173
+ const LOC_EXT_CAPTURE_TIMESTAMP = 2;
174
+ const LOC_EXT_VIDEO_FRAME_MARKING = 4;
175
+
176
+ /** Decode a LOC frame header.
177
+ * Returns [timestamp in microseconds, remaining payload]. */
178
+ export function decodeLocTimestamp(buffer: Uint8Array): [number, Uint8Array] {
179
+ const { timestamp, payload } = decodeLocHeader(buffer);
180
+ return [timestamp, payload];
181
+ }
182
+
183
+ // ── LOC Header Parsing ──────────────────────────────────────────────
184
+
185
+ /** Parsed LOC extension header (CaptureTimestamp + VideoFrameMarking). */
186
+ export interface LocHeader {
187
+ /** Capture timestamp in microseconds (extension ID 2). */
188
+ timestamp: number;
189
+ /** Keyframe flag (extension ID 4, bit 0). */
190
+ keyframe?: boolean;
191
+ /** Payload after the extension header (raw codec bitstream). */
192
+ payload: Uint8Array;
193
+ }
194
+
195
+ /**
196
+ * Decode the fixed LOC extension header:
197
+ * `[ExtID=2][timestamp_us][ExtID=4][keyframe][payload]`.
198
+ *
199
+ * Throws if the header is not the two pairs the producer emits — a truncated or
200
+ * mis-framed buffer is a contract break, and returning a plausible-looking
201
+ * payload from it just relocates the failure into the decoder.
202
+ */
203
+ export function decodeLocHeader(buffer: Uint8Array): LocHeader {
204
+ /** Read one varint, converting an over-run into a contract-break message. */
205
+ const readVarInt = (buf: Uint8Array, field: string): [number, Uint8Array] => {
206
+ if (buf.length === 0) {
207
+ throw new Error(
208
+ `LOC header truncated at ${field}: buffer is ${buffer.byteLength} bytes, ` +
209
+ `expected ${LOC_HEADER_VARINTS} varints`,
210
+ );
211
+ }
212
+ try {
213
+ return decodeVarInt(buf);
214
+ } catch {
215
+ // decodeVarInt builds a DataView sized by the 2-bit prefix; a short
216
+ // tail throws "Invalid DataView length" and hides what actually broke.
217
+ throw new Error(
218
+ `LOC header truncated at ${field}: ${buf.length} byte(s) remain, ` +
219
+ `too few for the declared varint width`,
220
+ );
221
+ }
222
+ };
223
+
224
+ const [tsId, afterTsId] = readVarInt(buffer, "CaptureTimestamp ID");
225
+ // Validate each ID as soon as it is read, so a Legacy-framed buffer reports
226
+ // the contract break rather than an over-run further along the walk.
227
+ if (tsId !== LOC_EXT_CAPTURE_TIMESTAMP) {
228
+ throw new Error(
229
+ `LOC header extension IDs: expected ${LOC_EXT_CAPTURE_TIMESTAMP} ` +
230
+ `(CaptureTimestamp) first, got ${tsId}. The producer is advertising ` +
231
+ `packaging="loc" but not emitting LOC framing — see ` +
232
+ `hang Avc1::set_explicit_container / Aac::set_container.`,
233
+ );
234
+ }
235
+
236
+ const [timestamp, afterTs] = readVarInt(afterTsId, "CaptureTimestamp value");
237
+ const [kfId, afterKfId] = readVarInt(afterTs, "VideoFrameMarking ID");
238
+ if (kfId !== LOC_EXT_VIDEO_FRAME_MARKING) {
239
+ throw new Error(
240
+ `LOC header extension IDs: expected ${LOC_EXT_VIDEO_FRAME_MARKING} ` +
241
+ `(VideoFrameMarking) second, got ${kfId}.`,
242
+ );
243
+ }
244
+ const [kfValue, payload] = readVarInt(afterKfId, "VideoFrameMarking value");
245
+
246
+ return { timestamp, keyframe: (kfValue & 1) === 1, payload };
247
+ }
248
+
249
+ /** Encode a LOC frame header: `[ExtID=2][timestamp_us][ExtID=4][keyframe]`. */
250
+ export function encodeLocTimestamp(timestamp: number, keyframe = false): Uint8Array {
251
+ const parts = [
252
+ encodeVarInt(LOC_EXT_CAPTURE_TIMESTAMP),
253
+ encodeVarInt(timestamp),
254
+ encodeVarInt(LOC_EXT_VIDEO_FRAME_MARKING),
255
+ encodeVarInt(keyframe ? 1 : 0),
256
+ ];
257
+ const total = parts.reduce((n, p) => n + p.length, 0);
258
+ const out = new Uint8Array(total);
259
+ let off = 0;
260
+ for (const p of parts) {
261
+ out.set(p, off);
262
+ off += p.length;
263
+ }
264
+ return out;
265
+ }
@@ -0,0 +1,189 @@
1
+ /**
2
+ * Track Pipeline Setup — shared wiring helper for both players.
3
+ *
4
+ * Provides a one-call setup that connects TrackPipeline to MediaRouter +
5
+ * MulticastManager, including the TrackSourceFactory that adapts multicast
6
+ * frames into the TrackSource interface expected by MediaRouter.setTrackSource().
7
+ *
8
+ * Usage in both moq-lib (element.ts) and moqtail (player.ts):
9
+ *
10
+ * import { setupTrackPipeline, type TrackDescriptor } from '@blockcast/mmt-container';
11
+ *
12
+ * const tracks: TrackDescriptor[] = catalog.getTracks().map(t => ({
13
+ * name: t.name,
14
+ * type: t.role as 'video' | 'audio',
15
+ * packetId: t.packetId,
16
+ * }));
17
+ *
18
+ * const { pipeline, dispose } = setupTrackPipeline({
19
+ * router,
20
+ * multicastManager: mc,
21
+ * tracks,
22
+ * preferences: transportPrefs,
23
+ * capabilities: caps,
24
+ * onTransportChange: (track, from, to) => { ... },
25
+ * });
26
+ */
27
+
28
+ import type { MediaRouter, TrackSource, MigrationPolicy, FrameKind } from './media-router.js'
29
+ import type { MulticastManager } from './multicast-manager.js'
30
+ import {
31
+ TrackPipeline,
32
+ type TrackTransport,
33
+ type TrackTransportPreference,
34
+ type TransportCapabilityReport,
35
+ } from './track-pipeline.js'
36
+
37
+ export { TrackPipeline }
38
+
39
+ /**
40
+ * Catalog-derived track descriptor. Carries the actual track type
41
+ * so the pipeline never guesses from track names.
42
+ */
43
+ export interface TrackDescriptor {
44
+ /** Track name as it appears in the catalog / MoQ namespace. */
45
+ name: string
46
+ /** Actual media type from catalog role. */
47
+ type: FrameKind
48
+ /** MMTP packet ID (used for MulticastManager per-track callbacks). */
49
+ packetId?: number
50
+ }
51
+
52
+ export interface SetupTrackPipelineOptions {
53
+ /** MediaRouter instance (already wired to decoder backends). */
54
+ router: MediaRouter
55
+ /** MulticastManager instance (already joined or about to join). */
56
+ multicastManager: MulticastManager
57
+ /** Catalog-derived track descriptors. */
58
+ tracks: TrackDescriptor[]
59
+ /** Per-track transport preferences. */
60
+ preferences?: TrackTransportPreference[]
61
+ /** Initial capability snapshot (optional; call pipeline.updateCapabilities later). */
62
+ capabilities?: TransportCapabilityReport
63
+ /** Called after each per-track transport switch. */
64
+ onTransportChange?: (
65
+ trackName: string,
66
+ from: TrackTransport | null,
67
+ to: TrackTransport,
68
+ policy: MigrationPolicy,
69
+ ) => void
70
+ }
71
+
72
+ export interface SetupTrackPipelineResult {
73
+ pipeline: TrackPipeline
74
+ /** Call to tear down the pipeline and all per-track sources. */
75
+ dispose: () => void
76
+ }
77
+
78
+ /**
79
+ * Create and wire a TrackPipeline into existing MediaRouter + MulticastManager.
80
+ *
81
+ * The factory creates TrackSource adapters that:
82
+ * - For 'multicast': subscribe to MulticastManager's per-track frame callbacks
83
+ * and forward through the TrackSource.onFrame interface.
84
+ * - For 'amt': same as multicast (AMT packets flow through MulticastManager.feedPacket).
85
+ * - For 'moq': no per-track source needed (MoQ is the default binary path).
86
+ */
87
+ export function setupTrackPipeline(opts: SetupTrackPipelineOptions): SetupTrackPipelineResult {
88
+ const { router, multicastManager, tracks, preferences, capabilities, onTransportChange } = opts
89
+
90
+ // Build lookup: trackName → TrackDescriptor
91
+ const trackMap = new Map<string, TrackDescriptor>()
92
+ for (const t of tracks) {
93
+ trackMap.set(t.name, t)
94
+ }
95
+
96
+ const pipeline = new TrackPipeline(router)
97
+
98
+ // Register the TrackSource factory that bridges MulticastManager → TrackSource.
99
+ // Uses TrackDescriptor.type and .packetId — never guesses from track names.
100
+ pipeline.setSourceFactory((trackName: string, transport: TrackTransport): TrackSource | null => {
101
+ if (transport === 'moq') return null // MoQ is default binary path
102
+
103
+ const desc = trackMap.get(trackName)
104
+ if (!desc) {
105
+ console.warn(`[TrackPipeline] Unknown track "${trackName}" — no descriptor registered`)
106
+ return null
107
+ }
108
+
109
+ // Both 'multicast' and 'amt' route through MulticastManager
110
+ // (AMT packets arrive via feedPacket → same MmtpRouter pipeline)
111
+ return createMulticastTrackSource(multicastManager, desc)
112
+ })
113
+
114
+ if (onTransportChange) {
115
+ pipeline.onTransportChange(onTransportChange)
116
+ }
117
+
118
+ if (preferences) {
119
+ pipeline.setPreferences(preferences)
120
+ }
121
+
122
+ if (capabilities) {
123
+ pipeline.updateCapabilities(capabilities)
124
+ }
125
+
126
+ return {
127
+ pipeline,
128
+ dispose: () => pipeline.dispose(),
129
+ }
130
+ }
131
+
132
+ /**
133
+ * Create a TrackSource adapter that bridges MulticastManager frame callbacks
134
+ * into the TrackSource interface expected by MediaRouter.setTrackSource().
135
+ *
136
+ * Routes using the track descriptor's type and packetId — never name-based.
137
+ * If packetId is available, uses the specific onTrackFrame(packetId) callback
138
+ * for precise per-track routing. Falls back to onVideoFrame/onAudioFrame
139
+ * based on descriptor type.
140
+ */
141
+ function createMulticastTrackSource(
142
+ manager: MulticastManager,
143
+ desc: TrackDescriptor,
144
+ ): TrackSource {
145
+ let frameCb: ((data: Uint8Array, meta: { timestamp: number; keyframe: boolean }) => void) | null = null
146
+ let errorCb: (() => void) | null = null
147
+ let wired = false
148
+
149
+ return {
150
+ name: desc.name,
151
+
152
+ onFrame(cb) {
153
+ frameCb = cb
154
+
155
+ if (!wired) {
156
+ wired = true
157
+
158
+ if (desc.packetId != null) {
159
+ // Precise per-packetId routing (preferred)
160
+ manager.onTrackFrame(desc.packetId, (data, meta) => {
161
+ frameCb?.(data, meta)
162
+ })
163
+ } else if (desc.type === 'video') {
164
+ manager.onVideoFrame((data, meta) => {
165
+ frameCb?.(data, meta)
166
+ })
167
+ } else if (desc.type === 'audio') {
168
+ manager.onAudioFrame((data, meta) => {
169
+ frameCb?.(data, meta)
170
+ })
171
+ }
172
+ }
173
+
174
+ return () => { frameCb = null }
175
+ },
176
+
177
+ onError(cb) {
178
+ errorCb = cb
179
+ manager.onFailback(() => { errorCb?.() })
180
+ return () => { errorCb = null }
181
+ },
182
+
183
+ dispose() {
184
+ frameCb = null
185
+ errorCb = null
186
+ wired = false
187
+ },
188
+ }
189
+ }