@remotion/media-parser 4.0.200 → 4.0.201
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 +5 -0
- package/dist/av1-codec-string.js +18 -1
- package/dist/bitstream/av1.d.ts +2 -0
- package/dist/bitstream/av1.js +12 -0
- package/dist/boxes/iso-base-media/avcc-hvcc.d.ts +20 -0
- package/dist/boxes/iso-base-media/avcc-hvcc.js +73 -0
- package/dist/boxes/iso-base-media/avcc.d.ts +18 -0
- package/dist/boxes/iso-base-media/avcc.js +27 -0
- package/dist/boxes/iso-base-media/esds-descriptors.d.ts +21 -0
- package/dist/boxes/iso-base-media/esds-descriptors.js +62 -0
- package/dist/boxes/iso-base-media/esds.d.ts +15 -0
- package/dist/boxes/iso-base-media/esds.js +27 -0
- package/dist/boxes/iso-base-media/mdat/mdat.js +2 -1
- package/dist/boxes/iso-base-media/moov/moov.js +1 -0
- package/dist/boxes/iso-base-media/process-box.d.ts +4 -2
- package/dist/boxes/iso-base-media/process-box.js +56 -40
- package/dist/boxes/iso-base-media/stsd/mebx.d.ts +2 -1
- package/dist/boxes/iso-base-media/stsd/mebx.js +2 -1
- package/dist/boxes/iso-base-media/stsd/samples.js +3 -0
- package/dist/boxes/iso-base-media/stsd/stco.d.ts +3 -2
- package/dist/boxes/iso-base-media/stsd/stco.js +2 -2
- package/dist/boxes/iso-base-media/trak/trak.js +1 -0
- package/dist/boxes/webm/bitstream/av1.js +10 -1
- package/dist/boxes/webm/ebml.d.ts +1 -1
- package/dist/boxes/webm/make-header.d.ts +8 -1
- package/dist/boxes/webm/make-header.js +65 -30
- package/dist/boxes/webm/parse-ebml.d.ts +7 -0
- package/dist/boxes/webm/parse-ebml.js +66 -0
- package/dist/boxes/webm/parse-webm-header.js +8 -9
- package/dist/boxes/webm/segments/all-segments.d.ts +258 -1
- package/dist/boxes/webm/segments/all-segments.js +126 -2
- package/dist/boxes/webm/segments/seek-position.js +1 -1
- package/dist/boxes/webm/segments/seek.d.ts +1 -1
- package/dist/boxes/webm/segments/seek.js +8 -2
- package/dist/boxes/webm/segments/timestamp-scale.js +1 -1
- package/dist/boxes/webm/segments/track-entry.d.ts +5 -1
- package/dist/boxes/webm/segments/track-entry.js +19 -20
- package/dist/boxes/webm/segments.d.ts +2 -2
- package/dist/boxes/webm/segments.js +30 -25
- package/dist/boxes/webm/traversal.d.ts +1 -0
- package/dist/boxes/webm/traversal.js +12 -1
- package/dist/buffer-iterator.d.ts +9 -6
- package/dist/buffer-iterator.js +83 -7
- package/dist/from-fetch.js +13 -3
- package/dist/from-input-type-file.d.ts +2 -0
- package/dist/from-input-type-file.js +37 -0
- package/dist/from-node.js +9 -2
- package/dist/from-web-file.js +6 -1
- package/dist/from-web.js +15 -6
- package/dist/get-audio-codec.d.ts +1 -1
- package/dist/get-codec.d.ts +4 -0
- package/dist/get-codec.js +22 -0
- package/dist/get-sample-positions.js +1 -1
- package/dist/has-all-info.js +1 -1
- package/dist/options.d.ts +3 -2
- package/dist/parse-media.js +13 -9
- package/dist/parse-video.js +16 -0
- package/dist/parser-state.d.ts +4 -3
- package/dist/parser-state.js +15 -3
- package/dist/reader.d.ts +1 -1
- package/dist/web-file.d.ts +2 -0
- package/dist/web-file.js +37 -0
- package/package.json +2 -2
- package/src/boxes/iso-base-media/mdat/mdat.ts +2 -1
- package/src/boxes/iso-base-media/moov/moov.ts +1 -0
- package/src/boxes/iso-base-media/process-box.ts +70 -40
- package/src/boxes/iso-base-media/stsd/mebx.ts +3 -0
- package/src/boxes/iso-base-media/stsd/samples.ts +3 -0
- package/src/boxes/iso-base-media/stsd/stco.ts +5 -3
- package/src/boxes/iso-base-media/trak/trak.ts +1 -0
- package/src/boxes/webm/make-header.ts +122 -32
- package/src/boxes/webm/parse-ebml.ts +93 -0
- package/src/boxes/webm/parse-webm-header.ts +8 -12
- package/src/boxes/webm/segments/all-segments.ts +222 -1
- package/src/boxes/webm/segments/seek-position.ts +1 -1
- package/src/boxes/webm/segments/seek.ts +12 -2
- package/src/boxes/webm/segments/timestamp-scale.ts +1 -1
- package/src/boxes/webm/segments/track-entry.ts +31 -26
- package/src/boxes/webm/segments.ts +37 -32
- package/src/boxes/webm/traversal.ts +13 -0
- package/src/buffer-iterator.ts +102 -9
- package/src/from-fetch.ts +22 -3
- package/src/from-node.ts +18 -4
- package/src/from-web-file.ts +11 -1
- package/src/get-sample-positions.ts +1 -1
- package/src/has-all-info.ts +1 -1
- package/src/options.ts +3 -2
- package/src/parse-media.ts +14 -8
- package/src/parse-video.ts +17 -0
- package/src/parser-state.ts +22 -5
- package/src/reader.ts +1 -0
- package/src/test/create-matroska.test.ts +36 -2
- package/src/test/matroska.test.ts +69 -27
- package/src/test/parse-stco.test.ts +2 -0
- package/src/test/stream-local.test.ts +23 -9
- package/src/test/stream-remote.test.ts +23 -19
- package/src/test/stsd.test.ts +2 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/dist/boxes/iso-base-media/ftype.d.ts +0 -9
- package/dist/boxes/iso-base-media/ftype.js +0 -31
- package/dist/get-video-metadata.d.ts +0 -2
- package/dist/get-video-metadata.js +0 -44
- package/dist/read-and-increment-offset.d.ts +0 -28
- package/dist/read-and-increment-offset.js +0 -177
- package/dist/understand-vorbis.d.ts +0 -1
- package/dist/understand-vorbis.js +0 -12
- package/src/boxes/webm/segments/unknown.ts +0 -19
- /package/dist/{boxes/webm/bitstream/av1/frame.d.ts → get-samples.d.ts} +0 -0
- /package/dist/{boxes/webm/bitstream/av1/frame.js → get-samples.js} +0 -0
- /package/dist/{boxes/webm/bitstream/h264/get-h264-descriptor.d.ts → sample-aspect-ratio.d.ts} +0 -0
- /package/dist/{boxes/webm/bitstream/h264/get-h264-descriptor.js → sample-aspect-ratio.js} +0 -0
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getSegmentName = exports.knownIdsWithThreeLength = exports.knownIdsWithTwoLength = exports.knownIdsWithOneLength = exports.matroskaElements = void 0;
|
|
3
|
+
exports.ebmlMap = exports.voidHeader = exports.seek = exports.seekPosition = exports.seekId = exports.matroskaHeader = exports.matroskaHeaderStructure = exports.voidEbml = exports.docTypeReadVersion = exports.docTypeVersion = exports.docType = exports.ebmlMaxSizeLength = exports.ebmlMaxIdLength = exports.ebmlReadVersion = exports.ebmlVersion = exports.getIdForName = exports.getSegmentName = exports.knownIdsWithThreeLength = exports.knownIdsWithTwoLength = exports.knownIdsWithOneLength = exports.matroskaElements = void 0;
|
|
4
4
|
exports.matroskaElements = {
|
|
5
|
+
Header: '0x1a45dfa3',
|
|
5
6
|
EBMLMaxIDLength: '0x42f2',
|
|
6
7
|
EBMLVersion: '0x4286',
|
|
7
|
-
EBMLReadVersion: '
|
|
8
|
+
EBMLReadVersion: '0x42f7',
|
|
8
9
|
EBMLMaxSizeLength: '0x42f3',
|
|
9
10
|
DocType: '0x4282',
|
|
10
11
|
DocTypeVersion: '0x4287',
|
|
@@ -280,3 +281,126 @@ const getSegmentName = (id) => {
|
|
|
280
281
|
return (_a = Object.entries(exports.matroskaElements).find(([, value]) => value === id)) === null || _a === void 0 ? void 0 : _a[0];
|
|
281
282
|
};
|
|
282
283
|
exports.getSegmentName = getSegmentName;
|
|
284
|
+
const getIdForName = (name) => {
|
|
285
|
+
var _a;
|
|
286
|
+
const value = (_a = Object.entries(exports.matroskaElements).find(([key]) => key === name)) === null || _a === void 0 ? void 0 : _a[1];
|
|
287
|
+
if (!value) {
|
|
288
|
+
throw new Error(`Could not find id for name ${name}`);
|
|
289
|
+
}
|
|
290
|
+
return value;
|
|
291
|
+
};
|
|
292
|
+
exports.getIdForName = getIdForName;
|
|
293
|
+
exports.ebmlVersion = {
|
|
294
|
+
name: 'EBMLVersion',
|
|
295
|
+
type: 'uint',
|
|
296
|
+
};
|
|
297
|
+
exports.ebmlReadVersion = {
|
|
298
|
+
name: 'EBMLReadVersion',
|
|
299
|
+
type: 'uint',
|
|
300
|
+
};
|
|
301
|
+
exports.ebmlMaxIdLength = {
|
|
302
|
+
name: 'EBMLMaxIDLength',
|
|
303
|
+
type: 'uint',
|
|
304
|
+
};
|
|
305
|
+
exports.ebmlMaxSizeLength = {
|
|
306
|
+
name: 'EBMLMaxSizeLength',
|
|
307
|
+
type: 'uint',
|
|
308
|
+
};
|
|
309
|
+
exports.docType = {
|
|
310
|
+
name: 'DocType',
|
|
311
|
+
type: 'string',
|
|
312
|
+
};
|
|
313
|
+
exports.docTypeVersion = {
|
|
314
|
+
name: 'DocTypeVersion',
|
|
315
|
+
type: 'uint',
|
|
316
|
+
};
|
|
317
|
+
exports.docTypeReadVersion = {
|
|
318
|
+
name: 'DocTypeReadVersion',
|
|
319
|
+
type: 'uint',
|
|
320
|
+
};
|
|
321
|
+
exports.voidEbml = {
|
|
322
|
+
name: 'Void',
|
|
323
|
+
type: 'void',
|
|
324
|
+
};
|
|
325
|
+
exports.matroskaHeaderStructure = [
|
|
326
|
+
exports.ebmlVersion,
|
|
327
|
+
exports.ebmlReadVersion,
|
|
328
|
+
exports.ebmlMaxIdLength,
|
|
329
|
+
exports.ebmlMaxSizeLength,
|
|
330
|
+
exports.docType,
|
|
331
|
+
exports.docTypeVersion,
|
|
332
|
+
exports.docTypeReadVersion,
|
|
333
|
+
];
|
|
334
|
+
exports.matroskaHeader = {
|
|
335
|
+
name: 'Header',
|
|
336
|
+
type: 'children',
|
|
337
|
+
children: exports.matroskaHeaderStructure,
|
|
338
|
+
};
|
|
339
|
+
exports.seekId = {
|
|
340
|
+
name: 'SeekID',
|
|
341
|
+
type: 'hex-string',
|
|
342
|
+
};
|
|
343
|
+
exports.seekPosition = {
|
|
344
|
+
name: 'SeekPosition',
|
|
345
|
+
type: 'uint',
|
|
346
|
+
};
|
|
347
|
+
exports.seek = {
|
|
348
|
+
name: 'Seek',
|
|
349
|
+
type: 'children',
|
|
350
|
+
children: [exports.seekId, exports.seekPosition],
|
|
351
|
+
};
|
|
352
|
+
exports.voidHeader = {
|
|
353
|
+
name: 'Void',
|
|
354
|
+
type: 'void',
|
|
355
|
+
};
|
|
356
|
+
exports.ebmlMap = {
|
|
357
|
+
[exports.matroskaElements.Header]: exports.matroskaHeader,
|
|
358
|
+
[exports.matroskaElements.DocType]: exports.docType,
|
|
359
|
+
[exports.matroskaElements.DocTypeVersion]: exports.docTypeVersion,
|
|
360
|
+
[exports.matroskaElements.DocTypeReadVersion]: exports.docTypeReadVersion,
|
|
361
|
+
[exports.matroskaElements.EBMLVersion]: exports.ebmlVersion,
|
|
362
|
+
[exports.matroskaElements.EBMLReadVersion]: exports.ebmlReadVersion,
|
|
363
|
+
[exports.matroskaElements.EBMLMaxIDLength]: exports.ebmlMaxIdLength,
|
|
364
|
+
[exports.matroskaElements.EBMLMaxSizeLength]: exports.ebmlMaxSizeLength,
|
|
365
|
+
[exports.matroskaElements.Void]: exports.voidEbml,
|
|
366
|
+
[exports.matroskaElements.Cues]: {
|
|
367
|
+
name: 'Cues',
|
|
368
|
+
type: 'void',
|
|
369
|
+
},
|
|
370
|
+
[exports.matroskaElements.DateUTC]: {
|
|
371
|
+
name: 'DateUTC',
|
|
372
|
+
type: 'void',
|
|
373
|
+
},
|
|
374
|
+
[exports.matroskaElements.TrackTimestampScale]: {
|
|
375
|
+
name: 'TrackTimestampScale',
|
|
376
|
+
type: 'float',
|
|
377
|
+
},
|
|
378
|
+
[exports.matroskaElements.CodecDelay]: {
|
|
379
|
+
name: 'CodecDelay',
|
|
380
|
+
type: 'void',
|
|
381
|
+
},
|
|
382
|
+
[exports.matroskaElements.SeekPreRoll]: {
|
|
383
|
+
name: 'SeekPreRoll',
|
|
384
|
+
type: 'void',
|
|
385
|
+
},
|
|
386
|
+
[exports.matroskaElements.DiscardPadding]: {
|
|
387
|
+
name: 'DiscardPadding',
|
|
388
|
+
type: 'void',
|
|
389
|
+
},
|
|
390
|
+
[exports.matroskaElements.OutputSamplingFrequency]: {
|
|
391
|
+
name: 'OutputSamplingFrequency',
|
|
392
|
+
type: 'void',
|
|
393
|
+
},
|
|
394
|
+
[exports.matroskaElements.CodecName]: {
|
|
395
|
+
name: 'CodecName',
|
|
396
|
+
type: 'void',
|
|
397
|
+
},
|
|
398
|
+
[exports.matroskaElements.Position]: {
|
|
399
|
+
name: 'Position',
|
|
400
|
+
type: 'void',
|
|
401
|
+
},
|
|
402
|
+
[exports.matroskaElements.SliceDuration]: {
|
|
403
|
+
name: 'SliceDuration',
|
|
404
|
+
type: 'void',
|
|
405
|
+
},
|
|
406
|
+
};
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.parseSeekPositionSegment = void 0;
|
|
4
4
|
const parseSeekPositionSegment = (iterator, length) => {
|
|
5
|
-
const seekPosition = iterator.
|
|
5
|
+
const seekPosition = iterator.getUint(length);
|
|
6
6
|
return {
|
|
7
7
|
type: 'seek-position-segment',
|
|
8
8
|
seekPosition,
|
|
@@ -10,4 +10,4 @@ export type SeekIdSegment = {
|
|
|
10
10
|
type: 'seek-id-segment';
|
|
11
11
|
seekId: string;
|
|
12
12
|
};
|
|
13
|
-
export declare const parseSeekIdSegment: (iterator: BufferIterator) => SeekIdSegment;
|
|
13
|
+
export declare const parseSeekIdSegment: (iterator: BufferIterator, length: number) => SeekIdSegment;
|
|
@@ -19,8 +19,14 @@ const parseSeekSegment = async (iterator, length, parserContext) => {
|
|
|
19
19
|
};
|
|
20
20
|
};
|
|
21
21
|
exports.parseSeekSegment = parseSeekSegment;
|
|
22
|
-
const parseSeekIdSegment = (iterator) => {
|
|
23
|
-
const seekId =
|
|
22
|
+
const parseSeekIdSegment = (iterator, length) => {
|
|
23
|
+
const seekId = '0x' +
|
|
24
|
+
[...iterator.getSlice(length)]
|
|
25
|
+
.map((b) => b.toString(16).padStart(2, '0'))
|
|
26
|
+
.join('');
|
|
27
|
+
if (seekId === null) {
|
|
28
|
+
throw new Error('Not enough bytes to parse seek id');
|
|
29
|
+
}
|
|
24
30
|
return {
|
|
25
31
|
type: 'seek-id-segment',
|
|
26
32
|
seekId,
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.parseTimestampScaleSegment = void 0;
|
|
4
4
|
const parseTimestampScaleSegment = (iterator) => {
|
|
5
|
-
const timestampScale = iterator.
|
|
5
|
+
const timestampScale = iterator.getUint(3);
|
|
6
6
|
return {
|
|
7
7
|
type: 'timestamp-scale-segment',
|
|
8
8
|
timestampScale,
|
|
@@ -31,6 +31,10 @@ export type CodecSegment = {
|
|
|
31
31
|
type: 'codec-segment';
|
|
32
32
|
codec: string;
|
|
33
33
|
};
|
|
34
|
+
export type TrackInfo = {
|
|
35
|
+
codec: string;
|
|
36
|
+
trackTimescale: number | null;
|
|
37
|
+
};
|
|
34
38
|
export declare const parseCodecSegment: (iterator: BufferIterator, length: number) => CodecSegment;
|
|
35
39
|
type TrackType = 'video' | 'audio' | 'complex' | 'subtitle' | 'button' | 'control' | 'metadata';
|
|
36
40
|
export type TrackTypeSegment = {
|
|
@@ -141,7 +145,7 @@ export type SimpleBlockOrBlockSegment = {
|
|
|
141
145
|
type: 'simple-block-or-block-segment';
|
|
142
146
|
length: number;
|
|
143
147
|
trackNumber: number;
|
|
144
|
-
|
|
148
|
+
timecodeInMicroseconds: number;
|
|
145
149
|
keyframe: boolean | null;
|
|
146
150
|
lacing: number;
|
|
147
151
|
invisible: boolean;
|
|
@@ -109,7 +109,7 @@ const parseTrackTypeSegment = (iterator, length) => {
|
|
|
109
109
|
};
|
|
110
110
|
exports.parseTrackTypeSegment = parseTrackTypeSegment;
|
|
111
111
|
const parseDefaultDurationSegment = (iterator, length) => {
|
|
112
|
-
const defaultDuration = iterator.
|
|
112
|
+
const defaultDuration = iterator.getUint(length);
|
|
113
113
|
return {
|
|
114
114
|
type: 'default-duration-segment',
|
|
115
115
|
defaultDuration,
|
|
@@ -300,47 +300,46 @@ const parseTagSegment = (iterator, length) => {
|
|
|
300
300
|
};
|
|
301
301
|
exports.parseTagSegment = parseTagSegment;
|
|
302
302
|
const parseTimestampSegment = (iterator, length) => {
|
|
303
|
-
if (length > 3) {
|
|
304
|
-
throw new Error('Expected timestamp segment to be 1 byte or 2 bytes, but is ' + length);
|
|
305
|
-
}
|
|
306
|
-
if (length === 3) {
|
|
307
|
-
const val = iterator.getUint24();
|
|
308
|
-
return {
|
|
309
|
-
type: 'timestamp-segment',
|
|
310
|
-
timestamp: val,
|
|
311
|
-
};
|
|
312
|
-
}
|
|
313
|
-
const value = length === 2 ? iterator.getUint16() : iterator.getUint8();
|
|
314
303
|
return {
|
|
315
304
|
type: 'timestamp-segment',
|
|
316
|
-
timestamp:
|
|
305
|
+
timestamp: iterator.getUint(length),
|
|
317
306
|
};
|
|
318
307
|
};
|
|
319
308
|
exports.parseTimestampSegment = parseTimestampSegment;
|
|
320
309
|
const parseSimpleBlockOrBlockSegment = async ({ iterator, length, parserContext, type, }) => {
|
|
321
310
|
const start = iterator.counter.getOffset();
|
|
322
311
|
const trackNumber = iterator.getVint();
|
|
312
|
+
if (trackNumber === null) {
|
|
313
|
+
throw new Error('Not enough data to get track number, should not happen');
|
|
314
|
+
}
|
|
323
315
|
const timecodeRelativeToCluster = iterator.getUint16();
|
|
324
316
|
const { invisible, lacing, keyframe } = (0, block_simple_block_flags_1.parseBlockFlags)(iterator, type);
|
|
325
|
-
const codec = parserContext.parserState.getTrackInfoByNumber(trackNumber);
|
|
317
|
+
const { codec, trackTimescale } = parserContext.parserState.getTrackInfoByNumber(trackNumber);
|
|
326
318
|
const clusterOffset = parserContext.parserState.getTimestampOffsetForByteOffset(iterator.counter.getOffset());
|
|
319
|
+
const timescale = parserContext.parserState.getTimescale();
|
|
327
320
|
if (clusterOffset === undefined) {
|
|
328
321
|
throw new Error('Could not find offset for byte offset ' + iterator.counter.getOffset());
|
|
329
322
|
}
|
|
330
|
-
|
|
323
|
+
// https://github.com/hubblec4/Matroska-Chapters-Specs/blob/master/notes.md/#timestampscale
|
|
324
|
+
// The TimestampScale Element is used to calculate the Raw Timestamp of a Block. The timestamp is obtained by adding the Block's timestamp to the Cluster's Timestamp Element, and then multiplying that result by the TimestampScale. The result will be the Block's Raw Timestamp in nanoseconds.
|
|
325
|
+
const timecodeInNanoSeconds = (timecodeRelativeToCluster + clusterOffset) *
|
|
326
|
+
timescale *
|
|
327
|
+
(trackTimescale !== null && trackTimescale !== void 0 ? trackTimescale : 1);
|
|
328
|
+
// Timecode should be in microseconds
|
|
329
|
+
const timecodeInMicroseconds = timecodeInNanoSeconds / 1000;
|
|
331
330
|
if (!codec) {
|
|
332
331
|
throw new Error('Could not find codec for track ' + trackNumber);
|
|
333
332
|
}
|
|
334
333
|
const remainingNow = length - (iterator.counter.getOffset() - start);
|
|
335
334
|
let videoSample = null;
|
|
336
|
-
if (codec.
|
|
335
|
+
if (codec.startsWith('V_')) {
|
|
337
336
|
const partialVideoSample = {
|
|
338
337
|
data: iterator.getSlice(remainingNow),
|
|
339
338
|
cts: null,
|
|
340
339
|
dts: null,
|
|
341
340
|
duration: undefined,
|
|
342
341
|
trackId: trackNumber,
|
|
343
|
-
timestamp:
|
|
342
|
+
timestamp: timecodeInMicroseconds,
|
|
344
343
|
};
|
|
345
344
|
if (keyframe === null) {
|
|
346
345
|
// If we don't know if this is a keyframe, we know after we emit the BlockGroup
|
|
@@ -354,11 +353,11 @@ const parseSimpleBlockOrBlockSegment = async ({ iterator, length, parserContext,
|
|
|
354
353
|
await parserContext.parserState.onVideoSample(trackNumber, sample);
|
|
355
354
|
}
|
|
356
355
|
}
|
|
357
|
-
if (codec.
|
|
356
|
+
if (codec.startsWith('A_')) {
|
|
358
357
|
await parserContext.parserState.onAudioSample(trackNumber, {
|
|
359
358
|
data: iterator.getSlice(remainingNow),
|
|
360
359
|
trackId: trackNumber,
|
|
361
|
-
timestamp:
|
|
360
|
+
timestamp: timecodeInMicroseconds,
|
|
362
361
|
type: 'key',
|
|
363
362
|
});
|
|
364
363
|
}
|
|
@@ -370,7 +369,7 @@ const parseSimpleBlockOrBlockSegment = async ({ iterator, length, parserContext,
|
|
|
370
369
|
type: 'simple-block-or-block-segment',
|
|
371
370
|
length,
|
|
372
371
|
trackNumber,
|
|
373
|
-
|
|
372
|
+
timecodeInMicroseconds,
|
|
374
373
|
keyframe,
|
|
375
374
|
lacing,
|
|
376
375
|
invisible,
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { BufferIterator } from '../../buffer-iterator';
|
|
2
2
|
import type { ParseResult } from '../../parse-result';
|
|
3
3
|
import type { ParserContext } from '../../parser-context';
|
|
4
|
+
import type { PossibleEbml } from './segments/all-segments';
|
|
4
5
|
import type { DurationSegment } from './segments/duration';
|
|
5
6
|
import type { InfoSegment } from './segments/info';
|
|
6
7
|
import { type MainSegment } from './segments/main';
|
|
@@ -12,9 +13,8 @@ import { type SeekPositionSegment } from './segments/seek-position';
|
|
|
12
13
|
import type { TimestampScaleSegment } from './segments/timestamp-scale';
|
|
13
14
|
import type { AlphaModeSegment, AudioSegment, BitDepthSegment, BlockAdditionsSegment, BlockElement, BlockGroupSegment, ChannelsSegment, ClusterSegment, CodecPrivateSegment, CodecSegment, ColorSegment, Crc32Segment, DefaultDurationSegment, DefaultFlagSegment, DisplayHeightSegment, DisplayWidthSegment, FlagLacingSegment, HeightSegment, InterlacedSegment, LanguageSegment, MaxBlockAdditionId, ReferenceBlockSegment, SamplingFrequencySegment, SegmentUUIDSegment, SimpleBlockOrBlockSegment, TagSegment, TagsSegment, TimestampSegment, TitleSegment, TrackEntrySegment, TrackNumberSegment, TrackTypeSegment, TrackUIDSegment, VideoSegment, WidthSegment } from './segments/track-entry';
|
|
14
15
|
import type { TracksSegment } from './segments/tracks';
|
|
15
|
-
import type { UnknownSegment } from './segments/unknown';
|
|
16
16
|
import type { VoidSegment } from './segments/void';
|
|
17
17
|
import type { WritingAppSegment } from './segments/writing';
|
|
18
|
-
export type MatroskaSegment = MainSegment |
|
|
18
|
+
export type MatroskaSegment = MainSegment | SeekHeadSegment | SeekSegment | SeekPositionSegment | VoidSegment | InfoSegment | TimestampScaleSegment | MuxingAppSegment | WritingAppSegment | DurationSegment | TracksSegment | TrackEntrySegment | TrackNumberSegment | TrackUIDSegment | FlagLacingSegment | LanguageSegment | CodecSegment | TrackTypeSegment | DefaultDurationSegment | VideoSegment | WidthSegment | HeightSegment | DisplayWidthSegment | DisplayHeightSegment | AlphaModeSegment | MaxBlockAdditionId | ColorSegment | TitleSegment | InterlacedSegment | CodecPrivateSegment | Crc32Segment | SegmentUUIDSegment | DefaultFlagSegment | TagsSegment | TagSegment | ClusterSegment | TimestampSegment | SimpleBlockOrBlockSegment | BlockGroupSegment | BlockElement | SeekIdSegment | AudioSegment | SamplingFrequencySegment | ChannelsSegment | BitDepthSegment | ReferenceBlockSegment | BlockAdditionsSegment | PossibleEbml;
|
|
19
19
|
export type OnTrackEntrySegment = (trackEntry: TrackEntrySegment) => void;
|
|
20
20
|
export declare const expectSegment: (iterator: BufferIterator, parserContext: ParserContext) => Promise<ParseResult>;
|
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.expectSegment = void 0;
|
|
4
4
|
const add_new_matroska_tracks_1 = require("../../add-new-matroska-tracks");
|
|
5
5
|
const get_track_1 = require("./get-track");
|
|
6
|
+
const parse_ebml_1 = require("./parse-ebml");
|
|
6
7
|
const all_segments_1 = require("./segments/all-segments");
|
|
7
8
|
const duration_1 = require("./segments/duration");
|
|
8
9
|
const info_1 = require("./segments/info");
|
|
@@ -14,33 +15,17 @@ const seek_position_1 = require("./segments/seek-position");
|
|
|
14
15
|
const timestamp_scale_1 = require("./segments/timestamp-scale");
|
|
15
16
|
const track_entry_1 = require("./segments/track-entry");
|
|
16
17
|
const tracks_1 = require("./segments/tracks");
|
|
17
|
-
const unknown_1 = require("./segments/unknown");
|
|
18
18
|
const void_1 = require("./segments/void");
|
|
19
19
|
const writing_1 = require("./segments/writing");
|
|
20
|
-
const parseSegment = async ({ segmentId, iterator, length, parserContext, }) => {
|
|
20
|
+
const parseSegment = async ({ segmentId, iterator, length, parserContext, headerReadSoFar, }) => {
|
|
21
21
|
if (length === 0) {
|
|
22
22
|
throw new Error(`Expected length of ${segmentId} to be greater than 0`);
|
|
23
23
|
}
|
|
24
|
-
if (segmentId === '0x') {
|
|
25
|
-
return {
|
|
26
|
-
type: 'unknown-segment',
|
|
27
|
-
id: segmentId,
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
// Log this to debug
|
|
31
|
-
/*
|
|
32
|
-
console.log(
|
|
33
|
-
'segmentId',
|
|
34
|
-
segmentId,
|
|
35
|
-
getSegmentName(segmentId),
|
|
36
|
-
iterator.counter.getOffset(),
|
|
37
|
-
);
|
|
38
|
-
*/
|
|
39
24
|
if (segmentId === '0x114d9b74') {
|
|
40
25
|
return (0, seek_head_1.parseSeekHeadSegment)(iterator, length, parserContext);
|
|
41
26
|
}
|
|
42
27
|
if (segmentId === '0x53ab') {
|
|
43
|
-
return (0, seek_1.parseSeekIdSegment)(iterator);
|
|
28
|
+
return (0, seek_1.parseSeekIdSegment)(iterator, length);
|
|
44
29
|
}
|
|
45
30
|
if (segmentId === '0x4dbb') {
|
|
46
31
|
return (0, seek_1.parseSeekSegment)(iterator, length, parserContext);
|
|
@@ -213,14 +198,12 @@ const parseSegment = async ({ segmentId, iterator, length, parserContext, }) =>
|
|
|
213
198
|
if (segmentId === '0xa1') {
|
|
214
199
|
return (0, track_entry_1.parseBlockElementSegment)(iterator, length);
|
|
215
200
|
}
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
const child = (0, unknown_1.parseUnknownSegment)(iterator, segmentId, toDiscard);
|
|
219
|
-
return child;
|
|
201
|
+
iterator.counter.decrement(headerReadSoFar);
|
|
202
|
+
return (0, parse_ebml_1.parseEbml)(iterator);
|
|
220
203
|
};
|
|
221
204
|
const expectSegment = async (iterator, parserContext) => {
|
|
222
|
-
const
|
|
223
|
-
if (
|
|
205
|
+
const offset = iterator.counter.getOffset();
|
|
206
|
+
if (iterator.bytesRemaining() === 0) {
|
|
224
207
|
return {
|
|
225
208
|
status: 'incomplete',
|
|
226
209
|
segments: [],
|
|
@@ -230,9 +213,30 @@ const expectSegment = async (iterator, parserContext) => {
|
|
|
230
213
|
skipTo: null,
|
|
231
214
|
};
|
|
232
215
|
}
|
|
233
|
-
const offset = iterator.counter.getOffset();
|
|
234
216
|
const segmentId = iterator.getMatroskaSegmentId();
|
|
217
|
+
if (segmentId === null) {
|
|
218
|
+
iterator.counter.decrement(iterator.counter.getOffset() - offset);
|
|
219
|
+
return {
|
|
220
|
+
status: 'incomplete',
|
|
221
|
+
segments: [],
|
|
222
|
+
continueParsing: () => {
|
|
223
|
+
return Promise.resolve((0, exports.expectSegment)(iterator, parserContext));
|
|
224
|
+
},
|
|
225
|
+
skipTo: null,
|
|
226
|
+
};
|
|
227
|
+
}
|
|
235
228
|
const length = iterator.getVint();
|
|
229
|
+
if (length === null) {
|
|
230
|
+
iterator.counter.decrement(iterator.counter.getOffset() - offset);
|
|
231
|
+
return {
|
|
232
|
+
status: 'incomplete',
|
|
233
|
+
segments: [],
|
|
234
|
+
continueParsing: () => {
|
|
235
|
+
return Promise.resolve((0, exports.expectSegment)(iterator, parserContext));
|
|
236
|
+
},
|
|
237
|
+
skipTo: null,
|
|
238
|
+
};
|
|
239
|
+
}
|
|
236
240
|
const bytesRemainingNow = iterator.byteLength() - iterator.counter.getOffset();
|
|
237
241
|
if (segmentId === '0x18538067' || segmentId === '0x1f43b675') {
|
|
238
242
|
const main = await (0, parse_children_1.expectChildren)({
|
|
@@ -280,6 +284,7 @@ const expectSegment = async (iterator, parserContext) => {
|
|
|
280
284
|
iterator,
|
|
281
285
|
length,
|
|
282
286
|
parserContext,
|
|
287
|
+
headerReadSoFar: iterator.counter.getOffset() - offset,
|
|
283
288
|
});
|
|
284
289
|
return {
|
|
285
290
|
status: 'done',
|
|
@@ -4,4 +4,5 @@ import type { CodecSegment, TrackEntrySegment } from './segments/track-entry';
|
|
|
4
4
|
export declare const getMainSegment: (segments: AnySegment[]) => MainSegment | null;
|
|
5
5
|
export declare const getTrackNumber: (track: TrackEntrySegment) => number | null;
|
|
6
6
|
export declare const getTrackCodec: (track: TrackEntrySegment) => CodecSegment | null;
|
|
7
|
+
export declare const getTrackTimestampScale: (track: TrackEntrySegment) => number | null;
|
|
7
8
|
export declare const getTrackByNumber: (tracks: TrackEntrySegment[], id: number) => TrackEntrySegment | undefined;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getTrackByNumber = exports.getTrackCodec = exports.getTrackNumber = exports.getMainSegment = void 0;
|
|
3
|
+
exports.getTrackByNumber = exports.getTrackTimestampScale = exports.getTrackCodec = exports.getTrackNumber = exports.getMainSegment = void 0;
|
|
4
4
|
const getMainSegment = (segments) => {
|
|
5
5
|
return segments.find((s) => s.type === 'main-segment');
|
|
6
6
|
};
|
|
@@ -16,6 +16,17 @@ const getTrackCodec = (track) => {
|
|
|
16
16
|
return child !== null && child !== void 0 ? child : null;
|
|
17
17
|
};
|
|
18
18
|
exports.getTrackCodec = getTrackCodec;
|
|
19
|
+
const getTrackTimestampScale = (track) => {
|
|
20
|
+
const child = track.children.find((b) => b.type === 'TrackTimestampScale');
|
|
21
|
+
if (!child) {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
if (child.type !== 'TrackTimestampScale') {
|
|
25
|
+
throw new Error('Expected TrackTimestampScale');
|
|
26
|
+
}
|
|
27
|
+
return child.value;
|
|
28
|
+
};
|
|
29
|
+
exports.getTrackTimestampScale = getTrackTimestampScale;
|
|
19
30
|
const getTrackByNumber = (tracks, id) => {
|
|
20
31
|
return tracks.find((track) => {
|
|
21
32
|
const trackNumber = (0, exports.getTrackNumber)(track);
|
|
@@ -21,27 +21,30 @@ export declare const getArrayBufferIterator: (initialData: Uint8Array, maxBytes?
|
|
|
21
21
|
bytesRemaining: () => number;
|
|
22
22
|
isIsoBaseMedia: () => boolean;
|
|
23
23
|
leb128: () => number;
|
|
24
|
-
|
|
24
|
+
removeBytesRead: () => void;
|
|
25
25
|
isWebm: () => boolean;
|
|
26
26
|
discard: (length: number) => void;
|
|
27
|
-
|
|
27
|
+
getEightByteNumber: (littleEndian?: boolean) => number;
|
|
28
|
+
getFourByteNumber: (littleEndian?: boolean) => number;
|
|
28
29
|
getSlice: (amount: number) => Uint8Array;
|
|
29
30
|
getAtom: () => string;
|
|
31
|
+
isRiff: () => boolean;
|
|
30
32
|
getPaddedFourByteNumber: () => number;
|
|
31
|
-
getMatroskaSegmentId: () => string;
|
|
32
|
-
getVint: () => number;
|
|
33
|
+
getMatroskaSegmentId: () => string | null;
|
|
34
|
+
getVint: () => number | null;
|
|
33
35
|
getUint8: () => number;
|
|
34
36
|
getEBML: () => number;
|
|
35
37
|
getInt8: () => number;
|
|
36
38
|
getUint16: () => number;
|
|
37
39
|
getUint24: () => number;
|
|
38
40
|
getInt16: () => number;
|
|
39
|
-
getUint32: () => number;
|
|
41
|
+
getUint32: (littleEndian?: boolean) => number;
|
|
42
|
+
getUint64: (littleEndian?: boolean) => bigint;
|
|
40
43
|
getFixedPointUnsigned1616Number: () => number;
|
|
41
44
|
getFixedPointSigned1616Number: () => number;
|
|
42
45
|
getFixedPointSigned230Number: () => number;
|
|
43
46
|
getPascalString: () => number[];
|
|
44
|
-
|
|
47
|
+
getUint(length: number): number;
|
|
45
48
|
getByteString(length: number): string;
|
|
46
49
|
getFloat64: () => number;
|
|
47
50
|
getFloat32: () => number;
|