@remotion/media-parser 4.0.208 → 4.0.210

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 (215) 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 +2 -1
  5. package/dist/boxes/iso-base-media/mdat/mdat.js +8 -3
  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 +20 -5
  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 +44 -0
  24. package/dist/boxes/iso-base-media/traversal.js +211 -0
  25. package/dist/boxes/webm/color.d.ts +4 -0
  26. package/dist/boxes/webm/color.js +120 -0
  27. package/dist/boxes/webm/description.js +1 -1
  28. package/dist/boxes/webm/get-ready-tracks.js +3 -3
  29. package/dist/boxes/webm/get-sample-from-block.js +1 -1
  30. package/dist/boxes/webm/get-track.js +16 -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 +5 -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/traversal.d.ts +26 -1
  37. package/dist/boxes/webm/traversal.js +214 -1
  38. package/dist/buffer-iterator.js +6 -0
  39. package/dist/create/cluster-segment.d.ts +1 -1
  40. package/dist/create/cluster-segment.js +3 -5
  41. package/dist/create/cluster.d.ts +13 -0
  42. package/dist/create/cluster.js +54 -0
  43. package/dist/create/create-media.d.ts +4 -2
  44. package/dist/create/create-media.js +87 -47
  45. package/dist/create/cues.d.ts +0 -0
  46. package/dist/create/cues.js +1 -0
  47. package/dist/create/make-duration-with-padding.d.ts +1 -0
  48. package/dist/create/make-duration-with-padding.js +15 -0
  49. package/dist/create/matroska-cues.d.ts +6 -0
  50. package/dist/create/matroska-cues.js +50 -0
  51. package/dist/create/matroska-info.d.ts +1 -2
  52. package/dist/create/matroska-info.js +3 -11
  53. package/dist/create/matroska-seek.d.ts +6 -0
  54. package/dist/create/matroska-seek.js +32 -0
  55. package/dist/create/matroska-segment.d.ts +1 -0
  56. package/dist/create/matroska-segment.js +3 -2
  57. package/dist/create/matroska-trackentry.d.ts +9 -14
  58. package/dist/create/matroska-trackentry.js +79 -94
  59. package/dist/create/timescale.d.ts +1 -0
  60. package/dist/create/timescale.js +4 -0
  61. package/dist/emit-available-info.d.ts +12 -0
  62. package/dist/emit-available-info.js +133 -0
  63. package/dist/esm/buffer.mjs +57 -0
  64. package/dist/esm/from-fetch.mjs +72 -0
  65. package/dist/esm/from-node.mjs +48 -0
  66. package/dist/esm/from-web-file.mjs +48 -0
  67. package/dist/esm/index.mjs +6689 -0
  68. package/dist/esm/web-fs.mjs +67 -0
  69. package/dist/get-audio-codec.d.ts +5 -5
  70. package/dist/get-audio-codec.js +41 -57
  71. package/dist/get-container.d.ts +4 -0
  72. package/dist/get-container.js +26 -0
  73. package/dist/get-duration.js +1 -1
  74. package/dist/get-fps.js +1 -1
  75. package/dist/get-sample-aspect-ratio.d.ts +1 -1
  76. package/dist/get-sample-aspect-ratio.js +19 -19
  77. package/dist/get-tracks.d.ts +13 -0
  78. package/dist/get-tracks.js +8 -8
  79. package/dist/get-video-codec.d.ts +5 -2
  80. package/dist/get-video-codec.js +111 -21
  81. package/dist/has-all-info.d.ts +2 -2
  82. package/dist/has-all-info.js +23 -9
  83. package/dist/index.d.ts +3 -1
  84. package/dist/options.d.ts +97 -30
  85. package/dist/parse-media.js +43 -62
  86. package/dist/parse-video.d.ts +2 -1
  87. package/dist/parse-video.js +3 -1
  88. package/dist/parser-state.js +1 -2
  89. package/dist/readers/from-fetch.js +24 -4
  90. package/dist/readers/from-node.js +13 -3
  91. package/dist/readers/from-web-file.js +14 -2
  92. package/dist/readers/reader.d.ts +6 -1
  93. package/dist/samples-from-moof.js +1 -1
  94. package/dist/traversal.d.ts +0 -21
  95. package/dist/traversal.js +1 -158
  96. package/dist/truthy.d.ts +3 -0
  97. package/dist/truthy.js +7 -0
  98. package/dist/writers/buffer.d.ts +2 -0
  99. package/dist/writers/buffer.js +58 -0
  100. package/dist/writers/web-fs.d.ts +1 -0
  101. package/dist/writers/web-fs.js +42 -18
  102. package/dist/writers/writer.d.ts +4 -2
  103. package/fetch.js +2 -0
  104. package/node.js +2 -0
  105. package/package.json +43 -8
  106. package/web-file.js +2 -0
  107. package/web-fs.js +2 -0
  108. package/.eslintrc +0 -8
  109. package/input.webm +0 -0
  110. package/src/add-new-matroska-tracks.ts +0 -23
  111. package/src/boxes/iso-base-media/base-type.ts +0 -4
  112. package/src/boxes/iso-base-media/esds/decoder-specific-config.ts +0 -68
  113. package/src/boxes/iso-base-media/esds/esds-descriptors.ts +0 -135
  114. package/src/boxes/iso-base-media/esds/esds.ts +0 -49
  115. package/src/boxes/iso-base-media/ftyp.ts +0 -39
  116. package/src/boxes/iso-base-media/get-sample-positions-from-track.ts +0 -69
  117. package/src/boxes/iso-base-media/make-track.ts +0 -116
  118. package/src/boxes/iso-base-media/mdat/mdat.ts +0 -140
  119. package/src/boxes/iso-base-media/mdhd.ts +0 -59
  120. package/src/boxes/iso-base-media/moov/moov.ts +0 -43
  121. package/src/boxes/iso-base-media/mvhd.ts +0 -114
  122. package/src/boxes/iso-base-media/process-box.ts +0 -748
  123. package/src/boxes/iso-base-media/stsd/av1c.ts +0 -19
  124. package/src/boxes/iso-base-media/stsd/avcc.ts +0 -36
  125. package/src/boxes/iso-base-media/stsd/colr.ts +0 -49
  126. package/src/boxes/iso-base-media/stsd/ctts.ts +0 -64
  127. package/src/boxes/iso-base-media/stsd/hvcc.ts +0 -32
  128. package/src/boxes/iso-base-media/stsd/keys.ts +0 -27
  129. package/src/boxes/iso-base-media/stsd/mebx.ts +0 -54
  130. package/src/boxes/iso-base-media/stsd/pasp.ts +0 -32
  131. package/src/boxes/iso-base-media/stsd/samples.ts +0 -359
  132. package/src/boxes/iso-base-media/stsd/stco.ts +0 -52
  133. package/src/boxes/iso-base-media/stsd/stsc.ts +0 -61
  134. package/src/boxes/iso-base-media/stsd/stsd.ts +0 -55
  135. package/src/boxes/iso-base-media/stsd/stss.ts +0 -47
  136. package/src/boxes/iso-base-media/stsd/stsz.ts +0 -75
  137. package/src/boxes/iso-base-media/stsd/stts.ts +0 -62
  138. package/src/boxes/iso-base-media/tfdt.ts +0 -37
  139. package/src/boxes/iso-base-media/tfhd.ts +0 -66
  140. package/src/boxes/iso-base-media/tkhd.ts +0 -150
  141. package/src/boxes/iso-base-media/to-date.ts +0 -9
  142. package/src/boxes/iso-base-media/trak/trak.ts +0 -43
  143. package/src/boxes/iso-base-media/trun.ts +0 -74
  144. package/src/boxes/iso-base-media/void-box.ts +0 -4
  145. package/src/boxes/webm/allowed-partial-segments.ts +0 -1
  146. package/src/boxes/webm/av1-codec-private.ts +0 -113
  147. package/src/boxes/webm/description.ts +0 -104
  148. package/src/boxes/webm/ebml.ts +0 -98
  149. package/src/boxes/webm/get-ready-tracks.ts +0 -36
  150. package/src/boxes/webm/get-sample-from-block.ts +0 -125
  151. package/src/boxes/webm/get-track.ts +0 -257
  152. package/src/boxes/webm/make-header.ts +0 -253
  153. package/src/boxes/webm/parse-ebml.ts +0 -255
  154. package/src/boxes/webm/parse-webm-header.ts +0 -18
  155. package/src/boxes/webm/segments/all-segments.ts +0 -888
  156. package/src/boxes/webm/segments/block-simple-block-flags.ts +0 -52
  157. package/src/boxes/webm/segments/parse-children.ts +0 -144
  158. package/src/boxes/webm/segments/track-entry.ts +0 -38
  159. package/src/boxes/webm/segments.ts +0 -147
  160. package/src/boxes/webm/traversal.ts +0 -45
  161. package/src/buffer-iterator.ts +0 -548
  162. package/src/create/cluster-segment.ts +0 -62
  163. package/src/create/create-media.ts +0 -172
  164. package/src/create/matroska-header.ts +0 -63
  165. package/src/create/matroska-info.ts +0 -46
  166. package/src/create/matroska-segment.ts +0 -10
  167. package/src/create/matroska-trackentry.ts +0 -325
  168. package/src/get-audio-codec.ts +0 -270
  169. package/src/get-dimensions.ts +0 -47
  170. package/src/get-duration.ts +0 -103
  171. package/src/get-fps.ts +0 -113
  172. package/src/get-sample-aspect-ratio.ts +0 -204
  173. package/src/get-sample-positions.ts +0 -93
  174. package/src/get-tracks.ts +0 -147
  175. package/src/get-video-codec.ts +0 -117
  176. package/src/has-all-info.ts +0 -81
  177. package/src/index.ts +0 -18
  178. package/src/make-hvc1-codec-strings.ts +0 -55
  179. package/src/options.ts +0 -118
  180. package/src/parse-media.ts +0 -183
  181. package/src/parse-result.ts +0 -79
  182. package/src/parse-video.ts +0 -83
  183. package/src/parser-context.ts +0 -10
  184. package/src/parser-state.ts +0 -178
  185. package/src/readers/from-fetch.ts +0 -90
  186. package/src/readers/from-node.ts +0 -51
  187. package/src/readers/from-web-file.ts +0 -49
  188. package/src/readers/reader.ts +0 -15
  189. package/src/samples-from-moof.ts +0 -102
  190. package/src/test/aspect-ratio.test.ts +0 -42
  191. package/src/test/av1.test.ts +0 -108
  192. package/src/test/create-matroska.test.ts +0 -287
  193. package/src/test/duration.test.ts +0 -18
  194. package/src/test/keys.test.ts +0 -47
  195. package/src/test/matroska.test.ts +0 -463
  196. package/src/test/mvhd.test.ts +0 -94
  197. package/src/test/parse-esds.test.ts +0 -98
  198. package/src/test/parse-stco.test.ts +0 -61
  199. package/src/test/parse-stsc.test.ts +0 -104
  200. package/src/test/parse-stsz.test.ts +0 -57
  201. package/src/test/parse-stts.test.ts +0 -38
  202. package/src/test/parse-video.test.ts +0 -101
  203. package/src/test/parse-webm.test.ts +0 -17
  204. package/src/test/samples-from-moof.test.ts +0 -2496
  205. package/src/test/stream-local.test.ts +0 -743
  206. package/src/test/stream-remote.test.ts +0 -59
  207. package/src/test/stream-samples.test.ts +0 -181
  208. package/src/test/stsd.test.ts +0 -265
  209. package/src/test/tkhd.test.ts +0 -87
  210. package/src/traversal.ts +0 -528
  211. package/src/webcodec-sample-types.ts +0 -29
  212. package/src/writers/web-fs.ts +0 -50
  213. package/src/writers/writer.ts +0 -12
  214. package/tsconfig.json +0 -14
  215. package/tsconfig.tsbuildinfo +0 -1
@@ -1,257 +0,0 @@
1
- import {getArrayBufferIterator} from '../../buffer-iterator';
2
- import type {AudioTrack, VideoTrack} from '../../get-tracks';
3
- import {getHvc1CodecString} from '../../make-hvc1-codec-strings';
4
- import {
5
- getBitDepth,
6
- getCodecSegment,
7
- getDisplayHeightSegment,
8
- getDisplayWidthSegment,
9
- getHeightSegment,
10
- getNumberOfChannels,
11
- getPrivateData,
12
- getSampleRate,
13
- getTrackId,
14
- getTrackTypeSegment,
15
- getWidthSegment,
16
- } from '../../traversal';
17
- import {parseAv1PrivateData} from './av1-codec-private';
18
- import {getAudioDescription} from './description';
19
- import type {CodecIdSegment, TrackEntry} from './segments/all-segments';
20
- import {trackTypeToString} from './segments/track-entry';
21
-
22
- const getDescription = (track: TrackEntry): undefined | Uint8Array => {
23
- const codec = getCodecSegment(track);
24
- if (!codec) {
25
- return undefined;
26
- }
27
-
28
- if (codec.value === 'V_MPEG4/ISO/AVC' || codec.value === 'V_MPEGH/ISO/HEVC') {
29
- const priv = getPrivateData(track);
30
- if (priv) {
31
- return priv;
32
- }
33
- }
34
-
35
- return undefined;
36
- };
37
-
38
- const getMatroskaVideoCodecString = ({
39
- track,
40
- codecSegment: codec,
41
- }: {
42
- track: TrackEntry;
43
- codecSegment: CodecIdSegment;
44
- }): string | null => {
45
- if (codec.value === 'V_VP8') {
46
- return 'vp8';
47
- }
48
-
49
- if (codec.value === 'V_VP9') {
50
- const priv = getPrivateData(track);
51
- if (priv) {
52
- throw new Error(
53
- '@remotion/media-parser cannot handle the private data for VP9. Do you have an example file you could send so we can implement it?',
54
- );
55
- }
56
-
57
- return 'vp09.00.10.08';
58
- }
59
-
60
- if (codec.value === 'V_MPEG4/ISO/AVC') {
61
- const priv = getPrivateData(track);
62
- if (priv) {
63
- return `avc1.${priv[1].toString(16).padStart(2, '0')}${priv[2].toString(16).padStart(2, '0')}${priv[3].toString(16).padStart(2, '0')}`;
64
- }
65
-
66
- throw new Error('Could not find a CodecPrivate field in TrackEntry');
67
- }
68
-
69
- if (codec.value === 'V_AV1') {
70
- const priv = getPrivateData(track);
71
-
72
- if (!priv) {
73
- throw new Error('Expected private data in AV1 track');
74
- }
75
-
76
- return parseAv1PrivateData(priv, null);
77
- }
78
-
79
- if (codec.value === 'V_MPEGH/ISO/HEVC') {
80
- const priv = getPrivateData(track);
81
- const iterator = getArrayBufferIterator(
82
- priv as Uint8Array,
83
- (priv as Uint8Array).length,
84
- );
85
-
86
- return 'hvc1.' + getHvc1CodecString(iterator);
87
- }
88
-
89
- throw new Error(`Unknown codec: ${codec.value}`);
90
- };
91
-
92
- const getMatroskaAudioCodecString = (track: TrackEntry): string => {
93
- const codec = getCodecSegment(track);
94
- if (!codec) {
95
- throw new Error('Expected codec segment');
96
- }
97
-
98
- if (codec.value === 'A_OPUS') {
99
- return 'opus';
100
- }
101
-
102
- if (codec.value === 'A_VORBIS') {
103
- return 'vorbis';
104
- }
105
-
106
- if (codec.value === 'A_PCM/INT/LIT') {
107
- // https://github.com/ietf-wg-cellar/matroska-specification/issues/142#issuecomment-330004950
108
- // Audio samples MUST be considered as signed values, except if the audio bit depth is 8 which MUST be interpreted as unsigned values.
109
-
110
- const bitDepth = getBitDepth(track);
111
- if (bitDepth === null) {
112
- throw new Error('Expected bit depth');
113
- }
114
-
115
- if (bitDepth === 8) {
116
- return 'pcm-u8';
117
- }
118
-
119
- return 'pcm-s' + bitDepth;
120
- }
121
-
122
- if (codec.value === 'A_AAC') {
123
- const priv = getPrivateData(track);
124
-
125
- const iterator = getArrayBufferIterator(
126
- priv as Uint8Array,
127
- (priv as Uint8Array).length,
128
- );
129
-
130
- iterator.startReadingBits();
131
- /**
132
- * ChatGPT
133
- * ▪ The first 5 bits represent the AOT.
134
- ▪ Common values:
135
- ◦ 1 for AAC Main
136
- ◦ 2 for AAC LC (Low Complexity)
137
- ◦ 3 for AAC SSR (Scalable Sample Rate)
138
- ◦ 4 for AAC LTP (Long Term Prediction)
139
- ◦ 5 for SBR (Spectral Band Replication)
140
- ◦ 29 for HE-AAC (which uses SBR with AAC LC)
141
- */
142
- /**
143
- * Fully qualified codec:
144
- * This codec has multiple possible codec strings:
145
- "mp4a.40.2" — MPEG-4 AAC LC
146
- "mp4a.40.02" — MPEG-4 AAC LC, leading 0 for Aud-OTI compatibility
147
- "mp4a.40.5" — MPEG-4 HE-AAC v1 (AAC LC + SBR)
148
- "mp4a.40.05" — MPEG-4 HE-AAC v1 (AAC LC + SBR), leading 0 for Aud-OTI compatibility
149
- "mp4a.40.29" — MPEG-4 HE-AAC v2 (AAC LC + SBR + PS)
150
- "mp4a.67" — MPEG-2 AAC LC
151
- */
152
-
153
- const profile = iterator.getBits(5);
154
- iterator.stopReadingBits();
155
- iterator.destroy();
156
-
157
- return `mp4a.40.${profile.toString().padStart(2, '0')}`;
158
- }
159
-
160
- if (codec.value === 'A_MPEG/L3') {
161
- return 'mp3';
162
- }
163
-
164
- throw new Error(`Unknown codec: ${codec.value}`);
165
- };
166
-
167
- export const getTrack = ({
168
- timescale,
169
- track,
170
- }: {
171
- timescale: number;
172
- track: TrackEntry;
173
- }): VideoTrack | AudioTrack | null => {
174
- const trackType = getTrackTypeSegment(track);
175
-
176
- if (!trackType) {
177
- throw new Error('Expected track type segment');
178
- }
179
-
180
- const trackId = getTrackId(track);
181
-
182
- if (trackTypeToString(trackType.value.value) === 'video') {
183
- const width = getWidthSegment(track);
184
-
185
- if (width === null) {
186
- throw new Error('Expected width segment');
187
- }
188
-
189
- const height = getHeightSegment(track);
190
-
191
- if (height === null) {
192
- throw new Error('Expected height segment');
193
- }
194
-
195
- const displayHeight = getDisplayHeightSegment(track);
196
- const displayWidth = getDisplayWidthSegment(track);
197
-
198
- const codec = getCodecSegment(track);
199
- if (!codec) {
200
- return null;
201
- }
202
-
203
- const codecString = getMatroskaVideoCodecString({
204
- track,
205
- codecSegment: codec,
206
- });
207
-
208
- if (!codecString) {
209
- return null;
210
- }
211
-
212
- return {
213
- type: 'video',
214
- trackId,
215
- codec: codecString,
216
- description: getDescription(track),
217
- height: displayHeight ? displayHeight.value.value : height.value.value,
218
- width: displayWidth ? displayWidth.value.value : width.value.value,
219
- sampleAspectRatio: {
220
- numerator: 1,
221
- denominator: 1,
222
- },
223
- timescale,
224
- codedHeight: height.value.value,
225
- codedWidth: width.value.value,
226
- displayAspectHeight: displayHeight
227
- ? displayHeight.value.value
228
- : height.value.value,
229
- displayAspectWidth: displayWidth
230
- ? displayWidth.value.value
231
- : width.value.value,
232
- rotation: 0,
233
- trakBox: null,
234
- };
235
- }
236
-
237
- if (trackTypeToString(trackType.value.value) === 'audio') {
238
- const sampleRate = getSampleRate(track);
239
- const numberOfChannels = getNumberOfChannels(track);
240
- if (sampleRate === null) {
241
- throw new Error('Could not find sample rate or number of channels');
242
- }
243
-
244
- return {
245
- type: 'audio',
246
- trackId,
247
- codec: getMatroskaAudioCodecString(track),
248
- timescale,
249
- numberOfChannels,
250
- sampleRate,
251
- description: getAudioDescription(track),
252
- trakBox: null,
253
- };
254
- }
255
-
256
- return null;
257
- };
@@ -1,253 +0,0 @@
1
- import {getVariableInt} from './ebml';
2
- import type {
3
- BytesAndOffset,
4
- FloatWithSize,
5
- OffsetAndChildren,
6
- PossibleEbml,
7
- PossibleEbmlOrUint8Array,
8
- UintWithSize,
9
- } from './segments/all-segments';
10
- import {
11
- ebmlMap,
12
- getIdForName,
13
- incrementOffsetAndChildren,
14
- matroskaElements,
15
- } from './segments/all-segments';
16
-
17
- export const webmPattern = new Uint8Array([0x1a, 0x45, 0xdf, 0xa3]);
18
-
19
- export const matroskaToHex = (
20
- matrId: (typeof matroskaElements)[keyof typeof matroskaElements],
21
- ) => {
22
- const numbers: Uint8Array = new Uint8Array((matrId.length - 2) / 2);
23
-
24
- for (let i = 2; i < matrId.length; i += 2) {
25
- const hex = matrId.substring(i, i + 2);
26
- numbers[(i - 2) / 2] = parseInt(hex, 16);
27
- }
28
-
29
- return numbers;
30
- };
31
-
32
- function putUintDynamic(number: number, minimumLength: number | null) {
33
- if (number < 0) {
34
- throw new Error(
35
- 'This function is designed for non-negative integers only.',
36
- );
37
- }
38
-
39
- // Calculate the minimum number of bytes needed to store the integer
40
- const length = Math.max(
41
- minimumLength ?? 0,
42
- Math.ceil(Math.log2(number + 1) / 8),
43
- );
44
- const bytes = new Uint8Array(length);
45
-
46
- for (let i = 0; i < length; i++) {
47
- // Extract each byte from the number
48
- bytes[length - 1 - i] = (number >> (8 * i)) & 0xff;
49
- }
50
-
51
- return bytes;
52
- }
53
-
54
- const makeFromStructure = (
55
- fields: PossibleEbmlOrUint8Array,
56
- ): BytesAndOffset => {
57
- if ('bytes' in fields) {
58
- return fields;
59
- }
60
-
61
- const arrays: Uint8Array[] = [];
62
-
63
- const struct = ebmlMap[getIdForName(fields.type)];
64
-
65
- if (struct.type === 'uint8array') {
66
- return {
67
- bytes: fields.value as Uint8Array,
68
- offsets: {offset: 0, children: [], field: fields.type},
69
- };
70
- }
71
-
72
- if (struct.type === 'children') {
73
- const children: OffsetAndChildren[] = [];
74
- let bytesWritten = 0;
75
- for (const item of fields.value as PossibleEbml[]) {
76
- const {bytes, offsets} = makeMatroskaBytes(item);
77
- arrays.push(bytes);
78
- children.push(incrementOffsetAndChildren(offsets, bytesWritten));
79
- bytesWritten += bytes.byteLength;
80
- }
81
-
82
- return {
83
- bytes: combineUint8Arrays(arrays),
84
- offsets: {offset: 0, children, field: fields.type},
85
- };
86
- }
87
-
88
- if (struct.type === 'string') {
89
- return {
90
- bytes: new TextEncoder().encode(fields.value as string),
91
- offsets: {
92
- children: [],
93
- offset: 0,
94
- field: fields.type,
95
- },
96
- };
97
- }
98
-
99
- if (struct.type === 'uint') {
100
- return {
101
- bytes: putUintDynamic(
102
- (fields.value as UintWithSize).value,
103
- (fields.value as UintWithSize).byteLength,
104
- ),
105
- offsets: {
106
- children: [],
107
- offset: 0,
108
- field: fields.type,
109
- },
110
- };
111
- }
112
-
113
- if (struct.type === 'hex-string') {
114
- const hex = (fields.value as string).substring(2);
115
- const arr = new Uint8Array(hex.length / 2);
116
- for (let i = 0; i < hex.length; i += 2) {
117
- const byte = parseInt(hex.substring(i, i + 2), 16);
118
- arr[i / 2] = byte;
119
- }
120
-
121
- return {
122
- bytes: arr,
123
- offsets: {
124
- children: [],
125
- offset: 0,
126
- field: fields.type,
127
- },
128
- };
129
- }
130
-
131
- if (struct.type === 'float') {
132
- const value = fields.value as FloatWithSize;
133
- if (value.size === '32') {
134
- const dataView = new DataView(new ArrayBuffer(4));
135
- dataView.setFloat32(0, value.value);
136
- return {
137
- bytes: new Uint8Array(dataView.buffer),
138
- offsets: {
139
- children: [],
140
- offset: 0,
141
- field: fields.type,
142
- },
143
- };
144
- }
145
-
146
- const dataView2 = new DataView(new ArrayBuffer(8));
147
- dataView2.setFloat64(0, value.value);
148
- return {
149
- bytes: new Uint8Array(dataView2.buffer),
150
- offsets: {
151
- children: [],
152
- offset: 0,
153
- field: fields.type,
154
- },
155
- };
156
- }
157
-
158
- throw new Error('Unexpected type');
159
- };
160
-
161
- export const makeMatroskaBytes = (
162
- fields: PossibleEbmlOrUint8Array,
163
- ): BytesAndOffset => {
164
- if ('bytes' in fields) {
165
- return fields;
166
- }
167
-
168
- const value = makeFromStructure(fields);
169
- const header = matroskaToHex(getIdForName(fields.type));
170
- const size = getVariableInt(value.bytes.length, fields.minVintWidth);
171
-
172
- const bytes = combineUint8Arrays([header, size, value.bytes]);
173
-
174
- return {
175
- bytes,
176
- offsets: {
177
- offset: value.offsets.offset,
178
- field: value.offsets.field,
179
- children: value.offsets.children.map((c) => {
180
- return incrementOffsetAndChildren(
181
- c,
182
- header.byteLength + size.byteLength,
183
- );
184
- }),
185
- },
186
- };
187
- };
188
-
189
- export const padMatroskaBytes = (
190
- fields: PossibleEbmlOrUint8Array,
191
- totalLength: number,
192
- ): BytesAndOffset[] => {
193
- const regular = makeMatroskaBytes(fields);
194
- const paddingLength =
195
- totalLength -
196
- regular.bytes.byteLength -
197
- matroskaToHex(matroskaElements.Void).byteLength;
198
-
199
- if (paddingLength < 0) {
200
- throw new Error('ooops');
201
- }
202
-
203
- const padding = makeMatroskaBytes({
204
- type: 'Void',
205
- value: new Uint8Array(paddingLength).fill(0),
206
- minVintWidth: null,
207
- });
208
-
209
- return [
210
- regular,
211
- {
212
- bytes: padding.bytes,
213
- offsets: incrementOffsetAndChildren(
214
- padding.offsets,
215
- regular.bytes.length,
216
- ),
217
- },
218
- ];
219
- };
220
-
221
- export const combineUint8Arrays = (arrays: Uint8Array[]) => {
222
- if (arrays.length === 0) {
223
- return new Uint8Array([]);
224
- }
225
-
226
- if (arrays.length === 1) {
227
- return arrays[0];
228
- }
229
-
230
- let totalLength = 0;
231
- for (const array of arrays) {
232
- totalLength += array.length;
233
- }
234
-
235
- const result = new Uint8Array(totalLength);
236
- let offset = 0;
237
- for (const array of arrays) {
238
- result.set(array, offset);
239
- offset += array.length;
240
- }
241
-
242
- return result;
243
- };
244
-
245
- export function serializeUint16(value: number): Uint8Array {
246
- const buffer = new ArrayBuffer(2);
247
-
248
- const view = new DataView(buffer);
249
-
250
- view.setUint16(0, value);
251
-
252
- return new Uint8Array(buffer);
253
- }