@blockcast/mmt-container 0.1.0-main.0399efef1f07

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 (694) 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 +152 -0
  6. package/dist/align.d.ts.map +1 -0
  7. package/dist/align.js +88 -0
  8. package/dist/align.js.map +7 -0
  9. package/dist/audio-init-parser.d.ts +66 -0
  10. package/dist/audio-init-parser.d.ts.map +1 -0
  11. package/dist/audio-init-parser.js +118 -0
  12. package/dist/audio-init-parser.js.map +7 -0
  13. package/dist/audio-ring-buffer.d.ts +50 -0
  14. package/dist/audio-ring-buffer.d.ts.map +1 -0
  15. package/dist/audio-ring-buffer.js +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 +20087 -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 +873 -0
  26. package/dist/carp-catalog.js.map +7 -0
  27. package/dist/catalog-fec-params.d.ts +202 -0
  28. package/dist/catalog-fec-params.d.ts.map +1 -0
  29. package/dist/catalog-fec-params.js +568 -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 +217 -0
  40. package/dist/cmaf-block-assembler.d.ts.map +1 -0
  41. package/dist/cmaf-block-assembler.js +1769 -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 +248 -0
  52. package/dist/codec-utils.d.ts.map +1 -0
  53. package/dist/codec-utils.js +1268 -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 +307 -0
  60. package/dist/fec-manager.d.ts.map +1 -0
  61. package/dist/fec-manager.js +1530 -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 +88 -0
  68. package/dist/fec-worker-setup.d.ts.map +1 -0
  69. package/dist/fec-worker-setup.js +614 -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 +380 -0
  82. package/dist/index.js.map +7 -0
  83. package/dist/iso-bmff-timing.d.ts +78 -0
  84. package/dist/iso-bmff-timing.d.ts.map +1 -0
  85. package/dist/iso-bmff-timing.js +618 -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 +1285 -0
  94. package/dist/manifest-auth-plan.js.map +7 -0
  95. package/dist/media-router.d.ts +251 -0
  96. package/dist/media-router.d.ts.map +1 -0
  97. package/dist/media-router.js +624 -0
  98. package/dist/media-router.js.map +7 -0
  99. package/dist/mfu-reassembler.d.ts +396 -0
  100. package/dist/mfu-reassembler.d.ts.map +1 -0
  101. package/dist/mfu-reassembler.js +3085 -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 +434 -0
  108. package/dist/mmtp-container-parser.d.ts.map +1 -0
  109. package/dist/mmtp-container-parser.js +6164 -0
  110. package/dist/mmtp-container-parser.js.map +7 -0
  111. package/dist/mmtp-container-parser.no-modules.js +8999 -0
  112. package/dist/mmtp-container-parser.no-modules.js.map +7 -0
  113. package/dist/mmtp-decode-pipeline.d.ts +132 -0
  114. package/dist/mmtp-decode-pipeline.d.ts.map +1 -0
  115. package/dist/mmtp-decode-pipeline.js +6413 -0
  116. package/dist/mmtp-decode-pipeline.js.map +7 -0
  117. package/dist/mmtp-router.d.ts +390 -0
  118. package/dist/mmtp-router.d.ts.map +1 -0
  119. package/dist/mmtp-router.js +9242 -0
  120. package/dist/mmtp-router.js.map +7 -0
  121. package/dist/mmtp-to-cmaf.d.ts +181 -0
  122. package/dist/mmtp-to-cmaf.d.ts.map +1 -0
  123. package/dist/mmtp-to-cmaf.js +802 -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 +369 -0
  134. package/dist/multicast-manager.d.ts.map +1 -0
  135. package/dist/multicast-manager.js +13400 -0
  136. package/dist/multicast-manager.js.map +7 -0
  137. package/dist/multicast-transport.d.ts +61 -0
  138. package/dist/multicast-transport.d.ts.map +1 -0
  139. package/dist/multicast-transport.js +1665 -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 +8965 -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 +127 -0
  156. package/dist/repair-fetch.js.map +7 -0
  157. package/dist/repair-layers.d.ts +141 -0
  158. package/dist/repair-layers.d.ts.map +1 -0
  159. package/dist/repair-layers.js +303 -0
  160. package/dist/repair-layers.js.map +7 -0
  161. package/dist/sample-combiner.d.ts +212 -0
  162. package/dist/sample-combiner.d.ts.map +1 -0
  163. package/dist/sample-combiner.js +616 -0
  164. package/dist/sample-combiner.js.map +7 -0
  165. package/dist/signaling.d.ts +29 -0
  166. package/dist/signaling.d.ts.map +1 -0
  167. package/dist/signaling.js +232 -0
  168. package/dist/signaling.js.map +7 -0
  169. package/dist/source-auth.d.ts +2 -0
  170. package/dist/source-auth.d.ts.map +1 -0
  171. package/dist/source-auth.js +1238 -0
  172. package/dist/source-auth.js.map +7 -0
  173. package/dist/switching-set-alignment.d.ts +61 -0
  174. package/dist/switching-set-alignment.d.ts.map +1 -0
  175. package/dist/switching-set-alignment.js +85 -0
  176. package/dist/switching-set-alignment.js.map +7 -0
  177. package/dist/timestamp-codec.d.ts +34 -0
  178. package/dist/timestamp-codec.d.ts.map +1 -0
  179. package/dist/timestamp-codec.js +456 -0
  180. package/dist/timestamp-codec.js.map +7 -0
  181. package/dist/track-pipeline-setup.d.ts +72 -0
  182. package/dist/track-pipeline-setup.d.ts.map +1 -0
  183. package/dist/track-pipeline-setup.js +306 -0
  184. package/dist/track-pipeline-setup.js.map +7 -0
  185. package/dist/track-pipeline.d.ts +121 -0
  186. package/dist/track-pipeline.d.ts.map +1 -0
  187. package/dist/track-pipeline.js +229 -0
  188. package/dist/track-pipeline.js.map +7 -0
  189. package/dist/track-session.d.ts +398 -0
  190. package/dist/track-session.d.ts.map +1 -0
  191. package/dist/track-session.js +767 -0
  192. package/dist/track-session.js.map +7 -0
  193. package/dist/transport-pool.d.ts +69 -0
  194. package/dist/transport-pool.d.ts.map +1 -0
  195. package/dist/transport-pool.js +88 -0
  196. package/dist/transport-pool.js.map +7 -0
  197. package/dist/wasm-mfu-reassembler.d.ts +92 -0
  198. package/dist/wasm-mfu-reassembler.d.ts.map +1 -0
  199. package/dist/wasm-mfu-reassembler.js +2139 -0
  200. package/dist/wasm-mfu-reassembler.js.map +7 -0
  201. package/dist/wasm-mmtp-container-parser.d.ts +10 -0
  202. package/dist/wasm-mmtp-container-parser.d.ts.map +1 -0
  203. package/dist/wasm-mmtp-container-parser.js +6418 -0
  204. package/dist/wasm-mmtp-container-parser.js.map +7 -0
  205. package/node_modules/@blockcast/fec-worker/README.md +213 -0
  206. package/node_modules/@blockcast/fec-worker/dist/.build-stamp +0 -0
  207. package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.d.ts +87 -0
  208. package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.d.ts.map +1 -0
  209. package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.js +279 -0
  210. package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.js.map +1 -0
  211. package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.d.ts +252 -0
  212. package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.d.ts.map +1 -0
  213. package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.js +11 -0
  214. package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.js.map +1 -0
  215. package/node_modules/@blockcast/fec-worker/dist/fec-worker.d.ts +14 -0
  216. package/node_modules/@blockcast/fec-worker/dist/fec-worker.d.ts.map +1 -0
  217. package/node_modules/@blockcast/fec-worker/dist/fec-worker.js +565 -0
  218. package/node_modules/@blockcast/fec-worker/dist/fec-worker.js.map +7 -0
  219. package/node_modules/@blockcast/fec-worker/dist/index.d.ts +10 -0
  220. package/node_modules/@blockcast/fec-worker/dist/index.d.ts.map +1 -0
  221. package/node_modules/@blockcast/fec-worker/dist/index.js +8 -0
  222. package/node_modules/@blockcast/fec-worker/dist/index.js.map +1 -0
  223. package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.d.ts +20 -0
  224. package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.d.ts.map +1 -0
  225. package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.js +349 -0
  226. package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.js.map +7 -0
  227. package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.d.ts +104 -0
  228. package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.d.ts.map +1 -0
  229. package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.js +181 -0
  230. package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.js.map +1 -0
  231. package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.d.ts +179 -0
  232. package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.d.ts.map +1 -0
  233. package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.js +47 -0
  234. package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.js.map +1 -0
  235. package/node_modules/@blockcast/fec-worker/dist/transfer.d.ts +9 -0
  236. package/node_modules/@blockcast/fec-worker/dist/transfer.d.ts.map +1 -0
  237. package/node_modules/@blockcast/fec-worker/dist/transfer.js +13 -0
  238. package/node_modules/@blockcast/fec-worker/dist/transfer.js.map +1 -0
  239. package/node_modules/@blockcast/fec-worker/package.json +59 -0
  240. package/node_modules/@blockcast/fec-worker/src/fec-worker-client.ts +319 -0
  241. package/node_modules/@blockcast/fec-worker/src/fec-worker-types.ts +268 -0
  242. package/node_modules/@blockcast/fec-worker/src/fec-worker.ts +1048 -0
  243. package/node_modules/@blockcast/fec-worker/src/index.ts +32 -0
  244. package/node_modules/@blockcast/fec-worker/src/shred-fec-worker.ts +558 -0
  245. package/node_modules/@blockcast/fec-worker/src/shred-worker-client.ts +222 -0
  246. package/node_modules/@blockcast/fec-worker/src/shred-worker-types.ts +194 -0
  247. package/node_modules/@blockcast/fec-worker/src/transfer.ts +12 -0
  248. package/node_modules/@blockcast/mmt-alta-parse/README.md +181 -0
  249. package/node_modules/@blockcast/mmt-alta-parse/dist/.build-stamp +0 -0
  250. package/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts +57 -0
  251. package/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts.map +1 -0
  252. package/node_modules/@blockcast/mmt-alta-parse/dist/index.js +115 -0
  253. package/node_modules/@blockcast/mmt-alta-parse/dist/index.js.map +1 -0
  254. package/node_modules/@blockcast/mmt-alta-parse/package.json +50 -0
  255. package/node_modules/@blockcast/mmt-alta-parse/src/index.ts +136 -0
  256. package/node_modules/@blockcast/mmt-base/README.md +120 -0
  257. package/node_modules/@blockcast/mmt-base/dist/.build-stamp +0 -0
  258. package/node_modules/@blockcast/mmt-base/dist/index.d.ts +2 -0
  259. package/node_modules/@blockcast/mmt-base/dist/index.d.ts.map +1 -0
  260. package/node_modules/@blockcast/mmt-base/dist/index.js +2 -0
  261. package/node_modules/@blockcast/mmt-base/dist/index.js.map +1 -0
  262. package/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts +276 -0
  263. package/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts.map +1 -0
  264. package/node_modules/@blockcast/mmt-base/dist/mmtp.js +645 -0
  265. package/node_modules/@blockcast/mmt-base/dist/mmtp.js.map +1 -0
  266. package/node_modules/@blockcast/mmt-base/package.json +49 -0
  267. package/node_modules/@blockcast/mmt-base/src/index.ts +1 -0
  268. package/node_modules/@blockcast/mmt-base/src/mmtp.ts +899 -0
  269. package/node_modules/@blockcast/mmt-fec/README.md +270 -0
  270. package/node_modules/@blockcast/mmt-fec/dist/.build-stamp +0 -0
  271. package/node_modules/@blockcast/mmt-fec/dist/block-manager.d.ts +82 -0
  272. package/node_modules/@blockcast/mmt-fec/dist/block-manager.d.ts.map +1 -0
  273. package/node_modules/@blockcast/mmt-fec/dist/block-manager.js +296 -0
  274. package/node_modules/@blockcast/mmt-fec/dist/block-manager.js.map +1 -0
  275. package/node_modules/@blockcast/mmt-fec/dist/block-processor.d.ts +72 -0
  276. package/node_modules/@blockcast/mmt-fec/dist/block-processor.d.ts.map +1 -0
  277. package/node_modules/@blockcast/mmt-fec/dist/block-processor.js +192 -0
  278. package/node_modules/@blockcast/mmt-fec/dist/block-processor.js.map +1 -0
  279. package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.d.ts +46 -0
  280. package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.d.ts.map +1 -0
  281. package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.js +96 -0
  282. package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.js.map +1 -0
  283. package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.d.ts +33 -0
  284. package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.d.ts.map +1 -0
  285. package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.js +57 -0
  286. package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.js.map +1 -0
  287. package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.d.ts +185 -0
  288. package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.d.ts.map +1 -0
  289. package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.js +273 -0
  290. package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.js.map +1 -0
  291. package/node_modules/@blockcast/mmt-fec/dist/index.d.ts +22 -0
  292. package/node_modules/@blockcast/mmt-fec/dist/index.d.ts.map +1 -0
  293. package/node_modules/@blockcast/mmt-fec/dist/index.js +22 -0
  294. package/node_modules/@blockcast/mmt-fec/dist/index.js.map +1 -0
  295. package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.d.ts +20 -0
  296. package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.d.ts.map +1 -0
  297. package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.js +28 -0
  298. package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.js.map +1 -0
  299. package/node_modules/@blockcast/mmt-fec/dist/oti.d.ts +172 -0
  300. package/node_modules/@blockcast/mmt-fec/dist/oti.d.ts.map +1 -0
  301. package/node_modules/@blockcast/mmt-fec/dist/oti.js +254 -0
  302. package/node_modules/@blockcast/mmt-fec/dist/oti.js.map +1 -0
  303. package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.d.ts +41 -0
  304. package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.d.ts.map +1 -0
  305. package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.js +81 -0
  306. package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.js.map +1 -0
  307. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/README.md +181 -0
  308. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/.build-stamp +0 -0
  309. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts +57 -0
  310. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts.map +1 -0
  311. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.js +115 -0
  312. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.js.map +1 -0
  313. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/package.json +50 -0
  314. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/src/index.ts +136 -0
  315. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/README.md +120 -0
  316. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/.build-stamp +0 -0
  317. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.d.ts +2 -0
  318. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.d.ts.map +1 -0
  319. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.js +2 -0
  320. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.js.map +1 -0
  321. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts +276 -0
  322. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts.map +1 -0
  323. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.js +645 -0
  324. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.js.map +1 -0
  325. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/package.json +49 -0
  326. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/index.ts +1 -0
  327. package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/mmtp.ts +899 -0
  328. package/node_modules/@blockcast/mmt-fec/package.json +79 -0
  329. package/node_modules/@blockcast/mmt-fec/src/block-manager.ts +371 -0
  330. package/node_modules/@blockcast/mmt-fec/src/block-processor.ts +277 -0
  331. package/node_modules/@blockcast/mmt-fec/src/cmaf-recovery.ts +127 -0
  332. package/node_modules/@blockcast/mmt-fec/src/cmaf-symbols.ts +68 -0
  333. package/node_modules/@blockcast/mmt-fec/src/fec-block-mapper.ts +332 -0
  334. package/node_modules/@blockcast/mmt-fec/src/index.ts +77 -0
  335. package/node_modules/@blockcast/mmt-fec/src/loc-symbols.ts +34 -0
  336. package/node_modules/@blockcast/mmt-fec/src/oti.ts +317 -0
  337. package/node_modules/@blockcast/mmt-fec/src/reorder-buffer.ts +101 -0
  338. package/node_modules/@blockcast/mmt-manifest-verify/dist/.build-stamp +0 -0
  339. package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.d.ts +28 -0
  340. package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.d.ts.map +1 -0
  341. package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.js +128 -0
  342. package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.js.map +1 -0
  343. package/node_modules/@blockcast/mmt-manifest-verify/dist/index.d.ts +4 -0
  344. package/node_modules/@blockcast/mmt-manifest-verify/dist/index.d.ts.map +1 -0
  345. package/node_modules/@blockcast/mmt-manifest-verify/dist/index.js +4 -0
  346. package/node_modules/@blockcast/mmt-manifest-verify/dist/index.js.map +1 -0
  347. package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.d.ts +37 -0
  348. package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.d.ts.map +1 -0
  349. package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.js +179 -0
  350. package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.js.map +1 -0
  351. package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.d.ts +99 -0
  352. package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.d.ts.map +1 -0
  353. package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.js +492 -0
  354. package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.js.map +1 -0
  355. package/node_modules/@blockcast/mmt-manifest-verify/package.json +45 -0
  356. package/node_modules/@blockcast/mmt-manifest-verify/src/admission.ts +171 -0
  357. package/node_modules/@blockcast/mmt-manifest-verify/src/index.ts +3 -0
  358. package/node_modules/@blockcast/mmt-manifest-verify/src/source-auth.ts +230 -0
  359. package/node_modules/@blockcast/mmt-manifest-verify/src/verifier.ts +669 -0
  360. package/node_modules/@noble/hashes/LICENSE +21 -0
  361. package/node_modules/@noble/hashes/README.md +521 -0
  362. package/node_modules/@noble/hashes/_assert.d.ts +17 -0
  363. package/node_modules/@noble/hashes/_assert.d.ts.map +1 -0
  364. package/node_modules/@noble/hashes/_assert.js +18 -0
  365. package/node_modules/@noble/hashes/_assert.js.map +1 -0
  366. package/node_modules/@noble/hashes/_blake.d.ts +14 -0
  367. package/node_modules/@noble/hashes/_blake.d.ts.map +1 -0
  368. package/node_modules/@noble/hashes/_blake.js +50 -0
  369. package/node_modules/@noble/hashes/_blake.js.map +1 -0
  370. package/node_modules/@noble/hashes/_md.d.ts +51 -0
  371. package/node_modules/@noble/hashes/_md.d.ts.map +1 -0
  372. package/node_modules/@noble/hashes/_md.js +162 -0
  373. package/node_modules/@noble/hashes/_md.js.map +1 -0
  374. package/node_modules/@noble/hashes/_u64.d.ts +55 -0
  375. package/node_modules/@noble/hashes/_u64.d.ts.map +1 -0
  376. package/node_modules/@noble/hashes/_u64.js +90 -0
  377. package/node_modules/@noble/hashes/_u64.js.map +1 -0
  378. package/node_modules/@noble/hashes/argon2.d.ts +32 -0
  379. package/node_modules/@noble/hashes/argon2.d.ts.map +1 -0
  380. package/node_modules/@noble/hashes/argon2.js +401 -0
  381. package/node_modules/@noble/hashes/argon2.js.map +1 -0
  382. package/node_modules/@noble/hashes/blake1.d.ts +106 -0
  383. package/node_modules/@noble/hashes/blake1.d.ts.map +1 -0
  384. package/node_modules/@noble/hashes/blake1.js +459 -0
  385. package/node_modules/@noble/hashes/blake1.js.map +1 -0
  386. package/node_modules/@noble/hashes/blake2.d.ts +116 -0
  387. package/node_modules/@noble/hashes/blake2.d.ts.map +1 -0
  388. package/node_modules/@noble/hashes/blake2.js +420 -0
  389. package/node_modules/@noble/hashes/blake2.js.map +1 -0
  390. package/node_modules/@noble/hashes/blake2b.d.ts +11 -0
  391. package/node_modules/@noble/hashes/blake2b.d.ts.map +1 -0
  392. package/node_modules/@noble/hashes/blake2b.js +14 -0
  393. package/node_modules/@noble/hashes/blake2b.js.map +1 -0
  394. package/node_modules/@noble/hashes/blake2s.d.ts +20 -0
  395. package/node_modules/@noble/hashes/blake2s.d.ts.map +1 -0
  396. package/node_modules/@noble/hashes/blake2s.js +24 -0
  397. package/node_modules/@noble/hashes/blake2s.js.map +1 -0
  398. package/node_modules/@noble/hashes/blake3.d.ts +54 -0
  399. package/node_modules/@noble/hashes/blake3.d.ts.map +1 -0
  400. package/node_modules/@noble/hashes/blake3.js +255 -0
  401. package/node_modules/@noble/hashes/blake3.js.map +1 -0
  402. package/node_modules/@noble/hashes/crypto.d.ts +2 -0
  403. package/node_modules/@noble/hashes/crypto.d.ts.map +1 -0
  404. package/node_modules/@noble/hashes/crypto.js +5 -0
  405. package/node_modules/@noble/hashes/crypto.js.map +1 -0
  406. package/node_modules/@noble/hashes/cryptoNode.d.ts +2 -0
  407. package/node_modules/@noble/hashes/cryptoNode.d.ts.map +1 -0
  408. package/node_modules/@noble/hashes/cryptoNode.js +18 -0
  409. package/node_modules/@noble/hashes/cryptoNode.js.map +1 -0
  410. package/node_modules/@noble/hashes/eskdf.d.ts +47 -0
  411. package/node_modules/@noble/hashes/eskdf.d.ts.map +1 -0
  412. package/node_modules/@noble/hashes/eskdf.js +166 -0
  413. package/node_modules/@noble/hashes/eskdf.js.map +1 -0
  414. package/node_modules/@noble/hashes/esm/_assert.d.ts +17 -0
  415. package/node_modules/@noble/hashes/esm/_assert.d.ts.map +1 -0
  416. package/node_modules/@noble/hashes/esm/_assert.js +15 -0
  417. package/node_modules/@noble/hashes/esm/_assert.js.map +1 -0
  418. package/node_modules/@noble/hashes/esm/_blake.d.ts +14 -0
  419. package/node_modules/@noble/hashes/esm/_blake.d.ts.map +1 -0
  420. package/node_modules/@noble/hashes/esm/_blake.js +45 -0
  421. package/node_modules/@noble/hashes/esm/_blake.js.map +1 -0
  422. package/node_modules/@noble/hashes/esm/_md.d.ts +51 -0
  423. package/node_modules/@noble/hashes/esm/_md.d.ts.map +1 -0
  424. package/node_modules/@noble/hashes/esm/_md.js +155 -0
  425. package/node_modules/@noble/hashes/esm/_md.js.map +1 -0
  426. package/node_modules/@noble/hashes/esm/_u64.d.ts +55 -0
  427. package/node_modules/@noble/hashes/esm/_u64.d.ts.map +1 -0
  428. package/node_modules/@noble/hashes/esm/_u64.js +67 -0
  429. package/node_modules/@noble/hashes/esm/_u64.js.map +1 -0
  430. package/node_modules/@noble/hashes/esm/argon2.d.ts +32 -0
  431. package/node_modules/@noble/hashes/esm/argon2.d.ts.map +1 -0
  432. package/node_modules/@noble/hashes/esm/argon2.js +392 -0
  433. package/node_modules/@noble/hashes/esm/argon2.js.map +1 -0
  434. package/node_modules/@noble/hashes/esm/blake1.d.ts +106 -0
  435. package/node_modules/@noble/hashes/esm/blake1.d.ts.map +1 -0
  436. package/node_modules/@noble/hashes/esm/blake1.js +452 -0
  437. package/node_modules/@noble/hashes/esm/blake1.js.map +1 -0
  438. package/node_modules/@noble/hashes/esm/blake2.d.ts +116 -0
  439. package/node_modules/@noble/hashes/esm/blake2.d.ts.map +1 -0
  440. package/node_modules/@noble/hashes/esm/blake2.js +413 -0
  441. package/node_modules/@noble/hashes/esm/blake2.js.map +1 -0
  442. package/node_modules/@noble/hashes/esm/blake2b.d.ts +11 -0
  443. package/node_modules/@noble/hashes/esm/blake2b.d.ts.map +1 -0
  444. package/node_modules/@noble/hashes/esm/blake2b.js +11 -0
  445. package/node_modules/@noble/hashes/esm/blake2b.js.map +1 -0
  446. package/node_modules/@noble/hashes/esm/blake2s.d.ts +20 -0
  447. package/node_modules/@noble/hashes/esm/blake2s.d.ts.map +1 -0
  448. package/node_modules/@noble/hashes/esm/blake2s.js +21 -0
  449. package/node_modules/@noble/hashes/esm/blake2s.js.map +1 -0
  450. package/node_modules/@noble/hashes/esm/blake3.d.ts +54 -0
  451. package/node_modules/@noble/hashes/esm/blake3.d.ts.map +1 -0
  452. package/node_modules/@noble/hashes/esm/blake3.js +251 -0
  453. package/node_modules/@noble/hashes/esm/blake3.js.map +1 -0
  454. package/node_modules/@noble/hashes/esm/crypto.d.ts +2 -0
  455. package/node_modules/@noble/hashes/esm/crypto.d.ts.map +1 -0
  456. package/node_modules/@noble/hashes/esm/crypto.js +2 -0
  457. package/node_modules/@noble/hashes/esm/crypto.js.map +1 -0
  458. package/node_modules/@noble/hashes/esm/cryptoNode.d.ts +2 -0
  459. package/node_modules/@noble/hashes/esm/cryptoNode.d.ts.map +1 -0
  460. package/node_modules/@noble/hashes/esm/cryptoNode.js +15 -0
  461. package/node_modules/@noble/hashes/esm/cryptoNode.js.map +1 -0
  462. package/node_modules/@noble/hashes/esm/eskdf.d.ts +47 -0
  463. package/node_modules/@noble/hashes/esm/eskdf.d.ts.map +1 -0
  464. package/node_modules/@noble/hashes/esm/eskdf.js +160 -0
  465. package/node_modules/@noble/hashes/esm/eskdf.js.map +1 -0
  466. package/node_modules/@noble/hashes/esm/hkdf.d.ts +36 -0
  467. package/node_modules/@noble/hashes/esm/hkdf.d.ts.map +1 -0
  468. package/node_modules/@noble/hashes/esm/hkdf.js +82 -0
  469. package/node_modules/@noble/hashes/esm/hkdf.js.map +1 -0
  470. package/node_modules/@noble/hashes/esm/hmac.d.ts +35 -0
  471. package/node_modules/@noble/hashes/esm/hmac.d.ts.map +1 -0
  472. package/node_modules/@noble/hashes/esm/hmac.js +86 -0
  473. package/node_modules/@noble/hashes/esm/hmac.js.map +1 -0
  474. package/node_modules/@noble/hashes/esm/index.d.ts +2 -0
  475. package/node_modules/@noble/hashes/esm/index.d.ts.map +1 -0
  476. package/node_modules/@noble/hashes/esm/index.js +33 -0
  477. package/node_modules/@noble/hashes/esm/index.js.map +1 -0
  478. package/node_modules/@noble/hashes/esm/legacy.d.ts +71 -0
  479. package/node_modules/@noble/hashes/esm/legacy.d.ts.map +1 -0
  480. package/node_modules/@noble/hashes/esm/legacy.js +281 -0
  481. package/node_modules/@noble/hashes/esm/legacy.js.map +1 -0
  482. package/node_modules/@noble/hashes/esm/package.json +10 -0
  483. package/node_modules/@noble/hashes/esm/pbkdf2.d.ts +23 -0
  484. package/node_modules/@noble/hashes/esm/pbkdf2.d.ts.map +1 -0
  485. package/node_modules/@noble/hashes/esm/pbkdf2.js +97 -0
  486. package/node_modules/@noble/hashes/esm/pbkdf2.js.map +1 -0
  487. package/node_modules/@noble/hashes/esm/ripemd160.d.ts +13 -0
  488. package/node_modules/@noble/hashes/esm/ripemd160.d.ts.map +1 -0
  489. package/node_modules/@noble/hashes/esm/ripemd160.js +13 -0
  490. package/node_modules/@noble/hashes/esm/ripemd160.js.map +1 -0
  491. package/node_modules/@noble/hashes/esm/scrypt.d.ts +34 -0
  492. package/node_modules/@noble/hashes/esm/scrypt.d.ts.map +1 -0
  493. package/node_modules/@noble/hashes/esm/scrypt.js +228 -0
  494. package/node_modules/@noble/hashes/esm/scrypt.js.map +1 -0
  495. package/node_modules/@noble/hashes/esm/sha1.d.ts +11 -0
  496. package/node_modules/@noble/hashes/esm/sha1.d.ts.map +1 -0
  497. package/node_modules/@noble/hashes/esm/sha1.js +11 -0
  498. package/node_modules/@noble/hashes/esm/sha1.js.map +1 -0
  499. package/node_modules/@noble/hashes/esm/sha2.d.ts +159 -0
  500. package/node_modules/@noble/hashes/esm/sha2.d.ts.map +1 -0
  501. package/node_modules/@noble/hashes/esm/sha2.js +375 -0
  502. package/node_modules/@noble/hashes/esm/sha2.js.map +1 -0
  503. package/node_modules/@noble/hashes/esm/sha256.d.ts +20 -0
  504. package/node_modules/@noble/hashes/esm/sha256.d.ts.map +1 -0
  505. package/node_modules/@noble/hashes/esm/sha256.js +20 -0
  506. package/node_modules/@noble/hashes/esm/sha256.js.map +1 -0
  507. package/node_modules/@noble/hashes/esm/sha3-addons.d.ts +142 -0
  508. package/node_modules/@noble/hashes/esm/sha3-addons.d.ts.map +1 -0
  509. package/node_modules/@noble/hashes/esm/sha3-addons.js +393 -0
  510. package/node_modules/@noble/hashes/esm/sha3-addons.js.map +1 -0
  511. package/node_modules/@noble/hashes/esm/sha3.d.ts +53 -0
  512. package/node_modules/@noble/hashes/esm/sha3.d.ts.map +1 -0
  513. package/node_modules/@noble/hashes/esm/sha3.js +234 -0
  514. package/node_modules/@noble/hashes/esm/sha3.js.map +1 -0
  515. package/node_modules/@noble/hashes/esm/sha512.d.ts +26 -0
  516. package/node_modules/@noble/hashes/esm/sha512.d.ts.map +1 -0
  517. package/node_modules/@noble/hashes/esm/sha512.js +26 -0
  518. package/node_modules/@noble/hashes/esm/sha512.js.map +1 -0
  519. package/node_modules/@noble/hashes/esm/utils.d.ts +161 -0
  520. package/node_modules/@noble/hashes/esm/utils.d.ts.map +1 -0
  521. package/node_modules/@noble/hashes/esm/utils.js +281 -0
  522. package/node_modules/@noble/hashes/esm/utils.js.map +1 -0
  523. package/node_modules/@noble/hashes/hkdf.d.ts +36 -0
  524. package/node_modules/@noble/hashes/hkdf.d.ts.map +1 -0
  525. package/node_modules/@noble/hashes/hkdf.js +88 -0
  526. package/node_modules/@noble/hashes/hkdf.js.map +1 -0
  527. package/node_modules/@noble/hashes/hmac.d.ts +35 -0
  528. package/node_modules/@noble/hashes/hmac.d.ts.map +1 -0
  529. package/node_modules/@noble/hashes/hmac.js +91 -0
  530. package/node_modules/@noble/hashes/hmac.js.map +1 -0
  531. package/node_modules/@noble/hashes/index.d.ts +1 -0
  532. package/node_modules/@noble/hashes/index.d.ts.map +1 -0
  533. package/node_modules/@noble/hashes/index.js +33 -0
  534. package/node_modules/@noble/hashes/index.js.map +1 -0
  535. package/node_modules/@noble/hashes/legacy.d.ts +71 -0
  536. package/node_modules/@noble/hashes/legacy.d.ts.map +1 -0
  537. package/node_modules/@noble/hashes/legacy.js +287 -0
  538. package/node_modules/@noble/hashes/legacy.js.map +1 -0
  539. package/node_modules/@noble/hashes/package.json +266 -0
  540. package/node_modules/@noble/hashes/pbkdf2.d.ts +23 -0
  541. package/node_modules/@noble/hashes/pbkdf2.d.ts.map +1 -0
  542. package/node_modules/@noble/hashes/pbkdf2.js +101 -0
  543. package/node_modules/@noble/hashes/pbkdf2.js.map +1 -0
  544. package/node_modules/@noble/hashes/ripemd160.d.ts +13 -0
  545. package/node_modules/@noble/hashes/ripemd160.d.ts.map +1 -0
  546. package/node_modules/@noble/hashes/ripemd160.js +16 -0
  547. package/node_modules/@noble/hashes/ripemd160.js.map +1 -0
  548. package/node_modules/@noble/hashes/scrypt.d.ts +34 -0
  549. package/node_modules/@noble/hashes/scrypt.d.ts.map +1 -0
  550. package/node_modules/@noble/hashes/scrypt.js +232 -0
  551. package/node_modules/@noble/hashes/scrypt.js.map +1 -0
  552. package/node_modules/@noble/hashes/sha1.d.ts +11 -0
  553. package/node_modules/@noble/hashes/sha1.d.ts.map +1 -0
  554. package/node_modules/@noble/hashes/sha1.js +14 -0
  555. package/node_modules/@noble/hashes/sha1.js.map +1 -0
  556. package/node_modules/@noble/hashes/sha2.d.ts +159 -0
  557. package/node_modules/@noble/hashes/sha2.d.ts.map +1 -0
  558. package/node_modules/@noble/hashes/sha2.js +384 -0
  559. package/node_modules/@noble/hashes/sha2.js.map +1 -0
  560. package/node_modules/@noble/hashes/sha256.d.ts +20 -0
  561. package/node_modules/@noble/hashes/sha256.d.ts.map +1 -0
  562. package/node_modules/@noble/hashes/sha256.js +23 -0
  563. package/node_modules/@noble/hashes/sha256.js.map +1 -0
  564. package/node_modules/@noble/hashes/sha3-addons.d.ts +142 -0
  565. package/node_modules/@noble/hashes/sha3-addons.d.ts.map +1 -0
  566. package/node_modules/@noble/hashes/sha3-addons.js +402 -0
  567. package/node_modules/@noble/hashes/sha3-addons.js.map +1 -0
  568. package/node_modules/@noble/hashes/sha3.d.ts +53 -0
  569. package/node_modules/@noble/hashes/sha3.d.ts.map +1 -0
  570. package/node_modules/@noble/hashes/sha3.js +239 -0
  571. package/node_modules/@noble/hashes/sha3.js.map +1 -0
  572. package/node_modules/@noble/hashes/sha512.d.ts +26 -0
  573. package/node_modules/@noble/hashes/sha512.d.ts.map +1 -0
  574. package/node_modules/@noble/hashes/sha512.js +29 -0
  575. package/node_modules/@noble/hashes/sha512.js.map +1 -0
  576. package/node_modules/@noble/hashes/src/_assert.ts +22 -0
  577. package/node_modules/@noble/hashes/src/_blake.ts +50 -0
  578. package/node_modules/@noble/hashes/src/_md.ts +176 -0
  579. package/node_modules/@noble/hashes/src/_u64.ts +91 -0
  580. package/node_modules/@noble/hashes/src/argon2.ts +497 -0
  581. package/node_modules/@noble/hashes/src/blake1.ts +534 -0
  582. package/node_modules/@noble/hashes/src/blake2.ts +486 -0
  583. package/node_modules/@noble/hashes/src/blake2b.ts +10 -0
  584. package/node_modules/@noble/hashes/src/blake2s.ts +20 -0
  585. package/node_modules/@noble/hashes/src/blake3.ts +272 -0
  586. package/node_modules/@noble/hashes/src/crypto.ts +9 -0
  587. package/node_modules/@noble/hashes/src/cryptoNode.ts +15 -0
  588. package/node_modules/@noble/hashes/src/eskdf.ts +187 -0
  589. package/node_modules/@noble/hashes/src/hkdf.ts +88 -0
  590. package/node_modules/@noble/hashes/src/hmac.ts +94 -0
  591. package/node_modules/@noble/hashes/src/index.ts +31 -0
  592. package/node_modules/@noble/hashes/src/legacy.ts +293 -0
  593. package/node_modules/@noble/hashes/src/pbkdf2.ts +122 -0
  594. package/node_modules/@noble/hashes/src/ripemd160.ts +12 -0
  595. package/node_modules/@noble/hashes/src/scrypt.ts +257 -0
  596. package/node_modules/@noble/hashes/src/sha1.ts +10 -0
  597. package/node_modules/@noble/hashes/src/sha2.ts +402 -0
  598. package/node_modules/@noble/hashes/src/sha256.ts +24 -0
  599. package/node_modules/@noble/hashes/src/sha3-addons.ts +499 -0
  600. package/node_modules/@noble/hashes/src/sha3.ts +258 -0
  601. package/node_modules/@noble/hashes/src/sha512.ts +34 -0
  602. package/node_modules/@noble/hashes/src/utils.ts +395 -0
  603. package/node_modules/@noble/hashes/utils.d.ts +161 -0
  604. package/node_modules/@noble/hashes/utils.d.ts.map +1 -0
  605. package/node_modules/@noble/hashes/utils.js +313 -0
  606. package/node_modules/@noble/hashes/utils.js.map +1 -0
  607. package/package.json +203 -0
  608. package/schemas/catalog.schema.json +360 -0
  609. package/src/align.ts +239 -0
  610. package/src/audio-init-parser.ts +189 -0
  611. package/src/audio-ring-buffer.ts +120 -0
  612. package/src/authored-timing.ts +63 -0
  613. package/src/carp-catalog.ts +845 -0
  614. package/src/catalog-fec-params.ts +535 -0
  615. package/src/catalog-network-source.ts +49 -0
  616. package/src/catalog-validator.ts +34 -0
  617. package/src/cmaf-block-assembler.ts +1167 -0
  618. package/src/cmaf-group-batcher.ts +104 -0
  619. package/src/cmcd-producer.ts +334 -0
  620. package/src/codec-utils.ts +1611 -0
  621. package/src/fec-codec.ts +61 -0
  622. package/src/fec-manager.ts +2081 -0
  623. package/src/fec-starvation-detector.ts +128 -0
  624. package/src/fec-worker-setup.ts +213 -0
  625. package/src/fmp4-completion.ts +47 -0
  626. package/src/fmp4-reader.ts +112 -0
  627. package/src/index.ts +486 -0
  628. package/src/iso-bmff-timing.ts +813 -0
  629. package/src/loc.ts +181 -0
  630. package/src/manifest-auth-plan.ts +107 -0
  631. package/src/media-router.ts +795 -0
  632. package/src/mfu-reassembler.ts +3741 -0
  633. package/src/mfu-reassembly-policy.ts +134 -0
  634. package/src/mmtp-container-parser.ts +1836 -0
  635. package/src/mmtp-decode-pipeline.ts +389 -0
  636. package/src/mmtp-router.ts +3136 -0
  637. package/src/mmtp-to-cmaf.ts +1024 -0
  638. package/src/multicast-auth-catalog.ts +340 -0
  639. package/src/multicast-input.ts +439 -0
  640. package/src/multicast-manager.ts +1720 -0
  641. package/src/multicast-transport.ts +321 -0
  642. package/src/multicast-unwrap.ts +132 -0
  643. package/src/no-modules.ts +20 -0
  644. package/src/phase14-catalog-override.ts +336 -0
  645. package/src/repair-fetch.ts +238 -0
  646. package/src/repair-layers.ts +490 -0
  647. package/src/sample-combiner.ts +938 -0
  648. package/src/signaling.ts +78 -0
  649. package/src/source-auth.ts +1 -0
  650. package/src/switching-set-alignment.ts +109 -0
  651. package/src/timestamp-codec.ts +265 -0
  652. package/src/track-pipeline-setup.ts +189 -0
  653. package/src/track-pipeline.ts +332 -0
  654. package/src/track-session.ts +994 -0
  655. package/src/transport-pool.ts +128 -0
  656. package/src/wasm-mfu-reassembler.ts +389 -0
  657. package/src/wasm-mmtp-container-parser.ts +23 -0
  658. package/test-vectors/align.json +199 -0
  659. package/test-vectors/catalog/README.md +40 -0
  660. package/test-vectors/catalog/negative/fec-enhancement-repair-removed.json +27 -0
  661. package/test-vectors/catalog/negative/fec-repair-layer-geometry.json +32 -0
  662. package/test-vectors/catalog/negative/fec-repair-layer-missing-symbols.json +30 -0
  663. package/test-vectors/catalog/negative/fec-repair-multiple-depends.json +31 -0
  664. package/test-vectors/catalog/negative/fec-repair-overlay-with-layer.json +33 -0
  665. package/test-vectors/catalog/negative/fec-repair-priority-out-of-band.json +23 -0
  666. package/test-vectors/catalog/negative/fec-repair-source-symbols-without-scope.json +32 -0
  667. package/test-vectors/catalog/negative/legacy-selection-params.json +15 -0
  668. package/test-vectors/catalog/negative/media-track-repair-layer.json +16 -0
  669. package/test-vectors/catalog/negative/missing-mmtp-fields.json +12 -0
  670. package/test-vectors/catalog/negative/multicast-auth-padded-key.json +37 -0
  671. package/test-vectors/catalog/negative/multicast-auth-reused-track-format.json +53 -0
  672. package/test-vectors/catalog/negative/multicast-auth-trailing-pad-bits.json +37 -0
  673. package/test-vectors/catalog/negative/multicast-endpoint-missing-protocol-and-source.json +24 -0
  674. package/test-vectors/catalog/negative/network-source-object.json +25 -0
  675. package/test-vectors/catalog/negative/raptorq-source-symbols-over-max.json +23 -0
  676. package/test-vectors/catalog/negative/raptorq-unaligned-symbol.json +26 -0
  677. package/test-vectors/catalog/negative/repair-track-legacy-shape.json +19 -0
  678. package/test-vectors/catalog/negative/track-role-empty.json +16 -0
  679. package/test-vectors/catalog/negative/track-role-non-string.json +16 -0
  680. package/test-vectors/catalog/positive/fec-layered-repair.json +104 -0
  681. package/test-vectors/catalog/positive/fec-multicast.json +51 -0
  682. package/test-vectors/catalog/positive/flat-av.json +30 -0
  683. package/test-vectors/catalog/positive/multicast-auth-rotation.json +55 -0
  684. package/test-vectors/catalog/positive/ticks-and-mixed-timescales.json +39 -0
  685. package/test-vectors/catalog/positive/track-role.json +49 -0
  686. package/test-vectors/catalog/releases/moqcast-native-v16-v1/catalog.json +65 -0
  687. package/test-vectors/catalog/releases/moqcast-native-v16-v1.archive.sha256 +1 -0
  688. package/test-vectors/catalog-multicast-auth-v1.json +26 -0
  689. package/test-vectors/catalog-validation.json +148 -0
  690. package/test-vectors/catalog-validator-public-api.mjs +25 -0
  691. package/test-vectors/generate-source-auth-fixture.mjs +114 -0
  692. package/test-vectors/source-auth-v1.json +61 -0
  693. package/test-vectors/source-contiguity-v1.json +131 -0
  694. package/test-vectors/subsample-placement-v1.json +230 -0
@@ -0,0 +1,1268 @@
1
+ // src/codec-utils.ts
2
+ function extractAvcCFromInitSegment(data) {
3
+ if (!hasIsoBmffMagic(data)) return void 0;
4
+ for (const stsd of findTrackStsdBoxes(data)) {
5
+ const info = extractVideoConfigFromStsd(data, stsd);
6
+ if (info) return info;
7
+ }
8
+ return void 0;
9
+ }
10
+ function extractVideoConfigFromStsd(data, stsd) {
11
+ let s = stsd.o + 16;
12
+ const e = stsd.o + stsd.sz;
13
+ const avc1 = findBox(data, s, e, "avc1");
14
+ if (avc1 && avc1.sz >= 86) {
15
+ const avcC = findBox(data, avc1.o + 86, avc1.o + avc1.sz, "avcC");
16
+ if (avcC && avcC.sz >= 12) {
17
+ const d = data.subarray(avcC.o + 8, avcC.o + avcC.sz);
18
+ const codec = `avc1.${hex2(d[1])}${hex2(d[2])}${hex2(d[3])}`;
19
+ return { codec, description: d };
20
+ }
21
+ }
22
+ const hvc1 = findBox(data, s, e, "hvc1") ?? findBox(data, s, e, "hev1");
23
+ if (hvc1 && hvc1.sz >= 86) {
24
+ const hvcC = findBox(data, hvc1.o + 86, hvc1.o + hvc1.sz, "hvcC");
25
+ if (hvcC && hvcC.sz >= 8 + 23) {
26
+ const d = data.subarray(hvcC.o + 8, hvcC.o + hvcC.sz);
27
+ return { codec: hevcCodecStringFromHvcC(d), description: d };
28
+ }
29
+ }
30
+ const av01 = findBox(data, s, e, "av01");
31
+ if (av01 && av01.sz >= 86) {
32
+ const av1C = findBox(data, av01.o + 86, av01.o + av01.sz, "av1C");
33
+ if (av1C && av1C.sz >= 8) {
34
+ const d = data.subarray(av1C.o + 8, av1C.o + av1C.sz);
35
+ return { codec: codecStringFromAv1C(d), description: d };
36
+ }
37
+ }
38
+ const vp09 = findBox(data, s, e, "vp09");
39
+ if (vp09 && vp09.sz >= 86) {
40
+ const vpcC = findBox(data, vp09.o + 86, vp09.o + vp09.sz, "vpcC");
41
+ if (vpcC && vpcC.sz >= 8) {
42
+ const d = data.subarray(vpcC.o + 8, vpcC.o + vpcC.sz);
43
+ return { codec: codecStringFromVpcC(d), description: d };
44
+ }
45
+ }
46
+ return void 0;
47
+ }
48
+ function generateFallbackAvcC(options) {
49
+ const opts = typeof options === "string" ? { codec: options } : options ?? {};
50
+ let profile = 100;
51
+ let constraint = 0;
52
+ let level = 42;
53
+ if (opts.codec) {
54
+ const match = opts.codec.match(/^avc[13]\.([0-9a-fA-F]{6})$/);
55
+ if (match) {
56
+ profile = Number.parseInt(match[1].substring(0, 2), 16);
57
+ constraint = Number.parseInt(match[1].substring(2, 4), 16);
58
+ level = Number.parseInt(match[1].substring(4, 6), 16);
59
+ }
60
+ }
61
+ const { width, height } = resolveResolution(opts.width, opts.height, level);
62
+ const sps = buildMinimalSps(profile, constraint, level, width, height);
63
+ const pps = buildMinimalPps(profile);
64
+ const avcC = new Uint8Array(5 + 1 + 2 + sps.length + 1 + 2 + pps.length);
65
+ let w = 0;
66
+ avcC[w++] = 1;
67
+ avcC[w++] = profile;
68
+ avcC[w++] = constraint;
69
+ avcC[w++] = level;
70
+ avcC[w++] = 255;
71
+ avcC[w++] = 225;
72
+ avcC[w++] = sps.length >> 8 & 255;
73
+ avcC[w++] = sps.length & 255;
74
+ avcC.set(sps, w);
75
+ w += sps.length;
76
+ avcC[w++] = 1;
77
+ avcC[w++] = pps.length >> 8 & 255;
78
+ avcC[w++] = pps.length & 255;
79
+ avcC.set(pps, w);
80
+ return avcC;
81
+ }
82
+ function extractSpsPpsFromAvcC(avcC) {
83
+ if (avcC.length < 8) return void 0;
84
+ const numSPS = avcC[5] & 31;
85
+ let offset = 6;
86
+ let sps;
87
+ for (let i = 0; i < numSPS && offset + 2 <= avcC.length; i++) {
88
+ const spsLen = avcC[offset] << 8 | avcC[offset + 1];
89
+ offset += 2;
90
+ if (offset + spsLen <= avcC.length) {
91
+ if (!sps) sps = avcC.subarray(offset, offset + spsLen);
92
+ offset += spsLen;
93
+ }
94
+ }
95
+ let pps;
96
+ if (offset < avcC.length) {
97
+ const numPPS = avcC[offset] & 31;
98
+ offset++;
99
+ for (let i = 0; i < numPPS && offset + 2 <= avcC.length; i++) {
100
+ const ppsLen = avcC[offset] << 8 | avcC[offset + 1];
101
+ offset += 2;
102
+ if (offset + ppsLen <= avcC.length) {
103
+ if (!pps) pps = avcC.subarray(offset, offset + ppsLen);
104
+ offset += ppsLen;
105
+ }
106
+ }
107
+ }
108
+ return sps && pps ? { sps, pps } : void 0;
109
+ }
110
+ function avccToAnnexB(avccData, isKeyframe, spsPps) {
111
+ let offset = 0;
112
+ let totalNalSize = 0;
113
+ let nalCount = 0;
114
+ while (offset + 4 <= avccData.length) {
115
+ const nalLen = avccData[offset] << 24 | avccData[offset + 1] << 16 | avccData[offset + 2] << 8 | avccData[offset + 3];
116
+ offset += 4;
117
+ if (nalLen <= 0 || offset + nalLen > avccData.length) break;
118
+ totalNalSize += nalLen;
119
+ nalCount++;
120
+ offset += nalLen;
121
+ }
122
+ if (nalCount === 0) return avccData;
123
+ let outSize = nalCount * 4 + totalNalSize;
124
+ if (isKeyframe) {
125
+ outSize += 4 + spsPps.sps.length + 4 + spsPps.pps.length;
126
+ }
127
+ const out = new Uint8Array(outSize);
128
+ let w = 0;
129
+ if (isKeyframe) {
130
+ out[w++] = 0;
131
+ out[w++] = 0;
132
+ out[w++] = 0;
133
+ out[w++] = 1;
134
+ out.set(spsPps.sps, w);
135
+ w += spsPps.sps.length;
136
+ out[w++] = 0;
137
+ out[w++] = 0;
138
+ out[w++] = 0;
139
+ out[w++] = 1;
140
+ out.set(spsPps.pps, w);
141
+ w += spsPps.pps.length;
142
+ }
143
+ offset = 0;
144
+ while (offset + 4 <= avccData.length) {
145
+ const nalLen = avccData[offset] << 24 | avccData[offset + 1] << 16 | avccData[offset + 2] << 8 | avccData[offset + 3];
146
+ offset += 4;
147
+ if (nalLen <= 0 || offset + nalLen > avccData.length) break;
148
+ out[w++] = 0;
149
+ out[w++] = 0;
150
+ out[w++] = 0;
151
+ out[w++] = 1;
152
+ out.set(avccData.subarray(offset, offset + nalLen), w);
153
+ w += nalLen;
154
+ offset += nalLen;
155
+ }
156
+ return out;
157
+ }
158
+ function extractCodecDescriptionFromAnnexB(data) {
159
+ const nalUnits = [];
160
+ let i = 0;
161
+ while (i < data.length - 4) {
162
+ if (data[i] === 0 && data[i + 1] === 0) {
163
+ let nalStart = 0;
164
+ if (data[i + 2] === 1) {
165
+ nalStart = i + 3;
166
+ } else if (data[i + 2] === 0 && data[i + 3] === 1) {
167
+ nalStart = i + 4;
168
+ }
169
+ if (nalStart > 0 && nalStart < data.length) {
170
+ let nalEnd = data.length;
171
+ for (let j = nalStart; j < data.length - 3; j++) {
172
+ if (data[j] === 0 && data[j + 1] === 0 && (data[j + 2] === 1 || data[j + 2] === 0 && data[j + 3] === 1)) {
173
+ nalEnd = j;
174
+ break;
175
+ }
176
+ }
177
+ const nalType = data[nalStart] & 31;
178
+ nalUnits.push({ type: nalType, data: data.slice(nalStart, nalEnd) });
179
+ i = nalEnd;
180
+ continue;
181
+ }
182
+ }
183
+ i++;
184
+ }
185
+ const sps = nalUnits.find((n) => n.type === 7);
186
+ const pps = nalUnits.find((n) => n.type === 8);
187
+ if (!sps || !pps) return null;
188
+ const avcCLength = 6 + 2 + sps.data.length + 1 + 2 + pps.data.length;
189
+ const avcC = new Uint8Array(avcCLength);
190
+ let offset = 0;
191
+ avcC[offset++] = 1;
192
+ avcC[offset++] = sps.data[1];
193
+ avcC[offset++] = sps.data[2];
194
+ avcC[offset++] = sps.data[3];
195
+ avcC[offset++] = 255;
196
+ avcC[offset++] = 225;
197
+ avcC[offset++] = sps.data.length >> 8 & 255;
198
+ avcC[offset++] = sps.data.length & 255;
199
+ avcC.set(sps.data, offset);
200
+ offset += sps.data.length;
201
+ avcC[offset++] = 1;
202
+ avcC[offset++] = pps.data.length >> 8 & 255;
203
+ avcC[offset++] = pps.data.length & 255;
204
+ avcC.set(pps.data, offset);
205
+ return avcC;
206
+ }
207
+ function codecStringFromAvcC(avcC) {
208
+ if (avcC.length < 4) return "avc1.640033";
209
+ return `avc1.${hex2(avcC[1])}${hex2(avcC[2])}${hex2(avcC[3])}`;
210
+ }
211
+ function isHevcCodec(codec) {
212
+ return codec.startsWith("hev1") || codec.startsWith("hvc1");
213
+ }
214
+ function hevcNalType(nal) {
215
+ return nal[0] >> 1 & 63;
216
+ }
217
+ function removeEmulationPrevention(rbsp) {
218
+ const out = [];
219
+ let zeros = 0;
220
+ for (let i = 0; i < rbsp.length; i++) {
221
+ const b = rbsp[i];
222
+ if (zeros >= 2 && b === 3 && i + 1 < rbsp.length && rbsp[i + 1] <= 3) {
223
+ zeros = 0;
224
+ continue;
225
+ }
226
+ out.push(b);
227
+ zeros = b === 0 ? zeros + 1 : 0;
228
+ }
229
+ return Uint8Array.from(out);
230
+ }
231
+ function splitAvccNalUnits(data, lengthSize = 4) {
232
+ const nals = [];
233
+ let i = 0;
234
+ while (i + lengthSize <= data.length) {
235
+ let len = 0;
236
+ for (let k = 0; k < lengthSize; k++) len = len << 8 | data[i + k];
237
+ i += lengthSize;
238
+ if (len <= 0 || i + len > data.length) break;
239
+ nals.push(data.subarray(i, i + len));
240
+ i += len;
241
+ }
242
+ return nals;
243
+ }
244
+ function isCompleteAvccSample(data, lengthSize = 4) {
245
+ let i = 0;
246
+ let count = 0;
247
+ while (i + lengthSize <= data.length) {
248
+ let len = 0;
249
+ for (let k = 0; k < lengthSize; k++) len = len << 8 | data[i + k];
250
+ i += lengthSize;
251
+ if (len <= 0 || i + len > data.length) return false;
252
+ i += len;
253
+ count++;
254
+ }
255
+ return count > 0 && i === data.length;
256
+ }
257
+ function normalizeH264SampleToAvcc(data) {
258
+ if (isCompleteAvccSample(data)) return { data, format: "avcc" };
259
+ if (isAnnexB(data)) return { data: annexBToAvcc(data), format: "annexb" };
260
+ if (isLikelyRawH264NalUnit(data)) return { data: rawH264NalToAvcc(data), format: "raw-nal" };
261
+ return { data, format: "unknown" };
262
+ }
263
+ function splitH264SampleNalUnits(data, options = {}) {
264
+ if (isCompleteAvccSample(data)) return { nals: splitAvccNalUnits(data), format: "avcc" };
265
+ if (isAnnexB(data)) return { nals: splitAnnexBNalUnits(data), format: "annexb" };
266
+ if (options.allowPartialAvcc === true) {
267
+ const partial = splitPartialAvccNalUnits(data);
268
+ if (partial.length > 0) return { nals: partial, format: "partial-avcc" };
269
+ }
270
+ if (isLikelyRawH264NalUnit(data)) return { nals: [data], format: "raw-nal" };
271
+ const nals = splitAvccNalUnits(data);
272
+ return { nals, format: nals.length > 0 ? "avcc" : "unknown" };
273
+ }
274
+ function extractHevcParameterSets(keyframe) {
275
+ const nals = isAnnexB(keyframe) ? splitAnnexBNalUnits(keyframe) : splitAvccNalUnits(keyframe);
276
+ const out = {};
277
+ for (const nal of nals) {
278
+ if (nal.length === 0) continue;
279
+ const t = hevcNalType(nal);
280
+ if (t === 32 && !out.vps) out.vps = nal;
281
+ else if (t === 33 && !out.sps) out.sps = nal;
282
+ else if (t === 34 && !out.pps) out.pps = nal;
283
+ }
284
+ return out;
285
+ }
286
+ function generateHvcCFromParameterSets(sets) {
287
+ const { vps, sps, pps } = sets;
288
+ if (!sps || !pps) return null;
289
+ const spsRbsp = removeEmulationPrevention(sps);
290
+ const ptl = spsRbsp.subarray(3, 15);
291
+ const arrays = [
292
+ { type: 32, nal: vps },
293
+ { type: 33, nal: sps },
294
+ { type: 34, nal: pps }
295
+ ].filter((a) => a.nal !== void 0);
296
+ let size = 23;
297
+ for (const a of arrays) size += 5 + a.nal.length;
298
+ const h = new Uint8Array(size);
299
+ let o = 0;
300
+ h[o++] = 1;
301
+ for (let i = 0; i < 12; i++) h[o++] = ptl[i] ?? 0;
302
+ h[o++] = 240;
303
+ h[o++] = 0;
304
+ h[o++] = 252;
305
+ h[o++] = 253;
306
+ h[o++] = 248;
307
+ h[o++] = 248;
308
+ h[o++] = 0;
309
+ h[o++] = 0;
310
+ h[o++] = 11;
311
+ h[o++] = arrays.length;
312
+ for (const a of arrays) {
313
+ h[o++] = a.type & 63;
314
+ h[o++] = 0;
315
+ h[o++] = 1;
316
+ h[o++] = a.nal.length >> 8 & 255;
317
+ h[o++] = a.nal.length & 255;
318
+ h.set(a.nal, o);
319
+ o += a.nal.length;
320
+ }
321
+ return h.subarray(0, o);
322
+ }
323
+ function extractHevcCodecDescription(keyframe) {
324
+ return generateHvcCFromParameterSets(extractHevcParameterSets(keyframe));
325
+ }
326
+ function hevcVclOnly(data) {
327
+ const nals = isAnnexB(data) ? splitAnnexBNalUnits(data) : splitAvccNalUnits(data);
328
+ const vcl = nals.filter((n) => n.length > 0 && hevcNalType(n) <= 31);
329
+ if (vcl.length === nals.length && !isAnnexB(data)) return data;
330
+ let size = 0;
331
+ for (const n of vcl) size += 4 + n.length;
332
+ const out = new Uint8Array(size);
333
+ let o = 0;
334
+ for (const n of vcl) {
335
+ out[o++] = n.length >> 24 & 255;
336
+ out[o++] = n.length >> 16 & 255;
337
+ out[o++] = n.length >> 8 & 255;
338
+ out[o++] = n.length & 255;
339
+ out.set(n, o);
340
+ o += n.length;
341
+ }
342
+ return out;
343
+ }
344
+ function isAnnexB(data) {
345
+ if (data.length >= 4 && data[0] === 0 && data[1] === 0 && (data[2] === 1 || data[2] === 0 && data[3] === 1)) {
346
+ return true;
347
+ }
348
+ return false;
349
+ }
350
+ function findAnnexBStartCode(data) {
351
+ for (let i = 0; i < data.length - 3; i++) {
352
+ if (data[i] === 0 && data[i + 1] === 0) {
353
+ if (data[i + 2] === 1) return i;
354
+ if (data[i + 2] === 0 && data[i + 3] === 1) return i;
355
+ }
356
+ }
357
+ return -1;
358
+ }
359
+ function splitAnnexBNalUnits(data) {
360
+ const nalUnits = [];
361
+ let i = 0;
362
+ while (i < data.length - 3) {
363
+ if (data[i] === 0 && data[i + 1] === 0) {
364
+ let scLen = 0;
365
+ if (data[i + 2] === 1) scLen = 3;
366
+ else if (data[i + 2] === 0 && i + 3 < data.length && data[i + 3] === 1) scLen = 4;
367
+ if (scLen > 0) {
368
+ const nalStart = i + scLen;
369
+ let nalEnd = data.length;
370
+ for (let j = nalStart + 1; j < data.length - 2; j++) {
371
+ if (data[j] === 0 && data[j + 1] === 0 && (data[j + 2] === 1 || data[j + 2] === 0 && j + 3 < data.length && data[j + 3] === 1)) {
372
+ nalEnd = j;
373
+ break;
374
+ }
375
+ }
376
+ if (nalEnd > nalStart) nalUnits.push(data.subarray(nalStart, nalEnd));
377
+ i = nalEnd;
378
+ continue;
379
+ }
380
+ }
381
+ i++;
382
+ }
383
+ return nalUnits;
384
+ }
385
+ function annexBToAvcc(data, spsPps) {
386
+ const nalUnits = splitAnnexBNalUnits(data);
387
+ if (nalUnits.length === 0) return data;
388
+ let extraSize = 0;
389
+ if (spsPps) {
390
+ extraSize = 4 + spsPps.sps.length + 4 + spsPps.pps.length;
391
+ }
392
+ const frameSize = nalUnits.reduce((sum, nal) => sum + 4 + nal.length, 0);
393
+ const output = new Uint8Array(extraSize + frameSize);
394
+ let w = 0;
395
+ if (spsPps) {
396
+ w = writeNalLength(output, w, spsPps.sps.length);
397
+ output.set(spsPps.sps, w);
398
+ w += spsPps.sps.length;
399
+ w = writeNalLength(output, w, spsPps.pps.length);
400
+ output.set(spsPps.pps, w);
401
+ w += spsPps.pps.length;
402
+ }
403
+ for (const nal of nalUnits) {
404
+ w = writeNalLength(output, w, nal.length);
405
+ output.set(nal, w);
406
+ w += nal.length;
407
+ }
408
+ return output;
409
+ }
410
+ function classifyH264Keyframe(data, options = {}) {
411
+ const nals = h264NalUnitsForKeyframeDetection(data, options);
412
+ if (nals.length === 0) return void 0;
413
+ let sawIntraSlice = false;
414
+ let sawNonIntraVcl = false;
415
+ let sawNal = false;
416
+ for (const nal of nals) {
417
+ sawNal = true;
418
+ const nalType = nal[0] !== void 0 ? nal[0] & 31 : -1;
419
+ if (nalType === 5 || nalType === 7) return true;
420
+ if (nalType === 1) {
421
+ if (isH264IntraSlice(nal)) sawIntraSlice = true;
422
+ else sawNonIntraVcl = true;
423
+ }
424
+ }
425
+ if (sawIntraSlice && !sawNonIntraVcl) return true;
426
+ return sawNal ? false : void 0;
427
+ }
428
+ function detectH264Keyframe(data, options = {}) {
429
+ return classifyH264Keyframe(data, options) === true;
430
+ }
431
+ function mmtpTimestampToMicros(rawTs) {
432
+ const ts = typeof rawTs === "bigint" ? rawTs >= 0n && rawTs <= 0xffffffffn ? Number(rawTs) : void 0 : Number.isSafeInteger(rawTs) && rawTs >= 0 && rawTs <= 4294967295 ? rawTs : void 0;
433
+ if (ts === void 0) {
434
+ throw new RangeError(`MMTP timestamp must be an unsigned 32-bit integer, got ${String(rawTs)}`);
435
+ }
436
+ if (ts === 0) return 0;
437
+ const seconds = ts >>> 16;
438
+ const frac = ts & 65535;
439
+ return seconds * 1e6 + Math.floor(frac * 1e6 / 65536);
440
+ }
441
+ function isFmp4InitSegment(data) {
442
+ let offset = 0;
443
+ let sawFtyp = false;
444
+ let sawMoov = false;
445
+ while (offset + 8 <= data.byteLength) {
446
+ const view = new DataView(data.buffer, data.byteOffset + offset, data.byteLength - offset);
447
+ let size = view.getUint32(0, false);
448
+ const type = String.fromCharCode(data[offset + 4], data[offset + 5], data[offset + 6], data[offset + 7]);
449
+ let headerSize = 8;
450
+ if (size === 1) {
451
+ if (offset + 16 > data.byteLength) return false;
452
+ const largeSize = view.getBigUint64(8, false);
453
+ if (largeSize > BigInt(Number.MAX_SAFE_INTEGER)) return false;
454
+ size = Number(largeSize);
455
+ headerSize = 16;
456
+ } else if (size === 0) {
457
+ size = data.byteLength - offset;
458
+ }
459
+ if (size < headerSize || offset + size > data.byteLength) return false;
460
+ if (type === "mmpu") return false;
461
+ if (type === "ftyp") sawFtyp = true;
462
+ if (type === "moov") {
463
+ if (!sawFtyp) return false;
464
+ sawMoov = true;
465
+ }
466
+ offset += size;
467
+ }
468
+ return offset === data.byteLength && sawFtyp && sawMoov;
469
+ }
470
+ function normalizeMmtpInitSegment(data) {
471
+ if (isFmp4InitSegment(data)) return data;
472
+ const parts = [];
473
+ let offset = 0;
474
+ let removedMpu = false;
475
+ while (offset + 8 <= data.byteLength) {
476
+ const view = new DataView(data.buffer, data.byteOffset + offset, data.byteLength - offset);
477
+ let size = view.getUint32(0, false);
478
+ let headerSize = 8;
479
+ if (size === 1) {
480
+ if (offset + 16 > data.byteLength) return void 0;
481
+ const largeSize = view.getBigUint64(8, false);
482
+ if (largeSize > BigInt(Number.MAX_SAFE_INTEGER)) return void 0;
483
+ size = Number(largeSize);
484
+ headerSize = 16;
485
+ } else if (size === 0) {
486
+ size = data.byteLength - offset;
487
+ }
488
+ if (size < headerSize || offset + size > data.byteLength) return void 0;
489
+ const type = String.fromCharCode(
490
+ data[offset + 4],
491
+ data[offset + 5],
492
+ data[offset + 6],
493
+ data[offset + 7]
494
+ );
495
+ if (type === "mmpu") removedMpu = true;
496
+ else parts.push(data.subarray(offset, offset + size));
497
+ offset += size;
498
+ }
499
+ if (!removedMpu || offset !== data.byteLength) return void 0;
500
+ const normalized = new Uint8Array(parts.reduce((total, part) => total + part.byteLength, 0));
501
+ let writeOffset = 0;
502
+ for (const part of parts) {
503
+ normalized.set(part, writeOffset);
504
+ writeOffset += part.byteLength;
505
+ }
506
+ return isFmp4InitSegment(normalized) ? normalized : void 0;
507
+ }
508
+ function hasIsoBmffMagic(data) {
509
+ for (let i = 0; i + 8 <= data.length && i < 32; i += 4) {
510
+ const tag = String.fromCharCode(data[i + 4], data[i + 5], data[i + 6], data[i + 7]);
511
+ if (tag === "ftyp" || tag === "moov") return true;
512
+ }
513
+ return false;
514
+ }
515
+ function findTrackStsdBoxes(data) {
516
+ const moov = findBox(data, 0, data.length, "moov");
517
+ if (!moov) return [];
518
+ const out = [];
519
+ for (const trak of findBoxes(data, moov.o + 8, moov.o + moov.sz, "trak")) {
520
+ const stsd = findNestedBox(data, trak.o + 8, trak.o + trak.sz, ["mdia", "minf", "stbl", "stsd"]);
521
+ if (stsd) out.push(stsd);
522
+ }
523
+ return out;
524
+ }
525
+ function findNestedBox(buf, start, end, path) {
526
+ let s = start;
527
+ let e = end;
528
+ let current;
529
+ for (const type of path) {
530
+ current = findBox(buf, s, e, type);
531
+ if (!current) return void 0;
532
+ s = current.o + 8;
533
+ e = current.o + current.sz;
534
+ }
535
+ return current;
536
+ }
537
+ function findBox(buf, start, end, type) {
538
+ return findBoxes(buf, start, end, type)[0];
539
+ }
540
+ function findBoxes(buf, start, end, type) {
541
+ const boxes = [];
542
+ let o = start;
543
+ while (o + 8 <= end) {
544
+ let sz = buf[o] << 24 | buf[o + 1] << 16 | buf[o + 2] << 8 | buf[o + 3];
545
+ const t = String.fromCharCode(buf[o + 4], buf[o + 5], buf[o + 6], buf[o + 7]);
546
+ if (sz === 0) sz = end - o;
547
+ if (sz < 8 || o + sz > end) break;
548
+ if (t === type) boxes.push({ o, sz });
549
+ o += sz;
550
+ }
551
+ return boxes;
552
+ }
553
+ function writeNalLength(buf, offset, len) {
554
+ buf[offset] = len >> 24 & 255;
555
+ buf[offset + 1] = len >> 16 & 255;
556
+ buf[offset + 2] = len >> 8 & 255;
557
+ buf[offset + 3] = len & 255;
558
+ return offset + 4;
559
+ }
560
+ function h264NalUnitsForKeyframeDetection(data, options) {
561
+ return splitH264SampleNalUnits(data, options).nals;
562
+ }
563
+ function splitPartialAvccNalUnits(data, lengthSize = 4) {
564
+ const nals = [];
565
+ let i = 0;
566
+ while (i + lengthSize < data.length) {
567
+ let len = 0;
568
+ for (let k = 0; k < lengthSize; k++) len = len << 8 | data[i + k];
569
+ i += lengthSize;
570
+ if (len <= 0 || i >= data.length) break;
571
+ const end = Math.min(i + len, data.length);
572
+ nals.push(data.subarray(i, end));
573
+ if (end < i + len) break;
574
+ i = end;
575
+ }
576
+ return nals;
577
+ }
578
+ function isLikelyRawH264NalUnit(data) {
579
+ if (data.length === 0) return false;
580
+ const header = data[0];
581
+ if ((header & 128) !== 0) return false;
582
+ const nalType = header & 31;
583
+ return nalType > 0 && nalType < 24;
584
+ }
585
+ function rawH264NalToAvcc(data) {
586
+ const out = new Uint8Array(4 + data.length);
587
+ new DataView(out.buffer, out.byteOffset, out.byteLength).setUint32(0, data.length);
588
+ out.set(data, 4);
589
+ return out;
590
+ }
591
+ function isH264IntraSlice(nal) {
592
+ const sliceType = readH264SliceType(nal);
593
+ return sliceType === 2 || sliceType === 4 || sliceType === 7 || sliceType === 9;
594
+ }
595
+ function readH264SliceType(nal) {
596
+ if (nal.length < 2 || (nal[0] & 31) !== 1) return null;
597
+ const rbsp = removeEmulationPrevention(nal.subarray(1));
598
+ const state = { bitOffset: 0 };
599
+ if (readUnsignedExpGolomb(rbsp, state) === null) return null;
600
+ return readUnsignedExpGolomb(rbsp, state);
601
+ }
602
+ function readUnsignedExpGolomb(data, state) {
603
+ let leadingZeroBits = 0;
604
+ while (true) {
605
+ const bit = readBit(data, state);
606
+ if (bit === null) return null;
607
+ if (bit === 1) break;
608
+ leadingZeroBits++;
609
+ if (leadingZeroBits > 30) return null;
610
+ }
611
+ let suffix = 0;
612
+ for (let i = 0; i < leadingZeroBits; i++) {
613
+ const bit = readBit(data, state);
614
+ if (bit === null) return null;
615
+ suffix = suffix << 1 | bit;
616
+ }
617
+ return (1 << leadingZeroBits) - 1 + suffix;
618
+ }
619
+ function readBit(data, state) {
620
+ if (state.bitOffset >= data.length * 8) return null;
621
+ const byte = data[state.bitOffset >> 3];
622
+ const bit = byte >> 7 - (state.bitOffset & 7) & 1;
623
+ state.bitOffset++;
624
+ return bit;
625
+ }
626
+ function hex2(n) {
627
+ return n.toString(16).padStart(2, "0");
628
+ }
629
+ function pad2(n) {
630
+ return String(n).padStart(2, "0");
631
+ }
632
+ function codecStringFromAv1C(av1C) {
633
+ if (av1C.length < 4) return "av01.0.01M.08";
634
+ const profile = av1C[1] >>> 5 & 7;
635
+ const level = av1C[1] & 31;
636
+ const tier = (av1C[2] & 128) !== 0 ? "H" : "M";
637
+ let bitDepth = 8;
638
+ if ((av1C[2] & 64) !== 0) {
639
+ bitDepth = (av1C[2] & 32) !== 0 ? 12 : 10;
640
+ }
641
+ return `av01.${profile}.${pad2(level)}${tier}.${pad2(bitDepth)}`;
642
+ }
643
+ function codecStringFromVpcC(vpcC) {
644
+ if (vpcC.length < 3) return "vp09.00.10.08";
645
+ const offset = vpcC.length >= 7 && vpcC[0] <= 1 ? 4 : 0;
646
+ if (offset + 2 >= vpcC.length) return "vp09.00.10.08";
647
+ const profile = vpcC[offset];
648
+ const level = vpcC[offset + 1];
649
+ const bitDepth = vpcC[offset + 2] >>> 4 || 8;
650
+ return `vp09.${pad2(profile)}.${pad2(level)}.${pad2(bitDepth)}`;
651
+ }
652
+ function hevcCodecStringFromHvcC(c) {
653
+ const profileSpace = c[1] >> 6 & 3;
654
+ const tierFlag = c[1] >> 5 & 1;
655
+ const profileIdc = c[1] & 31;
656
+ const compat = (c[2] << 24 | c[3] << 16 | c[4] << 8 | c[5]) >>> 0;
657
+ let rev = 0;
658
+ let v = compat;
659
+ for (let i = 0; i < 32; i++) {
660
+ rev = (rev << 1 | v & 1) >>> 0;
661
+ v >>>= 1;
662
+ }
663
+ const compatStr = rev.toString(16);
664
+ const constraint = c.subarray(6, 12);
665
+ let lastNonZero = -1;
666
+ for (let i = 0; i < constraint.length; i++) if (constraint[i] !== 0) lastNonZero = i;
667
+ const constraintParts = [];
668
+ for (let i = 0; i <= lastNonZero; i++) constraintParts.push(constraint[i].toString(16));
669
+ const space = profileSpace === 0 ? "" : String.fromCharCode(64 + profileSpace);
670
+ const tier = tierFlag === 0 ? "L" : "H";
671
+ let s = `hvc1.${space}${profileIdc}.${compatStr}.${tier}${c[12]}`;
672
+ if (constraintParts.length > 0) s += "." + constraintParts.join(".");
673
+ return s;
674
+ }
675
+ var BitWriter = class {
676
+ constructor() {
677
+ this.buf = [];
678
+ this.byte = 0;
679
+ this.bit = 7;
680
+ }
681
+ u(val, bits) {
682
+ for (let i = bits - 1; i >= 0; i--) {
683
+ this.byte |= (val >> i & 1) << this.bit;
684
+ if (--this.bit < 0) {
685
+ this.buf.push(this.byte);
686
+ this.byte = 0;
687
+ this.bit = 7;
688
+ }
689
+ }
690
+ }
691
+ ue(val) {
692
+ const v = val + 1;
693
+ const bits = Math.floor(Math.log2(v)) + 1;
694
+ this.u(0, bits - 1);
695
+ this.u(v, bits);
696
+ }
697
+ se(val) {
698
+ this.ue(val <= 0 ? -val * 2 : val * 2 - 1);
699
+ }
700
+ finish() {
701
+ if (this.bit < 7) {
702
+ this.byte |= 1 << this.bit;
703
+ this.buf.push(this.byte);
704
+ }
705
+ return new Uint8Array(this.buf);
706
+ }
707
+ };
708
+ function resolveResolution(explicitW, explicitH, level) {
709
+ if (explicitW && explicitH) return { width: explicitW, height: explicitH };
710
+ const levelResolutions = {
711
+ 10: [176, 144],
712
+ 11: [352, 288],
713
+ 12: [352, 288],
714
+ 13: [352, 288],
715
+ 20: [352, 288],
716
+ 21: [720, 576],
717
+ 22: [720, 576],
718
+ 30: [1280, 720],
719
+ 31: [1280, 720],
720
+ 32: [1280, 1024],
721
+ 40: [1920, 1088],
722
+ 41: [1920, 1088],
723
+ 42: [2048, 1088],
724
+ 50: [4096, 2160],
725
+ 51: [4096, 2160],
726
+ 52: [4096, 2160]
727
+ };
728
+ const [w, h] = levelResolutions[level] ?? [1920, 1088];
729
+ return { width: explicitW ?? w, height: explicitH ?? h };
730
+ }
731
+ function buildMinimalSps(profile, constraint, level, width, height) {
732
+ const widthInMbs = Math.ceil(width / 16);
733
+ const heightInMapUnits = Math.ceil(height / 16);
734
+ const w = new BitWriter();
735
+ w.u(0, 1);
736
+ w.u(3, 2);
737
+ w.u(7, 5);
738
+ w.u(profile, 8);
739
+ w.u(constraint, 8);
740
+ w.u(level, 8);
741
+ w.ue(0);
742
+ if (profile === 100 || profile === 110 || profile === 122 || profile === 244 || profile === 44) {
743
+ w.ue(1);
744
+ w.ue(0);
745
+ w.ue(0);
746
+ w.u(0, 1);
747
+ w.u(0, 1);
748
+ }
749
+ w.ue(0);
750
+ w.ue(2);
751
+ w.ue(1);
752
+ w.u(0, 1);
753
+ w.ue(widthInMbs - 1);
754
+ w.ue(heightInMapUnits - 1);
755
+ w.u(1, 1);
756
+ w.u(1, 1);
757
+ const cropRight = widthInMbs * 16 - width;
758
+ const cropBottom = heightInMapUnits * 16 - height;
759
+ if (cropRight > 0 || cropBottom > 0) {
760
+ w.u(1, 1);
761
+ w.ue(0);
762
+ w.ue(cropRight / 2);
763
+ w.ue(0);
764
+ w.ue(cropBottom / 2);
765
+ } else {
766
+ w.u(0, 1);
767
+ }
768
+ w.u(0, 1);
769
+ return w.finish();
770
+ }
771
+ function buildMinimalPps(profile) {
772
+ const isHighProfile = profile === 100 || profile === 110 || profile === 122 || profile === 244 || profile === 44;
773
+ const w = new BitWriter();
774
+ w.u(0, 1);
775
+ w.u(3, 2);
776
+ w.u(8, 5);
777
+ w.ue(0);
778
+ w.ue(0);
779
+ w.u(isHighProfile ? 1 : 0, 1);
780
+ w.u(0, 1);
781
+ w.ue(0);
782
+ w.ue(0);
783
+ w.ue(0);
784
+ w.u(0, 1);
785
+ w.u(0, 2);
786
+ w.se(0);
787
+ w.se(0);
788
+ w.se(0);
789
+ w.u(1, 1);
790
+ w.u(0, 1);
791
+ w.u(0, 1);
792
+ if (isHighProfile) {
793
+ w.u(1, 1);
794
+ w.u(0, 1);
795
+ w.se(0);
796
+ }
797
+ return w.finish();
798
+ }
799
+ var ADTS_SAMPLE_RATES = [96e3, 88200, 64e3, 48e3, 44100, 32e3, 24e3, 22050, 16e3, 12e3, 11025, 8e3, 7350];
800
+ function wrapAdtsFrame(raw, sampleRate, channels) {
801
+ const sri = ADTS_SAMPLE_RATES.indexOf(sampleRate);
802
+ const idx = sri >= 0 ? sri : 3;
803
+ const len = 7 + raw.length;
804
+ const out = new Uint8Array(len);
805
+ out[0] = 255;
806
+ out[1] = 241;
807
+ out[2] = 1 << 6 | idx << 2 | channels >> 2;
808
+ out[3] = (channels & 3) << 6 | len >> 11 & 3;
809
+ out[4] = len >> 3 & 255;
810
+ out[5] = (len & 7) << 5 | 31;
811
+ out[6] = 252;
812
+ out.set(raw, 7);
813
+ return out;
814
+ }
815
+ function extractAacAscFromInitSegment(data) {
816
+ if (!hasIsoBmffMagic(data)) return void 0;
817
+ for (const stsd of findTrackStsdBoxes(data)) {
818
+ const info = extractAacAscFromStsd(data, stsd);
819
+ if (info) return info;
820
+ }
821
+ return void 0;
822
+ }
823
+ function extractAacAscFromStsd(data, stsd) {
824
+ const s = stsd.o + 16;
825
+ const e = stsd.o + stsd.sz;
826
+ const mp4a = findBox(data, s, e, "mp4a");
827
+ if (!mp4a || mp4a.sz < 36) return void 0;
828
+ const esds = findBox(data, mp4a.o + 36, mp4a.o + mp4a.sz, "esds");
829
+ if (!esds || esds.sz < 12) return void 0;
830
+ const esdsPayload = data.subarray(esds.o + 8, esds.o + esds.sz);
831
+ const asc = extractAudioSpecificConfig(esdsPayload);
832
+ if (!asc || asc.length < 2) return void 0;
833
+ const aot = asc[0] >> 3;
834
+ return { codec: `mp4a.40.${aot}`, description: asc };
835
+ }
836
+ function extractAudioSpecificConfig(esds) {
837
+ let offset = 4;
838
+ while (offset < esds.length) {
839
+ const tag = esds[offset++];
840
+ let size = 0;
841
+ for (let i = 0; i < 4 && offset < esds.length; i++) {
842
+ const b = esds[offset++];
843
+ size = size << 7 | b & 127;
844
+ if ((b & 128) === 0) break;
845
+ }
846
+ if (tag === 5) {
847
+ if (offset + size > esds.length) return void 0;
848
+ return esds.subarray(offset, offset + size);
849
+ }
850
+ if (tag === 3) {
851
+ offset += 3;
852
+ } else if (tag === 4) {
853
+ offset += 13;
854
+ } else {
855
+ offset += size;
856
+ }
857
+ }
858
+ return void 0;
859
+ }
860
+ if (void 0) {
861
+ const { describe, test, expect } = void 0;
862
+ describe("codec-utils", () => {
863
+ describe("isAnnexB", () => {
864
+ test("4-byte start code", () => {
865
+ expect(isAnnexB(new Uint8Array([0, 0, 0, 1, 101]))).toBe(true);
866
+ });
867
+ test("3-byte start code", () => {
868
+ expect(isAnnexB(new Uint8Array([0, 0, 1, 101]))).toBe(true);
869
+ });
870
+ test("rejects AVCC", () => {
871
+ expect(isAnnexB(new Uint8Array([0, 0, 0, 10, 101]))).toBe(false);
872
+ });
873
+ });
874
+ describe("findAnnexBStartCode", () => {
875
+ test("at offset 0", () => {
876
+ expect(findAnnexBStartCode(new Uint8Array([0, 0, 0, 1, 101]))).toBe(0);
877
+ });
878
+ test("at offset 5", () => {
879
+ expect(findAnnexBStartCode(new Uint8Array([170, 187, 204, 221, 238, 0, 0, 1, 101]))).toBe(5);
880
+ });
881
+ test("returns -1 when none", () => {
882
+ expect(findAnnexBStartCode(new Uint8Array([170, 187, 204]))).toBe(-1);
883
+ });
884
+ });
885
+ describe("splitAnnexBNalUnits", () => {
886
+ test("splits two NALs", () => {
887
+ const data = new Uint8Array([0, 0, 0, 1, 101, 170, 187, 0, 0, 0, 1, 65, 204]);
888
+ const nals = splitAnnexBNalUnits(data);
889
+ expect(nals.length).toBe(2);
890
+ expect(nals[0]).toEqual(new Uint8Array([101, 170, 187]));
891
+ expect(nals[1]).toEqual(new Uint8Array([65, 204]));
892
+ });
893
+ test("handles 3-byte start codes", () => {
894
+ const nals = splitAnnexBNalUnits(new Uint8Array([0, 0, 1, 103, 66, 0, 0, 1, 104, 1]));
895
+ expect(nals.length).toBe(2);
896
+ });
897
+ });
898
+ describe("annexBToAvcc", () => {
899
+ test("converts single NAL", () => {
900
+ const annexB = new Uint8Array([0, 0, 0, 1, 65, 170, 187]);
901
+ const avcc = annexBToAvcc(annexB);
902
+ expect(avcc[3]).toBe(3);
903
+ expect(avcc[4]).toBe(65);
904
+ });
905
+ test("prepends SPS/PPS", () => {
906
+ const annexB = new Uint8Array([0, 0, 0, 1, 101, 1]);
907
+ const avcc = annexBToAvcc(annexB, { sps: new Uint8Array([103, 66]), pps: new Uint8Array([104, 1]) });
908
+ expect(avcc[3]).toBe(2);
909
+ expect(avcc[4]).toBe(103);
910
+ });
911
+ });
912
+ describe("detectH264Keyframe", () => {
913
+ test("IDR in Annex-B", () => {
914
+ expect(detectH264Keyframe(new Uint8Array([0, 0, 0, 1, 101]))).toBe(true);
915
+ });
916
+ test("SPS in Annex-B", () => {
917
+ expect(detectH264Keyframe(new Uint8Array([0, 0, 0, 1, 103]))).toBe(true);
918
+ });
919
+ test("IDR in AVCC", () => {
920
+ expect(detectH264Keyframe(new Uint8Array([0, 0, 0, 5, 101, 1, 2, 3, 4]))).toBe(true);
921
+ });
922
+ test("IDR after AVCC AUD", () => {
923
+ expect(detectH264Keyframe(new Uint8Array([
924
+ 0,
925
+ 0,
926
+ 0,
927
+ 1,
928
+ 9,
929
+ 0,
930
+ 0,
931
+ 0,
932
+ 2,
933
+ 101,
934
+ 170
935
+ ]))).toBe(true);
936
+ });
937
+ test("non-IDR AVC I-slice in AVCC", () => {
938
+ expect(detectH264Keyframe(new Uint8Array([
939
+ 0,
940
+ 0,
941
+ 0,
942
+ 2,
943
+ 65,
944
+ 136
945
+ ]))).toBe(true);
946
+ });
947
+ test("raw H.264 IDR NAL", () => {
948
+ expect(detectH264Keyframe(new Uint8Array([101, 136, 132]))).toBe(true);
949
+ });
950
+ test("raw H.264 non-IDR I-slice NAL", () => {
951
+ expect(detectH264Keyframe(new Uint8Array([65, 136]))).toBe(true);
952
+ });
953
+ test("classifies partial length-prefixed IDR only when requested", () => {
954
+ const partial = new Uint8Array([0, 0, 32, 0, 101]);
955
+ expect(classifyH264Keyframe(partial)).toBeUndefined();
956
+ expect(classifyH264Keyframe(partial, { allowPartialAvcc: true })).toBe(true);
957
+ });
958
+ test("rejects P-frame", () => {
959
+ expect(detectH264Keyframe(new Uint8Array([0, 0, 0, 1, 65]))).toBe(false);
960
+ });
961
+ test("rejects AVCC sample with only non-IDR slices", () => {
962
+ expect(detectH264Keyframe(new Uint8Array([
963
+ 0,
964
+ 0,
965
+ 0,
966
+ 2,
967
+ 65,
968
+ 192,
969
+ 0,
970
+ 0,
971
+ 0,
972
+ 2,
973
+ 65,
974
+ 192
975
+ ]))).toBe(false);
976
+ });
977
+ });
978
+ describe("avccToAnnexB", () => {
979
+ test("converts with SPS/PPS on keyframe", () => {
980
+ const avcc = new Uint8Array([0, 0, 0, 3, 101, 170, 187]);
981
+ const spsPps = { sps: new Uint8Array([103, 66]), pps: new Uint8Array([104, 1]) };
982
+ const annexB = avccToAnnexB(avcc, true, spsPps);
983
+ expect(annexB[3]).toBe(1);
984
+ expect(annexB[4]).toBe(103);
985
+ });
986
+ });
987
+ describe("codecStringFromAvcC", () => {
988
+ test("derives avc1.64002a", () => {
989
+ expect(codecStringFromAvcC(new Uint8Array([1, 100, 0, 42]))).toBe("avc1.64002a");
990
+ });
991
+ });
992
+ describe("extractAacAscFromInitSegment", () => {
993
+ function buildMinimalAacInit(asc) {
994
+ const box = (type, payload) => {
995
+ const sz = 8 + payload.length;
996
+ const out = new Uint8Array(sz);
997
+ out[0] = sz >>> 24 & 255;
998
+ out[1] = sz >>> 16 & 255;
999
+ out[2] = sz >>> 8 & 255;
1000
+ out[3] = sz & 255;
1001
+ out[4] = type.charCodeAt(0);
1002
+ out[5] = type.charCodeAt(1);
1003
+ out[6] = type.charCodeAt(2);
1004
+ out[7] = type.charCodeAt(3);
1005
+ out.set(payload, 8);
1006
+ return out;
1007
+ };
1008
+ const concat = (...arrs) => {
1009
+ const total = arrs.reduce((n, a) => n + a.length, 0);
1010
+ const out = new Uint8Array(total);
1011
+ let off = 0;
1012
+ for (const a of arrs) {
1013
+ out.set(a, off);
1014
+ off += a.length;
1015
+ }
1016
+ return out;
1017
+ };
1018
+ const ftyp = box("ftyp", new Uint8Array([
1019
+ 105,
1020
+ 115,
1021
+ 111,
1022
+ 53,
1023
+ // 'iso5'
1024
+ 0,
1025
+ 0,
1026
+ 2,
1027
+ 0,
1028
+ // minor 0x200
1029
+ 105,
1030
+ 115,
1031
+ 111,
1032
+ 53,
1033
+ // 'iso5'
1034
+ 105,
1035
+ 115,
1036
+ 111,
1037
+ 54
1038
+ // 'iso6'
1039
+ ]));
1040
+ const dsi = new Uint8Array(2 + asc.length);
1041
+ dsi[0] = 5;
1042
+ dsi[1] = asc.length;
1043
+ dsi.set(asc, 2);
1044
+ const dcd = new Uint8Array(2 + 13 + dsi.length);
1045
+ dcd[0] = 4;
1046
+ dcd[1] = 13 + dsi.length;
1047
+ dcd[2] = 64;
1048
+ dcd[3] = 5 << 2 | 1;
1049
+ dcd.set(dsi, 15);
1050
+ const esd = new Uint8Array(2 + 3 + dcd.length);
1051
+ esd[0] = 3;
1052
+ esd[1] = 3 + dcd.length;
1053
+ esd.set(dcd, 5);
1054
+ const esdsPayload = new Uint8Array(4 + esd.length);
1055
+ esdsPayload.set(esd, 4);
1056
+ const esds = box("esds", esdsPayload);
1057
+ const mp4aFixed = new Uint8Array(28);
1058
+ mp4aFixed[7] = 1;
1059
+ mp4aFixed[16] = 0;
1060
+ mp4aFixed[17] = 1;
1061
+ mp4aFixed[18] = 0;
1062
+ mp4aFixed[19] = 16;
1063
+ mp4aFixed[24] = 187;
1064
+ mp4aFixed[25] = 128;
1065
+ const mp4a = box("mp4a", concat(mp4aFixed, esds));
1066
+ const stsdPayload = new Uint8Array(8 + mp4a.length);
1067
+ stsdPayload[7] = 1;
1068
+ stsdPayload.set(mp4a, 8);
1069
+ const stsd = box("stsd", stsdPayload);
1070
+ const stbl = box("stbl", stsd);
1071
+ const minf = box("minf", stbl);
1072
+ const mdia = box("mdia", minf);
1073
+ const trak = box("trak", mdia);
1074
+ const moov = box("moov", trak);
1075
+ return concat(ftyp, moov);
1076
+ }
1077
+ test("extracts AAC-LC mono 48k ASC and derives codec", () => {
1078
+ const asc = new Uint8Array([17, 136]);
1079
+ const init = buildMinimalAacInit(asc);
1080
+ const result = extractAacAscFromInitSegment(init);
1081
+ expect(result).toBeDefined();
1082
+ expect(result.codec).toBe("mp4a.40.2");
1083
+ expect(Array.from(result.description)).toEqual([17, 136]);
1084
+ });
1085
+ test("derives AOT 5 (HE-AAC) from ASC[0] >> 3", () => {
1086
+ const asc = new Uint8Array([41, 136]);
1087
+ const init = buildMinimalAacInit(asc);
1088
+ expect(extractAacAscFromInitSegment(init)?.codec).toBe("mp4a.40.5");
1089
+ });
1090
+ test("rejects data without ftyp/moov magic", () => {
1091
+ expect(extractAacAscFromInitSegment(new Uint8Array(64))).toBeUndefined();
1092
+ });
1093
+ test("rejects ftyp+moov with no audio (no mp4a sample entry)", () => {
1094
+ const ftyp = new Uint8Array([
1095
+ 0,
1096
+ 0,
1097
+ 0,
1098
+ 24,
1099
+ 102,
1100
+ 116,
1101
+ 121,
1102
+ 112,
1103
+ 105,
1104
+ 115,
1105
+ 111,
1106
+ 53,
1107
+ 0,
1108
+ 0,
1109
+ 2,
1110
+ 0,
1111
+ 105,
1112
+ 115,
1113
+ 111,
1114
+ 53,
1115
+ 105,
1116
+ 115,
1117
+ 111,
1118
+ 54
1119
+ ]);
1120
+ const moov = new Uint8Array([0, 0, 0, 8, 109, 111, 111, 118]);
1121
+ const cat = new Uint8Array(ftyp.length + moov.length);
1122
+ cat.set(ftyp);
1123
+ cat.set(moov, ftyp.length);
1124
+ expect(extractAacAscFromInitSegment(cat)).toBeUndefined();
1125
+ });
1126
+ });
1127
+ describe("hevc", () => {
1128
+ const vps = new Uint8Array([64, 1, 12, 1, 255, 255]);
1129
+ const sps = new Uint8Array([66, 1, 1, 1, 96, 0, 0, 0, 144, 0, 0, 0, 0, 0, 60, 160, 5, 2]);
1130
+ const pps = new Uint8Array([68, 1, 193, 114, 180, 98]);
1131
+ const idr = new Uint8Array([38, 1, 175, 6]);
1132
+ const lp = (...nals) => {
1133
+ const parts = [];
1134
+ for (const n of nals) {
1135
+ parts.push(n.length >> 24 & 255, n.length >> 16 & 255, n.length >> 8 & 255, n.length & 255, ...n);
1136
+ }
1137
+ return Uint8Array.from(parts);
1138
+ };
1139
+ test("isHevcCodec", () => {
1140
+ expect(isHevcCodec("hev1.1.6.L93.B0")).toBe(true);
1141
+ expect(isHevcCodec("hvc1.1.6.L93.B0")).toBe(true);
1142
+ expect(isHevcCodec("avc1.640033")).toBe(false);
1143
+ });
1144
+ test("removeEmulationPrevention strips 0x03", () => {
1145
+ expect(Array.from(removeEmulationPrevention(new Uint8Array([0, 0, 3, 1])))).toEqual([0, 0, 1]);
1146
+ expect(Array.from(removeEmulationPrevention(new Uint8Array([170, 187])))).toEqual([170, 187]);
1147
+ });
1148
+ test("splitAvccNalUnits splits length-prefixed NALs", () => {
1149
+ const nals = splitAvccNalUnits(lp(vps, sps));
1150
+ expect(nals.length).toBe(2);
1151
+ expect(nals[0]).toEqual(vps);
1152
+ expect(nals[1]).toEqual(sps);
1153
+ });
1154
+ test("isCompleteAvccSample accepts complete length-prefixed NAL samples", () => {
1155
+ expect(isCompleteAvccSample(lp(new Uint8Array([9]), idr))).toBe(true);
1156
+ });
1157
+ test("isCompleteAvccSample rejects Annex-B start-code samples", () => {
1158
+ expect(isCompleteAvccSample(new Uint8Array([0, 0, 0, 1, 101, 170]))).toBe(false);
1159
+ });
1160
+ test("isCompleteAvccSample rejects truncated length-prefixed samples", () => {
1161
+ expect(isCompleteAvccSample(new Uint8Array([0, 0, 0, 4, 101, 170]))).toBe(false);
1162
+ });
1163
+ test("normalizeH264SampleToAvcc leaves complete AVCC samples unchanged", () => {
1164
+ const avcc = lp(new Uint8Array([9]), idr);
1165
+ const normalized = normalizeH264SampleToAvcc(avcc);
1166
+ expect(normalized.format).toBe("avcc");
1167
+ expect(normalized.data).toBe(avcc);
1168
+ });
1169
+ test("normalizeH264SampleToAvcc converts a single raw H.264 NAL to AVCC", () => {
1170
+ const raw = new Uint8Array([101, 136, 132]);
1171
+ const normalized = normalizeH264SampleToAvcc(raw);
1172
+ expect(normalized.format).toBe("raw-nal");
1173
+ expect(normalized.data).toEqual(new Uint8Array([0, 0, 0, 3, 101, 136, 132]));
1174
+ });
1175
+ test("splitH264SampleNalUnits exposes Annex-B NALs without AVCC conversion", () => {
1176
+ const annexB = new Uint8Array([0, 0, 0, 1, 101, 136, 132]);
1177
+ const sample = splitH264SampleNalUnits(annexB);
1178
+ expect(sample.format).toBe("annexb");
1179
+ expect(sample.nals).toHaveLength(1);
1180
+ expect(sample.nals[0]).toEqual(new Uint8Array([101, 136, 132]));
1181
+ });
1182
+ test("splitH264SampleNalUnits exposes single raw H.264 NALs without wrapping", () => {
1183
+ const raw = new Uint8Array([101, 136, 132]);
1184
+ const sample = splitH264SampleNalUnits(raw);
1185
+ expect(sample.format).toBe("raw-nal");
1186
+ expect(sample.nals).toEqual([raw]);
1187
+ });
1188
+ test("splitH264SampleNalUnits can expose partial AVCC NAL headers", () => {
1189
+ const partial = new Uint8Array([0, 0, 0, 5, 101, 136]);
1190
+ const sample = splitH264SampleNalUnits(partial, { allowPartialAvcc: true });
1191
+ expect(sample.format).toBe("partial-avcc");
1192
+ expect(sample.nals).toHaveLength(1);
1193
+ expect(sample.nals[0]).toEqual(new Uint8Array([101, 136]));
1194
+ });
1195
+ test("extractHevcParameterSets finds VPS/SPS/PPS (length-prefixed)", () => {
1196
+ const sets = extractHevcParameterSets(lp(vps, sps, pps, idr));
1197
+ expect(sets.vps).toEqual(vps);
1198
+ expect(sets.sps).toEqual(sps);
1199
+ expect(sets.pps).toEqual(pps);
1200
+ });
1201
+ test("extractHevcParameterSets finds VPS/SPS/PPS (Annex-B)", () => {
1202
+ const sc = new Uint8Array([0, 0, 0, 1]);
1203
+ const annexb = Uint8Array.from([...sc, ...vps, ...sc, ...sps, ...sc, ...pps, ...sc, ...idr]);
1204
+ const sets = extractHevcParameterSets(annexb);
1205
+ expect(sets.vps).toEqual(vps);
1206
+ expect(sets.sps).toEqual(sps);
1207
+ expect(sets.pps).toEqual(pps);
1208
+ });
1209
+ test("generateHvcCFromParameterSets builds a valid hvcC", () => {
1210
+ const hvcc = generateHvcCFromParameterSets({ vps, sps, pps });
1211
+ expect(hvcc).not.toBeNull();
1212
+ expect(hvcc[0]).toBe(1);
1213
+ expect(hvcc[1]).toBe(sps[3]);
1214
+ expect(hvcc[22]).toBe(3);
1215
+ expect(hvcc[23] & 63).toBe(32);
1216
+ expect(hvcc[24] << 8 | hvcc[25]).toBe(1);
1217
+ });
1218
+ test("generateHvcCFromParameterSets returns null without SPS/PPS", () => {
1219
+ expect(generateHvcCFromParameterSets({ vps })).toBeNull();
1220
+ });
1221
+ test("extractHevcCodecDescription end-to-end from keyframe", () => {
1222
+ const desc = extractHevcCodecDescription(lp(vps, sps, pps, idr));
1223
+ expect(desc).not.toBeNull();
1224
+ expect(desc[0]).toBe(1);
1225
+ });
1226
+ test("hevcVclOnly strips parameter-set NALs, keeps VCL", () => {
1227
+ const stripped = hevcVclOnly(lp(vps, sps, pps, idr));
1228
+ const nals = splitAvccNalUnits(stripped);
1229
+ expect(nals.length).toBe(1);
1230
+ expect(nals[0]).toEqual(idr);
1231
+ });
1232
+ test("hevcVclOnly is a no-op for VCL-only length-prefixed input", () => {
1233
+ const vclOnly = lp(idr);
1234
+ expect(hevcVclOnly(vclOnly)).toBe(vclOnly);
1235
+ });
1236
+ });
1237
+ });
1238
+ }
1239
+ export {
1240
+ annexBToAvcc,
1241
+ avccToAnnexB,
1242
+ classifyH264Keyframe,
1243
+ codecStringFromAvcC,
1244
+ detectH264Keyframe,
1245
+ extractAacAscFromInitSegment,
1246
+ extractAvcCFromInitSegment,
1247
+ extractCodecDescriptionFromAnnexB,
1248
+ extractHevcCodecDescription,
1249
+ extractHevcParameterSets,
1250
+ extractSpsPpsFromAvcC,
1251
+ findAnnexBStartCode,
1252
+ generateFallbackAvcC,
1253
+ generateHvcCFromParameterSets,
1254
+ hevcVclOnly,
1255
+ isAnnexB,
1256
+ isCompleteAvccSample,
1257
+ isFmp4InitSegment,
1258
+ isHevcCodec,
1259
+ mmtpTimestampToMicros,
1260
+ normalizeH264SampleToAvcc,
1261
+ normalizeMmtpInitSegment,
1262
+ removeEmulationPrevention,
1263
+ splitAnnexBNalUnits,
1264
+ splitAvccNalUnits,
1265
+ splitH264SampleNalUnits,
1266
+ wrapAdtsFrame
1267
+ };
1268
+ //# sourceMappingURL=codec-utils.js.map