@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
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeParserState = void 0;
4
+ const traversal_1 = require("./boxes/webm/traversal");
5
+ const traversal_2 = require("./traversal");
6
+ const makeParserState = ({ hasAudioCallbacks, hasVideoCallbacks, }) => {
7
+ const trackEntries = {};
8
+ const onTrackEntrySegment = (trackEntry) => {
9
+ const trackId = (0, traversal_2.getTrackId)(trackEntry);
10
+ if (!trackId) {
11
+ throw new Error('Expected track id');
12
+ }
13
+ if (trackEntries[trackId]) {
14
+ return;
15
+ }
16
+ const codec = (0, traversal_1.getTrackCodec)(trackEntry);
17
+ if (!codec) {
18
+ throw new Error('Expected codec');
19
+ }
20
+ trackEntries[trackId] = codec;
21
+ };
22
+ const videoSampleCallbacks = {};
23
+ const audioSampleCallbacks = {};
24
+ let samplesThatHadToBeQueued = 0;
25
+ const queuedAudioSamples = {};
26
+ const queuedVideoSamples = {};
27
+ const declinedTrackNumbers = [];
28
+ let timescale = null;
29
+ const getTimescale = () => {
30
+ if (timescale === null) {
31
+ throw new Error('Timescale not set');
32
+ }
33
+ return timescale;
34
+ };
35
+ const setTimescale = (newTimescale) => {
36
+ timescale = newTimescale;
37
+ };
38
+ return {
39
+ onTrackEntrySegment,
40
+ getTrackInfoByNumber: (id) => trackEntries[id],
41
+ registerVideoSampleCallback: async (id, callback) => {
42
+ var _a;
43
+ if (callback === null) {
44
+ delete videoSampleCallbacks[id];
45
+ declinedTrackNumbers.push(id);
46
+ return;
47
+ }
48
+ videoSampleCallbacks[id] = callback;
49
+ for (const queued of (_a = queuedVideoSamples[id]) !== null && _a !== void 0 ? _a : []) {
50
+ await callback(queued);
51
+ }
52
+ queuedVideoSamples[id] = [];
53
+ },
54
+ registerAudioSampleCallback: async (id, callback) => {
55
+ var _a;
56
+ if (callback === null) {
57
+ delete audioSampleCallbacks[id];
58
+ declinedTrackNumbers.push(id);
59
+ return;
60
+ }
61
+ audioSampleCallbacks[id] = callback;
62
+ for (const queued of (_a = queuedAudioSamples[id]) !== null && _a !== void 0 ? _a : []) {
63
+ await callback(queued);
64
+ }
65
+ queuedAudioSamples[id] = [];
66
+ },
67
+ onAudioSample: async (trackId, audioSample) => {
68
+ var _a;
69
+ const callback = audioSampleCallbacks[trackId];
70
+ if (callback) {
71
+ await callback(audioSample);
72
+ }
73
+ else {
74
+ if (declinedTrackNumbers.includes(trackId)) {
75
+ return;
76
+ }
77
+ if (!hasAudioCallbacks) {
78
+ return;
79
+ }
80
+ (_a = queuedAudioSamples[trackId]) !== null && _a !== void 0 ? _a : (queuedAudioSamples[trackId] = []);
81
+ queuedAudioSamples[trackId].push(audioSample);
82
+ samplesThatHadToBeQueued++;
83
+ }
84
+ },
85
+ onVideoSample: async (trackId, videoSample) => {
86
+ var _a;
87
+ const callback = videoSampleCallbacks[trackId];
88
+ if (callback) {
89
+ await callback(videoSample);
90
+ }
91
+ else {
92
+ if (declinedTrackNumbers.includes(trackId)) {
93
+ return;
94
+ }
95
+ if (!hasVideoCallbacks) {
96
+ return;
97
+ }
98
+ (_a = queuedVideoSamples[trackId]) !== null && _a !== void 0 ? _a : (queuedVideoSamples[trackId] = []);
99
+ queuedVideoSamples[trackId].push(videoSample);
100
+ samplesThatHadToBeQueued++;
101
+ }
102
+ },
103
+ getInternalStats: () => {
104
+ return {
105
+ samplesThatHadToBeQueued,
106
+ };
107
+ },
108
+ getTimescale,
109
+ setTimescale,
110
+ };
111
+ };
112
+ exports.makeParserState = makeParserState;
@@ -0,0 +1,28 @@
1
+ export declare class OffsetCounter {
2
+ #private;
3
+ constructor(initial: number);
4
+ increment(amount: number): void;
5
+ getOffset(): number;
6
+ }
7
+ export declare const getArrayBufferIterator: (data: ArrayBuffer, initialOffset: number) => {
8
+ view: DataView;
9
+ counter: OffsetCounter;
10
+ data: ArrayBuffer;
11
+ discard: (length: number) => void;
12
+ getSlice: (amount: number) => ArrayBuffer;
13
+ getAtom: () => string;
14
+ getMatroskaSegmentId: () => string;
15
+ getVint: (bytes: number) => number;
16
+ getUint8: () => number;
17
+ getEBML: () => number;
18
+ getInt8: () => number;
19
+ getUint16: () => number;
20
+ getInt16: () => number;
21
+ getUint32: () => number;
22
+ getFixedPoint1616Number: () => number;
23
+ getPascalString: () => number[];
24
+ getDecimalBytes(length: number): number;
25
+ getByteString(length: number): string;
26
+ getFloat64: () => number;
27
+ };
28
+ export type BufferIterator = ReturnType<typeof getArrayBufferIterator>;
@@ -0,0 +1,177 @@
1
+ "use strict";
2
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
3
+ if (kind === "m") throw new TypeError("Private method is not writable");
4
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
5
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
6
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
7
+ };
8
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
9
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
10
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
11
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
12
+ };
13
+ var _OffsetCounter_offset;
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.getArrayBufferIterator = exports.OffsetCounter = void 0;
16
+ class OffsetCounter {
17
+ constructor(initial) {
18
+ _OffsetCounter_offset.set(this, void 0);
19
+ __classPrivateFieldSet(this, _OffsetCounter_offset, initial, "f");
20
+ }
21
+ increment(amount) {
22
+ if (amount < 0) {
23
+ throw new Error('Cannot increment by a negative amount');
24
+ }
25
+ __classPrivateFieldSet(this, _OffsetCounter_offset, __classPrivateFieldGet(this, _OffsetCounter_offset, "f") + amount, "f");
26
+ }
27
+ getOffset() {
28
+ return __classPrivateFieldGet(this, _OffsetCounter_offset, "f");
29
+ }
30
+ }
31
+ exports.OffsetCounter = OffsetCounter;
32
+ _OffsetCounter_offset = new WeakMap();
33
+ const makeOffsetCounter = (initial) => {
34
+ return new OffsetCounter(initial);
35
+ };
36
+ const getArrayBufferIterator = (data, initialOffset) => {
37
+ const view = new DataView(data);
38
+ const counter = makeOffsetCounter(initialOffset);
39
+ const getSlice = (amount) => {
40
+ const value = data.slice(counter.getOffset(), counter.getOffset() + amount);
41
+ counter.increment(amount);
42
+ return value;
43
+ };
44
+ const getUint8 = () => {
45
+ const val = view.getUint8(counter.getOffset());
46
+ counter.increment(1);
47
+ return val;
48
+ };
49
+ const getUint32 = () => {
50
+ const val = view.getUint32(counter.getOffset());
51
+ counter.increment(4);
52
+ return val;
53
+ };
54
+ return {
55
+ view,
56
+ counter,
57
+ data,
58
+ discard: (length) => {
59
+ counter.increment(length);
60
+ },
61
+ getSlice,
62
+ getAtom: () => {
63
+ const atom = getSlice(4);
64
+ return new TextDecoder().decode(atom);
65
+ },
66
+ getMatroskaSegmentId: () => {
67
+ const first = getSlice(1);
68
+ const firstOneString = `0x${Array.from(new Uint8Array(first))
69
+ .map((b) => {
70
+ return b.toString(16).padStart(2, '0');
71
+ })
72
+ .join('')}`;
73
+ // Catch void block
74
+ const knownIdsWithOneLength = ['0xec', '0xae'];
75
+ if (knownIdsWithOneLength.includes(firstOneString)) {
76
+ return firstOneString;
77
+ }
78
+ const firstTwo = getSlice(1);
79
+ const knownIdsWithTwoLength = ['0x4dbb', '0x53ac', '0xec01'];
80
+ const firstTwoString = `${firstOneString}${Array.from(new Uint8Array(firstTwo))
81
+ .map((b) => {
82
+ return b.toString(16).padStart(2, '0');
83
+ })
84
+ .join('')}`;
85
+ if (knownIdsWithTwoLength.includes(firstTwoString)) {
86
+ return firstTwoString;
87
+ }
88
+ const knownIdsWithThreeLength = ['0x4d808c', '0x57418c', '0x448988'];
89
+ const firstThree = getSlice(1);
90
+ const firstThreeString = `${firstTwoString}${Array.from(new Uint8Array(firstThree))
91
+ .map((b) => {
92
+ return b.toString(16).padStart(2, '0');
93
+ })
94
+ .join('')}`;
95
+ if (knownIdsWithThreeLength.includes(firstThreeString)) {
96
+ return firstThreeString;
97
+ }
98
+ const segmentId = getSlice(1);
99
+ return `${firstThreeString}${Array.from(new Uint8Array(segmentId))
100
+ .map((b) => {
101
+ return b.toString(16).padStart(2, '0');
102
+ })
103
+ .join('')}`;
104
+ },
105
+ getVint: (bytes) => {
106
+ const slice = getSlice(bytes);
107
+ const d = [...Array.from(new Uint8Array(slice))];
108
+ const totalLength = d[0];
109
+ if (totalLength === 0) {
110
+ return 0;
111
+ }
112
+ // Calculate the actual length of the data based on the first set bit
113
+ let actualLength = 0;
114
+ while (((totalLength >> (7 - actualLength)) & 0x01) === 0) {
115
+ actualLength++;
116
+ }
117
+ actualLength += 1; // Include the first byte set as 1
118
+ // Combine the numbers to form the integer value
119
+ let value = 0;
120
+ // Mask the first byte properly then start combining
121
+ value = totalLength & (0xff >> actualLength);
122
+ for (let i = 1; i < actualLength; i++) {
123
+ value = (value << 8) | d[i];
124
+ }
125
+ return value;
126
+ },
127
+ getUint8,
128
+ getEBML: () => {
129
+ const val = getUint8();
130
+ // https://darkcoding.net/software/reading-mediarecorders-webm-opus-output/#:~:text=The%20first%20four%20bytes%20(%201A,%E2%80%93%20read%20on%20for%20why).
131
+ // You drop the initial 0 bits and the first 1 bit to get the value. 0x81 is 0b10000001, so there are zero inital 0 bits, meaning length one byte, and the value is 1. The 0x9F value for length of the EBML header we saw earlier is 0b10011111, still one byte, value is 0b0011111, which is 31 (the python repl is very helpful for these conversions).
132
+ const actualValue = val & 0x7f; // 0x7F is binary 01111111, which masks out the first bit
133
+ return actualValue;
134
+ },
135
+ getInt8: () => {
136
+ const val = view.getInt8(counter.getOffset());
137
+ counter.increment(1);
138
+ return val;
139
+ },
140
+ getUint16: () => {
141
+ const val = view.getUint16(counter.getOffset());
142
+ counter.increment(2);
143
+ return val;
144
+ },
145
+ getInt16: () => {
146
+ const val = view.getInt16(counter.getOffset());
147
+ counter.increment(2);
148
+ return val;
149
+ },
150
+ getUint32,
151
+ // https://developer.apple.com/documentation/quicktime-file-format/sound_sample_description_version_1
152
+ // A 32-bit unsigned fixed-point number (16.16) that indicates the rate at which the sound samples were obtained.
153
+ getFixedPoint1616Number: () => {
154
+ const val = getUint32();
155
+ return val / 2 ** 16;
156
+ },
157
+ getPascalString: () => {
158
+ const val = getSlice(32);
159
+ return [...Array.from(new Uint8Array(val))];
160
+ },
161
+ getDecimalBytes(length) {
162
+ const bytes = getSlice(length);
163
+ const numbers = [...Array.from(new Uint8Array(bytes))];
164
+ return numbers.reduce((acc, byte, index) => acc + (byte << (8 * (numbers.length - index - 1))), 0);
165
+ },
166
+ getByteString(length) {
167
+ const bytes = getSlice(length);
168
+ return new TextDecoder().decode(bytes);
169
+ },
170
+ getFloat64: () => {
171
+ const val = view.getFloat64(counter.getOffset());
172
+ counter.increment(8);
173
+ return val;
174
+ },
175
+ };
176
+ };
177
+ exports.getArrayBufferIterator = getArrayBufferIterator;
package/dist/reader.d.ts CHANGED
@@ -2,8 +2,8 @@ type ReadResult = {
2
2
  reader: ReadableStreamDefaultReader<Uint8Array>;
3
3
  contentLength: number | null;
4
4
  };
5
- type ReadContent = (src: string, range: [number, number] | number | null) => Promise<ReadResult>;
6
- type GetLength = (src: string) => Promise<number>;
5
+ type ReadContent = (src: string | File, range: [number, number] | number | null) => Promise<ReadResult>;
6
+ type GetLength = (src: string | File) => Promise<number>;
7
7
  export type ReaderInterface = {
8
8
  read: ReadContent;
9
9
  getLength: GetLength;
@@ -1,19 +1,56 @@
1
+ import type { FtypBox } from './boxes/iso-base-media/ftyp';
2
+ import type { MdhdBox } from './boxes/iso-base-media/mdhd';
1
3
  import type { MoovBox } from './boxes/iso-base-media/moov/moov';
2
4
  import type { MvhdBox } from './boxes/iso-base-media/mvhd';
5
+ import type { CttsBox } from './boxes/iso-base-media/stsd/ctts';
3
6
  import type { StcoBox } from './boxes/iso-base-media/stsd/stco';
4
7
  import type { StscBox } from './boxes/iso-base-media/stsd/stsc';
5
8
  import type { StsdBox } from './boxes/iso-base-media/stsd/stsd';
9
+ import type { StssBox } from './boxes/iso-base-media/stsd/stss';
6
10
  import type { StszBox } from './boxes/iso-base-media/stsd/stsz';
11
+ import type { SttsBox } from './boxes/iso-base-media/stsd/stts';
7
12
  import type { TkhdBox } from './boxes/iso-base-media/tkhd';
8
13
  import type { TrakBox } from './boxes/iso-base-media/trak/trak';
14
+ import type { MainSegment } from './boxes/webm/segments/main';
15
+ import type { TimestampScaleSegment } from './boxes/webm/segments/timestamp-scale';
16
+ import type { AudioSegment, ClusterSegment, CodecSegment, DisplayHeightSegment, DisplayWidthSegment, HeightSegment, TrackEntrySegment, TrackTypeSegment, VideoSegment, WidthSegment } from './boxes/webm/segments/track-entry';
9
17
  import type { AnySegment, RegularBox } from './parse-result';
18
+ export declare const getFtypBox: (segments: AnySegment[]) => FtypBox | null;
10
19
  export declare const getMoovBox: (segments: AnySegment[]) => MoovBox | null;
11
20
  export declare const getMvhdBox: (moovBox: MoovBox) => MvhdBox | null;
12
21
  export declare const getTraks: (moovBox: MoovBox) => TrakBox[];
13
22
  export declare const getTkhdBox: (trakBox: TrakBox) => TkhdBox | null;
14
23
  export declare const getMdiaBox: (trakBox: TrakBox) => RegularBox | null;
24
+ export declare const getMdhdBox: (trakBox: TrakBox) => MdhdBox | null;
15
25
  export declare const getStblBox: (trakBox: TrakBox) => RegularBox | null;
16
26
  export declare const getStsdBox: (trakBox: TrakBox) => StsdBox | null;
27
+ export declare const getVideoDescriptors: (trakBox: TrakBox) => Uint8Array | null;
17
28
  export declare const getStcoBox: (trakBox: TrakBox) => StcoBox | null;
29
+ export declare const getSttsBox: (trakBox: TrakBox) => SttsBox | null;
30
+ export declare const getCttsBox: (trakBox: TrakBox) => CttsBox | null;
18
31
  export declare const getStszBox: (trakBox: TrakBox) => StszBox | null;
19
32
  export declare const getStscBox: (trakBox: TrakBox) => StscBox | null;
33
+ export declare const getStssBox: (trakBox: TrakBox) => StssBox | null;
34
+ export declare const getClusterSegment: (segment: MainSegment) => ClusterSegment | null;
35
+ export declare const getTracksSegment: (segment: MainSegment) => import("./boxes/webm/segments/tracks").TracksSegment | null;
36
+ export declare const getTimescaleSegment: (segment: MainSegment) => TimestampScaleSegment | null;
37
+ export declare const getVideoSegment: (track: TrackEntrySegment) => VideoSegment | null;
38
+ export declare const getAudioSegment: (track: TrackEntrySegment) => AudioSegment | null;
39
+ export declare const getSampleRate: (track: TrackEntrySegment) => number | null;
40
+ export declare const getNumberOfChannels: (track: TrackEntrySegment) => number;
41
+ export declare const getBitDepth: (track: TrackEntrySegment) => number | null;
42
+ export declare const getPrivateData: (track: TrackEntrySegment) => Uint8Array | null;
43
+ export declare const getWidthSegment: (track: TrackEntrySegment) => WidthSegment | null;
44
+ export declare const getHeightSegment: (track: TrackEntrySegment) => HeightSegment | null;
45
+ export declare const getDisplayWidthSegment: (track: TrackEntrySegment) => DisplayWidthSegment | null;
46
+ export declare const getDisplayHeightSegment: (track: TrackEntrySegment) => DisplayHeightSegment | null;
47
+ export declare const getTrackTypeSegment: (track: TrackEntrySegment) => TrackTypeSegment | null;
48
+ export declare const getTrackId: (track: TrackEntrySegment) => number;
49
+ export declare const getCodecSegment: (track: TrackEntrySegment) => CodecSegment | null;
50
+ export declare const hasSkippedMdatProcessing: (anySegment: AnySegment[]) => {
51
+ skipped: false;
52
+ fileOffset?: undefined;
53
+ } | {
54
+ skipped: boolean;
55
+ fileOffset: number;
56
+ };
package/dist/traversal.js CHANGED
@@ -1,6 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getStscBox = exports.getStszBox = exports.getStcoBox = exports.getStsdBox = exports.getStblBox = exports.getMdiaBox = exports.getTkhdBox = exports.getTraks = exports.getMvhdBox = exports.getMoovBox = void 0;
3
+ exports.hasSkippedMdatProcessing = exports.getCodecSegment = exports.getTrackId = exports.getTrackTypeSegment = exports.getDisplayHeightSegment = exports.getDisplayWidthSegment = exports.getHeightSegment = exports.getWidthSegment = exports.getPrivateData = exports.getBitDepth = exports.getNumberOfChannels = exports.getSampleRate = exports.getAudioSegment = exports.getVideoSegment = exports.getTimescaleSegment = exports.getTracksSegment = exports.getClusterSegment = exports.getStssBox = exports.getStscBox = exports.getStszBox = exports.getCttsBox = exports.getSttsBox = exports.getStcoBox = exports.getVideoDescriptors = exports.getStsdBox = exports.getStblBox = exports.getMdhdBox = exports.getMdiaBox = exports.getTkhdBox = exports.getTraks = exports.getMvhdBox = exports.getMoovBox = exports.getFtypBox = void 0;
4
+ const getFtypBox = (segments) => {
5
+ const ftypBox = segments.find((s) => s.type === 'ftyp-box');
6
+ if (!ftypBox || ftypBox.type !== 'ftyp-box') {
7
+ return null;
8
+ }
9
+ return ftypBox;
10
+ };
11
+ exports.getFtypBox = getFtypBox;
4
12
  const getMoovBox = (segments) => {
5
13
  const moovBox = segments.find((s) => s.type === 'moov-box');
6
14
  if (!moovBox || moovBox.type !== 'moov-box') {
@@ -34,6 +42,15 @@ const getMdiaBox = (trakBox) => {
34
42
  return mdiaBox;
35
43
  };
36
44
  exports.getMdiaBox = getMdiaBox;
45
+ const getMdhdBox = (trakBox) => {
46
+ const mdiaBox = (0, exports.getMdiaBox)(trakBox);
47
+ if (!mdiaBox) {
48
+ return null;
49
+ }
50
+ const mdhdBox = mdiaBox.children.find((c) => c.type === 'mdhd-box');
51
+ return mdhdBox;
52
+ };
53
+ exports.getMdhdBox = getMdhdBox;
37
54
  const getStblBox = (trakBox) => {
38
55
  const mdiaBox = (0, exports.getMdiaBox)(trakBox);
39
56
  if (!mdiaBox) {
@@ -59,6 +76,26 @@ const getStsdBox = (trakBox) => {
59
76
  return stsdBox;
60
77
  };
61
78
  exports.getStsdBox = getStsdBox;
79
+ const getVideoDescriptors = (trakBox) => {
80
+ var _a;
81
+ const stsdBox = (0, exports.getStsdBox)(trakBox);
82
+ if (!stsdBox) {
83
+ return null;
84
+ }
85
+ const descriptors = stsdBox.samples.map((s) => {
86
+ return s.type === 'video'
87
+ ? s.descriptors.map((d) => {
88
+ return d.type === 'avcc-box'
89
+ ? d.description
90
+ : d.type === 'hvcc-box'
91
+ ? d.data
92
+ : null;
93
+ })
94
+ : [];
95
+ });
96
+ return (_a = descriptors.flat(1).filter(Boolean)[0]) !== null && _a !== void 0 ? _a : null;
97
+ };
98
+ exports.getVideoDescriptors = getVideoDescriptors;
62
99
  const getStcoBox = (trakBox) => {
63
100
  const stblBox = (0, exports.getStblBox)(trakBox);
64
101
  if (!stblBox || stblBox.type !== 'regular-box') {
@@ -68,6 +105,24 @@ const getStcoBox = (trakBox) => {
68
105
  return stcoBox;
69
106
  };
70
107
  exports.getStcoBox = getStcoBox;
108
+ const getSttsBox = (trakBox) => {
109
+ const stblBox = (0, exports.getStblBox)(trakBox);
110
+ if (!stblBox || stblBox.type !== 'regular-box') {
111
+ return null;
112
+ }
113
+ const sttsBox = stblBox.children.find((s) => s.type === 'stts-box');
114
+ return sttsBox;
115
+ };
116
+ exports.getSttsBox = getSttsBox;
117
+ const getCttsBox = (trakBox) => {
118
+ const stblBox = (0, exports.getStblBox)(trakBox);
119
+ if (!stblBox || stblBox.type !== 'regular-box') {
120
+ return null;
121
+ }
122
+ const cttsBox = stblBox.children.find((s) => s.type === 'ctts-box');
123
+ return cttsBox;
124
+ };
125
+ exports.getCttsBox = getCttsBox;
71
126
  const getStszBox = (trakBox) => {
72
127
  const stblBox = (0, exports.getStblBox)(trakBox);
73
128
  if (!stblBox || stblBox.type !== 'regular-box') {
@@ -86,3 +141,191 @@ const getStscBox = (trakBox) => {
86
141
  return stcoBox;
87
142
  };
88
143
  exports.getStscBox = getStscBox;
144
+ const getStssBox = (trakBox) => {
145
+ const stblBox = (0, exports.getStblBox)(trakBox);
146
+ if (!stblBox || stblBox.type !== 'regular-box') {
147
+ return null;
148
+ }
149
+ const stssBox = stblBox.children.find((b) => b.type === 'stss-box');
150
+ return stssBox;
151
+ };
152
+ exports.getStssBox = getStssBox;
153
+ const getClusterSegment = (segment) => {
154
+ const clusterSegment = segment.children.find((b) => b.type === 'cluster-segment');
155
+ return clusterSegment !== null && clusterSegment !== void 0 ? clusterSegment : null;
156
+ };
157
+ exports.getClusterSegment = getClusterSegment;
158
+ const getTracksSegment = (segment) => {
159
+ const tracksSegment = segment.children.find((b) => b.type === 'tracks-segment');
160
+ if (!tracksSegment || tracksSegment.type !== 'tracks-segment') {
161
+ return null;
162
+ }
163
+ return tracksSegment;
164
+ };
165
+ exports.getTracksSegment = getTracksSegment;
166
+ const getTimescaleSegment = (segment) => {
167
+ const infoSegment = segment.children.find((b) => b.type === 'info-segment');
168
+ if (!infoSegment || infoSegment.type !== 'info-segment') {
169
+ return null;
170
+ }
171
+ const timescale = infoSegment.children.find((b) => b.type === 'timestamp-scale-segment');
172
+ if (!timescale || timescale.type !== 'timestamp-scale-segment') {
173
+ return null;
174
+ }
175
+ return timescale;
176
+ };
177
+ exports.getTimescaleSegment = getTimescaleSegment;
178
+ const getVideoSegment = (track) => {
179
+ const videoSegment = track.children.find((b) => b.type === 'video-segment');
180
+ if (!videoSegment || videoSegment.type !== 'video-segment') {
181
+ return null;
182
+ }
183
+ return videoSegment !== null && videoSegment !== void 0 ? videoSegment : null;
184
+ };
185
+ exports.getVideoSegment = getVideoSegment;
186
+ const getAudioSegment = (track) => {
187
+ const audioSegment = track.children.find((b) => b.type === 'audio-segment');
188
+ if (!audioSegment || audioSegment.type !== 'audio-segment') {
189
+ return null;
190
+ }
191
+ return audioSegment !== null && audioSegment !== void 0 ? audioSegment : null;
192
+ };
193
+ exports.getAudioSegment = getAudioSegment;
194
+ const getSampleRate = (track) => {
195
+ const audioSegment = (0, exports.getAudioSegment)(track);
196
+ if (!audioSegment) {
197
+ return null;
198
+ }
199
+ const samplingFrequency = audioSegment.children.find((b) => b.type === 'sampling-frequency-segment');
200
+ if (!samplingFrequency ||
201
+ samplingFrequency.type !== 'sampling-frequency-segment') {
202
+ return null;
203
+ }
204
+ return samplingFrequency.samplingFrequency;
205
+ };
206
+ exports.getSampleRate = getSampleRate;
207
+ const getNumberOfChannels = (track) => {
208
+ const audioSegment = (0, exports.getAudioSegment)(track);
209
+ if (!audioSegment) {
210
+ throw new Error('Could not find audio segment');
211
+ }
212
+ const channels = audioSegment.children.find((b) => b.type === 'channels-segment');
213
+ if (!channels || channels.type !== 'channels-segment') {
214
+ return 1;
215
+ }
216
+ return channels.channels;
217
+ };
218
+ exports.getNumberOfChannels = getNumberOfChannels;
219
+ const getBitDepth = (track) => {
220
+ const audioSegment = (0, exports.getAudioSegment)(track);
221
+ if (!audioSegment) {
222
+ return null;
223
+ }
224
+ const bitDepth = audioSegment.children.find((b) => b.type === 'bit-depth-segment');
225
+ if (!bitDepth || bitDepth.type !== 'bit-depth-segment') {
226
+ return null;
227
+ }
228
+ return bitDepth.bitDepth;
229
+ };
230
+ exports.getBitDepth = getBitDepth;
231
+ const getPrivateData = (track) => {
232
+ const privateData = track.children.find((b) => b.type === 'codec-private-segment');
233
+ if (!privateData || privateData.type !== 'codec-private-segment') {
234
+ return null;
235
+ }
236
+ return privateData.codecPrivateData;
237
+ };
238
+ exports.getPrivateData = getPrivateData;
239
+ const getWidthSegment = (track) => {
240
+ const videoSegment = (0, exports.getVideoSegment)(track);
241
+ if (!videoSegment) {
242
+ return null;
243
+ }
244
+ const width = videoSegment.children.find((b) => b.type === 'width-segment');
245
+ if (!width || width.type !== 'width-segment') {
246
+ return null;
247
+ }
248
+ return width;
249
+ };
250
+ exports.getWidthSegment = getWidthSegment;
251
+ const getHeightSegment = (track) => {
252
+ const videoSegment = (0, exports.getVideoSegment)(track);
253
+ if (!videoSegment) {
254
+ return null;
255
+ }
256
+ const height = videoSegment.children.find((b) => b.type === 'height-segment');
257
+ if (!height || height.type !== 'height-segment') {
258
+ return null;
259
+ }
260
+ return height;
261
+ };
262
+ exports.getHeightSegment = getHeightSegment;
263
+ const getDisplayWidthSegment = (track) => {
264
+ const videoSegment = (0, exports.getVideoSegment)(track);
265
+ if (!videoSegment) {
266
+ return null;
267
+ }
268
+ const displayWidth = videoSegment.children.find((b) => b.type === 'display-width-segment');
269
+ if (!displayWidth || displayWidth.type !== 'display-width-segment') {
270
+ return null;
271
+ }
272
+ return displayWidth;
273
+ };
274
+ exports.getDisplayWidthSegment = getDisplayWidthSegment;
275
+ const getDisplayHeightSegment = (track) => {
276
+ const videoSegment = (0, exports.getVideoSegment)(track);
277
+ if (!videoSegment) {
278
+ return null;
279
+ }
280
+ const displayHeight = videoSegment.children.find((b) => b.type === 'display-height-segment');
281
+ if (!displayHeight || displayHeight.type !== 'display-height-segment') {
282
+ return null;
283
+ }
284
+ return displayHeight;
285
+ };
286
+ exports.getDisplayHeightSegment = getDisplayHeightSegment;
287
+ const getTrackTypeSegment = (track) => {
288
+ const trackType = track.children.find((b) => b.type === 'track-type-segment');
289
+ if (!trackType || trackType.type !== 'track-type-segment') {
290
+ return null;
291
+ }
292
+ return trackType;
293
+ };
294
+ exports.getTrackTypeSegment = getTrackTypeSegment;
295
+ const getTrackId = (track) => {
296
+ const trackId = track.children.find((b) => b.type === 'track-number-segment');
297
+ if (!trackId || trackId.type !== 'track-number-segment') {
298
+ throw new Error('Expected track number segment');
299
+ }
300
+ return trackId.trackNumber;
301
+ };
302
+ exports.getTrackId = getTrackId;
303
+ const getCodecSegment = (track) => {
304
+ const codec = track.children.find((b) => b.type === 'codec-segment');
305
+ if (!codec || codec.type !== 'codec-segment') {
306
+ return null;
307
+ }
308
+ return codec;
309
+ };
310
+ exports.getCodecSegment = getCodecSegment;
311
+ const hasSkippedMdatProcessing = (anySegment) => {
312
+ const mdat = anySegment.find((b) => b.type === 'mdat-box');
313
+ if (!mdat) {
314
+ return {
315
+ skipped: false,
316
+ };
317
+ }
318
+ if (mdat.type !== 'mdat-box') {
319
+ throw new Error('Expected mdat-box');
320
+ }
321
+ if (mdat.samplesProcessed) {
322
+ return {
323
+ skipped: false,
324
+ };
325
+ }
326
+ return {
327
+ skipped: true,
328
+ fileOffset: mdat.fileOffset,
329
+ };
330
+ };
331
+ exports.hasSkippedMdatProcessing = hasSkippedMdatProcessing;
@@ -0,0 +1 @@
1
+ declare const understand: (src: string) => Promise<void>;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ const understand = async (src) => {
3
+ const content = await Bun.file(src).arrayBuffer();
4
+ const firstBit = new DataView(content).getUint8(0);
5
+ const offset = new DataView(content).getUint8(1);
6
+ const offset2 = new DataView(content).getUint8(2);
7
+ const globalOffset = firstBit + 1;
8
+ const header = new TextDecoder().decode(content.slice(globalOffset, globalOffset + offset));
9
+ const comment = new TextDecoder().decode(content.slice(globalOffset + offset, globalOffset + offset2));
10
+ const rest = new TextDecoder().decode(content.slice(globalOffset + offset2 + offset, globalOffset + offset2 + offset + 50));
11
+ console.log({ firstBit, offset, offset2, header, comment, rest });
12
+ };