@remotion/media-parser 4.0.209 → 4.0.211

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 (290) hide show
  1. package/buffer.js +2 -0
  2. package/dist/boxes/iso-base-media/get-sample-positions-from-track.js +1 -1
  3. package/dist/boxes/iso-base-media/make-track.js +14 -2
  4. package/dist/boxes/iso-base-media/mdat/mdat.d.ts +13 -4
  5. package/dist/boxes/iso-base-media/mdat/mdat.js +20 -5
  6. package/dist/boxes/iso-base-media/moov/moov.d.ts +2 -1
  7. package/dist/boxes/iso-base-media/moov/moov.js +2 -1
  8. package/dist/boxes/iso-base-media/process-box.d.ts +6 -3
  9. package/dist/boxes/iso-base-media/process-box.js +66 -12
  10. package/dist/boxes/iso-base-media/stsd/avcc.d.ts +1 -1
  11. package/dist/boxes/iso-base-media/stsd/avcc.js +2 -2
  12. package/dist/boxes/iso-base-media/stsd/ctts.js +2 -5
  13. package/dist/boxes/iso-base-media/stsd/hvcc.d.ts +1 -1
  14. package/dist/boxes/iso-base-media/stsd/hvcc.js +2 -2
  15. package/dist/boxes/iso-base-media/stsd/mebx.d.ts +2 -1
  16. package/dist/boxes/iso-base-media/stsd/mebx.js +2 -1
  17. package/dist/boxes/iso-base-media/stsd/samples.d.ts +4 -2
  18. package/dist/boxes/iso-base-media/stsd/samples.js +69 -11
  19. package/dist/boxes/iso-base-media/stsd/stsd.d.ts +2 -1
  20. package/dist/boxes/iso-base-media/stsd/stsd.js +2 -1
  21. package/dist/boxes/iso-base-media/trak/trak.d.ts +2 -1
  22. package/dist/boxes/iso-base-media/trak/trak.js +2 -1
  23. package/dist/boxes/iso-base-media/traversal.d.ts +39 -0
  24. package/dist/boxes/iso-base-media/traversal.js +201 -0
  25. package/dist/boxes/webm/color.d.ts +4 -0
  26. package/dist/boxes/webm/color.js +127 -0
  27. package/dist/boxes/webm/description.js +1 -1
  28. package/dist/boxes/webm/ebml.d.ts +1 -1
  29. package/dist/boxes/webm/get-ready-tracks.js +3 -3
  30. package/dist/boxes/webm/get-sample-from-block.js +1 -1
  31. package/dist/boxes/webm/make-track.d.ts +9 -0
  32. package/dist/boxes/webm/make-track.js +260 -0
  33. package/dist/boxes/webm/parse-ebml.js +2 -2
  34. package/dist/boxes/webm/segments/all-segments.d.ts +36 -3
  35. package/dist/boxes/webm/segments/all-segments.js +34 -6
  36. package/dist/boxes/webm/segments/parse-children.js +6 -0
  37. package/dist/boxes/webm/traversal.d.ts +26 -1
  38. package/dist/boxes/webm/traversal.js +214 -1
  39. package/dist/buffer-iterator.d.ts +4 -1
  40. package/dist/buffer-iterator.js +31 -5
  41. package/dist/create/cluster-segment.js +0 -2
  42. package/dist/create/cluster.d.ts +16 -2
  43. package/dist/create/cluster.js +17 -10
  44. package/dist/create/create-media.d.ts +4 -2
  45. package/dist/create/create-media.js +101 -22
  46. package/dist/create/make-duration-with-padding.d.ts +1 -1
  47. package/dist/create/make-duration-with-padding.js +3 -3
  48. package/dist/create/matroska-cues.d.ts +6 -0
  49. package/dist/create/matroska-cues.js +49 -0
  50. package/dist/create/matroska-info.js +1 -1
  51. package/dist/create/matroska-seek.d.ts +6 -0
  52. package/dist/create/matroska-seek.js +32 -0
  53. package/dist/create/matroska-segment.d.ts +1 -0
  54. package/dist/create/matroska-segment.js +3 -2
  55. package/dist/create/matroska-trackentry.d.ts +9 -14
  56. package/dist/create/matroska-trackentry.js +79 -102
  57. package/dist/emit-available-info.d.ts +12 -0
  58. package/dist/emit-available-info.js +133 -0
  59. package/dist/esm/buffer.mjs +57 -0
  60. package/dist/esm/from-fetch.mjs +107 -0
  61. package/dist/esm/from-node.mjs +49 -0
  62. package/dist/esm/from-web-file.mjs +49 -0
  63. package/dist/esm/index.mjs +6822 -0
  64. package/dist/esm/web-fs.mjs +67 -0
  65. package/dist/get-audio-codec.d.ts +5 -5
  66. package/dist/get-audio-codec.js +44 -57
  67. package/dist/get-container.d.ts +4 -0
  68. package/dist/get-container.js +26 -0
  69. package/dist/get-duration.js +1 -1
  70. package/dist/get-fps.js +1 -1
  71. package/dist/get-sample-aspect-ratio.d.ts +1 -1
  72. package/dist/get-sample-aspect-ratio.js +19 -19
  73. package/dist/get-tracks.d.ts +13 -0
  74. package/dist/get-tracks.js +8 -8
  75. package/dist/get-video-codec.d.ts +5 -2
  76. package/dist/get-video-codec.js +111 -21
  77. package/dist/has-all-info.d.ts +2 -2
  78. package/dist/has-all-info.js +23 -9
  79. package/dist/index.d.ts +4 -1
  80. package/dist/options.d.ts +97 -30
  81. package/dist/parse-media.js +59 -69
  82. package/dist/parse-video.d.ts +2 -1
  83. package/dist/parse-video.js +3 -1
  84. package/dist/parser-context.d.ts +1 -0
  85. package/dist/parser-state.js +1 -2
  86. package/dist/readers/from-fetch.d.ts +12 -0
  87. package/dist/readers/from-fetch.js +83 -17
  88. package/dist/readers/from-node.js +14 -3
  89. package/dist/readers/from-web-file.js +15 -2
  90. package/dist/readers/reader.d.ts +7 -1
  91. package/dist/samples-from-moof.js +1 -1
  92. package/dist/truthy.d.ts +3 -0
  93. package/dist/truthy.js +7 -0
  94. package/dist/writers/buffer.d.ts +2 -0
  95. package/dist/writers/buffer.js +58 -0
  96. package/dist/writers/web-fs.d.ts +1 -0
  97. package/dist/writers/web-fs.js +42 -18
  98. package/dist/writers/writer.d.ts +4 -2
  99. package/fetch.js +2 -0
  100. package/node.js +2 -0
  101. package/package.json +43 -8
  102. package/web-file.js +2 -0
  103. package/web-fs.js +2 -0
  104. package/.eslintrc +0 -8
  105. package/dist/av1-codec-string.d.ts +0 -3
  106. package/dist/av1-codec-string.js +0 -91
  107. package/dist/boxes/iso-base-media/ftype.d.ts +0 -9
  108. package/dist/boxes/iso-base-media/ftype.js +0 -31
  109. package/dist/boxes/iso-base-media/stsd/avcc-hvcc.d.ts +0 -20
  110. package/dist/boxes/iso-base-media/stsd/avcc-hvcc.js +0 -73
  111. package/dist/boxes/iso-base-media/stts/stts.d.ts +0 -15
  112. package/dist/boxes/iso-base-media/stts/stts.js +0 -35
  113. package/dist/boxes/webm/bitstream/av1/bitstream-frame-header.d.ts +0 -14
  114. package/dist/boxes/webm/bitstream/av1/bitstream-frame-header.js +0 -67
  115. package/dist/boxes/webm/bitstream/av1/bitstream-frame.d.ts +0 -11
  116. package/dist/boxes/webm/bitstream/av1/bitstream-frame.js +0 -14
  117. package/dist/boxes/webm/bitstream/av1/chroma-sample-position.d.ts +0 -6
  118. package/dist/boxes/webm/bitstream/av1/chroma-sample-position.js +0 -9
  119. package/dist/boxes/webm/bitstream/av1/color-config.d.ts +0 -16
  120. package/dist/boxes/webm/bitstream/av1/color-config.js +0 -103
  121. package/dist/boxes/webm/bitstream/av1/color-primaries.d.ts +0 -14
  122. package/dist/boxes/webm/bitstream/av1/color-primaries.js +0 -17
  123. package/dist/boxes/webm/bitstream/av1/decoder-model-info.d.ts +0 -9
  124. package/dist/boxes/webm/bitstream/av1/decoder-model-info.js +0 -17
  125. package/dist/boxes/webm/bitstream/av1/frame.d.ts +0 -0
  126. package/dist/boxes/webm/bitstream/av1/frame.js +0 -1
  127. package/dist/boxes/webm/bitstream/av1/header-segment.d.ts +0 -51
  128. package/dist/boxes/webm/bitstream/av1/header-segment.js +0 -183
  129. package/dist/boxes/webm/bitstream/av1/matrix-coefficients.d.ts +0 -17
  130. package/dist/boxes/webm/bitstream/av1/matrix-coefficients.js +0 -20
  131. package/dist/boxes/webm/bitstream/av1/operating-parameters-info.d.ts +0 -10
  132. package/dist/boxes/webm/bitstream/av1/operating-parameters-info.js +0 -15
  133. package/dist/boxes/webm/bitstream/av1/temporal-point-info.d.ts +0 -5
  134. package/dist/boxes/webm/bitstream/av1/temporal-point-info.js +0 -8
  135. package/dist/boxes/webm/bitstream/av1/timing-info.d.ts +0 -8
  136. package/dist/boxes/webm/bitstream/av1/timing-info.js +0 -20
  137. package/dist/boxes/webm/bitstream/av1/transfer-characteristics.d.ts +0 -21
  138. package/dist/boxes/webm/bitstream/av1/transfer-characteristics.js +0 -24
  139. package/dist/boxes/webm/bitstream/av1/uvlc.d.ts +0 -2
  140. package/dist/boxes/webm/bitstream/av1/uvlc.js +0 -20
  141. package/dist/boxes/webm/bitstream/av1.d.ts +0 -20
  142. package/dist/boxes/webm/bitstream/av1.js +0 -118
  143. package/dist/boxes/webm/bitstream/h264/get-h264-descriptor.d.ts +0 -0
  144. package/dist/boxes/webm/bitstream/h264/get-h264-descriptor.js +0 -1
  145. package/dist/boxes/webm/segments/duration.d.ts +0 -6
  146. package/dist/boxes/webm/segments/duration.js +0 -19
  147. package/dist/boxes/webm/segments/info.d.ts +0 -9
  148. package/dist/boxes/webm/segments/info.js +0 -22
  149. package/dist/boxes/webm/segments/main.d.ts +0 -5
  150. package/dist/boxes/webm/segments/main.js +0 -2
  151. package/dist/boxes/webm/segments/muxing.d.ts +0 -6
  152. package/dist/boxes/webm/segments/muxing.js +0 -11
  153. package/dist/boxes/webm/segments/seek-head.d.ts +0 -9
  154. package/dist/boxes/webm/segments/seek-head.js +0 -22
  155. package/dist/boxes/webm/segments/seek-position.d.ts +0 -6
  156. package/dist/boxes/webm/segments/seek-position.js +0 -11
  157. package/dist/boxes/webm/segments/seek.d.ts +0 -13
  158. package/dist/boxes/webm/segments/seek.js +0 -35
  159. package/dist/boxes/webm/segments/timestamp-scale.d.ts +0 -6
  160. package/dist/boxes/webm/segments/timestamp-scale.js +0 -11
  161. package/dist/boxes/webm/segments/tracks.d.ts +0 -8
  162. package/dist/boxes/webm/segments/tracks.js +0 -21
  163. package/dist/boxes/webm/segments/unknown.d.ts +0 -6
  164. package/dist/boxes/webm/segments/unknown.js +0 -11
  165. package/dist/boxes/webm/segments/void.d.ts +0 -6
  166. package/dist/boxes/webm/segments/void.js +0 -11
  167. package/dist/boxes/webm/segments/writing.d.ts +0 -6
  168. package/dist/boxes/webm/segments/writing.js +0 -11
  169. package/dist/boxes/webm/tracks.d.ts +0 -8
  170. package/dist/boxes/webm/tracks.js +0 -21
  171. package/dist/combine-uint8array.d.ts +0 -1
  172. package/dist/combine-uint8array.js +0 -13
  173. package/dist/from-web.d.ts +0 -2
  174. package/dist/from-web.js +0 -45
  175. package/dist/get-video-metadata.d.ts +0 -2
  176. package/dist/get-video-metadata.js +0 -44
  177. package/dist/read-and-increment-offset.d.ts +0 -28
  178. package/dist/read-and-increment-offset.js +0 -177
  179. package/dist/understand-vorbis.d.ts +0 -1
  180. package/dist/understand-vorbis.js +0 -12
  181. package/input.webm +0 -0
  182. package/src/add-new-matroska-tracks.ts +0 -23
  183. package/src/boxes/iso-base-media/base-type.ts +0 -4
  184. package/src/boxes/iso-base-media/esds/decoder-specific-config.ts +0 -68
  185. package/src/boxes/iso-base-media/esds/esds-descriptors.ts +0 -135
  186. package/src/boxes/iso-base-media/esds/esds.ts +0 -49
  187. package/src/boxes/iso-base-media/ftyp.ts +0 -39
  188. package/src/boxes/iso-base-media/get-sample-positions-from-track.ts +0 -69
  189. package/src/boxes/iso-base-media/make-track.ts +0 -116
  190. package/src/boxes/iso-base-media/mdat/mdat.ts +0 -140
  191. package/src/boxes/iso-base-media/mdhd.ts +0 -59
  192. package/src/boxes/iso-base-media/moov/moov.ts +0 -43
  193. package/src/boxes/iso-base-media/mvhd.ts +0 -114
  194. package/src/boxes/iso-base-media/process-box.ts +0 -748
  195. package/src/boxes/iso-base-media/stsd/av1c.ts +0 -19
  196. package/src/boxes/iso-base-media/stsd/avcc.ts +0 -36
  197. package/src/boxes/iso-base-media/stsd/colr.ts +0 -49
  198. package/src/boxes/iso-base-media/stsd/ctts.ts +0 -64
  199. package/src/boxes/iso-base-media/stsd/hvcc.ts +0 -32
  200. package/src/boxes/iso-base-media/stsd/keys.ts +0 -27
  201. package/src/boxes/iso-base-media/stsd/mebx.ts +0 -54
  202. package/src/boxes/iso-base-media/stsd/pasp.ts +0 -32
  203. package/src/boxes/iso-base-media/stsd/samples.ts +0 -359
  204. package/src/boxes/iso-base-media/stsd/stco.ts +0 -52
  205. package/src/boxes/iso-base-media/stsd/stsc.ts +0 -61
  206. package/src/boxes/iso-base-media/stsd/stsd.ts +0 -55
  207. package/src/boxes/iso-base-media/stsd/stss.ts +0 -47
  208. package/src/boxes/iso-base-media/stsd/stsz.ts +0 -75
  209. package/src/boxes/iso-base-media/stsd/stts.ts +0 -62
  210. package/src/boxes/iso-base-media/tfdt.ts +0 -37
  211. package/src/boxes/iso-base-media/tfhd.ts +0 -66
  212. package/src/boxes/iso-base-media/tkhd.ts +0 -150
  213. package/src/boxes/iso-base-media/to-date.ts +0 -9
  214. package/src/boxes/iso-base-media/trak/trak.ts +0 -43
  215. package/src/boxes/iso-base-media/trun.ts +0 -74
  216. package/src/boxes/iso-base-media/void-box.ts +0 -4
  217. package/src/boxes/webm/allowed-partial-segments.ts +0 -1
  218. package/src/boxes/webm/av1-codec-private.ts +0 -113
  219. package/src/boxes/webm/description.ts +0 -104
  220. package/src/boxes/webm/ebml.ts +0 -98
  221. package/src/boxes/webm/get-ready-tracks.ts +0 -36
  222. package/src/boxes/webm/get-sample-from-block.ts +0 -125
  223. package/src/boxes/webm/get-track.ts +0 -257
  224. package/src/boxes/webm/make-header.ts +0 -253
  225. package/src/boxes/webm/parse-ebml.ts +0 -259
  226. package/src/boxes/webm/parse-webm-header.ts +0 -18
  227. package/src/boxes/webm/segments/all-segments.ts +0 -888
  228. package/src/boxes/webm/segments/block-simple-block-flags.ts +0 -52
  229. package/src/boxes/webm/segments/parse-children.ts +0 -144
  230. package/src/boxes/webm/segments/track-entry.ts +0 -38
  231. package/src/boxes/webm/segments.ts +0 -147
  232. package/src/boxes/webm/traversal.ts +0 -45
  233. package/src/buffer-iterator.ts +0 -555
  234. package/src/create/cluster-segment.ts +0 -62
  235. package/src/create/cluster.ts +0 -64
  236. package/src/create/create-media.ts +0 -136
  237. package/src/create/make-duration-with-padding.ts +0 -15
  238. package/src/create/matroska-header.ts +0 -63
  239. package/src/create/matroska-info.ts +0 -30
  240. package/src/create/matroska-segment.ts +0 -10
  241. package/src/create/matroska-trackentry.ts +0 -325
  242. package/src/create/timescale.ts +0 -1
  243. package/src/get-audio-codec.ts +0 -270
  244. package/src/get-dimensions.ts +0 -47
  245. package/src/get-duration.ts +0 -103
  246. package/src/get-fps.ts +0 -113
  247. package/src/get-sample-aspect-ratio.ts +0 -204
  248. package/src/get-sample-positions.ts +0 -93
  249. package/src/get-tracks.ts +0 -147
  250. package/src/get-video-codec.ts +0 -117
  251. package/src/has-all-info.ts +0 -81
  252. package/src/index.ts +0 -18
  253. package/src/make-hvc1-codec-strings.ts +0 -55
  254. package/src/options.ts +0 -118
  255. package/src/parse-media.ts +0 -183
  256. package/src/parse-result.ts +0 -79
  257. package/src/parse-video.ts +0 -83
  258. package/src/parser-context.ts +0 -10
  259. package/src/parser-state.ts +0 -178
  260. package/src/readers/from-fetch.ts +0 -90
  261. package/src/readers/from-node.ts +0 -51
  262. package/src/readers/from-web-file.ts +0 -49
  263. package/src/readers/reader.ts +0 -15
  264. package/src/samples-from-moof.ts +0 -102
  265. package/src/test/aspect-ratio.test.ts +0 -42
  266. package/src/test/av1.test.ts +0 -108
  267. package/src/test/create-matroska.test.ts +0 -287
  268. package/src/test/duration.test.ts +0 -18
  269. package/src/test/keys.test.ts +0 -47
  270. package/src/test/matroska.test.ts +0 -463
  271. package/src/test/mvhd.test.ts +0 -94
  272. package/src/test/parse-esds.test.ts +0 -98
  273. package/src/test/parse-stco.test.ts +0 -61
  274. package/src/test/parse-stsc.test.ts +0 -104
  275. package/src/test/parse-stsz.test.ts +0 -57
  276. package/src/test/parse-stts.test.ts +0 -38
  277. package/src/test/parse-video.test.ts +0 -101
  278. package/src/test/parse-webm.test.ts +0 -17
  279. package/src/test/samples-from-moof.test.ts +0 -2496
  280. package/src/test/stream-local.test.ts +0 -743
  281. package/src/test/stream-remote.test.ts +0 -59
  282. package/src/test/stream-samples.test.ts +0 -181
  283. package/src/test/stsd.test.ts +0 -265
  284. package/src/test/tkhd.test.ts +0 -87
  285. package/src/traversal.ts +0 -528
  286. package/src/webcodec-sample-types.ts +0 -29
  287. package/src/writers/web-fs.ts +0 -50
  288. package/src/writers/writer.ts +0 -12
  289. package/tsconfig.json +0 -14
  290. package/tsconfig.tsbuildinfo +0 -1
package/buffer.js ADDED
@@ -0,0 +1,2 @@
1
+ // For backwards compatibility when you use Metro
2
+ module.exports = require('./dist/writers/buffer');
@@ -4,7 +4,7 @@ exports.getSamplePositionsFromTrack = void 0;
4
4
  const get_fps_1 = require("../../get-fps");
5
5
  const get_sample_positions_1 = require("../../get-sample-positions");
6
6
  const samples_from_moof_1 = require("../../samples-from-moof");
7
- const traversal_1 = require("../../traversal");
7
+ const traversal_1 = require("./traversal");
8
8
  const getSamplePositionsFromTrack = (trakBox, moofBox) => {
9
9
  const stszBox = (0, traversal_1.getStszBox)(trakBox);
10
10
  const stcoBox = (0, traversal_1.getStcoBox)(trakBox);
@@ -5,8 +5,9 @@ const get_audio_codec_1 = require("../../get-audio-codec");
5
5
  const get_fps_1 = require("../../get-fps");
6
6
  const get_sample_aspect_ratio_1 = require("../../get-sample-aspect-ratio");
7
7
  const get_video_codec_1 = require("../../get-video-codec");
8
- const traversal_1 = require("../../traversal");
8
+ const traversal_1 = require("./traversal");
9
9
  const makeBaseMediaTrack = (trakBox) => {
10
+ var _a;
10
11
  const tkhdBox = (0, traversal_1.getTkhdBox)(trakBox);
11
12
  const videoDescriptors = (0, traversal_1.getVideoDescriptors)(trakBox);
12
13
  const timescaleAndDuration = (0, get_fps_1.getTimescaleAndDuration)(trakBox);
@@ -35,6 +36,8 @@ const makeBaseMediaTrack = (trakBox) => {
35
36
  sampleRate,
36
37
  description,
37
38
  trakBox,
39
+ codecPrivate: null,
40
+ codecWithoutConfig: (0, get_audio_codec_1.getAudioCodecFromTrack)(trakBox),
38
41
  };
39
42
  }
40
43
  if (!(0, get_fps_1.trakBoxContainsVideo)(trakBox)) {
@@ -45,7 +48,7 @@ const makeBaseMediaTrack = (trakBox) => {
45
48
  trakBox,
46
49
  };
47
50
  }
48
- const videoSample = (0, get_sample_aspect_ratio_1.getVideoSample)(trakBox);
51
+ const videoSample = (0, get_sample_aspect_ratio_1.getStsdVideoConfig)(trakBox);
49
52
  if (!videoSample) {
50
53
  throw new Error('No video sample');
51
54
  }
@@ -63,6 +66,7 @@ const makeBaseMediaTrack = (trakBox) => {
63
66
  if (!codec) {
64
67
  throw new Error('Could not find video codec');
65
68
  }
69
+ const privateData = (0, get_video_codec_1.getVideoPrivateData)(trakBox);
66
70
  const track = {
67
71
  type: 'video',
68
72
  trackId: tkhdBox.trackId,
@@ -79,6 +83,14 @@ const makeBaseMediaTrack = (trakBox) => {
79
83
  displayAspectHeight,
80
84
  rotation,
81
85
  trakBox,
86
+ codecPrivate: privateData,
87
+ color: (_a = (0, get_video_codec_1.getIsoBmColrConfig)(trakBox)) !== null && _a !== void 0 ? _a : {
88
+ fullRange: null,
89
+ matrixCoefficients: null,
90
+ primaries: null,
91
+ transferCharacteristics: null,
92
+ },
93
+ codecWithoutConfig: (0, get_video_codec_1.getVideoCodecFromIsoTrak)(trakBox),
82
94
  };
83
95
  return track;
84
96
  };
@@ -1,16 +1,25 @@
1
1
  import type { BufferIterator } from '../../../buffer-iterator';
2
2
  import type { AnySegment } from '../../../parse-result';
3
3
  import type { ParserContext } from '../../../parser-context';
4
- export interface MdatBox {
4
+ type MdatStatus = {
5
+ status: 'samples-buffered';
6
+ } | {
7
+ status: 'samples-skipped';
8
+ } | {
9
+ status: 'samples-processed';
10
+ };
11
+ export type MdatBox = {
5
12
  type: 'mdat-box';
6
- samplesProcessed: boolean;
7
13
  boxSize: number;
8
14
  fileOffset: number;
9
- }
10
- export declare const parseMdat: ({ data, size, fileOffset, existingBoxes, options, }: {
15
+ } & MdatStatus;
16
+ export declare const parseMdat: ({ data, size, fileOffset, existingBoxes, options, signal, maySkipSampleProcessing, }: {
11
17
  data: BufferIterator;
12
18
  size: number;
13
19
  fileOffset: number;
14
20
  existingBoxes: AnySegment[];
15
21
  options: ParserContext;
22
+ signal: AbortSignal | null;
23
+ maySkipSampleProcessing: boolean;
16
24
  }) => Promise<MdatBox>;
25
+ export {};
@@ -2,16 +2,26 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.parseMdat = void 0;
4
4
  const get_tracks_1 = require("../../../get-tracks");
5
- const traversal_1 = require("../../../traversal");
6
5
  const get_sample_positions_from_track_1 = require("../get-sample-positions-from-track");
7
- const parseMdat = async ({ data, size, fileOffset, existingBoxes, options, }) => {
6
+ const traversal_1 = require("../traversal");
7
+ const parseMdat = async ({ data, size, fileOffset, existingBoxes, options, signal, maySkipSampleProcessing, }) => {
8
8
  const alreadyHas = (0, get_tracks_1.hasTracks)(existingBoxes);
9
9
  if (!alreadyHas) {
10
+ if (maySkipSampleProcessing) {
11
+ data.discard(size - (data.counter.getOffset() - fileOffset));
12
+ return Promise.resolve({
13
+ type: 'mdat-box',
14
+ boxSize: size,
15
+ status: 'samples-skipped',
16
+ fileOffset,
17
+ });
18
+ }
10
19
  data.discard(size - (data.counter.getOffset() - fileOffset));
20
+ data.disallowDiscard();
11
21
  return Promise.resolve({
12
22
  type: 'mdat-box',
13
23
  boxSize: size,
14
- samplesProcessed: false,
24
+ status: 'samples-buffered',
15
25
  fileOffset,
16
26
  });
17
27
  }
@@ -37,6 +47,9 @@ const parseMdat = async ({ data, size, fileOffset, existingBoxes, options, }) =>
37
47
  .flat(1);
38
48
  // eslint-disable-next-line no-constant-condition
39
49
  while (true) {
50
+ if (signal && signal.aborted) {
51
+ break;
52
+ }
40
53
  const samplesWithIndex = flatSamples.find((sample) => {
41
54
  return sample.samplePosition.offset === data.counter.getOffset();
42
55
  });
@@ -62,9 +75,11 @@ const parseMdat = async ({ data, size, fileOffset, existingBoxes, options, }) =>
62
75
  }
63
76
  const bytes = data.getSlice(samplesWithIndex.samplePosition.size);
64
77
  if (samplesWithIndex.track.type === 'audio') {
78
+ const timestamp = Math.floor((samplesWithIndex.samplePosition.cts * 1000000) /
79
+ samplesWithIndex.track.timescale);
65
80
  await options.parserState.onAudioSample(samplesWithIndex.track.trackId, {
66
81
  data: bytes,
67
- timestamp: samplesWithIndex.samplePosition.offset,
82
+ timestamp,
68
83
  trackId: samplesWithIndex.track.trackId,
69
84
  type: samplesWithIndex.samplePosition.isKeyframe ? 'key' : 'delta',
70
85
  });
@@ -93,7 +108,7 @@ const parseMdat = async ({ data, size, fileOffset, existingBoxes, options, }) =>
93
108
  return Promise.resolve({
94
109
  type: 'mdat-box',
95
110
  boxSize: size,
96
- samplesProcessed: true,
111
+ status: 'samples-processed',
97
112
  fileOffset,
98
113
  });
99
114
  };
@@ -6,9 +6,10 @@ export interface MoovBox extends BaseBox {
6
6
  type: 'moov-box';
7
7
  children: AnySegment[];
8
8
  }
9
- export declare const parseMoov: ({ iterator, offset, size, options, }: {
9
+ export declare const parseMoov: ({ iterator, offset, size, options, signal, }: {
10
10
  iterator: BufferIterator;
11
11
  offset: number;
12
12
  size: number;
13
13
  options: ParserContext;
14
+ signal: AbortSignal | null;
14
15
  }) => Promise<MoovBox>;
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.parseMoov = void 0;
4
4
  const process_box_1 = require("../process-box");
5
- const parseMoov = async ({ iterator, offset, size, options, }) => {
5
+ const parseMoov = async ({ iterator, offset, size, options, signal, }) => {
6
6
  const children = await (0, process_box_1.parseBoxes)({
7
7
  iterator,
8
8
  maxBytes: size - (iterator.counter.getOffset() - offset),
@@ -11,6 +11,7 @@ const parseMoov = async ({ iterator, offset, size, options, }) => {
11
11
  options,
12
12
  continueMdat: false,
13
13
  littleEndian: false,
14
+ signal,
14
15
  });
15
16
  if (children.status === 'incomplete') {
16
17
  throw new Error('Incomplete boxes are not allowed');
@@ -2,21 +2,23 @@ import type { BufferIterator } from '../../buffer-iterator';
2
2
  import type { AnySegment, IsoBaseMediaBox, ParseResult } from '../../parse-result';
3
3
  import type { BoxAndNext, PartialMdatBox } from '../../parse-video';
4
4
  import type { ParserContext } from '../../parser-context';
5
- export declare const parseMdatPartially: ({ iterator, boxSize, fileOffset, parsedBoxes, options, }: {
5
+ export declare const parseMdatPartially: ({ iterator, boxSize, fileOffset, parsedBoxes, options, signal, }: {
6
6
  iterator: BufferIterator;
7
7
  boxSize: number;
8
8
  fileOffset: number;
9
9
  parsedBoxes: AnySegment[];
10
10
  options: ParserContext;
11
+ signal: AbortSignal | null;
11
12
  }) => Promise<BoxAndNext>;
12
- export declare const processBox: ({ iterator, allowIncompleteBoxes, parsedBoxes, options, littleEndian, }: {
13
+ export declare const processBox: ({ iterator, allowIncompleteBoxes, parsedBoxes, options, littleEndian, signal, }: {
13
14
  iterator: BufferIterator;
14
15
  allowIncompleteBoxes: boolean;
15
16
  parsedBoxes: AnySegment[];
16
17
  options: ParserContext;
17
18
  littleEndian: boolean;
19
+ signal: AbortSignal | null;
18
20
  }) => Promise<BoxAndNext>;
19
- export declare const parseBoxes: ({ iterator, maxBytes, allowIncompleteBoxes, initialBoxes, options, continueMdat, littleEndian, }: {
21
+ export declare const parseBoxes: ({ iterator, maxBytes, allowIncompleteBoxes, initialBoxes, options, continueMdat, littleEndian, signal, }: {
20
22
  iterator: BufferIterator;
21
23
  maxBytes: number;
22
24
  allowIncompleteBoxes: boolean;
@@ -24,4 +26,5 @@ export declare const parseBoxes: ({ iterator, maxBytes, allowIncompleteBoxes, in
24
26
  options: ParserContext;
25
27
  continueMdat: false | PartialMdatBox;
26
28
  littleEndian: boolean;
29
+ signal: AbortSignal | null;
27
30
  }) => Promise<ParseResult>;
@@ -2,7 +2,6 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.parseBoxes = exports.processBox = exports.parseMdatPartially = void 0;
4
4
  const get_tracks_1 = require("../../get-tracks");
5
- const traversal_1 = require("../../traversal");
6
5
  const esds_1 = require("./esds/esds");
7
6
  const ftyp_1 = require("./ftyp");
8
7
  const make_track_1 = require("./make-track");
@@ -27,8 +26,9 @@ const tfdt_1 = require("./tfdt");
27
26
  const tfhd_1 = require("./tfhd");
28
27
  const tkhd_1 = require("./tkhd");
29
28
  const trak_1 = require("./trak/trak");
29
+ const traversal_1 = require("./traversal");
30
30
  const trun_1 = require("./trun");
31
- const getChildren = async ({ boxType, iterator, bytesRemainingInBox, options, littleEndian, }) => {
31
+ const getChildren = async ({ boxType, iterator, bytesRemainingInBox, options, littleEndian, signal, }) => {
32
32
  const parseChildren = boxType === 'mdia' ||
33
33
  boxType === 'minf' ||
34
34
  boxType === 'stbl' ||
@@ -46,6 +46,7 @@ const getChildren = async ({ boxType, iterator, bytesRemainingInBox, options, li
46
46
  options,
47
47
  continueMdat: false,
48
48
  littleEndian,
49
+ signal,
49
50
  });
50
51
  if (parsed.status === 'incomplete') {
51
52
  throw new Error('Incomplete boxes are not allowed');
@@ -58,15 +59,17 @@ const getChildren = async ({ boxType, iterator, bytesRemainingInBox, options, li
58
59
  iterator.discard(bytesRemainingInBox);
59
60
  return [];
60
61
  };
61
- const parseMdatPartially = async ({ iterator, boxSize, fileOffset, parsedBoxes, options, }) => {
62
+ const parseMdatPartially = async ({ iterator, boxSize, fileOffset, parsedBoxes, options, signal, }) => {
62
63
  const box = await (0, mdat_1.parseMdat)({
63
64
  data: iterator,
64
65
  size: boxSize,
65
66
  fileOffset,
66
67
  existingBoxes: parsedBoxes,
67
68
  options,
69
+ signal,
70
+ maySkipSampleProcessing: options.supportsContentRange,
68
71
  });
69
- if (box.samplesProcessed &&
72
+ if ((box.status === 'samples-processed' || box.status === 'samples-buffered') &&
70
73
  box.fileOffset + boxSize === iterator.counter.getOffset()) {
71
74
  return {
72
75
  type: 'complete',
@@ -82,7 +85,7 @@ const parseMdatPartially = async ({ iterator, boxSize, fileOffset, parsedBoxes,
82
85
  };
83
86
  };
84
87
  exports.parseMdatPartially = parseMdatPartially;
85
- const processBox = async ({ iterator, allowIncompleteBoxes, parsedBoxes, options, littleEndian, }) => {
88
+ const processBox = async ({ iterator, allowIncompleteBoxes, parsedBoxes, options, littleEndian, signal, }) => {
86
89
  var _a, _b;
87
90
  const fileOffset = iterator.counter.getOffset();
88
91
  const bytesRemaining = iterator.bytesRemaining();
@@ -113,7 +116,8 @@ const processBox = async ({ iterator, allowIncompleteBoxes, parsedBoxes, options
113
116
  const boxSize = boxSizeRaw === 1 ? iterator.getEightByteNumber(littleEndian) : boxSizeRaw;
114
117
  if (bytesRemaining < boxSize) {
115
118
  if (boxType === 'mdat') {
116
- const shouldSkip = options.canSkipVideoData || !(0, get_tracks_1.hasTracks)(parsedBoxes);
119
+ const shouldSkip = (options.canSkipVideoData || !(0, get_tracks_1.hasTracks)(parsedBoxes)) &&
120
+ options.supportsContentRange;
117
121
  if (shouldSkip) {
118
122
  const skipTo = fileOffset + boxSize;
119
123
  const bytesToSkip = skipTo - iterator.counter.getOffset();
@@ -125,7 +129,7 @@ const processBox = async ({ iterator, allowIncompleteBoxes, parsedBoxes, options
125
129
  type: 'mdat-box',
126
130
  boxSize,
127
131
  fileOffset,
128
- samplesProcessed: false,
132
+ status: 'samples-skipped',
129
133
  },
130
134
  size: boxSize,
131
135
  skipTo: fileOffset + boxSize,
@@ -139,6 +143,7 @@ const processBox = async ({ iterator, allowIncompleteBoxes, parsedBoxes, options
139
143
  fileOffset,
140
144
  parsedBoxes,
141
145
  options,
146
+ signal,
142
147
  });
143
148
  }
144
149
  }
@@ -212,6 +217,7 @@ const processBox = async ({ iterator, allowIncompleteBoxes, parsedBoxes, options
212
217
  offset: fileOffset,
213
218
  size: boxSize,
214
219
  options,
220
+ signal,
215
221
  });
216
222
  return {
217
223
  type: 'complete',
@@ -306,6 +312,7 @@ const processBox = async ({ iterator, allowIncompleteBoxes, parsedBoxes, options
306
312
  size: boxSize,
307
313
  options,
308
314
  littleEndian,
315
+ signal,
309
316
  });
310
317
  return {
311
318
  type: 'complete',
@@ -320,6 +327,7 @@ const processBox = async ({ iterator, allowIncompleteBoxes, parsedBoxes, options
320
327
  offset: fileOffset,
321
328
  size: boxSize,
322
329
  options,
330
+ signal,
323
331
  });
324
332
  return {
325
333
  type: 'complete',
@@ -334,6 +342,7 @@ const processBox = async ({ iterator, allowIncompleteBoxes, parsedBoxes, options
334
342
  size: boxSize,
335
343
  offsetAtStart: fileOffset,
336
344
  options,
345
+ signal,
337
346
  });
338
347
  const transformedTrack = (0, make_track_1.makeBaseMediaTrack)(box);
339
348
  if (transformedTrack) {
@@ -449,7 +458,12 @@ const processBox = async ({ iterator, allowIncompleteBoxes, parsedBoxes, options
449
458
  fileOffset,
450
459
  existingBoxes: parsedBoxes,
451
460
  options,
461
+ signal,
462
+ maySkipSampleProcessing: options.supportsContentRange,
452
463
  });
464
+ if (box === null) {
465
+ throw new Error('Unexpected null');
466
+ }
453
467
  return {
454
468
  type: 'complete',
455
469
  box,
@@ -464,6 +478,7 @@ const processBox = async ({ iterator, allowIncompleteBoxes, parsedBoxes, options
464
478
  bytesRemainingInBox,
465
479
  options,
466
480
  littleEndian,
481
+ signal,
467
482
  });
468
483
  return {
469
484
  type: 'complete',
@@ -479,7 +494,7 @@ const processBox = async ({ iterator, allowIncompleteBoxes, parsedBoxes, options
479
494
  };
480
495
  };
481
496
  exports.processBox = processBox;
482
- const parseBoxes = async ({ iterator, maxBytes, allowIncompleteBoxes, initialBoxes, options, continueMdat, littleEndian, }) => {
497
+ const parseBoxes = async ({ iterator, maxBytes, allowIncompleteBoxes, initialBoxes, options, continueMdat, littleEndian, signal, }) => {
483
498
  let boxes = initialBoxes;
484
499
  const initialOffset = iterator.counter.getOffset();
485
500
  const alreadyHasMdat = boxes.find((b) => b.type === 'mdat-box');
@@ -492,6 +507,7 @@ const parseBoxes = async ({ iterator, maxBytes, allowIncompleteBoxes, initialBox
492
507
  fileOffset: continueMdat.fileOffset,
493
508
  parsedBoxes: initialBoxes,
494
509
  options,
510
+ signal,
495
511
  })
496
512
  : await (0, exports.processBox)({
497
513
  iterator,
@@ -499,6 +515,7 @@ const parseBoxes = async ({ iterator, maxBytes, allowIncompleteBoxes, initialBox
499
515
  parsedBoxes: initialBoxes,
500
516
  options,
501
517
  littleEndian,
518
+ signal,
502
519
  });
503
520
  if (result.type === 'incomplete') {
504
521
  if (Number.isFinite(maxBytes)) {
@@ -516,6 +533,7 @@ const parseBoxes = async ({ iterator, maxBytes, allowIncompleteBoxes, initialBox
516
533
  options,
517
534
  continueMdat: false,
518
535
  littleEndian,
536
+ signal,
519
537
  });
520
538
  },
521
539
  skipTo: null,
@@ -534,6 +552,7 @@ const parseBoxes = async ({ iterator, maxBytes, allowIncompleteBoxes, initialBox
534
552
  options,
535
553
  continueMdat: result,
536
554
  littleEndian,
555
+ signal,
537
556
  }));
538
557
  },
539
558
  skipTo: null,
@@ -542,12 +561,19 @@ const parseBoxes = async ({ iterator, maxBytes, allowIncompleteBoxes, initialBox
542
561
  if (result.box.type === 'mdat-box' && alreadyHasMdat) {
543
562
  boxes = boxes.filter((b) => b.type !== 'mdat-box');
544
563
  boxes.push(result.box);
564
+ iterator.allowDiscard();
565
+ if (result.box.status !== 'samples-processed') {
566
+ throw new Error('unexpected');
567
+ }
545
568
  break;
546
569
  }
547
570
  else {
548
571
  boxes.push(result.box);
549
572
  }
550
573
  if (result.skipTo !== null) {
574
+ if (!options.supportsContentRange) {
575
+ throw new Error('Content-Range header is not supported by the reader, but was asked to seek');
576
+ }
551
577
  return {
552
578
  status: 'incomplete',
553
579
  segments: boxes,
@@ -560,30 +586,58 @@ const parseBoxes = async ({ iterator, maxBytes, allowIncompleteBoxes, initialBox
560
586
  options,
561
587
  continueMdat: false,
562
588
  littleEndian,
589
+ signal,
563
590
  });
564
591
  },
565
592
  skipTo: result.skipTo,
566
593
  };
567
594
  }
595
+ if (iterator.bytesRemaining() < 0) {
596
+ return {
597
+ status: 'incomplete',
598
+ segments: boxes,
599
+ continueParsing: () => {
600
+ return (0, exports.parseBoxes)({
601
+ iterator,
602
+ maxBytes,
603
+ allowIncompleteBoxes,
604
+ initialBoxes: boxes,
605
+ options,
606
+ continueMdat: false,
607
+ littleEndian,
608
+ signal,
609
+ });
610
+ },
611
+ skipTo: null,
612
+ };
613
+ }
568
614
  iterator.removeBytesRead();
569
615
  }
570
- const mdatState = (0, traversal_1.hasSkippedMdatProcessing)(boxes);
571
- if (mdatState.skipped && !options.canSkipVideoData) {
616
+ const mdatState = (0, traversal_1.getMdatBox)(boxes);
617
+ const skipped = (mdatState === null || mdatState === void 0 ? void 0 : mdatState.status) === 'samples-skipped' &&
618
+ !options.canSkipVideoData &&
619
+ options.supportsContentRange;
620
+ const buffered = (mdatState === null || mdatState === void 0 ? void 0 : mdatState.status) === 'samples-buffered' && !options.canSkipVideoData;
621
+ if (skipped || buffered) {
572
622
  return {
573
623
  status: 'incomplete',
574
624
  segments: boxes,
575
625
  continueParsing: () => {
626
+ if (buffered) {
627
+ iterator.skipTo(mdatState.fileOffset, false);
628
+ }
576
629
  return (0, exports.parseBoxes)({
577
630
  iterator,
578
631
  maxBytes,
579
- allowIncompleteBoxes,
632
+ allowIncompleteBoxes: false,
580
633
  initialBoxes: boxes,
581
634
  options,
582
635
  continueMdat: false,
583
636
  littleEndian,
637
+ signal,
584
638
  });
585
639
  },
586
- skipTo: mdatState.fileOffset,
640
+ skipTo: skipped ? mdatState.fileOffset : null,
587
641
  };
588
642
  }
589
643
  return {
@@ -1,7 +1,7 @@
1
1
  import type { BufferIterator } from '../../../buffer-iterator';
2
2
  export interface AvccBox {
3
3
  type: 'avcc-box';
4
- description: Uint8Array;
4
+ privateData: Uint8Array;
5
5
  configurationString: string;
6
6
  }
7
7
  export declare const parseAvcc: ({ data, size, }: {
@@ -11,10 +11,10 @@ const parseAvcc = ({ data, size, }) => {
11
11
  const level = data.getUint8();
12
12
  const str = `${profile.toString(16).padStart(2, '0')}${profileCompatibility.toString(16).padStart(2, '0')}${level.toString(16).padStart(2, '0')}`;
13
13
  data.counter.decrement(4);
14
- const description = data.getSlice(size - 8);
14
+ const privateData = data.getSlice(size - 8);
15
15
  return {
16
16
  type: 'avcc-box',
17
- description,
17
+ privateData,
18
18
  configurationString: str,
19
19
  };
20
20
  };
@@ -13,12 +13,9 @@ const parseCtts = ({ iterator, offset, size, }) => {
13
13
  const sampleCount = iterator.getUint32();
14
14
  // V1 = signed, V0 = unsigned
15
15
  // however some files are buggy
16
- // Let's do the same thing as mp4box but uint32, based on our test set of videos
16
+ // Let's do the same thing as mp4box
17
17
  // https://github.com/gpac/mp4box.js/blob/c6cc468145bc5b031b866446111f29c8b620dbe6/src/parsing/ctts.js#L2
18
- const sampleOffset = iterator.getUint32();
19
- if (sampleOffset < 0) {
20
- throw new Error('ctts box uses negative values without using version 1');
21
- }
18
+ const sampleOffset = iterator.getInt32();
22
19
  entries.push({
23
20
  sampleCount,
24
21
  sampleOffset,
@@ -1,7 +1,7 @@
1
1
  import type { BufferIterator } from '../../../buffer-iterator';
2
2
  export interface HvccBox {
3
3
  type: 'hvcc-box';
4
- data: Uint8Array;
4
+ privateData: Uint8Array;
5
5
  configurationString: string;
6
6
  }
7
7
  export declare const parseHvcc: ({ data, size, offset, }: {
@@ -3,14 +3,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.parseHvcc = void 0;
4
4
  const make_hvc1_codec_strings_1 = require("../../../make-hvc1-codec-strings");
5
5
  const parseHvcc = ({ data, size, offset, }) => {
6
- const raw = data.getSlice(size - 8);
6
+ const privateData = data.getSlice(size - 8);
7
7
  data.counter.decrement(size - 8);
8
8
  const constraintString = (0, make_hvc1_codec_strings_1.getHvc1CodecString)(data);
9
9
  const remaining = size - (data.counter.getOffset() - offset);
10
10
  data.discard(remaining);
11
11
  return {
12
12
  type: 'hvcc-box',
13
- data: raw,
13
+ privateData,
14
14
  configurationString: constraintString,
15
15
  };
16
16
  };
@@ -8,10 +8,11 @@ export interface MebxBox extends BaseBox {
8
8
  format: string;
9
9
  children: AnySegment[];
10
10
  }
11
- export declare const parseMebx: ({ iterator, offset, size, options, littleEndian, }: {
11
+ export declare const parseMebx: ({ iterator, offset, size, options, littleEndian, signal, }: {
12
12
  iterator: BufferIterator;
13
13
  offset: number;
14
14
  size: number;
15
15
  options: ParserContext;
16
16
  littleEndian: boolean;
17
+ signal: AbortSignal | null;
17
18
  }) => Promise<MebxBox>;
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.parseMebx = void 0;
4
4
  const process_box_1 = require("../process-box");
5
- const parseMebx = async ({ iterator, offset, size, options, littleEndian, }) => {
5
+ const parseMebx = async ({ iterator, offset, size, options, littleEndian, signal, }) => {
6
6
  // reserved, 6 bit
7
7
  iterator.discard(6);
8
8
  const dataReferenceIndex = iterator.getUint16();
@@ -14,6 +14,7 @@ const parseMebx = async ({ iterator, offset, size, options, littleEndian, }) =>
14
14
  options,
15
15
  continueMdat: false,
16
16
  littleEndian,
17
+ signal,
17
18
  });
18
19
  if (children.status === 'incomplete') {
19
20
  throw new Error('Incomplete boxes are not allowed');
@@ -48,13 +48,15 @@ export type Sample = AudioSample | VideoSample | UnknownSample;
48
48
  type SampleAndNext = {
49
49
  sample: Sample | null;
50
50
  };
51
- export declare const processSample: ({ iterator, options, }: {
51
+ export declare const processSample: ({ iterator, options, signal, }: {
52
52
  iterator: BufferIterator;
53
53
  options: ParserContext;
54
+ signal: AbortSignal | null;
54
55
  }) => Promise<SampleAndNext>;
55
- export declare const parseSamples: ({ iterator, maxBytes, options, }: {
56
+ export declare const parseSamples: ({ iterator, maxBytes, options, signal, }: {
56
57
  iterator: BufferIterator;
57
58
  maxBytes: number;
58
59
  options: ParserContext;
60
+ signal: AbortSignal | null;
59
61
  }) => Promise<Sample[]>;
60
62
  export {};