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,211 @@
1
+ /**
2
+ * H.264 Annex B to AVCC. The elementary stream separates NAL units with
3
+ * start codes; MSE wants them length-prefixed, with the parameter sets moved
4
+ * into the avcC box instead of the sample data. This module splits NALs,
5
+ * pulls the SPS and PPS, and reads the coded dimensions out of the SPS so
6
+ * the init segment is honest. Exp-Golomb reads are bounded by the bitstream
7
+ * length, so a truncated SPS yields zeroes rather than a runaway loop.
8
+ */
9
+ export const NAL_TYPE = {
10
+ nonIdrSlice: 1,
11
+ idrSlice: 5,
12
+ sei: 6,
13
+ sps: 7,
14
+ pps: 8,
15
+ accessUnitDelimiter: 9,
16
+ };
17
+ /** Splits an Annex B buffer into raw NAL units, start codes removed. */
18
+ export function splitNalUnits(data) {
19
+ const nals = [];
20
+ const length = data.byteLength;
21
+ let start = -1;
22
+ let i = 0;
23
+ while (i + 2 < length) {
24
+ if (data[i] === 0 && data[i + 1] === 0 && data[i + 2] === 1) {
25
+ if (start !== -1)
26
+ nals.push(data.subarray(start, i));
27
+ i += 3;
28
+ start = i;
29
+ }
30
+ else {
31
+ i += 1;
32
+ }
33
+ }
34
+ if (start !== -1 && start < length)
35
+ nals.push(data.subarray(start, length));
36
+ // NALs are kept whole between start codes. Trailing zero bytes are left in
37
+ // place: a decoder stops at the rbsp_stop bit and ignores what follows, and
38
+ // a slice's CABAC zero words are genuine content that must not be trimmed.
39
+ // Over-trimming the last slice truncates the lower macroblock rows, which is
40
+ // exactly how a multi-slice frame corrupts halfway down.
41
+ return nals.filter((nal) => nal.byteLength > 0);
42
+ }
43
+ export function nalType(nal) {
44
+ return (nal[0] ?? 0) & 0x1f;
45
+ }
46
+ /**
47
+ * Turns one PES payload's NALs into an access unit. Parameter sets are
48
+ * surfaced for the init segment and dropped from the sample; slices and SEI
49
+ * become length-prefixed AVCC. An IDR slice marks the sample as a keyframe.
50
+ */
51
+ export function toAccessUnit(annexB) {
52
+ return accessUnitFromNals(splitNalUnits(annexB));
53
+ }
54
+ /**
55
+ * Builds one access unit from its already-split NAL units. Access units do not
56
+ * align with PES packet boundaries in the wild, so the demux splits the whole
57
+ * elementary stream and groups NALs into units by access-unit delimiter; this
58
+ * turns one such group into an AVCC sample.
59
+ */
60
+ export function accessUnitFromNals(nals) {
61
+ let sps = null;
62
+ let pps = null;
63
+ let isKeyframe = false;
64
+ const sampleNals = [];
65
+ const sei = [];
66
+ for (const nal of nals) {
67
+ const type = nalType(nal);
68
+ if (type === NAL_TYPE.sps)
69
+ sps = nal;
70
+ else if (type === NAL_TYPE.pps)
71
+ pps = nal;
72
+ else if (type === NAL_TYPE.accessUnitDelimiter)
73
+ continue;
74
+ else {
75
+ if (type === NAL_TYPE.idrSlice)
76
+ isKeyframe = true;
77
+ if (type === NAL_TYPE.sei)
78
+ sei.push(nal);
79
+ sampleNals.push(nal);
80
+ }
81
+ }
82
+ let length = 0;
83
+ for (const nal of sampleNals)
84
+ length += 4 + nal.byteLength;
85
+ const avcc = new Uint8Array(length);
86
+ const view = new DataView(avcc.buffer);
87
+ let offset = 0;
88
+ for (const nal of sampleNals) {
89
+ view.setUint32(offset, nal.byteLength);
90
+ avcc.set(nal, offset + 4);
91
+ offset += 4 + nal.byteLength;
92
+ }
93
+ return { avcc, isKeyframe, sps, pps, sei };
94
+ }
95
+ /** Strips H.264 emulation-prevention bytes (00 00 03 -> 00 00) for RBSP reads. */
96
+ function toRbsp(nal) {
97
+ const out = new Uint8Array(nal.byteLength);
98
+ let count = 0;
99
+ let zeros = 0;
100
+ for (let i = 1; i < nal.byteLength; i += 1) {
101
+ const byte = nal[i];
102
+ if (zeros >= 2 && byte === 0x03) {
103
+ zeros = 0;
104
+ continue;
105
+ }
106
+ out[count] = byte;
107
+ count += 1;
108
+ zeros = byte === 0 ? zeros + 1 : 0;
109
+ }
110
+ return out.subarray(0, count);
111
+ }
112
+ class BitReader {
113
+ data;
114
+ byte = 0;
115
+ bit = 0;
116
+ constructor(data) {
117
+ this.data = data;
118
+ }
119
+ readBit() {
120
+ if (this.byte >= this.data.byteLength)
121
+ return 0;
122
+ const value = (this.data[this.byte] >> (7 - this.bit)) & 1;
123
+ this.bit += 1;
124
+ if (this.bit === 8) {
125
+ this.bit = 0;
126
+ this.byte += 1;
127
+ }
128
+ return value;
129
+ }
130
+ readBits(count) {
131
+ let value = 0;
132
+ for (let i = 0; i < count; i += 1)
133
+ value = (value << 1) | this.readBit();
134
+ return value >>> 0;
135
+ }
136
+ /** Unsigned Exp-Golomb, bounded so a malformed stream cannot loop forever. */
137
+ readUe() {
138
+ let leadingZeros = 0;
139
+ while (leadingZeros < 32 && this.byte < this.data.byteLength && this.readBit() === 0) {
140
+ leadingZeros += 1;
141
+ }
142
+ if (leadingZeros === 0)
143
+ return 0;
144
+ return (1 << leadingZeros) - 1 + this.readBits(leadingZeros);
145
+ }
146
+ readSe() {
147
+ const value = this.readUe();
148
+ return value & 1 ? (value + 1) >> 1 : -(value >> 1);
149
+ }
150
+ }
151
+ /** Reads coded width and height from an SPS NAL, cropping applied. */
152
+ export function spsDimensions(sps) {
153
+ // toRbsp already drops the one-byte NAL header, so the RBSP begins at
154
+ // profile_idc; reading from there directly keeps every field aligned.
155
+ const reader = new BitReader(toRbsp(sps));
156
+ const profileIdc = reader.readBits(8);
157
+ reader.readBits(8); // constraint flags and reserved
158
+ reader.readBits(8); // level_idc
159
+ reader.readUe(); // seq_parameter_set_id
160
+ let chromaFormat = 1;
161
+ if ([100, 110, 122, 244, 44, 83, 86, 118, 128, 138, 139, 134, 135].includes(profileIdc)) {
162
+ chromaFormat = reader.readUe();
163
+ if (chromaFormat === 3)
164
+ reader.readBits(1);
165
+ reader.readUe(); // bit_depth_luma_minus8
166
+ reader.readUe(); // bit_depth_chroma_minus8
167
+ reader.readBits(1); // qpprime_y_zero_transform_bypass_flag
168
+ if (reader.readBits(1)) {
169
+ // seq_scaling_matrix_present_flag; the lists are skipped, the loop is
170
+ // bounded so a hostile flag cannot spin.
171
+ const count = chromaFormat === 3 ? 12 : 8;
172
+ for (let i = 0; i < count; i += 1)
173
+ if (reader.readBits(1))
174
+ reader.readUe();
175
+ }
176
+ }
177
+ reader.readUe(); // log2_max_frame_num_minus4
178
+ const picOrderCntType = reader.readUe();
179
+ if (picOrderCntType === 0)
180
+ reader.readUe();
181
+ else if (picOrderCntType === 1) {
182
+ reader.readBits(1);
183
+ reader.readSe();
184
+ reader.readSe();
185
+ const numRefFrames = reader.readUe();
186
+ for (let i = 0; i < numRefFrames && i < 256; i += 1)
187
+ reader.readSe();
188
+ }
189
+ reader.readUe(); // max_num_ref_frames
190
+ reader.readBits(1); // gaps_in_frame_num_value_allowed_flag
191
+ const picWidthInMbs = reader.readUe() + 1;
192
+ const picHeightInMapUnits = reader.readUe() + 1;
193
+ const frameMbsOnly = reader.readBits(1);
194
+ if (frameMbsOnly === 0)
195
+ reader.readBits(1); // mb_adaptive_frame_field_flag
196
+ reader.readBits(1); // direct_8x8_inference_flag
197
+ let cropLeft = 0;
198
+ let cropRight = 0;
199
+ let cropTop = 0;
200
+ let cropBottom = 0;
201
+ if (reader.readBits(1)) {
202
+ cropLeft = reader.readUe();
203
+ cropRight = reader.readUe();
204
+ cropTop = reader.readUe();
205
+ cropBottom = reader.readUe();
206
+ }
207
+ const width = picWidthInMbs * 16 - (cropLeft + cropRight) * 2;
208
+ const height = (2 - frameMbsOnly) * picHeightInMapUnits * 16 - (cropTop + cropBottom) * 2;
209
+ return { width: Math.max(0, width), height: Math.max(0, height) };
210
+ }
211
+ //# sourceMappingURL=h264.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"h264.js","sourceRoot":"","sources":["../../../src/containers/ts-transmux/h264.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * ts-transmux as a loadable stage. It contributes exactly one thing to the
3
+ * engine: a transform step for MPEG-TS media bytes. The kernel learns nothing
4
+ * about TS. The protocol adapter that fed a `video/mp2t` playlist learns
5
+ * nothing either; the media playlist's segment bytes flow through the same
6
+ * transform pipeline as everything else, and this step rewrites the ones that
7
+ * are transport streams.
8
+ *
9
+ * The `media-transform` capability is what tells the composition root to wire
10
+ * the append path through the transform pipeline; `media-time-normalized`
11
+ * tells the scheduler the rewritten media time equals presentation time. A
12
+ * CMAF composition never provides either, so its append path is untouched.
13
+ */
14
+ import type { Stage } from '../../types/stage.js';
15
+ import { type TransmuxRunnerOptions } from './runner.js';
16
+ export default function tsTransmux(options?: TransmuxRunnerOptions): Stage;
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/containers/ts-transmux/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAGlD,OAAO,EAAwB,KAAK,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAK/E,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,OAAO,GAAE,qBAA0B,GAAG,KAAK,CAwB7E"}
@@ -0,0 +1,34 @@
1
+ import { captionsWanted, deliverCaptions } from '../captions.js';
2
+ import { looksLikeTransportStream } from './demux.js';
3
+ import { createTransmuxRunner } from './runner.js';
4
+ /** Runs after decrypt-class steps (lower order) and before caption extraction. */
5
+ const TRANSMUX_ORDER = 100;
6
+ export default function tsTransmux(options = {}) {
7
+ return {
8
+ name: 'ts-transmux',
9
+ provides: ['ts-transmux', 'media-transform', 'media-time-normalized'],
10
+ install(ctx) {
11
+ const runner = createTransmuxRunner(options);
12
+ ctx.registerTransform({
13
+ name: 'ts-transmux',
14
+ order: TRANSMUX_ORDER,
15
+ async transform(data, meta) {
16
+ // Only media, and only actual transport streams: an fMP4 segment
17
+ // sniffs false and passes straight through, no Worker round-trip.
18
+ if (meta.contentType !== 'video' && meta.contentType !== 'audio')
19
+ return data;
20
+ if (!looksLikeTransportStream(data))
21
+ return data;
22
+ // Only extract SEI captions when a caption stage is loaded, so a
23
+ // caption-free composition pays nothing for them.
24
+ const result = await runner.run(data, meta.start, captionsWanted());
25
+ if (result.captions.length > 0)
26
+ deliverCaptions(result.captions);
27
+ return result.bytes ?? data;
28
+ },
29
+ });
30
+ return () => runner.dispose();
31
+ },
32
+ };
33
+ }
34
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/containers/ts-transmux/index.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAA8B,MAAM,aAAa,CAAC;AAE/E,kFAAkF;AAClF,MAAM,cAAc,GAAG,GAAG,CAAC;AAE3B,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,UAAiC,EAAE;IACpE,OAAO;QACL,IAAI,EAAE,aAAa;QACnB,QAAQ,EAAE,CAAC,aAAa,EAAE,iBAAiB,EAAE,uBAAuB,CAAC;QACrE,OAAO,CAAC,GAAG;YACT,MAAM,MAAM,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;YAC7C,GAAG,CAAC,iBAAiB,CAAC;gBACpB,IAAI,EAAE,aAAa;gBACnB,KAAK,EAAE,cAAc;gBACrB,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI;oBACxB,iEAAiE;oBACjE,kEAAkE;oBAClE,IAAI,IAAI,CAAC,WAAW,KAAK,OAAO,IAAI,IAAI,CAAC,WAAW,KAAK,OAAO;wBAAE,OAAO,IAAI,CAAC;oBAC9E,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC;wBAAE,OAAO,IAAI,CAAC;oBACjD,iEAAiE;oBACjE,kDAAkD;oBAClD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;oBACpE,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;wBAAE,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;oBACjE,OAAO,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC;gBAC9B,CAAC;aACF,CAAC,CAAC;YACH,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QAChC,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * The boundary between the transform step and where the demux actually runs.
3
+ * A Worker keeps the hot path off the main thread; when the build cannot emit
4
+ * a Worker chunk, or the environment has no Worker, or a custom-URL Worker
5
+ * fails to start, the same pure transmux runs synchronously on the main
6
+ * thread. Both paths call the identical function, so the bytes match whatever
7
+ * route a given browser takes; only the timing differs.
8
+ */
9
+ import { type TransmuxResult } from './transmux.js';
10
+ export interface TransmuxRunnerOptions {
11
+ /** A custom Worker URL for strict-CSP hosts that serve the chunk themselves. */
12
+ readonly workerUrl?: string | URL;
13
+ /** Forces synchronous main-thread execution; used by tests and headless runs. */
14
+ readonly disableWorker?: boolean;
15
+ }
16
+ export interface TransmuxRunner {
17
+ run(bytes: Uint8Array, presentationStart: number, wantCaptions?: boolean): Promise<TransmuxResult>;
18
+ /** Which path the most recent run took, for diagnostics and the handoff. */
19
+ path(): 'worker' | 'main';
20
+ dispose(): void;
21
+ }
22
+ export declare function createTransmuxRunner(options?: TransmuxRunnerOptions): TransmuxRunner;
23
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../src/containers/ts-transmux/runner.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,KAAK,cAAc,EAAY,MAAM,eAAe,CAAC;AAE9D,MAAM,WAAW,qBAAqB;IACpC,gFAAgF;IAChF,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC;IAClC,iFAAiF;IACjF,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;CAClC;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,CACD,KAAK,EAAE,UAAU,EACjB,iBAAiB,EAAE,MAAM,EACzB,YAAY,CAAC,EAAE,OAAO,GACrB,OAAO,CAAC,cAAc,CAAC,CAAC;IAC3B,4EAA4E;IAC5E,IAAI,IAAI,QAAQ,GAAG,MAAM,CAAC;IAC1B,OAAO,IAAI,IAAI,CAAC;CACjB;AAwBD,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,qBAA0B,GAAG,cAAc,CAkFxF"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * The boundary between the transform step and where the demux actually runs.
3
+ * A Worker keeps the hot path off the main thread; when the build cannot emit
4
+ * a Worker chunk, or the environment has no Worker, or a custom-URL Worker
5
+ * fails to start, the same pure transmux runs synchronously on the main
6
+ * thread. Both paths call the identical function, so the bytes match whatever
7
+ * route a given browser takes; only the timing differs.
8
+ */
9
+ import { transmux } from './transmux.js';
10
+ function runOnMainThread(bytes, presentationStart, wantCaptions) {
11
+ return transmux(bytes, presentationStart, wantCaptions);
12
+ }
13
+ export function createTransmuxRunner(options = {}) {
14
+ let worker = null;
15
+ let workerBroken = options.disableWorker === true;
16
+ let lastPath = 'main';
17
+ let nextId = 1;
18
+ const pending = new Map();
19
+ function ensureWorker() {
20
+ if (workerBroken)
21
+ return null;
22
+ if (worker !== null)
23
+ return worker;
24
+ try {
25
+ worker =
26
+ options.workerUrl !== undefined
27
+ ? new Worker(options.workerUrl, { type: 'module' })
28
+ : new Worker(new URL('./transmux.worker.js', import.meta.url), { type: 'module' });
29
+ worker.onmessage = (event) => {
30
+ const entry = pending.get(event.data.id);
31
+ if (entry === undefined)
32
+ return;
33
+ pending.delete(event.data.id);
34
+ entry.resolve({
35
+ bytes: event.data.bytes === null ? null : new Uint8Array(event.data.bytes),
36
+ notTransportStream: event.data.notTransportStream,
37
+ empty: event.data.bytes === null && !event.data.notTransportStream,
38
+ captions: event.data.captions,
39
+ });
40
+ };
41
+ worker.onerror = () => {
42
+ // A Worker that fails to start (a 404 on the chunk, a strict CSP) or
43
+ // throws takes every subsequent run onto the main thread, and every
44
+ // request already waiting on it is resolved there rather than left to
45
+ // hang: a broken Worker must never stall the pipeline.
46
+ workerBroken = true;
47
+ worker = null;
48
+ for (const [id, entry] of pending) {
49
+ pending.delete(id);
50
+ entry.resolve(runOnMainThread(entry.bytes, entry.presentationStart, entry.wantCaptions));
51
+ }
52
+ };
53
+ }
54
+ catch {
55
+ workerBroken = true;
56
+ worker = null;
57
+ }
58
+ return worker;
59
+ }
60
+ return {
61
+ run(bytes, presentationStart, wantCaptions = false) {
62
+ const active = ensureWorker();
63
+ if (active === null) {
64
+ lastPath = 'main';
65
+ return Promise.resolve(runOnMainThread(bytes, presentationStart, wantCaptions));
66
+ }
67
+ lastPath = 'worker';
68
+ const id = nextId;
69
+ nextId += 1;
70
+ const copy = bytes.slice();
71
+ return new Promise((resolve) => {
72
+ // Keep the inputs on the pending entry so an onerror after this point
73
+ // can resolve it on the main thread rather than hang.
74
+ pending.set(id, { resolve, bytes, presentationStart, wantCaptions });
75
+ try {
76
+ active.postMessage({ id, bytes: copy.buffer, presentationStart, wantCaptions }, [
77
+ copy.buffer,
78
+ ]);
79
+ }
80
+ catch {
81
+ pending.delete(id);
82
+ workerBroken = true;
83
+ worker = null;
84
+ lastPath = 'main';
85
+ resolve(runOnMainThread(bytes, presentationStart, wantCaptions));
86
+ }
87
+ });
88
+ },
89
+ path() {
90
+ return lastPath;
91
+ },
92
+ dispose() {
93
+ worker?.terminate();
94
+ worker = null;
95
+ pending.clear();
96
+ },
97
+ };
98
+ }
99
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../../src/containers/ts-transmux/runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * The transmux core: MPEG-TS bytes to a self-contained fragmented MP4. Each
3
+ * call is independent and pure, so identical input plus identical
4
+ * presentation start yields identical output, on the main thread or in the
5
+ * Worker. A muxed segment produces one init with a video and an audio track
6
+ * and one media fragment carrying both, so a single SourceBuffer decodes it.
7
+ *
8
+ * Segment timing is anchored to the playlist presentation start, not the raw
9
+ * PES timestamps: legacy TS streams begin at an arbitrary PTS, and aligning
10
+ * baseMediaDecodeTime to the playlist is what keeps the buffer where the
11
+ * scheduler expects it. Sample durations still come from the PES timeline.
12
+ */
13
+ import type { CcPacket } from '../captions.js';
14
+ export interface TransmuxResult {
15
+ /** The fMP4 bytes, or null when the input was not a transport stream. */
16
+ readonly bytes: Uint8Array | null;
17
+ readonly notTransportStream: boolean;
18
+ /** True when the stream was TS but carried nothing playable. */
19
+ readonly empty: boolean;
20
+ /** CEA-608/708 caption packets from the video SEI, when captions were requested. */
21
+ readonly captions: readonly CcPacket[];
22
+ }
23
+ export declare function transmux(input: Uint8Array, presentationStart?: number, wantCaptions?: boolean): TransmuxResult;
24
+ //# sourceMappingURL=transmux.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transmux.d.ts","sourceRoot":"","sources":["../../../src/containers/ts-transmux/transmux.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AA4B/C,MAAM,WAAW,cAAc;IAC7B,yEAAyE;IACzE,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;IACrC,gEAAgE;IAChE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,oFAAoF;IACpF,QAAQ,CAAC,QAAQ,EAAE,SAAS,QAAQ,EAAE,CAAC;CACxC;AAoLD,wBAAgB,QAAQ,CACtB,KAAK,EAAE,UAAU,EACjB,iBAAiB,SAAI,EACrB,YAAY,UAAQ,GACnB,cAAc,CA+BhB"}
@@ -0,0 +1,212 @@
1
+ /**
2
+ * The transmux core: MPEG-TS bytes to a self-contained fragmented MP4. Each
3
+ * call is independent and pure, so identical input plus identical
4
+ * presentation start yields identical output, on the main thread or in the
5
+ * Worker. A muxed segment produces one init with a video and an audio track
6
+ * and one media fragment carrying both, so a single SourceBuffer decodes it.
7
+ *
8
+ * Segment timing is anchored to the playlist presentation start, not the raw
9
+ * PES timestamps: legacy TS streams begin at an arbitrary PTS, and aligning
10
+ * baseMediaDecodeTime to the playlist is what keeps the buffer where the
11
+ * scheduler expects it. Sample durations still come from the PES timeline.
12
+ */
13
+ import { parseAdts } from '../adts.js';
14
+ import { writeInitSegment, writeMediaSegment, } from '../fmp4/writer.js';
15
+ import { ccTriplesFromSei } from '../sei.js';
16
+ import { demux, unrollTimestamps } from './demux.js';
17
+ import { accessUnitFromNals, NAL_TYPE, nalType, splitNalUnits, spsDimensions, toAccessUnit, } from './h264.js';
18
+ const VIDEO_TIMESCALE = 90000;
19
+ const VIDEO_TRACK_ID = 1;
20
+ const AUDIO_TRACK_ID = 2;
21
+ /** Fallback duration for a lone trailing video sample: 30 fps in 90 kHz. */
22
+ const DEFAULT_FRAME_DURATION = 3000;
23
+ function concat(parts) {
24
+ let length = 0;
25
+ for (const part of parts)
26
+ length += part.byteLength;
27
+ const out = new Uint8Array(length);
28
+ let offset = 0;
29
+ for (const part of parts) {
30
+ out.set(part, offset);
31
+ offset += part.byteLength;
32
+ }
33
+ return out;
34
+ }
35
+ /**
36
+ * Reframes video access units. Access units do not align with PES packet
37
+ * boundaries in the wild: a picture's tail spills into the next PES packet,
38
+ * whose header carries the next picture's timestamps. So the elementary stream
39
+ * is concatenated and split into units by access-unit delimiter, and each unit
40
+ * takes the timestamps of the PES packet its delimiter falls in. A stream with
41
+ * no delimiters falls back to one unit per PES, which is correct when the muxer
42
+ * did align them.
43
+ */
44
+ function frameAccessUnits(packets) {
45
+ let total = 0;
46
+ for (const p of packets)
47
+ total += p.data.byteLength;
48
+ const es = new Uint8Array(total);
49
+ const boundaries = [];
50
+ let offset = 0;
51
+ for (const p of packets) {
52
+ boundaries.push({ offset, pts: p.pts, dts: p.dts });
53
+ es.set(p.data, offset);
54
+ offset += p.data.byteLength;
55
+ }
56
+ const nals = splitNalUnits(es);
57
+ const hasAud = nals.some((n) => nalType(n) === NAL_TYPE.accessUnitDelimiter);
58
+ if (!hasAud) {
59
+ return packets.map((p) => ({ unit: toAccessUnit(p.data), pts: p.pts, dts: p.dts }));
60
+ }
61
+ const framed = [];
62
+ let group = [];
63
+ let groupOffset = 0;
64
+ let boundaryIndex = 0;
65
+ const flush = () => {
66
+ if (group.length === 0)
67
+ return;
68
+ // Advance to the PES packet whose payload contains this unit's delimiter.
69
+ while (boundaryIndex + 1 < boundaries.length &&
70
+ boundaries[boundaryIndex + 1].offset <= groupOffset) {
71
+ boundaryIndex += 1;
72
+ }
73
+ const b = boundaries[boundaryIndex];
74
+ framed.push({ unit: accessUnitFromNals(group), pts: b.pts, dts: b.dts });
75
+ group = [];
76
+ };
77
+ for (const nal of nals) {
78
+ if (nalType(nal) === NAL_TYPE.accessUnitDelimiter && group.length > 0)
79
+ flush();
80
+ if (group.length === 0)
81
+ groupOffset = nal.byteOffset - es.byteOffset;
82
+ group.push(nal);
83
+ }
84
+ flush();
85
+ return framed;
86
+ }
87
+ function buildVideo(packets, presentationStart, wantCaptions) {
88
+ if (packets.length === 0)
89
+ return null;
90
+ const framed = frameAccessUnits(packets);
91
+ const units = framed.map((f) => f.unit);
92
+ let sps = null;
93
+ let pps = null;
94
+ for (const unit of units) {
95
+ if (unit.sps !== null)
96
+ sps = unit.sps;
97
+ if (unit.pps !== null)
98
+ pps = unit.pps;
99
+ }
100
+ // No parameter sets means this segment opened mid-GOP; without them there
101
+ // is no honest init segment. Legacy HLS keys segments to a keyframe, so
102
+ // this is the dirty-stream path, registered for recovery.
103
+ if (sps === null || pps === null)
104
+ return null;
105
+ const dts = unrollTimestamps(framed.map((f) => f.dts));
106
+ const pts = unrollTimestamps(framed.map((f) => f.pts));
107
+ const base = Math.round(presentationStart * VIDEO_TIMESCALE);
108
+ // Captions ride the video SEI; each access unit's triples display at that
109
+ // frame's presentation time, anchored to the playlist start like the media.
110
+ const captions = [];
111
+ if (wantCaptions) {
112
+ const firstPts = pts[0] ?? 0;
113
+ for (let i = 0; i < units.length; i += 1) {
114
+ const unit = units[i];
115
+ if (unit.sei.length === 0)
116
+ continue;
117
+ const triples = unit.sei.flatMap((nal) => ccTriplesFromSei(nal));
118
+ if (triples.length === 0)
119
+ continue;
120
+ const time = presentationStart + (pts[i] - firstPts) / VIDEO_TIMESCALE;
121
+ captions.push({ time, triples });
122
+ }
123
+ }
124
+ const samples = [];
125
+ for (let i = 0; i < units.length; i += 1) {
126
+ const duration = i + 1 < units.length
127
+ ? Math.max(0, dts[i + 1] - dts[i])
128
+ : DEFAULT_FRAME_DURATION;
129
+ samples.push({
130
+ data: units[i].avcc,
131
+ duration: duration || DEFAULT_FRAME_DURATION,
132
+ // Composition time offset, PTS minus DTS. This is negative for a B-frame
133
+ // that decodes after a frame it displays before; the trun is version 1,
134
+ // whose cts field is signed, so the negative value is written and read
135
+ // back correctly. Clamping it here collapses reordered frames onto one
136
+ // presentation time and the decoder loses reference-frame state.
137
+ cts: pts[i] - dts[i],
138
+ isKeyframe: units[i].isKeyframe,
139
+ });
140
+ }
141
+ const { width, height } = spsDimensions(sps);
142
+ const config = {
143
+ id: VIDEO_TRACK_ID,
144
+ kind: 'video',
145
+ timescale: VIDEO_TIMESCALE,
146
+ sps,
147
+ pps,
148
+ width,
149
+ height,
150
+ };
151
+ return {
152
+ config,
153
+ fragment: { trackId: VIDEO_TRACK_ID, baseMediaDecodeTime: base, samples },
154
+ captions,
155
+ };
156
+ }
157
+ function buildAudio(packets, presentationStart) {
158
+ if (packets.length === 0)
159
+ return null;
160
+ const adts = parseAdts(concat(packets.map((p) => p.data)));
161
+ if (adts.frames.length === 0)
162
+ return null;
163
+ const base = Math.round(presentationStart * adts.sampleRate);
164
+ const samples = adts.frames.map((frame) => ({
165
+ data: frame.data,
166
+ duration: 1024,
167
+ cts: 0,
168
+ isKeyframe: true,
169
+ }));
170
+ const config = {
171
+ id: AUDIO_TRACK_ID,
172
+ kind: 'audio',
173
+ timescale: adts.sampleRate,
174
+ audioObjectType: adts.audioObjectType,
175
+ samplingFrequencyIndex: adts.samplingFrequencyIndex,
176
+ channelConfig: adts.channelConfig,
177
+ };
178
+ return { config, fragment: { trackId: AUDIO_TRACK_ID, baseMediaDecodeTime: base, samples } };
179
+ }
180
+ export function transmux(input, presentationStart = 0, wantCaptions = false) {
181
+ const streams = demux(input);
182
+ if (streams.notTransportStream) {
183
+ return { bytes: null, notTransportStream: true, empty: false, captions: [] };
184
+ }
185
+ const video = buildVideo(streams.video, presentationStart, wantCaptions);
186
+ const audio = buildAudio(streams.audio, presentationStart);
187
+ if (video === null && audio === null) {
188
+ return { bytes: null, notTransportStream: false, empty: true, captions: [] };
189
+ }
190
+ const configs = [];
191
+ const fragments = [];
192
+ if (video !== null) {
193
+ configs.push(video.config);
194
+ fragments.push(video.fragment);
195
+ }
196
+ if (audio !== null) {
197
+ configs.push(audio.config);
198
+ fragments.push(audio.fragment);
199
+ }
200
+ // The mfhd sequence number derives from the presentation start so it is
201
+ // deterministic per segment and rises across a presentation.
202
+ const sequenceNumber = Math.max(1, Math.round(presentationStart) + 1);
203
+ const init = writeInitSegment(configs);
204
+ const media = writeMediaSegment(sequenceNumber, fragments);
205
+ return {
206
+ bytes: concat([init, media]),
207
+ notTransportStream: false,
208
+ empty: false,
209
+ captions: video?.captions ?? [],
210
+ };
211
+ }
212
+ //# sourceMappingURL=transmux.js.map