@remotion/media-parser 4.0.201 → 4.0.204

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 (144) hide show
  1. package/dist/av1-codec-string.d.ts +0 -5
  2. package/dist/av1-codec-string.js +1 -18
  3. package/dist/boxes/iso-base-media/ftype.d.ts +9 -0
  4. package/dist/boxes/iso-base-media/ftype.js +31 -0
  5. package/dist/boxes/iso-base-media/get-sample-positions-from-track.d.ts +4 -0
  6. package/dist/boxes/iso-base-media/get-sample-positions-from-track.js +48 -0
  7. package/dist/boxes/iso-base-media/mvhd.js +2 -2
  8. package/dist/boxes/iso-base-media/stsd/keys.js +1 -1
  9. package/dist/boxes/iso-base-media/tfdt.d.ts +12 -0
  10. package/dist/boxes/iso-base-media/tfdt.js +20 -0
  11. package/dist/boxes/iso-base-media/tfhd.d.ts +16 -0
  12. package/dist/boxes/iso-base-media/tfhd.js +41 -0
  13. package/dist/boxes/iso-base-media/trun.d.ts +21 -0
  14. package/dist/boxes/iso-base-media/trun.js +44 -0
  15. package/dist/boxes/webm/av1-codec-private.js +1 -1
  16. package/dist/boxes/webm/bitstream/av1.js +1 -10
  17. package/dist/boxes/webm/description.d.ts +2 -2
  18. package/dist/boxes/webm/description.js +2 -2
  19. package/dist/boxes/webm/ebml.d.ts +2 -2
  20. package/dist/boxes/webm/ebml.js +23 -1
  21. package/dist/boxes/webm/get-ready-tracks.d.ts +1 -1
  22. package/dist/boxes/webm/get-ready-tracks.js +3 -3
  23. package/dist/boxes/webm/get-sample-from-block.d.ts +17 -0
  24. package/dist/boxes/webm/get-sample-from-block.js +78 -0
  25. package/dist/boxes/webm/get-track.d.ts +2 -2
  26. package/dist/boxes/webm/get-track.js +26 -25
  27. package/dist/boxes/webm/make-header.d.ts +3 -8
  28. package/dist/boxes/webm/make-header.js +43 -20
  29. package/dist/boxes/webm/parse-ebml.d.ts +9 -4
  30. package/dist/boxes/webm/parse-ebml.js +122 -13
  31. package/dist/boxes/webm/segments/all-segments.d.ts +421 -107
  32. package/dist/boxes/webm/segments/all-segments.js +260 -33
  33. package/dist/boxes/webm/segments/track-entry.d.ts +3 -191
  34. package/dist/boxes/webm/segments/track-entry.js +2 -456
  35. package/dist/boxes/webm/segments.d.ts +3 -16
  36. package/dist/boxes/webm/segments.js +12 -196
  37. package/dist/boxes/webm/tracks.d.ts +8 -0
  38. package/dist/boxes/webm/tracks.js +21 -0
  39. package/dist/boxes/webm/traversal.d.ts +5 -6
  40. package/dist/boxes/webm/traversal.js +6 -6
  41. package/dist/buffer-iterator.d.ts +1 -1
  42. package/dist/buffer-iterator.js +3 -3
  43. package/dist/from-web.js +6 -15
  44. package/dist/get-audio-codec.d.ts +1 -1
  45. package/dist/get-audio-codec.js +13 -13
  46. package/dist/get-duration.js +12 -14
  47. package/dist/get-tracks.js +2 -2
  48. package/dist/get-video-codec.js +13 -13
  49. package/dist/get-video-metadata.d.ts +2 -0
  50. package/dist/get-video-metadata.js +44 -0
  51. package/dist/parse-media.js +4 -1
  52. package/dist/parser-context.d.ts +1 -0
  53. package/dist/parser-state.js +3 -2
  54. package/dist/read-and-increment-offset.d.ts +28 -0
  55. package/dist/read-and-increment-offset.js +177 -0
  56. package/dist/samples-from-moof.d.ts +6 -0
  57. package/dist/samples-from-moof.js +74 -0
  58. package/dist/traversal.d.ts +19 -17
  59. package/dist/traversal.js +38 -39
  60. package/dist/understand-vorbis.d.ts +1 -0
  61. package/dist/understand-vorbis.js +12 -0
  62. package/input.webm +0 -0
  63. package/package.json +2 -2
  64. package/src/boxes/iso-base-media/get-sample-positions-from-track.ts +69 -0
  65. package/src/boxes/iso-base-media/make-track.ts +4 -45
  66. package/src/boxes/iso-base-media/mdat/mdat.ts +33 -24
  67. package/src/boxes/iso-base-media/mdhd.ts +10 -7
  68. package/src/boxes/iso-base-media/mvhd.ts +17 -16
  69. package/src/boxes/iso-base-media/process-box.ts +42 -0
  70. package/src/boxes/iso-base-media/stsd/keys.ts +1 -1
  71. package/src/boxes/iso-base-media/tfdt.ts +37 -0
  72. package/src/boxes/iso-base-media/tfhd.ts +66 -0
  73. package/src/boxes/iso-base-media/tkhd.ts +11 -13
  74. package/src/boxes/iso-base-media/trun.ts +74 -0
  75. package/src/boxes/webm/av1-codec-private.ts +1 -1
  76. package/src/boxes/webm/description.ts +7 -4
  77. package/src/boxes/webm/ebml.ts +24 -4
  78. package/src/boxes/webm/get-ready-tracks.ts +4 -4
  79. package/src/boxes/webm/get-sample-from-block.ts +125 -0
  80. package/src/boxes/webm/get-track.ts +40 -33
  81. package/src/boxes/webm/make-header.ts +58 -51
  82. package/src/boxes/webm/parse-ebml.ts +170 -16
  83. package/src/boxes/webm/segments/all-segments.ts +379 -62
  84. package/src/boxes/webm/segments/track-entry.ts +3 -846
  85. package/src/boxes/webm/segments.ts +18 -410
  86. package/src/boxes/webm/traversal.ts +17 -17
  87. package/src/buffer-iterator.ts +8 -6
  88. package/src/get-audio-codec.ts +14 -16
  89. package/src/get-duration.ts +55 -21
  90. package/src/get-tracks.ts +6 -6
  91. package/src/get-video-codec.ts +13 -15
  92. package/src/has-all-info.ts +1 -1
  93. package/src/parse-media.ts +7 -2
  94. package/src/parse-result.ts +7 -1
  95. package/src/parser-context.ts +1 -0
  96. package/src/parser-state.ts +2 -2
  97. package/src/samples-from-moof.ts +101 -0
  98. package/src/test/create-matroska.test.ts +237 -23
  99. package/src/test/matroska.test.ts +283 -348
  100. package/src/test/mvhd.test.ts +1 -1
  101. package/src/test/parse-esds.test.ts +2 -2
  102. package/src/test/parse-stco.test.ts +2 -2
  103. package/src/test/parse-stsc.test.ts +2 -2
  104. package/src/test/parse-stsz.test.ts +2 -2
  105. package/src/test/parse-stts.test.ts +1 -1
  106. package/src/test/samples-from-moof.test.ts +2496 -0
  107. package/src/test/stream-local.test.ts +28 -30
  108. package/src/test/stream-samples.test.ts +153 -231
  109. package/src/test/stsd.test.ts +4 -2
  110. package/src/test/tkhd.test.ts +1 -1
  111. package/src/traversal.ts +118 -86
  112. package/tsconfig.tsbuildinfo +1 -1
  113. package/dist/bitstream/av1.d.ts +0 -2
  114. package/dist/bitstream/av1.js +0 -12
  115. package/dist/boxes/iso-base-media/avcc-hvcc.d.ts +0 -20
  116. package/dist/boxes/iso-base-media/avcc-hvcc.js +0 -73
  117. package/dist/boxes/iso-base-media/avcc.d.ts +0 -18
  118. package/dist/boxes/iso-base-media/avcc.js +0 -27
  119. package/dist/boxes/iso-base-media/esds-descriptors.d.ts +0 -21
  120. package/dist/boxes/iso-base-media/esds-descriptors.js +0 -62
  121. package/dist/boxes/iso-base-media/esds.d.ts +0 -15
  122. package/dist/boxes/iso-base-media/esds.js +0 -27
  123. package/dist/from-input-type-file.d.ts +0 -2
  124. package/dist/from-input-type-file.js +0 -37
  125. package/dist/get-codec.d.ts +0 -4
  126. package/dist/get-codec.js +0 -22
  127. package/dist/web-file.d.ts +0 -2
  128. package/dist/web-file.js +0 -37
  129. package/src/boxes/webm/segments/duration.ts +0 -29
  130. package/src/boxes/webm/segments/info.ts +0 -34
  131. package/src/boxes/webm/segments/main.ts +0 -6
  132. package/src/boxes/webm/segments/muxing.ts +0 -18
  133. package/src/boxes/webm/segments/seek-head.ts +0 -34
  134. package/src/boxes/webm/segments/seek-position.ts +0 -18
  135. package/src/boxes/webm/segments/seek.ts +0 -55
  136. package/src/boxes/webm/segments/timestamp-scale.ts +0 -17
  137. package/src/boxes/webm/segments/tracks.ts +0 -32
  138. package/src/boxes/webm/segments/void.ts +0 -18
  139. package/src/boxes/webm/segments/writing.ts +0 -18
  140. package/src/combine-uint8array.ts +0 -13
  141. /package/dist/{get-samples.d.ts → boxes/webm/bitstream/av1/frame.d.ts} +0 -0
  142. /package/dist/{get-samples.js → boxes/webm/bitstream/av1/frame.js} +0 -0
  143. /package/dist/{sample-aspect-ratio.d.ts → boxes/webm/bitstream/h264/get-h264-descriptor.d.ts} +0 -0
  144. /package/dist/{sample-aspect-ratio.js → boxes/webm/bitstream/h264/get-h264-descriptor.js} +0 -0
@@ -1,164 +1,13 @@
1
- import {registerTrack} from '../../add-new-matroska-tracks';
2
1
  import type {BufferIterator} from '../../buffer-iterator';
3
2
  import type {ParseResult} from '../../parse-result';
4
3
  import type {ParserContext} from '../../parser-context';
5
- import type {VideoSample} from '../../webcodec-sample-types';
6
- import {getTrack} from './get-track';
7
- import {parseEbml} from './parse-ebml';
8
- import type {PossibleEbml} from './segments/all-segments';
9
- import {matroskaElements} from './segments/all-segments';
10
- import type {DurationSegment} from './segments/duration';
11
- import {parseDurationSegment} from './segments/duration';
12
- import type {InfoSegment} from './segments/info';
13
- import {parseInfoSegment} from './segments/info';
14
- import {type MainSegment} from './segments/main';
15
- import {parseMuxingSegment, type MuxingAppSegment} from './segments/muxing';
4
+ import {parseEbml, postprocessEbml} from './parse-ebml';
5
+ import type {PossibleEbml, TrackEntry} from './segments/all-segments';
16
6
  import {expectChildren} from './segments/parse-children';
17
- import type {SeekIdSegment} from './segments/seek';
18
- import {
19
- parseSeekIdSegment,
20
- parseSeekSegment,
21
- type SeekSegment,
22
- } from './segments/seek';
23
- import type {SeekHeadSegment} from './segments/seek-head';
24
- import {parseSeekHeadSegment} from './segments/seek-head';
25
- import {
26
- parseSeekPositionSegment,
27
- type SeekPositionSegment,
28
- } from './segments/seek-position';
29
- import type {TimestampScaleSegment} from './segments/timestamp-scale';
30
- import {parseTimestampScaleSegment} from './segments/timestamp-scale';
31
- import type {
32
- AlphaModeSegment,
33
- AudioSegment,
34
- BitDepthSegment,
35
- BlockAdditionsSegment,
36
- BlockElement,
37
- BlockGroupSegment,
38
- ChannelsSegment,
39
- ClusterSegment,
40
- CodecPrivateSegment,
41
- CodecSegment,
42
- ColorSegment,
43
- Crc32Segment,
44
- DefaultDurationSegment,
45
- DefaultFlagSegment,
46
- DisplayHeightSegment,
47
- DisplayWidthSegment,
48
- FlagLacingSegment,
49
- HeightSegment,
50
- InterlacedSegment,
51
- LanguageSegment,
52
- MaxBlockAdditionId,
53
- ReferenceBlockSegment,
54
- SamplingFrequencySegment,
55
- SegmentUUIDSegment,
56
- SimpleBlockOrBlockSegment,
57
- TagSegment,
58
- TagsSegment,
59
- TimestampSegment,
60
- TitleSegment,
61
- TrackEntrySegment,
62
- TrackNumberSegment,
63
- TrackTypeSegment,
64
- TrackUIDSegment,
65
- VideoSegment,
66
- WidthSegment,
67
- } from './segments/track-entry';
68
- import {
69
- parseAlphaModeSegment,
70
- parseAudioSegment,
71
- parseBitDepthSegment,
72
- parseBlockAdditionsSegment,
73
- parseBlockElementSegment,
74
- parseBlockGroupSegment,
75
- parseChannelsSegment,
76
- parseCodecPrivateSegment,
77
- parseCodecSegment,
78
- parseColorSegment,
79
- parseCrc32Segment,
80
- parseDefaultDurationSegment,
81
- parseDefaultFlagSegment,
82
- parseDisplayHeightSegment,
83
- parseDisplayWidthSegment,
84
- parseFlagLacing,
85
- parseHeightSegment,
86
- parseInterlacedSegment,
87
- parseLanguageSegment,
88
- parseMaxBlockAdditionId,
89
- parseReferenceBlockSegment,
90
- parseSamplingFrequencySegment,
91
- parseSegmentUUIDSegment,
92
- parseSimpleBlockOrBlockSegment,
93
- parseTagSegment,
94
- parseTagsSegment,
95
- parseTimestampSegment,
96
- parseTitleSegment,
97
- parseTrackEntry,
98
- parseTrackNumber,
99
- parseTrackTypeSegment,
100
- parseTrackUID,
101
- parseVideoSegment,
102
- parseWidthSegment,
103
- } from './segments/track-entry';
104
- import type {TracksSegment} from './segments/tracks';
105
- import {parseTracksSegment} from './segments/tracks';
106
- import type {VoidSegment} from './segments/void';
107
- import {parseVoidSegment} from './segments/void';
108
- import type {WritingAppSegment} from './segments/writing';
109
- import {parseWritingSegment} from './segments/writing';
110
7
 
111
- export type MatroskaSegment =
112
- | MainSegment
113
- | SeekHeadSegment
114
- | SeekSegment
115
- | SeekPositionSegment
116
- | VoidSegment
117
- | InfoSegment
118
- | TimestampScaleSegment
119
- | MuxingAppSegment
120
- | WritingAppSegment
121
- | DurationSegment
122
- | TracksSegment
123
- | TrackEntrySegment
124
- | TrackNumberSegment
125
- | TrackUIDSegment
126
- | FlagLacingSegment
127
- | LanguageSegment
128
- | CodecSegment
129
- | TrackTypeSegment
130
- | DefaultDurationSegment
131
- | VideoSegment
132
- | WidthSegment
133
- | HeightSegment
134
- | DisplayWidthSegment
135
- | DisplayHeightSegment
136
- | AlphaModeSegment
137
- | MaxBlockAdditionId
138
- | ColorSegment
139
- | TitleSegment
140
- | InterlacedSegment
141
- | CodecPrivateSegment
142
- | Crc32Segment
143
- | SegmentUUIDSegment
144
- | DefaultFlagSegment
145
- | TagsSegment
146
- | TagSegment
147
- | ClusterSegment
148
- | TimestampSegment
149
- | SimpleBlockOrBlockSegment
150
- | BlockGroupSegment
151
- | BlockElement
152
- | SeekIdSegment
153
- | AudioSegment
154
- | SamplingFrequencySegment
155
- | ChannelsSegment
156
- | BitDepthSegment
157
- | ReferenceBlockSegment
158
- | BlockAdditionsSegment
159
- | PossibleEbml;
8
+ export type MatroskaSegment = PossibleEbml;
160
9
 
161
- export type OnTrackEntrySegment = (trackEntry: TrackEntrySegment) => void;
10
+ export type OnTrackEntrySegment = (trackEntry: TrackEntry) => void;
162
11
 
163
12
  const parseSegment = async ({
164
13
  segmentId,
@@ -177,259 +26,13 @@ const parseSegment = async ({
177
26
  throw new Error(`Expected length of ${segmentId} to be greater than 0`);
178
27
  }
179
28
 
180
- if (segmentId === '0x114d9b74') {
181
- return parseSeekHeadSegment(iterator, length, parserContext);
182
- }
183
-
184
- if (segmentId === '0x53ab') {
185
- return parseSeekIdSegment(iterator, length);
186
- }
187
-
188
- if (segmentId === '0x4dbb') {
189
- return parseSeekSegment(iterator, length, parserContext);
190
- }
191
-
192
- if (segmentId === '0x53ac') {
193
- return parseSeekPositionSegment(iterator, length);
194
- }
195
-
196
- if (segmentId === '0xec') {
197
- return parseVoidSegment(iterator, length);
198
- }
199
-
200
- if (segmentId === '0x1549a966') {
201
- return parseInfoSegment(iterator, length, parserContext);
202
- }
203
-
204
- if (segmentId === matroskaElements.TimestampScale) {
205
- const timestampScale = parseTimestampScaleSegment(iterator);
206
- parserContext.parserState.setTimescale(timestampScale.timestampScale);
207
- return timestampScale;
208
- }
209
-
210
- if (segmentId === '0x4d80') {
211
- return parseMuxingSegment(iterator, length);
212
- }
213
-
214
- if (segmentId === '0x5741') {
215
- return parseWritingSegment(iterator, length);
216
- }
217
-
218
- if (segmentId === '0x4489') {
219
- return parseDurationSegment(iterator, length);
220
- }
221
-
222
- if (segmentId === '0x1654ae6b') {
223
- return parseTracksSegment(iterator, length, parserContext);
224
- }
225
-
226
- if (segmentId === matroskaElements.TrackEntry) {
227
- const trackEntry = await parseTrackEntry(iterator, length, parserContext);
228
-
229
- parserContext.parserState.onTrackEntrySegment(trackEntry);
230
-
231
- const track = getTrack({
232
- track: trackEntry,
233
- timescale: parserContext.parserState.getTimescale(),
234
- });
235
-
236
- if (track) {
237
- await registerTrack({
238
- state: parserContext.parserState,
239
- options: parserContext,
240
- track,
241
- });
242
- }
243
-
244
- return trackEntry;
245
- }
246
-
247
- if (segmentId === '0xd7') {
248
- return parseTrackNumber(iterator, length);
249
- }
250
-
251
- if (segmentId === '0x73c5') {
252
- return parseTrackUID(iterator, length);
253
- }
254
-
255
- if (segmentId === '0x9c') {
256
- return parseFlagLacing(iterator, length);
257
- }
258
-
259
- if (segmentId === '0x22b59c') {
260
- return parseLanguageSegment(iterator, length);
261
- }
262
-
263
- if (segmentId === '0x86') {
264
- return parseCodecSegment(iterator, length);
265
- }
266
-
267
- if (segmentId === '0x83') {
268
- return parseTrackTypeSegment(iterator, length);
269
- }
270
-
271
- if (segmentId === '0x55ee') {
272
- return parseMaxBlockAdditionId(iterator, length);
273
- }
274
-
275
- if (segmentId === '0x55b0') {
276
- return parseColorSegment(iterator, length);
277
- }
278
-
279
- if (segmentId === '0x23e383') {
280
- return parseDefaultDurationSegment(iterator, length);
281
- }
282
-
283
- if (segmentId === '0xe0') {
284
- return parseVideoSegment(iterator, length, parserContext);
285
- }
286
-
287
- if (segmentId === '0xe1') {
288
- return parseAudioSegment(iterator, length, parserContext);
289
- }
290
-
291
- if (segmentId === '0xb0') {
292
- return parseWidthSegment(iterator, length);
293
- }
294
-
295
- if (segmentId === '0xba') {
296
- return parseHeightSegment(iterator, length);
297
- }
298
-
299
- if (segmentId === matroskaElements.DisplayWidth) {
300
- return parseDisplayWidthSegment(iterator, length);
301
- }
302
-
303
- if (segmentId === matroskaElements.DisplayHeight) {
304
- return parseDisplayHeightSegment(iterator, length);
305
- }
306
-
307
- if (segmentId === '0x9a') {
308
- return parseInterlacedSegment(iterator, length);
309
- }
310
-
311
- if (segmentId === '0x53c0') {
312
- return parseAlphaModeSegment(iterator, length);
313
- }
314
-
315
- if (segmentId === '0x63a2') {
316
- return parseCodecPrivateSegment(iterator, length);
317
- }
318
-
319
- if (segmentId === '0x7ba9') {
320
- return parseTitleSegment(iterator, length);
321
- }
322
-
323
- if (segmentId === '0xbf') {
324
- return parseCrc32Segment(iterator, length);
325
- }
326
-
327
- if (segmentId === '0x73a4') {
328
- return parseSegmentUUIDSegment(iterator, length);
329
- }
330
-
331
- if (segmentId === '0x88') {
332
- return parseDefaultFlagSegment(iterator, length);
333
- }
334
-
335
- if (segmentId === '0x1254c367') {
336
- return parseTagsSegment(iterator, length, parserContext);
337
- }
338
-
339
- if (segmentId === '0x7373') {
340
- return parseTagSegment(iterator, length);
341
- }
342
-
343
- if (segmentId === matroskaElements.SamplingFrequency) {
344
- return parseSamplingFrequencySegment(iterator, length);
345
- }
346
-
347
- if (segmentId === matroskaElements.Channels) {
348
- return parseChannelsSegment(iterator, length);
349
- }
350
-
351
- if (segmentId === matroskaElements.BitDepth) {
352
- return parseBitDepthSegment(iterator, length);
353
- }
354
-
355
- if (segmentId === matroskaElements.Timestamp) {
356
- const offset = iterator.counter.getOffset();
357
- const timestampSegment = parseTimestampSegment(iterator, length);
358
-
359
- parserContext.parserState.setTimestampOffset(
360
- offset,
361
- timestampSegment.timestamp,
362
- );
363
-
364
- return timestampSegment;
365
- }
366
-
367
- if (
368
- segmentId === matroskaElements.SimpleBlock ||
369
- segmentId === matroskaElements.Block
370
- ) {
371
- return parseSimpleBlockOrBlockSegment({
372
- iterator,
373
- length,
374
- parserContext,
375
- type: segmentId,
376
- });
377
- }
378
-
379
- if (segmentId === matroskaElements.ReferenceBlock) {
380
- return parseReferenceBlockSegment(iterator, length);
381
- }
382
-
383
- if (segmentId === matroskaElements.BlockAdditions) {
384
- return parseBlockAdditionsSegment(iterator, length);
385
- }
386
-
387
- if (segmentId === '0xa0') {
388
- const blockGroup = await parseBlockGroupSegment(
389
- iterator,
390
- length,
391
- parserContext,
392
- );
393
-
394
- // Blocks don't have information about keyframes.
395
- // https://ffmpeg.org/pipermail/ffmpeg-devel/2015-June/173825.html
396
- // "For Blocks, keyframes is
397
- // inferred by the absence of ReferenceBlock element (as done by matroskadec).""
398
-
399
- const block = blockGroup.children.find(
400
- (c) => c.type === 'simple-block-or-block-segment',
401
- );
402
- if (!block || block.type !== 'simple-block-or-block-segment') {
403
- throw new Error('Expected block segment');
404
- }
405
-
406
- const hasReferenceBlock = blockGroup.children.find(
407
- (c) => c.type === 'reference-block-segment',
408
- );
409
-
410
- const partialVideoSample = block.videoSample;
411
-
412
- if (partialVideoSample) {
413
- const completeFrame: VideoSample = {
414
- ...partialVideoSample,
415
- type: hasReferenceBlock ? 'delta' : 'key',
416
- };
417
- await parserContext.parserState.onVideoSample(
418
- partialVideoSample.trackId,
419
- completeFrame,
420
- );
421
- }
422
-
423
- return blockGroup;
424
- }
425
-
426
- if (segmentId === '0xa1') {
427
- return parseBlockElementSegment(iterator, length);
428
- }
429
-
430
29
  iterator.counter.decrement(headerReadSoFar);
431
30
 
432
- return parseEbml(iterator);
31
+ const offset = iterator.counter.getOffset();
32
+ const ebml = await parseEbml(iterator, parserContext);
33
+ const remapped = await postprocessEbml({offset, ebml, parserContext});
34
+
35
+ return remapped;
433
36
  };
434
37
 
435
38
  export const expectSegment = async (
@@ -462,7 +65,10 @@ export const expectSegment = async (
462
65
  };
463
66
  }
464
67
 
68
+ const offsetBeforeVInt = iterator.counter.getOffset();
465
69
  const length = iterator.getVint();
70
+ const offsetAfterVInt = iterator.counter.getOffset();
71
+
466
72
  if (length === null) {
467
73
  iterator.counter.decrement(iterator.counter.getOffset() - offset);
468
74
  return {
@@ -486,12 +92,14 @@ export const expectSegment = async (
486
92
  wrap:
487
93
  segmentId === '0x18538067'
488
94
  ? (s) => ({
489
- type: 'main-segment',
490
- children: s,
95
+ type: 'Segment',
96
+ value: s,
97
+ minVintWidth: offsetAfterVInt - offsetBeforeVInt,
491
98
  })
492
99
  : (s) => ({
493
- type: 'cluster-segment',
494
- children: s,
100
+ type: 'Cluster',
101
+ value: s,
102
+ minVintWidth: offsetAfterVInt - offsetBeforeVInt,
495
103
  }),
496
104
  parserContext,
497
105
  });
@@ -1,31 +1,31 @@
1
1
  import type {AnySegment} from '../../parse-result';
2
- import type {MainSegment} from './segments/main';
3
2
  import type {
4
- CodecSegment,
5
- TrackEntrySegment,
3
+ CodecIdSegment,
4
+ MainSegment,
5
+ TrackEntry,
6
6
  TrackNumberSegment,
7
- } from './segments/track-entry';
7
+ } from './segments/all-segments';
8
8
 
9
9
  export const getMainSegment = (segments: AnySegment[]): MainSegment | null => {
10
- return segments.find((s) => s.type === 'main-segment') as MainSegment | null;
10
+ return segments.find((s) => s.type === 'Segment') as MainSegment | null;
11
11
  };
12
12
 
13
- export const getTrackNumber = (track: TrackEntrySegment) => {
14
- const child = track.children.find(
15
- (b) => b.type === 'track-number-segment',
13
+ export const getTrackNumber = (track: TrackEntry) => {
14
+ const child = track.value.find(
15
+ (b) => b.type === 'TrackNumber',
16
16
  ) as TrackNumberSegment | null;
17
- return child?.trackNumber ?? null;
17
+ return child?.value ?? null;
18
18
  };
19
19
 
20
- export const getTrackCodec = (track: TrackEntrySegment) => {
21
- const child = track.children.find(
22
- (b) => b.type === 'codec-segment',
23
- ) as CodecSegment | null;
20
+ export const getTrackCodec = (track: TrackEntry) => {
21
+ const child = track.value.find(
22
+ (b) => b.type === 'CodecID',
23
+ ) as CodecIdSegment | null;
24
24
  return child ?? null;
25
25
  };
26
26
 
27
- export const getTrackTimestampScale = (track: TrackEntrySegment) => {
28
- const child = track.children.find((b) => b.type === 'TrackTimestampScale');
27
+ export const getTrackTimestampScale = (track: TrackEntry) => {
28
+ const child = track.value.find((b) => b.type === 'TrackTimestampScale');
29
29
  if (!child) {
30
30
  return null;
31
31
  }
@@ -37,9 +37,9 @@ export const getTrackTimestampScale = (track: TrackEntrySegment) => {
37
37
  return child.value;
38
38
  };
39
39
 
40
- export const getTrackByNumber = (tracks: TrackEntrySegment[], id: number) => {
40
+ export const getTrackByNumber = (tracks: TrackEntry[], id: number) => {
41
41
  return tracks.find((track) => {
42
42
  const trackNumber = getTrackNumber(track);
43
- return trackNumber === id;
43
+ return trackNumber?.value === id;
44
44
  });
45
45
  };
@@ -62,12 +62,13 @@ const makeOffsetCounter = (): OffsetCounter => {
62
62
 
63
63
  export const getArrayBufferIterator = (
64
64
  initialData: Uint8Array,
65
- maxBytes?: number,
65
+ maxBytes: number | null,
66
66
  ) => {
67
67
  const buf = new ArrayBuffer(initialData.byteLength, {
68
- maxByteLength: maxBytes
69
- ? Math.min(maxBytes as number, 2 ** 32)
70
- : 1_000_000_000,
68
+ maxByteLength:
69
+ maxBytes === null
70
+ ? initialData.byteLength
71
+ : Math.min(maxBytes as number, 2 ** 32),
71
72
  });
72
73
  if (!buf.resize) {
73
74
  throw new Error(
@@ -482,8 +483,8 @@ export const getArrayBufferIterator = (
482
483
  },
483
484
  getUint24: () => {
484
485
  const val1 = view.getUint8(counter.getDiscardedOffset());
485
- const val2 = view.getUint8(counter.getDiscardedOffset());
486
- const val3 = view.getUint8(counter.getDiscardedOffset());
486
+ const val2 = view.getUint8(counter.getDiscardedOffset() + 1);
487
+ const val3 = view.getUint8(counter.getDiscardedOffset() + 2);
487
488
  counter.increment(3);
488
489
  return (val1 << 16) | (val2 << 8) | val3;
489
490
  },
@@ -538,6 +539,7 @@ export const getArrayBufferIterator = (
538
539
  },
539
540
  getUint32Le,
540
541
  getInt32Le,
542
+ getInt32,
541
543
  destroy,
542
544
  isMp3,
543
545
  };
@@ -3,7 +3,7 @@ import type {EsdsBox} from './boxes/iso-base-media/esds/esds';
3
3
  import type {MoovBox} from './boxes/iso-base-media/moov/moov';
4
4
  import type {AudioSample} from './boxes/iso-base-media/stsd/samples';
5
5
  import type {TrakBox} from './boxes/iso-base-media/trak/trak';
6
- import type {MainSegment} from './boxes/webm/segments/main';
6
+ import type {MainSegment} from './boxes/webm/segments/all-segments';
7
7
  import {trakBoxContainsAudio} from './get-fps';
8
8
  import type {KnownAudioCodecs} from './options';
9
9
  import type {AnySegment} from './parse-result';
@@ -163,34 +163,32 @@ export const getAudioCodecFromIso = (moov: MoovBox) => {
163
163
  };
164
164
 
165
165
  export const getAudioCodecFromMatroska = (mainSegment: MainSegment) => {
166
- const tracksSegment = mainSegment.children.find(
167
- (b) => b.type === 'tracks-segment',
168
- );
169
- if (!tracksSegment || tracksSegment.type !== 'tracks-segment') {
166
+ const tracksSegment = mainSegment.value.find((b) => b.type === 'Tracks');
167
+ if (!tracksSegment || tracksSegment.type !== 'Tracks') {
170
168
  return null;
171
169
  }
172
170
 
173
- for (const track of tracksSegment.children) {
174
- if (track.type === 'track-entry-segment') {
175
- const trackType = track.children.find((b) => b.type === 'codec-segment');
176
- if (trackType && trackType.type === 'codec-segment') {
177
- if (trackType.codec === 'A_OPUS') {
171
+ for (const track of tracksSegment.value) {
172
+ if (track.type === 'TrackEntry') {
173
+ const trackType = track.value.find((b) => b.type === 'CodecID');
174
+ if (trackType && trackType.type === 'CodecID') {
175
+ if (trackType.value === 'A_OPUS') {
178
176
  return 'opus';
179
177
  }
180
178
 
181
- if (trackType.codec === 'A_VORBIS') {
179
+ if (trackType.value === 'A_VORBIS') {
182
180
  return 'vorbis';
183
181
  }
184
182
 
185
- if (trackType.codec === 'A_PCM/INT/LIT') {
183
+ if (trackType.value === 'A_PCM/INT/LIT') {
186
184
  return 'pcm';
187
185
  }
188
186
 
189
- if (trackType.codec === 'A_AAC') {
187
+ if (trackType.value === 'A_AAC') {
190
188
  return 'aac';
191
189
  }
192
190
 
193
- if (trackType.codec === 'A_MPEG/L3') {
191
+ if (trackType.value === 'A_MPEG/L3') {
194
192
  return 'mp3';
195
193
  }
196
194
  }
@@ -263,8 +261,8 @@ export const getAudioCodec = (boxes: AnySegment[]): KnownAudioCodecs | null => {
263
261
  throw new Error('Unknown audio format: ' + codec.format);
264
262
  }
265
263
 
266
- const mainSegment = boxes.find((b) => b.type === 'main-segment');
267
- if (!mainSegment || mainSegment.type !== 'main-segment') {
264
+ const mainSegment = boxes.find((b) => b.type === 'Segment');
265
+ if (!mainSegment || mainSegment.type !== 'Segment') {
268
266
  return null;
269
267
  }
270
268