@remotion/media-parser 4.0.194 → 4.0.195

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 (275) hide show
  1. package/dist/add-new-matroska-tracks.d.ts +8 -0
  2. package/dist/add-new-matroska-tracks.js +14 -0
  3. package/dist/av1-codec-string.d.ts +3 -0
  4. package/dist/av1-codec-string.js +91 -0
  5. package/dist/boxes/iso-base-media/esds/decoder-specific-config.d.ts +14 -0
  6. package/dist/boxes/iso-base-media/esds/decoder-specific-config.js +38 -0
  7. package/dist/boxes/iso-base-media/esds/esds-descriptors.d.ts +8 -0
  8. package/dist/boxes/iso-base-media/esds/esds-descriptors.js +22 -2
  9. package/dist/boxes/iso-base-media/ftype.d.ts +9 -0
  10. package/dist/boxes/iso-base-media/ftype.js +31 -0
  11. package/dist/boxes/iso-base-media/make-track.d.ts +3 -0
  12. package/dist/boxes/iso-base-media/make-track.js +112 -0
  13. package/dist/boxes/iso-base-media/mdat/mdat.d.ts +6 -2
  14. package/dist/boxes/iso-base-media/mdat/mdat.js +90 -6
  15. package/dist/boxes/iso-base-media/moov/moov.d.ts +4 -2
  16. package/dist/boxes/iso-base-media/moov/moov.js +4 -2
  17. package/dist/boxes/iso-base-media/mvhd.js +7 -1
  18. package/dist/boxes/iso-base-media/process-box.d.ts +20 -3
  19. package/dist/boxes/iso-base-media/process-box.js +322 -34
  20. package/dist/boxes/iso-base-media/stsd/av1c.d.ts +9 -0
  21. package/dist/boxes/iso-base-media/stsd/av1c.js +10 -0
  22. package/dist/boxes/iso-base-media/stsd/avcc-hvcc.d.ts +20 -0
  23. package/dist/boxes/iso-base-media/stsd/avcc-hvcc.js +73 -0
  24. package/dist/boxes/iso-base-media/stsd/avcc.d.ts +10 -0
  25. package/dist/boxes/iso-base-media/stsd/avcc.js +21 -0
  26. package/dist/boxes/iso-base-media/stsd/colr.d.ts +11 -0
  27. package/dist/boxes/iso-base-media/stsd/colr.js +35 -0
  28. package/dist/boxes/iso-base-media/stsd/ctts.d.ts +19 -0
  29. package/dist/boxes/iso-base-media/stsd/ctts.js +30 -0
  30. package/dist/boxes/iso-base-media/stsd/hvcc.d.ts +11 -0
  31. package/dist/boxes/iso-base-media/stsd/hvcc.js +17 -0
  32. package/dist/boxes/iso-base-media/stsd/keys.js +1 -0
  33. package/dist/boxes/iso-base-media/stsd/mebx.d.ts +4 -2
  34. package/dist/boxes/iso-base-media/stsd/mebx.js +4 -2
  35. package/dist/boxes/iso-base-media/stsd/pasp.d.ts +12 -0
  36. package/dist/boxes/iso-base-media/stsd/pasp.js +17 -0
  37. package/dist/boxes/iso-base-media/stsd/samples.d.ts +12 -5
  38. package/dist/boxes/iso-base-media/stsd/samples.js +27 -10
  39. package/dist/boxes/iso-base-media/stsd/stsd.d.ts +4 -2
  40. package/dist/boxes/iso-base-media/stsd/stsd.js +6 -2
  41. package/dist/boxes/iso-base-media/stsd/stss.d.ts +13 -0
  42. package/dist/boxes/iso-base-media/stsd/stss.js +28 -0
  43. package/dist/boxes/iso-base-media/stsd/stsz.d.ts +9 -3
  44. package/dist/boxes/iso-base-media/stsd/stsz.js +14 -2
  45. package/dist/boxes/iso-base-media/stsd/stts.d.ts +15 -0
  46. package/dist/boxes/iso-base-media/stsd/stts.js +35 -0
  47. package/dist/boxes/iso-base-media/tkhd.d.ts +3 -0
  48. package/dist/boxes/iso-base-media/tkhd.js +41 -14
  49. package/dist/boxes/iso-base-media/trak/trak.d.ts +4 -2
  50. package/dist/boxes/iso-base-media/trak/trak.js +4 -2
  51. package/dist/boxes/iso-base-media/void-box.d.ts +4 -0
  52. package/dist/boxes/iso-base-media/void-box.js +2 -0
  53. package/dist/boxes/webm/allowed-partial-segments.d.ts +1 -0
  54. package/dist/boxes/webm/allowed-partial-segments.js +4 -0
  55. package/dist/boxes/webm/av1-codec-private.d.ts +2 -0
  56. package/dist/boxes/webm/av1-codec-private.js +95 -0
  57. package/dist/boxes/webm/bitstream/av1/bitstream-frame-header.d.ts +14 -0
  58. package/dist/boxes/webm/bitstream/av1/bitstream-frame-header.js +67 -0
  59. package/dist/boxes/webm/bitstream/av1/bitstream-frame.d.ts +11 -0
  60. package/dist/boxes/webm/bitstream/av1/bitstream-frame.js +14 -0
  61. package/dist/boxes/webm/bitstream/av1/chroma-sample-position.d.ts +6 -0
  62. package/dist/boxes/webm/bitstream/av1/chroma-sample-position.js +9 -0
  63. package/dist/boxes/webm/bitstream/av1/color-config.d.ts +16 -0
  64. package/dist/boxes/webm/bitstream/av1/color-config.js +103 -0
  65. package/dist/boxes/webm/bitstream/av1/color-primaries.d.ts +14 -0
  66. package/dist/boxes/webm/bitstream/av1/color-primaries.js +17 -0
  67. package/dist/boxes/webm/bitstream/av1/decoder-model-info.d.ts +9 -0
  68. package/dist/boxes/webm/bitstream/av1/decoder-model-info.js +17 -0
  69. package/dist/boxes/webm/bitstream/av1/header-segment.d.ts +51 -0
  70. package/dist/boxes/webm/bitstream/av1/header-segment.js +183 -0
  71. package/dist/boxes/webm/bitstream/av1/matrix-coefficients.d.ts +17 -0
  72. package/dist/boxes/webm/bitstream/av1/matrix-coefficients.js +20 -0
  73. package/dist/boxes/webm/bitstream/av1/operating-parameters-info.d.ts +10 -0
  74. package/dist/boxes/webm/bitstream/av1/operating-parameters-info.js +15 -0
  75. package/dist/boxes/webm/bitstream/av1/temporal-point-info.d.ts +5 -0
  76. package/dist/boxes/webm/bitstream/av1/temporal-point-info.js +8 -0
  77. package/dist/boxes/webm/bitstream/av1/timing-info.d.ts +8 -0
  78. package/dist/boxes/webm/bitstream/av1/timing-info.js +20 -0
  79. package/dist/boxes/webm/bitstream/av1/transfer-characteristics.d.ts +21 -0
  80. package/dist/boxes/webm/bitstream/av1/transfer-characteristics.js +24 -0
  81. package/dist/boxes/webm/bitstream/av1/uvlc.d.ts +2 -0
  82. package/dist/boxes/webm/bitstream/av1/uvlc.js +20 -0
  83. package/dist/boxes/webm/bitstream/av1.d.ts +20 -0
  84. package/dist/boxes/webm/bitstream/av1.js +118 -0
  85. package/dist/boxes/webm/bitstream/h264/get-h264-descriptor.d.ts +0 -0
  86. package/dist/boxes/webm/bitstream/h264/get-h264-descriptor.js +1 -0
  87. package/dist/boxes/webm/description.d.ts +2 -0
  88. package/dist/boxes/webm/description.js +83 -0
  89. package/dist/boxes/webm/get-ready-tracks.d.ts +3 -0
  90. package/dist/boxes/webm/get-ready-tracks.js +29 -0
  91. package/dist/boxes/webm/get-track.d.ts +6 -0
  92. package/dist/boxes/webm/get-track.js +183 -0
  93. package/dist/boxes/webm/parse-webm-header.d.ts +2 -1
  94. package/dist/boxes/webm/parse-webm-header.js +2 -2
  95. package/dist/boxes/webm/segments/all-segments.d.ts +269 -0
  96. package/dist/boxes/webm/segments/all-segments.js +277 -0
  97. package/dist/boxes/webm/segments/duration.d.ts +1 -1
  98. package/dist/boxes/webm/segments/duration.js +13 -9
  99. package/dist/boxes/webm/segments/info.d.ts +2 -1
  100. package/dist/boxes/webm/segments/info.js +12 -4
  101. package/dist/boxes/webm/segments/main.d.ts +0 -2
  102. package/dist/boxes/webm/segments/main.js +0 -11
  103. package/dist/boxes/webm/segments/muxing.d.ts +1 -1
  104. package/dist/boxes/webm/segments/muxing.js +1 -2
  105. package/dist/boxes/webm/segments/parse-children.d.ts +11 -1
  106. package/dist/boxes/webm/segments/parse-children.js +82 -6
  107. package/dist/boxes/webm/segments/seek-head.d.ts +2 -1
  108. package/dist/boxes/webm/segments/seek-head.js +12 -3
  109. package/dist/boxes/webm/segments/seek-position.d.ts +1 -1
  110. package/dist/boxes/webm/segments/seek-position.js +1 -2
  111. package/dist/boxes/webm/segments/seek.d.ts +7 -2
  112. package/dist/boxes/webm/segments/seek.js +22 -9
  113. package/dist/boxes/webm/segments/track-entry.d.ts +102 -22
  114. package/dist/boxes/webm/segments/track-entry.js +269 -57
  115. package/dist/boxes/webm/segments/tracks.d.ts +2 -1
  116. package/dist/boxes/webm/segments/tracks.js +12 -4
  117. package/dist/boxes/webm/segments/void.d.ts +1 -1
  118. package/dist/boxes/webm/segments/void.js +1 -2
  119. package/dist/boxes/webm/segments/writing.d.ts +1 -1
  120. package/dist/boxes/webm/segments/writing.js +1 -2
  121. package/dist/boxes/webm/segments.d.ts +8 -4
  122. package/dist/boxes/webm/segments.js +176 -40
  123. package/dist/boxes/webm/traversal.d.ts +7 -0
  124. package/dist/boxes/webm/traversal.js +25 -0
  125. package/dist/buffer-iterator.d.ts +15 -1
  126. package/dist/buffer-iterator.js +115 -46
  127. package/dist/combine-uint8array.d.ts +1 -0
  128. package/dist/combine-uint8array.js +13 -0
  129. package/dist/from-fetch.d.ts +2 -0
  130. package/dist/from-fetch.js +54 -0
  131. package/dist/from-node.js +6 -0
  132. package/dist/from-web-file.d.ts +2 -0
  133. package/dist/from-web-file.js +34 -0
  134. package/dist/from-web.js +6 -9
  135. package/dist/get-audio-codec.d.ts +19 -0
  136. package/dist/get-audio-codec.js +153 -60
  137. package/dist/get-dimensions.d.ts +8 -2
  138. package/dist/get-dimensions.js +13 -91
  139. package/dist/get-duration.js +4 -7
  140. package/dist/get-fps.d.ts +4 -3
  141. package/dist/get-fps.js +17 -116
  142. package/dist/get-sample-aspect-ratio.d.ts +37 -0
  143. package/dist/get-sample-aspect-ratio.js +137 -0
  144. package/dist/get-sample-positions.d.ts +11 -1
  145. package/dist/get-sample-positions.js +31 -2
  146. package/dist/get-tracks.d.ts +44 -5
  147. package/dist/get-tracks.js +66 -48
  148. package/dist/get-video-codec.d.ts +2 -0
  149. package/dist/get-video-codec.js +47 -31
  150. package/dist/get-video-metadata.d.ts +2 -0
  151. package/dist/get-video-metadata.js +44 -0
  152. package/dist/has-all-info.d.ts +2 -1
  153. package/dist/has-all-info.js +14 -5
  154. package/dist/index.d.ts +1 -0
  155. package/dist/make-hvc1-codec-strings.d.ts +2 -0
  156. package/dist/make-hvc1-codec-strings.js +47 -0
  157. package/dist/options.d.ts +26 -4
  158. package/dist/parse-media.js +62 -17
  159. package/dist/parse-result.d.ts +16 -5
  160. package/dist/parse-video.d.ts +11 -2
  161. package/dist/parse-video.js +14 -6
  162. package/dist/parser-context.d.ts +8 -0
  163. package/dist/parser-context.js +2 -0
  164. package/dist/parser-state.d.ts +23 -0
  165. package/dist/parser-state.js +112 -0
  166. package/dist/read-and-increment-offset.d.ts +28 -0
  167. package/dist/read-and-increment-offset.js +177 -0
  168. package/dist/reader.d.ts +2 -2
  169. package/dist/traversal.d.ts +37 -0
  170. package/dist/traversal.js +244 -1
  171. package/dist/understand-vorbis.d.ts +1 -0
  172. package/dist/understand-vorbis.js +12 -0
  173. package/dist/webcodec-sample-types.d.ts +21 -0
  174. package/dist/webcodec-sample-types.js +2 -0
  175. package/package.json +10 -2
  176. package/src/add-new-matroska-tracks.ts +23 -0
  177. package/src/boxes/iso-base-media/esds/decoder-specific-config.ts +61 -0
  178. package/src/boxes/iso-base-media/esds/esds-descriptors.ts +33 -2
  179. package/src/boxes/iso-base-media/make-track.ts +157 -0
  180. package/src/boxes/iso-base-media/mdat/mdat.ts +131 -0
  181. package/src/boxes/iso-base-media/moov/moov.ts +8 -3
  182. package/src/boxes/iso-base-media/mvhd.ts +7 -1
  183. package/src/boxes/iso-base-media/process-box.ts +388 -38
  184. package/src/boxes/iso-base-media/stsd/av1c.ts +19 -0
  185. package/src/boxes/iso-base-media/stsd/avcc.ts +36 -0
  186. package/src/boxes/iso-base-media/stsd/colr.ts +49 -0
  187. package/src/boxes/iso-base-media/stsd/ctts.ts +55 -0
  188. package/src/boxes/iso-base-media/stsd/hvcc.ts +32 -0
  189. package/src/boxes/iso-base-media/stsd/keys.ts +2 -0
  190. package/src/boxes/iso-base-media/stsd/mebx.ts +8 -3
  191. package/src/boxes/iso-base-media/stsd/pasp.ts +32 -0
  192. package/src/boxes/iso-base-media/stsd/samples.ts +43 -16
  193. package/src/boxes/iso-base-media/stsd/stco.ts +50 -0
  194. package/src/boxes/iso-base-media/stsd/stsc.ts +61 -0
  195. package/src/boxes/iso-base-media/stsd/stsd.ts +10 -3
  196. package/src/boxes/iso-base-media/stsd/stss.ts +47 -0
  197. package/src/boxes/iso-base-media/stsd/stsz.ts +75 -0
  198. package/src/boxes/iso-base-media/tkhd.ts +63 -16
  199. package/src/boxes/iso-base-media/trak/trak.ts +8 -3
  200. package/src/boxes/iso-base-media/void-box.ts +4 -0
  201. package/src/boxes/webm/allowed-partial-segments.ts +1 -0
  202. package/src/boxes/webm/av1-codec-private.ts +113 -0
  203. package/src/boxes/webm/description.ts +101 -0
  204. package/src/boxes/webm/get-ready-tracks.ts +36 -0
  205. package/src/boxes/webm/get-track.ts +250 -0
  206. package/src/boxes/webm/parse-webm-header.ts +6 -2
  207. package/src/boxes/webm/segments/all-segments.ts +285 -0
  208. package/src/boxes/webm/segments/duration.ts +15 -8
  209. package/src/boxes/webm/segments/info.ts +18 -4
  210. package/src/boxes/webm/segments/main.ts +0 -13
  211. package/src/boxes/webm/segments/muxing.ts +1 -1
  212. package/src/boxes/webm/segments/parse-children.ts +132 -9
  213. package/src/boxes/webm/segments/seek-head.ts +17 -4
  214. package/src/boxes/webm/segments/seek-position.ts +1 -2
  215. package/src/boxes/webm/segments/seek.ts +31 -9
  216. package/src/boxes/webm/segments/track-entry.ts +475 -65
  217. package/src/boxes/webm/segments/tracks.ts +17 -7
  218. package/src/boxes/webm/segments/void.ts +4 -2
  219. package/src/boxes/webm/segments/writing.ts +1 -1
  220. package/src/boxes/webm/segments.ts +266 -42
  221. package/src/boxes/webm/traversal.ts +32 -0
  222. package/src/buffer-iterator.ts +140 -45
  223. package/src/combine-uint8array.ts +13 -0
  224. package/src/{from-web.ts → from-fetch.ts} +9 -1
  225. package/src/from-node.ts +8 -0
  226. package/src/from-web-file.ts +39 -0
  227. package/src/get-audio-codec.ts +213 -84
  228. package/src/get-dimensions.ts +25 -132
  229. package/src/get-duration.ts +4 -8
  230. package/src/get-fps.ts +27 -172
  231. package/src/get-sample-aspect-ratio.ts +204 -0
  232. package/src/get-sample-positions.ts +93 -0
  233. package/src/get-tracks.ts +147 -0
  234. package/src/get-video-codec.ts +62 -47
  235. package/src/has-all-info.ts +35 -5
  236. package/src/index.ts +8 -0
  237. package/src/make-hvc1-codec-strings.ts +55 -0
  238. package/src/options.ts +48 -9
  239. package/src/parse-media.ts +90 -21
  240. package/src/parse-result.ts +28 -4
  241. package/src/parse-video.ts +30 -7
  242. package/src/parser-context.ts +9 -0
  243. package/src/parser-state.ts +151 -0
  244. package/src/reader.ts +2 -2
  245. package/src/test/aspect-ratio.test.ts +42 -0
  246. package/src/test/av1.test.ts +108 -0
  247. package/src/test/duration.test.ts +5 -21
  248. package/src/test/matroska.test.ts +350 -31
  249. package/src/test/mvhd.test.ts +6 -1
  250. package/src/test/parse-esds.test.ts +29 -6
  251. package/src/test/parse-stco.test.ts +59 -0
  252. package/src/test/parse-stsc.test.ts +104 -0
  253. package/src/test/parse-stsz.test.ts +57 -0
  254. package/src/test/parse-stts.test.ts +1 -1
  255. package/src/test/parse-video.test.ts +23 -35
  256. package/src/test/parse-webm.test.ts +5 -5
  257. package/src/test/stream-local.test.ts +542 -46
  258. package/src/test/stream-remote.test.ts +15 -13
  259. package/src/test/stream-samples.test.ts +259 -0
  260. package/src/test/stsd.test.ts +60 -8
  261. package/src/test/tkhd.test.ts +4 -1
  262. package/src/traversal.ts +496 -0
  263. package/src/webcodec-sample-types.ts +30 -0
  264. package/tsconfig.json +5 -1
  265. package/tsconfig.tsbuildinfo +1 -1
  266. package/boxes.json +0 -1
  267. package/dist/boxes/iso-base-media/esds-descriptors.d.ts +0 -21
  268. package/dist/boxes/iso-base-media/esds-descriptors.js +0 -62
  269. package/dist/boxes/iso-base-media/esds.d.ts +0 -15
  270. package/dist/boxes/iso-base-media/esds.js +0 -27
  271. package/dist/get-codec.d.ts +0 -4
  272. package/dist/get-codec.js +0 -22
  273. /package/dist/{get-samples.d.ts → boxes/webm/bitstream/av1/frame.d.ts} +0 -0
  274. /package/dist/{get-samples.js → boxes/webm/bitstream/av1/frame.js} +0 -0
  275. /package/src/boxes/iso-base-media/{stts → stsd}/stts.ts +0 -0
@@ -1,17 +1,31 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.parseBoxes = void 0;
3
+ exports.parseBoxes = exports.processBox = exports.parseMdatPartially = void 0;
4
+ const get_tracks_1 = require("../../get-tracks");
5
+ const traversal_1 = require("../../traversal");
4
6
  const esds_1 = require("./esds/esds");
5
7
  const ftyp_1 = require("./ftyp");
8
+ const make_track_1 = require("./make-track");
9
+ const mdat_1 = require("./mdat/mdat");
6
10
  const mdhd_1 = require("./mdhd");
7
11
  const moov_1 = require("./moov/moov");
8
12
  const mvhd_1 = require("./mvhd");
13
+ const av1c_1 = require("./stsd/av1c");
14
+ const avcc_1 = require("./stsd/avcc");
15
+ const colr_1 = require("./stsd/colr");
16
+ const ctts_1 = require("./stsd/ctts");
17
+ const hvcc_1 = require("./stsd/hvcc");
9
18
  const mebx_1 = require("./stsd/mebx");
19
+ const pasp_1 = require("./stsd/pasp");
20
+ const stco_1 = require("./stsd/stco");
21
+ const stsc_1 = require("./stsd/stsc");
10
22
  const stsd_1 = require("./stsd/stsd");
11
- const stts_1 = require("./stts/stts");
23
+ const stss_1 = require("./stsd/stss");
24
+ const stsz_1 = require("./stsd/stsz");
25
+ const stts_1 = require("./stsd/stts");
12
26
  const tkhd_1 = require("./tkhd");
13
27
  const trak_1 = require("./trak/trak");
14
- const getChildren = ({ boxType, iterator, bytesRemainingInBox, }) => {
28
+ const getChildren = async ({ boxType, iterator, bytesRemainingInBox, options, }) => {
15
29
  const parseChildren = boxType === 'mdia' ||
16
30
  boxType === 'minf' ||
17
31
  boxType === 'stbl' ||
@@ -19,11 +33,13 @@ const getChildren = ({ boxType, iterator, bytesRemainingInBox, }) => {
19
33
  boxType === 'wave' ||
20
34
  boxType === 'stsb';
21
35
  if (parseChildren) {
22
- const parsed = (0, exports.parseBoxes)({
36
+ const parsed = await (0, exports.parseBoxes)({
23
37
  iterator,
24
38
  maxBytes: bytesRemainingInBox,
25
39
  allowIncompleteBoxes: false,
26
40
  initialBoxes: [],
41
+ options,
42
+ continueMdat: false,
27
43
  });
28
44
  if (parsed.status === 'incomplete') {
29
45
  throw new Error('Incomplete boxes are not allowed');
@@ -36,34 +52,79 @@ const getChildren = ({ boxType, iterator, bytesRemainingInBox, }) => {
36
52
  iterator.discard(bytesRemainingInBox);
37
53
  return [];
38
54
  };
39
- const processBox = ({ iterator, allowIncompleteBoxes, }) => {
55
+ const parseMdatPartially = async ({ iterator, boxSize, fileOffset, parsedBoxes, options, }) => {
56
+ const box = await (0, mdat_1.parseMdat)({
57
+ data: iterator,
58
+ size: boxSize,
59
+ fileOffset,
60
+ existingBoxes: parsedBoxes,
61
+ options,
62
+ });
63
+ if (box.samplesProcessed &&
64
+ box.fileOffset + boxSize === iterator.counter.getOffset()) {
65
+ return {
66
+ type: 'complete',
67
+ box,
68
+ size: boxSize,
69
+ skipTo: null,
70
+ };
71
+ }
72
+ return {
73
+ type: 'partial-mdat-box',
74
+ boxSize,
75
+ fileOffset,
76
+ };
77
+ };
78
+ exports.parseMdatPartially = parseMdatPartially;
79
+ const processBox = async ({ iterator, allowIncompleteBoxes, parsedBoxes, options, }) => {
80
+ var _a, _b;
40
81
  const fileOffset = iterator.counter.getOffset();
41
82
  const bytesRemaining = iterator.bytesRemaining();
42
83
  const boxSize = iterator.getFourByteNumber();
43
84
  if (boxSize === 0) {
44
- throw new Error(`Expected box size of not 0, got ${boxSize}`);
85
+ return {
86
+ type: 'complete',
87
+ box: {
88
+ type: 'void-box',
89
+ boxSize: 0,
90
+ },
91
+ size: 4,
92
+ skipTo: null,
93
+ };
45
94
  }
46
95
  if (bytesRemaining < boxSize) {
47
96
  if (bytesRemaining >= 4) {
48
97
  const type = iterator.getByteString(4);
49
98
  iterator.counter.decrement(4);
50
99
  if (type === 'mdat') {
51
- const skipTo = fileOffset + boxSize;
52
- const bytesToSkip = skipTo - iterator.counter.getOffset();
53
- // If there is a huge mdat chunk, we can skip it because we don't need it for the metadata
54
- if (bytesToSkip > 1000000) {
55
- return {
56
- type: 'complete',
57
- box: {
58
- type: 'regular-box',
59
- boxType: 'mdat',
60
- children: [],
61
- boxSize,
62
- offset: fileOffset,
63
- },
64
- size: boxSize,
65
- skipTo: fileOffset + boxSize,
66
- };
100
+ const shouldSkip = options.canSkipVideoData || !(0, get_tracks_1.hasTracks)(parsedBoxes);
101
+ if (shouldSkip) {
102
+ const skipTo = fileOffset + boxSize;
103
+ const bytesToSkip = skipTo - iterator.counter.getOffset();
104
+ // If there is a huge mdat chunk, we can skip it because we don't need it for the metadata
105
+ if (bytesToSkip > 1000000) {
106
+ return {
107
+ type: 'complete',
108
+ box: {
109
+ type: 'mdat-box',
110
+ boxSize,
111
+ fileOffset,
112
+ samplesProcessed: false,
113
+ },
114
+ size: boxSize,
115
+ skipTo: fileOffset + boxSize,
116
+ };
117
+ }
118
+ }
119
+ else {
120
+ iterator.discard(4);
121
+ return (0, exports.parseMdatPartially)({
122
+ iterator,
123
+ boxSize,
124
+ fileOffset,
125
+ parsedBoxes,
126
+ options,
127
+ });
67
128
  }
68
129
  }
69
130
  }
@@ -85,6 +146,17 @@ const processBox = ({ iterator, allowIncompleteBoxes, }) => {
85
146
  skipTo: null,
86
147
  };
87
148
  }
149
+ if (boxType === 'colr') {
150
+ const box = (0, colr_1.parseColorParameterBox)({
151
+ iterator,
152
+ });
153
+ return {
154
+ type: 'complete',
155
+ box,
156
+ size: boxSize,
157
+ skipTo: null,
158
+ };
159
+ }
88
160
  if (boxType === 'mvhd') {
89
161
  const box = (0, mvhd_1.parseMvhd)({ iterator, offset: fileOffset, size: boxSize });
90
162
  return {
@@ -104,7 +176,90 @@ const processBox = ({ iterator, allowIncompleteBoxes, }) => {
104
176
  };
105
177
  }
106
178
  if (boxType === 'stsd') {
107
- const box = (0, stsd_1.parseStsd)({ iterator, offset: fileOffset, size: boxSize });
179
+ const box = await (0, stsd_1.parseStsd)({
180
+ iterator,
181
+ offset: fileOffset,
182
+ size: boxSize,
183
+ options,
184
+ });
185
+ return {
186
+ type: 'complete',
187
+ box,
188
+ size: boxSize,
189
+ skipTo: null,
190
+ };
191
+ }
192
+ if (boxType === 'stsz') {
193
+ const box = (0, stsz_1.parseStsz)({
194
+ iterator,
195
+ offset: fileOffset,
196
+ size: boxSize,
197
+ });
198
+ return {
199
+ type: 'complete',
200
+ box,
201
+ size: boxSize,
202
+ skipTo: null,
203
+ };
204
+ }
205
+ if (boxType === 'stco') {
206
+ const box = (0, stco_1.parseStco)({
207
+ iterator,
208
+ offset: fileOffset,
209
+ size: boxSize,
210
+ });
211
+ return {
212
+ type: 'complete',
213
+ box,
214
+ size: boxSize,
215
+ skipTo: null,
216
+ };
217
+ }
218
+ if (boxType === 'pasp') {
219
+ const box = (0, pasp_1.parsePasp)({
220
+ iterator,
221
+ offset: fileOffset,
222
+ size: boxSize,
223
+ });
224
+ return {
225
+ type: 'complete',
226
+ box,
227
+ size: boxSize,
228
+ skipTo: null,
229
+ };
230
+ }
231
+ if (boxType === 'stss') {
232
+ const box = (0, stss_1.parseStss)({
233
+ iterator,
234
+ offset: fileOffset,
235
+ boxSize,
236
+ });
237
+ return {
238
+ type: 'complete',
239
+ box,
240
+ size: boxSize,
241
+ skipTo: null,
242
+ };
243
+ }
244
+ if (boxType === 'ctts') {
245
+ const box = (0, ctts_1.parseCtts)({
246
+ iterator,
247
+ offset: fileOffset,
248
+ size: boxSize,
249
+ });
250
+ return {
251
+ type: 'complete',
252
+ box,
253
+ size: boxSize,
254
+ skipTo: null,
255
+ };
256
+ }
257
+ if (boxType === 'stsc') {
258
+ const box = (0, stsc_1.parseStsc)({
259
+ iterator,
260
+ offset: fileOffset,
261
+ size: boxSize,
262
+ });
108
263
  return {
109
264
  type: 'complete',
110
265
  box,
@@ -113,7 +268,12 @@ const processBox = ({ iterator, allowIncompleteBoxes, }) => {
113
268
  };
114
269
  }
115
270
  if (boxType === 'mebx') {
116
- const box = (0, mebx_1.parseMebx)({ iterator, offset: fileOffset, size: boxSize });
271
+ const box = await (0, mebx_1.parseMebx)({
272
+ iterator,
273
+ offset: fileOffset,
274
+ size: boxSize,
275
+ options,
276
+ });
117
277
  return {
118
278
  type: 'complete',
119
279
  box,
@@ -122,7 +282,12 @@ const processBox = ({ iterator, allowIncompleteBoxes, }) => {
122
282
  };
123
283
  }
124
284
  if (boxType === 'moov') {
125
- const box = (0, moov_1.parseMoov)({ iterator, offset: fileOffset, size: boxSize });
285
+ const box = await (0, moov_1.parseMoov)({
286
+ iterator,
287
+ offset: fileOffset,
288
+ size: boxSize,
289
+ options,
290
+ });
126
291
  return {
127
292
  type: 'complete',
128
293
  box,
@@ -131,11 +296,23 @@ const processBox = ({ iterator, allowIncompleteBoxes, }) => {
131
296
  };
132
297
  }
133
298
  if (boxType === 'trak') {
134
- const box = (0, trak_1.parseTrak)({
299
+ const box = await (0, trak_1.parseTrak)({
135
300
  data: iterator,
136
301
  size: boxSize,
137
302
  offsetAtStart: fileOffset,
303
+ options,
138
304
  });
305
+ const transformedTrack = (0, make_track_1.makeBaseMediaTrack)(box);
306
+ if (transformedTrack) {
307
+ if (transformedTrack.type === 'audio') {
308
+ const callback = await ((_a = options.onAudioTrack) === null || _a === void 0 ? void 0 : _a.call(options, transformedTrack));
309
+ await options.parserState.registerAudioSampleCallback(transformedTrack.trackId, callback !== null && callback !== void 0 ? callback : null);
310
+ }
311
+ if (transformedTrack.type === 'video') {
312
+ const callback = await ((_b = options.onVideoTrack) === null || _b === void 0 ? void 0 : _b.call(options, transformedTrack));
313
+ await options.parserState.registerVideoSampleCallback(transformedTrack.trackId, callback !== null && callback !== void 0 ? callback : null);
314
+ }
315
+ }
139
316
  return {
140
317
  type: 'complete',
141
318
  box,
@@ -156,6 +333,43 @@ const processBox = ({ iterator, allowIncompleteBoxes, }) => {
156
333
  skipTo: null,
157
334
  };
158
335
  }
336
+ if (boxType === 'avcC') {
337
+ const box = (0, avcc_1.parseAvcc)({
338
+ data: iterator,
339
+ size: boxSize,
340
+ });
341
+ return {
342
+ type: 'complete',
343
+ box,
344
+ size: boxSize,
345
+ skipTo: null,
346
+ };
347
+ }
348
+ if (boxType === 'av1C') {
349
+ const box = (0, av1c_1.parseAv1C)({
350
+ data: iterator,
351
+ size: boxSize,
352
+ });
353
+ return {
354
+ type: 'complete',
355
+ box,
356
+ size: boxSize,
357
+ skipTo: null,
358
+ };
359
+ }
360
+ if (boxType === 'hvcC') {
361
+ const box = (0, hvcc_1.parseHvcc)({
362
+ data: iterator,
363
+ size: boxSize,
364
+ offset: fileOffset,
365
+ });
366
+ return {
367
+ type: 'complete',
368
+ box,
369
+ size: boxSize,
370
+ skipTo: null,
371
+ };
372
+ }
159
373
  if (boxType === 'mdhd') {
160
374
  const box = (0, mdhd_1.parseMdhd)({
161
375
  data: iterator,
@@ -182,11 +396,27 @@ const processBox = ({ iterator, allowIncompleteBoxes, }) => {
182
396
  skipTo: null,
183
397
  };
184
398
  }
399
+ if (boxType === 'mdat') {
400
+ const box = await (0, mdat_1.parseMdat)({
401
+ data: iterator,
402
+ size: boxSize,
403
+ fileOffset,
404
+ existingBoxes: parsedBoxes,
405
+ options,
406
+ });
407
+ return {
408
+ type: 'complete',
409
+ box,
410
+ size: boxSize,
411
+ skipTo: null,
412
+ };
413
+ }
185
414
  const bytesRemainingInBox = boxSize - (iterator.counter.getOffset() - fileOffset);
186
- const children = getChildren({
415
+ const children = await getChildren({
187
416
  boxType,
188
417
  iterator,
189
418
  bytesRemainingInBox,
419
+ options,
190
420
  });
191
421
  return {
192
422
  type: 'complete',
@@ -201,15 +431,27 @@ const processBox = ({ iterator, allowIncompleteBoxes, }) => {
201
431
  skipTo: null,
202
432
  };
203
433
  };
204
- const parseBoxes = ({ iterator, maxBytes, allowIncompleteBoxes, initialBoxes, }) => {
205
- const boxes = initialBoxes;
434
+ exports.processBox = processBox;
435
+ const parseBoxes = async ({ iterator, maxBytes, allowIncompleteBoxes, initialBoxes, options, continueMdat, }) => {
436
+ let boxes = initialBoxes;
206
437
  const initialOffset = iterator.counter.getOffset();
438
+ const alreadyHasMdat = boxes.find((b) => b.type === 'mdat-box');
207
439
  while (iterator.bytesRemaining() > 0 &&
208
440
  iterator.counter.getOffset() - initialOffset < maxBytes) {
209
- const result = processBox({
210
- iterator,
211
- allowIncompleteBoxes,
212
- });
441
+ const result = continueMdat
442
+ ? await (0, exports.parseMdatPartially)({
443
+ iterator,
444
+ boxSize: continueMdat.boxSize,
445
+ fileOffset: continueMdat.fileOffset,
446
+ parsedBoxes: initialBoxes,
447
+ options,
448
+ })
449
+ : await (0, exports.processBox)({
450
+ iterator,
451
+ allowIncompleteBoxes,
452
+ parsedBoxes: initialBoxes,
453
+ options,
454
+ });
213
455
  if (result.type === 'incomplete') {
214
456
  if (Number.isFinite(maxBytes)) {
215
457
  throw new Error('maxBytes must be Infinity for top-level boxes');
@@ -223,12 +465,38 @@ const parseBoxes = ({ iterator, maxBytes, allowIncompleteBoxes, initialBoxes, })
223
465
  maxBytes,
224
466
  allowIncompleteBoxes,
225
467
  initialBoxes: boxes,
468
+ options,
469
+ continueMdat: false,
226
470
  });
227
471
  },
228
472
  skipTo: null,
229
473
  };
230
474
  }
231
- boxes.push(result.box);
475
+ if (result.type === 'partial-mdat-box') {
476
+ return {
477
+ status: 'incomplete',
478
+ segments: boxes,
479
+ continueParsing: () => {
480
+ return Promise.resolve((0, exports.parseBoxes)({
481
+ iterator,
482
+ maxBytes,
483
+ allowIncompleteBoxes,
484
+ initialBoxes: boxes,
485
+ options,
486
+ continueMdat: result,
487
+ }));
488
+ },
489
+ skipTo: null,
490
+ };
491
+ }
492
+ if (result.box.type === 'mdat-box' && alreadyHasMdat) {
493
+ boxes = boxes.filter((b) => b.type !== 'mdat-box');
494
+ boxes.push(result.box);
495
+ break;
496
+ }
497
+ else {
498
+ boxes.push(result.box);
499
+ }
232
500
  if (result.skipTo !== null) {
233
501
  return {
234
502
  status: 'incomplete',
@@ -239,6 +507,8 @@ const parseBoxes = ({ iterator, maxBytes, allowIncompleteBoxes, initialBoxes, })
239
507
  maxBytes,
240
508
  allowIncompleteBoxes,
241
509
  initialBoxes: boxes,
510
+ options,
511
+ continueMdat: false,
242
512
  });
243
513
  },
244
514
  skipTo: result.skipTo,
@@ -246,6 +516,24 @@ const parseBoxes = ({ iterator, maxBytes, allowIncompleteBoxes, initialBoxes, })
246
516
  }
247
517
  iterator.discardFirstBytes();
248
518
  }
519
+ const mdatState = (0, traversal_1.hasSkippedMdatProcessing)(boxes);
520
+ if (mdatState.skipped && !options.canSkipVideoData) {
521
+ return {
522
+ status: 'incomplete',
523
+ segments: boxes,
524
+ continueParsing: () => {
525
+ return (0, exports.parseBoxes)({
526
+ iterator,
527
+ maxBytes,
528
+ allowIncompleteBoxes,
529
+ initialBoxes: boxes,
530
+ options,
531
+ continueMdat: false,
532
+ });
533
+ },
534
+ skipTo: mdatState.fileOffset,
535
+ };
536
+ }
249
537
  return {
250
538
  status: 'done',
251
539
  segments: boxes,
@@ -0,0 +1,9 @@
1
+ import type { BufferIterator } from '../../../buffer-iterator';
2
+ export interface Av1CBox {
3
+ type: 'av1C-box';
4
+ privateData: Uint8Array;
5
+ }
6
+ export declare const parseAv1C: ({ data, size, }: {
7
+ data: BufferIterator;
8
+ size: number;
9
+ }) => Av1CBox;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseAv1C = void 0;
4
+ const parseAv1C = ({ data, size, }) => {
5
+ return {
6
+ type: 'av1C-box',
7
+ privateData: data.getSlice(size - 8),
8
+ };
9
+ };
10
+ exports.parseAv1C = parseAv1C;
@@ -0,0 +1,20 @@
1
+ import type { BufferIterator } from '../../../buffer-iterator';
2
+ export interface AvccBox {
3
+ type: 'avcc-box';
4
+ data: Uint8Array;
5
+ configurationString: string;
6
+ }
7
+ export declare const parseAvcc: ({ data, size, }: {
8
+ data: BufferIterator;
9
+ size: number;
10
+ }) => AvccBox;
11
+ export interface HvccBox {
12
+ type: 'hvcc-box';
13
+ data: Uint8Array;
14
+ configurationString: string;
15
+ }
16
+ export declare const parseHvcc: ({ data, size, offset, }: {
17
+ data: BufferIterator;
18
+ size: number;
19
+ offset: number;
20
+ }) => HvccBox;
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseHvcc = exports.parseAvcc = void 0;
4
+ const parseAvcc = ({ data, size, }) => {
5
+ const confVersion = data.getUint8();
6
+ if (confVersion !== 1) {
7
+ throw new Error(`Unsupported AVCC version ${confVersion}`);
8
+ }
9
+ const profile = data.getUint8();
10
+ const profileCompatibility = data.getUint8();
11
+ const level = data.getUint8();
12
+ const str = `${profile.toString(16).padStart(2, '0')}${profileCompatibility.toString(16).padStart(2, '0')}${level.toString(16).padStart(2, '0')}`;
13
+ data.counter.decrement(4);
14
+ return {
15
+ type: 'avcc-box',
16
+ data: data.getSlice(size - 8),
17
+ configurationString: str,
18
+ };
19
+ };
20
+ exports.parseAvcc = parseAvcc;
21
+ const parseHvcc = ({ data, size, offset, }) => {
22
+ const raw = data.getSlice(size - 8);
23
+ data.counter.decrement(size - 8);
24
+ const configurationVersion = data.getUint8();
25
+ if (configurationVersion !== 1) {
26
+ throw new Error(`Unsupported HVCC version ${configurationVersion}`);
27
+ }
28
+ const generalProfileSpaceTierFlagAndIdc = data.getUint8();
29
+ let generalProfileCompatibility = data.getUint32();
30
+ // unsigned int(2) general_profile_space;
31
+ // unsigned int(1) general_tier_flag;
32
+ // unsigned int(5) general_profile_idc;
33
+ const generalProfileSpace = generalProfileSpaceTierFlagAndIdc >> 6;
34
+ const generalTierFlag = generalProfileSpaceTierFlagAndIdc >> 5;
35
+ const generalProfileIdc = generalProfileSpaceTierFlagAndIdc >> 0;
36
+ // general_constraint_indicator_flags(48)
37
+ const generalConstraintIndicator = data.getSlice(6);
38
+ const generalLevelIdc = data.getUint8();
39
+ let reversedGeneralProfileSpace = 0;
40
+ for (let i = 0; i < 32; i++) {
41
+ reversedGeneralProfileSpace |= generalProfileCompatibility & 1;
42
+ if (i === 31)
43
+ break;
44
+ reversedGeneralProfileSpace <<= 1;
45
+ generalProfileCompatibility >>= 1;
46
+ }
47
+ const profileSpaceChar = generalProfileSpace === 0
48
+ ? ''
49
+ : generalProfileSpace === 1
50
+ ? 'A'
51
+ : generalProfileSpace === 2
52
+ ? 'B'
53
+ : 'C';
54
+ const generalTierChar = generalTierFlag === 0 ? 'L' : 'H';
55
+ let hasByte = false;
56
+ let generalConstraintString = '';
57
+ for (let i = 5; i >= 0; i--) {
58
+ if (generalConstraintIndicator[i] || hasByte) {
59
+ generalConstraintString =
60
+ generalConstraintIndicator[i].toString(16) + generalConstraintString;
61
+ hasByte = true;
62
+ }
63
+ }
64
+ const constraintString = `${profileSpaceChar}${generalProfileIdc.toString(16)}.${reversedGeneralProfileSpace.toString(16)}.${generalTierChar}${generalLevelIdc}.${generalConstraintString}`;
65
+ const remaining = size - (data.counter.getOffset() - offset);
66
+ data.discard(remaining);
67
+ return {
68
+ type: 'hvcc-box',
69
+ data: raw,
70
+ configurationString: constraintString,
71
+ };
72
+ };
73
+ exports.parseHvcc = parseHvcc;
@@ -0,0 +1,10 @@
1
+ import type { BufferIterator } from '../../../buffer-iterator';
2
+ export interface AvccBox {
3
+ type: 'avcc-box';
4
+ description: Uint8Array;
5
+ configurationString: string;
6
+ }
7
+ export declare const parseAvcc: ({ data, size, }: {
8
+ data: BufferIterator;
9
+ size: number;
10
+ }) => AvccBox;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseAvcc = void 0;
4
+ const parseAvcc = ({ data, size, }) => {
5
+ const confVersion = data.getUint8();
6
+ if (confVersion !== 1) {
7
+ throw new Error(`Unsupported AVCC version ${confVersion}`);
8
+ }
9
+ const profile = data.getUint8();
10
+ const profileCompatibility = data.getUint8();
11
+ const level = data.getUint8();
12
+ const str = `${profile.toString(16).padStart(2, '0')}${profileCompatibility.toString(16).padStart(2, '0')}${level.toString(16).padStart(2, '0')}`;
13
+ data.counter.decrement(4);
14
+ const description = data.getSlice(size - 8);
15
+ return {
16
+ type: 'avcc-box',
17
+ description,
18
+ configurationString: str,
19
+ };
20
+ };
21
+ exports.parseAvcc = parseAvcc;
@@ -0,0 +1,11 @@
1
+ import type { BufferIterator } from '../../../buffer-iterator';
2
+ export interface ColorParameterBox {
3
+ type: 'colr-box';
4
+ primaries: number;
5
+ transfer: number;
6
+ matrixIndex: number;
7
+ fullRangeFlag: boolean;
8
+ }
9
+ export declare const parseColorParameterBox: ({ iterator, }: {
10
+ iterator: BufferIterator;
11
+ }) => ColorParameterBox;
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseColorParameterBox = void 0;
4
+ const parseColorParameterBox = ({ iterator, }) => {
5
+ const byteString = iterator.getByteString(4);
6
+ if (byteString === 'nclx') {
7
+ const primaries = iterator.getUint16();
8
+ const transfer = iterator.getUint16();
9
+ const matrixIndex = iterator.getUint16();
10
+ iterator.startReadingBits();
11
+ const fullRangeFlag = Boolean(iterator.getBits(1));
12
+ iterator.stopReadingBits();
13
+ return {
14
+ type: 'colr-box',
15
+ fullRangeFlag,
16
+ matrixIndex,
17
+ primaries,
18
+ transfer,
19
+ };
20
+ }
21
+ if (byteString === 'nclc') {
22
+ const primaries = iterator.getUint16();
23
+ const transfer = iterator.getUint16();
24
+ const matrixIndex = iterator.getUint16();
25
+ return {
26
+ type: 'colr-box',
27
+ fullRangeFlag: false,
28
+ matrixIndex,
29
+ primaries,
30
+ transfer,
31
+ };
32
+ }
33
+ throw new Error('Unexpected box type ' + byteString);
34
+ };
35
+ exports.parseColorParameterBox = parseColorParameterBox;