@remotion/media-parser 4.0.193 → 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 (266) 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/make-track.d.ts +3 -0
  10. package/dist/boxes/iso-base-media/make-track.js +112 -0
  11. package/dist/boxes/iso-base-media/mdat/mdat.d.ts +16 -0
  12. package/dist/boxes/iso-base-media/mdat/mdat.js +97 -0
  13. package/dist/boxes/iso-base-media/moov/moov.d.ts +4 -2
  14. package/dist/boxes/iso-base-media/moov/moov.js +4 -2
  15. package/dist/boxes/iso-base-media/mvhd.js +7 -1
  16. package/dist/boxes/iso-base-media/process-box.d.ts +20 -3
  17. package/dist/boxes/iso-base-media/process-box.js +356 -18
  18. package/dist/boxes/iso-base-media/stsd/av1c.d.ts +9 -0
  19. package/dist/boxes/iso-base-media/stsd/av1c.js +10 -0
  20. package/dist/boxes/iso-base-media/stsd/avcc-hvcc.d.ts +20 -0
  21. package/dist/boxes/iso-base-media/stsd/avcc-hvcc.js +73 -0
  22. package/dist/boxes/iso-base-media/stsd/avcc.d.ts +10 -0
  23. package/dist/boxes/iso-base-media/stsd/avcc.js +21 -0
  24. package/dist/boxes/iso-base-media/stsd/colr.d.ts +11 -0
  25. package/dist/boxes/iso-base-media/stsd/colr.js +35 -0
  26. package/dist/boxes/iso-base-media/stsd/ctts.d.ts +19 -0
  27. package/dist/boxes/iso-base-media/stsd/ctts.js +30 -0
  28. package/dist/boxes/iso-base-media/stsd/hvcc.d.ts +11 -0
  29. package/dist/boxes/iso-base-media/stsd/hvcc.js +17 -0
  30. package/dist/boxes/iso-base-media/stsd/keys.js +1 -0
  31. package/dist/boxes/iso-base-media/stsd/mebx.d.ts +4 -2
  32. package/dist/boxes/iso-base-media/stsd/mebx.js +4 -2
  33. package/dist/boxes/iso-base-media/stsd/pasp.d.ts +12 -0
  34. package/dist/boxes/iso-base-media/stsd/pasp.js +17 -0
  35. package/dist/boxes/iso-base-media/stsd/samples.d.ts +12 -5
  36. package/dist/boxes/iso-base-media/stsd/samples.js +27 -10
  37. package/dist/boxes/iso-base-media/stsd/stco.d.ts +14 -0
  38. package/dist/boxes/iso-base-media/stsd/stco.js +30 -0
  39. package/dist/boxes/iso-base-media/stsd/stsc.d.ts +19 -0
  40. package/dist/boxes/iso-base-media/stsd/stsc.js +34 -0
  41. package/dist/boxes/iso-base-media/stsd/stsd.d.ts +4 -2
  42. package/dist/boxes/iso-base-media/stsd/stsd.js +6 -2
  43. package/dist/boxes/iso-base-media/stsd/stss.d.ts +13 -0
  44. package/dist/boxes/iso-base-media/stsd/stss.js +28 -0
  45. package/dist/boxes/iso-base-media/stsd/stsz.d.ts +21 -0
  46. package/dist/boxes/iso-base-media/stsd/stsz.js +44 -0
  47. package/dist/boxes/iso-base-media/stsd/stts.d.ts +15 -0
  48. package/dist/boxes/iso-base-media/stsd/stts.js +35 -0
  49. package/dist/boxes/iso-base-media/tkhd.d.ts +3 -0
  50. package/dist/boxes/iso-base-media/tkhd.js +41 -14
  51. package/dist/boxes/iso-base-media/trak/trak.d.ts +4 -2
  52. package/dist/boxes/iso-base-media/trak/trak.js +4 -2
  53. package/dist/boxes/iso-base-media/void-box.d.ts +4 -0
  54. package/dist/boxes/iso-base-media/void-box.js +2 -0
  55. package/dist/boxes/webm/allowed-partial-segments.d.ts +1 -0
  56. package/dist/boxes/webm/allowed-partial-segments.js +4 -0
  57. package/dist/boxes/webm/av1-codec-private.d.ts +2 -0
  58. package/dist/boxes/webm/av1-codec-private.js +95 -0
  59. package/dist/boxes/webm/bitstream/av1/bitstream-frame-header.d.ts +14 -0
  60. package/dist/boxes/webm/bitstream/av1/bitstream-frame-header.js +67 -0
  61. package/dist/boxes/webm/bitstream/av1/bitstream-frame.d.ts +11 -0
  62. package/dist/boxes/webm/bitstream/av1/bitstream-frame.js +14 -0
  63. package/dist/boxes/webm/bitstream/av1/chroma-sample-position.d.ts +6 -0
  64. package/dist/boxes/webm/bitstream/av1/chroma-sample-position.js +9 -0
  65. package/dist/boxes/webm/bitstream/av1/color-config.d.ts +16 -0
  66. package/dist/boxes/webm/bitstream/av1/color-config.js +103 -0
  67. package/dist/boxes/webm/bitstream/av1/color-primaries.d.ts +14 -0
  68. package/dist/boxes/webm/bitstream/av1/color-primaries.js +17 -0
  69. package/dist/boxes/webm/bitstream/av1/decoder-model-info.d.ts +9 -0
  70. package/dist/boxes/webm/bitstream/av1/decoder-model-info.js +17 -0
  71. package/dist/boxes/webm/bitstream/av1/frame.d.ts +0 -0
  72. package/dist/boxes/webm/bitstream/av1/frame.js +1 -0
  73. package/dist/boxes/webm/bitstream/av1/header-segment.d.ts +51 -0
  74. package/dist/boxes/webm/bitstream/av1/header-segment.js +183 -0
  75. package/dist/boxes/webm/bitstream/av1/matrix-coefficients.d.ts +17 -0
  76. package/dist/boxes/webm/bitstream/av1/matrix-coefficients.js +20 -0
  77. package/dist/boxes/webm/bitstream/av1/operating-parameters-info.d.ts +10 -0
  78. package/dist/boxes/webm/bitstream/av1/operating-parameters-info.js +15 -0
  79. package/dist/boxes/webm/bitstream/av1/temporal-point-info.d.ts +5 -0
  80. package/dist/boxes/webm/bitstream/av1/temporal-point-info.js +8 -0
  81. package/dist/boxes/webm/bitstream/av1/timing-info.d.ts +8 -0
  82. package/dist/boxes/webm/bitstream/av1/timing-info.js +20 -0
  83. package/dist/boxes/webm/bitstream/av1/transfer-characteristics.d.ts +21 -0
  84. package/dist/boxes/webm/bitstream/av1/transfer-characteristics.js +24 -0
  85. package/dist/boxes/webm/bitstream/av1/uvlc.d.ts +2 -0
  86. package/dist/boxes/webm/bitstream/av1/uvlc.js +20 -0
  87. package/dist/boxes/webm/bitstream/av1.d.ts +20 -0
  88. package/dist/boxes/webm/bitstream/av1.js +118 -0
  89. package/dist/boxes/webm/bitstream/h264/get-h264-descriptor.d.ts +0 -0
  90. package/dist/boxes/webm/bitstream/h264/get-h264-descriptor.js +1 -0
  91. package/dist/boxes/webm/description.d.ts +2 -0
  92. package/dist/boxes/webm/description.js +83 -0
  93. package/dist/boxes/webm/get-ready-tracks.d.ts +3 -0
  94. package/dist/boxes/webm/get-ready-tracks.js +29 -0
  95. package/dist/boxes/webm/get-track.d.ts +6 -0
  96. package/dist/boxes/webm/get-track.js +183 -0
  97. package/dist/boxes/webm/parse-webm-header.d.ts +2 -1
  98. package/dist/boxes/webm/parse-webm-header.js +2 -2
  99. package/dist/boxes/webm/segments/all-segments.d.ts +269 -0
  100. package/dist/boxes/webm/segments/all-segments.js +277 -0
  101. package/dist/boxes/webm/segments/duration.d.ts +1 -1
  102. package/dist/boxes/webm/segments/duration.js +13 -9
  103. package/dist/boxes/webm/segments/info.d.ts +2 -1
  104. package/dist/boxes/webm/segments/info.js +12 -4
  105. package/dist/boxes/webm/segments/main.d.ts +0 -2
  106. package/dist/boxes/webm/segments/main.js +0 -11
  107. package/dist/boxes/webm/segments/muxing.d.ts +1 -1
  108. package/dist/boxes/webm/segments/muxing.js +1 -2
  109. package/dist/boxes/webm/segments/parse-children.d.ts +11 -1
  110. package/dist/boxes/webm/segments/parse-children.js +82 -6
  111. package/dist/boxes/webm/segments/seek-head.d.ts +2 -1
  112. package/dist/boxes/webm/segments/seek-head.js +12 -3
  113. package/dist/boxes/webm/segments/seek-position.d.ts +1 -1
  114. package/dist/boxes/webm/segments/seek-position.js +1 -2
  115. package/dist/boxes/webm/segments/seek.d.ts +7 -2
  116. package/dist/boxes/webm/segments/seek.js +22 -9
  117. package/dist/boxes/webm/segments/track-entry.d.ts +102 -22
  118. package/dist/boxes/webm/segments/track-entry.js +269 -57
  119. package/dist/boxes/webm/segments/tracks.d.ts +2 -1
  120. package/dist/boxes/webm/segments/tracks.js +12 -4
  121. package/dist/boxes/webm/segments/void.d.ts +1 -1
  122. package/dist/boxes/webm/segments/void.js +1 -2
  123. package/dist/boxes/webm/segments/writing.d.ts +1 -1
  124. package/dist/boxes/webm/segments/writing.js +1 -2
  125. package/dist/boxes/webm/segments.d.ts +8 -4
  126. package/dist/boxes/webm/segments.js +176 -40
  127. package/dist/boxes/webm/traversal.d.ts +7 -0
  128. package/dist/boxes/webm/traversal.js +25 -0
  129. package/dist/buffer-iterator.d.ts +16 -1
  130. package/dist/buffer-iterator.js +124 -41
  131. package/dist/combine-uint8array.d.ts +1 -0
  132. package/dist/combine-uint8array.js +13 -0
  133. package/dist/from-fetch.d.ts +2 -0
  134. package/dist/from-fetch.js +54 -0
  135. package/dist/from-node.js +12 -2
  136. package/dist/from-web-file.d.ts +2 -0
  137. package/dist/from-web-file.js +34 -0
  138. package/dist/get-audio-codec.d.ts +19 -0
  139. package/dist/get-audio-codec.js +153 -60
  140. package/dist/get-dimensions.d.ts +8 -2
  141. package/dist/get-dimensions.js +13 -91
  142. package/dist/get-duration.js +4 -7
  143. package/dist/get-fps.d.ts +4 -3
  144. package/dist/get-fps.js +17 -116
  145. package/dist/get-sample-aspect-ratio.d.ts +37 -0
  146. package/dist/get-sample-aspect-ratio.js +137 -0
  147. package/dist/get-sample-positions.d.ts +22 -0
  148. package/dist/get-sample-positions.js +54 -0
  149. package/dist/get-tracks.d.ts +49 -0
  150. package/dist/get-tracks.js +84 -0
  151. package/dist/get-video-codec.d.ts +2 -0
  152. package/dist/get-video-codec.js +47 -31
  153. package/dist/has-all-info.d.ts +2 -1
  154. package/dist/has-all-info.js +14 -5
  155. package/dist/index.d.ts +1 -0
  156. package/dist/make-hvc1-codec-strings.d.ts +2 -0
  157. package/dist/make-hvc1-codec-strings.js +47 -0
  158. package/dist/options.d.ts +26 -4
  159. package/dist/parse-media.js +76 -20
  160. package/dist/parse-result.d.ts +17 -5
  161. package/dist/parse-video.d.ts +12 -2
  162. package/dist/parse-video.js +15 -6
  163. package/dist/parser-context.d.ts +8 -0
  164. package/dist/parser-context.js +2 -0
  165. package/dist/parser-state.d.ts +23 -0
  166. package/dist/parser-state.js +112 -0
  167. package/dist/reader.d.ts +2 -2
  168. package/dist/traversal.d.ts +56 -0
  169. package/dist/traversal.js +331 -0
  170. package/dist/understand-vorbis.d.ts +1 -0
  171. package/dist/understand-vorbis.js +12 -0
  172. package/dist/webcodec-sample-types.d.ts +21 -0
  173. package/dist/webcodec-sample-types.js +2 -0
  174. package/package.json +10 -2
  175. package/src/add-new-matroska-tracks.ts +23 -0
  176. package/src/boxes/iso-base-media/esds/decoder-specific-config.ts +61 -0
  177. package/src/boxes/iso-base-media/esds/esds-descriptors.ts +33 -2
  178. package/src/boxes/iso-base-media/make-track.ts +157 -0
  179. package/src/boxes/iso-base-media/mdat/mdat.ts +131 -0
  180. package/src/boxes/iso-base-media/moov/moov.ts +8 -3
  181. package/src/boxes/iso-base-media/mvhd.ts +7 -1
  182. package/src/boxes/iso-base-media/process-box.ts +426 -21
  183. package/src/boxes/iso-base-media/stsd/av1c.ts +19 -0
  184. package/src/boxes/iso-base-media/stsd/avcc.ts +36 -0
  185. package/src/boxes/iso-base-media/stsd/colr.ts +49 -0
  186. package/src/boxes/iso-base-media/stsd/ctts.ts +55 -0
  187. package/src/boxes/iso-base-media/stsd/hvcc.ts +32 -0
  188. package/src/boxes/iso-base-media/stsd/keys.ts +2 -0
  189. package/src/boxes/iso-base-media/stsd/mebx.ts +8 -3
  190. package/src/boxes/iso-base-media/stsd/pasp.ts +32 -0
  191. package/src/boxes/iso-base-media/stsd/samples.ts +43 -16
  192. package/src/boxes/iso-base-media/stsd/stco.ts +50 -0
  193. package/src/boxes/iso-base-media/stsd/stsc.ts +61 -0
  194. package/src/boxes/iso-base-media/stsd/stsd.ts +10 -3
  195. package/src/boxes/iso-base-media/stsd/stss.ts +47 -0
  196. package/src/boxes/iso-base-media/stsd/stsz.ts +75 -0
  197. package/src/boxes/iso-base-media/tkhd.ts +63 -16
  198. package/src/boxes/iso-base-media/trak/trak.ts +8 -3
  199. package/src/boxes/iso-base-media/void-box.ts +4 -0
  200. package/src/boxes/webm/allowed-partial-segments.ts +1 -0
  201. package/src/boxes/webm/av1-codec-private.ts +113 -0
  202. package/src/boxes/webm/description.ts +101 -0
  203. package/src/boxes/webm/get-ready-tracks.ts +36 -0
  204. package/src/boxes/webm/get-track.ts +250 -0
  205. package/src/boxes/webm/parse-webm-header.ts +6 -2
  206. package/src/boxes/webm/segments/all-segments.ts +285 -0
  207. package/src/boxes/webm/segments/duration.ts +15 -8
  208. package/src/boxes/webm/segments/info.ts +18 -4
  209. package/src/boxes/webm/segments/main.ts +0 -13
  210. package/src/boxes/webm/segments/muxing.ts +1 -1
  211. package/src/boxes/webm/segments/parse-children.ts +132 -9
  212. package/src/boxes/webm/segments/seek-head.ts +17 -4
  213. package/src/boxes/webm/segments/seek-position.ts +1 -2
  214. package/src/boxes/webm/segments/seek.ts +31 -9
  215. package/src/boxes/webm/segments/track-entry.ts +475 -65
  216. package/src/boxes/webm/segments/tracks.ts +17 -7
  217. package/src/boxes/webm/segments/void.ts +4 -2
  218. package/src/boxes/webm/segments/writing.ts +1 -1
  219. package/src/boxes/webm/segments.ts +266 -42
  220. package/src/boxes/webm/traversal.ts +32 -0
  221. package/src/buffer-iterator.ts +155 -40
  222. package/src/combine-uint8array.ts +13 -0
  223. package/src/{from-web.ts → from-fetch.ts} +18 -7
  224. package/src/from-node.ts +15 -2
  225. package/src/from-web-file.ts +39 -0
  226. package/src/get-audio-codec.ts +213 -84
  227. package/src/get-dimensions.ts +25 -132
  228. package/src/get-duration.ts +4 -8
  229. package/src/get-fps.ts +27 -172
  230. package/src/get-sample-aspect-ratio.ts +204 -0
  231. package/src/get-sample-positions.ts +93 -0
  232. package/src/get-tracks.ts +147 -0
  233. package/src/get-video-codec.ts +62 -47
  234. package/src/has-all-info.ts +35 -5
  235. package/src/index.ts +8 -0
  236. package/src/make-hvc1-codec-strings.ts +55 -0
  237. package/src/options.ts +48 -9
  238. package/src/parse-media.ts +112 -25
  239. package/src/parse-result.ts +29 -4
  240. package/src/parse-video.ts +32 -7
  241. package/src/parser-context.ts +9 -0
  242. package/src/parser-state.ts +151 -0
  243. package/src/reader.ts +3 -3
  244. package/src/test/aspect-ratio.test.ts +42 -0
  245. package/src/test/av1.test.ts +108 -0
  246. package/src/test/duration.test.ts +5 -21
  247. package/src/test/matroska.test.ts +350 -31
  248. package/src/test/mvhd.test.ts +6 -1
  249. package/src/test/parse-esds.test.ts +29 -6
  250. package/src/test/parse-stco.test.ts +59 -0
  251. package/src/test/parse-stsc.test.ts +104 -0
  252. package/src/test/parse-stsz.test.ts +57 -0
  253. package/src/test/parse-stts.test.ts +1 -1
  254. package/src/test/parse-video.test.ts +23 -35
  255. package/src/test/parse-webm.test.ts +5 -5
  256. package/src/test/stream-local.test.ts +543 -47
  257. package/src/test/stream-remote.test.ts +15 -13
  258. package/src/test/stream-samples.test.ts +259 -0
  259. package/src/test/stsd.test.ts +60 -8
  260. package/src/test/tkhd.test.ts +4 -1
  261. package/src/traversal.ts +496 -0
  262. package/src/webcodec-sample-types.ts +30 -0
  263. package/tsconfig.json +5 -1
  264. package/tsconfig.tsbuildinfo +1 -1
  265. package/boxes.json +0 -1
  266. /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,14 +52,82 @@ 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) {
96
+ if (bytesRemaining >= 4) {
97
+ const type = iterator.getByteString(4);
98
+ iterator.counter.decrement(4);
99
+ if (type === 'mdat') {
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
+ });
128
+ }
129
+ }
130
+ }
47
131
  iterator.counter.decrement(iterator.counter.getOffset() - fileOffset);
48
132
  if (allowIncompleteBoxes) {
49
133
  return {
@@ -59,6 +143,18 @@ const processBox = ({ iterator, allowIncompleteBoxes, }) => {
59
143
  type: 'complete',
60
144
  box,
61
145
  size: boxSize,
146
+ skipTo: null,
147
+ };
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,
62
158
  };
63
159
  }
64
160
  if (boxType === 'mvhd') {
@@ -67,6 +163,7 @@ const processBox = ({ iterator, allowIncompleteBoxes, }) => {
67
163
  type: 'complete',
68
164
  box,
69
165
  size: boxSize,
166
+ skipTo: null,
70
167
  };
71
168
  }
72
169
  if (boxType === 'tkhd') {
@@ -75,42 +172,152 @@ const processBox = ({ iterator, allowIncompleteBoxes, }) => {
75
172
  type: 'complete',
76
173
  box,
77
174
  size: boxSize,
175
+ skipTo: null,
78
176
  };
79
177
  }
80
178
  if (boxType === 'stsd') {
81
- 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
+ });
82
263
  return {
83
264
  type: 'complete',
84
265
  box,
85
266
  size: boxSize,
267
+ skipTo: null,
86
268
  };
87
269
  }
88
270
  if (boxType === 'mebx') {
89
- 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
+ });
90
277
  return {
91
278
  type: 'complete',
92
279
  box,
93
280
  size: boxSize,
281
+ skipTo: null,
94
282
  };
95
283
  }
96
284
  if (boxType === 'moov') {
97
- 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
+ });
98
291
  return {
99
292
  type: 'complete',
100
293
  box,
101
294
  size: boxSize,
295
+ skipTo: null,
102
296
  };
103
297
  }
104
298
  if (boxType === 'trak') {
105
- const box = (0, trak_1.parseTrak)({
299
+ const box = await (0, trak_1.parseTrak)({
106
300
  data: iterator,
107
301
  size: boxSize,
108
302
  offsetAtStart: fileOffset,
303
+ options,
109
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
+ }
110
316
  return {
111
317
  type: 'complete',
112
318
  box,
113
319
  size: boxSize,
320
+ skipTo: null,
114
321
  };
115
322
  }
116
323
  if (boxType === 'stts') {
@@ -123,6 +330,44 @@ const processBox = ({ iterator, allowIncompleteBoxes, }) => {
123
330
  type: 'complete',
124
331
  box,
125
332
  size: boxSize,
333
+ skipTo: null,
334
+ };
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,
126
371
  };
127
372
  }
128
373
  if (boxType === 'mdhd') {
@@ -135,6 +380,7 @@ const processBox = ({ iterator, allowIncompleteBoxes, }) => {
135
380
  type: 'complete',
136
381
  box,
137
382
  size: boxSize,
383
+ skipTo: null,
138
384
  };
139
385
  }
140
386
  if (boxType === 'esds') {
@@ -147,13 +393,30 @@ const processBox = ({ iterator, allowIncompleteBoxes, }) => {
147
393
  type: 'complete',
148
394
  box,
149
395
  size: boxSize,
396
+ skipTo: null,
397
+ };
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,
150
412
  };
151
413
  }
152
414
  const bytesRemainingInBox = boxSize - (iterator.counter.getOffset() - fileOffset);
153
- const children = getChildren({
415
+ const children = await getChildren({
154
416
  boxType,
155
417
  iterator,
156
418
  bytesRemainingInBox,
419
+ options,
157
420
  });
158
421
  return {
159
422
  type: 'complete',
@@ -165,17 +428,30 @@ const processBox = ({ iterator, allowIncompleteBoxes, }) => {
165
428
  offset: fileOffset,
166
429
  },
167
430
  size: boxSize,
431
+ skipTo: null,
168
432
  };
169
433
  };
170
- const parseBoxes = ({ iterator, maxBytes, allowIncompleteBoxes, initialBoxes, }) => {
171
- const boxes = initialBoxes;
434
+ exports.processBox = processBox;
435
+ const parseBoxes = async ({ iterator, maxBytes, allowIncompleteBoxes, initialBoxes, options, continueMdat, }) => {
436
+ let boxes = initialBoxes;
172
437
  const initialOffset = iterator.counter.getOffset();
438
+ const alreadyHasMdat = boxes.find((b) => b.type === 'mdat-box');
173
439
  while (iterator.bytesRemaining() > 0 &&
174
440
  iterator.counter.getOffset() - initialOffset < maxBytes) {
175
- const result = processBox({
176
- iterator,
177
- allowIncompleteBoxes,
178
- });
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
+ });
179
455
  if (result.type === 'incomplete') {
180
456
  if (Number.isFinite(maxBytes)) {
181
457
  throw new Error('maxBytes must be Infinity for top-level boxes');
@@ -189,13 +465,75 @@ const parseBoxes = ({ iterator, maxBytes, allowIncompleteBoxes, initialBoxes, })
189
465
  maxBytes,
190
466
  allowIncompleteBoxes,
191
467
  initialBoxes: boxes,
468
+ options,
469
+ continueMdat: false,
470
+ });
471
+ },
472
+ skipTo: null,
473
+ };
474
+ }
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
+ }
500
+ if (result.skipTo !== null) {
501
+ return {
502
+ status: 'incomplete',
503
+ segments: boxes,
504
+ continueParsing: () => {
505
+ return (0, exports.parseBoxes)({
506
+ iterator,
507
+ maxBytes,
508
+ allowIncompleteBoxes,
509
+ initialBoxes: boxes,
510
+ options,
511
+ continueMdat: false,
192
512
  });
193
513
  },
514
+ skipTo: result.skipTo,
194
515
  };
195
516
  }
196
- boxes.push(result.box);
197
517
  iterator.discardFirstBytes();
198
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
+ }
199
537
  return {
200
538
  status: 'done',
201
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;