@remotion/media-parser 4.0.191

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 (143) hide show
  1. package/.eslintrc +8 -0
  2. package/LICENSE.md +49 -0
  3. package/README.md +18 -0
  4. package/dist/boxes/iso-base-media/base-type.d.ts +4 -0
  5. package/dist/boxes/iso-base-media/base-type.js +2 -0
  6. package/dist/boxes/iso-base-media/ftyp.d.ts +13 -0
  7. package/dist/boxes/iso-base-media/ftyp.js +22 -0
  8. package/dist/boxes/iso-base-media/moov/moov.d.ts +12 -0
  9. package/dist/boxes/iso-base-media/moov/moov.js +22 -0
  10. package/dist/boxes/iso-base-media/mvhd.d.ts +30 -0
  11. package/dist/boxes/iso-base-media/mvhd.js +59 -0
  12. package/dist/boxes/iso-base-media/process-box.d.ts +8 -0
  13. package/dist/boxes/iso-base-media/process-box.js +174 -0
  14. package/dist/boxes/iso-base-media/stsd/keys.d.ts +5 -0
  15. package/dist/boxes/iso-base-media/stsd/keys.js +21 -0
  16. package/dist/boxes/iso-base-media/stsd/mebx.d.ts +14 -0
  17. package/dist/boxes/iso-base-media/stsd/mebx.js +27 -0
  18. package/dist/boxes/iso-base-media/stsd/samples.d.ts +48 -0
  19. package/dist/boxes/iso-base-media/stsd/samples.js +215 -0
  20. package/dist/boxes/iso-base-media/stsd/stsd.d.ts +13 -0
  21. package/dist/boxes/iso-base-media/stsd/stsd.js +26 -0
  22. package/dist/boxes/iso-base-media/stts/stts.d.ts +15 -0
  23. package/dist/boxes/iso-base-media/stts/stts.js +35 -0
  24. package/dist/boxes/iso-base-media/tkhd.d.ts +22 -0
  25. package/dist/boxes/iso-base-media/tkhd.js +63 -0
  26. package/dist/boxes/iso-base-media/to-date.d.ts +1 -0
  27. package/dist/boxes/iso-base-media/to-date.js +11 -0
  28. package/dist/boxes/iso-base-media/trak/trak.d.ts +12 -0
  29. package/dist/boxes/iso-base-media/trak/trak.js +22 -0
  30. package/dist/boxes/webm/parse-webm-header.d.ts +3 -0
  31. package/dist/boxes/webm/parse-webm-header.js +16 -0
  32. package/dist/boxes/webm/segments/duration.d.ts +6 -0
  33. package/dist/boxes/webm/segments/duration.js +15 -0
  34. package/dist/boxes/webm/segments/info.d.ts +8 -0
  35. package/dist/boxes/webm/segments/info.js +14 -0
  36. package/dist/boxes/webm/segments/main.d.ts +7 -0
  37. package/dist/boxes/webm/segments/main.js +13 -0
  38. package/dist/boxes/webm/segments/muxing.d.ts +6 -0
  39. package/dist/boxes/webm/segments/muxing.js +12 -0
  40. package/dist/boxes/webm/segments/parse-children.d.ts +3 -0
  41. package/dist/boxes/webm/segments/parse-children.js +17 -0
  42. package/dist/boxes/webm/segments/seek-head.d.ts +8 -0
  43. package/dist/boxes/webm/segments/seek-head.js +13 -0
  44. package/dist/boxes/webm/segments/seek-position.d.ts +6 -0
  45. package/dist/boxes/webm/segments/seek-position.js +12 -0
  46. package/dist/boxes/webm/segments/seek.d.ts +8 -0
  47. package/dist/boxes/webm/segments/seek.js +16 -0
  48. package/dist/boxes/webm/segments/timestamp-scale.d.ts +6 -0
  49. package/dist/boxes/webm/segments/timestamp-scale.js +11 -0
  50. package/dist/boxes/webm/segments/track-entry.d.ts +71 -0
  51. package/dist/boxes/webm/segments/track-entry.js +175 -0
  52. package/dist/boxes/webm/segments/tracks.d.ts +7 -0
  53. package/dist/boxes/webm/segments/tracks.js +13 -0
  54. package/dist/boxes/webm/segments/unknown.d.ts +6 -0
  55. package/dist/boxes/webm/segments/unknown.js +11 -0
  56. package/dist/boxes/webm/segments/void.d.ts +6 -0
  57. package/dist/boxes/webm/segments/void.js +12 -0
  58. package/dist/boxes/webm/segments/writing.d.ts +6 -0
  59. package/dist/boxes/webm/segments/writing.js +12 -0
  60. package/dist/boxes/webm/segments.d.ts +16 -0
  61. package/dist/boxes/webm/segments.js +106 -0
  62. package/dist/buffer-iterator.d.ts +36 -0
  63. package/dist/buffer-iterator.js +263 -0
  64. package/dist/from-node.d.ts +2 -0
  65. package/dist/from-node.js +19 -0
  66. package/dist/from-web.d.ts +2 -0
  67. package/dist/from-web.js +40 -0
  68. package/dist/get-dimensions.d.ts +7 -0
  69. package/dist/get-dimensions.js +104 -0
  70. package/dist/get-duration.d.ts +3 -0
  71. package/dist/get-duration.js +61 -0
  72. package/dist/get-fps.d.ts +3 -0
  73. package/dist/get-fps.js +70 -0
  74. package/dist/has-all-info.d.ts +3 -0
  75. package/dist/has-all-info.js +27 -0
  76. package/dist/index.d.ts +1 -0
  77. package/dist/index.js +5 -0
  78. package/dist/options.d.ts +19 -0
  79. package/dist/options.js +2 -0
  80. package/dist/parse-media.d.ts +2 -0
  81. package/dist/parse-media.js +44 -0
  82. package/dist/parse-result.d.ts +29 -0
  83. package/dist/parse-result.js +2 -0
  84. package/dist/parse-video.d.ts +10 -0
  85. package/dist/parse-video.js +29 -0
  86. package/dist/reader.d.ts +7 -0
  87. package/dist/reader.js +2 -0
  88. package/package.json +47 -0
  89. package/src/boxes/iso-base-media/base-type.ts +4 -0
  90. package/src/boxes/iso-base-media/ftyp.ts +39 -0
  91. package/src/boxes/iso-base-media/moov/moov.ts +37 -0
  92. package/src/boxes/iso-base-media/mvhd.ts +107 -0
  93. package/src/boxes/iso-base-media/process-box.ts +236 -0
  94. package/src/boxes/iso-base-media/stsd/keys.ts +25 -0
  95. package/src/boxes/iso-base-media/stsd/mebx.ts +46 -0
  96. package/src/boxes/iso-base-media/stsd/samples.ts +298 -0
  97. package/src/boxes/iso-base-media/stsd/stsd.ts +48 -0
  98. package/src/boxes/iso-base-media/stts/stts.ts +62 -0
  99. package/src/boxes/iso-base-media/tkhd.ts +105 -0
  100. package/src/boxes/iso-base-media/to-date.ts +9 -0
  101. package/src/boxes/iso-base-media/trak/trak.ts +37 -0
  102. package/src/boxes/webm/parse-webm-header.ts +18 -0
  103. package/src/boxes/webm/segments/duration.ts +22 -0
  104. package/src/boxes/webm/segments/info.ts +20 -0
  105. package/src/boxes/webm/segments/main.ts +19 -0
  106. package/src/boxes/webm/segments/muxing.ts +18 -0
  107. package/src/boxes/webm/segments/parse-children.ts +21 -0
  108. package/src/boxes/webm/segments/seek-head.ts +21 -0
  109. package/src/boxes/webm/segments/seek-position.ts +19 -0
  110. package/src/boxes/webm/segments/seek.ts +23 -0
  111. package/src/boxes/webm/segments/timestamp-scale.ts +17 -0
  112. package/src/boxes/webm/segments/track-entry.ts +295 -0
  113. package/src/boxes/webm/segments/tracks.ts +22 -0
  114. package/src/boxes/webm/segments/unknown.ts +19 -0
  115. package/src/boxes/webm/segments/void.ts +16 -0
  116. package/src/boxes/webm/segments/writing.ts +18 -0
  117. package/src/boxes/webm/segments.ts +206 -0
  118. package/src/buffer-iterator.ts +305 -0
  119. package/src/from-node.ts +22 -0
  120. package/src/from-web.ts +53 -0
  121. package/src/get-dimensions.ts +147 -0
  122. package/src/get-duration.ts +73 -0
  123. package/src/get-fps.ts +92 -0
  124. package/src/has-all-info.ts +34 -0
  125. package/src/index.ts +1 -0
  126. package/src/options.ts +38 -0
  127. package/src/parse-media.ts +57 -0
  128. package/src/parse-result.ts +44 -0
  129. package/src/parse-video.ts +41 -0
  130. package/src/reader.ts +10 -0
  131. package/src/test/duration.test.ts +34 -0
  132. package/src/test/keys.test.ts +47 -0
  133. package/src/test/matroska.test.ts +163 -0
  134. package/src/test/mvhd.test.ts +89 -0
  135. package/src/test/parse-stts.test.ts +38 -0
  136. package/src/test/parse-video.test.ts +113 -0
  137. package/src/test/parse-webm.test.ts +15 -0
  138. package/src/test/stream-local.test.ts +105 -0
  139. package/src/test/stream-remote.test.ts +12 -0
  140. package/src/test/stsd.test.ts +162 -0
  141. package/src/test/tkhd.test.ts +84 -0
  142. package/tsconfig.json +10 -0
  143. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,19 @@
1
+ import type {BufferIterator} from '../../../buffer-iterator';
2
+
3
+ export type SeekPositionSegment = {
4
+ type: 'seek-position-segment';
5
+ seekPosition: number;
6
+ };
7
+
8
+ export const parseSeekPositionSegment = (
9
+ iterator: BufferIterator,
10
+ ): SeekPositionSegment => {
11
+ const length = iterator.getVint();
12
+
13
+ const seekPosition = iterator.getDecimalBytes(length);
14
+
15
+ return {
16
+ type: 'seek-position-segment',
17
+ seekPosition,
18
+ };
19
+ };
@@ -0,0 +1,23 @@
1
+ import type {BufferIterator} from '../../../buffer-iterator';
2
+ import type {MatroskaSegment} from '../segments';
3
+ import {expectSegment} from '../segments';
4
+
5
+ export type SeekSegment = {
6
+ type: 'seek-segment';
7
+ seekId: string;
8
+ child: MatroskaSegment;
9
+ };
10
+
11
+ export const parseSeekSegment = (iterator: BufferIterator): SeekSegment => {
12
+ // length
13
+ iterator.discard(4);
14
+
15
+ const seekId = iterator.getMatroskaSegmentId();
16
+ const child = expectSegment(iterator);
17
+
18
+ return {
19
+ type: 'seek-segment',
20
+ seekId,
21
+ child,
22
+ };
23
+ };
@@ -0,0 +1,17 @@
1
+ import type {BufferIterator} from '../../../buffer-iterator';
2
+
3
+ export type TimestampScaleSegment = {
4
+ type: 'timestamp-scale-segment';
5
+ timestampScale: number;
6
+ };
7
+
8
+ export const parseTimestampScaleSegment = (
9
+ iterator: BufferIterator,
10
+ ): TimestampScaleSegment => {
11
+ const timestampScale = iterator.getDecimalBytes(3);
12
+
13
+ return {
14
+ type: 'timestamp-scale-segment',
15
+ timestampScale,
16
+ };
17
+ };
@@ -0,0 +1,295 @@
1
+ import type {BufferIterator} from '../../../buffer-iterator';
2
+ import type {MatroskaSegment} from '../segments';
3
+ import {expectChildren} from './parse-children';
4
+
5
+ export type TrackEntrySegment = {
6
+ type: 'track-entry-segment';
7
+ children: MatroskaSegment[];
8
+ };
9
+
10
+ export const parseTrackEntry = (
11
+ iterator: BufferIterator,
12
+ ): TrackEntrySegment => {
13
+ const offset = iterator.counter.getOffset();
14
+
15
+ const length = iterator.getVint();
16
+
17
+ return {
18
+ type: 'track-entry-segment',
19
+ children: expectChildren(
20
+ iterator,
21
+ length - (iterator.counter.getOffset() - offset),
22
+ ),
23
+ };
24
+ };
25
+
26
+ export type TrackNumberSegment = {
27
+ type: 'track-number-segment';
28
+ trackNumber: number;
29
+ };
30
+
31
+ export const parseTrackNumber = (
32
+ iterator: BufferIterator,
33
+ ): TrackNumberSegment => {
34
+ const length = iterator.getVint();
35
+ if (length !== 1) {
36
+ throw new Error('Expected track number to be 1 byte');
37
+ }
38
+
39
+ const trackNumber = iterator.getUint8();
40
+
41
+ return {
42
+ type: 'track-number-segment',
43
+ trackNumber,
44
+ };
45
+ };
46
+
47
+ export type TrackUIDSegment = {
48
+ type: 'track-uid-segment';
49
+ trackUid: string;
50
+ };
51
+
52
+ export const parseTrackUID = (iterator: BufferIterator): TrackUIDSegment => {
53
+ const length = iterator.getVint();
54
+ // Observation: AV1 has 8 bytes, WebM has 7
55
+ if (length !== 8 && length !== 7) {
56
+ throw new Error('Expected track number to be 8 byte');
57
+ }
58
+
59
+ const bytes = iterator.getSlice(length);
60
+
61
+ const asString = [...bytes]
62
+ .map((b) => b.toString(16).padStart(2, '0'))
63
+ .join('');
64
+ return {
65
+ type: 'track-uid-segment',
66
+ trackUid: asString,
67
+ };
68
+ };
69
+
70
+ export type FlagLacingSegment = {
71
+ type: 'flag-lacing-segment';
72
+ lacing: boolean;
73
+ };
74
+
75
+ export const parseFlagLacing = (
76
+ iterator: BufferIterator,
77
+ ): FlagLacingSegment => {
78
+ const length = iterator.getVint();
79
+ if (length !== 1) {
80
+ throw new Error('Expected flag lacing to be 1 byte');
81
+ }
82
+
83
+ const bytes = iterator.getSlice(length);
84
+
85
+ if (bytes[0] !== 1 && bytes[0] !== 0) {
86
+ throw new Error('Expected lacing to be 1 or 0');
87
+ }
88
+
89
+ return {
90
+ type: 'flag-lacing-segment',
91
+ lacing: Boolean(bytes[0]),
92
+ };
93
+ };
94
+
95
+ export type LanguageSegment = {
96
+ type: 'language-segment';
97
+ language: string;
98
+ };
99
+
100
+ export const parseLanguageSegment = (
101
+ iterator: BufferIterator,
102
+ ): LanguageSegment => {
103
+ const length = iterator.getVint();
104
+ if (length !== 3) {
105
+ throw new Error('Expected language segment to be 3 bytes');
106
+ }
107
+
108
+ const language = iterator.getByteString(length);
109
+
110
+ return {
111
+ type: 'language-segment',
112
+ language,
113
+ };
114
+ };
115
+
116
+ export type CodecSegment = {
117
+ type: 'codec-segment';
118
+ codec: string;
119
+ };
120
+
121
+ export const parseCodecSegment = (iterator: BufferIterator): CodecSegment => {
122
+ const length = iterator.getVint();
123
+
124
+ // Could make a TypeScript enum with it
125
+ // https://www.matroska.org/technical/codec_specs.html
126
+ const codec = iterator.getByteString(length);
127
+
128
+ return {
129
+ type: 'codec-segment',
130
+ codec,
131
+ };
132
+ };
133
+
134
+ export type TrackTypeSegment = {
135
+ type: 'track-type-segment';
136
+ trackType: number;
137
+ };
138
+
139
+ export const parseTrackTypeSegment = (
140
+ iterator: BufferIterator,
141
+ ): TrackTypeSegment => {
142
+ const length = iterator.getVint();
143
+ if (length !== 1) {
144
+ throw new Error('Expected track type segment to be 1 byte');
145
+ }
146
+
147
+ const trackType = iterator.getUint8();
148
+
149
+ // Could make the return type nicer
150
+ /* 1 - video,
151
+ 2 - audio,
152
+ 3 - complex,
153
+ 16 - logo,
154
+ 17 - subtitle,
155
+ 18 - buttons,
156
+ 32 - control,
157
+ 33 - metadata;
158
+ */
159
+ return {
160
+ type: 'track-type-segment',
161
+ trackType,
162
+ };
163
+ };
164
+
165
+ export type DefaultDurationSegment = {
166
+ type: 'default-duration-segment';
167
+ defaultDuration: number;
168
+ };
169
+
170
+ export const parseDefaultDurationSegment = (
171
+ iterator: BufferIterator,
172
+ ): DefaultDurationSegment => {
173
+ const length = iterator.getVint();
174
+
175
+ const defaultDuration = iterator.getDecimalBytes(length);
176
+
177
+ return {
178
+ type: 'default-duration-segment',
179
+ defaultDuration,
180
+ };
181
+ };
182
+
183
+ export type VideoSegment = {
184
+ type: 'video-segment';
185
+
186
+ children: MatroskaSegment[];
187
+ };
188
+
189
+ export const parseVideoSegment = (iterator: BufferIterator): VideoSegment => {
190
+ const offset = iterator.counter.getOffset();
191
+
192
+ const length = iterator.getVint();
193
+
194
+ return {
195
+ type: 'video-segment',
196
+ children: expectChildren(
197
+ iterator,
198
+ length - (iterator.counter.getOffset() - offset),
199
+ ),
200
+ };
201
+ };
202
+
203
+ export type WidthSegment = {
204
+ type: 'width-segment';
205
+ width: number;
206
+ };
207
+
208
+ export const parseWidthSegment = (iterator: BufferIterator): WidthSegment => {
209
+ const length = iterator.getVint();
210
+ if (length !== 2) {
211
+ throw new Error('Expected width segment to be 2 bytes');
212
+ }
213
+
214
+ const width = iterator.getUint16();
215
+
216
+ return {
217
+ type: 'width-segment',
218
+ width,
219
+ };
220
+ };
221
+
222
+ export type HeightSegment = {
223
+ type: 'height-segment';
224
+ height: number;
225
+ };
226
+
227
+ export const parseHeightSegment = (iterator: BufferIterator): HeightSegment => {
228
+ const length = iterator.getVint();
229
+ if (length !== 2) {
230
+ throw new Error('Expected height segment to be 2 bytes');
231
+ }
232
+
233
+ const height = iterator.getUint16();
234
+
235
+ return {
236
+ type: 'height-segment',
237
+ height,
238
+ };
239
+ };
240
+
241
+ export type AlphaModeSegment = {
242
+ type: 'alpha-mode-segment';
243
+ alphaMode: number;
244
+ };
245
+
246
+ export const parseAlphaModeSegment = (
247
+ iterator: BufferIterator,
248
+ ): AlphaModeSegment => {
249
+ const length = iterator.getVint();
250
+ if (length !== 1) {
251
+ throw new Error('Expected alpha mode segment to be 1 byte');
252
+ }
253
+
254
+ const alphaMode = iterator.getUint8();
255
+
256
+ return {
257
+ type: 'alpha-mode-segment',
258
+ alphaMode,
259
+ };
260
+ };
261
+
262
+ export type MaxBlockAdditionId = {
263
+ type: 'max-block-addition-id-segment';
264
+ maxBlockAdditionId: number;
265
+ };
266
+
267
+ export const parseMaxBlockAdditionId = (
268
+ iterator: BufferIterator,
269
+ ): MaxBlockAdditionId => {
270
+ const length = iterator.getVint();
271
+ if (length !== 1) {
272
+ throw new Error('Expected alpha mode segment to be 1 byte');
273
+ }
274
+
275
+ const maxBlockAdditionId = iterator.getUint8();
276
+
277
+ return {
278
+ type: 'max-block-addition-id-segment',
279
+ maxBlockAdditionId,
280
+ };
281
+ };
282
+
283
+ export type ColorSegment = {
284
+ type: 'color-segment';
285
+ };
286
+
287
+ export const parseColorSegment = (iterator: BufferIterator): ColorSegment => {
288
+ const length = iterator.getVint();
289
+
290
+ iterator.discard(length - 1);
291
+
292
+ return {
293
+ type: 'color-segment',
294
+ };
295
+ };
@@ -0,0 +1,22 @@
1
+ import type {BufferIterator} from '../../../buffer-iterator';
2
+ import type {MatroskaSegment} from '../segments';
3
+ import {expectChildren} from './parse-children';
4
+
5
+ export type TracksSegment = {
6
+ type: 'tracks-segment';
7
+ children: MatroskaSegment[];
8
+ };
9
+
10
+ export const parseTracksSegment = (iterator: BufferIterator): TracksSegment => {
11
+ const offset = iterator.counter.getOffset();
12
+
13
+ const length = iterator.getVint();
14
+
15
+ return {
16
+ type: 'tracks-segment',
17
+ children: expectChildren(
18
+ iterator,
19
+ length - (iterator.counter.getOffset() - offset),
20
+ ),
21
+ };
22
+ };
@@ -0,0 +1,19 @@
1
+ import type {BufferIterator} from '../../../buffer-iterator';
2
+
3
+ export type UnknownSegment = {
4
+ id: string;
5
+ type: 'unknown-segment';
6
+ };
7
+
8
+ export const parseUnknownSegment = (
9
+ iterator: BufferIterator,
10
+ id: string,
11
+ length: number,
12
+ ): UnknownSegment => {
13
+ iterator.discard(length);
14
+
15
+ return {
16
+ id,
17
+ type: 'unknown-segment',
18
+ };
19
+ };
@@ -0,0 +1,16 @@
1
+ import type {BufferIterator} from '../../../buffer-iterator';
2
+
3
+ export type VoidSegment = {
4
+ type: 'void-segment';
5
+ length: number;
6
+ };
7
+
8
+ export const parseVoidSegment = (iterator: BufferIterator): VoidSegment => {
9
+ const length = iterator.getVint();
10
+ iterator.discard(length);
11
+
12
+ return {
13
+ type: 'void-segment',
14
+ length,
15
+ };
16
+ };
@@ -0,0 +1,18 @@
1
+ import type {BufferIterator} from '../../../buffer-iterator';
2
+
3
+ export type WritingAppSegment = {
4
+ type: 'writing-app-segment';
5
+ value: string;
6
+ };
7
+
8
+ export const parseWritingSegment = (
9
+ iterator: BufferIterator,
10
+ ): WritingAppSegment => {
11
+ const length = iterator.getVint();
12
+ const value = iterator.getByteString(length);
13
+
14
+ return {
15
+ type: 'writing-app-segment',
16
+ value,
17
+ };
18
+ };
@@ -0,0 +1,206 @@
1
+ import type {BufferIterator} from '../../buffer-iterator';
2
+ import type {DurationSegment} from './segments/duration';
3
+ import {parseDurationSegment} from './segments/duration';
4
+ import type {InfoSegment} from './segments/info';
5
+ import {parseInfoSegment} from './segments/info';
6
+ import type {MainSegment} from './segments/main';
7
+ import {parseMainSegment} from './segments/main';
8
+ import {parseMuxingSegment, type MuxingAppSegment} from './segments/muxing';
9
+ import {parseSeekSegment, type SeekSegment} from './segments/seek';
10
+ import type {SeekHeadSegment} from './segments/seek-head';
11
+ import {parseSeekHeadSegment} from './segments/seek-head';
12
+ import {
13
+ parseSeekPositionSegment,
14
+ type SeekPositionSegment,
15
+ } from './segments/seek-position';
16
+ import type {TimestampScaleSegment} from './segments/timestamp-scale';
17
+ import {parseTimestampScaleSegment} from './segments/timestamp-scale';
18
+ import type {
19
+ AlphaModeSegment,
20
+ CodecSegment,
21
+ ColorSegment,
22
+ DefaultDurationSegment,
23
+ FlagLacingSegment,
24
+ HeightSegment,
25
+ LanguageSegment,
26
+ MaxBlockAdditionId,
27
+ TrackEntrySegment,
28
+ TrackNumberSegment,
29
+ TrackTypeSegment,
30
+ TrackUIDSegment,
31
+ VideoSegment,
32
+ WidthSegment,
33
+ } from './segments/track-entry';
34
+ import {
35
+ parseAlphaModeSegment,
36
+ parseCodecSegment,
37
+ parseColorSegment,
38
+ parseDefaultDurationSegment,
39
+ parseFlagLacing,
40
+ parseHeightSegment,
41
+ parseLanguageSegment,
42
+ parseMaxBlockAdditionId,
43
+ parseTrackEntry,
44
+ parseTrackNumber,
45
+ parseTrackTypeSegment,
46
+ parseTrackUID,
47
+ parseVideoSegment,
48
+ parseWidthSegment,
49
+ } from './segments/track-entry';
50
+ import type {TracksSegment} from './segments/tracks';
51
+ import {parseTracksSegment} from './segments/tracks';
52
+ import type {UnknownSegment} from './segments/unknown';
53
+ import {parseUnknownSegment} from './segments/unknown';
54
+ import type {VoidSegment} from './segments/void';
55
+ import {parseVoidSegment} from './segments/void';
56
+ import type {WritingAppSegment} from './segments/writing';
57
+ import {parseWritingSegment} from './segments/writing';
58
+
59
+ export type MatroskaSegment =
60
+ | MainSegment
61
+ | UnknownSegment
62
+ | SeekHeadSegment
63
+ | SeekSegment
64
+ | SeekPositionSegment
65
+ | VoidSegment
66
+ | InfoSegment
67
+ | TimestampScaleSegment
68
+ | MuxingAppSegment
69
+ | WritingAppSegment
70
+ | DurationSegment
71
+ | TracksSegment
72
+ | TrackEntrySegment
73
+ | TrackNumberSegment
74
+ | TrackUIDSegment
75
+ | FlagLacingSegment
76
+ | LanguageSegment
77
+ | CodecSegment
78
+ | TrackTypeSegment
79
+ | DefaultDurationSegment
80
+ | VideoSegment
81
+ | WidthSegment
82
+ | HeightSegment
83
+ | AlphaModeSegment
84
+ | MaxBlockAdditionId
85
+ | ColorSegment;
86
+
87
+ export const expectSegment = (iterator: BufferIterator): MatroskaSegment => {
88
+ const segmentId = iterator.getMatroskaSegmentId();
89
+ if (segmentId === '0x') {
90
+ return {
91
+ type: 'unknown-segment',
92
+ id: segmentId,
93
+ };
94
+ }
95
+
96
+ if (segmentId === '0x18538067') {
97
+ return parseMainSegment(iterator);
98
+ }
99
+
100
+ if (segmentId === '0x114d9b74') {
101
+ return parseSeekHeadSegment(iterator);
102
+ }
103
+
104
+ if (segmentId === '0x4dbb') {
105
+ return parseSeekSegment(iterator);
106
+ }
107
+
108
+ if (segmentId === '0x53ac') {
109
+ return parseSeekPositionSegment(iterator);
110
+ }
111
+
112
+ if (segmentId === '0xec') {
113
+ return parseVoidSegment(iterator);
114
+ }
115
+
116
+ if (segmentId === '0x1549a966') {
117
+ return parseInfoSegment(iterator);
118
+ }
119
+
120
+ if (segmentId === '0x2ad7b183') {
121
+ return parseTimestampScaleSegment(iterator);
122
+ }
123
+
124
+ if (segmentId === '0x4d80') {
125
+ return parseMuxingSegment(iterator);
126
+ }
127
+
128
+ if (segmentId === '0x5741') {
129
+ return parseWritingSegment(iterator);
130
+ }
131
+
132
+ if (segmentId === '0x4489') {
133
+ return parseDurationSegment(iterator);
134
+ }
135
+
136
+ if (segmentId === '0x1654ae6b') {
137
+ return parseTracksSegment(iterator);
138
+ }
139
+
140
+ if (segmentId === '0xae') {
141
+ return parseTrackEntry(iterator);
142
+ }
143
+
144
+ if (segmentId === '0xd7') {
145
+ return parseTrackNumber(iterator);
146
+ }
147
+
148
+ if (segmentId === '0x73c5') {
149
+ return parseTrackUID(iterator);
150
+ }
151
+
152
+ if (segmentId === '0x9c') {
153
+ return parseFlagLacing(iterator);
154
+ }
155
+
156
+ if (segmentId === '0x22b59c') {
157
+ return parseLanguageSegment(iterator);
158
+ }
159
+
160
+ if (segmentId === '0x86') {
161
+ return parseCodecSegment(iterator);
162
+ }
163
+
164
+ if (segmentId === '0x83') {
165
+ return parseTrackTypeSegment(iterator);
166
+ }
167
+
168
+ if (segmentId === '0x55ee') {
169
+ return parseMaxBlockAdditionId(iterator);
170
+ }
171
+
172
+ if (segmentId === '0x55b0') {
173
+ return parseColorSegment(iterator);
174
+ }
175
+
176
+ if (segmentId === '0x23e383') {
177
+ return parseDefaultDurationSegment(iterator);
178
+ }
179
+
180
+ if (segmentId === '0xe0') {
181
+ return parseVideoSegment(iterator);
182
+ }
183
+
184
+ if (segmentId === '0xb0') {
185
+ return parseWidthSegment(iterator);
186
+ }
187
+
188
+ if (segmentId === '0xba') {
189
+ return parseHeightSegment(iterator);
190
+ }
191
+
192
+ if (segmentId === '0x53c0') {
193
+ return parseAlphaModeSegment(iterator);
194
+ }
195
+
196
+ const length = iterator.getVint();
197
+
198
+ const bytesRemaining = iterator.byteLength() - iterator.counter.getOffset();
199
+ const toDiscard = Math.min(
200
+ bytesRemaining,
201
+ length > 0 ? length : bytesRemaining,
202
+ );
203
+
204
+ const child = parseUnknownSegment(iterator, segmentId, toDiscard);
205
+ return child;
206
+ };