@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
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getTrackByNumber = exports.getTrackTimestampScale = exports.getTrackCodec = exports.getTrackNumber = exports.getMainSegment = void 0;
3
+ exports.getClusterSegment = exports.getPrivateData = exports.getBitDepth = exports.getNumberOfChannels = exports.getSampleRate = exports.getAudioSegment = exports.getVideoSegment = exports.getTimescaleSegment = exports.getTracksSegment = exports.getDisplayWidthSegment = exports.getHeightSegment = exports.getWidthSegment = exports.getTrackTypeSegment = exports.getDisplayHeightSegment = exports.getRangeSegment = exports.getPrimariesSegment = exports.getMatrixCoefficientsSegment = exports.getTransferCharacteristicsSegment = exports.getColourSegment = exports.getCodecSegment = exports.getTrackId = exports.getTrackByNumber = exports.getTrackTimestampScale = exports.getTrackCodec = exports.getTrackNumber = exports.getMainSegment = void 0;
4
4
  const getMainSegment = (segments) => {
5
5
  return segments.find((s) => s.type === 'Segment');
6
6
  };
@@ -34,3 +34,216 @@ const getTrackByNumber = (tracks, id) => {
34
34
  });
35
35
  };
36
36
  exports.getTrackByNumber = getTrackByNumber;
37
+ const getTrackId = (track) => {
38
+ const trackId = track.value.find((b) => b.type === 'TrackNumber');
39
+ if (!trackId || trackId.type !== 'TrackNumber') {
40
+ throw new Error('Expected track number segment');
41
+ }
42
+ return trackId.value.value;
43
+ };
44
+ exports.getTrackId = getTrackId;
45
+ const getCodecSegment = (track) => {
46
+ const codec = track.value.find((b) => b.type === 'CodecID');
47
+ if (!codec || codec.type !== 'CodecID') {
48
+ return null;
49
+ }
50
+ return codec;
51
+ };
52
+ exports.getCodecSegment = getCodecSegment;
53
+ const getColourSegment = (track) => {
54
+ const videoSegment = (0, exports.getVideoSegment)(track);
55
+ if (!videoSegment) {
56
+ return null;
57
+ }
58
+ const colour = videoSegment.value.find((b) => b.type === 'Colour');
59
+ if (!colour || colour.type !== 'Colour') {
60
+ return null;
61
+ }
62
+ return colour;
63
+ };
64
+ exports.getColourSegment = getColourSegment;
65
+ const getTransferCharacteristicsSegment = (color) => {
66
+ if (!color || color.type !== 'Colour') {
67
+ return null;
68
+ }
69
+ const box = color.value.find((b) => b.type === 'TransferCharacteristics');
70
+ if (!box || box.type !== 'TransferCharacteristics') {
71
+ return null;
72
+ }
73
+ return box;
74
+ };
75
+ exports.getTransferCharacteristicsSegment = getTransferCharacteristicsSegment;
76
+ const getMatrixCoefficientsSegment = (color) => {
77
+ if (!color || color.type !== 'Colour') {
78
+ return null;
79
+ }
80
+ const box = color.value.find((b) => b.type === 'MatrixCoefficients');
81
+ if (!box || box.type !== 'MatrixCoefficients') {
82
+ return null;
83
+ }
84
+ return box;
85
+ };
86
+ exports.getMatrixCoefficientsSegment = getMatrixCoefficientsSegment;
87
+ const getPrimariesSegment = (color) => {
88
+ if (!color || color.type !== 'Colour') {
89
+ return null;
90
+ }
91
+ const box = color.value.find((b) => b.type === 'Primaries');
92
+ if (!box || box.type !== 'Primaries') {
93
+ return null;
94
+ }
95
+ return box;
96
+ };
97
+ exports.getPrimariesSegment = getPrimariesSegment;
98
+ const getRangeSegment = (color) => {
99
+ if (!color || color.type !== 'Colour') {
100
+ return null;
101
+ }
102
+ const box = color.value.find((b) => b.type === 'Range');
103
+ if (!box || box.type !== 'Range') {
104
+ return null;
105
+ }
106
+ return box;
107
+ };
108
+ exports.getRangeSegment = getRangeSegment;
109
+ const getDisplayHeightSegment = (track) => {
110
+ const videoSegment = (0, exports.getVideoSegment)(track);
111
+ if (!videoSegment) {
112
+ return null;
113
+ }
114
+ const displayHeight = videoSegment.value.find((b) => b.type === 'DisplayHeight');
115
+ if (!displayHeight || displayHeight.type !== 'DisplayHeight') {
116
+ return null;
117
+ }
118
+ return displayHeight;
119
+ };
120
+ exports.getDisplayHeightSegment = getDisplayHeightSegment;
121
+ const getTrackTypeSegment = (track) => {
122
+ const trackType = track.value.find((b) => b.type === 'TrackType');
123
+ if (!trackType || trackType.type !== 'TrackType') {
124
+ return null;
125
+ }
126
+ return trackType;
127
+ };
128
+ exports.getTrackTypeSegment = getTrackTypeSegment;
129
+ const getWidthSegment = (track) => {
130
+ const videoSegment = (0, exports.getVideoSegment)(track);
131
+ if (!videoSegment) {
132
+ return null;
133
+ }
134
+ const width = videoSegment.value.find((b) => b.type === 'PixelWidth');
135
+ if (!width || width.type !== 'PixelWidth') {
136
+ return null;
137
+ }
138
+ return width;
139
+ };
140
+ exports.getWidthSegment = getWidthSegment;
141
+ const getHeightSegment = (track) => {
142
+ const videoSegment = (0, exports.getVideoSegment)(track);
143
+ if (!videoSegment) {
144
+ return null;
145
+ }
146
+ const height = videoSegment.value.find((b) => b.type === 'PixelHeight');
147
+ if (!height || height.type !== 'PixelHeight') {
148
+ return null;
149
+ }
150
+ return height;
151
+ };
152
+ exports.getHeightSegment = getHeightSegment;
153
+ const getDisplayWidthSegment = (track) => {
154
+ const videoSegment = (0, exports.getVideoSegment)(track);
155
+ if (!videoSegment) {
156
+ return null;
157
+ }
158
+ const displayWidth = videoSegment.value.find((b) => b.type === 'DisplayWidth');
159
+ if (!displayWidth || displayWidth.type !== 'DisplayWidth') {
160
+ return null;
161
+ }
162
+ return displayWidth;
163
+ };
164
+ exports.getDisplayWidthSegment = getDisplayWidthSegment;
165
+ const getTracksSegment = (segment) => {
166
+ const tracksSegment = segment.value.find((b) => b.type === 'Tracks');
167
+ if (!tracksSegment || tracksSegment.type !== 'Tracks') {
168
+ return null;
169
+ }
170
+ return tracksSegment;
171
+ };
172
+ exports.getTracksSegment = getTracksSegment;
173
+ const getTimescaleSegment = (segment) => {
174
+ const infoSegment = segment.value.find((b) => b.type === 'Info');
175
+ if (!infoSegment || infoSegment.type !== 'Info') {
176
+ return null;
177
+ }
178
+ const timescale = infoSegment.value.find((b) => b.type === 'TimestampScale');
179
+ if (!timescale || timescale.type !== 'TimestampScale') {
180
+ return null;
181
+ }
182
+ return timescale;
183
+ };
184
+ exports.getTimescaleSegment = getTimescaleSegment;
185
+ const getVideoSegment = (track) => {
186
+ const videoSegment = track.value.find((b) => b.type === 'Video');
187
+ if (!videoSegment || videoSegment.type !== 'Video') {
188
+ return null;
189
+ }
190
+ return videoSegment !== null && videoSegment !== void 0 ? videoSegment : null;
191
+ };
192
+ exports.getVideoSegment = getVideoSegment;
193
+ const getAudioSegment = (track) => {
194
+ const audioSegment = track.value.find((b) => b.type === 'Audio');
195
+ if (!audioSegment || audioSegment.type !== 'Audio') {
196
+ return null;
197
+ }
198
+ return audioSegment !== null && audioSegment !== void 0 ? audioSegment : null;
199
+ };
200
+ exports.getAudioSegment = getAudioSegment;
201
+ const getSampleRate = (track) => {
202
+ const audioSegment = (0, exports.getAudioSegment)(track);
203
+ if (!audioSegment) {
204
+ return null;
205
+ }
206
+ const samplingFrequency = audioSegment.value.find((b) => b.type === 'SamplingFrequency');
207
+ if (!samplingFrequency || samplingFrequency.type !== 'SamplingFrequency') {
208
+ return null;
209
+ }
210
+ return samplingFrequency.value.value;
211
+ };
212
+ exports.getSampleRate = getSampleRate;
213
+ const getNumberOfChannels = (track) => {
214
+ const audioSegment = (0, exports.getAudioSegment)(track);
215
+ if (!audioSegment) {
216
+ throw new Error('Could not find audio segment');
217
+ }
218
+ const channels = audioSegment.value.find((b) => b.type === 'Channels');
219
+ if (!channels || channels.type !== 'Channels') {
220
+ return 1;
221
+ }
222
+ return channels.value.value;
223
+ };
224
+ exports.getNumberOfChannels = getNumberOfChannels;
225
+ const getBitDepth = (track) => {
226
+ const audioSegment = (0, exports.getAudioSegment)(track);
227
+ if (!audioSegment) {
228
+ return null;
229
+ }
230
+ const bitDepth = audioSegment.value.find((b) => b.type === 'BitDepth');
231
+ if (!bitDepth || bitDepth.type !== 'BitDepth') {
232
+ return null;
233
+ }
234
+ return bitDepth.value.value;
235
+ };
236
+ exports.getBitDepth = getBitDepth;
237
+ const getPrivateData = (track) => {
238
+ const privateData = track.value.find((b) => b.type === 'CodecPrivate');
239
+ if (!privateData || privateData.type !== 'CodecPrivate') {
240
+ return null;
241
+ }
242
+ return privateData.value;
243
+ };
244
+ exports.getPrivateData = getPrivateData;
245
+ const getClusterSegment = (segment) => {
246
+ const clusterSegment = segment.value.find((b) => b.type === 'Cluster');
247
+ return clusterSegment !== null && clusterSegment !== void 0 ? clusterSegment : null;
248
+ };
249
+ exports.getClusterSegment = getClusterSegment;
@@ -5,13 +5,14 @@ export declare class OffsetCounter {
5
5
  getOffset(): number;
6
6
  getDiscardedOffset(): number;
7
7
  setDiscardedOffset(offset: number): void;
8
+ getDiscardedBytes(): number;
8
9
  discardBytes(amount: number): void;
9
10
  decrement(amount: number): void;
10
11
  }
11
12
  export declare const getArrayBufferIterator: (initialData: Uint8Array, maxBytes: number | null) => {
12
13
  startReadingBits: () => void;
13
14
  stopReadingBits: () => void;
14
- skipTo: (offset: number) => void;
15
+ skipTo: (offset: number, reset: boolean) => void;
15
16
  addData: (newData: Uint8Array) => void;
16
17
  counter: OffsetCounter;
17
18
  peekB: (length: number) => void;
@@ -53,5 +54,7 @@ export declare const getArrayBufferIterator: (initialData: Uint8Array, maxBytes:
53
54
  getInt32: () => number;
54
55
  destroy: () => void;
55
56
  isMp3: () => boolean;
57
+ disallowDiscard: () => void;
58
+ allowDiscard: () => void;
56
59
  };
57
60
  export type BufferIterator = ReturnType<typeof getArrayBufferIterator>;
@@ -37,6 +37,9 @@ class OffsetCounter {
37
37
  setDiscardedOffset(offset) {
38
38
  __classPrivateFieldSet(this, _OffsetCounter_discardedBytes, offset, "f");
39
39
  }
40
+ getDiscardedBytes() {
41
+ return __classPrivateFieldGet(this, _OffsetCounter_discardedBytes, "f");
42
+ }
40
43
  discardBytes(amount) {
41
44
  __classPrivateFieldSet(this, _OffsetCounter_discardedBytes, __classPrivateFieldGet(this, _OffsetCounter_discardedBytes, "f") + amount, "f");
42
45
  }
@@ -73,11 +76,18 @@ const getArrayBufferIterator = (initialData, maxBytes) => {
73
76
  data.set(initialData);
74
77
  let view = new DataView(data.buffer);
75
78
  const counter = makeOffsetCounter();
79
+ let discardAllowed = true;
76
80
  const getSlice = (amount) => {
77
81
  const value = data.slice(counter.getDiscardedOffset(), counter.getDiscardedOffset() + amount);
78
82
  counter.increment(amount);
79
83
  return value;
80
84
  };
85
+ const disallowDiscard = () => {
86
+ discardAllowed = false;
87
+ };
88
+ const allowDiscard = () => {
89
+ discardAllowed = true;
90
+ };
81
91
  const getUint8 = () => {
82
92
  const val = view.getUint8(counter.getDiscardedOffset());
83
93
  counter.increment(1);
@@ -191,8 +201,11 @@ const getArrayBufferIterator = (initialData, maxBytes) => {
191
201
  return matchesPattern(mpegPattern)(data.subarray(0, 4));
192
202
  };
193
203
  const removeBytesRead = () => {
204
+ if (!discardAllowed) {
205
+ return;
206
+ }
194
207
  const bytesToRemove = counter.getDiscardedOffset();
195
- // Only to this operation if it is really worth it 😇
208
+ // Only do this operation if it is really worth it 😇
196
209
  if (bytesToRemove < 100000) {
197
210
  return;
198
211
  }
@@ -202,12 +215,23 @@ const getArrayBufferIterator = (initialData, maxBytes) => {
202
215
  buf.resize(newData.byteLength);
203
216
  view = new DataView(data.buffer);
204
217
  };
205
- const skipTo = (offset) => {
218
+ const skipTo = (offset, reset) => {
206
219
  const becomesSmaller = offset < counter.getOffset();
207
220
  if (becomesSmaller) {
208
- buf.resize(0);
209
- counter.decrement(counter.getOffset() - offset);
210
- counter.setDiscardedOffset(offset);
221
+ if (reset) {
222
+ buf.resize(0);
223
+ counter.decrement(counter.getOffset() - offset);
224
+ counter.setDiscardedOffset(offset);
225
+ }
226
+ else {
227
+ const toDecrement = counter.getOffset() - offset;
228
+ const newOffset = counter.getOffset() - toDecrement;
229
+ counter.decrement(toDecrement);
230
+ const c = counter.getDiscardedBytes();
231
+ if (c > newOffset) {
232
+ throw new Error('already discarded too many bytes');
233
+ }
234
+ }
211
235
  }
212
236
  else {
213
237
  const currentOffset = counter.getOffset();
@@ -452,6 +476,8 @@ const getArrayBufferIterator = (initialData, maxBytes) => {
452
476
  getInt32,
453
477
  destroy,
454
478
  isMp3,
479
+ disallowDiscard,
480
+ allowDiscard,
455
481
  };
456
482
  };
457
483
  exports.getArrayBufferIterator = getArrayBufferIterator;
@@ -26,8 +26,6 @@ const makeSimpleBlock = ({ bytes, trackNumber, timecodeRelativeToCluster, keyfra
26
26
  const headerByte = (Number(keyframe) << 7) | (Number(invisible) << 3) | (lacing << 1);
27
27
  const body = (0, make_header_1.combineUint8Arrays)([
28
28
  (0, ebml_1.getVariableInt)(trackNumber, null),
29
- // TODO: Cannot encode long videos because of uint16 overflow
30
- // need to make new cluster
31
29
  (0, make_header_1.serializeUint16)(timecodeRelativeToCluster),
32
30
  new Uint8Array([headerByte]),
33
31
  bytes,
@@ -1,5 +1,19 @@
1
1
  import type { Writer } from '../writers/writer';
2
+ export type AudioOrVideoSample = {
3
+ timestamp: number;
4
+ type: 'key' | 'delta';
5
+ copyTo(destination: AllowSharedBufferSource): void;
6
+ byteLength: number;
7
+ duration: number | null;
8
+ };
9
+ export declare const timestampToClusterTimestamp: (timestamp: number) => number;
2
10
  export declare const makeCluster: (w: Writer, timestamp: number) => Promise<{
3
- addSample: (chunk: EncodedVideoChunk, trackNumber: number) => Promise<void>;
4
- shouldMakeNewCluster: (chunk: EncodedVideoChunk) => boolean;
11
+ addSample: (chunk: AudioOrVideoSample, trackNumber: number) => Promise<{
12
+ timecodeRelativeToCluster: number;
13
+ }>;
14
+ shouldMakeNewCluster: ({ isVideo, keyframe, newT, }: {
15
+ newT: number;
16
+ keyframe: boolean;
17
+ isVideo: boolean;
18
+ }) => boolean;
5
19
  }>;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.makeCluster = void 0;
3
+ exports.makeCluster = exports.timestampToClusterTimestamp = void 0;
4
4
  const ebml_1 = require("../boxes/webm/ebml");
5
5
  const make_header_1 = require("../boxes/webm/make-header");
6
6
  const all_segments_1 = require("../boxes/webm/segments/all-segments");
@@ -10,20 +10,26 @@ const maxClusterTimestamp = 2 ** 15;
10
10
  const timestampToClusterTimestamp = (timestamp) => {
11
11
  return Math.round((timestamp / timescale_1.CREATE_TIME_SCALE) * 1000);
12
12
  };
13
+ exports.timestampToClusterTimestamp = timestampToClusterTimestamp;
13
14
  const makeCluster = async (w, timestamp) => {
14
- const cluster = (0, cluster_segment_1.createClusterSegment)(timestampToClusterTimestamp(timestamp));
15
+ const cluster = (0, cluster_segment_1.createClusterSegment)((0, exports.timestampToClusterTimestamp)(timestamp));
15
16
  const clusterVIntPosition = w.getWrittenByteCount() +
16
17
  cluster.offsets.offset +
17
18
  (0, make_header_1.matroskaToHex)(all_segments_1.matroskaElements.Cluster).byteLength;
18
- let clusterSize = cluster.bytes.byteLength;
19
+ let clusterSize = cluster.bytes.byteLength -
20
+ (0, make_header_1.matroskaToHex)(all_segments_1.matroskaElements.Cluster).byteLength -
21
+ cluster_segment_1.CLUSTER_MIN_VINT_WIDTH;
19
22
  await w.write(cluster.bytes);
20
23
  const addSample = async (chunk, trackNumber) => {
21
24
  const arr = new Uint8Array(chunk.byteLength);
22
25
  chunk.copyTo(arr);
23
- const timecodeRelativeToCluster = timestampToClusterTimestamp(chunk.timestamp) -
24
- timestampToClusterTimestamp(timestamp);
26
+ const timecodeRelativeToCluster = (0, exports.timestampToClusterTimestamp)(chunk.timestamp) -
27
+ (0, exports.timestampToClusterTimestamp)(timestamp);
28
+ if (timecodeRelativeToCluster < 0) {
29
+ throw new Error(`timecodeRelativeToCluster is negative (track ${trackNumber})`);
30
+ }
25
31
  if (timecodeRelativeToCluster > maxClusterTimestamp) {
26
- throw new Error('timecodeRelativeToCluster is too big');
32
+ throw new Error(`timecodeRelativeToCluster is too big: ${timecodeRelativeToCluster} > ${maxClusterTimestamp}`);
27
33
  }
28
34
  const keyframe = chunk.type === 'key';
29
35
  const simpleBlock = (0, cluster_segment_1.makeSimpleBlock)({
@@ -37,11 +43,12 @@ const makeCluster = async (w, timestamp) => {
37
43
  clusterSize += simpleBlock.byteLength;
38
44
  await w.updateDataAt(clusterVIntPosition, (0, ebml_1.getVariableInt)(clusterSize, cluster_segment_1.CLUSTER_MIN_VINT_WIDTH));
39
45
  await w.write(simpleBlock);
46
+ return { timecodeRelativeToCluster };
40
47
  };
41
- const shouldMakeNewCluster = (chunk) => {
42
- const newTimestamp = timestampToClusterTimestamp(chunk.timestamp);
43
- const oldTimestamp = timestampToClusterTimestamp(timestamp);
44
- return newTimestamp - oldTimestamp >= 2000 && chunk.type === 'key';
48
+ const shouldMakeNewCluster = ({ isVideo, keyframe, newT, }) => {
49
+ const newTimestamp = (0, exports.timestampToClusterTimestamp)(newT);
50
+ const oldTimestamp = (0, exports.timestampToClusterTimestamp)(timestamp);
51
+ return newTimestamp - oldTimestamp >= 2000 && keyframe && isVideo;
45
52
  };
46
53
  return { addSample, shouldMakeNewCluster };
47
54
  };
@@ -1,8 +1,10 @@
1
1
  import type { WriterInterface } from '../writers/writer';
2
+ import type { AudioOrVideoSample } from './cluster';
2
3
  import type { MakeTrackAudio, MakeTrackVideo } from './matroska-trackentry';
3
4
  export type MediaFn = {
4
- save: () => Promise<void>;
5
- addSample: (chunk: EncodedVideoChunk, trackNumber: number) => Promise<void>;
5
+ save: () => Promise<File>;
6
+ remove: () => Promise<void>;
7
+ addSample: (chunk: AudioOrVideoSample, trackNumber: number, isVideo: boolean) => Promise<void>;
6
8
  updateDuration: (duration: number) => Promise<void>;
7
9
  addTrack: (track: Omit<MakeTrackAudio, 'trackNumber'> | Omit<MakeTrackVideo, 'trackNumber'>) => Promise<{
8
10
  trackNumber: number;
@@ -1,16 +1,20 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createMedia = void 0;
4
+ const ebml_1 = require("../boxes/webm/ebml");
4
5
  const make_header_1 = require("../boxes/webm/make-header");
6
+ const all_segments_1 = require("../boxes/webm/segments/all-segments");
5
7
  const cluster_1 = require("./cluster");
6
8
  const make_duration_with_padding_1 = require("./make-duration-with-padding");
9
+ const matroska_cues_1 = require("./matroska-cues");
7
10
  const matroska_header_1 = require("./matroska-header");
8
11
  const matroska_info_1 = require("./matroska-info");
12
+ const matroska_seek_1 = require("./matroska-seek");
9
13
  const matroska_segment_1 = require("./matroska-segment");
10
14
  const matroska_trackentry_1 = require("./matroska-trackentry");
11
15
  const timescale_1 = require("./timescale");
12
16
  const createMedia = async (writer) => {
13
- var _a, _b, _c, _d;
17
+ var _a, _b, _c, _d, _e, _f, _g;
14
18
  const header = (0, matroska_header_1.makeMatroskaHeader)();
15
19
  const w = await writer.createContent();
16
20
  await w.write(header.bytes);
@@ -18,68 +22,143 @@ const createMedia = async (writer) => {
18
22
  timescale: timescale_1.CREATE_TIME_SCALE,
19
23
  });
20
24
  const currentTracks = [];
21
- const matroskaTracks = (0, matroska_trackentry_1.makeMatroskaTracks)(currentTracks);
25
+ const seeks = [];
26
+ const cues = [];
27
+ const trackNumbers = [];
22
28
  const matroskaSegment = (0, matroska_segment_1.createMatroskaSegment)([
29
+ ...(0, matroska_seek_1.createMatroskaSeekHead)(seeks),
23
30
  matroskaInfo,
24
- ...matroskaTracks,
31
+ ...(0, matroska_trackentry_1.makeMatroskaTracks)(currentTracks),
25
32
  ]);
26
- const durationOffset = ((_b = (_a = matroskaSegment.offsets.children[0].children.find((c) => c.field === 'Duration')) === null || _a === void 0 ? void 0 : _a.offset) !== null && _b !== void 0 ? _b : 0) + w.getWrittenByteCount();
33
+ const infoSegment = matroskaSegment.offsets.children.find((o) => o.field === 'Info');
34
+ const durationOffset = ((_b = (_a = infoSegment === null || infoSegment === void 0 ? void 0 : infoSegment.children.find((c) => c.field === 'Duration')) === null || _a === void 0 ? void 0 : _a.offset) !== null && _b !== void 0 ? _b : 0) +
35
+ w.getWrittenByteCount();
27
36
  const tracksOffset = ((_d = (_c = matroskaSegment.offsets.children.find((o) => o.field === 'Tracks')) === null || _c === void 0 ? void 0 : _c.offset) !== null && _d !== void 0 ? _d : 0) + w.getWrittenByteCount();
37
+ const seekHeadOffset = ((_f = (_e = matroskaSegment.offsets.children.find((o) => o.field === 'SeekHead')) === null || _e === void 0 ? void 0 : _e.offset) !== null && _f !== void 0 ? _f : 0) + w.getWrittenByteCount();
38
+ const infoOffset = ((_g = infoSegment === null || infoSegment === void 0 ? void 0 : infoSegment.offset) !== null && _g !== void 0 ? _g : 0) + w.getWrittenByteCount();
39
+ if (!seekHeadOffset) {
40
+ throw new Error('could not get seek offset');
41
+ }
28
42
  if (!durationOffset) {
29
43
  throw new Error('could not get duration offset');
30
44
  }
31
45
  if (!tracksOffset) {
32
46
  throw new Error('could not get tracks offset');
33
47
  }
48
+ if (!infoOffset) {
49
+ throw new Error('could not get tracks offset');
50
+ }
51
+ seeks.push({
52
+ hexString: all_segments_1.matroskaElements.Info,
53
+ byte: infoOffset - seekHeadOffset,
54
+ });
55
+ seeks.push({
56
+ hexString: all_segments_1.matroskaElements.Tracks,
57
+ byte: tracksOffset - seekHeadOffset,
58
+ });
59
+ const updateSeekWrite = async () => {
60
+ const updatedSeek = (0, matroska_seek_1.createMatroskaSeekHead)(seeks);
61
+ await w.updateDataAt(seekHeadOffset, (0, make_header_1.combineUint8Arrays)(updatedSeek.map((b) => b.bytes)));
62
+ };
63
+ const segmentOffset = w.getWrittenByteCount();
64
+ const updateSegmentSize = async (size) => {
65
+ const data = (0, ebml_1.getVariableInt)(size, matroska_segment_1.MATROSKA_SEGMENT_MIN_VINT_WIDTH);
66
+ await w.updateDataAt(segmentOffset + (0, make_header_1.matroskaToHex)(all_segments_1.matroskaElements.Segment).byteLength, data);
67
+ };
34
68
  await w.write(matroskaSegment.bytes);
69
+ const clusterOffset = w.getWrittenByteCount();
35
70
  let currentCluster = await (0, cluster_1.makeCluster)(w, 0);
36
- const getClusterOrMakeNew = async (chunk) => {
37
- if (!currentCluster.shouldMakeNewCluster(chunk)) {
38
- return currentCluster;
71
+ seeks.push({
72
+ hexString: all_segments_1.matroskaElements.Cluster,
73
+ byte: clusterOffset - seekHeadOffset,
74
+ });
75
+ const trackNumberProgresses = {};
76
+ const getClusterOrMakeNew = async ({ chunk, isVideo, }) => {
77
+ const smallestProgress = Math.min(...Object.values(trackNumberProgresses));
78
+ if (!currentCluster.shouldMakeNewCluster({
79
+ newT: smallestProgress,
80
+ keyframe: chunk.type === 'key',
81
+ isVideo,
82
+ })) {
83
+ return { cluster: currentCluster, isNew: false, smallestProgress };
39
84
  }
40
- currentCluster = await (0, cluster_1.makeCluster)(w, chunk.timestamp);
41
- return currentCluster;
85
+ currentCluster = await (0, cluster_1.makeCluster)(w, smallestProgress);
86
+ return { cluster: currentCluster, isNew: true, smallestProgress };
42
87
  };
43
- const addSample = async (chunk, trackNumber) => {
44
- const cluster = await getClusterOrMakeNew(chunk);
45
- return cluster.addSample(chunk, trackNumber);
88
+ const addSample = async (chunk, trackNumber, isVideo) => {
89
+ var _a;
90
+ trackNumberProgresses[trackNumber] = chunk.timestamp;
91
+ const { cluster, isNew, smallestProgress } = await getClusterOrMakeNew({
92
+ chunk,
93
+ isVideo,
94
+ });
95
+ const newDuration = Math.round((chunk.timestamp + ((_a = chunk.duration) !== null && _a !== void 0 ? _a : 0)) / 1000);
96
+ await updateDuration(newDuration);
97
+ const { timecodeRelativeToCluster } = await cluster.addSample(chunk, trackNumber);
98
+ if (isNew) {
99
+ const newCluster = w.getWrittenByteCount();
100
+ cues.push({
101
+ time: (0, cluster_1.timestampToClusterTimestamp)(smallestProgress) +
102
+ timecodeRelativeToCluster,
103
+ clusterPosition: newCluster - seekHeadOffset,
104
+ trackNumber,
105
+ });
106
+ }
46
107
  };
47
108
  const updateDuration = async (newDuration) => {
48
109
  const blocks = (0, make_duration_with_padding_1.makeDurationWithPadding)(newDuration);
49
- await w.updateDataAt(durationOffset, (0, make_header_1.combineUint8Arrays)(blocks.map((b) => b.bytes)));
110
+ await w.updateDataAt(durationOffset, blocks.bytes);
50
111
  };
51
112
  const addTrack = async (track) => {
52
113
  currentTracks.push(track);
53
114
  const newTracks = (0, matroska_trackentry_1.makeMatroskaTracks)(currentTracks);
54
115
  await w.updateDataAt(tracksOffset, (0, make_header_1.combineUint8Arrays)(newTracks.map((b) => b.bytes)));
55
116
  };
56
- let operationProm = Promise.resolve();
117
+ const operationProm = { current: Promise.resolve() };
57
118
  const waitForFinishPromises = [];
58
119
  return {
59
120
  save: async () => {
60
- await w.save();
121
+ const file = await w.save();
122
+ return file;
123
+ },
124
+ remove: async () => {
125
+ await w.remove();
61
126
  },
62
- addSample: (chunk, trackNumber) => {
63
- operationProm = operationProm.then(() => addSample(chunk, trackNumber));
64
- return operationProm;
127
+ addSample: (chunk, trackNumber, isVideo) => {
128
+ operationProm.current = operationProm.current.then(() => addSample(chunk, trackNumber, isVideo));
129
+ return operationProm.current;
65
130
  },
66
131
  updateDuration: (duration) => {
67
- operationProm = operationProm.then(() => updateDuration(duration));
68
- return operationProm;
132
+ operationProm.current = operationProm.current.then(() => updateDuration(duration));
133
+ return operationProm.current;
69
134
  },
70
135
  addTrack: (track) => {
71
136
  const trackNumber = currentTracks.length + 1;
72
137
  const bytes = track.type === 'video'
73
138
  ? (0, matroska_trackentry_1.makeMatroskaVideoTrackEntryBytes)({ ...track, trackNumber })
74
139
  : (0, matroska_trackentry_1.makeMatroskaAudioTrackEntryBytes)({ ...track, trackNumber });
75
- operationProm = operationProm.then(() => addTrack(bytes));
76
- return operationProm.then(() => ({ trackNumber }));
140
+ operationProm.current = operationProm.current.then(() => addTrack(bytes));
141
+ trackNumbers.push(trackNumber);
142
+ return operationProm.current.then(() => ({ trackNumber }));
77
143
  },
78
144
  addWaitForFinishPromise: (promise) => {
79
145
  waitForFinishPromises.push(promise);
80
146
  },
81
147
  async waitForFinish() {
82
148
  await Promise.all(waitForFinishPromises.map((p) => p()));
149
+ await operationProm.current;
150
+ seeks.push({
151
+ hexString: all_segments_1.matroskaElements.Cues,
152
+ byte: w.getWrittenByteCount() - seekHeadOffset,
153
+ });
154
+ await updateSeekWrite();
155
+ await w.write((0, matroska_cues_1.createMatroskaCues)(cues).bytes);
156
+ await w.waitForFinish();
157
+ const segmentSize = w.getWrittenByteCount() -
158
+ segmentOffset -
159
+ (0, make_header_1.matroskaToHex)(all_segments_1.matroskaElements.Segment).byteLength -
160
+ matroska_segment_1.MATROSKA_SEGMENT_MIN_VINT_WIDTH;
161
+ await updateSegmentSize(segmentSize);
83
162
  },
84
163
  };
85
164
  };
@@ -1 +1 @@
1
- export declare const makeDurationWithPadding: (newDuration: number) => import("../boxes/webm/segments/all-segments").BytesAndOffset[];
1
+ export declare const makeDurationWithPadding: (newDuration: number) => import("../boxes/webm/segments/all-segments").BytesAndOffset;
@@ -3,13 +3,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.makeDurationWithPadding = void 0;
4
4
  const make_header_1 = require("../boxes/webm/make-header");
5
5
  const makeDurationWithPadding = (newDuration) => {
6
- return (0, make_header_1.padMatroskaBytes)({
6
+ return (0, make_header_1.makeMatroskaBytes)({
7
7
  type: 'Duration',
8
8
  value: {
9
9
  value: newDuration,
10
10
  size: '64',
11
11
  },
12
- minVintWidth: null,
13
- }, 100);
12
+ minVintWidth: 8,
13
+ });
14
14
  };
15
15
  exports.makeDurationWithPadding = makeDurationWithPadding;
@@ -0,0 +1,6 @@
1
+ export type Cue = {
2
+ time: number;
3
+ clusterPosition: number;
4
+ trackNumber: number;
5
+ };
6
+ export declare const createMatroskaCues: (cues: Cue[]) => import("../boxes/webm/segments/all-segments").BytesAndOffset;