@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,688 @@
1
+ /**
2
+ * Strict ISO-BMFF timing extraction for the timed-MFU browser path.
3
+ *
4
+ * This intentionally implements only the current single-track MMT profile:
5
+ * one media track in FT=0, and one matching traf/trun in each FT=1. It does
6
+ * not infer timing from packet arrival, MMTP send timestamps, or cadence.
7
+ */
8
+
9
+ const U64_MAX = 0xffff_ffff_ffff_ffffn
10
+ const I64_MIN = -0x8000_0000_0000_0000n
11
+ const I64_MAX = 0x7fff_ffff_ffff_ffffn
12
+ const MICROSECONDS_PER_SECOND = 1_000_000n
13
+
14
+ const TFHD_BASE_DATA_OFFSET_PRESENT = 0x000001
15
+ const TFHD_SAMPLE_DESCRIPTION_INDEX_PRESENT = 0x000002
16
+ const TFHD_DEFAULT_SAMPLE_DURATION_PRESENT = 0x000008
17
+ const TFHD_DEFAULT_SAMPLE_SIZE_PRESENT = 0x000010
18
+ const TFHD_DEFAULT_SAMPLE_FLAGS_PRESENT = 0x000020
19
+ const TFHD_DURATION_IS_EMPTY = 0x010000
20
+ const TFHD_DEFAULT_BASE_IS_MOOF = 0x020000
21
+ const TFHD_KNOWN_FLAGS =
22
+ TFHD_BASE_DATA_OFFSET_PRESENT |
23
+ TFHD_SAMPLE_DESCRIPTION_INDEX_PRESENT |
24
+ TFHD_DEFAULT_SAMPLE_DURATION_PRESENT |
25
+ TFHD_DEFAULT_SAMPLE_SIZE_PRESENT |
26
+ TFHD_DEFAULT_SAMPLE_FLAGS_PRESENT |
27
+ TFHD_DURATION_IS_EMPTY |
28
+ TFHD_DEFAULT_BASE_IS_MOOF
29
+
30
+ const TRUN_DATA_OFFSET_PRESENT = 0x000001
31
+ const TRUN_FIRST_SAMPLE_FLAGS_PRESENT = 0x000004
32
+ const TRUN_SAMPLE_DURATION_PRESENT = 0x000100
33
+ const TRUN_SAMPLE_SIZE_PRESENT = 0x000200
34
+ const TRUN_SAMPLE_FLAGS_PRESENT = 0x000400
35
+ const TRUN_SAMPLE_CTS_OFFSET_PRESENT = 0x000800
36
+ const TRUN_KNOWN_FLAGS =
37
+ TRUN_DATA_OFFSET_PRESENT |
38
+ TRUN_FIRST_SAMPLE_FLAGS_PRESENT |
39
+ TRUN_SAMPLE_DURATION_PRESENT |
40
+ TRUN_SAMPLE_SIZE_PRESENT |
41
+ TRUN_SAMPLE_FLAGS_PRESENT |
42
+ TRUN_SAMPLE_CTS_OFFSET_PRESENT
43
+
44
+ export interface IsoBmffTrackTiming {
45
+ trackId: number
46
+ timescale: number
47
+ defaultSampleDuration?: number
48
+ defaultSampleSize?: number
49
+ }
50
+
51
+ export interface IsoBmffSampleTiming {
52
+ /** Exact decode time in mdhd timescale units. */
53
+ decodeTime: bigint
54
+ /** Exact presentation time in mdhd timescale units, including signed CTS. */
55
+ presentationTime: bigint
56
+ /** Exact authored duration in mdhd timescale units. */
57
+ duration: number
58
+ timescale: number
59
+ /** Exact elementary-stream sample size declared by trun/tfhd/trex. */
60
+ size: number
61
+ /** Byte position of the sample relative to the beginning of the moof. */
62
+ bytePosition: bigint
63
+ }
64
+
65
+ export interface IsoBmffMovieFragmentTiming {
66
+ movieFragmentSequenceNumber: number
67
+ samples: readonly IsoBmffSampleTiming[]
68
+ }
69
+
70
+ interface IsoBox {
71
+ type: string
72
+ start: number
73
+ bodyStart: number
74
+ end: number
75
+ }
76
+
77
+ interface FullBox {
78
+ version: number
79
+ flags: number
80
+ bodyStart: number
81
+ }
82
+
83
+ interface ParsedTrack {
84
+ trackId: number
85
+ handlerType: string
86
+ timescale: number
87
+ hasEdits: boolean
88
+ }
89
+
90
+ interface ParsedTfhd {
91
+ trackId: number
92
+ defaultSampleDuration?: number
93
+ defaultSampleSize?: number
94
+ }
95
+
96
+ interface MdatLayout {
97
+ dataStart: bigint
98
+ declaredEnd: bigint
99
+ }
100
+
101
+ function view(data: Uint8Array): DataView {
102
+ return new DataView(data.buffer, data.byteOffset, data.byteLength)
103
+ }
104
+
105
+ function boxType(data: Uint8Array, offset: number): string {
106
+ return String.fromCharCode(
107
+ data[offset]!,
108
+ data[offset + 1]!,
109
+ data[offset + 2]!,
110
+ data[offset + 3]!,
111
+ )
112
+ }
113
+
114
+ function readU64(data: Uint8Array, offset: number): bigint | null {
115
+ if (offset < 0 || offset + 8 > data.length) return null
116
+ const dataView = view(data)
117
+ return (BigInt(dataView.getUint32(offset, false)) << 32n) |
118
+ BigInt(dataView.getUint32(offset + 4, false))
119
+ }
120
+
121
+ function parseBox(data: Uint8Array, start: number, limit: number): IsoBox | null {
122
+ if (start < 0 || limit > data.length || start + 8 > limit) return null
123
+ const dataView = view(data)
124
+ const shortSize = dataView.getUint32(start, false)
125
+ let headerSize = 8
126
+ let size: number
127
+ if (shortSize === 0) {
128
+ size = limit - start
129
+ } else if (shortSize === 1) {
130
+ if (start + 16 > limit) return null
131
+ const extendedSize = readU64(data, start + 8)
132
+ if (extendedSize === null || extendedSize > BigInt(Number.MAX_SAFE_INTEGER)) return null
133
+ headerSize = 16
134
+ size = Number(extendedSize)
135
+ } else {
136
+ size = shortSize
137
+ }
138
+ if (size < headerSize || start + size > limit) return null
139
+ return {
140
+ type: boxType(data, start + 4),
141
+ start,
142
+ bodyStart: start + headerSize,
143
+ end: start + size,
144
+ }
145
+ }
146
+
147
+ function parseBoxes(data: Uint8Array, start: number, end: number): IsoBox[] | null {
148
+ if (start < 0 || end < start || end > data.length) return null
149
+ const boxes: IsoBox[] = []
150
+ let offset = start
151
+ while (offset < end) {
152
+ const box = parseBox(data, offset, end)
153
+ if (!box || box.end <= offset) return null
154
+ boxes.push(box)
155
+ offset = box.end
156
+ }
157
+ return offset === end ? boxes : null
158
+ }
159
+
160
+ function children(data: Uint8Array, parent: IsoBox): IsoBox[] | null {
161
+ return parseBoxes(data, parent.bodyStart, parent.end)
162
+ }
163
+
164
+ function exactlyOne(boxes: readonly IsoBox[], type: string): IsoBox | null {
165
+ const matches = boxes.filter(box => box.type === type)
166
+ return matches.length === 1 ? matches[0]! : null
167
+ }
168
+
169
+ function parseFullBox(data: Uint8Array, box: IsoBox): FullBox | null {
170
+ if (box.bodyStart + 4 > box.end) return null
171
+ const versionAndFlags = view(data).getUint32(box.bodyStart, false)
172
+ return {
173
+ version: versionAndFlags >>> 24,
174
+ flags: versionAndFlags & 0x00ff_ffff,
175
+ bodyStart: box.bodyStart + 4,
176
+ }
177
+ }
178
+
179
+ function parseTkhdTrackId(data: Uint8Array, box: IsoBox): number | null {
180
+ const full = parseFullBox(data, box)
181
+ if (!full || full.flags & ~0x00000f) return null
182
+ const bodyLength = box.end - full.bodyStart
183
+ const trackIdOffset = full.version === 0
184
+ ? full.bodyStart + 8
185
+ : full.version === 1
186
+ ? full.bodyStart + 16
187
+ : -1
188
+ const expectedBodyLength = full.version === 0 ? 80 : full.version === 1 ? 92 : -1
189
+ if (trackIdOffset < 0 || bodyLength !== expectedBodyLength) return null
190
+ return view(data).getUint32(trackIdOffset, false)
191
+ }
192
+
193
+ function parseMdhdTimescale(data: Uint8Array, box: IsoBox): number | null {
194
+ const full = parseFullBox(data, box)
195
+ if (!full || full.flags !== 0) return null
196
+ const bodyLength = box.end - full.bodyStart
197
+ const timescaleOffset = full.version === 0
198
+ ? full.bodyStart + 8
199
+ : full.version === 1
200
+ ? full.bodyStart + 16
201
+ : -1
202
+ const expectedBodyLength = full.version === 0 ? 20 : full.version === 1 ? 32 : -1
203
+ if (timescaleOffset < 0 || bodyLength !== expectedBodyLength) return null
204
+ return view(data).getUint32(timescaleOffset, false)
205
+ }
206
+
207
+ function parseHandlerType(data: Uint8Array, box: IsoBox): string | null {
208
+ const full = parseFullBox(data, box)
209
+ if (!full || full.version !== 0 || full.flags !== 0 || full.bodyStart + 20 > box.end) {
210
+ return null
211
+ }
212
+ return boxType(data, full.bodyStart + 4)
213
+ }
214
+
215
+ function editListHasEntries(data: Uint8Array, box: IsoBox): boolean | null {
216
+ const full = parseFullBox(data, box)
217
+ if (!full || full.flags !== 0 || (full.version !== 0 && full.version !== 1)) return null
218
+ if (full.bodyStart + 4 > box.end) return null
219
+ const entryCount = view(data).getUint32(full.bodyStart, false)
220
+ const entrySize = full.version === 0 ? 12 : 20
221
+ const expectedEnd = full.bodyStart + 4 + entryCount * entrySize
222
+ if (!Number.isSafeInteger(expectedEnd) || expectedEnd !== box.end) return null
223
+ return entryCount !== 0
224
+ }
225
+
226
+ function parseTrack(data: Uint8Array, trak: IsoBox): ParsedTrack | null {
227
+ const trakChildren = children(data, trak)
228
+ if (!trakChildren) return null
229
+ const tkhd = exactlyOne(trakChildren, 'tkhd')
230
+ const mdia = exactlyOne(trakChildren, 'mdia')
231
+ if (!tkhd || !mdia) return null
232
+ const trackId = parseTkhdTrackId(data, tkhd)
233
+ if (trackId === null || trackId === 0) return null
234
+
235
+ const mdiaChildren = children(data, mdia)
236
+ if (!mdiaChildren) return null
237
+ const mdhd = exactlyOne(mdiaChildren, 'mdhd')
238
+ const hdlr = exactlyOne(mdiaChildren, 'hdlr')
239
+ if (!mdhd || !hdlr) return null
240
+ const timescale = parseMdhdTimescale(data, mdhd)
241
+ const handlerType = parseHandlerType(data, hdlr)
242
+ if (timescale === null || timescale === 0 || handlerType === null) return null
243
+
244
+ const edtsBoxes = trakChildren.filter(box => box.type === 'edts')
245
+ if (edtsBoxes.length > 1) return null
246
+ let hasEdits = false
247
+ if (edtsBoxes.length === 1) {
248
+ const edtsChildren = children(data, edtsBoxes[0]!)
249
+ if (!edtsChildren) return null
250
+ const editLists = edtsChildren.filter(box => box.type === 'elst')
251
+ if (editLists.length > 1) return null
252
+ if (editLists.length === 1) {
253
+ const result = editListHasEntries(data, editLists[0]!)
254
+ if (result === null) return null
255
+ hasEdits = result
256
+ }
257
+ }
258
+
259
+ return { trackId, handlerType, timescale, hasEdits }
260
+ }
261
+
262
+ function parseTrex(data: Uint8Array, box: IsoBox): IsoBmffTrackTiming | null {
263
+ const full = parseFullBox(data, box)
264
+ if (!full || full.version !== 0 || full.flags !== 0 || box.end - full.bodyStart !== 20) {
265
+ return null
266
+ }
267
+ const dataView = view(data)
268
+ const trackId = dataView.getUint32(full.bodyStart, false)
269
+ const defaultSampleDuration = dataView.getUint32(full.bodyStart + 8, false)
270
+ const defaultSampleSize = dataView.getUint32(full.bodyStart + 12, false)
271
+ return {
272
+ trackId,
273
+ timescale: 0,
274
+ ...(defaultSampleDuration === 0 ? {} : { defaultSampleDuration }),
275
+ ...(defaultSampleSize === 0 ? {} : { defaultSampleSize }),
276
+ }
277
+ }
278
+
279
+ export function parseIsoBmffInitializationTiming(
280
+ data: Uint8Array,
281
+ ): IsoBmffTrackTiming | null {
282
+ const topLevel = parseBoxes(data, 0, data.length)
283
+ if (!topLevel) return null
284
+ const ftyp = exactlyOne(topLevel, 'ftyp')
285
+ const moov = exactlyOne(topLevel, 'moov')
286
+ if (!ftyp || !moov || ftyp.start > moov.start) return null
287
+ if (topLevel.some(box => box.type === 'moof' || box.type === 'mdat')) return null
288
+
289
+ const moovChildren = children(data, moov)
290
+ if (!moovChildren) return null
291
+ const parsedTracks: ParsedTrack[] = []
292
+ for (const trak of moovChildren.filter(box => box.type === 'trak')) {
293
+ const parsed = parseTrack(data, trak)
294
+ if (!parsed) return null
295
+ parsedTracks.push(parsed)
296
+ }
297
+ const mediaTracks = parsedTracks.filter(
298
+ track => track.handlerType === 'vide' || track.handlerType === 'soun',
299
+ )
300
+ if (mediaTracks.length !== 1) return null
301
+ const mediaTrack = mediaTracks[0]!
302
+ if (mediaTrack.hasEdits) return null
303
+
304
+ const mvex = exactlyOne(moovChildren, 'mvex')
305
+ if (!mvex) return null
306
+ const mvexChildren = children(data, mvex)
307
+ if (!mvexChildren) return null
308
+ const trexEntries: IsoBmffTrackTiming[] = []
309
+ for (const trexBox of mvexChildren.filter(box => box.type === 'trex')) {
310
+ const trex = parseTrex(data, trexBox)
311
+ if (!trex) return null
312
+ trexEntries.push(trex)
313
+ }
314
+ const matchingTrex = trexEntries.filter(trex => trex.trackId === mediaTrack.trackId)
315
+ if (matchingTrex.length !== 1) return null
316
+ const trex = matchingTrex[0]!
317
+ return {
318
+ trackId: mediaTrack.trackId,
319
+ timescale: mediaTrack.timescale,
320
+ ...(trex.defaultSampleDuration === undefined
321
+ ? {}
322
+ : { defaultSampleDuration: trex.defaultSampleDuration }),
323
+ ...(trex.defaultSampleSize === undefined
324
+ ? {}
325
+ : { defaultSampleSize: trex.defaultSampleSize }),
326
+ }
327
+ }
328
+
329
+ function parseMfhdSequence(data: Uint8Array, box: IsoBox): number | null {
330
+ const full = parseFullBox(data, box)
331
+ if (!full || full.version !== 0 || full.flags !== 0 || box.end - full.bodyStart !== 4) {
332
+ return null
333
+ }
334
+ return view(data).getUint32(full.bodyStart, false)
335
+ }
336
+
337
+ function parseTfhd(data: Uint8Array, box: IsoBox): ParsedTfhd | null {
338
+ const full = parseFullBox(data, box)
339
+ if (!full || full.version !== 0 || (full.flags & ~TFHD_KNOWN_FLAGS) !== 0) return null
340
+ if ((full.flags & TFHD_BASE_DATA_OFFSET_PRESENT) !== 0 ||
341
+ (full.flags & TFHD_DEFAULT_BASE_IS_MOOF) === 0 ||
342
+ (full.flags & TFHD_DURATION_IS_EMPTY) !== 0) {
343
+ return null
344
+ }
345
+ const dataView = view(data)
346
+ let offset = full.bodyStart
347
+ if (offset + 4 > box.end) return null
348
+ const trackId = dataView.getUint32(offset, false)
349
+ offset += 4
350
+ if ((full.flags & TFHD_SAMPLE_DESCRIPTION_INDEX_PRESENT) !== 0) {
351
+ if (offset + 4 > box.end) return null
352
+ offset += 4
353
+ }
354
+ let defaultSampleDuration: number | undefined
355
+ if ((full.flags & TFHD_DEFAULT_SAMPLE_DURATION_PRESENT) !== 0) {
356
+ if (offset + 4 > box.end) return null
357
+ defaultSampleDuration = dataView.getUint32(offset, false)
358
+ offset += 4
359
+ }
360
+ let defaultSampleSize: number | undefined
361
+ if ((full.flags & TFHD_DEFAULT_SAMPLE_SIZE_PRESENT) !== 0) {
362
+ if (offset + 4 > box.end) return null
363
+ defaultSampleSize = dataView.getUint32(offset, false)
364
+ offset += 4
365
+ }
366
+ if ((full.flags & TFHD_DEFAULT_SAMPLE_FLAGS_PRESENT) !== 0) {
367
+ if (offset + 4 > box.end) return null
368
+ offset += 4
369
+ }
370
+ if (offset !== box.end) return null
371
+ return {
372
+ trackId,
373
+ ...(defaultSampleDuration === undefined ? {} : { defaultSampleDuration }),
374
+ ...(defaultSampleSize === undefined ? {} : { defaultSampleSize }),
375
+ }
376
+ }
377
+
378
+ function parseTfdt(data: Uint8Array, box: IsoBox): bigint | null {
379
+ const full = parseFullBox(data, box)
380
+ if (!full || full.flags !== 0) return null
381
+ if (full.version === 0 && box.end - full.bodyStart === 4) {
382
+ return BigInt(view(data).getUint32(full.bodyStart, false))
383
+ }
384
+ if (full.version === 1 && box.end - full.bodyStart === 8) {
385
+ return readU64(data, full.bodyStart)
386
+ }
387
+ return null
388
+ }
389
+
390
+ function parseMdatLayout(data: Uint8Array, offset: number): MdatLayout | null {
391
+ if (offset < 0 || offset + 8 > data.length || boxType(data, offset + 4) !== 'mdat') return null
392
+ const dataView = view(data)
393
+ const shortSize = dataView.getUint32(offset, false)
394
+ let headerSize = 8
395
+ let declaredSize: bigint
396
+ if (shortSize === 0) {
397
+ return null
398
+ } else if (shortSize === 1) {
399
+ const extended = readU64(data, offset + 8)
400
+ if (extended === null) return null
401
+ headerSize = 16
402
+ declaredSize = extended
403
+ } else {
404
+ declaredSize = BigInt(shortSize)
405
+ }
406
+ if (declaredSize < BigInt(headerSize) || declaredSize < BigInt(data.length - offset)) {
407
+ return null
408
+ }
409
+ const declaredEnd = BigInt(offset) + declaredSize
410
+ if (declaredEnd > U64_MAX) return null
411
+ return { dataStart: BigInt(offset + headerSize), declaredEnd }
412
+ }
413
+
414
+ function resolvedDefault(
415
+ entryValue: number | undefined,
416
+ tfhdValue: number | undefined,
417
+ trexValue: number | undefined,
418
+ ): number | null {
419
+ const value = entryValue ?? tfhdValue ?? trexValue
420
+ return value === undefined || value === 0 ? null : value
421
+ }
422
+
423
+ function parseTrunSamples(
424
+ data: Uint8Array,
425
+ box: IsoBox,
426
+ moofStart: number,
427
+ baseDecodeTime: bigint,
428
+ tfhd: ParsedTfhd,
429
+ track: IsoBmffTrackTiming,
430
+ mdat: MdatLayout,
431
+ maxSamples: number,
432
+ ): IsoBmffSampleTiming[] | null {
433
+ const full = parseFullBox(data, box)
434
+ if (!full || (full.version !== 0 && full.version !== 1) ||
435
+ (full.flags & ~TRUN_KNOWN_FLAGS) !== 0 ||
436
+ (full.flags & TRUN_DATA_OFFSET_PRESENT) === 0 ||
437
+ ((full.flags & TRUN_FIRST_SAMPLE_FLAGS_PRESENT) !== 0 &&
438
+ (full.flags & TRUN_SAMPLE_FLAGS_PRESENT) !== 0)) {
439
+ return null
440
+ }
441
+ const dataView = view(data)
442
+ let offset = full.bodyStart
443
+ if (offset + 8 > box.end) return null
444
+ const sampleCount = dataView.getUint32(offset, false)
445
+ offset += 4
446
+ if (sampleCount === 0 || sampleCount > maxSamples) return null
447
+ const relativeDataOffset = dataView.getInt32(offset, false)
448
+ offset += 4
449
+ if (relativeDataOffset < 0) return null
450
+ const dataOffset = BigInt(relativeDataOffset)
451
+ const absoluteDataOffset = BigInt(moofStart) + dataOffset
452
+ if (absoluteDataOffset > BigInt(data.length) || absoluteDataOffset < mdat.dataStart) return null
453
+ if ((full.flags & TRUN_FIRST_SAMPLE_FLAGS_PRESENT) !== 0) {
454
+ if (offset + 4 > box.end) return null
455
+ offset += 4
456
+ }
457
+
458
+ let decodeTime = baseDecodeTime
459
+ let bytePosition = dataOffset
460
+ const samples: IsoBmffSampleTiming[] = []
461
+ for (let index = 0; index < sampleCount; index++) {
462
+ let entryDuration: number | undefined
463
+ if ((full.flags & TRUN_SAMPLE_DURATION_PRESENT) !== 0) {
464
+ if (offset + 4 > box.end) return null
465
+ entryDuration = dataView.getUint32(offset, false)
466
+ offset += 4
467
+ }
468
+ let entrySize: number | undefined
469
+ if ((full.flags & TRUN_SAMPLE_SIZE_PRESENT) !== 0) {
470
+ if (offset + 4 > box.end) return null
471
+ entrySize = dataView.getUint32(offset, false)
472
+ offset += 4
473
+ }
474
+ if ((full.flags & TRUN_SAMPLE_FLAGS_PRESENT) !== 0) {
475
+ if (offset + 4 > box.end) return null
476
+ offset += 4
477
+ }
478
+ let compositionOffset = 0
479
+ if ((full.flags & TRUN_SAMPLE_CTS_OFFSET_PRESENT) !== 0) {
480
+ if (offset + 4 > box.end) return null
481
+ compositionOffset = full.version === 1
482
+ ? dataView.getInt32(offset, false)
483
+ : dataView.getUint32(offset, false)
484
+ offset += 4
485
+ }
486
+ if (offset > box.end) return null
487
+
488
+ const duration = resolvedDefault(
489
+ entryDuration,
490
+ tfhd.defaultSampleDuration,
491
+ track.defaultSampleDuration,
492
+ )
493
+ const size = resolvedDefault(entrySize, tfhd.defaultSampleSize, track.defaultSampleSize)
494
+ if (duration === null || size === null) return null
495
+ const sampleEnd = bytePosition + BigInt(size)
496
+ const absoluteSampleEnd = BigInt(moofStart) + sampleEnd
497
+ if (absoluteSampleEnd > mdat.declaredEnd || absoluteSampleEnd > U64_MAX) return null
498
+ const presentationTime = decodeTime + BigInt(compositionOffset)
499
+ if (presentationTime < I64_MIN || presentationTime > I64_MAX) return null
500
+ samples.push({
501
+ decodeTime,
502
+ presentationTime,
503
+ duration,
504
+ timescale: track.timescale,
505
+ size,
506
+ bytePosition,
507
+ })
508
+ decodeTime += BigInt(duration)
509
+ if (decodeTime > U64_MAX) return null
510
+ bytePosition = sampleEnd
511
+ }
512
+ return offset === box.end ? samples : null
513
+ }
514
+
515
+ export function parseIsoBmffMovieFragmentTiming(
516
+ data: Uint8Array,
517
+ track: IsoBmffTrackTiming,
518
+ maxSamples: number,
519
+ ): IsoBmffMovieFragmentTiming | null {
520
+ if (!Number.isInteger(maxSamples) || maxSamples <= 0) return null
521
+ const first = parseBox(data, 0, data.length)
522
+ if (!first) return null
523
+ const moof = first.type === 'styp'
524
+ ? parseBox(data, first.end, data.length)
525
+ : first
526
+ if (!moof || moof.type !== 'moof' || moof.end >= data.length) return null
527
+ const moofChildren = children(data, moof)
528
+ if (!moofChildren) return null
529
+ const mfhd = exactlyOne(moofChildren, 'mfhd')
530
+ const traf = exactlyOne(moofChildren, 'traf')
531
+ if (!mfhd || !traf) return null
532
+ const movieFragmentSequenceNumber = parseMfhdSequence(data, mfhd)
533
+ if (movieFragmentSequenceNumber === null || movieFragmentSequenceNumber === 0) return null
534
+
535
+ const trafChildren = children(data, traf)
536
+ if (!trafChildren) return null
537
+ const tfhdBox = exactlyOne(trafChildren, 'tfhd')
538
+ const tfdtBox = exactlyOne(trafChildren, 'tfdt')
539
+ const trunBox = exactlyOne(trafChildren, 'trun')
540
+ if (!tfhdBox || !tfdtBox || !trunBox) return null
541
+ const tfhd = parseTfhd(data, tfhdBox)
542
+ const baseDecodeTime = parseTfdt(data, tfdtBox)
543
+ if (!tfhd || tfhd.trackId !== track.trackId || baseDecodeTime === null) return null
544
+ const mdat = parseMdatLayout(data, moof.end)
545
+ if (!mdat) return null
546
+ const samples = parseTrunSamples(
547
+ data,
548
+ trunBox,
549
+ moof.start,
550
+ baseDecodeTime,
551
+ tfhd,
552
+ track,
553
+ mdat,
554
+ maxSamples,
555
+ )
556
+ if (!samples) return null
557
+ return { movieFragmentSequenceNumber, samples }
558
+ }
559
+
560
+ function sameTrack(a: IsoBmffTrackTiming, b: IsoBmffTrackTiming): boolean {
561
+ return a.trackId === b.trackId &&
562
+ a.timescale === b.timescale &&
563
+ a.defaultSampleDuration === b.defaultSampleDuration &&
564
+ a.defaultSampleSize === b.defaultSampleSize
565
+ }
566
+
567
+ function sameSample(a: IsoBmffSampleTiming, b: IsoBmffSampleTiming): boolean {
568
+ return a.decodeTime === b.decodeTime &&
569
+ a.presentationTime === b.presentationTime &&
570
+ a.duration === b.duration &&
571
+ a.timescale === b.timescale &&
572
+ a.size === b.size &&
573
+ a.bytePosition === b.bytePosition
574
+ }
575
+
576
+ type PendingMovieFragment = Array<IsoBmffSampleTiming | null>
577
+
578
+ /** Bounded per-track FT=0/FT=1 timing state. */
579
+ export class IsoBmffTimingResolver {
580
+ #track: IsoBmffTrackTiming | null = null
581
+ #fragments = new Map<string, PendingMovieFragment>()
582
+ #pendingSamples = 0
583
+
584
+ constructor(readonly maxPendingSamples: number) {
585
+ if (!Number.isInteger(maxPendingSamples) || maxPendingSamples <= 0) {
586
+ throw new Error('[IsoBmffTimingResolver] maxPendingSamples must be a positive integer')
587
+ }
588
+ }
589
+
590
+ get pendingSampleCount(): number {
591
+ return this.#pendingSamples
592
+ }
593
+
594
+ addInitialization(data: Uint8Array): boolean {
595
+ const timing = parseIsoBmffInitializationTiming(data)
596
+ if (!timing) return false
597
+ if (this.#track) return sameTrack(this.#track, timing)
598
+ this.#track = timing
599
+ return true
600
+ }
601
+
602
+ addMovieFragment(
603
+ mpuSequenceNumber: number,
604
+ data: Uint8Array,
605
+ additionalSampleLimit = this.maxPendingSamples,
606
+ ): boolean {
607
+ if (!Number.isInteger(additionalSampleLimit) || additionalSampleLimit < 0) return false
608
+ if (!this.#track || !isU32(mpuSequenceNumber)) return false
609
+ const parsed = parseIsoBmffMovieFragmentTiming(
610
+ data,
611
+ this.#track,
612
+ this.maxPendingSamples,
613
+ )
614
+ if (!parsed) return false
615
+ const key = fragmentKey(mpuSequenceNumber, parsed.movieFragmentSequenceNumber)
616
+ const existing = this.#fragments.get(key)
617
+ if (existing) {
618
+ return existing.length === parsed.samples.length && existing.every(
619
+ (sample, index) => sample !== null && sameSample(sample, parsed.samples[index]!),
620
+ )
621
+ }
622
+ if (parsed.samples.length > additionalSampleLimit) return false
623
+ if (this.#pendingSamples + parsed.samples.length > this.maxPendingSamples) return false
624
+ this.#fragments.set(key, [...parsed.samples])
625
+ this.#pendingSamples += parsed.samples.length
626
+ return true
627
+ }
628
+
629
+ sampleTiming(
630
+ mpuSequenceNumber: number,
631
+ movieFragmentSequenceNumber: number,
632
+ sampleNumber: number,
633
+ ): IsoBmffSampleTiming | null {
634
+ if (!isU32(mpuSequenceNumber) || !isU32(movieFragmentSequenceNumber) ||
635
+ movieFragmentSequenceNumber === 0 || !isU32(sampleNumber) || sampleNumber === 0) {
636
+ return null
637
+ }
638
+ const samples = this.#fragments.get(
639
+ fragmentKey(mpuSequenceNumber, movieFragmentSequenceNumber),
640
+ )
641
+ return samples?.[sampleNumber - 1] ?? null
642
+ }
643
+
644
+ consumeSample(
645
+ mpuSequenceNumber: number,
646
+ movieFragmentSequenceNumber: number,
647
+ sampleNumber: number,
648
+ expected: IsoBmffSampleTiming,
649
+ ): boolean {
650
+ const key = fragmentKey(mpuSequenceNumber, movieFragmentSequenceNumber)
651
+ const samples = this.#fragments.get(key)
652
+ const index = sampleNumber - 1
653
+ const sample = samples?.[index]
654
+ if (!samples || !sample || !sameSample(sample, expected)) return false
655
+ samples[index] = null
656
+ this.#pendingSamples--
657
+ if (samples.every(value => value === null)) this.#fragments.delete(key)
658
+ return true
659
+ }
660
+
661
+ reset(): void {
662
+ this.#track = null
663
+ this.#fragments.clear()
664
+ this.#pendingSamples = 0
665
+ }
666
+ }
667
+
668
+ function fragmentKey(mpuSequenceNumber: number, movieFragmentSequenceNumber: number): string {
669
+ return `${mpuSequenceNumber}:${movieFragmentSequenceNumber}`
670
+ }
671
+
672
+ function isU32(value: number): boolean {
673
+ return Number.isInteger(value) && value >= 0 && value <= 0xffff_ffff
674
+ }
675
+
676
+ /** Convert exact media ticks to microseconds without first narrowing the ticks. */
677
+ export function mediaTicksToMicroseconds(ticks: bigint, timescale: number): number | null {
678
+ if (!Number.isInteger(timescale) || timescale <= 0) return null
679
+ const numerator = ticks * MICROSECONDS_PER_SECOND
680
+ const scale = BigInt(timescale)
681
+ const whole = numerator / scale
682
+ const remainder = numerator % scale
683
+ if (whole < BigInt(Number.MIN_SAFE_INTEGER) || whole > BigInt(Number.MAX_SAFE_INTEGER)) {
684
+ return null
685
+ }
686
+ const result = Number(whole) + Number(remainder) / timescale
687
+ return Number.isFinite(result) ? result : null
688
+ }