@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.
- package/dist/av1-codec-string.d.ts +0 -5
- package/dist/av1-codec-string.js +1 -18
- package/dist/boxes/iso-base-media/ftype.d.ts +9 -0
- package/dist/boxes/iso-base-media/ftype.js +31 -0
- package/dist/boxes/iso-base-media/get-sample-positions-from-track.d.ts +4 -0
- package/dist/boxes/iso-base-media/get-sample-positions-from-track.js +48 -0
- package/dist/boxes/iso-base-media/mvhd.js +2 -2
- package/dist/boxes/iso-base-media/stsd/keys.js +1 -1
- package/dist/boxes/iso-base-media/tfdt.d.ts +12 -0
- package/dist/boxes/iso-base-media/tfdt.js +20 -0
- package/dist/boxes/iso-base-media/tfhd.d.ts +16 -0
- package/dist/boxes/iso-base-media/tfhd.js +41 -0
- package/dist/boxes/iso-base-media/trun.d.ts +21 -0
- package/dist/boxes/iso-base-media/trun.js +44 -0
- package/dist/boxes/webm/av1-codec-private.js +1 -1
- package/dist/boxes/webm/bitstream/av1.js +1 -10
- package/dist/boxes/webm/description.d.ts +2 -2
- package/dist/boxes/webm/description.js +2 -2
- package/dist/boxes/webm/ebml.d.ts +2 -2
- package/dist/boxes/webm/ebml.js +23 -1
- package/dist/boxes/webm/get-ready-tracks.d.ts +1 -1
- package/dist/boxes/webm/get-ready-tracks.js +3 -3
- package/dist/boxes/webm/get-sample-from-block.d.ts +17 -0
- package/dist/boxes/webm/get-sample-from-block.js +78 -0
- package/dist/boxes/webm/get-track.d.ts +2 -2
- package/dist/boxes/webm/get-track.js +26 -25
- package/dist/boxes/webm/make-header.d.ts +3 -8
- package/dist/boxes/webm/make-header.js +43 -20
- package/dist/boxes/webm/parse-ebml.d.ts +9 -4
- package/dist/boxes/webm/parse-ebml.js +122 -13
- package/dist/boxes/webm/segments/all-segments.d.ts +421 -107
- package/dist/boxes/webm/segments/all-segments.js +260 -33
- package/dist/boxes/webm/segments/track-entry.d.ts +3 -191
- package/dist/boxes/webm/segments/track-entry.js +2 -456
- package/dist/boxes/webm/segments.d.ts +3 -16
- package/dist/boxes/webm/segments.js +12 -196
- package/dist/boxes/webm/tracks.d.ts +8 -0
- package/dist/boxes/webm/tracks.js +21 -0
- package/dist/boxes/webm/traversal.d.ts +5 -6
- package/dist/boxes/webm/traversal.js +6 -6
- package/dist/buffer-iterator.d.ts +1 -1
- package/dist/buffer-iterator.js +3 -3
- package/dist/from-web.js +6 -15
- package/dist/get-audio-codec.d.ts +1 -1
- package/dist/get-audio-codec.js +13 -13
- package/dist/get-duration.js +12 -14
- package/dist/get-tracks.js +2 -2
- package/dist/get-video-codec.js +13 -13
- package/dist/get-video-metadata.d.ts +2 -0
- package/dist/get-video-metadata.js +44 -0
- package/dist/parse-media.js +4 -1
- package/dist/parser-context.d.ts +1 -0
- package/dist/parser-state.js +3 -2
- package/dist/read-and-increment-offset.d.ts +28 -0
- package/dist/read-and-increment-offset.js +177 -0
- package/dist/samples-from-moof.d.ts +6 -0
- package/dist/samples-from-moof.js +74 -0
- package/dist/traversal.d.ts +19 -17
- package/dist/traversal.js +38 -39
- package/dist/understand-vorbis.d.ts +1 -0
- package/dist/understand-vorbis.js +12 -0
- package/input.webm +0 -0
- package/package.json +2 -2
- package/src/boxes/iso-base-media/get-sample-positions-from-track.ts +69 -0
- package/src/boxes/iso-base-media/make-track.ts +4 -45
- package/src/boxes/iso-base-media/mdat/mdat.ts +33 -24
- package/src/boxes/iso-base-media/mdhd.ts +10 -7
- package/src/boxes/iso-base-media/mvhd.ts +17 -16
- package/src/boxes/iso-base-media/process-box.ts +42 -0
- package/src/boxes/iso-base-media/stsd/keys.ts +1 -1
- package/src/boxes/iso-base-media/tfdt.ts +37 -0
- package/src/boxes/iso-base-media/tfhd.ts +66 -0
- package/src/boxes/iso-base-media/tkhd.ts +11 -13
- package/src/boxes/iso-base-media/trun.ts +74 -0
- package/src/boxes/webm/av1-codec-private.ts +1 -1
- package/src/boxes/webm/description.ts +7 -4
- package/src/boxes/webm/ebml.ts +24 -4
- package/src/boxes/webm/get-ready-tracks.ts +4 -4
- package/src/boxes/webm/get-sample-from-block.ts +125 -0
- package/src/boxes/webm/get-track.ts +40 -33
- package/src/boxes/webm/make-header.ts +58 -51
- package/src/boxes/webm/parse-ebml.ts +170 -16
- package/src/boxes/webm/segments/all-segments.ts +379 -62
- package/src/boxes/webm/segments/track-entry.ts +3 -846
- package/src/boxes/webm/segments.ts +18 -410
- package/src/boxes/webm/traversal.ts +17 -17
- package/src/buffer-iterator.ts +8 -6
- package/src/get-audio-codec.ts +14 -16
- package/src/get-duration.ts +55 -21
- package/src/get-tracks.ts +6 -6
- package/src/get-video-codec.ts +13 -15
- package/src/has-all-info.ts +1 -1
- package/src/parse-media.ts +7 -2
- package/src/parse-result.ts +7 -1
- package/src/parser-context.ts +1 -0
- package/src/parser-state.ts +2 -2
- package/src/samples-from-moof.ts +101 -0
- package/src/test/create-matroska.test.ts +237 -23
- package/src/test/matroska.test.ts +283 -348
- package/src/test/mvhd.test.ts +1 -1
- package/src/test/parse-esds.test.ts +2 -2
- package/src/test/parse-stco.test.ts +2 -2
- package/src/test/parse-stsc.test.ts +2 -2
- package/src/test/parse-stsz.test.ts +2 -2
- package/src/test/parse-stts.test.ts +1 -1
- package/src/test/samples-from-moof.test.ts +2496 -0
- package/src/test/stream-local.test.ts +28 -30
- package/src/test/stream-samples.test.ts +153 -231
- package/src/test/stsd.test.ts +4 -2
- package/src/test/tkhd.test.ts +1 -1
- package/src/traversal.ts +118 -86
- package/tsconfig.tsbuildinfo +1 -1
- package/dist/bitstream/av1.d.ts +0 -2
- package/dist/bitstream/av1.js +0 -12
- package/dist/boxes/iso-base-media/avcc-hvcc.d.ts +0 -20
- package/dist/boxes/iso-base-media/avcc-hvcc.js +0 -73
- package/dist/boxes/iso-base-media/avcc.d.ts +0 -18
- package/dist/boxes/iso-base-media/avcc.js +0 -27
- package/dist/boxes/iso-base-media/esds-descriptors.d.ts +0 -21
- package/dist/boxes/iso-base-media/esds-descriptors.js +0 -62
- package/dist/boxes/iso-base-media/esds.d.ts +0 -15
- package/dist/boxes/iso-base-media/esds.js +0 -27
- package/dist/from-input-type-file.d.ts +0 -2
- package/dist/from-input-type-file.js +0 -37
- package/dist/get-codec.d.ts +0 -4
- package/dist/get-codec.js +0 -22
- package/dist/web-file.d.ts +0 -2
- package/dist/web-file.js +0 -37
- package/src/boxes/webm/segments/duration.ts +0 -29
- package/src/boxes/webm/segments/info.ts +0 -34
- package/src/boxes/webm/segments/main.ts +0 -6
- package/src/boxes/webm/segments/muxing.ts +0 -18
- package/src/boxes/webm/segments/seek-head.ts +0 -34
- package/src/boxes/webm/segments/seek-position.ts +0 -18
- package/src/boxes/webm/segments/seek.ts +0 -55
- package/src/boxes/webm/segments/timestamp-scale.ts +0 -17
- package/src/boxes/webm/segments/tracks.ts +0 -32
- package/src/boxes/webm/segments/void.ts +0 -18
- package/src/boxes/webm/segments/writing.ts +0 -18
- package/src/combine-uint8array.ts +0 -13
- /package/dist/{get-samples.d.ts → boxes/webm/bitstream/av1/frame.d.ts} +0 -0
- /package/dist/{get-samples.js → boxes/webm/bitstream/av1/frame.js} +0 -0
- /package/dist/{sample-aspect-ratio.d.ts → boxes/webm/bitstream/h264/get-h264-descriptor.d.ts} +0 -0
- /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
|
|
6
|
-
import {
|
|
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:
|
|
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
|
-
|
|
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: '
|
|
490
|
-
|
|
95
|
+
type: 'Segment',
|
|
96
|
+
value: s,
|
|
97
|
+
minVintWidth: offsetAfterVInt - offsetBeforeVInt,
|
|
491
98
|
})
|
|
492
99
|
: (s) => ({
|
|
493
|
-
type: '
|
|
494
|
-
|
|
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
|
-
|
|
5
|
-
|
|
3
|
+
CodecIdSegment,
|
|
4
|
+
MainSegment,
|
|
5
|
+
TrackEntry,
|
|
6
6
|
TrackNumberSegment,
|
|
7
|
-
} from './segments/
|
|
7
|
+
} from './segments/all-segments';
|
|
8
8
|
|
|
9
9
|
export const getMainSegment = (segments: AnySegment[]): MainSegment | null => {
|
|
10
|
-
return segments.find((s) => s.type === '
|
|
10
|
+
return segments.find((s) => s.type === 'Segment') as MainSegment | null;
|
|
11
11
|
};
|
|
12
12
|
|
|
13
|
-
export const getTrackNumber = (track:
|
|
14
|
-
const child = track.
|
|
15
|
-
(b) => b.type === '
|
|
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?.
|
|
17
|
+
return child?.value ?? null;
|
|
18
18
|
};
|
|
19
19
|
|
|
20
|
-
export const getTrackCodec = (track:
|
|
21
|
-
const child = track.
|
|
22
|
-
(b) => b.type === '
|
|
23
|
-
) as
|
|
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:
|
|
28
|
-
const child = track.
|
|
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:
|
|
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
|
};
|
package/src/buffer-iterator.ts
CHANGED
|
@@ -62,12 +62,13 @@ const makeOffsetCounter = (): OffsetCounter => {
|
|
|
62
62
|
|
|
63
63
|
export const getArrayBufferIterator = (
|
|
64
64
|
initialData: Uint8Array,
|
|
65
|
-
maxBytes
|
|
65
|
+
maxBytes: number | null,
|
|
66
66
|
) => {
|
|
67
67
|
const buf = new ArrayBuffer(initialData.byteLength, {
|
|
68
|
-
maxByteLength:
|
|
69
|
-
|
|
70
|
-
|
|
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
|
};
|
package/src/get-audio-codec.ts
CHANGED
|
@@ -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/
|
|
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.
|
|
167
|
-
|
|
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.
|
|
174
|
-
if (track.type === '
|
|
175
|
-
const trackType = track.
|
|
176
|
-
if (trackType && trackType.type === '
|
|
177
|
-
if (trackType.
|
|
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.
|
|
179
|
+
if (trackType.value === 'A_VORBIS') {
|
|
182
180
|
return 'vorbis';
|
|
183
181
|
}
|
|
184
182
|
|
|
185
|
-
if (trackType.
|
|
183
|
+
if (trackType.value === 'A_PCM/INT/LIT') {
|
|
186
184
|
return 'pcm';
|
|
187
185
|
}
|
|
188
186
|
|
|
189
|
-
if (trackType.
|
|
187
|
+
if (trackType.value === 'A_AAC') {
|
|
190
188
|
return 'aac';
|
|
191
189
|
}
|
|
192
190
|
|
|
193
|
-
if (trackType.
|
|
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 === '
|
|
267
|
-
if (!mainSegment || mainSegment.type !== '
|
|
264
|
+
const mainSegment = boxes.find((b) => b.type === 'Segment');
|
|
265
|
+
if (!mainSegment || mainSegment.type !== 'Segment') {
|
|
268
266
|
return null;
|
|
269
267
|
}
|
|
270
268
|
|