mattebox 0.1.0

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 (471) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +106 -0
  3. package/dist/cdn/mattebox.dash-drm.min.js +2 -0
  4. package/dist/cdn/mattebox.dash.min.js +2 -0
  5. package/dist/cdn/mattebox.dual-drm.min.js +2 -0
  6. package/dist/cdn/mattebox.dual-ts-drm.min.js +3 -0
  7. package/dist/cdn/mattebox.dual-ts.min.js +3 -0
  8. package/dist/cdn/mattebox.dual.min.js +2 -0
  9. package/dist/cdn/mattebox.hls-drm.min.js +2 -0
  10. package/dist/cdn/mattebox.hls-ts-drm.min.js +3 -0
  11. package/dist/cdn/mattebox.hls-ts.min.js +3 -0
  12. package/dist/cdn/mattebox.hls.min.js +2 -0
  13. package/dist/cdn/mattebox.kernel.min.js +1 -0
  14. package/dist/cdn/mattebox.min.js +6 -0
  15. package/dist/cdn/transmux.worker.js +1 -0
  16. package/dist/containers/adts.d.ts +33 -0
  17. package/dist/containers/adts.d.ts.map +1 -0
  18. package/dist/containers/adts.js +66 -0
  19. package/dist/containers/adts.js.map +1 -0
  20. package/dist/containers/captions.d.ts +27 -0
  21. package/dist/containers/captions.d.ts.map +1 -0
  22. package/dist/containers/captions.js +36 -0
  23. package/dist/containers/captions.js.map +1 -0
  24. package/dist/containers/codec-probe/index.d.ts +35 -0
  25. package/dist/containers/codec-probe/index.d.ts.map +1 -0
  26. package/dist/containers/codec-probe/index.js +222 -0
  27. package/dist/containers/codec-probe/index.js.map +1 -0
  28. package/dist/containers/fmp4/writer.d.ts +62 -0
  29. package/dist/containers/fmp4/writer.d.ts.map +1 -0
  30. package/dist/containers/fmp4/writer.js +201 -0
  31. package/dist/containers/fmp4/writer.js.map +1 -0
  32. package/dist/containers/id3.d.ts +25 -0
  33. package/dist/containers/id3.d.ts.map +1 -0
  34. package/dist/containers/id3.js +75 -0
  35. package/dist/containers/id3.js.map +1 -0
  36. package/dist/containers/mp4-box/index.d.ts +79 -0
  37. package/dist/containers/mp4-box/index.d.ts.map +1 -0
  38. package/dist/containers/mp4-box/index.js +231 -0
  39. package/dist/containers/mp4-box/index.js.map +1 -0
  40. package/dist/containers/packed-audio/index.d.ts +7 -0
  41. package/dist/containers/packed-audio/index.d.ts.map +1 -0
  42. package/dist/containers/packed-audio/index.js +63 -0
  43. package/dist/containers/packed-audio/index.js.map +1 -0
  44. package/dist/containers/sei.d.ts +26 -0
  45. package/dist/containers/sei.d.ts.map +1 -0
  46. package/dist/containers/sei.js +100 -0
  47. package/dist/containers/sei.js.map +1 -0
  48. package/dist/containers/ts-transmux/demux.d.ts +49 -0
  49. package/dist/containers/ts-transmux/demux.d.ts.map +1 -0
  50. package/dist/containers/ts-transmux/demux.js +222 -0
  51. package/dist/containers/ts-transmux/demux.js.map +1 -0
  52. package/dist/containers/ts-transmux/h264.d.ts +48 -0
  53. package/dist/containers/ts-transmux/h264.d.ts.map +1 -0
  54. package/dist/containers/ts-transmux/h264.js +211 -0
  55. package/dist/containers/ts-transmux/h264.js.map +1 -0
  56. package/dist/containers/ts-transmux/index.d.ts +17 -0
  57. package/dist/containers/ts-transmux/index.d.ts.map +1 -0
  58. package/dist/containers/ts-transmux/index.js +34 -0
  59. package/dist/containers/ts-transmux/index.js.map +1 -0
  60. package/dist/containers/ts-transmux/runner.d.ts +23 -0
  61. package/dist/containers/ts-transmux/runner.d.ts.map +1 -0
  62. package/dist/containers/ts-transmux/runner.js +99 -0
  63. package/dist/containers/ts-transmux/runner.js.map +1 -0
  64. package/dist/containers/ts-transmux/transmux.d.ts +24 -0
  65. package/dist/containers/ts-transmux/transmux.d.ts.map +1 -0
  66. package/dist/containers/ts-transmux/transmux.js +212 -0
  67. package/dist/containers/ts-transmux/transmux.js.map +1 -0
  68. package/dist/containers/ts-transmux/transmux.worker.d.ts +2 -0
  69. package/dist/containers/ts-transmux/transmux.worker.d.ts.map +1 -0
  70. package/dist/containers/ts-transmux/transmux.worker.js +19 -0
  71. package/dist/containers/ts-transmux/transmux.worker.js.map +1 -0
  72. package/dist/es2015/_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/asyncToGenerator.js +27 -0
  73. package/dist/es2015/_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/defineProperty.js +12 -0
  74. package/dist/es2015/_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/objectSpread2.js +25 -0
  75. package/dist/es2015/_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/objectWithoutProperties.js +13 -0
  76. package/dist/es2015/_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/objectWithoutPropertiesLoose.js +12 -0
  77. package/dist/es2015/_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/toPrimitive.js +14 -0
  78. package/dist/es2015/_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/toPropertyKey.js +9 -0
  79. package/dist/es2015/_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/typeof.js +11 -0
  80. package/dist/es2015/containers/adts.js +77 -0
  81. package/dist/es2015/containers/captions.js +36 -0
  82. package/dist/es2015/containers/codec-probe/index.js +220 -0
  83. package/dist/es2015/containers/fmp4/writer.js +165 -0
  84. package/dist/es2015/containers/id3.js +72 -0
  85. package/dist/es2015/containers/mp4-box/index.js +209 -0
  86. package/dist/es2015/containers/packed-audio/index.js +67 -0
  87. package/dist/es2015/containers/sei.js +79 -0
  88. package/dist/es2015/containers/ts-transmux/demux.js +211 -0
  89. package/dist/es2015/containers/ts-transmux/h264.js +204 -0
  90. package/dist/es2015/containers/ts-transmux/index.js +37 -0
  91. package/dist/es2015/containers/ts-transmux/runner.js +95 -0
  92. package/dist/es2015/containers/ts-transmux/transmux.js +210 -0
  93. package/dist/es2015/containers/ts-transmux/transmux.worker.js +26 -0
  94. package/dist/es2015/index.js +356 -0
  95. package/dist/es2015/kernel/append-queue.js +148 -0
  96. package/dist/es2015/kernel/bus.js +134 -0
  97. package/dist/es2015/kernel/context.js +92 -0
  98. package/dist/es2015/kernel/effects.js +62 -0
  99. package/dist/es2015/kernel/evictor.js +67 -0
  100. package/dist/es2015/kernel/lifecycle.js +122 -0
  101. package/dist/es2015/kernel/loader.js +108 -0
  102. package/dist/es2015/kernel/mime.js +20 -0
  103. package/dist/es2015/kernel/mse.js +426 -0
  104. package/dist/es2015/kernel/reducer.js +1051 -0
  105. package/dist/es2015/kernel/rendition-select.js +263 -0
  106. package/dist/es2015/kernel/scheduler.js +82 -0
  107. package/dist/es2015/kernel/sinks/metadata-sink.js +7 -0
  108. package/dist/es2015/kernel/sinks/mse-sink.js +31 -0
  109. package/dist/es2015/kernel/sinks/text-track-sink.js +167 -0
  110. package/dist/es2015/kernel/timeline.js +127 -0
  111. package/dist/es2015/kernel/trace.js +134 -0
  112. package/dist/es2015/kernel/track-registry.js +47 -0
  113. package/dist/es2015/kernel/transport.js +242 -0
  114. package/dist/es2015/kernel/watchdog.js +38 -0
  115. package/dist/es2015/presets/dash/index.js +9 -0
  116. package/dist/es2015/presets/dash-drm/index.js +13 -0
  117. package/dist/es2015/presets/define.js +45 -0
  118. package/dist/es2015/presets/dual/index.js +14 -0
  119. package/dist/es2015/presets/dual-drm/index.js +14 -0
  120. package/dist/es2015/presets/dual-ts/index.js +14 -0
  121. package/dist/es2015/presets/dual-ts-drm/index.js +15 -0
  122. package/dist/es2015/presets/full/index.js +28 -0
  123. package/dist/es2015/presets/hls/index.js +9 -0
  124. package/dist/es2015/presets/hls-drm/index.js +13 -0
  125. package/dist/es2015/presets/hls-ts/index.js +13 -0
  126. package/dist/es2015/presets/hls-ts-drm/index.js +14 -0
  127. package/dist/es2015/presets/kernel/index.js +10 -0
  128. package/dist/es2015/presets/storage.js +24 -0
  129. package/dist/es2015/presets/tiers.js +93 -0
  130. package/dist/es2015/protocols/dash-cmaf/index.js +161 -0
  131. package/dist/es2015/protocols/dash-cmaf/parse.js +491 -0
  132. package/dist/es2015/protocols/dash-live/index.js +192 -0
  133. package/dist/es2015/protocols/hls-cmaf/index.js +168 -0
  134. package/dist/es2015/protocols/hls-cmaf/lexer.js +72 -0
  135. package/dist/es2015/protocols/hls-cmaf/parse.js +457 -0
  136. package/dist/es2015/protocols/hls-live/index.js +296 -0
  137. package/dist/es2015/protocols/live-shared.js +29 -0
  138. package/dist/es2015/stages/abr/index.js +126 -0
  139. package/dist/es2015/stages/abr-cap-size/index.js +22 -0
  140. package/dist/es2015/stages/abr-persist/index.js +52 -0
  141. package/dist/es2015/stages/aes-128/index.js +76 -0
  142. package/dist/es2015/stages/alt-audio/index.js +80 -0
  143. package/dist/es2015/stages/cmaf-timing/index.js +55 -0
  144. package/dist/es2015/stages/cmcd/index.js +70 -0
  145. package/dist/es2015/stages/codec-probe/index.js +65 -0
  146. package/dist/es2015/stages/codec-switch/index.js +48 -0
  147. package/dist/es2015/stages/content-steering/index.js +179 -0
  148. package/dist/es2015/stages/drm-shared.js +18 -0
  149. package/dist/es2015/stages/eme-cenc/index.js +46 -0
  150. package/dist/es2015/stages/eme-core/index.js +237 -0
  151. package/dist/es2015/stages/eme-fairplay/index.js +52 -0
  152. package/dist/es2015/stages/meta-id3/index.js +37 -0
  153. package/dist/es2015/stages/mp4-box/index.js +27 -0
  154. package/dist/es2015/stages/nal-scan/index.js +121 -0
  155. package/dist/es2015/stages/pdt/index.js +34 -0
  156. package/dist/es2015/stages/recovery/index.js +283 -0
  157. package/dist/es2015/stages/text-cea608/decode.js +201 -0
  158. package/dist/es2015/stages/text-cea608/index.js +71 -0
  159. package/dist/es2015/stages/text-webvtt/index.js +82 -0
  160. package/dist/es2015/stages/text-webvtt/parse.js +60 -0
  161. package/dist/es2015/stages/text-webvtt-segmented/index.js +57 -0
  162. package/dist/es2015/stages/thumbnails/index.js +73 -0
  163. package/dist/index.d.ts +32 -0
  164. package/dist/index.d.ts.map +1 -0
  165. package/dist/index.js +423 -0
  166. package/dist/index.js.map +1 -0
  167. package/dist/kernel/append-queue.d.ts +47 -0
  168. package/dist/kernel/append-queue.d.ts.map +1 -0
  169. package/dist/kernel/append-queue.js +180 -0
  170. package/dist/kernel/append-queue.js.map +1 -0
  171. package/dist/kernel/bus.d.ts +50 -0
  172. package/dist/kernel/bus.d.ts.map +1 -0
  173. package/dist/kernel/bus.js +147 -0
  174. package/dist/kernel/bus.js.map +1 -0
  175. package/dist/kernel/context.d.ts +45 -0
  176. package/dist/kernel/context.d.ts.map +1 -0
  177. package/dist/kernel/context.js +116 -0
  178. package/dist/kernel/context.js.map +1 -0
  179. package/dist/kernel/effects.d.ts +33 -0
  180. package/dist/kernel/effects.d.ts.map +1 -0
  181. package/dist/kernel/effects.js +65 -0
  182. package/dist/kernel/effects.js.map +1 -0
  183. package/dist/kernel/evictor.d.ts +46 -0
  184. package/dist/kernel/evictor.d.ts.map +1 -0
  185. package/dist/kernel/evictor.js +92 -0
  186. package/dist/kernel/evictor.js.map +1 -0
  187. package/dist/kernel/lifecycle.d.ts +41 -0
  188. package/dist/kernel/lifecycle.d.ts.map +1 -0
  189. package/dist/kernel/lifecycle.js +129 -0
  190. package/dist/kernel/lifecycle.js.map +1 -0
  191. package/dist/kernel/loader.d.ts +28 -0
  192. package/dist/kernel/loader.d.ts.map +1 -0
  193. package/dist/kernel/loader.js +126 -0
  194. package/dist/kernel/loader.js.map +1 -0
  195. package/dist/kernel/mime.d.ts +13 -0
  196. package/dist/kernel/mime.d.ts.map +1 -0
  197. package/dist/kernel/mime.js +18 -0
  198. package/dist/kernel/mime.js.map +1 -0
  199. package/dist/kernel/mse.d.ts +62 -0
  200. package/dist/kernel/mse.d.ts.map +1 -0
  201. package/dist/kernel/mse.js +490 -0
  202. package/dist/kernel/mse.js.map +1 -0
  203. package/dist/kernel/reducer.d.ts +39 -0
  204. package/dist/kernel/reducer.d.ts.map +1 -0
  205. package/dist/kernel/reducer.js +1316 -0
  206. package/dist/kernel/reducer.js.map +1 -0
  207. package/dist/kernel/rendition-select.d.ts +102 -0
  208. package/dist/kernel/rendition-select.d.ts.map +1 -0
  209. package/dist/kernel/rendition-select.js +295 -0
  210. package/dist/kernel/rendition-select.js.map +1 -0
  211. package/dist/kernel/scheduler.d.ts +57 -0
  212. package/dist/kernel/scheduler.d.ts.map +1 -0
  213. package/dist/kernel/scheduler.js +98 -0
  214. package/dist/kernel/scheduler.js.map +1 -0
  215. package/dist/kernel/sinks/metadata-sink.d.ts +7 -0
  216. package/dist/kernel/sinks/metadata-sink.d.ts.map +1 -0
  217. package/dist/kernel/sinks/metadata-sink.js +5 -0
  218. package/dist/kernel/sinks/metadata-sink.js.map +1 -0
  219. package/dist/kernel/sinks/mse-sink.d.ts +17 -0
  220. package/dist/kernel/sinks/mse-sink.d.ts.map +1 -0
  221. package/dist/kernel/sinks/mse-sink.js +20 -0
  222. package/dist/kernel/sinks/mse-sink.js.map +1 -0
  223. package/dist/kernel/sinks/text-track-sink.d.ts +45 -0
  224. package/dist/kernel/sinks/text-track-sink.d.ts.map +1 -0
  225. package/dist/kernel/sinks/text-track-sink.js +184 -0
  226. package/dist/kernel/sinks/text-track-sink.js.map +1 -0
  227. package/dist/kernel/timeline.d.ts +57 -0
  228. package/dist/kernel/timeline.d.ts.map +1 -0
  229. package/dist/kernel/timeline.js +203 -0
  230. package/dist/kernel/timeline.js.map +1 -0
  231. package/dist/kernel/trace.d.ts +42 -0
  232. package/dist/kernel/trace.d.ts.map +1 -0
  233. package/dist/kernel/trace.js +165 -0
  234. package/dist/kernel/trace.js.map +1 -0
  235. package/dist/kernel/track-registry.d.ts +22 -0
  236. package/dist/kernel/track-registry.d.ts.map +1 -0
  237. package/dist/kernel/track-registry.js +42 -0
  238. package/dist/kernel/track-registry.js.map +1 -0
  239. package/dist/kernel/transport.d.ts +90 -0
  240. package/dist/kernel/transport.d.ts.map +1 -0
  241. package/dist/kernel/transport.js +256 -0
  242. package/dist/kernel/transport.js.map +1 -0
  243. package/dist/kernel/watchdog.d.ts +35 -0
  244. package/dist/kernel/watchdog.d.ts.map +1 -0
  245. package/dist/kernel/watchdog.js +43 -0
  246. package/dist/kernel/watchdog.js.map +1 -0
  247. package/dist/presets/dash/index.d.ts +4 -0
  248. package/dist/presets/dash/index.d.ts.map +1 -0
  249. package/dist/presets/dash/index.js +8 -0
  250. package/dist/presets/dash/index.js.map +1 -0
  251. package/dist/presets/dash-drm/index.d.ts +4 -0
  252. package/dist/presets/dash-drm/index.d.ts.map +1 -0
  253. package/dist/presets/dash-drm/index.js +8 -0
  254. package/dist/presets/dash-drm/index.js.map +1 -0
  255. package/dist/presets/define.d.ts +36 -0
  256. package/dist/presets/define.d.ts.map +1 -0
  257. package/dist/presets/define.js +39 -0
  258. package/dist/presets/define.js.map +1 -0
  259. package/dist/presets/dual/index.d.ts +4 -0
  260. package/dist/presets/dual/index.d.ts.map +1 -0
  261. package/dist/presets/dual/index.js +9 -0
  262. package/dist/presets/dual/index.js.map +1 -0
  263. package/dist/presets/dual-drm/index.d.ts +4 -0
  264. package/dist/presets/dual-drm/index.d.ts.map +1 -0
  265. package/dist/presets/dual-drm/index.js +13 -0
  266. package/dist/presets/dual-drm/index.js.map +1 -0
  267. package/dist/presets/dual-ts/index.d.ts +4 -0
  268. package/dist/presets/dual-ts/index.d.ts.map +1 -0
  269. package/dist/presets/dual-ts/index.js +8 -0
  270. package/dist/presets/dual-ts/index.js.map +1 -0
  271. package/dist/presets/dual-ts-drm/index.d.ts +4 -0
  272. package/dist/presets/dual-ts-drm/index.d.ts.map +1 -0
  273. package/dist/presets/dual-ts-drm/index.js +14 -0
  274. package/dist/presets/dual-ts-drm/index.js.map +1 -0
  275. package/dist/presets/full/index.d.ts +4 -0
  276. package/dist/presets/full/index.d.ts.map +1 -0
  277. package/dist/presets/full/index.js +27 -0
  278. package/dist/presets/full/index.js.map +1 -0
  279. package/dist/presets/hls/index.d.ts +4 -0
  280. package/dist/presets/hls/index.d.ts.map +1 -0
  281. package/dist/presets/hls/index.js +8 -0
  282. package/dist/presets/hls/index.js.map +1 -0
  283. package/dist/presets/hls-drm/index.d.ts +4 -0
  284. package/dist/presets/hls-drm/index.d.ts.map +1 -0
  285. package/dist/presets/hls-drm/index.js +8 -0
  286. package/dist/presets/hls-drm/index.js.map +1 -0
  287. package/dist/presets/hls-ts/index.d.ts +4 -0
  288. package/dist/presets/hls-ts/index.d.ts.map +1 -0
  289. package/dist/presets/hls-ts/index.js +8 -0
  290. package/dist/presets/hls-ts/index.js.map +1 -0
  291. package/dist/presets/hls-ts-drm/index.d.ts +4 -0
  292. package/dist/presets/hls-ts-drm/index.d.ts.map +1 -0
  293. package/dist/presets/hls-ts-drm/index.js +13 -0
  294. package/dist/presets/hls-ts-drm/index.js.map +1 -0
  295. package/dist/presets/kernel/index.d.ts +4 -0
  296. package/dist/presets/kernel/index.d.ts.map +1 -0
  297. package/dist/presets/kernel/index.js +9 -0
  298. package/dist/presets/kernel/index.js.map +1 -0
  299. package/dist/presets/storage.d.ts +9 -0
  300. package/dist/presets/storage.d.ts.map +1 -0
  301. package/dist/presets/storage.js +24 -0
  302. package/dist/presets/storage.js.map +1 -0
  303. package/dist/presets/tiers.d.ts +22 -0
  304. package/dist/presets/tiers.d.ts.map +1 -0
  305. package/dist/presets/tiers.js +78 -0
  306. package/dist/presets/tiers.js.map +1 -0
  307. package/dist/protocols/dash-cmaf/index.d.ts +20 -0
  308. package/dist/protocols/dash-cmaf/index.d.ts.map +1 -0
  309. package/dist/protocols/dash-cmaf/index.js +176 -0
  310. package/dist/protocols/dash-cmaf/index.js.map +1 -0
  311. package/dist/protocols/dash-cmaf/parse.d.ts +24 -0
  312. package/dist/protocols/dash-cmaf/parse.d.ts.map +1 -0
  313. package/dist/protocols/dash-cmaf/parse.js +586 -0
  314. package/dist/protocols/dash-cmaf/parse.js.map +1 -0
  315. package/dist/protocols/dash-live/index.d.ts +4 -0
  316. package/dist/protocols/dash-live/index.d.ts.map +1 -0
  317. package/dist/protocols/dash-live/index.js +188 -0
  318. package/dist/protocols/dash-live/index.js.map +1 -0
  319. package/dist/protocols/hls-cmaf/index.d.ts +17 -0
  320. package/dist/protocols/hls-cmaf/index.d.ts.map +1 -0
  321. package/dist/protocols/hls-cmaf/index.js +189 -0
  322. package/dist/protocols/hls-cmaf/index.js.map +1 -0
  323. package/dist/protocols/hls-cmaf/lexer.d.ts +25 -0
  324. package/dist/protocols/hls-cmaf/lexer.d.ts.map +1 -0
  325. package/dist/protocols/hls-cmaf/lexer.js +81 -0
  326. package/dist/protocols/hls-cmaf/lexer.js.map +1 -0
  327. package/dist/protocols/hls-cmaf/parse.d.ts +57 -0
  328. package/dist/protocols/hls-cmaf/parse.d.ts.map +1 -0
  329. package/dist/protocols/hls-cmaf/parse.js +572 -0
  330. package/dist/protocols/hls-cmaf/parse.js.map +1 -0
  331. package/dist/protocols/hls-live/index.d.ts +4 -0
  332. package/dist/protocols/hls-live/index.d.ts.map +1 -0
  333. package/dist/protocols/hls-live/index.js +309 -0
  334. package/dist/protocols/hls-live/index.js.map +1 -0
  335. package/dist/protocols/live-shared.d.ts +21 -0
  336. package/dist/protocols/live-shared.d.ts.map +1 -0
  337. package/dist/protocols/live-shared.js +32 -0
  338. package/dist/protocols/live-shared.js.map +1 -0
  339. package/dist/stages/abr/index.d.ts +16 -0
  340. package/dist/stages/abr/index.d.ts.map +1 -0
  341. package/dist/stages/abr/index.js +176 -0
  342. package/dist/stages/abr/index.js.map +1 -0
  343. package/dist/stages/abr-cap-size/index.d.ts +8 -0
  344. package/dist/stages/abr-cap-size/index.d.ts.map +1 -0
  345. package/dist/stages/abr-cap-size/index.js +21 -0
  346. package/dist/stages/abr-cap-size/index.js.map +1 -0
  347. package/dist/stages/abr-persist/index.d.ts +8 -0
  348. package/dist/stages/abr-persist/index.d.ts.map +1 -0
  349. package/dist/stages/abr-persist/index.js +44 -0
  350. package/dist/stages/abr-persist/index.js.map +1 -0
  351. package/dist/stages/aes-128/index.d.ts +15 -0
  352. package/dist/stages/aes-128/index.d.ts.map +1 -0
  353. package/dist/stages/aes-128/index.js +78 -0
  354. package/dist/stages/aes-128/index.js.map +1 -0
  355. package/dist/stages/alt-audio/index.d.ts +4 -0
  356. package/dist/stages/alt-audio/index.d.ts.map +1 -0
  357. package/dist/stages/alt-audio/index.js +90 -0
  358. package/dist/stages/alt-audio/index.js.map +1 -0
  359. package/dist/stages/cmaf-timing/index.d.ts +3 -0
  360. package/dist/stages/cmaf-timing/index.d.ts.map +1 -0
  361. package/dist/stages/cmaf-timing/index.js +56 -0
  362. package/dist/stages/cmaf-timing/index.js.map +1 -0
  363. package/dist/stages/cmcd/index.d.ts +22 -0
  364. package/dist/stages/cmcd/index.d.ts.map +1 -0
  365. package/dist/stages/cmcd/index.js +92 -0
  366. package/dist/stages/cmcd/index.js.map +1 -0
  367. package/dist/stages/codec-probe/index.d.ts +9 -0
  368. package/dist/stages/codec-probe/index.d.ts.map +1 -0
  369. package/dist/stages/codec-probe/index.js +68 -0
  370. package/dist/stages/codec-probe/index.js.map +1 -0
  371. package/dist/stages/codec-switch/index.d.ts +6 -0
  372. package/dist/stages/codec-switch/index.d.ts.map +1 -0
  373. package/dist/stages/codec-switch/index.js +59 -0
  374. package/dist/stages/codec-switch/index.js.map +1 -0
  375. package/dist/stages/content-steering/index.d.ts +4 -0
  376. package/dist/stages/content-steering/index.d.ts.map +1 -0
  377. package/dist/stages/content-steering/index.js +174 -0
  378. package/dist/stages/content-steering/index.js.map +1 -0
  379. package/dist/stages/drm-shared.d.ts +46 -0
  380. package/dist/stages/drm-shared.d.ts.map +1 -0
  381. package/dist/stages/drm-shared.js +28 -0
  382. package/dist/stages/drm-shared.js.map +1 -0
  383. package/dist/stages/eme-cenc/index.d.ts +12 -0
  384. package/dist/stages/eme-cenc/index.d.ts.map +1 -0
  385. package/dist/stages/eme-cenc/index.js +53 -0
  386. package/dist/stages/eme-cenc/index.js.map +1 -0
  387. package/dist/stages/eme-core/index.d.ts +29 -0
  388. package/dist/stages/eme-core/index.d.ts.map +1 -0
  389. package/dist/stages/eme-core/index.js +244 -0
  390. package/dist/stages/eme-core/index.js.map +1 -0
  391. package/dist/stages/eme-fairplay/index.d.ts +20 -0
  392. package/dist/stages/eme-fairplay/index.d.ts.map +1 -0
  393. package/dist/stages/eme-fairplay/index.js +59 -0
  394. package/dist/stages/eme-fairplay/index.js.map +1 -0
  395. package/dist/stages/meta-id3/index.d.ts +14 -0
  396. package/dist/stages/meta-id3/index.d.ts.map +1 -0
  397. package/dist/stages/meta-id3/index.js +30 -0
  398. package/dist/stages/meta-id3/index.js.map +1 -0
  399. package/dist/stages/mp4-box/index.d.ts +3 -0
  400. package/dist/stages/mp4-box/index.d.ts.map +1 -0
  401. package/dist/stages/mp4-box/index.js +19 -0
  402. package/dist/stages/mp4-box/index.js.map +1 -0
  403. package/dist/stages/nal-scan/index.d.ts +3 -0
  404. package/dist/stages/nal-scan/index.d.ts.map +1 -0
  405. package/dist/stages/nal-scan/index.js +123 -0
  406. package/dist/stages/nal-scan/index.js.map +1 -0
  407. package/dist/stages/pdt/index.d.ts +14 -0
  408. package/dist/stages/pdt/index.d.ts.map +1 -0
  409. package/dist/stages/pdt/index.js +34 -0
  410. package/dist/stages/pdt/index.js.map +1 -0
  411. package/dist/stages/recovery/index.d.ts +16 -0
  412. package/dist/stages/recovery/index.d.ts.map +1 -0
  413. package/dist/stages/recovery/index.js +270 -0
  414. package/dist/stages/recovery/index.js.map +1 -0
  415. package/dist/stages/text-cea608/decode.d.ts +44 -0
  416. package/dist/stages/text-cea608/decode.d.ts.map +1 -0
  417. package/dist/stages/text-cea608/decode.js +225 -0
  418. package/dist/stages/text-cea608/decode.js.map +1 -0
  419. package/dist/stages/text-cea608/index.d.ts +3 -0
  420. package/dist/stages/text-cea608/index.d.ts.map +1 -0
  421. package/dist/stages/text-cea608/index.js +84 -0
  422. package/dist/stages/text-cea608/index.js.map +1 -0
  423. package/dist/stages/text-webvtt/index.d.ts +3 -0
  424. package/dist/stages/text-webvtt/index.d.ts.map +1 -0
  425. package/dist/stages/text-webvtt/index.js +82 -0
  426. package/dist/stages/text-webvtt/index.js.map +1 -0
  427. package/dist/stages/text-webvtt/parse.d.ts +19 -0
  428. package/dist/stages/text-webvtt/parse.d.ts.map +1 -0
  429. package/dist/stages/text-webvtt/parse.js +62 -0
  430. package/dist/stages/text-webvtt/parse.js.map +1 -0
  431. package/dist/stages/text-webvtt-segmented/index.d.ts +5 -0
  432. package/dist/stages/text-webvtt-segmented/index.d.ts.map +1 -0
  433. package/dist/stages/text-webvtt-segmented/index.js +63 -0
  434. package/dist/stages/text-webvtt-segmented/index.js.map +1 -0
  435. package/dist/stages/thumbnails/index.d.ts +34 -0
  436. package/dist/stages/thumbnails/index.d.ts.map +1 -0
  437. package/dist/stages/thumbnails/index.js +58 -0
  438. package/dist/stages/thumbnails/index.js.map +1 -0
  439. package/dist/types/error.d.ts +33 -0
  440. package/dist/types/error.d.ts.map +1 -0
  441. package/dist/types/error.js +7 -0
  442. package/dist/types/error.js.map +1 -0
  443. package/dist/types/facade.d.ts +104 -0
  444. package/dist/types/facade.d.ts.map +1 -0
  445. package/dist/types/facade.js +2 -0
  446. package/dist/types/facade.js.map +1 -0
  447. package/dist/types/ir.d.ts +238 -0
  448. package/dist/types/ir.d.ts.map +1 -0
  449. package/dist/types/ir.js +7 -0
  450. package/dist/types/ir.js.map +1 -0
  451. package/dist/types/kernel.d.ts +217 -0
  452. package/dist/types/kernel.d.ts.map +1 -0
  453. package/dist/types/kernel.js +2 -0
  454. package/dist/types/kernel.js.map +1 -0
  455. package/dist/types/messages.d.ts +288 -0
  456. package/dist/types/messages.d.ts.map +1 -0
  457. package/dist/types/messages.js +2 -0
  458. package/dist/types/messages.js.map +1 -0
  459. package/dist/types/quality.d.ts +108 -0
  460. package/dist/types/quality.d.ts.map +1 -0
  461. package/dist/types/quality.js +2 -0
  462. package/dist/types/quality.js.map +1 -0
  463. package/dist/types/sink.d.ts +27 -0
  464. package/dist/types/sink.d.ts.map +1 -0
  465. package/dist/types/sink.js +2 -0
  466. package/dist/types/sink.js.map +1 -0
  467. package/dist/types/stage.d.ts +139 -0
  468. package/dist/types/stage.d.ts.map +1 -0
  469. package/dist/types/stage.js +2 -0
  470. package/dist/types/stage.js.map +1 -0
  471. package/package.json +132 -0
@@ -0,0 +1,201 @@
1
+ /**
2
+ * A minimal fragmented-ISOBMFF writer, the counterpart to mp4-box's reader.
3
+ * It emits exactly the boxes MSE needs to accept a fragment: an init segment
4
+ * (ftyp + a moov with one trak per elementary stream and an mvex) and a
5
+ * media segment (moof + mdat). A muxed TS segment becomes one init with a
6
+ * video trak and an audio trak, so a single SourceBuffer decodes both.
7
+ * Nothing here reads the clock or a random source: identical samples in
8
+ * produce identical bytes out, which is what the golden fixtures pin.
9
+ *
10
+ * ts-transmux and packed-audio both import this module. It is a shared
11
+ * container utility, not a stage, so neither imports the other.
12
+ */
13
+ // ---- box primitives -------------------------------------------------------
14
+ function fourcc(type) {
15
+ return [type.charCodeAt(0), type.charCodeAt(1), type.charCodeAt(2), type.charCodeAt(3)];
16
+ }
17
+ /** Concatenates children under a box header. Sizes are computed, never assumed. */
18
+ function box(type, ...children) {
19
+ let length = 8;
20
+ for (const child of children)
21
+ length += child.byteLength;
22
+ const out = new Uint8Array(length);
23
+ new DataView(out.buffer).setUint32(0, length);
24
+ out.set(fourcc(type), 4);
25
+ let offset = 8;
26
+ for (const child of children) {
27
+ out.set(child, offset);
28
+ offset += child.byteLength;
29
+ }
30
+ return out;
31
+ }
32
+ /** A FullBox: version byte plus 24-bit flags ahead of the payload. */
33
+ function fullBox(type, version, flags, ...children) {
34
+ const head = u8(version, (flags >> 16) & 0xff, (flags >> 8) & 0xff, flags & 0xff);
35
+ return box(type, head, ...children);
36
+ }
37
+ function u8(...values) {
38
+ return Uint8Array.from(values, (v) => v & 0xff);
39
+ }
40
+ function u16(value) {
41
+ return u8((value >> 8) & 0xff, value & 0xff);
42
+ }
43
+ function u32(value) {
44
+ return u8((value >>> 24) & 0xff, (value >> 16) & 0xff, (value >> 8) & 0xff, value & 0xff);
45
+ }
46
+ /** A 64-bit unsigned as two 32-bit halves; JS numbers hold this range exactly to 2^53. */
47
+ function u64(value) {
48
+ return concat(u32(Math.floor(value / 0x1_0000_0000)), u32(value >>> 0));
49
+ }
50
+ function concat(...parts) {
51
+ let length = 0;
52
+ for (const part of parts)
53
+ length += part.byteLength;
54
+ const out = new Uint8Array(length);
55
+ let offset = 0;
56
+ for (const part of parts) {
57
+ out.set(part, offset);
58
+ offset += part.byteLength;
59
+ }
60
+ return out;
61
+ }
62
+ const UNITY_MATRIX = concat(u32(0x0001_0000), u32(0), u32(0), u32(0), u32(0x0001_0000), u32(0), u32(0), u32(0), u32(0x4000_0000));
63
+ // ---- init segment ---------------------------------------------------------
64
+ function ftyp() {
65
+ return box('ftyp', u8(...fourcc('isom')), u32(0x200), u8(...fourcc('isom')), u8(...fourcc('iso6')), u8(...fourcc('mp41')));
66
+ }
67
+ function avcC(config) {
68
+ const { sps, pps } = config;
69
+ return box('avcC', u8(1, sps[1] ?? 0, sps[2] ?? 0, sps[3] ?? 0),
70
+ // lengthSizeMinusOne: 0xFF -> reserved bits set, 4-byte NAL length.
71
+ u8(0xff),
72
+ // numOfSequenceParameterSets: reserved bits set, count 1.
73
+ u8(0xe1), u16(sps.byteLength), sps, u8(1), u16(pps.byteLength), pps);
74
+ }
75
+ function avc1(config) {
76
+ return box('avc1', u8(0, 0, 0, 0, 0, 0), u16(1), u16(0), u16(0), u32(0), u32(0), u32(0), u16(config.width), u16(config.height), u32(0x0048_0000), u32(0x0048_0000), u32(0), u16(1), new Uint8Array(32), u16(0x18), u16(0xffff), avcC(config));
77
+ }
78
+ function esds(config) {
79
+ const asc = u8((config.audioObjectType << 3) | (config.samplingFrequencyIndex >> 1), ((config.samplingFrequencyIndex & 1) << 7) | (config.channelConfig << 3));
80
+ const dsi = concat(u8(0x05, asc.byteLength), asc);
81
+ const dcd = concat(u8(0x04, 13 + dsi.byteLength, 0x40, 0x15), u8(0, 0, 0), u32(0), u32(0), dsi);
82
+ const sl = u8(0x06, 0x01, 0x02);
83
+ const es = concat(u8(0x03, 3 + dcd.byteLength + sl.byteLength, 0, 0, 0), dcd, sl);
84
+ return fullBox('esds', 0, 0, es);
85
+ }
86
+ function mp4a(config) {
87
+ return box('mp4a', u8(0, 0, 0, 0, 0, 0), u16(1), u32(0), u32(0), u16(config.channelConfig), u16(16), u16(0), u16(0), u32((config.timescale << 16) >>> 0), esds(config));
88
+ }
89
+ function stbl(config) {
90
+ const entry = config.kind === 'video' ? avc1(config) : mp4a(config);
91
+ return box('stbl', fullBox('stsd', 0, 0, u32(1), entry), fullBox('stts', 0, 0, u32(0)), fullBox('stsc', 0, 0, u32(0)), fullBox('stsz', 0, 0, u32(0), u32(0)), fullBox('stco', 0, 0, u32(0)));
92
+ }
93
+ function minf(config) {
94
+ const header = config.kind === 'video'
95
+ ? fullBox('vmhd', 0, 1, u16(0), u16(0), u16(0), u16(0))
96
+ : fullBox('smhd', 0, 0, u16(0), u16(0));
97
+ const dref = fullBox('dref', 0, 0, u32(1), fullBox('url ', 0, 1));
98
+ return box('minf', header, box('dinf', dref), stbl(config));
99
+ }
100
+ function hdlr(config) {
101
+ const handler = config.kind === 'video' ? 'vide' : 'soun';
102
+ const name = config.kind === 'video' ? 'VideoHandler' : 'SoundHandler';
103
+ return fullBox('hdlr', 0, 0, u32(0), u8(...fourcc(handler)), u32(0), u32(0), u32(0), concat(u8(...[...name].map((c) => c.charCodeAt(0))), u8(0)));
104
+ }
105
+ function mdia(config) {
106
+ const mdhd = fullBox('mdhd', 0, 0, u32(0), u32(0), u32(config.timescale), u32(0), u16(0x55c4), u16(0));
107
+ return box('mdia', mdhd, hdlr(config), minf(config));
108
+ }
109
+ function tkhd(config) {
110
+ const w = config.kind === 'video' ? config.width : 0;
111
+ const h = config.kind === 'video' ? config.height : 0;
112
+ return fullBox('tkhd', 0, 0x7, u32(0), u32(0), u32(config.id), u32(0), u32(0), u32(0), u32(0), u16(0), u16(0), u16(config.kind === 'audio' ? 0x0100 : 0), u16(0), UNITY_MATRIX, u32((w << 16) >>> 0), u32((h << 16) >>> 0));
113
+ }
114
+ function trak(config) {
115
+ return box('trak', tkhd(config), mdia(config));
116
+ }
117
+ function mvhd(nextTrackId) {
118
+ return fullBox('mvhd', 0, 0, u32(0), u32(0), u32(90000), u32(0), u32(0x0001_0000), u16(0x0100), u16(0), u32(0), u32(0), UNITY_MATRIX, concat(u32(0), u32(0), u32(0), u32(0), u32(0), u32(0)), u32(nextTrackId));
119
+ }
120
+ function mvex(configs) {
121
+ const trexes = configs.map((config) => fullBox('trex', 0, 0, u32(config.id), u32(1), u32(0), u32(0), u32(0)));
122
+ return box('mvex', ...trexes);
123
+ }
124
+ /** The init segment: ftyp then a moov describing every track. */
125
+ export function writeInitSegment(configs) {
126
+ let maxId = 0;
127
+ for (const config of configs)
128
+ maxId = Math.max(maxId, config.id);
129
+ const moov = box('moov', mvhd(maxId + 1), ...configs.map(trak), mvex(configs));
130
+ return concat(ftyp(), moov);
131
+ }
132
+ // ---- media segment --------------------------------------------------------
133
+ const TRUN_FLAGS = 0x0001 | 0x0100 | 0x0200 | 0x0400 | 0x0800;
134
+ const TFHD_FLAGS = 0x020000; // default-base-is-moof
135
+ function sampleFlags(sample) {
136
+ return sample.isKeyframe ? 0x0200_0000 : (0x0001_0000 | 0x0100_0000) >>> 0;
137
+ }
138
+ function traf(fragment, trunHead) {
139
+ const tfhd = fullBox('tfhd', 0, TFHD_FLAGS, u32(fragment.trackId));
140
+ const tfdt = fullBox('tfdt', 1, 0, u64(fragment.baseMediaDecodeTime));
141
+ const entries = new Uint8Array(fragment.samples.length * 16);
142
+ const view = new DataView(entries.buffer);
143
+ for (let i = 0; i < fragment.samples.length; i += 1) {
144
+ const sample = fragment.samples[i];
145
+ const base = i * 16;
146
+ view.setUint32(base, sample.duration);
147
+ view.setUint32(base + 4, sample.data.byteLength);
148
+ view.setUint32(base + 8, sampleFlags(sample));
149
+ view.setUint32(base + 12, sample.cts);
150
+ }
151
+ const trun = fullBox('trun', 1, TRUN_FLAGS, trunHead, entries);
152
+ return box('traf', tfhd, tfdt, trun);
153
+ }
154
+ /**
155
+ * The moof/mdat pair for one or more track fragments. Each trun's data offset
156
+ * is back-patched once the moof size is known, so the offsets are exact
157
+ * regardless of how many tracks the fragment carries or how large the trafs
158
+ * grew. The mdat interleaves tracks in the order given.
159
+ */
160
+ export function writeMediaSegment(sequenceNumber, fragments) {
161
+ const mfhd = fullBox('mfhd', 0, 0, u32(sequenceNumber));
162
+ // Build each traf with a placeholder data offset, then back-patch below.
163
+ const trafs = fragments.map((fragment) => traf(fragment, concat(u32(fragment.samples.length), u32(0))));
164
+ const moof = box('moof', mfhd, ...trafs);
165
+ const moofView = new DataView(moof.buffer);
166
+ // The mdat payload begins right after the moof. Each track's samples follow
167
+ // the previous track's in the mdat, so its data offset is the moof size plus
168
+ // the mdat header plus the running byte total ahead of it.
169
+ let trafOffsetInMoof = 8 + mfhd.byteLength;
170
+ let mdatCursor = moof.byteLength + 8;
171
+ for (const [i, fragment] of fragments.entries()) {
172
+ const thisTraf = trafs[i];
173
+ // trun payload begins at: traf header(8) + tfhd + tfdt + trun header(8) + fullbox(4) + sample_count(4).
174
+ const tfhdLen = 8 + 4 + 4;
175
+ const tfdtLen = 8 + 4 + 8;
176
+ const trunDataOffsetPos = trafOffsetInMoof + 8 + tfhdLen + tfdtLen + 8 + 4 + 4;
177
+ moofView.setUint32(trunDataOffsetPos, mdatCursor);
178
+ let fragmentBytes = 0;
179
+ for (const sample of fragment.samples)
180
+ fragmentBytes += sample.data.byteLength;
181
+ mdatCursor += fragmentBytes;
182
+ trafOffsetInMoof += thisTraf.byteLength;
183
+ }
184
+ let mdatLength = 0;
185
+ for (const fragment of fragments) {
186
+ for (const sample of fragment.samples)
187
+ mdatLength += sample.data.byteLength;
188
+ }
189
+ const mdat = new Uint8Array(8 + mdatLength);
190
+ new DataView(mdat.buffer).setUint32(0, mdat.byteLength);
191
+ mdat.set(fourcc('mdat'), 4);
192
+ let offset = 8;
193
+ for (const fragment of fragments) {
194
+ for (const sample of fragment.samples) {
195
+ mdat.set(sample.data, offset);
196
+ offset += sample.data.byteLength;
197
+ }
198
+ }
199
+ return concat(moof, mdat);
200
+ }
201
+ //# sourceMappingURL=writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writer.js","sourceRoot":"","sources":["../../../src/containers/fmp4/writer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * ID3v2 framing, shared by packed-audio (which skips the leading tag before
3
+ * the ADTS frames) and meta-id3 (which turns the frames into metadata cues).
4
+ * Living in the container layer keeps the stage from importing a sibling
5
+ * stage. Every size read is synchsafe-aware and bounded by the buffer, so a
6
+ * malformed tag reports the length it could trust rather than overrunning.
7
+ */
8
+ import type { CueDescriptor } from '../types/messages.js';
9
+ /** The full byte length of the ID3v2 tag at `offset`, or zero if none is there. */
10
+ export declare function id3TagLength(data: Uint8Array, offset?: number): number;
11
+ /** One decoded ID3 frame: its four-character id and its raw payload bytes. */
12
+ export interface Id3Frame {
13
+ readonly id: string;
14
+ readonly data: Uint8Array;
15
+ }
16
+ /** Parses the frames of one ID3v2 tag. Stops at padding or a bad frame. */
17
+ export declare function parseId3Frames(data: Uint8Array, offset?: number): Id3Frame[];
18
+ /**
19
+ * Turns an ID3 tag's frames into metadata cues at `presentationTime`. Text
20
+ * frames carry their decoded string; every frame keeps its raw bytes on the
21
+ * payload so a consumer can read a format this decoder does not special-case.
22
+ * The cues are zero-length, which is how timed metadata is represented.
23
+ */
24
+ export declare function id3Cues(data: Uint8Array, presentationTime: number, offset?: number): CueDescriptor[];
25
+ //# sourceMappingURL=id3.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"id3.d.ts","sourceRoot":"","sources":["../../src/containers/id3.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,aAAa,EAAgB,MAAM,sBAAsB,CAAC;AAkBxE,mFAAmF;AACnF,wBAAgB,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,SAAI,GAAG,MAAM,CAKjE;AAED,8EAA8E;AAC9E,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;CAC3B;AAaD,2EAA2E;AAC3E,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,SAAI,GAAG,QAAQ,EAAE,CAsBvE;AAUD;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,SAAI,GAAG,aAAa,EAAE,CAU/F"}
@@ -0,0 +1,75 @@
1
+ const HEADER_SIZE = 10;
2
+ function isId3(data, offset) {
3
+ return data[offset] === 0x49 && data[offset + 1] === 0x44 && data[offset + 2] === 0x33;
4
+ }
5
+ /** A 28-bit synchsafe integer: four bytes, seven bits each. */
6
+ function synchsafe(data, offset) {
7
+ return (((data[offset] ?? 0) << 21) |
8
+ ((data[offset + 1] ?? 0) << 14) |
9
+ ((data[offset + 2] ?? 0) << 7) |
10
+ (data[offset + 3] ?? 0));
11
+ }
12
+ /** The full byte length of the ID3v2 tag at `offset`, or zero if none is there. */
13
+ export function id3TagLength(data, offset = 0) {
14
+ if (offset + HEADER_SIZE > data.byteLength || !isId3(data, offset))
15
+ return 0;
16
+ const size = synchsafe(data, offset + 6);
17
+ const total = HEADER_SIZE + size;
18
+ return offset + total <= data.byteLength ? total : 0;
19
+ }
20
+ function frameSize(data, offset, major) {
21
+ // 2.4 uses synchsafe frame sizes; 2.3 uses a plain 32-bit big-endian size.
22
+ if (major >= 4)
23
+ return synchsafe(data, offset);
24
+ return (((data[offset] ?? 0) << 24) |
25
+ ((data[offset + 1] ?? 0) << 16) |
26
+ ((data[offset + 2] ?? 0) << 8) |
27
+ (data[offset + 3] ?? 0));
28
+ }
29
+ /** Parses the frames of one ID3v2 tag. Stops at padding or a bad frame. */
30
+ export function parseId3Frames(data, offset = 0) {
31
+ const total = id3TagLength(data, offset);
32
+ if (total === 0)
33
+ return [];
34
+ const major = data[offset + 3] ?? 0;
35
+ const frames = [];
36
+ let cursor = offset + HEADER_SIZE;
37
+ const end = offset + total;
38
+ while (cursor + 10 <= end) {
39
+ const id = String.fromCharCode(data[cursor] ?? 0, data[cursor + 1] ?? 0, data[cursor + 2] ?? 0, data[cursor + 3] ?? 0);
40
+ // A zero id is padding: the frames are done.
41
+ if (data[cursor] === 0)
42
+ break;
43
+ const size = frameSize(data, cursor + 4, major);
44
+ if (size <= 0 || cursor + 10 + size > end)
45
+ break;
46
+ frames.push({ id, data: data.subarray(cursor + 10, cursor + 10 + size) });
47
+ cursor += 10 + size;
48
+ }
49
+ return frames;
50
+ }
51
+ function decodeTextFrame(frame) {
52
+ // Text frames lead with an encoding byte; 0 is ISO-8859-1, 3 is UTF-8.
53
+ const encoding = frame.data[0] ?? 0;
54
+ const body = frame.data.subarray(1);
55
+ const label = encoding === 1 || encoding === 2 ? 'utf-16' : 'utf-8';
56
+ return new TextDecoder(label).decode(body).replace(/\0+$/, '');
57
+ }
58
+ /**
59
+ * Turns an ID3 tag's frames into metadata cues at `presentationTime`. Text
60
+ * frames carry their decoded string; every frame keeps its raw bytes on the
61
+ * payload so a consumer can read a format this decoder does not special-case.
62
+ * The cues are zero-length, which is how timed metadata is represented.
63
+ */
64
+ export function id3Cues(data, presentationTime, offset = 0) {
65
+ const frames = parseId3Frames(data, offset);
66
+ return frames.map((frame) => {
67
+ const payload = {
68
+ key: frame.id,
69
+ data: [...frame.data],
70
+ ...(frame.id.startsWith('T') || frame.id === 'WXXX' ? { value: decodeTextFrame(frame) } : {}),
71
+ };
72
+ return { start: presentationTime, end: presentationTime, payload };
73
+ });
74
+ }
75
+ //# sourceMappingURL=id3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"id3.js","sourceRoot":"","sources":["../../src/containers/id3.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * A minimal ISOBMFF box walker, not a general library. It traverses the
3
+ * box tree handing back offsets, sizes, and payload views, with typed
4
+ * extraction only for the boxes that have a consumer today: tfdt for the
5
+ * timeline and sidx for dash-segmentbase. Everything else goes through the
6
+ * generic walker.
7
+ *
8
+ * Malformed input never throws and never loops: every walk either
9
+ * strictly advances or stops with a MatteboxError value.
10
+ */
11
+ import type { MatteboxError } from '../../types/error.js';
12
+ /** One box as seen by the walker. `payload` is a subarray view, never a copy. */
13
+ export interface BoxRef {
14
+ readonly type: string;
15
+ /** Absolute offset of the box start within the walked buffer. */
16
+ readonly start: number;
17
+ /** Total box size including the header. */
18
+ readonly size: number;
19
+ readonly headerSize: number;
20
+ readonly payload: Uint8Array;
21
+ /** Slash-joined ancestor chain, such as 'moov/trak/mdia'. */
22
+ readonly path: string;
23
+ }
24
+ export interface WalkResult {
25
+ readonly error: MatteboxError | null;
26
+ }
27
+ /**
28
+ * Walks one level plus known containers, depth-first. The visitor sees
29
+ * every box; returning false stops the walk early without error.
30
+ */
31
+ export declare function walkBoxes(data: Uint8Array, visit: (box: BoxRef) => boolean | undefined): WalkResult;
32
+ /** The first box matching a slash path such as 'moov/trak/mdia/minf/stbl/stsd'. */
33
+ export declare function findBox(data: Uint8Array, path: string): BoxRef | null;
34
+ /** Every box matching the path, in document order. trak repeats, for one. */
35
+ export declare function findBoxes(data: Uint8Array, path: string): readonly BoxRef[];
36
+ export interface FullBoxHeader {
37
+ readonly version: number;
38
+ readonly flags: number;
39
+ readonly body: Uint8Array;
40
+ }
41
+ /** Splits a FullBox payload into version, 24-bit flags, and the body view. */
42
+ export declare function fullBox(payload: Uint8Array): FullBoxHeader | null;
43
+ export interface Tfdt {
44
+ readonly version: number;
45
+ readonly baseMediaDecodeTime: number;
46
+ }
47
+ /** tfdt: version 1 widens baseMediaDecodeTime to 64 bits. */
48
+ export declare function parseTfdt(payload: Uint8Array): Tfdt | null;
49
+ export interface SidxReference {
50
+ readonly referencedSize: number;
51
+ readonly subsegmentDuration: number;
52
+ readonly startsWithSap: boolean;
53
+ }
54
+ export interface Sidx {
55
+ readonly version: number;
56
+ readonly referenceId: number;
57
+ readonly timescale: number;
58
+ readonly earliestPresentationTime: number;
59
+ readonly firstOffset: number;
60
+ readonly references: readonly SidxReference[];
61
+ }
62
+ /** sidx: version 1 widens the time and offset fields to 64 bits. */
63
+ export declare function parseSidx(payload: Uint8Array): Sidx | null;
64
+ /**
65
+ * The media timescale of each track, read from moov/trak (tkhd track id paired
66
+ * with mdhd timescale). CMAF timing normalization needs it to convert a
67
+ * baseMediaDecodeTime between timescale units and seconds.
68
+ */
69
+ export declare function trackTimescales(init: Uint8Array): Map<number, number>;
70
+ /**
71
+ * Rewrites every traf's tfdt baseMediaDecodeTime in place so the segment's
72
+ * media clock equals its presentation start. A CMAF live segment carries the
73
+ * real broadcast clock (a huge value); appended with a zero timestampOffset it
74
+ * would land far off the playhead. Normalizing it to `presentationStart` makes
75
+ * the segment land exactly where the manifest places it, the same alignment a
76
+ * TS transmux gives for free. Returns the number of tfdt boxes rewritten.
77
+ */
78
+ export declare function normalizeTfdt(segment: Uint8Array, presentationStart: number, timescales: ReadonlyMap<number, number>, fallbackTimescale: number): number;
79
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/containers/mp4-box/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,iFAAiF;AACjF,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,iEAAiE;IACjE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,2CAA2C;IAC3C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IAC7B,6DAA6D;IAC7D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAAC;CACtC;AAgCD;;;GAGG;AACH,wBAAgB,SAAS,CACvB,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,GAAG,SAAS,GAC1C,UAAU,CAiDZ;AAED,mFAAmF;AACnF,wBAAgB,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAYrE;AAED,6EAA6E;AAC7E,wBAAgB,SAAS,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAS3E;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;CAC3B;AAED,8EAA8E;AAC9E,wBAAgB,OAAO,CAAC,OAAO,EAAE,UAAU,GAAG,aAAa,GAAG,IAAI,CAMjE;AAED,MAAM,WAAW,IAAI;IACnB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;CACtC;AAED,6DAA6D;AAC7D,wBAAgB,SAAS,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI,GAAG,IAAI,CAU1D;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;CACjC;AAED,MAAM,WAAW,IAAI;IACnB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,wBAAwB,EAAE,MAAM,CAAC;IAC1C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,SAAS,aAAa,EAAE,CAAC;CAC/C;AAED,oEAAoE;AACpE,wBAAgB,SAAS,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI,GAAG,IAAI,CAuC1D;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CA0BrE;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,UAAU,EACnB,iBAAiB,EAAE,MAAM,EACzB,UAAU,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,EACvC,iBAAiB,EAAE,MAAM,GACxB,MAAM,CA4BR"}
@@ -0,0 +1,231 @@
1
+ /** Container boxes the walker descends into. Only ancestors of consumed boxes. */
2
+ const CONTAINERS = new Set([
3
+ 'moov',
4
+ 'trak',
5
+ 'mdia',
6
+ 'minf',
7
+ 'stbl',
8
+ 'moof',
9
+ 'traf',
10
+ ]);
11
+ function malformed(reason, offset) {
12
+ return {
13
+ category: 'media',
14
+ code: 'MEDIA_CONTAINER_INVALID',
15
+ fatal: false,
16
+ recoverable: false,
17
+ context: { reason, offset },
18
+ };
19
+ }
20
+ function fourcc(view, offset) {
21
+ return String.fromCharCode(view.getUint8(offset), view.getUint8(offset + 1), view.getUint8(offset + 2), view.getUint8(offset + 3));
22
+ }
23
+ /**
24
+ * Walks one level plus known containers, depth-first. The visitor sees
25
+ * every box; returning false stops the walk early without error.
26
+ */
27
+ export function walkBoxes(data, visit) {
28
+ const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
29
+ function level(start, end, path) {
30
+ let offset = start;
31
+ while (offset < end) {
32
+ if (end - offset < 8) {
33
+ return malformed('truncated box header', offset);
34
+ }
35
+ let size = view.getUint32(offset);
36
+ let headerSize = 8;
37
+ const type = fourcc(view, offset + 4);
38
+ if (size === 1) {
39
+ // 64-bit size follows the type.
40
+ if (end - offset < 16)
41
+ return malformed('truncated 64-bit size', offset);
42
+ const big = view.getBigUint64(offset + 8);
43
+ if (big > BigInt(Number.MAX_SAFE_INTEGER))
44
+ return malformed('size overflow', offset);
45
+ size = Number(big);
46
+ headerSize = 16;
47
+ }
48
+ else if (size === 0) {
49
+ // Extends to the end of the enclosing space.
50
+ size = end - offset;
51
+ }
52
+ if (size < headerSize) {
53
+ // A size smaller than its own header cannot advance: stop rather
54
+ // than loop.
55
+ return malformed('box size smaller than header', offset);
56
+ }
57
+ if (offset + size > end) {
58
+ return malformed('box extends past its container', offset);
59
+ }
60
+ const payload = data.subarray(offset + headerSize, offset + size);
61
+ const box = { type, start: offset, size, headerSize, payload, path };
62
+ if (visit(box) === false)
63
+ return 'stop';
64
+ if (CONTAINERS.has(type)) {
65
+ const nested = level(offset + headerSize, offset + size, path === '' ? type : `${path}/${type}`);
66
+ if (nested !== null)
67
+ return nested;
68
+ }
69
+ offset += size;
70
+ }
71
+ return null;
72
+ }
73
+ const outcome = level(0, data.byteLength, '');
74
+ return { error: outcome === 'stop' || outcome === null ? null : outcome };
75
+ }
76
+ /** The first box matching a slash path such as 'moov/trak/mdia/minf/stbl/stsd'. */
77
+ export function findBox(data, path) {
78
+ let found = null;
79
+ const parent = path.includes('/') ? path.slice(0, path.lastIndexOf('/')) : '';
80
+ const leaf = path.includes('/') ? path.slice(path.lastIndexOf('/') + 1) : path;
81
+ walkBoxes(data, (box) => {
82
+ if (box.path === parent && box.type === leaf) {
83
+ found = box;
84
+ return false;
85
+ }
86
+ return undefined;
87
+ });
88
+ return found;
89
+ }
90
+ /** Every box matching the path, in document order. trak repeats, for one. */
91
+ export function findBoxes(data, path) {
92
+ const out = [];
93
+ const parent = path.includes('/') ? path.slice(0, path.lastIndexOf('/')) : '';
94
+ const leaf = path.includes('/') ? path.slice(path.lastIndexOf('/') + 1) : path;
95
+ walkBoxes(data, (box) => {
96
+ if (box.path === parent && box.type === leaf)
97
+ out.push(box);
98
+ return undefined;
99
+ });
100
+ return out;
101
+ }
102
+ /** Splits a FullBox payload into version, 24-bit flags, and the body view. */
103
+ export function fullBox(payload) {
104
+ if (payload.byteLength < 4)
105
+ return null;
106
+ const version = payload[0];
107
+ const flags = (payload[1] << 16) | (payload[2] << 8) | payload[3];
108
+ return { version, flags, body: payload.subarray(4) };
109
+ }
110
+ /** tfdt: version 1 widens baseMediaDecodeTime to 64 bits. */
111
+ export function parseTfdt(payload) {
112
+ const header = fullBox(payload);
113
+ if (header === null)
114
+ return null;
115
+ const view = new DataView(header.body.buffer, header.body.byteOffset, header.body.byteLength);
116
+ if (header.version === 1) {
117
+ if (header.body.byteLength < 8)
118
+ return null;
119
+ return { version: 1, baseMediaDecodeTime: Number(view.getBigUint64(0)) };
120
+ }
121
+ if (header.body.byteLength < 4)
122
+ return null;
123
+ return { version: 0, baseMediaDecodeTime: view.getUint32(0) };
124
+ }
125
+ /** sidx: version 1 widens the time and offset fields to 64 bits. */
126
+ export function parseSidx(payload) {
127
+ const header = fullBox(payload);
128
+ if (header === null)
129
+ return null;
130
+ const body = header.body;
131
+ const view = new DataView(body.buffer, body.byteOffset, body.byteLength);
132
+ const wide = header.version === 1;
133
+ const fixed = 8 + (wide ? 16 : 8) + 4;
134
+ if (body.byteLength < fixed)
135
+ return null;
136
+ const referenceId = view.getUint32(0);
137
+ const timescale = view.getUint32(4);
138
+ let at = 8;
139
+ const earliestPresentationTime = wide ? Number(view.getBigUint64(at)) : view.getUint32(at);
140
+ at += wide ? 8 : 4;
141
+ const firstOffset = wide ? Number(view.getBigUint64(at)) : view.getUint32(at);
142
+ at += wide ? 8 : 4;
143
+ at += 2; // reserved
144
+ const count = view.getUint16(at);
145
+ at += 2;
146
+ if (body.byteLength < at + count * 12)
147
+ return null;
148
+ const references = [];
149
+ for (let i = 0; i < count; i += 1) {
150
+ const word = view.getUint32(at);
151
+ references.push({
152
+ referencedSize: word & 0x7fffffff,
153
+ subsegmentDuration: view.getUint32(at + 4),
154
+ startsWithSap: (view.getUint32(at + 8) & 0x80000000) !== 0,
155
+ });
156
+ at += 12;
157
+ }
158
+ return {
159
+ version: header.version,
160
+ referenceId,
161
+ timescale,
162
+ earliestPresentationTime,
163
+ firstOffset,
164
+ references,
165
+ };
166
+ }
167
+ /**
168
+ * The media timescale of each track, read from moov/trak (tkhd track id paired
169
+ * with mdhd timescale). CMAF timing normalization needs it to convert a
170
+ * baseMediaDecodeTime between timescale units and seconds.
171
+ */
172
+ export function trackTimescales(init) {
173
+ const map = new Map();
174
+ for (const trak of findBoxes(init, 'moov/trak')) {
175
+ const tkhd = findBox(trak.payload, 'tkhd');
176
+ const mdhd = findBox(trak.payload, 'mdia/mdhd');
177
+ if (tkhd === null || mdhd === null)
178
+ continue;
179
+ const tkView = new DataView(tkhd.payload.buffer, tkhd.payload.byteOffset, tkhd.payload.byteLength);
180
+ const mdView = new DataView(mdhd.payload.buffer, mdhd.payload.byteOffset, mdhd.payload.byteLength);
181
+ // FullBox: version(1) flags(3), then creation/modification times (4 or 8
182
+ // bytes each by version), then the field of interest.
183
+ const trackAt = tkhd.payload[0] === 1 ? 20 : 12;
184
+ const scaleAt = mdhd.payload[0] === 1 ? 20 : 12;
185
+ if (tkhd.payload.byteLength < trackAt + 4 || mdhd.payload.byteLength < scaleAt + 4)
186
+ continue;
187
+ const trackId = tkView.getUint32(trackAt);
188
+ const timescale = mdView.getUint32(scaleAt);
189
+ if (timescale > 0)
190
+ map.set(trackId, timescale);
191
+ }
192
+ return map;
193
+ }
194
+ /**
195
+ * Rewrites every traf's tfdt baseMediaDecodeTime in place so the segment's
196
+ * media clock equals its presentation start. A CMAF live segment carries the
197
+ * real broadcast clock (a huge value); appended with a zero timestampOffset it
198
+ * would land far off the playhead. Normalizing it to `presentationStart` makes
199
+ * the segment land exactly where the manifest places it, the same alignment a
200
+ * TS transmux gives for free. Returns the number of tfdt boxes rewritten.
201
+ */
202
+ export function normalizeTfdt(segment, presentationStart, timescales, fallbackTimescale) {
203
+ let rewritten = 0;
204
+ for (const traf of findBoxes(segment, 'moof/traf')) {
205
+ const tfdt = findBox(traf.payload, 'tfdt');
206
+ if (tfdt === null)
207
+ continue;
208
+ const tfhd = findBox(traf.payload, 'tfhd');
209
+ // tfhd FullBox: version(1) flags(3), then track_ID(4).
210
+ const trackId = tfhd !== null && tfhd.payload.byteLength >= 8
211
+ ? new DataView(tfhd.payload.buffer, tfhd.payload.byteOffset, tfhd.payload.byteLength).getUint32(4)
212
+ : null;
213
+ const timescale = (trackId !== null ? timescales.get(trackId) : undefined) ?? fallbackTimescale;
214
+ if (timescale <= 0)
215
+ continue;
216
+ const target = Math.round(presentationStart * timescale);
217
+ const body = tfdt.payload;
218
+ const view = new DataView(body.buffer, body.byteOffset, body.byteLength);
219
+ if (body[0] === 1) {
220
+ if (body.byteLength >= 12)
221
+ view.setBigUint64(4, BigInt(target));
222
+ }
223
+ else {
224
+ if (body.byteLength >= 8)
225
+ view.setUint32(4, target);
226
+ }
227
+ rewritten += 1;
228
+ }
229
+ return rewritten;
230
+ }
231
+ //# sourceMappingURL=index.js.map