@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.
Files changed (111) hide show
  1. package/dist/av1-codec-string.d.ts +5 -0
  2. package/dist/av1-codec-string.js +18 -1
  3. package/dist/bitstream/av1.d.ts +2 -0
  4. package/dist/bitstream/av1.js +12 -0
  5. package/dist/boxes/iso-base-media/avcc-hvcc.d.ts +20 -0
  6. package/dist/boxes/iso-base-media/avcc-hvcc.js +73 -0
  7. package/dist/boxes/iso-base-media/avcc.d.ts +18 -0
  8. package/dist/boxes/iso-base-media/avcc.js +27 -0
  9. package/dist/boxes/iso-base-media/esds-descriptors.d.ts +21 -0
  10. package/dist/boxes/iso-base-media/esds-descriptors.js +62 -0
  11. package/dist/boxes/iso-base-media/esds.d.ts +15 -0
  12. package/dist/boxes/iso-base-media/esds.js +27 -0
  13. package/dist/boxes/iso-base-media/mdat/mdat.js +2 -1
  14. package/dist/boxes/iso-base-media/moov/moov.js +1 -0
  15. package/dist/boxes/iso-base-media/process-box.d.ts +4 -2
  16. package/dist/boxes/iso-base-media/process-box.js +56 -40
  17. package/dist/boxes/iso-base-media/stsd/mebx.d.ts +2 -1
  18. package/dist/boxes/iso-base-media/stsd/mebx.js +2 -1
  19. package/dist/boxes/iso-base-media/stsd/samples.js +3 -0
  20. package/dist/boxes/iso-base-media/stsd/stco.d.ts +3 -2
  21. package/dist/boxes/iso-base-media/stsd/stco.js +2 -2
  22. package/dist/boxes/iso-base-media/trak/trak.js +1 -0
  23. package/dist/boxes/webm/bitstream/av1.js +10 -1
  24. package/dist/boxes/webm/ebml.d.ts +1 -1
  25. package/dist/boxes/webm/make-header.d.ts +8 -1
  26. package/dist/boxes/webm/make-header.js +65 -30
  27. package/dist/boxes/webm/parse-ebml.d.ts +7 -0
  28. package/dist/boxes/webm/parse-ebml.js +66 -0
  29. package/dist/boxes/webm/parse-webm-header.js +8 -9
  30. package/dist/boxes/webm/segments/all-segments.d.ts +258 -1
  31. package/dist/boxes/webm/segments/all-segments.js +126 -2
  32. package/dist/boxes/webm/segments/seek-position.js +1 -1
  33. package/dist/boxes/webm/segments/seek.d.ts +1 -1
  34. package/dist/boxes/webm/segments/seek.js +8 -2
  35. package/dist/boxes/webm/segments/timestamp-scale.js +1 -1
  36. package/dist/boxes/webm/segments/track-entry.d.ts +5 -1
  37. package/dist/boxes/webm/segments/track-entry.js +19 -20
  38. package/dist/boxes/webm/segments.d.ts +2 -2
  39. package/dist/boxes/webm/segments.js +30 -25
  40. package/dist/boxes/webm/traversal.d.ts +1 -0
  41. package/dist/boxes/webm/traversal.js +12 -1
  42. package/dist/buffer-iterator.d.ts +9 -6
  43. package/dist/buffer-iterator.js +83 -7
  44. package/dist/from-fetch.js +13 -3
  45. package/dist/from-input-type-file.d.ts +2 -0
  46. package/dist/from-input-type-file.js +37 -0
  47. package/dist/from-node.js +9 -2
  48. package/dist/from-web-file.js +6 -1
  49. package/dist/from-web.js +15 -6
  50. package/dist/get-audio-codec.d.ts +1 -1
  51. package/dist/get-codec.d.ts +4 -0
  52. package/dist/get-codec.js +22 -0
  53. package/dist/get-sample-positions.js +1 -1
  54. package/dist/has-all-info.js +1 -1
  55. package/dist/options.d.ts +3 -2
  56. package/dist/parse-media.js +13 -9
  57. package/dist/parse-video.js +16 -0
  58. package/dist/parser-state.d.ts +4 -3
  59. package/dist/parser-state.js +15 -3
  60. package/dist/reader.d.ts +1 -1
  61. package/dist/web-file.d.ts +2 -0
  62. package/dist/web-file.js +37 -0
  63. package/package.json +2 -2
  64. package/src/boxes/iso-base-media/mdat/mdat.ts +2 -1
  65. package/src/boxes/iso-base-media/moov/moov.ts +1 -0
  66. package/src/boxes/iso-base-media/process-box.ts +70 -40
  67. package/src/boxes/iso-base-media/stsd/mebx.ts +3 -0
  68. package/src/boxes/iso-base-media/stsd/samples.ts +3 -0
  69. package/src/boxes/iso-base-media/stsd/stco.ts +5 -3
  70. package/src/boxes/iso-base-media/trak/trak.ts +1 -0
  71. package/src/boxes/webm/make-header.ts +122 -32
  72. package/src/boxes/webm/parse-ebml.ts +93 -0
  73. package/src/boxes/webm/parse-webm-header.ts +8 -12
  74. package/src/boxes/webm/segments/all-segments.ts +222 -1
  75. package/src/boxes/webm/segments/seek-position.ts +1 -1
  76. package/src/boxes/webm/segments/seek.ts +12 -2
  77. package/src/boxes/webm/segments/timestamp-scale.ts +1 -1
  78. package/src/boxes/webm/segments/track-entry.ts +31 -26
  79. package/src/boxes/webm/segments.ts +37 -32
  80. package/src/boxes/webm/traversal.ts +13 -0
  81. package/src/buffer-iterator.ts +102 -9
  82. package/src/from-fetch.ts +22 -3
  83. package/src/from-node.ts +18 -4
  84. package/src/from-web-file.ts +11 -1
  85. package/src/get-sample-positions.ts +1 -1
  86. package/src/has-all-info.ts +1 -1
  87. package/src/options.ts +3 -2
  88. package/src/parse-media.ts +14 -8
  89. package/src/parse-video.ts +17 -0
  90. package/src/parser-state.ts +22 -5
  91. package/src/reader.ts +1 -0
  92. package/src/test/create-matroska.test.ts +36 -2
  93. package/src/test/matroska.test.ts +69 -27
  94. package/src/test/parse-stco.test.ts +2 -0
  95. package/src/test/stream-local.test.ts +23 -9
  96. package/src/test/stream-remote.test.ts +23 -19
  97. package/src/test/stsd.test.ts +2 -0
  98. package/tsconfig.tsbuildinfo +1 -1
  99. package/dist/boxes/iso-base-media/ftype.d.ts +0 -9
  100. package/dist/boxes/iso-base-media/ftype.js +0 -31
  101. package/dist/get-video-metadata.d.ts +0 -2
  102. package/dist/get-video-metadata.js +0 -44
  103. package/dist/read-and-increment-offset.d.ts +0 -28
  104. package/dist/read-and-increment-offset.js +0 -177
  105. package/dist/understand-vorbis.d.ts +0 -1
  106. package/dist/understand-vorbis.js +0 -12
  107. package/src/boxes/webm/segments/unknown.ts +0 -19
  108. /package/dist/{boxes/webm/bitstream/av1/frame.d.ts → get-samples.d.ts} +0 -0
  109. /package/dist/{boxes/webm/bitstream/av1/frame.js → get-samples.js} +0 -0
  110. /package/dist/{boxes/webm/bitstream/h264/get-h264-descriptor.d.ts → sample-aspect-ratio.d.ts} +0 -0
  111. /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: '0x42F7',
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.getDecimalBytes(length);
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 = iterator.getMatroskaSegmentId();
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.getDecimalBytes(3);
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
- timecode: number;
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.getDecimalBytes(length);
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: value,
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
- const timecode = timecodeRelativeToCluster + clusterOffset;
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.codec.startsWith('V_')) {
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: timecode,
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.codec.startsWith('A_')) {
356
+ if (codec.startsWith('A_')) {
358
357
  await parserContext.parserState.onAudioSample(trackNumber, {
359
358
  data: iterator.getSlice(remainingNow),
360
359
  trackId: trackNumber,
361
- timestamp: timecode,
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
- timecode,
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 | UnknownSegment | 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;
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
- const bytesRemaining = iterator.byteLength() - iterator.counter.getOffset();
217
- const toDiscard = Math.min(bytesRemaining, length > 0 ? length : bytesRemaining);
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 bytesRemaining_ = iterator.bytesRemaining();
223
- if (bytesRemaining_ === 0) {
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
- discardFirstBytes: () => void;
24
+ removeBytesRead: () => void;
25
25
  isWebm: () => boolean;
26
26
  discard: (length: number) => void;
27
- getFourByteNumber: () => number;
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
- getDecimalBytes(length: number): number;
47
+ getUint(length: number): number;
45
48
  getByteString(length: number): string;
46
49
  getFloat64: () => number;
47
50
  getFloat32: () => number;