@remotion/media-parser 4.0.250 → 4.0.251

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 (384) hide show
  1. package/dist/add-avc-profile-to-track.js +2 -2
  2. package/dist/buffer-iterator.d.ts +3 -2
  3. package/dist/buffer-iterator.js +60 -34
  4. package/dist/containers/aac/parse-aac.d.ts +3 -0
  5. package/dist/containers/aac/parse-aac.js +83 -0
  6. package/dist/containers/aac/types.d.ts +4 -0
  7. package/dist/{boxes → containers}/avc/key.d.ts +1 -1
  8. package/dist/containers/flac/get-block-size.d.ts +2 -0
  9. package/dist/containers/flac/get-block-size.js +26 -0
  10. package/dist/containers/flac/get-channel-count.d.ts +2 -0
  11. package/dist/containers/flac/get-channel-count.js +36 -0
  12. package/dist/containers/flac/get-duration-from-flac.d.ts +2 -0
  13. package/dist/containers/flac/get-duration-from-flac.js +15 -0
  14. package/dist/containers/flac/get-metadata-from-flac.d.ts +2 -0
  15. package/dist/containers/flac/get-metadata-from-flac.js +11 -0
  16. package/dist/containers/flac/get-sample-rate.d.ts +3 -0
  17. package/dist/containers/flac/get-sample-rate.js +60 -0
  18. package/dist/containers/flac/parse-flac-frame.d.ts +15 -0
  19. package/dist/containers/flac/parse-flac-frame.js +175 -0
  20. package/dist/{boxes/riff/parse-riff.d.ts → containers/flac/parse-flac.d.ts} +1 -1
  21. package/dist/containers/flac/parse-flac.js +54 -0
  22. package/dist/{boxes/mp3/parse-mp3.d.ts → containers/flac/parse-header.d.ts} +2 -2
  23. package/dist/containers/flac/parse-header.js +10 -0
  24. package/dist/{boxes/iso-base-media/parse-boxes.d.ts → containers/flac/parse-metadata.d.ts} +3 -2
  25. package/dist/containers/flac/parse-metadata.js +24 -0
  26. package/dist/{boxes/webm/parse-webm-header.d.ts → containers/flac/parse-streaminfo.d.ts} +1 -1
  27. package/dist/containers/flac/parse-streaminfo.js +53 -0
  28. package/dist/{boxes/riff/parse-riff-body.d.ts → containers/flac/parse-unknown-block.d.ts} +2 -1
  29. package/dist/containers/flac/parse-unknown-block.js +11 -0
  30. package/dist/containers/flac/types.d.ts +26 -0
  31. package/dist/containers/iso-base-media/base-media-box.d.ts +40 -0
  32. package/dist/containers/iso-base-media/get-children.d.ts +6 -0
  33. package/dist/{boxes → containers}/iso-base-media/get-children.js +3 -5
  34. package/dist/{boxes → containers}/iso-base-media/get-sample-positions-from-track.d.ts +1 -1
  35. package/dist/containers/iso-base-media/mdat/mdat.d.ts +2 -0
  36. package/dist/{boxes → containers}/iso-base-media/mdat/mdat.js +4 -4
  37. package/dist/{boxes → containers}/iso-base-media/moov/moov.d.ts +1 -3
  38. package/dist/{boxes → containers}/iso-base-media/moov/moov.js +1 -2
  39. package/dist/containers/iso-base-media/parse-boxes.d.ts +3 -0
  40. package/dist/{boxes → containers}/iso-base-media/parse-boxes.js +5 -11
  41. package/dist/containers/iso-base-media/process-box.d.ts +3 -0
  42. package/dist/{boxes → containers}/iso-base-media/process-box.js +2 -6
  43. package/dist/{boxes → containers}/iso-base-media/stsd/mebx.d.ts +1 -3
  44. package/dist/{boxes → containers}/iso-base-media/stsd/mebx.js +3 -4
  45. package/dist/{boxes → containers}/iso-base-media/stsd/samples.d.ts +4 -6
  46. package/dist/{boxes → containers}/iso-base-media/stsd/samples.js +4 -7
  47. package/dist/{boxes → containers}/iso-base-media/stsd/stsd.d.ts +1 -3
  48. package/dist/{boxes → containers}/iso-base-media/stsd/stsd.js +2 -2
  49. package/dist/{boxes → containers}/iso-base-media/trak/trak.d.ts +1 -3
  50. package/dist/{boxes → containers}/iso-base-media/trak/trak.js +1 -2
  51. package/dist/{boxes → containers}/iso-base-media/traversal.d.ts +2 -1
  52. package/dist/containers/iso-base-media/void-box.js +2 -0
  53. package/dist/containers/mp3/get-tracks-from-mp3.d.ts +4 -0
  54. package/dist/{boxes → containers}/mp3/get-tracks-from-mp3.js +6 -6
  55. package/dist/containers/mp3/id3.d.ts +4 -0
  56. package/dist/{boxes → containers}/mp3/id3.js +2 -1
  57. package/dist/containers/mp3/parse-mp3.d.ts +3 -0
  58. package/dist/{boxes → containers}/mp3/parse-mp3.js +3 -3
  59. package/dist/containers/mp3/parse-mpeg-header.d.ts +4 -0
  60. package/dist/{boxes → containers}/mp3/parse-mpeg-header.js +2 -1
  61. package/dist/containers/riff/expect-riff-box.d.ts +7 -0
  62. package/dist/{boxes → containers}/riff/expect-riff-box.js +4 -4
  63. package/dist/containers/riff/get-duration.d.ts +3 -0
  64. package/dist/containers/riff/get-duration.js +33 -0
  65. package/dist/{boxes → containers}/riff/get-tracks-from-avi.d.ts +1 -2
  66. package/dist/{boxes → containers}/riff/parse-list-box.d.ts +1 -3
  67. package/dist/{boxes → containers}/riff/parse-list-box.js +3 -5
  68. package/dist/{boxes → containers}/riff/parse-movi.d.ts +2 -5
  69. package/dist/{boxes → containers}/riff/parse-movi.js +6 -4
  70. package/dist/containers/riff/parse-riff-body.d.ts +3 -0
  71. package/dist/{boxes → containers}/riff/parse-riff-body.js +4 -7
  72. package/dist/{boxes → containers}/riff/parse-riff-box.d.ts +1 -3
  73. package/dist/{boxes → containers}/riff/parse-riff-box.js +3 -6
  74. package/dist/containers/riff/parse-riff-header.d.ts +3 -0
  75. package/dist/{boxes → containers}/riff/parse-riff-header.js +4 -4
  76. package/dist/containers/riff/parse-riff.d.ts +3 -0
  77. package/dist/{boxes → containers}/riff/parse-riff.js +4 -7
  78. package/dist/containers/riff/parse-video-section.d.ts +2 -0
  79. package/dist/{boxes → containers}/riff/parse-video-section.js +1 -2
  80. package/dist/{boxes → containers}/riff/riff-box.d.ts +5 -10
  81. package/dist/containers/riff/riff-box.js +2 -0
  82. package/dist/{boxes → containers}/riff/traversal.d.ts +1 -2
  83. package/dist/containers/transport-stream/boxes.js +2 -0
  84. package/dist/{boxes → containers}/transport-stream/parse-packet.d.ts +1 -3
  85. package/dist/{boxes → containers}/transport-stream/parse-packet.js +2 -2
  86. package/dist/{boxes → containers}/transport-stream/parse-stream-packet.d.ts +1 -3
  87. package/dist/{boxes → containers}/transport-stream/parse-stream-packet.js +2 -1
  88. package/dist/containers/transport-stream/parse-transport-stream.d.ts +3 -0
  89. package/dist/{boxes → containers}/transport-stream/parse-transport-stream.js +2 -12
  90. package/dist/containers/wav/get-duration-from-wav.d.ts +3 -0
  91. package/dist/containers/wav/get-duration-from-wav.js +29 -0
  92. package/dist/containers/wav/get-metadata-from-wav.d.ts +3 -0
  93. package/dist/containers/wav/get-metadata-from-wav.js +11 -0
  94. package/dist/containers/wav/parse-data.d.ts +5 -0
  95. package/dist/containers/wav/parse-data.js +25 -0
  96. package/dist/containers/wav/parse-fmt.d.ts +5 -0
  97. package/dist/containers/wav/parse-fmt.js +56 -0
  98. package/dist/containers/wav/parse-header.d.ts +5 -0
  99. package/dist/containers/wav/parse-header.js +17 -0
  100. package/dist/containers/wav/parse-id3.d.ts +5 -0
  101. package/dist/containers/wav/parse-id3.js +17 -0
  102. package/dist/containers/wav/parse-list.d.ts +5 -0
  103. package/dist/containers/wav/parse-list.js +32 -0
  104. package/dist/containers/wav/parse-video-section.d.ts +5 -0
  105. package/dist/containers/wav/parse-video-section.js +37 -0
  106. package/dist/containers/wav/parse-wav.d.ts +3 -0
  107. package/dist/containers/wav/parse-wav.js +36 -0
  108. package/dist/containers/wav/types.d.ts +30 -0
  109. package/dist/containers/wav/types.js +2 -0
  110. package/dist/{boxes → containers}/webm/parse-ebml.d.ts +1 -2
  111. package/dist/{boxes → containers}/webm/parse-ebml.js +3 -2
  112. package/dist/containers/webm/parse-webm-header.d.ts +3 -0
  113. package/dist/{boxes → containers}/webm/parse-webm-header.js +2 -2
  114. package/dist/{boxes → containers}/webm/segments.d.ts +1 -3
  115. package/dist/{boxes → containers}/webm/segments.js +7 -6
  116. package/dist/emit-available-info.d.ts +1 -3
  117. package/dist/emit-available-info.js +82 -72
  118. package/dist/errors.d.ts +1 -1
  119. package/dist/esm/index.mjs +1539 -555
  120. package/dist/file-types/detect-file-type.d.ts +5 -1
  121. package/dist/file-types/detect-file-type.js +6 -1
  122. package/dist/file-types/index.js +3 -0
  123. package/dist/get-audio-codec.d.ts +3 -4
  124. package/dist/get-audio-codec.js +3 -3
  125. package/dist/get-container.d.ts +2 -2
  126. package/dist/get-container.js +10 -1
  127. package/dist/get-dimensions.d.ts +2 -3
  128. package/dist/get-dimensions.js +13 -9
  129. package/dist/get-duration.d.ts +5 -5
  130. package/dist/get-duration.js +28 -26
  131. package/dist/get-fields-from-callbacks.js +4 -0
  132. package/dist/get-fps.d.ts +1 -1
  133. package/dist/get-fps.js +12 -4
  134. package/dist/get-is-hdr.d.ts +1 -2
  135. package/dist/get-is-hdr.js +2 -2
  136. package/dist/get-keyframes.d.ts +1 -1
  137. package/dist/get-keyframes.js +4 -3
  138. package/dist/get-number-of-audio-channels.d.ts +3 -0
  139. package/dist/get-number-of-audio-channels.js +14 -0
  140. package/dist/get-sample-aspect-ratio.d.ts +8 -8
  141. package/dist/get-sample-aspect-ratio.js +1 -1
  142. package/dist/get-sample-positions-from-lpcm.d.ts +1 -1
  143. package/dist/get-sample-positions-from-lpcm.js +1 -1
  144. package/dist/get-sample-positions.d.ts +6 -6
  145. package/dist/get-sample-rate.d.ts +3 -0
  146. package/dist/get-sample-rate.js +14 -0
  147. package/dist/get-tracks.d.ts +8 -7
  148. package/dist/get-tracks.js +23 -10
  149. package/dist/get-video-codec.d.ts +2 -3
  150. package/dist/get-video-codec.js +4 -4
  151. package/dist/has-all-info.js +26 -15
  152. package/dist/index.d.ts +103 -25
  153. package/dist/index.js +7 -7
  154. package/dist/init-video.d.ts +7 -0
  155. package/dist/{parse-video.js → init-video.js} +26 -55
  156. package/dist/is-audio-structure.d.ts +2 -0
  157. package/dist/is-audio-structure.js +31 -0
  158. package/dist/metadata/get-metadata.js +16 -1
  159. package/dist/metadata/metadata-from-iso.d.ts +2 -1
  160. package/dist/metadata/metadata-from-iso.js +1 -1
  161. package/dist/metadata/metadata-from-matroska.js +1 -1
  162. package/dist/metadata/metadata-from-riff.d.ts +1 -1
  163. package/dist/options.d.ts +64 -38
  164. package/dist/parse-media.js +101 -34
  165. package/dist/parse-result.d.ts +8 -44
  166. package/dist/perform-seek.d.ts +13 -0
  167. package/dist/perform-seek.js +29 -0
  168. package/dist/readers/reader.d.ts +1 -1
  169. package/dist/register-track.d.ts +3 -3
  170. package/dist/run-parse-iteration.d.ts +8 -0
  171. package/dist/run-parse-iteration.js +48 -0
  172. package/dist/samples-from-moof.js +1 -1
  173. package/dist/state/aac-state.d.ts +13 -0
  174. package/dist/state/aac-state.js +17 -0
  175. package/dist/state/can-skip-tracks.js +5 -1
  176. package/dist/state/emitted-fields.js +4 -0
  177. package/dist/state/flac-state.d.ts +4 -0
  178. package/dist/state/flac-state.js +13 -0
  179. package/dist/state/has-tracks-section.d.ts +2 -1
  180. package/dist/state/has-tracks-section.js +4 -1
  181. package/dist/state/iso-base-media/cached-sample-positions.js +2 -2
  182. package/dist/{may-skip-video-data → state}/may-skip-video-data.d.ts +1 -1
  183. package/dist/{may-skip-video-data → state}/need-samples-for-fields.js +4 -0
  184. package/dist/state/parser-state.d.ts +88 -9
  185. package/dist/state/parser-state.js +8 -3
  186. package/dist/state/sample-callbacks.d.ts +1 -1
  187. package/dist/state/sample-callbacks.js +1 -1
  188. package/dist/state/slow-duration-fps.d.ts +2 -0
  189. package/dist/state/slow-duration-fps.js +18 -0
  190. package/dist/state/transport-stream.d.ts +3 -3
  191. package/dist/state/transport-stream.js +1 -1
  192. package/dist/state/webm.d.ts +2 -2
  193. package/dist/state/webm.js +1 -1
  194. package/dist/version.d.ts +1 -1
  195. package/dist/version.js +1 -1
  196. package/dist/webcodec-sample-types.d.ts +3 -3
  197. package/package.json +3 -3
  198. package/dist/boxes/iso-base-media/continue-mdat-routine.d.ts +0 -14
  199. package/dist/boxes/iso-base-media/continue-mdat-routine.js +0 -74
  200. package/dist/boxes/iso-base-media/get-children.d.ts +0 -8
  201. package/dist/boxes/iso-base-media/mdat/mdat.d.ts +0 -6
  202. package/dist/boxes/iso-base-media/parse-all-children.d.ts +0 -8
  203. package/dist/boxes/iso-base-media/parse-all-children.js +0 -20
  204. package/dist/boxes/iso-base-media/parse-mdat-partially.d.ts +0 -9
  205. package/dist/boxes/iso-base-media/parse-mdat-partially.js +0 -24
  206. package/dist/boxes/iso-base-media/process-box.d.ts +0 -7
  207. package/dist/boxes/mp3/get-tracks-from-mp3.d.ts +0 -4
  208. package/dist/boxes/mp3/id3-v2.d.ts +0 -0
  209. package/dist/boxes/mp3/id3-v2.js +0 -1
  210. package/dist/boxes/mp3/id3.d.ts +0 -6
  211. package/dist/boxes/mp3/parse-mpeg-header.d.ts +0 -6
  212. package/dist/boxes/riff/continue-after-riff-result.d.ts +0 -13
  213. package/dist/boxes/riff/continue-after-riff-result.js +0 -34
  214. package/dist/boxes/riff/expect-riff-box.d.ts +0 -11
  215. package/dist/boxes/riff/parse-box.d.ts +0 -9
  216. package/dist/boxes/riff/parse-box.js +0 -35
  217. package/dist/boxes/riff/parse-fmt-box.d.ts +0 -8
  218. package/dist/boxes/riff/parse-fmt-box.js +0 -35
  219. package/dist/boxes/riff/parse-riff-header.d.ts +0 -7
  220. package/dist/boxes/riff/parse-video-section.d.ts +0 -6
  221. package/dist/boxes/transport-stream/parse-transport-stream.d.ts +0 -7
  222. package/dist/boxes/webm/segments/parse-children.d.ts +0 -9
  223. package/dist/boxes/webm/segments/parse-children.js +0 -21
  224. package/dist/bun-reader.d.ts +0 -1
  225. package/dist/bun-reader.js +0 -17
  226. package/dist/continue-mdat-routine.d.ts +0 -17
  227. package/dist/continue-mdat-routine.js +0 -92
  228. package/dist/parse-video.d.ts +0 -14
  229. package/dist/state/iso-state.d.ts +0 -4
  230. package/dist/state/iso-state.js +0 -13
  231. /package/dist/{boxes/iso-base-media/base-type.js → containers/aac/types.js} +0 -0
  232. /package/dist/{boxes → containers}/avc/codec-string.d.ts +0 -0
  233. /package/dist/{boxes → containers}/avc/codec-string.js +0 -0
  234. /package/dist/{boxes → containers}/avc/color.d.ts +0 -0
  235. /package/dist/{boxes → containers}/avc/color.js +0 -0
  236. /package/dist/{boxes → containers}/avc/create-sps-pps-data.d.ts +0 -0
  237. /package/dist/{boxes → containers}/avc/create-sps-pps-data.js +0 -0
  238. /package/dist/{boxes → containers}/avc/interpret-sps.d.ts +0 -0
  239. /package/dist/{boxes → containers}/avc/interpret-sps.js +0 -0
  240. /package/dist/{boxes → containers}/avc/key.js +0 -0
  241. /package/dist/{boxes → containers}/avc/parse-avc.d.ts +0 -0
  242. /package/dist/{boxes → containers}/avc/parse-avc.js +0 -0
  243. /package/dist/{boxes → containers}/avc/sps-and-pps.d.ts +0 -0
  244. /package/dist/{boxes → containers}/avc/sps-and-pps.js +0 -0
  245. /package/dist/{boxes/iso-base-media/void-box.js → containers/flac/types.js} +0 -0
  246. /package/dist/{boxes/riff/riff-box.js → containers/iso-base-media/base-media-box.js} +0 -0
  247. /package/dist/{boxes → containers}/iso-base-media/base-type.d.ts +0 -0
  248. /package/dist/{boxes/transport-stream/boxes.js → containers/iso-base-media/base-type.js} +0 -0
  249. /package/dist/{boxes → containers}/iso-base-media/esds/decoder-specific-config.d.ts +0 -0
  250. /package/dist/{boxes → containers}/iso-base-media/esds/decoder-specific-config.js +0 -0
  251. /package/dist/{boxes → containers}/iso-base-media/esds/esds-descriptors.d.ts +0 -0
  252. /package/dist/{boxes → containers}/iso-base-media/esds/esds-descriptors.js +0 -0
  253. /package/dist/{boxes → containers}/iso-base-media/esds/esds.d.ts +0 -0
  254. /package/dist/{boxes → containers}/iso-base-media/esds/esds.js +0 -0
  255. /package/dist/{boxes → containers}/iso-base-media/ftyp.d.ts +0 -0
  256. /package/dist/{boxes → containers}/iso-base-media/ftyp.js +0 -0
  257. /package/dist/{boxes → containers}/iso-base-media/get-actual-number-of-channels.d.ts +0 -0
  258. /package/dist/{boxes → containers}/iso-base-media/get-actual-number-of-channels.js +0 -0
  259. /package/dist/{boxes → containers}/iso-base-media/get-keyframes.d.ts +0 -0
  260. /package/dist/{boxes → containers}/iso-base-media/get-keyframes.js +0 -0
  261. /package/dist/{boxes → containers}/iso-base-media/get-sample-positions-from-track.js +0 -0
  262. /package/dist/{boxes → containers}/iso-base-media/get-video-codec-from-iso-track.d.ts +0 -0
  263. /package/dist/{boxes → containers}/iso-base-media/get-video-codec-from-iso-track.js +0 -0
  264. /package/dist/{boxes → containers}/iso-base-media/make-track.d.ts +0 -0
  265. /package/dist/{boxes → containers}/iso-base-media/make-track.js +0 -0
  266. /package/dist/{boxes → containers}/iso-base-media/mdhd.d.ts +0 -0
  267. /package/dist/{boxes → containers}/iso-base-media/mdhd.js +0 -0
  268. /package/dist/{boxes → containers}/iso-base-media/meta/hdlr.d.ts +0 -0
  269. /package/dist/{boxes → containers}/iso-base-media/meta/hdlr.js +0 -0
  270. /package/dist/{boxes → containers}/iso-base-media/meta/ilst.d.ts +0 -0
  271. /package/dist/{boxes → containers}/iso-base-media/meta/ilst.js +0 -0
  272. /package/dist/{boxes → containers}/iso-base-media/mvhd.d.ts +0 -0
  273. /package/dist/{boxes → containers}/iso-base-media/mvhd.js +0 -0
  274. /package/dist/{boxes → containers}/iso-base-media/parse-icc-profile.d.ts +0 -0
  275. /package/dist/{boxes → containers}/iso-base-media/parse-icc-profile.js +0 -0
  276. /package/dist/{boxes → containers}/iso-base-media/stsd/av1c.d.ts +0 -0
  277. /package/dist/{boxes → containers}/iso-base-media/stsd/av1c.js +0 -0
  278. /package/dist/{boxes → containers}/iso-base-media/stsd/avcc.d.ts +0 -0
  279. /package/dist/{boxes → containers}/iso-base-media/stsd/avcc.js +0 -0
  280. /package/dist/{boxes → containers}/iso-base-media/stsd/colr.d.ts +0 -0
  281. /package/dist/{boxes → containers}/iso-base-media/stsd/colr.js +0 -0
  282. /package/dist/{boxes → containers}/iso-base-media/stsd/ctts.d.ts +0 -0
  283. /package/dist/{boxes → containers}/iso-base-media/stsd/ctts.js +0 -0
  284. /package/dist/{boxes → containers}/iso-base-media/stsd/hvcc.d.ts +0 -0
  285. /package/dist/{boxes → containers}/iso-base-media/stsd/hvcc.js +0 -0
  286. /package/dist/{boxes → containers}/iso-base-media/stsd/keys.d.ts +0 -0
  287. /package/dist/{boxes → containers}/iso-base-media/stsd/keys.js +0 -0
  288. /package/dist/{boxes → containers}/iso-base-media/stsd/pasp.d.ts +0 -0
  289. /package/dist/{boxes → containers}/iso-base-media/stsd/pasp.js +0 -0
  290. /package/dist/{boxes → containers}/iso-base-media/stsd/stco.d.ts +0 -0
  291. /package/dist/{boxes → containers}/iso-base-media/stsd/stco.js +0 -0
  292. /package/dist/{boxes → containers}/iso-base-media/stsd/stsc.d.ts +0 -0
  293. /package/dist/{boxes → containers}/iso-base-media/stsd/stsc.js +0 -0
  294. /package/dist/{boxes → containers}/iso-base-media/stsd/stss.d.ts +0 -0
  295. /package/dist/{boxes → containers}/iso-base-media/stsd/stss.js +0 -0
  296. /package/dist/{boxes → containers}/iso-base-media/stsd/stsz.d.ts +0 -0
  297. /package/dist/{boxes → containers}/iso-base-media/stsd/stsz.js +0 -0
  298. /package/dist/{boxes → containers}/iso-base-media/stsd/stts.d.ts +0 -0
  299. /package/dist/{boxes → containers}/iso-base-media/stsd/stts.js +0 -0
  300. /package/dist/{boxes → containers}/iso-base-media/tfdt.d.ts +0 -0
  301. /package/dist/{boxes → containers}/iso-base-media/tfdt.js +0 -0
  302. /package/dist/{boxes → containers}/iso-base-media/tfhd.d.ts +0 -0
  303. /package/dist/{boxes → containers}/iso-base-media/tfhd.js +0 -0
  304. /package/dist/{boxes → containers}/iso-base-media/tkhd.d.ts +0 -0
  305. /package/dist/{boxes → containers}/iso-base-media/tkhd.js +0 -0
  306. /package/dist/{boxes → containers}/iso-base-media/to-date.d.ts +0 -0
  307. /package/dist/{boxes → containers}/iso-base-media/to-date.js +0 -0
  308. /package/dist/{boxes → containers}/iso-base-media/traversal.js +0 -0
  309. /package/dist/{boxes → containers}/iso-base-media/trun.d.ts +0 -0
  310. /package/dist/{boxes → containers}/iso-base-media/trun.js +0 -0
  311. /package/dist/{boxes → containers}/iso-base-media/void-box.d.ts +0 -0
  312. /package/dist/{boxes → containers}/mp3/get-duration.d.ts +0 -0
  313. /package/dist/{boxes → containers}/mp3/get-duration.js +0 -0
  314. /package/dist/{boxes → containers}/mp3/get-frame-length.d.ts +0 -0
  315. /package/dist/{boxes → containers}/mp3/get-frame-length.js +0 -0
  316. /package/dist/{boxes → containers}/mp3/get-metadata-from-mp3.d.ts +0 -0
  317. /package/dist/{boxes → containers}/mp3/get-metadata-from-mp3.js +0 -0
  318. /package/dist/{boxes → containers}/mp3/id3-v1.d.ts +0 -0
  319. /package/dist/{boxes → containers}/mp3/id3-v1.js +0 -0
  320. /package/dist/{boxes → containers}/mp3/samples-per-mpeg-file.d.ts +0 -0
  321. /package/dist/{boxes → containers}/mp3/samples-per-mpeg-file.js +0 -0
  322. /package/dist/{boxes → containers}/riff/get-tracks-from-avi.js +0 -0
  323. /package/dist/{boxes → containers}/riff/is-movi.d.ts +0 -0
  324. /package/dist/{boxes → containers}/riff/is-movi.js +0 -0
  325. /package/dist/{boxes → containers}/riff/parse-avih.d.ts +0 -0
  326. /package/dist/{boxes → containers}/riff/parse-avih.js +0 -0
  327. /package/dist/{boxes → containers}/riff/parse-isft.d.ts +0 -0
  328. /package/dist/{boxes → containers}/riff/parse-isft.js +0 -0
  329. /package/dist/{boxes → containers}/riff/parse-strf.d.ts +0 -0
  330. /package/dist/{boxes → containers}/riff/parse-strf.js +0 -0
  331. /package/dist/{boxes → containers}/riff/parse-strh.d.ts +0 -0
  332. /package/dist/{boxes → containers}/riff/parse-strh.js +0 -0
  333. /package/dist/{boxes → containers}/riff/timescale.d.ts +0 -0
  334. /package/dist/{boxes → containers}/riff/timescale.js +0 -0
  335. /package/dist/{boxes → containers}/riff/traversal.js +0 -0
  336. /package/dist/{boxes → containers}/transport-stream/adts-header.d.ts +0 -0
  337. /package/dist/{boxes → containers}/transport-stream/adts-header.js +0 -0
  338. /package/dist/{boxes → containers}/transport-stream/boxes.d.ts +0 -0
  339. /package/dist/{boxes → containers}/transport-stream/discard-rest-of-packet.d.ts +0 -0
  340. /package/dist/{boxes → containers}/transport-stream/discard-rest-of-packet.js +0 -0
  341. /package/dist/{boxes → containers}/transport-stream/find-separator.d.ts +0 -0
  342. /package/dist/{boxes → containers}/transport-stream/find-separator.js +0 -0
  343. /package/dist/{boxes → containers}/transport-stream/get-tracks.d.ts +0 -0
  344. /package/dist/{boxes → containers}/transport-stream/get-tracks.js +0 -0
  345. /package/dist/{boxes → containers}/transport-stream/handle-aac-packet.d.ts +0 -0
  346. /package/dist/{boxes → containers}/transport-stream/handle-aac-packet.js +0 -0
  347. /package/dist/{boxes → containers}/transport-stream/handle-avc-packet.d.ts +0 -0
  348. /package/dist/{boxes → containers}/transport-stream/handle-avc-packet.js +0 -0
  349. /package/dist/{boxes → containers}/transport-stream/next-pes-header-store.d.ts +0 -0
  350. /package/dist/{boxes → containers}/transport-stream/next-pes-header-store.js +0 -0
  351. /package/dist/{boxes → containers}/transport-stream/parse-pat.d.ts +0 -0
  352. /package/dist/{boxes → containers}/transport-stream/parse-pat.js +0 -0
  353. /package/dist/{boxes → containers}/transport-stream/parse-pes.d.ts +0 -0
  354. /package/dist/{boxes → containers}/transport-stream/parse-pes.js +0 -0
  355. /package/dist/{boxes → containers}/transport-stream/parse-pmt.d.ts +0 -0
  356. /package/dist/{boxes → containers}/transport-stream/parse-pmt.js +0 -0
  357. /package/dist/{boxes → containers}/transport-stream/process-stream-buffers.d.ts +0 -0
  358. /package/dist/{boxes → containers}/transport-stream/process-stream-buffers.js +0 -0
  359. /package/dist/{boxes → containers}/transport-stream/traversal.d.ts +0 -0
  360. /package/dist/{boxes → containers}/transport-stream/traversal.js +0 -0
  361. /package/dist/{boxes → containers}/webm/allowed-partial-segments.d.ts +0 -0
  362. /package/dist/{boxes → containers}/webm/allowed-partial-segments.js +0 -0
  363. /package/dist/{boxes → containers}/webm/av1-codec-private.d.ts +0 -0
  364. /package/dist/{boxes → containers}/webm/av1-codec-private.js +0 -0
  365. /package/dist/{boxes → containers}/webm/color.d.ts +0 -0
  366. /package/dist/{boxes → containers}/webm/color.js +0 -0
  367. /package/dist/{boxes → containers}/webm/description.d.ts +0 -0
  368. /package/dist/{boxes → containers}/webm/description.js +0 -0
  369. /package/dist/{boxes → containers}/webm/get-ready-tracks.d.ts +0 -0
  370. /package/dist/{boxes → containers}/webm/get-ready-tracks.js +0 -0
  371. /package/dist/{boxes → containers}/webm/get-sample-from-block.d.ts +0 -0
  372. /package/dist/{boxes → containers}/webm/get-sample-from-block.js +0 -0
  373. /package/dist/{boxes → containers}/webm/make-track.d.ts +0 -0
  374. /package/dist/{boxes → containers}/webm/make-track.js +0 -0
  375. /package/dist/{boxes → containers}/webm/segments/all-segments.d.ts +0 -0
  376. /package/dist/{boxes → containers}/webm/segments/all-segments.js +0 -0
  377. /package/dist/{boxes → containers}/webm/segments/block-simple-block-flags.d.ts +0 -0
  378. /package/dist/{boxes → containers}/webm/segments/block-simple-block-flags.js +0 -0
  379. /package/dist/{boxes → containers}/webm/segments/track-entry.d.ts +0 -0
  380. /package/dist/{boxes → containers}/webm/segments/track-entry.js +0 -0
  381. /package/dist/{boxes → containers}/webm/traversal.d.ts +0 -0
  382. /package/dist/{boxes → containers}/webm/traversal.js +0 -0
  383. /package/dist/{may-skip-video-data → state}/may-skip-video-data.js +0 -0
  384. /package/dist/{may-skip-video-data → state}/need-samples-for-fields.d.ts +0 -0
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.addAvcProfileToTrack = void 0;
4
- const codec_string_1 = require("./boxes/avc/codec-string");
5
- const create_sps_pps_data_1 = require("./boxes/avc/create-sps-pps-data");
4
+ const codec_string_1 = require("./containers/avc/codec-string");
5
+ const create_sps_pps_data_1 = require("./containers/avc/create-sps-pps-data");
6
6
  const addAvcProfileToTrack = (track, avc1Profile) => {
7
7
  if (avc1Profile === null) {
8
8
  return track;
@@ -12,7 +12,7 @@ export declare class OffsetCounter {
12
12
  export declare const getArrayBufferIterator: (initialData: Uint8Array, maxBytes: number | null) => {
13
13
  startReadingBits: () => void;
14
14
  stopReadingBits: () => void;
15
- skipTo: (offset: number, reset: boolean) => void;
15
+ skipTo: (offset: number) => void;
16
16
  addData: (newData: Uint8Array) => void;
17
17
  counter: OffsetCounter;
18
18
  peekB: (length: number) => void;
@@ -20,7 +20,7 @@ export declare const getArrayBufferIterator: (initialData: Uint8Array, maxBytes:
20
20
  getBits: (bits: number) => number;
21
21
  bytesRemaining: () => number;
22
22
  leb128: () => number;
23
- removeBytesRead: () => void;
23
+ removeBytesRead: (force: boolean) => number | undefined;
24
24
  discard: (length: number) => void;
25
25
  getEightByteNumber: (littleEndian?: boolean) => number;
26
26
  getFourByteNumber: () => number;
@@ -65,5 +65,6 @@ export declare const getArrayBufferIterator: (initialData: Uint8Array, maxBytes:
65
65
  startCheckpoint: () => {
66
66
  returnToCheckpoint: () => void;
67
67
  };
68
+ getFlacCodecNumber: () => number;
68
69
  };
69
70
  export type BufferIterator = ReturnType<typeof getArrayBufferIterator>;
@@ -14,7 +14,7 @@ var _OffsetCounter_offset, _OffsetCounter_discardedBytes;
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.getArrayBufferIterator = exports.OffsetCounter = void 0;
16
16
  /* eslint-disable @typescript-eslint/no-use-before-define */
17
- const all_segments_1 = require("./boxes/webm/segments/all-segments");
17
+ const all_segments_1 = require("./containers/webm/segments/all-segments");
18
18
  const file_types_1 = require("./file-types");
19
19
  class OffsetCounter {
20
20
  constructor(initial) {
@@ -65,9 +65,9 @@ const getArrayBufferIterator = (initialData, maxBytes) => {
65
65
  if (!buf.resize) {
66
66
  throw new Error('`ArrayBuffer.resize` is not supported in this Runtime. On the server: Use at least Node.js 20 or Bun. In the browser: Chrome 111, Edge 111, Safari 16.4, Firefox 128, Opera 111');
67
67
  }
68
- let data = new Uint8Array(buf);
69
- data.set(initialData);
70
- let view = new DataView(data.buffer);
68
+ let uintArray = new Uint8Array(buf);
69
+ uintArray.set(initialData);
70
+ let view = new DataView(uintArray.buffer);
71
71
  const counter = makeOffsetCounter();
72
72
  const startCheckpoint = () => {
73
73
  const checkpoint = counter.getOffset();
@@ -78,7 +78,7 @@ const getArrayBufferIterator = (initialData, maxBytes) => {
78
78
  };
79
79
  };
80
80
  const getSlice = (amount) => {
81
- const value = data.slice(counter.getDiscardedOffset(), counter.getDiscardedOffset() + amount);
81
+ const value = uintArray.slice(counter.getDiscardedOffset(), counter.getDiscardedOffset() + amount);
82
82
  counter.increment(amount);
83
83
  return value;
84
84
  };
@@ -201,47 +201,41 @@ const getArrayBufferIterator = (initialData, maxBytes) => {
201
201
  buf.resize(newLength);
202
202
  const newArray = new Uint8Array(buf);
203
203
  newArray.set(newData, oldLength);
204
- data = newArray;
205
- view = new DataView(data.buffer);
204
+ uintArray = newArray;
205
+ view = new DataView(uintArray.buffer);
206
206
  };
207
207
  const bytesRemaining = () => {
208
- return data.byteLength - counter.getDiscardedOffset();
208
+ return uintArray.byteLength - counter.getDiscardedOffset();
209
209
  };
210
- const removeBytesRead = () => {
210
+ const removeBytesRead = (force) => {
211
211
  const bytesToRemove = counter.getDiscardedOffset();
212
212
  // Only do this operation if it is really worth it 😇
213
- if (bytesToRemove < 100000) {
213
+ // let's set the threshold to 3MB
214
+ if (bytesToRemove < 3000000 && !force) {
215
+ return;
216
+ }
217
+ // Don't remove if the data is not even available
218
+ if (view.byteLength < bytesToRemove && !force) {
214
219
  return;
215
220
  }
216
221
  counter.discardBytes(bytesToRemove);
217
- const newData = data.slice(bytesToRemove);
218
- data.set(newData);
222
+ const newData = uintArray.slice(bytesToRemove);
223
+ uintArray.set(newData);
219
224
  buf.resize(newData.byteLength);
220
- view = new DataView(data.buffer);
225
+ view = new DataView(uintArray.buffer);
226
+ return bytesToRemove;
221
227
  };
222
- const skipTo = (offset, reset) => {
228
+ const skipTo = (offset) => {
223
229
  const becomesSmaller = offset < counter.getOffset();
224
- if (becomesSmaller) {
225
- if (reset) {
226
- buf.resize(0);
227
- counter.decrement(counter.getOffset() - offset);
228
- counter.setDiscardedOffset(offset);
229
- }
230
- else {
231
- const toDecrement = counter.getOffset() - offset;
232
- const newOffset = counter.getOffset() - toDecrement;
233
- counter.decrement(toDecrement);
234
- const c = counter.getDiscardedBytes();
235
- if (c > newOffset) {
236
- throw new Error('already discarded too many bytes');
237
- }
238
- }
239
- }
240
- else {
230
+ if (!becomesSmaller) {
241
231
  const currentOffset = counter.getOffset();
242
232
  counter.increment(offset - currentOffset);
243
- removeBytesRead();
233
+ removeBytesRead(true);
234
+ return;
244
235
  }
236
+ buf.resize(0);
237
+ counter.decrement(counter.getOffset() - offset);
238
+ counter.setDiscardedOffset(offset);
245
239
  };
246
240
  const readExpGolomb = () => {
247
241
  if (!bitReadingMode) {
@@ -292,6 +286,37 @@ const getArrayBufferIterator = (initialData, maxBytes) => {
292
286
  bitReadingMode = true;
293
287
  byteToShift = getUint8();
294
288
  };
289
+ // https://www.rfc-editor.org/rfc/rfc9639.html#name-coded-number
290
+ const getFlacCodecNumber = () => {
291
+ let ones = 0;
292
+ let bits = 0;
293
+ // eslint-disable-next-line no-constant-binary-expression
294
+ while ((++bits || true) && getBits(1) === 1) {
295
+ ones++;
296
+ }
297
+ if (ones === 0) {
298
+ return getBits(7);
299
+ }
300
+ const bitArray = [];
301
+ const firstByteBits = 8 - ones - 1;
302
+ for (let i = 0; i < firstByteBits; i++) {
303
+ bitArray.unshift(getBits(1));
304
+ }
305
+ const extraBytes = ones - 1;
306
+ for (let i = 0; i < extraBytes; i++) {
307
+ for (let j = 0; j < 8; j++) {
308
+ const val = getBits(1);
309
+ if (j < 2) {
310
+ continue;
311
+ }
312
+ bitArray.unshift(val);
313
+ }
314
+ }
315
+ const encoded = bitArray.reduce((acc, bit, index) => {
316
+ return acc | (bit << index);
317
+ }, 0);
318
+ return encoded;
319
+ };
295
320
  const getBits = (bits) => {
296
321
  let result = 0;
297
322
  let bitsCollected = 0;
@@ -312,7 +337,7 @@ const getArrayBufferIterator = (initialData, maxBytes) => {
312
337
  return result;
313
338
  };
314
339
  const destroy = () => {
315
- data = new Uint8Array(0);
340
+ uintArray = new Uint8Array(0);
316
341
  buf.resize(0);
317
342
  };
318
343
  return {
@@ -336,7 +361,7 @@ const getArrayBufferIterator = (initialData, maxBytes) => {
336
361
  return new TextDecoder().decode(atom);
337
362
  },
338
363
  detectFileType: () => {
339
- return (0, file_types_1.detectFileType)(data);
364
+ return (0, file_types_1.detectFileType)(uintArray);
340
365
  },
341
366
  getPaddedFourByteNumber,
342
367
  getMatroskaSegmentId: () => {
@@ -531,6 +556,7 @@ const getArrayBufferIterator = (initialData, maxBytes) => {
531
556
  startBox,
532
557
  readExpGolomb,
533
558
  startCheckpoint,
559
+ getFlacCodecNumber,
534
560
  };
535
561
  };
536
562
  exports.getArrayBufferIterator = getArrayBufferIterator;
@@ -0,0 +1,3 @@
1
+ import type { ParseResult } from '../../parse-result';
2
+ import type { ParserState } from '../../state/parser-state';
3
+ export declare const parseAac: (state: ParserState) => Promise<ParseResult>;
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseAac = void 0;
4
+ const aac_codecprivate_1 = require("../../aac-codecprivate");
5
+ const convert_audio_or_video_sample_1 = require("../../convert-audio-or-video-sample");
6
+ const register_track_1 = require("../../register-track");
7
+ const parseAac = async (state) => {
8
+ const { iterator } = state;
9
+ const startOffset = iterator.counter.getOffset();
10
+ iterator.startReadingBits();
11
+ const syncWord = iterator.getBits(12);
12
+ if (syncWord !== 0xfff) {
13
+ throw new Error('Invalid syncword: ' + syncWord);
14
+ }
15
+ const id = iterator.getBits(1);
16
+ if (id !== 0) {
17
+ throw new Error('Only supporting MPEG-4 for .aac');
18
+ }
19
+ const layer = iterator.getBits(2);
20
+ if (layer !== 0) {
21
+ throw new Error('Only supporting layer 0 for .aac');
22
+ }
23
+ const protectionAbsent = iterator.getBits(1); // protection absent
24
+ const audioObjectType = iterator.getBits(2); // 1 = 'AAC-LC'
25
+ const samplingFrequencyIndex = iterator.getBits(4);
26
+ const sampleRate = (0, aac_codecprivate_1.getSampleRateFromSampleFrequencyIndex)(samplingFrequencyIndex);
27
+ iterator.getBits(1); // private bit
28
+ const channelConfiguration = iterator.getBits(3);
29
+ const codecPrivate = (0, aac_codecprivate_1.createAacCodecPrivate)({
30
+ audioObjectType,
31
+ sampleRate,
32
+ channelConfiguration,
33
+ });
34
+ iterator.getBits(1); // originality
35
+ iterator.getBits(1); // home
36
+ iterator.getBits(1); // copyright bit
37
+ iterator.getBits(1); // copy start
38
+ const frameLength = iterator.getBits(13); // frame length
39
+ iterator.getBits(11); // buffer fullness
40
+ iterator.getBits(2); // number of AAC frames minus 1
41
+ if (!protectionAbsent) {
42
+ iterator.getBits(16); // crc
43
+ }
44
+ iterator.stopReadingBits();
45
+ iterator.counter.decrement(iterator.counter.getOffset() - startOffset);
46
+ const data = iterator.getSlice(frameLength);
47
+ if (state.callbacks.tracks.getTracks().length === 0) {
48
+ await (0, register_track_1.registerTrack)({
49
+ state,
50
+ container: 'aac',
51
+ track: {
52
+ codec: (0, aac_codecprivate_1.mapAudioObjectTypeToCodecString)(audioObjectType),
53
+ codecWithoutConfig: 'aac',
54
+ codecPrivate,
55
+ description: codecPrivate,
56
+ numberOfChannels: channelConfiguration,
57
+ sampleRate,
58
+ timescale: 1000000,
59
+ trackId: 0,
60
+ trakBox: null,
61
+ type: 'audio',
62
+ },
63
+ });
64
+ state.callbacks.tracks.setIsDone();
65
+ }
66
+ const duration = 1024 / sampleRate;
67
+ const { index } = state.aac.addSample({ offset: startOffset, size: frameLength });
68
+ const timestamp = (1024 / sampleRate) * index;
69
+ // One ADTS frame contains 1024 samples
70
+ await state.callbacks.onAudioSample(0, (0, convert_audio_or_video_sample_1.convertAudioOrVideoSampleToWebCodecsTimestamps)({
71
+ duration,
72
+ type: 'key',
73
+ data,
74
+ offset: startOffset,
75
+ timescale: 1000000,
76
+ trackId: 0,
77
+ cts: timestamp,
78
+ dts: timestamp,
79
+ timestamp,
80
+ }, 1));
81
+ return Promise.resolve({ skipTo: null });
82
+ };
83
+ exports.parseAac = parseAac;
@@ -0,0 +1,4 @@
1
+ export type AacStructure = {
2
+ type: 'aac';
3
+ boxes: never[];
4
+ };
@@ -1,2 +1,2 @@
1
1
  import type { AvcInfo } from './parse-avc';
2
- export declare const getKeyFrameOrDeltaFromAvcInfo: (infos: AvcInfo[]) => "delta" | "key";
2
+ export declare const getKeyFrameOrDeltaFromAvcInfo: (infos: AvcInfo[]) => "key" | "delta";
@@ -0,0 +1,2 @@
1
+ import type { BufferIterator } from '../../buffer-iterator';
2
+ export declare const getBlockSize: (iterator: BufferIterator) => number | "uncommon-u16" | "uncommon-u8";
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getBlockSize = void 0;
4
+ const getBlockSize = (iterator) => {
5
+ const bits = iterator.getBits(4);
6
+ if (bits === 0b0000) {
7
+ throw new Error('Reserved block size');
8
+ }
9
+ if (bits === 0b0001) {
10
+ return 192;
11
+ }
12
+ if (bits >= 0b0010 && bits <= 0b0101) {
13
+ return 144 * 2 ** bits;
14
+ }
15
+ if (bits === 0b0110) {
16
+ return 'uncommon-u8';
17
+ }
18
+ if (bits === 0b0111) {
19
+ return 'uncommon-u16';
20
+ }
21
+ if (bits >= 0b1000 && bits <= 0b1111) {
22
+ return 2 ** bits;
23
+ }
24
+ throw new Error('Invalid block size');
25
+ };
26
+ exports.getBlockSize = getBlockSize;
@@ -0,0 +1,2 @@
1
+ import type { BufferIterator } from '../../buffer-iterator';
2
+ export declare const getChannelCount: (iterator: BufferIterator) => 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8;
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getChannelCount = void 0;
4
+ // https://www.rfc-editor.org/rfc/rfc9639.html#name-channels-bits
5
+ const getChannelCount = (iterator) => {
6
+ const bits = iterator.getBits(4);
7
+ if (bits === 0b0000) {
8
+ return 1;
9
+ }
10
+ if (bits === 0b0001) {
11
+ return 2;
12
+ }
13
+ if (bits === 0b0010) {
14
+ return 3;
15
+ }
16
+ if (bits === 0b0011) {
17
+ return 4;
18
+ }
19
+ if (bits === 0b0100) {
20
+ return 5;
21
+ }
22
+ if (bits === 0b0101) {
23
+ return 6;
24
+ }
25
+ if (bits === 0b0110) {
26
+ return 7;
27
+ }
28
+ if (bits === 0b0111) {
29
+ return 8;
30
+ }
31
+ if (bits === 0b1000 || bits === 0b1001 || bits === 0b1010) {
32
+ return 2;
33
+ }
34
+ throw new Error(`Invalid channel count: ${bits.toString(2)}`);
35
+ };
36
+ exports.getChannelCount = getChannelCount;
@@ -0,0 +1,2 @@
1
+ import type { ParserState } from '../../state/parser-state';
2
+ export declare const getDurationFromFlac: (parserState: ParserState) => number;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getDurationFromFlac = void 0;
4
+ const getDurationFromFlac = (parserState) => {
5
+ const structure = parserState.structure.getStructure();
6
+ if (structure.type !== 'flac') {
7
+ throw new Error('Not a FLAC file');
8
+ }
9
+ const streaminfo = structure.boxes.find((b) => b.type === 'flac-streaminfo');
10
+ if (!streaminfo) {
11
+ throw new Error('Streaminfo not found');
12
+ }
13
+ return streaminfo.totalSamples / streaminfo.sampleRate;
14
+ };
15
+ exports.getDurationFromFlac = getDurationFromFlac;
@@ -0,0 +1,2 @@
1
+ import type { FlacStructure } from './types';
2
+ export declare const getMetadataFromFlac: (structure: FlacStructure) => import("../..").MetadataEntry[] | null;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getMetadataFromFlac = void 0;
4
+ const getMetadataFromFlac = (structure) => {
5
+ const box = structure.boxes.find((b) => b.type === 'flac-vorbis-comment');
6
+ if (!box) {
7
+ return null;
8
+ }
9
+ return box.fields;
10
+ };
11
+ exports.getMetadataFromFlac = getMetadataFromFlac;
@@ -0,0 +1,3 @@
1
+ import type { BufferIterator } from '../../buffer-iterator';
2
+ import type { ParserState } from '../../state/parser-state';
3
+ export declare const getSampleRate: (iterator: BufferIterator, state: ParserState) => number | "uncommon-u8" | "uncommon-u16" | "uncommon-u16-10";
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getSampleRate = void 0;
4
+ // https://www.rfc-editor.org/rfc/rfc9639.html#name-sample-rate-bits
5
+ const getSampleRate = (iterator, state) => {
6
+ var _a, _b;
7
+ const mode = iterator.getBits(4);
8
+ if (mode === 0b0000) {
9
+ const structure = state.structure.getStructure();
10
+ const sampleRate = (_b = (_a = structure.boxes.find((box) => box.type === 'flac-streaminfo')) === null || _a === void 0 ? void 0 : _a.sampleRate) !== null && _b !== void 0 ? _b : null;
11
+ if (sampleRate === null) {
12
+ throw new Error('Sample rate not found');
13
+ }
14
+ return sampleRate;
15
+ }
16
+ if (mode === 0b0001) {
17
+ return 88200;
18
+ }
19
+ if (mode === 0b0010) {
20
+ return 176400;
21
+ }
22
+ if (mode === 0b0011) {
23
+ return 192000;
24
+ }
25
+ if (mode === 0b0100) {
26
+ return 8000;
27
+ }
28
+ if (mode === 0b0101) {
29
+ return 16000;
30
+ }
31
+ if (mode === 0b0110) {
32
+ return 22050;
33
+ }
34
+ if (mode === 0b0111) {
35
+ return 24000;
36
+ }
37
+ if (mode === 0b1000) {
38
+ return 32000;
39
+ }
40
+ if (mode === 0b1001) {
41
+ return 44100;
42
+ }
43
+ if (mode === 0b1010) {
44
+ return 48000;
45
+ }
46
+ if (mode === 0b1011) {
47
+ return 96000;
48
+ }
49
+ if (mode === 0b1100) {
50
+ return 'uncommon-u8';
51
+ }
52
+ if (mode === 0b1101) {
53
+ return 'uncommon-u16';
54
+ }
55
+ if (mode === 0b1110) {
56
+ return 'uncommon-u16-10';
57
+ }
58
+ throw new Error(`Invalid sample rate mode: ${mode.toString(2)}`);
59
+ };
60
+ exports.getSampleRate = getSampleRate;
@@ -0,0 +1,15 @@
1
+ import { type BufferIterator } from '../../buffer-iterator';
2
+ import type { ParseResult } from '../../parse-result';
3
+ import type { ParserState } from '../../state/parser-state';
4
+ export declare const parseFrameHeader: ({ iterator, state, }: {
5
+ iterator: BufferIterator;
6
+ state: ParserState;
7
+ }) => {
8
+ num: number;
9
+ blockSize: number;
10
+ sampleRate: number;
11
+ } | null;
12
+ export declare const parseFlacFrame: ({ state, iterator, }: {
13
+ state: ParserState;
14
+ iterator: BufferIterator;
15
+ }) => Promise<ParseResult>;
@@ -0,0 +1,175 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseFlacFrame = exports.parseFrameHeader = void 0;
4
+ const buffer_iterator_1 = require("../../buffer-iterator");
5
+ const convert_audio_or_video_sample_1 = require("../../convert-audio-or-video-sample");
6
+ const get_block_size_1 = require("./get-block-size");
7
+ const get_channel_count_1 = require("./get-channel-count");
8
+ const get_sample_rate_1 = require("./get-sample-rate");
9
+ // https://www.rfc-editor.org/rfc/rfc9639.html#section-9.1.1
10
+ function calculateCRC8(data) {
11
+ const polynomial = 0x07; // x^8 + x^2 + x^1 + x^0
12
+ let crc = 0x00; // Initialize CRC to 0
13
+ for (const byte of data) {
14
+ crc ^= byte; // XOR byte into least significant byte of crc
15
+ for (let i = 0; i < 8; i++) {
16
+ // For each bit in the byte
17
+ if ((crc & 0x80) !== 0) {
18
+ // If the leftmost bit (MSB) is set
19
+ crc = (crc << 1) ^ polynomial; // Shift left and XOR with polynomial
20
+ }
21
+ else {
22
+ crc <<= 1; // Just shift left
23
+ }
24
+ crc &= 0xff; // Ensure CRC remains 8-bit
25
+ }
26
+ }
27
+ return crc;
28
+ }
29
+ const parseFrameHeader = ({ iterator, state, }) => {
30
+ if (iterator.bytesRemaining() < 10) {
31
+ return null;
32
+ }
33
+ const startOffset = iterator.counter.getOffset();
34
+ iterator.discard(2); // sync code
35
+ iterator.startReadingBits();
36
+ const blockSizeBits = (0, get_block_size_1.getBlockSize)(iterator);
37
+ const sampleRateBits = (0, get_sample_rate_1.getSampleRate)(iterator, state);
38
+ (0, get_channel_count_1.getChannelCount)(iterator); // channel count
39
+ iterator.getBits(3); // bit depth
40
+ iterator.getBits(1);
41
+ const num = iterator.getFlacCodecNumber();
42
+ const blockSize = blockSizeBits === 'uncommon-u16'
43
+ ? iterator.getBits(16) + 1
44
+ : blockSizeBits === 'uncommon-u8'
45
+ ? iterator.getBits(8) + 1
46
+ : blockSizeBits;
47
+ const sampleRate = sampleRateBits === 'uncommon-u16'
48
+ ? iterator.getBits(16)
49
+ : sampleRateBits === 'uncommon-u16-10'
50
+ ? iterator.getBits(16) * 10
51
+ : sampleRateBits === 'uncommon-u8'
52
+ ? iterator.getBits(8)
53
+ : sampleRateBits;
54
+ iterator.stopReadingBits();
55
+ const size = iterator.counter.getOffset() - startOffset;
56
+ const crc = iterator.getUint8();
57
+ iterator.counter.decrement(size + 1);
58
+ const crcCalculated = calculateCRC8(iterator.getSlice(size));
59
+ iterator.counter.decrement(size);
60
+ if (crcCalculated !== crc) {
61
+ return null;
62
+ }
63
+ return { num, blockSize, sampleRate };
64
+ };
65
+ exports.parseFrameHeader = parseFrameHeader;
66
+ const emitSample = async ({ state, data, offset, }) => {
67
+ const iterator = (0, buffer_iterator_1.getArrayBufferIterator)(data, null);
68
+ const parsed = (0, exports.parseFrameHeader)({ iterator, state });
69
+ if (!parsed) {
70
+ throw new Error('Invalid CRC');
71
+ }
72
+ const { blockSize, num, sampleRate } = parsed;
73
+ const duration = blockSize / sampleRate;
74
+ const structure = state.structure.getStructure();
75
+ const streamInfo = structure.boxes.find((box) => box.type === 'flac-streaminfo');
76
+ if (!streamInfo) {
77
+ throw new Error('Stream info not found');
78
+ }
79
+ if (streamInfo.minimumBlockSize !== streamInfo.maximumBlockSize) {
80
+ throw new Error('Cannot determine timestamp');
81
+ }
82
+ const timestamp = (num * streamInfo.maximumBlockSize) / streamInfo.sampleRate;
83
+ await state.callbacks.onAudioSample(0, (0, convert_audio_or_video_sample_1.convertAudioOrVideoSampleToWebCodecsTimestamps)({
84
+ data,
85
+ duration,
86
+ cts: timestamp,
87
+ dts: timestamp,
88
+ timestamp,
89
+ type: 'key',
90
+ offset,
91
+ timescale: 1000000,
92
+ trackId: 0,
93
+ }, 1));
94
+ iterator.destroy();
95
+ };
96
+ const parseFlacFrame = async ({ state, iterator, }) => {
97
+ var _a, _b;
98
+ const blockingBit = state.flac.getBlockingBitStrategy();
99
+ const offset = iterator.counter.getOffset();
100
+ const { returnToCheckpoint } = iterator.startCheckpoint();
101
+ iterator.startReadingBits();
102
+ if (blockingBit === undefined) {
103
+ const bits = iterator.getBits(15);
104
+ if (bits !== 0b111111111111100) {
105
+ throw new Error('Invalid sync code');
106
+ }
107
+ state.flac.setBlockingBitStrategy(iterator.getBits(1));
108
+ }
109
+ else if (blockingBit === 1) {
110
+ const bits = iterator.getBits(16);
111
+ if (bits !== 0b1111111111111001) {
112
+ throw new Error('Blocking bit changed, it should not');
113
+ }
114
+ }
115
+ else if (blockingBit === 0) {
116
+ const bits = iterator.getBits(16);
117
+ if (bits !== 0b1111111111111000) {
118
+ throw new Error('Blocking bit changed, it should not');
119
+ }
120
+ }
121
+ const setBlockingBit = state.flac.getBlockingBitStrategy();
122
+ if (setBlockingBit === undefined) {
123
+ throw new Error('Blocking bit should be set');
124
+ }
125
+ iterator.stopReadingBits();
126
+ const structure = state.structure.getStructure();
127
+ if (structure.type !== 'flac') {
128
+ throw new Error('Expected flac-structure');
129
+ }
130
+ const minimumFrameSize = (_b = (_a = structure.boxes.find((b) => b.type === 'flac-streaminfo')) === null || _a === void 0 ? void 0 : _a.minimumFrameSize) !== null && _b !== void 0 ? _b : null;
131
+ if (minimumFrameSize === null) {
132
+ throw new Error('Expected flac-streaminfo');
133
+ }
134
+ if (minimumFrameSize !== 0) {
135
+ iterator.getSlice(minimumFrameSize - 2);
136
+ }
137
+ while (true) {
138
+ if (!state.contentLength) {
139
+ throw new Error('Need content-length for FLAC to parse');
140
+ }
141
+ if (iterator.counter.getOffset() === state.contentLength) {
142
+ const size = iterator.counter.getOffset() - offset;
143
+ returnToCheckpoint();
144
+ const slice = iterator.getSlice(size);
145
+ await emitSample({ state, data: slice, offset });
146
+ break;
147
+ }
148
+ if (iterator.bytesRemaining() === 0) {
149
+ returnToCheckpoint();
150
+ break;
151
+ }
152
+ const nextByte = iterator.getUint8();
153
+ if (nextByte === 0xff) {
154
+ const nextBits = iterator.getUint8();
155
+ const expected = setBlockingBit === 1 ? 249 : 248;
156
+ if (nextBits !== expected) {
157
+ iterator.counter.decrement(1);
158
+ continue;
159
+ }
160
+ iterator.counter.decrement(2);
161
+ const nextIsLegit = (0, exports.parseFrameHeader)({ iterator, state });
162
+ if (!nextIsLegit) {
163
+ iterator.discard(1);
164
+ continue;
165
+ }
166
+ const size = iterator.counter.getOffset() - offset;
167
+ returnToCheckpoint();
168
+ const data = iterator.getSlice(size);
169
+ await emitSample({ state, data, offset });
170
+ break;
171
+ }
172
+ }
173
+ return { skipTo: null };
174
+ };
175
+ exports.parseFlacFrame = parseFlacFrame;
@@ -1,7 +1,7 @@
1
1
  import type { BufferIterator } from '../../buffer-iterator';
2
2
  import type { ParseResult } from '../../parse-result';
3
3
  import type { ParserState } from '../../state/parser-state';
4
- export declare const parseRiff: ({ iterator, state, }: {
4
+ export declare const parseFlac: ({ iterator, state, }: {
5
5
  iterator: BufferIterator;
6
6
  state: ParserState;
7
7
  }) => Promise<ParseResult>;