@remotion/media-parser 4.0.249 → 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 (405) hide show
  1. package/dist/add-avc-profile-to-track.js +2 -2
  2. package/dist/buffer-iterator.d.ts +3 -5
  3. package/dist/buffer-iterator.js +66 -50
  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-box.d.ts → containers/flac/parse-flac.d.ts} +1 -3
  21. package/dist/containers/flac/parse-flac.js +54 -0
  22. package/dist/{boxes/mp3/parse-mpeg-header.d.ts → containers/flac/parse-header.d.ts} +4 -3
  23. package/dist/containers/flac/parse-header.js +10 -0
  24. package/dist/{boxes/mp3/parse-mp3.d.ts → containers/flac/parse-metadata.d.ts} +4 -4
  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} +2 -4
  27. package/dist/containers/flac/parse-streaminfo.js +53 -0
  28. package/dist/containers/flac/parse-unknown-block.d.ts +8 -0
  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/containers/iso-base-media/get-children.js +21 -0
  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/containers/iso-base-media/mdat/mdat.js +91 -0
  37. package/dist/containers/iso-base-media/moov/moov.d.ts +12 -0
  38. package/dist/containers/iso-base-media/moov/moov.js +17 -0
  39. package/dist/containers/iso-base-media/parse-boxes.d.ts +3 -0
  40. package/dist/containers/iso-base-media/parse-boxes.js +40 -0
  41. package/dist/containers/iso-base-media/process-box.d.ts +3 -0
  42. package/dist/{boxes → containers}/iso-base-media/process-box.js +49 -147
  43. package/dist/{boxes → containers}/iso-base-media/stsd/mebx.d.ts +1 -6
  44. package/dist/containers/iso-base-media/stsd/mebx.js +22 -0
  45. package/dist/{boxes → containers}/iso-base-media/stsd/samples.d.ts +6 -16
  46. package/dist/{boxes → containers}/iso-base-media/stsd/samples.js +26 -71
  47. package/dist/{boxes → containers}/iso-base-media/stsd/stsd.d.ts +1 -6
  48. package/dist/{boxes → containers}/iso-base-media/stsd/stsd.js +3 -6
  49. package/dist/containers/iso-base-media/trak/trak.d.ts +12 -0
  50. package/dist/containers/iso-base-media/trak/trak.js +17 -0
  51. package/dist/{boxes → containers}/iso-base-media/traversal.d.ts +2 -3
  52. package/dist/{boxes → containers}/iso-base-media/traversal.js +1 -12
  53. package/dist/containers/iso-base-media/void-box.js +2 -0
  54. package/dist/containers/mp3/get-tracks-from-mp3.d.ts +4 -0
  55. package/dist/{boxes → containers}/mp3/get-tracks-from-mp3.js +6 -6
  56. package/dist/containers/mp3/id3.d.ts +4 -0
  57. package/dist/{boxes → containers}/mp3/id3.js +8 -5
  58. package/dist/containers/mp3/parse-mp3.d.ts +3 -0
  59. package/dist/{boxes → containers}/mp3/parse-mp3.js +4 -20
  60. package/dist/containers/mp3/parse-mpeg-header.d.ts +4 -0
  61. package/dist/{boxes → containers}/mp3/parse-mpeg-header.js +2 -1
  62. package/dist/containers/riff/expect-riff-box.d.ts +7 -0
  63. package/dist/containers/riff/expect-riff-box.js +72 -0
  64. package/dist/containers/riff/get-duration.d.ts +3 -0
  65. package/dist/containers/riff/get-duration.js +33 -0
  66. package/dist/{boxes → containers}/riff/get-tracks-from-avi.d.ts +2 -3
  67. package/dist/{boxes → containers}/riff/get-tracks-from-avi.js +6 -10
  68. package/dist/containers/riff/parse-list-box.d.ts +6 -0
  69. package/dist/containers/riff/parse-list-box.js +29 -0
  70. package/dist/containers/riff/parse-movi.d.ts +11 -0
  71. package/dist/{boxes → containers}/riff/parse-movi.js +37 -57
  72. package/dist/containers/riff/parse-riff-body.d.ts +3 -0
  73. package/dist/containers/riff/parse-riff-body.js +22 -0
  74. package/dist/containers/riff/parse-riff-box.d.ts +7 -0
  75. package/dist/{boxes → containers}/riff/parse-riff-box.js +3 -10
  76. package/dist/containers/riff/parse-riff-header.d.ts +3 -0
  77. package/dist/containers/riff/parse-riff-header.js +23 -0
  78. package/dist/containers/riff/parse-riff.d.ts +3 -0
  79. package/dist/containers/riff/parse-riff.js +12 -0
  80. package/dist/containers/riff/parse-strf.d.ts +7 -0
  81. package/dist/{boxes → containers}/riff/parse-strf.js +4 -8
  82. package/dist/{boxes → containers}/riff/parse-strh.js +11 -0
  83. package/dist/containers/riff/parse-video-section.d.ts +2 -0
  84. package/dist/containers/riff/parse-video-section.js +19 -0
  85. package/dist/{boxes → containers}/riff/riff-box.d.ts +8 -14
  86. package/dist/containers/riff/riff-box.js +2 -0
  87. package/dist/{boxes → containers}/riff/traversal.d.ts +1 -3
  88. package/dist/{boxes → containers}/riff/traversal.js +1 -6
  89. package/dist/containers/transport-stream/boxes.js +2 -0
  90. package/dist/containers/transport-stream/get-tracks.d.ts +4 -0
  91. package/dist/{boxes → containers}/transport-stream/get-tracks.js +4 -3
  92. package/dist/containers/transport-stream/parse-packet.d.ts +5 -0
  93. package/dist/{boxes → containers}/transport-stream/parse-packet.js +4 -5
  94. package/dist/containers/transport-stream/parse-stream-packet.d.ts +9 -0
  95. package/dist/{boxes → containers}/transport-stream/parse-stream-packet.js +11 -12
  96. package/dist/containers/transport-stream/parse-transport-stream.d.ts +3 -0
  97. package/dist/{boxes → containers}/transport-stream/parse-transport-stream.js +8 -37
  98. package/dist/{boxes → containers}/transport-stream/process-stream-buffers.d.ts +1 -2
  99. package/dist/{boxes → containers}/transport-stream/process-stream-buffers.js +3 -3
  100. package/dist/containers/wav/get-duration-from-wav.d.ts +3 -0
  101. package/dist/containers/wav/get-duration-from-wav.js +29 -0
  102. package/dist/containers/wav/get-metadata-from-wav.d.ts +3 -0
  103. package/dist/containers/wav/get-metadata-from-wav.js +11 -0
  104. package/dist/containers/wav/parse-data.d.ts +5 -0
  105. package/dist/containers/wav/parse-data.js +25 -0
  106. package/dist/containers/wav/parse-fmt.d.ts +5 -0
  107. package/dist/containers/wav/parse-fmt.js +56 -0
  108. package/dist/containers/wav/parse-header.d.ts +5 -0
  109. package/dist/containers/wav/parse-header.js +17 -0
  110. package/dist/containers/wav/parse-id3.d.ts +5 -0
  111. package/dist/containers/wav/parse-id3.js +17 -0
  112. package/dist/containers/wav/parse-list.d.ts +5 -0
  113. package/dist/containers/wav/parse-list.js +32 -0
  114. package/dist/containers/wav/parse-video-section.d.ts +5 -0
  115. package/dist/containers/wav/parse-video-section.js +37 -0
  116. package/dist/containers/wav/parse-wav.d.ts +3 -0
  117. package/dist/containers/wav/parse-wav.js +36 -0
  118. package/dist/containers/wav/types.d.ts +30 -0
  119. package/dist/containers/wav/types.js +2 -0
  120. package/dist/{boxes → containers}/webm/parse-ebml.d.ts +1 -2
  121. package/dist/{boxes → containers}/webm/parse-ebml.js +6 -2
  122. package/dist/containers/webm/parse-webm-header.d.ts +3 -0
  123. package/dist/containers/webm/parse-webm-header.js +53 -0
  124. package/dist/containers/webm/segments.d.ts +9 -0
  125. package/dist/containers/webm/segments.js +80 -0
  126. package/dist/emit-available-info.d.ts +1 -3
  127. package/dist/emit-available-info.js +86 -76
  128. package/dist/errors.d.ts +1 -1
  129. package/dist/esm/from-node.mjs +8 -9
  130. package/dist/esm/index.mjs +4951 -4693
  131. package/dist/file-types/detect-file-type.d.ts +5 -1
  132. package/dist/file-types/detect-file-type.js +10 -3
  133. package/dist/file-types/index.js +3 -0
  134. package/dist/get-audio-codec.d.ts +4 -5
  135. package/dist/get-audio-codec.js +5 -5
  136. package/dist/get-container.d.ts +2 -2
  137. package/dist/get-container.js +10 -1
  138. package/dist/get-dimensions.d.ts +2 -3
  139. package/dist/get-dimensions.js +14 -10
  140. package/dist/get-duration.d.ts +5 -5
  141. package/dist/get-duration.js +29 -27
  142. package/dist/get-fields-from-callbacks.js +4 -0
  143. package/dist/get-fps.d.ts +1 -1
  144. package/dist/get-fps.js +12 -4
  145. package/dist/get-is-hdr.d.ts +2 -3
  146. package/dist/get-is-hdr.js +4 -4
  147. package/dist/get-keyframes.d.ts +1 -1
  148. package/dist/get-keyframes.js +4 -3
  149. package/dist/get-number-of-audio-channels.d.ts +3 -0
  150. package/dist/get-number-of-audio-channels.js +14 -0
  151. package/dist/get-sample-aspect-ratio.d.ts +8 -8
  152. package/dist/get-sample-aspect-ratio.js +1 -1
  153. package/dist/get-sample-positions-from-lpcm.d.ts +1 -1
  154. package/dist/get-sample-positions-from-lpcm.js +1 -1
  155. package/dist/get-sample-positions.d.ts +6 -6
  156. package/dist/get-sample-rate.d.ts +3 -0
  157. package/dist/get-sample-rate.js +14 -0
  158. package/dist/get-tracks.d.ts +9 -8
  159. package/dist/get-tracks.js +36 -22
  160. package/dist/get-video-codec.d.ts +3 -4
  161. package/dist/get-video-codec.js +6 -6
  162. package/dist/has-all-info.js +26 -15
  163. package/dist/index.d.ts +145 -41
  164. package/dist/index.js +8 -8
  165. package/dist/init-video.d.ts +7 -0
  166. package/dist/init-video.js +114 -0
  167. package/dist/is-audio-structure.d.ts +2 -0
  168. package/dist/is-audio-structure.js +31 -0
  169. package/dist/metadata/get-metadata.js +16 -1
  170. package/dist/metadata/metadata-from-iso.d.ts +2 -1
  171. package/dist/metadata/metadata-from-iso.js +1 -1
  172. package/dist/metadata/metadata-from-matroska.js +1 -1
  173. package/dist/metadata/metadata-from-riff.d.ts +1 -1
  174. package/dist/options.d.ts +64 -38
  175. package/dist/parse-media.js +125 -43
  176. package/dist/parse-result.d.ts +8 -61
  177. package/dist/perform-seek.d.ts +13 -0
  178. package/dist/perform-seek.js +29 -0
  179. package/dist/readers/from-node.js +7 -8
  180. package/dist/readers/reader.d.ts +1 -1
  181. package/dist/register-track.d.ts +3 -3
  182. package/dist/run-parse-iteration.d.ts +8 -0
  183. package/dist/run-parse-iteration.js +48 -0
  184. package/dist/samples-from-moof.js +1 -1
  185. package/dist/state/aac-state.d.ts +13 -0
  186. package/dist/state/aac-state.js +17 -0
  187. package/dist/state/can-skip-tracks.d.ts +8 -1
  188. package/dist/state/can-skip-tracks.js +42 -27
  189. package/dist/state/emitted-fields.js +4 -0
  190. package/dist/state/flac-state.d.ts +4 -0
  191. package/dist/state/flac-state.js +13 -0
  192. package/dist/state/has-tracks-section.d.ts +2 -1
  193. package/dist/state/has-tracks-section.js +4 -1
  194. package/dist/state/iso-base-media/cached-sample-positions.d.ts +15 -0
  195. package/dist/state/iso-base-media/cached-sample-positions.js +42 -0
  196. package/dist/state/iso-base-media/iso-state.d.ts +8 -0
  197. package/dist/state/iso-base-media/iso-state.js +15 -0
  198. package/dist/{may-skip-video-data → state}/may-skip-video-data.d.ts +1 -1
  199. package/dist/{may-skip-video-data → state}/may-skip-video-data.js +6 -2
  200. package/dist/{may-skip-video-data → state}/need-samples-for-fields.js +4 -0
  201. package/dist/state/parser-state.d.ts +131 -17
  202. package/dist/state/parser-state.js +18 -5
  203. package/dist/state/sample-callbacks.d.ts +6 -2
  204. package/dist/state/sample-callbacks.js +5 -2
  205. package/dist/state/slow-duration-fps.d.ts +2 -0
  206. package/dist/state/slow-duration-fps.js +18 -0
  207. package/dist/state/transport-stream.d.ts +8 -0
  208. package/dist/state/transport-stream.js +11 -0
  209. package/dist/state/video-section.d.ts +16 -0
  210. package/dist/state/video-section.js +37 -0
  211. package/dist/state/webm.d.ts +17 -2
  212. package/dist/state/webm.js +33 -1
  213. package/dist/version.d.ts +1 -1
  214. package/dist/version.js +1 -1
  215. package/dist/webcodec-sample-types.d.ts +3 -3
  216. package/package.json +3 -3
  217. package/test.json +663 -0
  218. package/dist/boxes/iso-base-media/get-children.d.ts +0 -14
  219. package/dist/boxes/iso-base-media/get-children.js +0 -39
  220. package/dist/boxes/iso-base-media/mdat/mdat.d.ts +0 -26
  221. package/dist/boxes/iso-base-media/mdat/mdat.js +0 -141
  222. package/dist/boxes/iso-base-media/moov/moov.d.ts +0 -19
  223. package/dist/boxes/iso-base-media/moov/moov.js +0 -27
  224. package/dist/boxes/iso-base-media/parse-boxes.d.ts +0 -15
  225. package/dist/boxes/iso-base-media/parse-boxes.js +0 -129
  226. package/dist/boxes/iso-base-media/parse-mdat-partially.d.ts +0 -12
  227. package/dist/boxes/iso-base-media/parse-mdat-partially.js +0 -33
  228. package/dist/boxes/iso-base-media/process-box.d.ts +0 -15
  229. package/dist/boxes/iso-base-media/stsd/mebx.js +0 -32
  230. package/dist/boxes/iso-base-media/trak/trak.d.ts +0 -19
  231. package/dist/boxes/iso-base-media/trak/trak.js +0 -27
  232. package/dist/boxes/mp3/get-tracks-from-mp3.d.ts +0 -4
  233. package/dist/boxes/mp3/id3-v2.d.ts +0 -0
  234. package/dist/boxes/mp3/id3-v2.js +0 -1
  235. package/dist/boxes/mp3/id3.d.ts +0 -8
  236. package/dist/boxes/riff/continue-after-riff-result.d.ts +0 -13
  237. package/dist/boxes/riff/continue-after-riff-result.js +0 -34
  238. package/dist/boxes/riff/expect-riff-box.d.ts +0 -19
  239. package/dist/boxes/riff/expect-riff-box.js +0 -50
  240. package/dist/boxes/riff/parse-box.js +0 -35
  241. package/dist/boxes/riff/parse-fmt-box.d.ts +0 -7
  242. package/dist/boxes/riff/parse-fmt-box.js +0 -33
  243. package/dist/boxes/riff/parse-list-box.d.ts +0 -10
  244. package/dist/boxes/riff/parse-list-box.js +0 -31
  245. package/dist/boxes/riff/parse-movi.d.ts +0 -17
  246. package/dist/boxes/riff/parse-riff-body.d.ts +0 -11
  247. package/dist/boxes/riff/parse-riff-body.js +0 -105
  248. package/dist/boxes/riff/parse-riff-box.d.ts +0 -12
  249. package/dist/boxes/riff/parse-strf.d.ts +0 -7
  250. package/dist/boxes/transport-stream/get-tracks.d.ts +0 -5
  251. package/dist/boxes/transport-stream/parse-packet.d.ts +0 -13
  252. package/dist/boxes/transport-stream/parse-stream-packet.d.ts +0 -15
  253. package/dist/boxes/transport-stream/parse-transport-stream.d.ts +0 -13
  254. package/dist/boxes/webm/parse-webm-header.js +0 -37
  255. package/dist/boxes/webm/segments/parse-children.d.ts +0 -23
  256. package/dist/boxes/webm/segments/parse-children.js +0 -144
  257. package/dist/boxes/webm/segments.d.ts +0 -15
  258. package/dist/boxes/webm/segments.js +0 -161
  259. package/dist/continue-mdat-routine.d.ts +0 -17
  260. package/dist/continue-mdat-routine.js +0 -92
  261. package/dist/parse-video.d.ts +0 -28
  262. package/dist/parse-video.js +0 -130
  263. /package/dist/{boxes/iso-base-media/base-type.js → containers/aac/types.js} +0 -0
  264. /package/dist/{boxes → containers}/avc/codec-string.d.ts +0 -0
  265. /package/dist/{boxes → containers}/avc/codec-string.js +0 -0
  266. /package/dist/{boxes → containers}/avc/color.d.ts +0 -0
  267. /package/dist/{boxes → containers}/avc/color.js +0 -0
  268. /package/dist/{boxes → containers}/avc/create-sps-pps-data.d.ts +0 -0
  269. /package/dist/{boxes → containers}/avc/create-sps-pps-data.js +0 -0
  270. /package/dist/{boxes → containers}/avc/interpret-sps.d.ts +0 -0
  271. /package/dist/{boxes → containers}/avc/interpret-sps.js +0 -0
  272. /package/dist/{boxes → containers}/avc/key.js +0 -0
  273. /package/dist/{boxes → containers}/avc/parse-avc.d.ts +0 -0
  274. /package/dist/{boxes → containers}/avc/parse-avc.js +0 -0
  275. /package/dist/{boxes → containers}/avc/sps-and-pps.d.ts +0 -0
  276. /package/dist/{boxes → containers}/avc/sps-and-pps.js +0 -0
  277. /package/dist/{boxes/iso-base-media/void-box.js → containers/flac/types.js} +0 -0
  278. /package/dist/{boxes/riff/riff-box.js → containers/iso-base-media/base-media-box.js} +0 -0
  279. /package/dist/{boxes → containers}/iso-base-media/base-type.d.ts +0 -0
  280. /package/dist/{boxes/transport-stream/boxes.js → containers/iso-base-media/base-type.js} +0 -0
  281. /package/dist/{boxes → containers}/iso-base-media/esds/decoder-specific-config.d.ts +0 -0
  282. /package/dist/{boxes → containers}/iso-base-media/esds/decoder-specific-config.js +0 -0
  283. /package/dist/{boxes → containers}/iso-base-media/esds/esds-descriptors.d.ts +0 -0
  284. /package/dist/{boxes → containers}/iso-base-media/esds/esds-descriptors.js +0 -0
  285. /package/dist/{boxes → containers}/iso-base-media/esds/esds.d.ts +0 -0
  286. /package/dist/{boxes → containers}/iso-base-media/esds/esds.js +0 -0
  287. /package/dist/{boxes → containers}/iso-base-media/ftyp.d.ts +0 -0
  288. /package/dist/{boxes → containers}/iso-base-media/ftyp.js +0 -0
  289. /package/dist/{boxes → containers}/iso-base-media/get-actual-number-of-channels.d.ts +0 -0
  290. /package/dist/{boxes → containers}/iso-base-media/get-actual-number-of-channels.js +0 -0
  291. /package/dist/{boxes → containers}/iso-base-media/get-keyframes.d.ts +0 -0
  292. /package/dist/{boxes → containers}/iso-base-media/get-keyframes.js +0 -0
  293. /package/dist/{boxes → containers}/iso-base-media/get-sample-positions-from-track.js +0 -0
  294. /package/dist/{boxes → containers}/iso-base-media/get-video-codec-from-iso-track.d.ts +0 -0
  295. /package/dist/{boxes → containers}/iso-base-media/get-video-codec-from-iso-track.js +0 -0
  296. /package/dist/{boxes → containers}/iso-base-media/make-track.d.ts +0 -0
  297. /package/dist/{boxes → containers}/iso-base-media/make-track.js +0 -0
  298. /package/dist/{boxes → containers}/iso-base-media/mdhd.d.ts +0 -0
  299. /package/dist/{boxes → containers}/iso-base-media/mdhd.js +0 -0
  300. /package/dist/{boxes → containers}/iso-base-media/meta/hdlr.d.ts +0 -0
  301. /package/dist/{boxes → containers}/iso-base-media/meta/hdlr.js +0 -0
  302. /package/dist/{boxes → containers}/iso-base-media/meta/ilst.d.ts +0 -0
  303. /package/dist/{boxes → containers}/iso-base-media/meta/ilst.js +0 -0
  304. /package/dist/{boxes → containers}/iso-base-media/mvhd.d.ts +0 -0
  305. /package/dist/{boxes → containers}/iso-base-media/mvhd.js +0 -0
  306. /package/dist/{boxes → containers}/iso-base-media/parse-icc-profile.d.ts +0 -0
  307. /package/dist/{boxes → containers}/iso-base-media/parse-icc-profile.js +0 -0
  308. /package/dist/{boxes → containers}/iso-base-media/stsd/av1c.d.ts +0 -0
  309. /package/dist/{boxes → containers}/iso-base-media/stsd/av1c.js +0 -0
  310. /package/dist/{boxes → containers}/iso-base-media/stsd/avcc.d.ts +0 -0
  311. /package/dist/{boxes → containers}/iso-base-media/stsd/avcc.js +0 -0
  312. /package/dist/{boxes → containers}/iso-base-media/stsd/colr.d.ts +0 -0
  313. /package/dist/{boxes → containers}/iso-base-media/stsd/colr.js +0 -0
  314. /package/dist/{boxes → containers}/iso-base-media/stsd/ctts.d.ts +0 -0
  315. /package/dist/{boxes → containers}/iso-base-media/stsd/ctts.js +0 -0
  316. /package/dist/{boxes → containers}/iso-base-media/stsd/hvcc.d.ts +0 -0
  317. /package/dist/{boxes → containers}/iso-base-media/stsd/hvcc.js +0 -0
  318. /package/dist/{boxes → containers}/iso-base-media/stsd/keys.d.ts +0 -0
  319. /package/dist/{boxes → containers}/iso-base-media/stsd/keys.js +0 -0
  320. /package/dist/{boxes → containers}/iso-base-media/stsd/pasp.d.ts +0 -0
  321. /package/dist/{boxes → containers}/iso-base-media/stsd/pasp.js +0 -0
  322. /package/dist/{boxes → containers}/iso-base-media/stsd/stco.d.ts +0 -0
  323. /package/dist/{boxes → containers}/iso-base-media/stsd/stco.js +0 -0
  324. /package/dist/{boxes → containers}/iso-base-media/stsd/stsc.d.ts +0 -0
  325. /package/dist/{boxes → containers}/iso-base-media/stsd/stsc.js +0 -0
  326. /package/dist/{boxes → containers}/iso-base-media/stsd/stss.d.ts +0 -0
  327. /package/dist/{boxes → containers}/iso-base-media/stsd/stss.js +0 -0
  328. /package/dist/{boxes → containers}/iso-base-media/stsd/stsz.d.ts +0 -0
  329. /package/dist/{boxes → containers}/iso-base-media/stsd/stsz.js +0 -0
  330. /package/dist/{boxes → containers}/iso-base-media/stsd/stts.d.ts +0 -0
  331. /package/dist/{boxes → containers}/iso-base-media/stsd/stts.js +0 -0
  332. /package/dist/{boxes → containers}/iso-base-media/tfdt.d.ts +0 -0
  333. /package/dist/{boxes → containers}/iso-base-media/tfdt.js +0 -0
  334. /package/dist/{boxes → containers}/iso-base-media/tfhd.d.ts +0 -0
  335. /package/dist/{boxes → containers}/iso-base-media/tfhd.js +0 -0
  336. /package/dist/{boxes → containers}/iso-base-media/tkhd.d.ts +0 -0
  337. /package/dist/{boxes → containers}/iso-base-media/tkhd.js +0 -0
  338. /package/dist/{boxes → containers}/iso-base-media/to-date.d.ts +0 -0
  339. /package/dist/{boxes → containers}/iso-base-media/to-date.js +0 -0
  340. /package/dist/{boxes → containers}/iso-base-media/trun.d.ts +0 -0
  341. /package/dist/{boxes → containers}/iso-base-media/trun.js +0 -0
  342. /package/dist/{boxes → containers}/iso-base-media/void-box.d.ts +0 -0
  343. /package/dist/{boxes → containers}/mp3/get-duration.d.ts +0 -0
  344. /package/dist/{boxes → containers}/mp3/get-duration.js +0 -0
  345. /package/dist/{boxes → containers}/mp3/get-frame-length.d.ts +0 -0
  346. /package/dist/{boxes → containers}/mp3/get-frame-length.js +0 -0
  347. /package/dist/{boxes → containers}/mp3/get-metadata-from-mp3.d.ts +0 -0
  348. /package/dist/{boxes → containers}/mp3/get-metadata-from-mp3.js +0 -0
  349. /package/dist/{boxes → containers}/mp3/id3-v1.d.ts +0 -0
  350. /package/dist/{boxes → containers}/mp3/id3-v1.js +0 -0
  351. /package/dist/{boxes → containers}/mp3/samples-per-mpeg-file.d.ts +0 -0
  352. /package/dist/{boxes → containers}/mp3/samples-per-mpeg-file.js +0 -0
  353. /package/dist/{boxes → containers}/riff/is-movi.d.ts +0 -0
  354. /package/dist/{boxes → containers}/riff/is-movi.js +0 -0
  355. /package/dist/{boxes → containers}/riff/parse-avih.d.ts +0 -0
  356. /package/dist/{boxes → containers}/riff/parse-avih.js +0 -0
  357. /package/dist/{boxes → containers}/riff/parse-isft.d.ts +0 -0
  358. /package/dist/{boxes → containers}/riff/parse-isft.js +0 -0
  359. /package/dist/{boxes → containers}/riff/parse-strh.d.ts +0 -0
  360. /package/dist/{boxes → containers}/riff/timescale.d.ts +0 -0
  361. /package/dist/{boxes → containers}/riff/timescale.js +0 -0
  362. /package/dist/{boxes → containers}/transport-stream/adts-header.d.ts +0 -0
  363. /package/dist/{boxes → containers}/transport-stream/adts-header.js +0 -0
  364. /package/dist/{boxes → containers}/transport-stream/boxes.d.ts +0 -0
  365. /package/dist/{boxes → containers}/transport-stream/discard-rest-of-packet.d.ts +0 -0
  366. /package/dist/{boxes → containers}/transport-stream/discard-rest-of-packet.js +0 -0
  367. /package/dist/{boxes → containers}/transport-stream/find-separator.d.ts +0 -0
  368. /package/dist/{boxes → containers}/transport-stream/find-separator.js +0 -0
  369. /package/dist/{boxes → containers}/transport-stream/handle-aac-packet.d.ts +0 -0
  370. /package/dist/{boxes → containers}/transport-stream/handle-aac-packet.js +0 -0
  371. /package/dist/{boxes → containers}/transport-stream/handle-avc-packet.d.ts +0 -0
  372. /package/dist/{boxes → containers}/transport-stream/handle-avc-packet.js +0 -0
  373. /package/dist/{boxes → containers}/transport-stream/next-pes-header-store.d.ts +0 -0
  374. /package/dist/{boxes → containers}/transport-stream/next-pes-header-store.js +0 -0
  375. /package/dist/{boxes → containers}/transport-stream/parse-pat.d.ts +0 -0
  376. /package/dist/{boxes → containers}/transport-stream/parse-pat.js +0 -0
  377. /package/dist/{boxes → containers}/transport-stream/parse-pes.d.ts +0 -0
  378. /package/dist/{boxes → containers}/transport-stream/parse-pes.js +0 -0
  379. /package/dist/{boxes → containers}/transport-stream/parse-pmt.d.ts +0 -0
  380. /package/dist/{boxes → containers}/transport-stream/parse-pmt.js +0 -0
  381. /package/dist/{boxes → containers}/transport-stream/traversal.d.ts +0 -0
  382. /package/dist/{boxes → containers}/transport-stream/traversal.js +0 -0
  383. /package/dist/{boxes → containers}/webm/allowed-partial-segments.d.ts +0 -0
  384. /package/dist/{boxes → containers}/webm/allowed-partial-segments.js +0 -0
  385. /package/dist/{boxes → containers}/webm/av1-codec-private.d.ts +0 -0
  386. /package/dist/{boxes → containers}/webm/av1-codec-private.js +0 -0
  387. /package/dist/{boxes → containers}/webm/color.d.ts +0 -0
  388. /package/dist/{boxes → containers}/webm/color.js +0 -0
  389. /package/dist/{boxes → containers}/webm/description.d.ts +0 -0
  390. /package/dist/{boxes → containers}/webm/description.js +0 -0
  391. /package/dist/{boxes → containers}/webm/get-ready-tracks.d.ts +0 -0
  392. /package/dist/{boxes → containers}/webm/get-ready-tracks.js +0 -0
  393. /package/dist/{boxes → containers}/webm/get-sample-from-block.d.ts +0 -0
  394. /package/dist/{boxes → containers}/webm/get-sample-from-block.js +0 -0
  395. /package/dist/{boxes → containers}/webm/make-track.d.ts +0 -0
  396. /package/dist/{boxes → containers}/webm/make-track.js +0 -0
  397. /package/dist/{boxes → containers}/webm/segments/all-segments.d.ts +0 -0
  398. /package/dist/{boxes → containers}/webm/segments/all-segments.js +0 -0
  399. /package/dist/{boxes → containers}/webm/segments/block-simple-block-flags.d.ts +0 -0
  400. /package/dist/{boxes → containers}/webm/segments/block-simple-block-flags.js +0 -0
  401. /package/dist/{boxes → containers}/webm/segments/track-entry.d.ts +0 -0
  402. /package/dist/{boxes → containers}/webm/segments/track-entry.js +0 -0
  403. /package/dist/{boxes → containers}/webm/traversal.d.ts +0 -0
  404. /package/dist/{boxes → containers}/webm/traversal.js +0 -0
  405. /package/dist/{may-skip-video-data → state}/need-samples-for-fields.d.ts +0 -0
@@ -0,0 +1,114 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.initVideo = void 0;
4
+ const errors_1 = require("./errors");
5
+ const log_1 = require("./log");
6
+ const initVideo = ({ state, mimeType, name, contentLength, }) => {
7
+ const fileType = state.iterator.detectFileType();
8
+ if (fileType.type === 'riff') {
9
+ log_1.Log.verbose(state.logLevel, 'Detected RIFF container');
10
+ state.structure.setStructure({
11
+ type: 'riff',
12
+ boxes: [],
13
+ });
14
+ return;
15
+ }
16
+ if (fileType.type === 'iso-base-media') {
17
+ log_1.Log.verbose(state.logLevel, 'Detected ISO Base Media container');
18
+ state.structure.setStructure({
19
+ type: 'iso-base-media',
20
+ boxes: [],
21
+ });
22
+ return;
23
+ }
24
+ if (fileType.type === 'webm') {
25
+ log_1.Log.verbose(state.logLevel, 'Detected Matroska container');
26
+ state.structure.setStructure({
27
+ boxes: [],
28
+ type: 'matroska',
29
+ });
30
+ return;
31
+ }
32
+ if (fileType.type === 'transport-stream') {
33
+ log_1.Log.verbose(state.logLevel, 'Detected MPEG-2 Transport Stream');
34
+ state.structure.setStructure({
35
+ boxes: [],
36
+ type: 'transport-stream',
37
+ });
38
+ return;
39
+ }
40
+ if (fileType.type === 'mp3') {
41
+ log_1.Log.verbose(state.logLevel, 'Detected MP3');
42
+ const structure = {
43
+ boxes: [],
44
+ type: 'mp3',
45
+ };
46
+ state.structure.setStructure(structure);
47
+ return;
48
+ }
49
+ if (fileType.type === 'wav') {
50
+ log_1.Log.verbose(state.logLevel, 'Detected WAV');
51
+ const structure = {
52
+ boxes: [],
53
+ type: 'wav',
54
+ };
55
+ state.structure.setStructure(structure);
56
+ return;
57
+ }
58
+ if (fileType.type === 'flac') {
59
+ log_1.Log.verbose(state.logLevel, 'Detected FLAC');
60
+ const structure = {
61
+ boxes: [],
62
+ type: 'flac',
63
+ };
64
+ state.structure.setStructure(structure);
65
+ return;
66
+ }
67
+ if (fileType.type === 'aac') {
68
+ log_1.Log.verbose(state.logLevel, 'Detected AAC');
69
+ state.structure.setStructure({
70
+ type: 'aac',
71
+ boxes: [],
72
+ });
73
+ return;
74
+ }
75
+ if (fileType.type === 'gif') {
76
+ return Promise.reject(new errors_1.IsAGifError({
77
+ message: 'GIF files are not yet supported',
78
+ mimeType,
79
+ sizeInBytes: contentLength,
80
+ fileName: name,
81
+ }));
82
+ }
83
+ if (fileType.type === 'pdf') {
84
+ return Promise.reject(new errors_1.IsAPdfError({
85
+ message: 'GIF files are not supported',
86
+ mimeType,
87
+ sizeInBytes: contentLength,
88
+ fileName: name,
89
+ }));
90
+ }
91
+ if (fileType.type === 'bmp' ||
92
+ fileType.type === 'jpeg' ||
93
+ fileType.type === 'png' ||
94
+ fileType.type === 'webp') {
95
+ return Promise.reject(new errors_1.IsAnImageError({
96
+ message: 'Image files are not supported',
97
+ imageType: fileType.type,
98
+ dimensions: fileType.dimensions,
99
+ mimeType,
100
+ sizeInBytes: contentLength,
101
+ fileName: name,
102
+ }));
103
+ }
104
+ if (fileType.type === 'unknown') {
105
+ return Promise.reject(new errors_1.IsAnUnsupportedFileTypeError({
106
+ message: 'Unknown file format',
107
+ mimeType,
108
+ sizeInBytes: contentLength,
109
+ fileName: name,
110
+ }));
111
+ }
112
+ return Promise.reject(new Error('Unknown video format ' + fileType));
113
+ };
114
+ exports.initVideo = initVideo;
@@ -0,0 +1,2 @@
1
+ import type { Structure } from './parse-result';
2
+ export declare const isAudioStructure: (structure: Structure) => boolean;
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isAudioStructure = void 0;
4
+ const isAudioStructure = (structure) => {
5
+ if (structure.type === 'mp3') {
6
+ return true;
7
+ }
8
+ if (structure.type === 'wav') {
9
+ return true;
10
+ }
11
+ if (structure.type === 'aac') {
12
+ return true;
13
+ }
14
+ if (structure.type === 'flac') {
15
+ return true;
16
+ }
17
+ if (structure.type === 'iso-base-media') {
18
+ return false;
19
+ }
20
+ if (structure.type === 'matroska') {
21
+ return false;
22
+ }
23
+ if (structure.type === 'transport-stream') {
24
+ return false;
25
+ }
26
+ if (structure.type === 'riff') {
27
+ return false;
28
+ }
29
+ throw new Error(`Unhandled structure type: ${structure}`);
30
+ };
31
+ exports.isAudioStructure = isAudioStructure;
@@ -1,11 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.hasMetadata = exports.getMetadata = void 0;
4
- const get_metadata_from_mp3_1 = require("../boxes/mp3/get-metadata-from-mp3");
4
+ const get_metadata_from_flac_1 = require("../containers/flac/get-metadata-from-flac");
5
+ const get_metadata_from_mp3_1 = require("../containers/mp3/get-metadata-from-mp3");
6
+ const get_metadata_from_wav_1 = require("../containers/wav/get-metadata-from-wav");
5
7
  const metadata_from_iso_1 = require("./metadata-from-iso");
6
8
  const metadata_from_matroska_1 = require("./metadata-from-matroska");
7
9
  const metadata_from_riff_1 = require("./metadata-from-riff");
8
10
  const getMetadata = (structure) => {
11
+ var _a, _b;
9
12
  if (structure.type === 'matroska') {
10
13
  return (0, metadata_from_matroska_1.getMetadataFromMatroska)(structure);
11
14
  }
@@ -22,6 +25,15 @@ const getMetadata = (structure) => {
22
25
  }
23
26
  return tags;
24
27
  }
28
+ if (structure.type === 'wav') {
29
+ return (_a = (0, get_metadata_from_wav_1.getMetadataFromWav)(structure)) !== null && _a !== void 0 ? _a : [];
30
+ }
31
+ if (structure.type === 'aac') {
32
+ return [];
33
+ }
34
+ if (structure.type === 'flac') {
35
+ return (_b = (0, get_metadata_from_flac_1.getMetadataFromFlac)(structure)) !== null && _b !== void 0 ? _b : [];
36
+ }
25
37
  return (0, metadata_from_iso_1.getMetadataFromIsoBase)(structure);
26
38
  };
27
39
  exports.getMetadata = getMetadata;
@@ -29,6 +41,9 @@ const hasMetadata = (structure) => {
29
41
  if (structure.type === 'mp3') {
30
42
  return (0, get_metadata_from_mp3_1.getMetadataFromMp3)(structure) !== null;
31
43
  }
44
+ if (structure.type === 'wav') {
45
+ return (0, get_metadata_from_wav_1.getMetadataFromWav)(structure) !== null;
46
+ }
32
47
  return false;
33
48
  };
34
49
  exports.hasMetadata = hasMetadata;
@@ -1,4 +1,5 @@
1
- import type { IsoBaseMediaStructure, RegularBox } from '../parse-result';
1
+ import type { RegularBox } from '../containers/iso-base-media/base-media-box';
2
+ import type { IsoBaseMediaStructure } from '../parse-result';
2
3
  import type { MetadataEntry } from './get-metadata';
3
4
  export declare const parseIsoMetaBox: (meta: RegularBox, trackId: number | null) => MetadataEntry[];
4
5
  export declare const getMetadataFromIsoBase: (isoBase: IsoBaseMediaStructure) => MetadataEntry[];
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getMetadataFromIsoBase = exports.parseIsoMetaBox = void 0;
4
- const traversal_1 = require("../boxes/iso-base-media/traversal");
4
+ const traversal_1 = require("../containers/iso-base-media/traversal");
5
5
  const truthy_1 = require("../truthy");
6
6
  /**
7
7
  *
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getMetadataFromMatroska = void 0;
4
- const traversal_1 = require("../boxes/webm/traversal");
4
+ const traversal_1 = require("../containers/webm/traversal");
5
5
  const removeEndZeroes = (value) => {
6
6
  return value.endsWith('\u0000') ? removeEndZeroes(value.slice(0, -1)) : value;
7
7
  };
@@ -1,3 +1,3 @@
1
- import type { RiffStructure } from '../parse-result';
1
+ import type { RiffStructure } from '../containers/riff/riff-box';
2
2
  import type { MetadataEntry } from './get-metadata';
3
3
  export declare const getMetadataFromRiff: (structure: RiffStructure) => MetadataEntry[];
package/dist/options.d.ts CHANGED
@@ -32,7 +32,11 @@ export type ParseMediaFields = {
32
32
  keyframes: boolean;
33
33
  slowKeyframes: boolean;
34
34
  slowNumberOfFrames: boolean;
35
+ slowVideoBitrate: boolean;
36
+ slowAudioBitrate: boolean;
35
37
  images: boolean;
38
+ sampleRate: boolean;
39
+ numberOfAudioChannels: boolean;
36
40
  };
37
41
  export type AllParseMediaFields = {
38
42
  dimensions: true;
@@ -58,6 +62,10 @@ export type AllParseMediaFields = {
58
62
  keyframes: true;
59
63
  slowKeyframes: true;
60
64
  images: true;
65
+ sampleRate: true;
66
+ numberOfAudioChannels: true;
67
+ slowVideoBitrate: true;
68
+ slowAudioBitrate: true;
61
69
  };
62
70
  export type AllOptions<Fields extends ParseMediaFields> = {
63
71
  dimensions: Fields['dimensions'];
@@ -83,13 +91,17 @@ export type AllOptions<Fields extends ParseMediaFields> = {
83
91
  slowKeyframes: Fields['slowKeyframes'];
84
92
  slowNumberOfFrames: Fields['slowNumberOfFrames'];
85
93
  images: Fields['images'];
94
+ sampleRate: Fields['sampleRate'];
95
+ numberOfAudioChannels: Fields['numberOfAudioChannels'];
96
+ slowVideoBitrate: Fields['slowVideoBitrate'];
97
+ slowAudioBitrate: Fields['slowAudioBitrate'];
86
98
  };
87
99
  export type Options<Fields extends ParseMediaFields> = Partial<AllOptions<Fields>>;
88
100
  export type TracksField = {
89
101
  videoTracks: VideoTrack[];
90
102
  audioTracks: AudioTrack[];
91
103
  };
92
- export type ParseMediaContainer = 'mp4' | 'webm' | 'avi' | 'transport-stream' | 'mp3';
104
+ export type MediaParserContainer = 'mp4' | 'webm' | 'avi' | 'transport-stream' | 'mp3' | 'aac' | 'flac' | 'wav';
93
105
  export type MediaParserKeyframe = {
94
106
  positionInBytes: number;
95
107
  sizeInBytes: number;
@@ -97,31 +109,36 @@ export type MediaParserKeyframe = {
97
109
  decodingTimeInSeconds: number;
98
110
  trackId: number;
99
111
  };
100
- export interface ParseMediaCallbacks {
101
- onDimensions?: (dimensions: Dimensions | null) => void;
102
- onDurationInSeconds?: (durationInSeconds: number | null) => void;
103
- onSlowDurationInSeconds?: (durationInSeconds: number) => void;
104
- onSlowFps?: (fps: number) => void;
105
- onStructure?: (structure: Structure) => void;
106
- onFps?: (fps: number | null) => void;
107
- onVideoCodec?: (codec: MediaParserVideoCodec | null) => void;
108
- onAudioCodec?: (codec: MediaParserAudioCodec | null) => void;
109
- onTracks?: (tracks: TracksField) => void;
110
- onRotation?: (rotation: number | null) => void;
111
- onUnrotatedDimensions?: (dimensions: Dimensions | null) => void;
112
- onInternalStats?: (internalStats: InternalStats) => void;
113
- onSize?: (size: number | null) => void;
114
- onName?: (name: string) => void;
115
- onContainer?: (container: ParseMediaContainer) => void;
116
- onIsHdr?: (isHdr: boolean) => void;
117
- onMetadata?: (metadata: MetadataEntry[]) => void;
118
- onLocation?: (location: MediaParserLocation | null) => void;
119
- onMimeType?: (mimeType: string | null) => void;
120
- onKeyframes?: (keyframes: MediaParserKeyframe[] | null) => void;
121
- onSlowKeyframes?: (keyframes: MediaParserKeyframe[]) => void;
122
- onSlowNumberOfFrames?: (samples: number) => void;
123
- onImages?: (images: MediaParserEmbeddedImage[]) => void;
124
- }
112
+ export type MandatoryParseMediaCallbacks = {
113
+ onDimensions: null | ((dimensions: Dimensions | null) => void);
114
+ onDurationInSeconds: null | ((durationInSeconds: number | null) => void);
115
+ onSlowDurationInSeconds: null | ((durationInSeconds: number) => void);
116
+ onSlowFps: null | ((fps: number) => void);
117
+ onStructure: null | ((structure: Structure) => void);
118
+ onFps: null | ((fps: number | null) => void);
119
+ onVideoCodec: null | ((codec: MediaParserVideoCodec | null) => void);
120
+ onAudioCodec: null | ((codec: MediaParserAudioCodec | null) => void);
121
+ onTracks: null | ((tracks: TracksField) => void);
122
+ onRotation: null | ((rotation: number | null) => void);
123
+ onUnrotatedDimensions: null | ((dimensions: Dimensions | null) => void);
124
+ onInternalStats: null | ((internalStats: InternalStats) => void);
125
+ onSize: null | ((size: number | null) => void);
126
+ onName: null | ((name: string) => void);
127
+ onContainer: null | ((container: MediaParserContainer) => void);
128
+ onIsHdr: null | ((isHdr: boolean) => void);
129
+ onMetadata: null | ((metadata: MetadataEntry[]) => void);
130
+ onLocation: null | ((location: MediaParserLocation | null) => void);
131
+ onMimeType: null | ((mimeType: string | null) => void);
132
+ onKeyframes: null | ((keyframes: MediaParserKeyframe[] | null) => void);
133
+ onSlowKeyframes: null | ((keyframes: MediaParserKeyframe[]) => void);
134
+ onSlowNumberOfFrames: null | ((samples: number) => void);
135
+ onImages: null | ((images: MediaParserEmbeddedImage[]) => void);
136
+ onSampleRate: null | ((sampleRate: number | null) => void);
137
+ onNumberOfAudioChannels: null | ((numberOfChannels: number | null) => void);
138
+ onSlowVideoBitrate: null | ((videoBitrate: number | null) => void);
139
+ onSlowAudioBitrate: null | ((audioBitrate: number | null) => void);
140
+ };
141
+ export type ParseMediaCallbacks = Partial<MandatoryParseMediaCallbacks>;
125
142
  export interface ParseMediaData {
126
143
  dimensions: Dimensions | null;
127
144
  durationInSeconds: number | null;
@@ -140,33 +157,42 @@ export interface ParseMediaData {
140
157
  name: string;
141
158
  metadata: MetadataEntry[];
142
159
  location: MediaParserLocation | null;
143
- container: ParseMediaContainer;
160
+ container: MediaParserContainer;
144
161
  mimeType: string | null;
145
162
  keyframes: MediaParserKeyframe[] | null;
146
163
  slowKeyframes: MediaParserKeyframe[];
147
164
  slowNumberOfFrames: number;
148
165
  images: MediaParserEmbeddedImage[];
166
+ sampleRate: number | null;
167
+ numberOfAudioChannels: number | null;
168
+ slowVideoBitrate: number | null;
169
+ slowAudioBitrate: number | null;
149
170
  }
150
171
  export type ParseMediaResult<T extends Partial<ParseMediaFields>> = {
151
172
  [K in keyof T]: T[K] extends true ? K extends keyof ParseMediaData ? ParseMediaData[K] : never : never;
152
173
  };
153
- export type ParseMediaDynamicOptions<F extends Options<ParseMediaFields>> = {
154
- fields?: F;
155
- } & ParseMediaCallbacks;
156
174
  export type ParseMediaProgress = {
157
175
  bytes: number;
158
176
  percentage: number | null;
159
177
  totalBytes: number | null;
160
178
  };
161
179
  export type ParseMediaOnProgress = (progress: ParseMediaProgress) => void | Promise<void>;
180
+ type OptionalParseMediaParams<F extends Options<ParseMediaFields>> = {
181
+ reader: ReaderInterface;
182
+ onAudioTrack: OnAudioTrack | null;
183
+ onVideoTrack: OnVideoTrack | null;
184
+ signal: AbortSignal | undefined;
185
+ logLevel: LogLevel;
186
+ onParseProgress: ParseMediaOnProgress | null;
187
+ progressIntervalInMs: number | null;
188
+ fields: F | null;
189
+ } & MandatoryParseMediaCallbacks;
190
+ export type InternalParseMediaOptions<F extends Options<ParseMediaFields>> = {
191
+ src: string | Blob;
192
+ } & OptionalParseMediaParams<F>;
162
193
  export type ParseMediaOptions<F extends Options<ParseMediaFields>> = {
163
194
  src: string | Blob;
164
- reader?: ReaderInterface;
165
- onAudioTrack?: OnAudioTrack;
166
- onVideoTrack?: OnVideoTrack;
167
- signal?: AbortSignal;
168
- logLevel?: LogLevel;
169
- onParseProgress?: ParseMediaOnProgress;
170
- progressIntervalInMs?: number;
171
- } & ParseMediaDynamicOptions<F>;
195
+ } & Partial<OptionalParseMediaParams<F>>;
196
+ export type InternalParseMedia = <F extends Options<ParseMediaFields>>(options: InternalParseMediaOptions<F>) => Promise<ParseMediaResult<F>>;
172
197
  export type ParseMedia = <F extends Options<ParseMediaFields>>(options: ParseMediaOptions<F>) => Promise<ParseMediaResult<F>>;
198
+ export {};
@@ -6,11 +6,12 @@ const emit_available_info_1 = require("./emit-available-info");
6
6
  const get_fields_from_callbacks_1 = require("./get-fields-from-callbacks");
7
7
  const has_all_info_1 = require("./has-all-info");
8
8
  const log_1 = require("./log");
9
- const parse_video_1 = require("./parse-video");
9
+ const perform_seek_1 = require("./perform-seek");
10
10
  const from_fetch_1 = require("./readers/from-fetch");
11
+ const run_parse_iteration_1 = require("./run-parse-iteration");
11
12
  const parser_state_1 = require("./state/parser-state");
12
13
  const throttled_progress_1 = require("./throttled-progress");
13
- const parseMedia = async function ({ src, fields: _fieldsInReturnValue, reader: readerInterface = from_fetch_1.fetchReader, onAudioTrack, onVideoTrack, signal, logLevel = 'info', onParseProgress: onParseProgressDoNotCallDirectly, progressIntervalInMs, ...more }) {
14
+ const internalParseMedia = async function ({ src, fields: _fieldsInReturnValue, reader, onAudioTrack, onVideoTrack, signal, logLevel, onParseProgress: onParseProgressDoNotCallDirectly, progressIntervalInMs, ...more }) {
14
15
  var _a;
15
16
  let parseResult = null;
16
17
  const fieldsInReturnValue = _fieldsInReturnValue !== null && _fieldsInReturnValue !== void 0 ? _fieldsInReturnValue : {};
@@ -18,24 +19,40 @@ const parseMedia = async function ({ src, fields: _fieldsInReturnValue, reader:
18
19
  fields: fieldsInReturnValue,
19
20
  callbacks: more,
20
21
  });
21
- const { reader, contentLength, name, contentType, supportsContentRange: readerSupportsContentRange, } = await readerInterface.read(src, null, signal);
22
+ const { reader: readerInstance, contentLength, name, contentType, supportsContentRange: readerSupportsContentRange, } = await reader.read(src, null, signal);
22
23
  const iterator = (0, buffer_iterator_1.getArrayBufferIterator)(new Uint8Array([]), contentLength !== null && contentLength !== void 0 ? contentLength : 1000000000);
24
+ if (contentLength === null) {
25
+ throw new Error('Media was passed with no content length. This is currently not supported. Ensure the media has a "Content-Length" HTTP header.');
26
+ }
23
27
  const supportsContentRange = readerSupportsContentRange &&
24
28
  !(typeof process !== 'undefined' &&
25
29
  typeof process.env !== 'undefined' &&
26
30
  process.env.DISABLE_CONTENT_RANGE === 'true');
31
+ const hasAudioTrackHandlers = Boolean(onAudioTrack);
32
+ const hasVideoTrackHandlers = Boolean(onVideoTrack);
33
+ if (!hasAudioTrackHandlers &&
34
+ !hasVideoTrackHandlers &&
35
+ Object.values(fields).every((v) => !v)) {
36
+ log_1.Log.warn(logLevel, new Error('Warning - No `fields` and no `on*` callbacks were passed to `parseMedia()`. Specify the data you would like to retrieve.'));
37
+ }
38
+ let timeIterating = 0;
39
+ let timeReadingData = 0;
40
+ let timeSeeking = 0;
41
+ let timeCheckingIfDone = 0;
42
+ let timeFreeingData = 0;
27
43
  const state = (0, parser_state_1.makeParserState)({
28
- hasAudioTrackHandlers: Boolean(onAudioTrack),
29
- hasVideoTrackHandlers: Boolean(onVideoTrack),
44
+ hasAudioTrackHandlers,
45
+ hasVideoTrackHandlers,
30
46
  signal,
31
- getIterator: () => iterator,
47
+ iterator,
32
48
  fields,
33
49
  onAudioTrack: onAudioTrack !== null && onAudioTrack !== void 0 ? onAudioTrack : null,
34
50
  onVideoTrack: onVideoTrack !== null && onVideoTrack !== void 0 ? onVideoTrack : null,
35
51
  supportsContentRange,
36
52
  contentLength,
53
+ logLevel,
37
54
  });
38
- let currentReader = reader;
55
+ let currentReader = readerInstance;
39
56
  const returnValue = {};
40
57
  const moreFields = more;
41
58
  const throttledState = (0, throttled_progress_1.throttledStateUpdate)({
@@ -53,7 +70,6 @@ const parseMedia = async function ({ src, fields: _fieldsInReturnValue, reader:
53
70
  hasInfo: availableInfo,
54
71
  callbacks: moreFields,
55
72
  fieldsInReturnValue,
56
- parseResult,
57
73
  state,
58
74
  returnValue,
59
75
  contentLength,
@@ -62,22 +78,28 @@ const parseMedia = async function ({ src, fields: _fieldsInReturnValue, reader:
62
78
  });
63
79
  };
64
80
  const checkIfDone = () => {
65
- if ((0, has_all_info_1.hasAllInfo)({
81
+ const startCheck = Date.now();
82
+ const hasAll = (0, has_all_info_1.hasAllInfo)({
66
83
  fields,
67
84
  state,
68
- })) {
85
+ });
86
+ timeCheckingIfDone += Date.now() - startCheck;
87
+ if (hasAll) {
69
88
  log_1.Log.verbose(logLevel, 'Got all info, skipping to the end.');
70
89
  if (contentLength !== null) {
71
90
  state.increaseSkippedBytes(contentLength - iterator.counter.getOffset());
72
91
  }
73
92
  return true;
74
93
  }
94
+ if (iterator.counter.getOffset() === contentLength) {
95
+ log_1.Log.verbose(logLevel, 'Reached end of file');
96
+ return true;
97
+ }
75
98
  return false;
76
99
  };
77
100
  triggerInfoEmit();
78
- let didProgress = false;
79
- while (!checkIfDone() &&
80
- (parseResult === null || parseResult.status === 'incomplete')) {
101
+ let iterationWithThisOffset = 0;
102
+ while (!checkIfDone()) {
81
103
  if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
82
104
  throw new Error('Aborted');
83
105
  }
@@ -87,14 +109,20 @@ const parseMedia = async function ({ src, fields: _fieldsInReturnValue, reader:
87
109
  if (result.value) {
88
110
  iterator.addData(result.value);
89
111
  }
112
+ return result.done;
90
113
  };
114
+ const readStart = Date.now();
91
115
  while (iterator.bytesRemaining() < 0) {
92
- await fetchMoreData();
116
+ const done = await fetchMoreData();
117
+ if (done) {
118
+ break;
119
+ }
93
120
  }
94
121
  const hasBigBuffer = iterator.bytesRemaining() > 100000;
95
- if (!didProgress || !hasBigBuffer) {
122
+ if (iterationWithThisOffset > 0 || !hasBigBuffer) {
96
123
  await fetchMoreData();
97
124
  }
125
+ timeReadingData += Date.now() - readStart;
98
126
  (_a = throttledState.update) === null || _a === void 0 ? void 0 : _a.call(throttledState, () => ({
99
127
  bytes: iterator.counter.getOffset(),
100
128
  percentage: contentLength
@@ -103,40 +131,49 @@ const parseMedia = async function ({ src, fields: _fieldsInReturnValue, reader:
103
131
  totalBytes: contentLength,
104
132
  }));
105
133
  triggerInfoEmit();
106
- if (parseResult && parseResult.status === 'incomplete') {
107
- log_1.Log.trace(logLevel, 'Continuing parsing of file, currently at position', iterator.counter.getOffset());
108
- parseResult = await parseResult.continueParsing();
109
- }
110
- else {
111
- parseResult = await (0, parse_video_1.parseVideo)({
112
- iterator,
113
- state,
114
- signal: signal !== null && signal !== void 0 ? signal : null,
115
- logLevel,
116
- fields,
117
- mimeType: contentType,
118
- contentLength,
119
- name,
120
- });
134
+ if (iterationWithThisOffset > 300) {
135
+ throw new Error('Infinite loop detected. The parser is not progressing. This is likely a bug in the parser.');
121
136
  }
122
- if (parseResult.status === 'incomplete' && parseResult.skipTo !== null) {
137
+ log_1.Log.trace(logLevel, `Continuing parsing of file, currently at position ${iterator.counter.getOffset()}/${contentLength} (0x${iterator.counter.getOffset().toString(16)})`);
138
+ const start = Date.now();
139
+ parseResult = await (0, run_parse_iteration_1.runParseIteration)({
140
+ state,
141
+ mimeType: contentType,
142
+ contentLength,
143
+ name,
144
+ });
145
+ timeIterating += Date.now() - start;
146
+ if (parseResult.skipTo !== null) {
123
147
  state.increaseSkippedBytes(parseResult.skipTo - iterator.counter.getOffset());
124
148
  }
125
- if (parseResult.status === 'incomplete' && parseResult.skipTo !== null) {
126
- if (!supportsContentRange) {
127
- throw new Error('Content-Range header is not supported by the reader, but was asked to seek');
128
- }
149
+ if (parseResult.skipTo !== null) {
129
150
  if (parseResult.skipTo === contentLength) {
130
151
  log_1.Log.verbose(logLevel, 'Skipped to end of file, not fetching.');
131
152
  break;
132
153
  }
133
- log_1.Log.verbose(logLevel, `Skipping over video data from position ${iterator.counter.getOffset()} -> ${parseResult.skipTo}`);
134
- currentReader.abort();
135
- const { reader: newReader } = await readerInterface.read(src, parseResult.skipTo, signal);
136
- currentReader = newReader;
137
- iterator.skipTo(parseResult.skipTo, true);
154
+ const seekStart = Date.now();
155
+ currentReader = await (0, perform_seek_1.performSeek)({
156
+ iterator,
157
+ seekTo: parseResult.skipTo,
158
+ supportsContentRange,
159
+ currentReader,
160
+ logLevel,
161
+ readerInterface: reader,
162
+ signal,
163
+ src,
164
+ });
165
+ timeSeeking += Date.now() - seekStart;
166
+ }
167
+ const didProgress = iterator.counter.getOffset() > offsetBefore;
168
+ if (!didProgress) {
169
+ iterationWithThisOffset++;
138
170
  }
139
- didProgress = iterator.counter.getOffset() > offsetBefore;
171
+ const timeFreeStart = Date.now();
172
+ const bytesRemoved = iterator.removeBytesRead(false);
173
+ if (bytesRemoved) {
174
+ log_1.Log.verbose(logLevel, `Freed ${bytesRemoved} bytes`);
175
+ }
176
+ timeFreeingData += Date.now() - timeFreeStart;
140
177
  }
141
178
  log_1.Log.verbose(logLevel, 'Finished parsing file');
142
179
  // Force assign
@@ -149,16 +186,61 @@ const parseMedia = async function ({ src, fields: _fieldsInReturnValue, reader:
149
186
  }, {}),
150
187
  callbacks: moreFields,
151
188
  fieldsInReturnValue,
152
- parseResult,
153
189
  state,
154
190
  returnValue,
155
191
  contentLength,
156
192
  mimeType: contentType,
157
193
  name,
158
194
  });
195
+ log_1.Log.verbose(logLevel, `Time iterating over file: ${timeIterating}ms`);
196
+ log_1.Log.verbose(logLevel, `Time fetching data: ${timeReadingData}ms`);
197
+ log_1.Log.verbose(logLevel, `Time seeking: ${timeSeeking}ms`);
198
+ log_1.Log.verbose(logLevel, `Time checking if done: ${timeCheckingIfDone}ms`);
199
+ log_1.Log.verbose(logLevel, `Time freeing data: ${timeFreeingData}ms`);
159
200
  currentReader.abort();
160
201
  iterator === null || iterator === void 0 ? void 0 : iterator.destroy();
161
- state.callbacks.tracks.ensureHasTracksAtEnd();
202
+ state.callbacks.tracks.ensureHasTracksAtEnd(fields);
162
203
  return returnValue;
163
204
  };
205
+ const parseMedia = (options) => {
206
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10;
207
+ return internalParseMedia({
208
+ fields: (_a = options.fields) !== null && _a !== void 0 ? _a : null,
209
+ logLevel: (_b = options.logLevel) !== null && _b !== void 0 ? _b : 'info',
210
+ onAudioCodec: (_c = options.onAudioCodec) !== null && _c !== void 0 ? _c : null,
211
+ onAudioTrack: (_d = options.onAudioTrack) !== null && _d !== void 0 ? _d : null,
212
+ onContainer: (_e = options.onContainer) !== null && _e !== void 0 ? _e : null,
213
+ onDimensions: (_f = options.onDimensions) !== null && _f !== void 0 ? _f : null,
214
+ onDurationInSeconds: (_g = options.onDurationInSeconds) !== null && _g !== void 0 ? _g : null,
215
+ onFps: (_h = options.onFps) !== null && _h !== void 0 ? _h : null,
216
+ onImages: (_j = options.onImages) !== null && _j !== void 0 ? _j : null,
217
+ onInternalStats: (_k = options.onInternalStats) !== null && _k !== void 0 ? _k : null,
218
+ onIsHdr: (_l = options.onIsHdr) !== null && _l !== void 0 ? _l : null,
219
+ onKeyframes: (_m = options.onKeyframes) !== null && _m !== void 0 ? _m : null,
220
+ onLocation: (_o = options.onLocation) !== null && _o !== void 0 ? _o : null,
221
+ onMetadata: (_p = options.onMetadata) !== null && _p !== void 0 ? _p : null,
222
+ onMimeType: (_q = options.onMimeType) !== null && _q !== void 0 ? _q : null,
223
+ onName: (_r = options.onName) !== null && _r !== void 0 ? _r : null,
224
+ onNumberOfAudioChannels: (_s = options.onNumberOfAudioChannels) !== null && _s !== void 0 ? _s : null,
225
+ onParseProgress: (_t = options.onParseProgress) !== null && _t !== void 0 ? _t : null,
226
+ onRotation: (_u = options.onRotation) !== null && _u !== void 0 ? _u : null,
227
+ onSampleRate: (_v = options.onSampleRate) !== null && _v !== void 0 ? _v : null,
228
+ onSize: (_w = options.onSize) !== null && _w !== void 0 ? _w : null,
229
+ onSlowAudioBitrate: (_x = options.onSlowAudioBitrate) !== null && _x !== void 0 ? _x : null,
230
+ onSlowDurationInSeconds: (_y = options.onSlowDurationInSeconds) !== null && _y !== void 0 ? _y : null,
231
+ onSlowFps: (_z = options.onSlowFps) !== null && _z !== void 0 ? _z : null,
232
+ onSlowKeyframes: (_0 = options.onSlowKeyframes) !== null && _0 !== void 0 ? _0 : null,
233
+ onSlowNumberOfFrames: (_1 = options.onSlowNumberOfFrames) !== null && _1 !== void 0 ? _1 : null,
234
+ onSlowVideoBitrate: (_2 = options.onSlowVideoBitrate) !== null && _2 !== void 0 ? _2 : null,
235
+ onStructure: (_3 = options.onStructure) !== null && _3 !== void 0 ? _3 : null,
236
+ onTracks: (_4 = options.onTracks) !== null && _4 !== void 0 ? _4 : null,
237
+ onUnrotatedDimensions: (_5 = options.onUnrotatedDimensions) !== null && _5 !== void 0 ? _5 : null,
238
+ onVideoCodec: (_6 = options.onVideoCodec) !== null && _6 !== void 0 ? _6 : null,
239
+ onVideoTrack: (_7 = options.onVideoTrack) !== null && _7 !== void 0 ? _7 : null,
240
+ progressIntervalInMs: (_8 = options.progressIntervalInMs) !== null && _8 !== void 0 ? _8 : null,
241
+ reader: (_9 = options.reader) !== null && _9 !== void 0 ? _9 : from_fetch_1.fetchReader,
242
+ signal: (_10 = options.signal) !== null && _10 !== void 0 ? _10 : undefined,
243
+ src: options.src,
244
+ });
245
+ };
164
246
  exports.parseMedia = parseMedia;