@remotion/media-parser 4.0.194 → 4.0.196

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (275) hide show
  1. package/dist/add-new-matroska-tracks.d.ts +8 -0
  2. package/dist/add-new-matroska-tracks.js +14 -0
  3. package/dist/av1-codec-string.d.ts +3 -0
  4. package/dist/av1-codec-string.js +91 -0
  5. package/dist/boxes/iso-base-media/esds/decoder-specific-config.d.ts +14 -0
  6. package/dist/boxes/iso-base-media/esds/decoder-specific-config.js +38 -0
  7. package/dist/boxes/iso-base-media/esds/esds-descriptors.d.ts +8 -0
  8. package/dist/boxes/iso-base-media/esds/esds-descriptors.js +22 -2
  9. package/dist/boxes/iso-base-media/ftype.d.ts +9 -0
  10. package/dist/boxes/iso-base-media/ftype.js +31 -0
  11. package/dist/boxes/iso-base-media/make-track.d.ts +3 -0
  12. package/dist/boxes/iso-base-media/make-track.js +112 -0
  13. package/dist/boxes/iso-base-media/mdat/mdat.d.ts +6 -2
  14. package/dist/boxes/iso-base-media/mdat/mdat.js +90 -6
  15. package/dist/boxes/iso-base-media/moov/moov.d.ts +4 -2
  16. package/dist/boxes/iso-base-media/moov/moov.js +4 -2
  17. package/dist/boxes/iso-base-media/mvhd.js +7 -1
  18. package/dist/boxes/iso-base-media/process-box.d.ts +20 -3
  19. package/dist/boxes/iso-base-media/process-box.js +322 -34
  20. package/dist/boxes/iso-base-media/stsd/av1c.d.ts +9 -0
  21. package/dist/boxes/iso-base-media/stsd/av1c.js +10 -0
  22. package/dist/boxes/iso-base-media/stsd/avcc-hvcc.d.ts +20 -0
  23. package/dist/boxes/iso-base-media/stsd/avcc-hvcc.js +73 -0
  24. package/dist/boxes/iso-base-media/stsd/avcc.d.ts +10 -0
  25. package/dist/boxes/iso-base-media/stsd/avcc.js +21 -0
  26. package/dist/boxes/iso-base-media/stsd/colr.d.ts +11 -0
  27. package/dist/boxes/iso-base-media/stsd/colr.js +35 -0
  28. package/dist/boxes/iso-base-media/stsd/ctts.d.ts +19 -0
  29. package/dist/boxes/iso-base-media/stsd/ctts.js +30 -0
  30. package/dist/boxes/iso-base-media/stsd/hvcc.d.ts +11 -0
  31. package/dist/boxes/iso-base-media/stsd/hvcc.js +17 -0
  32. package/dist/boxes/iso-base-media/stsd/keys.js +1 -0
  33. package/dist/boxes/iso-base-media/stsd/mebx.d.ts +4 -2
  34. package/dist/boxes/iso-base-media/stsd/mebx.js +4 -2
  35. package/dist/boxes/iso-base-media/stsd/pasp.d.ts +12 -0
  36. package/dist/boxes/iso-base-media/stsd/pasp.js +17 -0
  37. package/dist/boxes/iso-base-media/stsd/samples.d.ts +12 -5
  38. package/dist/boxes/iso-base-media/stsd/samples.js +27 -10
  39. package/dist/boxes/iso-base-media/stsd/stsd.d.ts +4 -2
  40. package/dist/boxes/iso-base-media/stsd/stsd.js +6 -2
  41. package/dist/boxes/iso-base-media/stsd/stss.d.ts +13 -0
  42. package/dist/boxes/iso-base-media/stsd/stss.js +28 -0
  43. package/dist/boxes/iso-base-media/stsd/stsz.d.ts +9 -3
  44. package/dist/boxes/iso-base-media/stsd/stsz.js +14 -2
  45. package/dist/boxes/iso-base-media/stsd/stts.d.ts +15 -0
  46. package/dist/boxes/iso-base-media/stsd/stts.js +35 -0
  47. package/dist/boxes/iso-base-media/tkhd.d.ts +3 -0
  48. package/dist/boxes/iso-base-media/tkhd.js +41 -14
  49. package/dist/boxes/iso-base-media/trak/trak.d.ts +4 -2
  50. package/dist/boxes/iso-base-media/trak/trak.js +4 -2
  51. package/dist/boxes/iso-base-media/void-box.d.ts +4 -0
  52. package/dist/boxes/iso-base-media/void-box.js +2 -0
  53. package/dist/boxes/webm/allowed-partial-segments.d.ts +1 -0
  54. package/dist/boxes/webm/allowed-partial-segments.js +4 -0
  55. package/dist/boxes/webm/av1-codec-private.d.ts +2 -0
  56. package/dist/boxes/webm/av1-codec-private.js +95 -0
  57. package/dist/boxes/webm/bitstream/av1/bitstream-frame-header.d.ts +14 -0
  58. package/dist/boxes/webm/bitstream/av1/bitstream-frame-header.js +67 -0
  59. package/dist/boxes/webm/bitstream/av1/bitstream-frame.d.ts +11 -0
  60. package/dist/boxes/webm/bitstream/av1/bitstream-frame.js +14 -0
  61. package/dist/boxes/webm/bitstream/av1/chroma-sample-position.d.ts +6 -0
  62. package/dist/boxes/webm/bitstream/av1/chroma-sample-position.js +9 -0
  63. package/dist/boxes/webm/bitstream/av1/color-config.d.ts +16 -0
  64. package/dist/boxes/webm/bitstream/av1/color-config.js +103 -0
  65. package/dist/boxes/webm/bitstream/av1/color-primaries.d.ts +14 -0
  66. package/dist/boxes/webm/bitstream/av1/color-primaries.js +17 -0
  67. package/dist/boxes/webm/bitstream/av1/decoder-model-info.d.ts +9 -0
  68. package/dist/boxes/webm/bitstream/av1/decoder-model-info.js +17 -0
  69. package/dist/boxes/webm/bitstream/av1/header-segment.d.ts +51 -0
  70. package/dist/boxes/webm/bitstream/av1/header-segment.js +183 -0
  71. package/dist/boxes/webm/bitstream/av1/matrix-coefficients.d.ts +17 -0
  72. package/dist/boxes/webm/bitstream/av1/matrix-coefficients.js +20 -0
  73. package/dist/boxes/webm/bitstream/av1/operating-parameters-info.d.ts +10 -0
  74. package/dist/boxes/webm/bitstream/av1/operating-parameters-info.js +15 -0
  75. package/dist/boxes/webm/bitstream/av1/temporal-point-info.d.ts +5 -0
  76. package/dist/boxes/webm/bitstream/av1/temporal-point-info.js +8 -0
  77. package/dist/boxes/webm/bitstream/av1/timing-info.d.ts +8 -0
  78. package/dist/boxes/webm/bitstream/av1/timing-info.js +20 -0
  79. package/dist/boxes/webm/bitstream/av1/transfer-characteristics.d.ts +21 -0
  80. package/dist/boxes/webm/bitstream/av1/transfer-characteristics.js +24 -0
  81. package/dist/boxes/webm/bitstream/av1/uvlc.d.ts +2 -0
  82. package/dist/boxes/webm/bitstream/av1/uvlc.js +20 -0
  83. package/dist/boxes/webm/bitstream/av1.d.ts +20 -0
  84. package/dist/boxes/webm/bitstream/av1.js +118 -0
  85. package/dist/boxes/webm/bitstream/h264/get-h264-descriptor.d.ts +0 -0
  86. package/dist/boxes/webm/bitstream/h264/get-h264-descriptor.js +1 -0
  87. package/dist/boxes/webm/description.d.ts +2 -0
  88. package/dist/boxes/webm/description.js +83 -0
  89. package/dist/boxes/webm/get-ready-tracks.d.ts +3 -0
  90. package/dist/boxes/webm/get-ready-tracks.js +29 -0
  91. package/dist/boxes/webm/get-track.d.ts +6 -0
  92. package/dist/boxes/webm/get-track.js +183 -0
  93. package/dist/boxes/webm/parse-webm-header.d.ts +2 -1
  94. package/dist/boxes/webm/parse-webm-header.js +2 -2
  95. package/dist/boxes/webm/segments/all-segments.d.ts +269 -0
  96. package/dist/boxes/webm/segments/all-segments.js +277 -0
  97. package/dist/boxes/webm/segments/duration.d.ts +1 -1
  98. package/dist/boxes/webm/segments/duration.js +13 -9
  99. package/dist/boxes/webm/segments/info.d.ts +2 -1
  100. package/dist/boxes/webm/segments/info.js +12 -4
  101. package/dist/boxes/webm/segments/main.d.ts +0 -2
  102. package/dist/boxes/webm/segments/main.js +0 -11
  103. package/dist/boxes/webm/segments/muxing.d.ts +1 -1
  104. package/dist/boxes/webm/segments/muxing.js +1 -2
  105. package/dist/boxes/webm/segments/parse-children.d.ts +11 -1
  106. package/dist/boxes/webm/segments/parse-children.js +82 -6
  107. package/dist/boxes/webm/segments/seek-head.d.ts +2 -1
  108. package/dist/boxes/webm/segments/seek-head.js +12 -3
  109. package/dist/boxes/webm/segments/seek-position.d.ts +1 -1
  110. package/dist/boxes/webm/segments/seek-position.js +1 -2
  111. package/dist/boxes/webm/segments/seek.d.ts +7 -2
  112. package/dist/boxes/webm/segments/seek.js +22 -9
  113. package/dist/boxes/webm/segments/track-entry.d.ts +102 -22
  114. package/dist/boxes/webm/segments/track-entry.js +269 -57
  115. package/dist/boxes/webm/segments/tracks.d.ts +2 -1
  116. package/dist/boxes/webm/segments/tracks.js +12 -4
  117. package/dist/boxes/webm/segments/void.d.ts +1 -1
  118. package/dist/boxes/webm/segments/void.js +1 -2
  119. package/dist/boxes/webm/segments/writing.d.ts +1 -1
  120. package/dist/boxes/webm/segments/writing.js +1 -2
  121. package/dist/boxes/webm/segments.d.ts +8 -4
  122. package/dist/boxes/webm/segments.js +176 -40
  123. package/dist/boxes/webm/traversal.d.ts +7 -0
  124. package/dist/boxes/webm/traversal.js +25 -0
  125. package/dist/buffer-iterator.d.ts +15 -1
  126. package/dist/buffer-iterator.js +115 -46
  127. package/dist/combine-uint8array.d.ts +1 -0
  128. package/dist/combine-uint8array.js +13 -0
  129. package/dist/from-fetch.d.ts +2 -0
  130. package/dist/from-fetch.js +54 -0
  131. package/dist/from-node.js +6 -0
  132. package/dist/from-web-file.d.ts +2 -0
  133. package/dist/from-web-file.js +34 -0
  134. package/dist/from-web.js +6 -9
  135. package/dist/get-audio-codec.d.ts +19 -0
  136. package/dist/get-audio-codec.js +153 -60
  137. package/dist/get-dimensions.d.ts +8 -2
  138. package/dist/get-dimensions.js +13 -91
  139. package/dist/get-duration.js +4 -7
  140. package/dist/get-fps.d.ts +4 -3
  141. package/dist/get-fps.js +17 -116
  142. package/dist/get-sample-aspect-ratio.d.ts +37 -0
  143. package/dist/get-sample-aspect-ratio.js +137 -0
  144. package/dist/get-sample-positions.d.ts +11 -1
  145. package/dist/get-sample-positions.js +31 -2
  146. package/dist/get-tracks.d.ts +44 -5
  147. package/dist/get-tracks.js +66 -48
  148. package/dist/get-video-codec.d.ts +2 -0
  149. package/dist/get-video-codec.js +47 -31
  150. package/dist/get-video-metadata.d.ts +2 -0
  151. package/dist/get-video-metadata.js +44 -0
  152. package/dist/has-all-info.d.ts +2 -1
  153. package/dist/has-all-info.js +14 -5
  154. package/dist/index.d.ts +1 -0
  155. package/dist/make-hvc1-codec-strings.d.ts +2 -0
  156. package/dist/make-hvc1-codec-strings.js +47 -0
  157. package/dist/options.d.ts +26 -4
  158. package/dist/parse-media.js +62 -17
  159. package/dist/parse-result.d.ts +16 -5
  160. package/dist/parse-video.d.ts +11 -2
  161. package/dist/parse-video.js +14 -6
  162. package/dist/parser-context.d.ts +8 -0
  163. package/dist/parser-context.js +2 -0
  164. package/dist/parser-state.d.ts +23 -0
  165. package/dist/parser-state.js +112 -0
  166. package/dist/read-and-increment-offset.d.ts +28 -0
  167. package/dist/read-and-increment-offset.js +177 -0
  168. package/dist/reader.d.ts +2 -2
  169. package/dist/traversal.d.ts +37 -0
  170. package/dist/traversal.js +244 -1
  171. package/dist/understand-vorbis.d.ts +1 -0
  172. package/dist/understand-vorbis.js +12 -0
  173. package/dist/webcodec-sample-types.d.ts +21 -0
  174. package/dist/webcodec-sample-types.js +2 -0
  175. package/package.json +10 -2
  176. package/src/add-new-matroska-tracks.ts +23 -0
  177. package/src/boxes/iso-base-media/esds/decoder-specific-config.ts +61 -0
  178. package/src/boxes/iso-base-media/esds/esds-descriptors.ts +33 -2
  179. package/src/boxes/iso-base-media/make-track.ts +157 -0
  180. package/src/boxes/iso-base-media/mdat/mdat.ts +131 -0
  181. package/src/boxes/iso-base-media/moov/moov.ts +8 -3
  182. package/src/boxes/iso-base-media/mvhd.ts +7 -1
  183. package/src/boxes/iso-base-media/process-box.ts +388 -38
  184. package/src/boxes/iso-base-media/stsd/av1c.ts +19 -0
  185. package/src/boxes/iso-base-media/stsd/avcc.ts +36 -0
  186. package/src/boxes/iso-base-media/stsd/colr.ts +49 -0
  187. package/src/boxes/iso-base-media/stsd/ctts.ts +55 -0
  188. package/src/boxes/iso-base-media/stsd/hvcc.ts +32 -0
  189. package/src/boxes/iso-base-media/stsd/keys.ts +2 -0
  190. package/src/boxes/iso-base-media/stsd/mebx.ts +8 -3
  191. package/src/boxes/iso-base-media/stsd/pasp.ts +32 -0
  192. package/src/boxes/iso-base-media/stsd/samples.ts +43 -16
  193. package/src/boxes/iso-base-media/stsd/stco.ts +50 -0
  194. package/src/boxes/iso-base-media/stsd/stsc.ts +61 -0
  195. package/src/boxes/iso-base-media/stsd/stsd.ts +10 -3
  196. package/src/boxes/iso-base-media/stsd/stss.ts +47 -0
  197. package/src/boxes/iso-base-media/stsd/stsz.ts +75 -0
  198. package/src/boxes/iso-base-media/tkhd.ts +63 -16
  199. package/src/boxes/iso-base-media/trak/trak.ts +8 -3
  200. package/src/boxes/iso-base-media/void-box.ts +4 -0
  201. package/src/boxes/webm/allowed-partial-segments.ts +1 -0
  202. package/src/boxes/webm/av1-codec-private.ts +113 -0
  203. package/src/boxes/webm/description.ts +101 -0
  204. package/src/boxes/webm/get-ready-tracks.ts +36 -0
  205. package/src/boxes/webm/get-track.ts +250 -0
  206. package/src/boxes/webm/parse-webm-header.ts +6 -2
  207. package/src/boxes/webm/segments/all-segments.ts +285 -0
  208. package/src/boxes/webm/segments/duration.ts +15 -8
  209. package/src/boxes/webm/segments/info.ts +18 -4
  210. package/src/boxes/webm/segments/main.ts +0 -13
  211. package/src/boxes/webm/segments/muxing.ts +1 -1
  212. package/src/boxes/webm/segments/parse-children.ts +132 -9
  213. package/src/boxes/webm/segments/seek-head.ts +17 -4
  214. package/src/boxes/webm/segments/seek-position.ts +1 -2
  215. package/src/boxes/webm/segments/seek.ts +31 -9
  216. package/src/boxes/webm/segments/track-entry.ts +475 -65
  217. package/src/boxes/webm/segments/tracks.ts +17 -7
  218. package/src/boxes/webm/segments/void.ts +4 -2
  219. package/src/boxes/webm/segments/writing.ts +1 -1
  220. package/src/boxes/webm/segments.ts +266 -42
  221. package/src/boxes/webm/traversal.ts +32 -0
  222. package/src/buffer-iterator.ts +140 -45
  223. package/src/combine-uint8array.ts +13 -0
  224. package/src/{from-web.ts → from-fetch.ts} +9 -1
  225. package/src/from-node.ts +8 -0
  226. package/src/from-web-file.ts +39 -0
  227. package/src/get-audio-codec.ts +213 -84
  228. package/src/get-dimensions.ts +25 -132
  229. package/src/get-duration.ts +4 -8
  230. package/src/get-fps.ts +27 -172
  231. package/src/get-sample-aspect-ratio.ts +204 -0
  232. package/src/get-sample-positions.ts +93 -0
  233. package/src/get-tracks.ts +147 -0
  234. package/src/get-video-codec.ts +62 -47
  235. package/src/has-all-info.ts +35 -5
  236. package/src/index.ts +8 -0
  237. package/src/make-hvc1-codec-strings.ts +55 -0
  238. package/src/options.ts +48 -9
  239. package/src/parse-media.ts +90 -21
  240. package/src/parse-result.ts +28 -4
  241. package/src/parse-video.ts +30 -7
  242. package/src/parser-context.ts +9 -0
  243. package/src/parser-state.ts +151 -0
  244. package/src/reader.ts +2 -2
  245. package/src/test/aspect-ratio.test.ts +42 -0
  246. package/src/test/av1.test.ts +108 -0
  247. package/src/test/duration.test.ts +5 -21
  248. package/src/test/matroska.test.ts +350 -31
  249. package/src/test/mvhd.test.ts +6 -1
  250. package/src/test/parse-esds.test.ts +29 -6
  251. package/src/test/parse-stco.test.ts +59 -0
  252. package/src/test/parse-stsc.test.ts +104 -0
  253. package/src/test/parse-stsz.test.ts +57 -0
  254. package/src/test/parse-stts.test.ts +1 -1
  255. package/src/test/parse-video.test.ts +23 -35
  256. package/src/test/parse-webm.test.ts +5 -5
  257. package/src/test/stream-local.test.ts +542 -46
  258. package/src/test/stream-remote.test.ts +15 -13
  259. package/src/test/stream-samples.test.ts +259 -0
  260. package/src/test/stsd.test.ts +60 -8
  261. package/src/test/tkhd.test.ts +4 -1
  262. package/src/traversal.ts +496 -0
  263. package/src/webcodec-sample-types.ts +30 -0
  264. package/tsconfig.json +5 -1
  265. package/tsconfig.tsbuildinfo +1 -1
  266. package/boxes.json +0 -1
  267. package/dist/boxes/iso-base-media/esds-descriptors.d.ts +0 -21
  268. package/dist/boxes/iso-base-media/esds-descriptors.js +0 -62
  269. package/dist/boxes/iso-base-media/esds.d.ts +0 -15
  270. package/dist/boxes/iso-base-media/esds.js +0 -27
  271. package/dist/get-codec.d.ts +0 -4
  272. package/dist/get-codec.js +0 -22
  273. /package/dist/{get-samples.d.ts → boxes/webm/bitstream/av1/frame.d.ts} +0 -0
  274. /package/dist/{get-samples.js → boxes/webm/bitstream/av1/frame.js} +0 -0
  275. /package/src/boxes/iso-base-media/{stts → stsd}/stts.ts +0 -0
@@ -1,3 +1,9 @@
1
+ import {
2
+ knownIdsWithOneLength,
3
+ knownIdsWithThreeLength,
4
+ knownIdsWithTwoLength,
5
+ } from './boxes/webm/segments/all-segments';
6
+
1
7
  export class OffsetCounter {
2
8
  #offset: number;
3
9
  #discardedBytes: number;
@@ -22,6 +28,10 @@ export class OffsetCounter {
22
28
  return this.#offset - this.#discardedBytes;
23
29
  }
24
30
 
31
+ setDiscardedOffset(offset: number) {
32
+ this.#discardedBytes = offset;
33
+ }
34
+
25
35
  discardBytes(amount: number) {
26
36
  this.#discardedBytes += amount;
27
37
  }
@@ -37,6 +47,7 @@ export class OffsetCounter {
37
47
 
38
48
  const isoBaseMediaMp4Pattern = new TextEncoder().encode('ftyp');
39
49
  const webmPattern = new Uint8Array([0x1a, 0x45, 0xdf, 0xa3]);
50
+ const mpegPattern = new Uint8Array([0xff, 0xf3, 0xe4, 0x64]);
40
51
 
41
52
  const matchesPattern = (pattern: Uint8Array) => {
42
53
  return (data: Uint8Array) => {
@@ -57,7 +68,7 @@ export const getArrayBufferIterator = (
57
68
  });
58
69
  if (!buf.resize) {
59
70
  throw new Error(
60
- '`ArrayBuffer.resize` is not supported in this Runtime. Use at least Node.js 20 or Bun.',
71
+ '`ArrayBuffer.resize` is not supported in this Runtime. On the server: Use at least Node.js 20 or Bun. In the browser: Chrome 111, Edge 111, Safari 16.4, Firefox 128, Opera 111',
61
72
  );
62
73
  }
63
74
 
@@ -105,6 +116,24 @@ export const getArrayBufferIterator = (
105
116
  return val;
106
117
  };
107
118
 
119
+ const getUint32Le = () => {
120
+ const val = view.getUint32(counter.getDiscardedOffset(), true);
121
+ counter.increment(4);
122
+ return val;
123
+ };
124
+
125
+ const getInt32Le = () => {
126
+ const val = view.getInt32(counter.getDiscardedOffset(), true);
127
+ counter.increment(4);
128
+ return val;
129
+ };
130
+
131
+ const getInt32 = () => {
132
+ const val = view.getInt32(counter.getDiscardedOffset());
133
+ counter.increment(4);
134
+ return val;
135
+ };
136
+
108
137
  const addData = (newData: Uint8Array) => {
109
138
  const oldLength = buf.byteLength;
110
139
  const newLength = oldLength + newData.byteLength;
@@ -131,6 +160,10 @@ export const getArrayBufferIterator = (
131
160
  return matchesPattern(webmPattern)(data.subarray(0, 4));
132
161
  };
133
162
 
163
+ const isMp3 = () => {
164
+ return matchesPattern(mpegPattern)(data.subarray(0, 4));
165
+ };
166
+
134
167
  const removeBytesRead = () => {
135
168
  const bytesToRemove = counter.getDiscardedOffset();
136
169
 
@@ -147,19 +180,102 @@ export const getArrayBufferIterator = (
147
180
  };
148
181
 
149
182
  const skipTo = (offset: number) => {
150
- buf.resize(offset);
151
- const currentOffset = counter.getOffset();
152
- counter.increment(offset - currentOffset);
153
- removeBytesRead();
183
+ const becomesSmaller = offset < counter.getOffset();
184
+ if (becomesSmaller) {
185
+ buf.resize(0);
186
+ counter.decrement(counter.getOffset() - offset);
187
+ counter.setDiscardedOffset(offset);
188
+ } else {
189
+ buf.resize(offset);
190
+ const currentOffset = counter.getOffset();
191
+ counter.increment(offset - currentOffset);
192
+ removeBytesRead();
193
+ }
194
+ };
195
+
196
+ const peekB = (length: number) => {
197
+ // eslint-disable-next-line no-console
198
+ console.log(
199
+ [...getSlice(length)].map((b) => b.toString(16).padStart(2, '0')),
200
+ );
201
+ counter.decrement(length);
202
+ };
203
+
204
+ const peekD = (length: number) => {
205
+ // eslint-disable-next-line no-console
206
+ console.log([...getSlice(length)].map((b) => b));
207
+ counter.decrement(length);
208
+ };
209
+
210
+ const leb128 = () => {
211
+ let result = 0;
212
+ let shift = 0;
213
+ let byte;
214
+
215
+ do {
216
+ byte = getBits(8);
217
+ result |= (byte & 0x7f) << shift;
218
+ shift += 7;
219
+ } while (byte >= 0x80); // Continue if the high bit is set
220
+
221
+ return result;
222
+ };
223
+
224
+ let bitIndex = 0;
225
+
226
+ const stopReadingBits = () => {
227
+ bitIndex = 0;
228
+ };
229
+
230
+ let byteToShift = 0;
231
+
232
+ const startReadingBits = () => {
233
+ byteToShift = getUint8();
234
+ };
235
+
236
+ const getBits = (bits: number) => {
237
+ let result = 0;
238
+ let bitsCollected = 0;
239
+
240
+ while (bitsCollected < bits) {
241
+ if (bitIndex >= 8) {
242
+ bitIndex = 0;
243
+ byteToShift = getUint8();
244
+ }
245
+
246
+ const remainingBitsInByte = 8 - bitIndex;
247
+ const bitsToReadNow = Math.min(bits - bitsCollected, remainingBitsInByte);
248
+ const mask = (1 << bitsToReadNow) - 1;
249
+ const shift = remainingBitsInByte - bitsToReadNow;
250
+
251
+ result <<= bitsToReadNow;
252
+ result |= (byteToShift >> shift) & mask;
253
+
254
+ bitsCollected += bitsToReadNow;
255
+ bitIndex += bitsToReadNow;
256
+ }
257
+
258
+ return result;
259
+ };
260
+
261
+ const destroy = () => {
262
+ data = new Uint8Array(0);
263
+ buf.resize(0);
154
264
  };
155
265
 
156
266
  return {
267
+ startReadingBits,
268
+ stopReadingBits,
157
269
  skipTo,
158
270
  addData,
159
271
  counter,
272
+ peekB,
273
+ peekD,
274
+ getBits,
160
275
  byteLength,
161
276
  bytesRemaining,
162
277
  isIsoBaseMedia,
278
+ leb128,
163
279
  discardFirstBytes: removeBytesRead,
164
280
  isWebm,
165
281
  discard: (length: number) => {
@@ -182,43 +298,13 @@ export const getArrayBufferIterator = (
182
298
 
183
299
  // Catch void block
184
300
  // https://www.matroska.org/technical/elements.html
185
- const knownIdsWithOneLength = [
186
- '0xec',
187
- '0xae',
188
- '0xd7',
189
- '0x9c',
190
- '0x86',
191
- '0x83',
192
- '0xe0',
193
- '0xb0',
194
- '0xba',
195
- '0x9a',
196
- '0xe1',
197
- '0xbf',
198
- '0x88',
199
- ];
301
+
200
302
  if (knownIdsWithOneLength.includes(firstOneString)) {
201
303
  return firstOneString;
202
304
  }
203
305
 
204
306
  const firstTwo = getSlice(1);
205
307
 
206
- const knownIdsWithTwoLength = [
207
- '0x4dbb',
208
- '0x53ac',
209
- '0xec01',
210
- '0x73c5',
211
- '0x53c0',
212
- '0x4d80',
213
- '0x5741',
214
- '0x4489',
215
- '0x55ee',
216
- '0x55b0',
217
- '0x7ba9',
218
- '0x63a2',
219
- '0x73a4',
220
- ];
221
-
222
308
  const firstTwoString = `${firstOneString}${Array.from(
223
309
  new Uint8Array(firstTwo),
224
310
  )
@@ -231,14 +317,6 @@ export const getArrayBufferIterator = (
231
317
  return firstTwoString;
232
318
  }
233
319
 
234
- const knownIdsWithThreeLength = [
235
- '0x4d808c',
236
- '0x57418c',
237
- '0x448988',
238
- '0x22b59c',
239
- '0x23e383',
240
- ];
241
-
242
320
  const firstThree = getSlice(1);
243
321
 
244
322
  const firstThreeString = `${firstTwoString}${Array.from(
@@ -319,10 +397,18 @@ export const getArrayBufferIterator = (
319
397
  getUint32,
320
398
  // https://developer.apple.com/documentation/quicktime-file-format/sound_sample_description_version_1
321
399
  // A 32-bit unsigned fixed-point number (16.16) that indicates the rate at which the sound samples were obtained.
322
- getFixedPoint1616Number: () => {
400
+ getFixedPointUnsigned1616Number: () => {
323
401
  const val = getUint32();
324
402
  return val / 2 ** 16;
325
403
  },
404
+ getFixedPointSigned1616Number: () => {
405
+ const val = getInt32();
406
+ return val / 2 ** 16;
407
+ },
408
+ getFixedPointSigned230Number: () => {
409
+ const val = getInt32();
410
+ return val / 2 ** 30;
411
+ },
326
412
  getPascalString: () => {
327
413
  const val = getSlice(32);
328
414
  return [...Array.from(new Uint8Array(val))];
@@ -345,6 +431,15 @@ export const getArrayBufferIterator = (
345
431
  counter.increment(8);
346
432
  return val;
347
433
  },
434
+ getFloat32: () => {
435
+ const val = view.getFloat32(counter.getDiscardedOffset());
436
+ counter.increment(4);
437
+ return val;
438
+ },
439
+ getUint32Le,
440
+ getInt32Le,
441
+ destroy,
442
+ isMp3,
348
443
  };
349
444
  };
350
445
 
@@ -0,0 +1,13 @@
1
+ export const combineUint8Arrays = (
2
+ array1: Uint8Array | null,
3
+ array2: Uint8Array,
4
+ ) => {
5
+ if (!array1) {
6
+ return array2;
7
+ }
8
+
9
+ const combined = new Uint8Array(array1.length + array2.length);
10
+ combined.set(array1);
11
+ combined.set(array2, array1.length);
12
+ return combined;
13
+ };
@@ -1,7 +1,11 @@
1
1
  import type {ReaderInterface} from './reader';
2
2
 
3
- export const webReader: ReaderInterface = {
3
+ export const fetchReader: ReaderInterface = {
4
4
  read: async (src, range) => {
5
+ if (typeof src !== 'string') {
6
+ throw new Error('src must be a string when using `webReader`');
7
+ }
8
+
5
9
  const resolvedUrl =
6
10
  typeof window !== 'undefined' && typeof window.location !== 'undefined'
7
11
  ? new URL(src, window.location.origin).toString()
@@ -46,6 +50,10 @@ export const webReader: ReaderInterface = {
46
50
  return {reader, contentLength};
47
51
  },
48
52
  getLength: async (src) => {
53
+ if (typeof src !== 'string') {
54
+ throw new Error('src must be a string when using `webReader`');
55
+ }
56
+
49
57
  const res = await fetch(src, {
50
58
  method: 'HEAD',
51
59
  });
package/src/from-node.ts CHANGED
@@ -5,6 +5,10 @@ import type {ReaderInterface} from './reader';
5
5
 
6
6
  export const nodeReader: ReaderInterface = {
7
7
  read: async (src, range) => {
8
+ if (typeof src !== 'string') {
9
+ throw new Error('src must be a string when using `nodeReader`');
10
+ }
11
+
8
12
  const stream = createReadStream(src, {
9
13
  start: range === null ? 0 : typeof range === 'number' ? range : range[0],
10
14
  end:
@@ -23,6 +27,10 @@ export const nodeReader: ReaderInterface = {
23
27
  };
24
28
  },
25
29
  getLength: async (src) => {
30
+ if (typeof src !== 'string') {
31
+ throw new Error('src must be a string when using `nodeReader`');
32
+ }
33
+
26
34
  const stats = await stat(src);
27
35
  return stats.size;
28
36
  },
@@ -0,0 +1,39 @@
1
+ import type {ReaderInterface} from './reader';
2
+
3
+ export const webFileReader: ReaderInterface = {
4
+ read: (file, range) => {
5
+ if (typeof file === 'string') {
6
+ throw new Error('`inputTypeFileReader` only supports `File` objects');
7
+ }
8
+
9
+ const part =
10
+ range === null
11
+ ? file
12
+ : typeof range === 'number'
13
+ ? file.slice(range)
14
+ : file.slice(range[0], range[1]);
15
+
16
+ const reader = new FileReader();
17
+ reader.readAsArrayBuffer(file);
18
+
19
+ return new Promise((resolve, reject) => {
20
+ reader.onload = () => {
21
+ resolve({
22
+ reader: part.stream().getReader(),
23
+ contentLength: file.size,
24
+ });
25
+ };
26
+
27
+ reader.onerror = (error) => {
28
+ reject(error);
29
+ };
30
+ });
31
+ },
32
+ getLength: (src) => {
33
+ if (typeof src === 'string') {
34
+ throw new Error('`inputTypeFileReader` only supports `File` objects');
35
+ }
36
+
37
+ return Promise.resolve(src.size);
38
+ },
39
+ };