@remotion/media-parser 4.0.200 → 4.0.202

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 (180) 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/mvhd.js +2 -2
  16. package/dist/boxes/iso-base-media/process-box.d.ts +4 -2
  17. package/dist/boxes/iso-base-media/process-box.js +56 -40
  18. package/dist/boxes/iso-base-media/stsd/keys.js +1 -1
  19. package/dist/boxes/iso-base-media/stsd/mebx.d.ts +2 -1
  20. package/dist/boxes/iso-base-media/stsd/mebx.js +2 -1
  21. package/dist/boxes/iso-base-media/stsd/samples.js +3 -0
  22. package/dist/boxes/iso-base-media/stsd/stco.d.ts +3 -2
  23. package/dist/boxes/iso-base-media/stsd/stco.js +2 -2
  24. package/dist/boxes/iso-base-media/trak/trak.js +1 -0
  25. package/dist/boxes/webm/av1-codec-private.js +1 -1
  26. package/dist/boxes/webm/bitstream/av1.js +10 -1
  27. package/dist/boxes/webm/description.d.ts +2 -2
  28. package/dist/boxes/webm/description.js +2 -2
  29. package/dist/boxes/webm/ebml.d.ts +2 -2
  30. package/dist/boxes/webm/ebml.js +23 -1
  31. package/dist/boxes/webm/get-ready-tracks.d.ts +1 -1
  32. package/dist/boxes/webm/get-ready-tracks.js +3 -3
  33. package/dist/boxes/webm/get-sample-from-block.d.ts +17 -0
  34. package/dist/boxes/webm/get-sample-from-block.js +78 -0
  35. package/dist/boxes/webm/get-track.d.ts +2 -2
  36. package/dist/boxes/webm/get-track.js +26 -25
  37. package/dist/boxes/webm/make-header.d.ts +3 -1
  38. package/dist/boxes/webm/make-header.js +90 -32
  39. package/dist/boxes/webm/parse-ebml.d.ts +12 -0
  40. package/dist/boxes/webm/parse-ebml.js +175 -0
  41. package/dist/boxes/webm/parse-webm-header.js +8 -9
  42. package/dist/boxes/webm/segments/all-segments.d.ts +572 -1
  43. package/dist/boxes/webm/segments/all-segments.js +353 -2
  44. package/dist/boxes/webm/segments/track-entry.d.ts +5 -189
  45. package/dist/boxes/webm/segments/track-entry.js +2 -457
  46. package/dist/boxes/webm/segments.d.ts +3 -16
  47. package/dist/boxes/webm/segments.js +40 -219
  48. package/dist/boxes/webm/traversal.d.ts +5 -5
  49. package/dist/boxes/webm/traversal.js +17 -6
  50. package/dist/buffer-iterator.d.ts +10 -7
  51. package/dist/buffer-iterator.js +83 -7
  52. package/dist/create/create-media.d.ts +2 -0
  53. package/dist/create/create-media.js +36 -0
  54. package/dist/create/matroska-header.d.ts +1 -0
  55. package/dist/create/matroska-header.js +66 -0
  56. package/dist/create/matroska-info.d.ts +4 -0
  57. package/dist/create/matroska-info.js +39 -0
  58. package/dist/create/matroska-segment.d.ts +1 -0
  59. package/dist/create/matroska-segment.js +12 -0
  60. package/dist/create/matroska-trackentry.d.ts +21 -0
  61. package/dist/create/matroska-trackentry.js +191 -0
  62. package/dist/create-media.d.ts +1 -0
  63. package/dist/create-media.js +78 -0
  64. package/dist/from-fetch.js +13 -3
  65. package/dist/from-input-type-file.d.ts +2 -0
  66. package/dist/from-input-type-file.js +37 -0
  67. package/dist/from-node.js +9 -2
  68. package/dist/from-web-file.js +6 -1
  69. package/dist/from-web.js +15 -6
  70. package/dist/get-audio-codec.d.ts +2 -2
  71. package/dist/get-audio-codec.js +13 -13
  72. package/dist/get-codec.d.ts +4 -0
  73. package/dist/get-codec.js +22 -0
  74. package/dist/get-duration.js +12 -14
  75. package/dist/get-sample-positions.js +1 -1
  76. package/dist/get-tracks.js +2 -2
  77. package/dist/get-video-codec.js +13 -13
  78. package/dist/has-all-info.js +1 -1
  79. package/dist/options.d.ts +3 -2
  80. package/dist/parse-media.js +17 -10
  81. package/dist/parse-video.js +16 -0
  82. package/dist/parser-context.d.ts +1 -0
  83. package/dist/parser-state.d.ts +4 -3
  84. package/dist/parser-state.js +16 -3
  85. package/dist/reader.d.ts +1 -1
  86. package/dist/readers/from-fetch.d.ts +2 -0
  87. package/dist/readers/from-fetch.js +64 -0
  88. package/dist/readers/from-node.d.ts +2 -0
  89. package/dist/readers/from-node.js +40 -0
  90. package/dist/readers/from-web-file.d.ts +2 -0
  91. package/dist/readers/from-web-file.js +39 -0
  92. package/dist/readers/reader.d.ts +11 -0
  93. package/dist/readers/reader.js +2 -0
  94. package/dist/traversal.d.ts +19 -17
  95. package/dist/traversal.js +38 -39
  96. package/dist/web-file.d.ts +2 -0
  97. package/dist/web-file.js +37 -0
  98. package/dist/writers/web-fs.d.ts +2 -0
  99. package/dist/writers/web-fs.js +28 -0
  100. package/dist/writers/writer.d.ts +9 -0
  101. package/dist/writers/writer.js +2 -0
  102. package/input.webm +0 -0
  103. package/package.json +2 -2
  104. package/src/boxes/iso-base-media/mdat/mdat.ts +2 -1
  105. package/src/boxes/iso-base-media/moov/moov.ts +1 -0
  106. package/src/boxes/iso-base-media/mvhd.ts +2 -2
  107. package/src/boxes/iso-base-media/process-box.ts +70 -40
  108. package/src/boxes/iso-base-media/stsd/keys.ts +1 -1
  109. package/src/boxes/iso-base-media/stsd/mebx.ts +3 -0
  110. package/src/boxes/iso-base-media/stsd/samples.ts +3 -0
  111. package/src/boxes/iso-base-media/stsd/stco.ts +5 -3
  112. package/src/boxes/iso-base-media/trak/trak.ts +1 -0
  113. package/src/boxes/webm/av1-codec-private.ts +1 -1
  114. package/src/boxes/webm/description.ts +7 -4
  115. package/src/boxes/webm/ebml.ts +24 -4
  116. package/src/boxes/webm/get-ready-tracks.ts +4 -4
  117. package/src/boxes/webm/get-sample-from-block.ts +125 -0
  118. package/src/boxes/webm/get-track.ts +38 -31
  119. package/src/boxes/webm/make-header.ts +129 -32
  120. package/src/boxes/webm/parse-ebml.ts +247 -0
  121. package/src/boxes/webm/parse-webm-header.ts +8 -12
  122. package/src/boxes/webm/segments/all-segments.ts +539 -1
  123. package/src/boxes/webm/segments/track-entry.ts +5 -843
  124. package/src/boxes/webm/segments.ts +48 -435
  125. package/src/boxes/webm/traversal.ts +28 -15
  126. package/src/buffer-iterator.ts +104 -10
  127. package/src/from-fetch.ts +22 -3
  128. package/src/from-node.ts +18 -4
  129. package/src/from-web-file.ts +11 -1
  130. package/src/get-audio-codec.ts +14 -16
  131. package/src/get-duration.ts +15 -16
  132. package/src/get-sample-positions.ts +1 -1
  133. package/src/get-tracks.ts +2 -2
  134. package/src/get-video-codec.ts +13 -15
  135. package/src/has-all-info.ts +1 -1
  136. package/src/options.ts +3 -2
  137. package/src/parse-media.ts +20 -9
  138. package/src/parse-video.ts +17 -0
  139. package/src/parser-context.ts +1 -0
  140. package/src/parser-state.ts +22 -5
  141. package/src/reader.ts +1 -0
  142. package/src/test/create-matroska.test.ts +255 -7
  143. package/src/test/matroska.test.ts +311 -334
  144. package/src/test/mvhd.test.ts +1 -1
  145. package/src/test/parse-esds.test.ts +2 -2
  146. package/src/test/parse-stco.test.ts +4 -2
  147. package/src/test/parse-stsc.test.ts +2 -2
  148. package/src/test/parse-stsz.test.ts +2 -2
  149. package/src/test/parse-stts.test.ts +1 -1
  150. package/src/test/stream-local.test.ts +23 -9
  151. package/src/test/stream-remote.test.ts +23 -19
  152. package/src/test/stsd.test.ts +6 -2
  153. package/src/test/tkhd.test.ts +1 -1
  154. package/src/traversal.ts +62 -85
  155. package/tsconfig.tsbuildinfo +1 -1
  156. package/dist/boxes/iso-base-media/ftype.d.ts +0 -9
  157. package/dist/boxes/iso-base-media/ftype.js +0 -31
  158. package/dist/get-video-metadata.d.ts +0 -2
  159. package/dist/get-video-metadata.js +0 -44
  160. package/dist/read-and-increment-offset.d.ts +0 -28
  161. package/dist/read-and-increment-offset.js +0 -177
  162. package/dist/understand-vorbis.d.ts +0 -1
  163. package/dist/understand-vorbis.js +0 -12
  164. package/src/boxes/webm/segments/duration.ts +0 -29
  165. package/src/boxes/webm/segments/info.ts +0 -34
  166. package/src/boxes/webm/segments/main.ts +0 -6
  167. package/src/boxes/webm/segments/muxing.ts +0 -18
  168. package/src/boxes/webm/segments/seek-head.ts +0 -34
  169. package/src/boxes/webm/segments/seek-position.ts +0 -18
  170. package/src/boxes/webm/segments/seek.ts +0 -45
  171. package/src/boxes/webm/segments/timestamp-scale.ts +0 -17
  172. package/src/boxes/webm/segments/tracks.ts +0 -32
  173. package/src/boxes/webm/segments/unknown.ts +0 -19
  174. package/src/boxes/webm/segments/void.ts +0 -18
  175. package/src/boxes/webm/segments/writing.ts +0 -18
  176. package/src/combine-uint8array.ts +0 -13
  177. /package/dist/{boxes/webm/bitstream/av1/frame.d.ts → get-samples.d.ts} +0 -0
  178. /package/dist/{boxes/webm/bitstream/av1/frame.js → get-samples.js} +0 -0
  179. /package/dist/{boxes/webm/bitstream/h264/get-h264-descriptor.d.ts → sample-aspect-ratio.d.ts} +0 -0
  180. /package/dist/{boxes/webm/bitstream/h264/get-h264-descriptor.js → sample-aspect-ratio.js} +0 -0
@@ -5,10 +5,11 @@ export interface StcoBox extends BaseBox {
5
5
  version: number;
6
6
  flags: number[];
7
7
  entryCount: number;
8
- entries: number[];
8
+ entries: (number | bigint)[];
9
9
  }
10
- export declare const parseStco: ({ iterator, offset, size, }: {
10
+ export declare const parseStco: ({ iterator, offset, size, mode64Bit, }: {
11
11
  iterator: BufferIterator;
12
12
  offset: number;
13
13
  size: number;
14
+ mode64Bit: boolean;
14
15
  }) => StcoBox;
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.parseStco = void 0;
4
- const parseStco = ({ iterator, offset, size, }) => {
4
+ const parseStco = ({ iterator, offset, size, mode64Bit, }) => {
5
5
  const version = iterator.getUint8();
6
6
  if (version !== 0) {
7
7
  throw new Error(`Unsupported STSD version ${version}`);
@@ -14,7 +14,7 @@ const parseStco = ({ iterator, offset, size, }) => {
14
14
  if (bytesRemaining < 4) {
15
15
  break;
16
16
  }
17
- entries.push(iterator.getUint32());
17
+ entries.push(mode64Bit ? iterator.getUint64() : iterator.getUint32());
18
18
  }
19
19
  iterator.discard(size - (iterator.counter.getOffset() - offset));
20
20
  return {
@@ -10,6 +10,7 @@ const parseTrak = async ({ data, size, offsetAtStart, options, }) => {
10
10
  initialBoxes: [],
11
11
  options,
12
12
  continueMdat: false,
13
+ littleEndian: false,
13
14
  });
14
15
  if (children.status === 'incomplete') {
15
16
  throw new Error('Incomplete boxes are not allowed');
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.parseAv1PrivateData = void 0;
4
4
  const buffer_iterator_1 = require("../../buffer-iterator");
5
5
  const parseAv1PrivateData = (data, colrAtom) => {
6
- const iterator = (0, buffer_iterator_1.getArrayBufferIterator)(data);
6
+ const iterator = (0, buffer_iterator_1.getArrayBufferIterator)(data, data.byteLength);
7
7
  iterator.startReadingBits();
8
8
  if (iterator.getBits(1) !== 1) {
9
9
  iterator.destroy();
@@ -50,6 +50,15 @@ const av1Bitstream = ({ stream, length, onVideoSample, trackNumber, context, tim
50
50
  : {
51
51
  type: 'av1-bitstream-unimplemented',
52
52
  };
53
+ if (segment.type === 'av1-bitstream-header') {
54
+ if (!size) {
55
+ throw new Error('Expected size');
56
+ }
57
+ const toSample = bytesReadSoFar + size;
58
+ stream.counter.decrement(stream.counter.getOffset() - address);
59
+ const header = stream.getSlice(toSample);
60
+ context.parserState.setAv1BitstreamHeaderSegment(segment, header);
61
+ }
53
62
  if (obuType === 6) {
54
63
  const head = context.parserState.getAv1BitstreamHeaderSegment();
55
64
  if (!head) {
@@ -80,7 +89,7 @@ const av1Bitstream = ({ stream, length, onVideoSample, trackNumber, context, tim
80
89
  }
81
90
  }
82
91
  onVideoSample(trackNumber, {
83
- data: (0, combine_uint8array_1.combineUint8Arrays)(extraBytes, frame),
92
+ bytes: (0, combine_uint8array_1.combineUint8Arrays)(extraBytes, frame),
84
93
  timestamp: timecode + clusterTimestamp,
85
94
  duration: undefined,
86
95
  trackId: trackNumber,
@@ -1,2 +1,2 @@
1
- import type { TrackEntrySegment } from './segments/track-entry';
2
- export declare const getAudioDescription: (track: TrackEntrySegment) => undefined | Uint8Array;
1
+ import type { TrackEntry } from './segments/all-segments';
2
+ export declare const getAudioDescription: (track: TrackEntry) => undefined | Uint8Array;
@@ -5,7 +5,7 @@ const buffer_iterator_1 = require("../../buffer-iterator");
5
5
  const traversal_1 = require("../../traversal");
6
6
  const getAudioDescription = (track) => {
7
7
  const codec = (0, traversal_1.getCodecSegment)(track);
8
- if (!codec || codec.codec !== 'A_VORBIS') {
8
+ if (!codec || codec.value !== 'A_VORBIS') {
9
9
  return undefined;
10
10
  }
11
11
  // how to parse vorbis private
@@ -44,7 +44,7 @@ const getAudioDescription = (track) => {
44
44
  throw new Error('Error parsing vorbis codec private');
45
45
  }
46
46
  const vorbisBooks = privateData.slice(offset);
47
- const bufferIterator = (0, buffer_iterator_1.getArrayBufferIterator)(vorbisInfo.slice(0));
47
+ const bufferIterator = (0, buffer_iterator_1.getArrayBufferIterator)(vorbisInfo.slice(0), vorbisInfo.length);
48
48
  // type
49
49
  bufferIterator.getUint8();
50
50
  // vorbis
@@ -1,2 +1,2 @@
1
- export declare const measureEBMLVarInt: (value: number) => 1 | 2 | 3 | 4 | 5 | 6;
2
- export declare const getVariableInt: (value: number, width?: number) => Uint8Array;
1
+ export declare const measureEBMLVarInt: (value: number) => 4 | 6 | 1 | 5 | 3 | 2;
2
+ export declare const getVariableInt: (value: number, minWidth: number | null) => Uint8Array;
@@ -28,7 +28,8 @@ const measureEBMLVarInt = (value) => {
28
28
  throw new Error('EBML VINT size not supported ' + value);
29
29
  };
30
30
  exports.measureEBMLVarInt = measureEBMLVarInt;
31
- const getVariableInt = (value, width = (0, exports.measureEBMLVarInt)(value)) => {
31
+ const getVariableInt = (value, minWidth) => {
32
+ const width = Math.max((0, exports.measureEBMLVarInt)(value), minWidth !== null && minWidth !== void 0 ? minWidth : 0);
32
33
  switch (width) {
33
34
  case 1:
34
35
  return new Uint8Array([(1 << 7) | value]);
@@ -65,6 +66,27 @@ const getVariableInt = (value, width = (0, exports.measureEBMLVarInt)(value)) =>
65
66
  value >> 8,
66
67
  value,
67
68
  ]);
69
+ case 7:
70
+ return new Uint8Array([
71
+ (1 << 1) | ((value / 2 ** 48) & 0x1),
72
+ (value / 2 ** 40) | 0,
73
+ (value / 2 ** 32) | 0,
74
+ value >> 24,
75
+ value >> 16,
76
+ value >> 8,
77
+ value,
78
+ ]);
79
+ case 8:
80
+ return new Uint8Array([
81
+ (1 << 0) | ((value / 2 ** 56) & 0x1),
82
+ (value / 2 ** 48) | 0,
83
+ (value / 2 ** 40) | 0,
84
+ (value / 2 ** 32) | 0,
85
+ value >> 24,
86
+ value >> 16,
87
+ value >> 8,
88
+ value,
89
+ ]);
68
90
  default:
69
91
  throw new Error('Bad EBML VINT size ' + width);
70
92
  }
@@ -1,3 +1,3 @@
1
1
  import type { Track } from '../../get-tracks';
2
- import type { MainSegment } from './segments/main';
2
+ import type { MainSegment } from './segments/all-segments';
3
3
  export declare const getTracksFromMatroska: (segment: MainSegment, timescale: number) => Track[];
@@ -9,11 +9,11 @@ const getTracksFromMatroska = (segment, timescale) => {
9
9
  throw new Error('No tracks segment');
10
10
  }
11
11
  const tracks = [];
12
- for (const trackEntrySegment of tracksSegment.children) {
13
- if (trackEntrySegment.type === 'crc32-segment') {
12
+ for (const trackEntrySegment of tracksSegment.value) {
13
+ if (trackEntrySegment.type === 'Crc32') {
14
14
  continue;
15
15
  }
16
- if (trackEntrySegment.type !== 'track-entry-segment') {
16
+ if (trackEntrySegment.type !== 'TrackEntry') {
17
17
  throw new Error('Expected track entry segment');
18
18
  }
19
19
  const track = (0, get_track_1.getTrack)({
@@ -0,0 +1,17 @@
1
+ import type { ParserContext } from '../../parser-context';
2
+ import type { AudioSample, VideoSample } from '../../webcodec-sample-types';
3
+ import type { BlockSegment, SimpleBlockSegment } from './segments/all-segments';
4
+ type SampleResult = {
5
+ type: 'video-sample';
6
+ videoSample: VideoSample;
7
+ } | {
8
+ type: 'audio-sample';
9
+ audioSample: AudioSample;
10
+ } | {
11
+ type: 'partial-video-sample';
12
+ partialVideoSample: Omit<VideoSample, 'type'>;
13
+ } | {
14
+ type: 'no-sample';
15
+ };
16
+ export declare const getSampleFromBlock: (ebml: BlockSegment | SimpleBlockSegment, parserContext: ParserContext, offset: number) => SampleResult;
17
+ export {};
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getSampleFromBlock = void 0;
4
+ const buffer_iterator_1 = require("../../buffer-iterator");
5
+ const all_segments_1 = require("./segments/all-segments");
6
+ const block_simple_block_flags_1 = require("./segments/block-simple-block-flags");
7
+ const getSampleFromBlock = (ebml, parserContext, offset) => {
8
+ const iterator = (0, buffer_iterator_1.getArrayBufferIterator)(ebml.value, ebml.value.length);
9
+ const trackNumber = iterator.getVint();
10
+ if (trackNumber === null) {
11
+ throw new Error('Not enough data to get track number, should not happen');
12
+ }
13
+ const timecodeRelativeToCluster = iterator.getUint16();
14
+ const { keyframe } = (0, block_simple_block_flags_1.parseBlockFlags)(iterator, ebml.type === 'SimpleBlock'
15
+ ? all_segments_1.matroskaElements.SimpleBlock
16
+ : all_segments_1.matroskaElements.Block);
17
+ const { codec, trackTimescale } = parserContext.parserState.getTrackInfoByNumber(trackNumber);
18
+ const clusterOffset = parserContext.parserState.getTimestampOffsetForByteOffset(offset);
19
+ const timescale = parserContext.parserState.getTimescale();
20
+ if (clusterOffset === undefined) {
21
+ throw new Error('Could not find offset for byte offset ' + offset);
22
+ }
23
+ // https://github.com/hubblec4/Matroska-Chapters-Specs/blob/master/notes.md/#timestampscale
24
+ // 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.
25
+ const timecodeInNanoSeconds = (timecodeRelativeToCluster + clusterOffset) *
26
+ timescale *
27
+ (trackTimescale !== null && trackTimescale !== void 0 ? trackTimescale : 1);
28
+ // Timecode should be in microseconds
29
+ const timecodeInMicroseconds = timecodeInNanoSeconds / 1000;
30
+ if (!codec) {
31
+ throw new Error(`Could not find codec for track ${trackNumber}`);
32
+ }
33
+ const remainingNow = ebml.value.length - (iterator.counter.getOffset() - 0);
34
+ if (codec.startsWith('V_')) {
35
+ const partialVideoSample = {
36
+ data: iterator.getSlice(remainingNow),
37
+ cts: null,
38
+ dts: null,
39
+ duration: undefined,
40
+ trackId: trackNumber,
41
+ timestamp: timecodeInMicroseconds,
42
+ };
43
+ if (keyframe === null) {
44
+ iterator.destroy();
45
+ return {
46
+ type: 'partial-video-sample',
47
+ partialVideoSample,
48
+ };
49
+ }
50
+ const sample = {
51
+ ...partialVideoSample,
52
+ type: keyframe ? 'key' : 'delta',
53
+ };
54
+ iterator.destroy();
55
+ return {
56
+ type: 'video-sample',
57
+ videoSample: sample,
58
+ };
59
+ }
60
+ if (codec.startsWith('A_')) {
61
+ const audioSample = {
62
+ data: iterator.getSlice(remainingNow),
63
+ trackId: trackNumber,
64
+ timestamp: timecodeInMicroseconds,
65
+ type: 'key',
66
+ };
67
+ iterator.destroy();
68
+ return {
69
+ type: 'audio-sample',
70
+ audioSample,
71
+ };
72
+ }
73
+ iterator.destroy();
74
+ return {
75
+ type: 'no-sample',
76
+ };
77
+ };
78
+ exports.getSampleFromBlock = getSampleFromBlock;
@@ -1,6 +1,6 @@
1
1
  import type { AudioTrack, VideoTrack } from '../../get-tracks';
2
- import type { TrackEntrySegment } from './segments/track-entry';
2
+ import type { TrackEntry } from './segments/all-segments';
3
3
  export declare const getTrack: ({ timescale, track, }: {
4
4
  timescale: number;
5
- track: TrackEntrySegment;
5
+ track: TrackEntry;
6
6
  }) => VideoTrack | AudioTrack | null;
@@ -6,12 +6,13 @@ const make_hvc1_codec_strings_1 = require("../../make-hvc1-codec-strings");
6
6
  const traversal_1 = require("../../traversal");
7
7
  const av1_codec_private_1 = require("./av1-codec-private");
8
8
  const description_1 = require("./description");
9
+ const track_entry_1 = require("./segments/track-entry");
9
10
  const getDescription = (track) => {
10
11
  const codec = (0, traversal_1.getCodecSegment)(track);
11
12
  if (!codec) {
12
13
  return undefined;
13
14
  }
14
- if (codec.codec === 'V_MPEG4/ISO/AVC' || codec.codec === 'V_MPEGH/ISO/HEVC') {
15
+ if (codec.value === 'V_MPEG4/ISO/AVC' || codec.value === 'V_MPEGH/ISO/HEVC') {
15
16
  const priv = (0, traversal_1.getPrivateData)(track);
16
17
  if (priv) {
17
18
  return priv;
@@ -20,49 +21,49 @@ const getDescription = (track) => {
20
21
  return undefined;
21
22
  };
22
23
  const getMatroskaVideoCodecString = ({ track, codecSegment: codec, }) => {
23
- if (codec.codec === 'V_VP8') {
24
+ if (codec.value === 'V_VP8') {
24
25
  return 'vp8';
25
26
  }
26
- if (codec.codec === 'V_VP9') {
27
+ if (codec.value === 'V_VP9') {
27
28
  const priv = (0, traversal_1.getPrivateData)(track);
28
29
  if (priv) {
29
30
  throw new Error('@remotion/media-parser cannot handle the private data for VP9. Do you have an example file you could send so we can implement it?');
30
31
  }
31
32
  return 'vp09.00.10.08';
32
33
  }
33
- if (codec.codec === 'V_MPEG4/ISO/AVC') {
34
+ if (codec.value === 'V_MPEG4/ISO/AVC') {
34
35
  const priv = (0, traversal_1.getPrivateData)(track);
35
36
  if (priv) {
36
37
  return `avc1.${priv[1].toString(16).padStart(2, '0')}${priv[2].toString(16).padStart(2, '0')}${priv[3].toString(16).padStart(2, '0')}`;
37
38
  }
38
39
  throw new Error('Could not find a CodecPrivate field in TrackEntry');
39
40
  }
40
- if (codec.codec === 'V_AV1') {
41
+ if (codec.value === 'V_AV1') {
41
42
  const priv = (0, traversal_1.getPrivateData)(track);
42
43
  if (!priv) {
43
44
  throw new Error('Expected private data in AV1 track');
44
45
  }
45
46
  return (0, av1_codec_private_1.parseAv1PrivateData)(priv, null);
46
47
  }
47
- if (codec.codec === 'V_MPEGH/ISO/HEVC') {
48
+ if (codec.value === 'V_MPEGH/ISO/HEVC') {
48
49
  const priv = (0, traversal_1.getPrivateData)(track);
49
- const iterator = (0, buffer_iterator_1.getArrayBufferIterator)(priv);
50
+ const iterator = (0, buffer_iterator_1.getArrayBufferIterator)(priv, priv.length);
50
51
  return 'hvc1.' + (0, make_hvc1_codec_strings_1.getHvc1CodecString)(iterator);
51
52
  }
52
- throw new Error(`Unknown codec: ${codec.codec}`);
53
+ throw new Error(`Unknown codec: ${codec.value}`);
53
54
  };
54
55
  const getMatroskaAudioCodecString = (track) => {
55
56
  const codec = (0, traversal_1.getCodecSegment)(track);
56
57
  if (!codec) {
57
58
  throw new Error('Expected codec segment');
58
59
  }
59
- if (codec.codec === 'A_OPUS') {
60
+ if (codec.value === 'A_OPUS') {
60
61
  return 'opus';
61
62
  }
62
- if (codec.codec === 'A_VORBIS') {
63
+ if (codec.value === 'A_VORBIS') {
63
64
  return 'vorbis';
64
65
  }
65
- if (codec.codec === 'A_PCM/INT/LIT') {
66
+ if (codec.value === 'A_PCM/INT/LIT') {
66
67
  // https://github.com/ietf-wg-cellar/matroska-specification/issues/142#issuecomment-330004950
67
68
  // Audio samples MUST be considered as signed values, except if the audio bit depth is 8 which MUST be interpreted as unsigned values.
68
69
  const bitDepth = (0, traversal_1.getBitDepth)(track);
@@ -74,9 +75,9 @@ const getMatroskaAudioCodecString = (track) => {
74
75
  }
75
76
  return 'pcm-s' + bitDepth;
76
77
  }
77
- if (codec.codec === 'A_AAC') {
78
+ if (codec.value === 'A_AAC') {
78
79
  const priv = (0, traversal_1.getPrivateData)(track);
79
- const iterator = (0, buffer_iterator_1.getArrayBufferIterator)(priv);
80
+ const iterator = (0, buffer_iterator_1.getArrayBufferIterator)(priv, priv.length);
80
81
  iterator.startReadingBits();
81
82
  /**
82
83
  * ChatGPT
@@ -104,10 +105,10 @@ const getMatroskaAudioCodecString = (track) => {
104
105
  iterator.destroy();
105
106
  return `mp4a.40.${profile.toString().padStart(2, '0')}`;
106
107
  }
107
- if (codec.codec === 'A_MPEG/L3') {
108
+ if (codec.value === 'A_MPEG/L3') {
108
109
  return 'mp3';
109
110
  }
110
- throw new Error(`Unknown codec: ${codec.codec}`);
111
+ throw new Error(`Unknown codec: ${codec.value}`);
111
112
  };
112
113
  const getTrack = ({ timescale, track, }) => {
113
114
  const trackType = (0, traversal_1.getTrackTypeSegment)(track);
@@ -115,7 +116,7 @@ const getTrack = ({ timescale, track, }) => {
115
116
  throw new Error('Expected track type segment');
116
117
  }
117
118
  const trackId = (0, traversal_1.getTrackId)(track);
118
- if (trackType.trackType === 'video') {
119
+ if ((0, track_entry_1.trackTypeToString)(trackType.value.value) === 'video') {
119
120
  const width = (0, traversal_1.getWidthSegment)(track);
120
121
  if (width === null) {
121
122
  throw new Error('Expected width segment');
@@ -142,26 +143,26 @@ const getTrack = ({ timescale, track, }) => {
142
143
  trackId,
143
144
  codec: codecString,
144
145
  description: getDescription(track),
145
- height: displayHeight ? displayHeight.displayHeight : height.height,
146
- width: displayWidth ? displayWidth.displayWidth : width.width,
146
+ height: displayHeight ? displayHeight.value.value : height.value.value,
147
+ width: displayWidth ? displayWidth.value.value : width.value.value,
147
148
  sampleAspectRatio: {
148
149
  numerator: 1,
149
150
  denominator: 1,
150
151
  },
151
152
  timescale,
152
153
  samplePositions: [],
153
- codedHeight: height.height,
154
- codedWidth: width.width,
154
+ codedHeight: height.value.value,
155
+ codedWidth: width.value.value,
155
156
  displayAspectHeight: displayHeight
156
- ? displayHeight.displayHeight
157
- : height.height,
157
+ ? displayHeight.value.value
158
+ : height.value.value,
158
159
  displayAspectWidth: displayWidth
159
- ? displayWidth.displayWidth
160
- : width.width,
160
+ ? displayWidth.value.value
161
+ : width.value.value,
161
162
  rotation: 0,
162
163
  };
163
164
  }
164
- if (trackType.trackType === 'audio') {
165
+ if ((0, track_entry_1.trackTypeToString)(trackType.value.value) === 'audio') {
165
166
  const sampleRate = (0, traversal_1.getSampleRate)(track);
166
167
  const numberOfChannels = (0, traversal_1.getNumberOfChannels)(track);
167
168
  if (sampleRate === null) {
@@ -1,2 +1,4 @@
1
+ import type { PossibleEbmlOrUint8Array } from './segments/all-segments';
1
2
  export declare const webmPattern: Uint8Array;
2
- export declare const makeMatroskaHeader: () => Uint8Array;
3
+ export declare const makeMatroskaBytes: (fields: PossibleEbmlOrUint8Array) => Uint8Array;
4
+ export declare const combineUint8Arrays: (arrays: Uint8Array[]) => Uint8Array;
@@ -1,44 +1,102 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.makeMatroskaHeader = exports.webmPattern = void 0;
3
+ exports.combineUint8Arrays = exports.makeMatroskaBytes = exports.webmPattern = void 0;
4
4
  const ebml_1 = require("./ebml");
5
5
  const all_segments_1 = require("./segments/all-segments");
6
6
  exports.webmPattern = new Uint8Array([0x1a, 0x45, 0xdf, 0xa3]);
7
7
  const matroskaToHex = (matrId) => {
8
- const numbers = [];
8
+ const numbers = new Uint8Array((matrId.length - 2) / 2);
9
9
  for (let i = 2; i < matrId.length; i += 2) {
10
- const hex = matrId.substr(i, 2);
11
- numbers.push(parseInt(hex, 16));
10
+ const hex = matrId.substring(i, i + 2);
11
+ numbers[(i - 2) / 2] = parseInt(hex, 16);
12
12
  }
13
13
  return numbers;
14
14
  };
15
- const makeMatroskaHeader = () => {
16
- const size = 0x23;
17
- const array = new Uint8Array([
18
- ...exports.webmPattern,
19
- ...(0, ebml_1.getVariableInt)(size),
20
- ...matroskaToHex(all_segments_1.matroskaElements.EBMLVersion),
21
- ...(0, ebml_1.getVariableInt)(1),
22
- 1,
23
- ...matroskaToHex(all_segments_1.matroskaElements.EBMLReadVersion),
24
- ...(0, ebml_1.getVariableInt)(1),
25
- 1,
26
- ...matroskaToHex(all_segments_1.matroskaElements.EBMLMaxIDLength),
27
- ...(0, ebml_1.getVariableInt)(1),
28
- 4,
29
- ...matroskaToHex(all_segments_1.matroskaElements.EBMLMaxSizeLength),
30
- ...(0, ebml_1.getVariableInt)(1),
31
- 8,
32
- ...matroskaToHex(all_segments_1.matroskaElements.DocType),
33
- ...(0, ebml_1.getVariableInt)(8),
34
- ...new TextEncoder().encode('matroska'),
35
- ...matroskaToHex(all_segments_1.matroskaElements.DocTypeVersion),
36
- ...(0, ebml_1.getVariableInt)(1),
37
- 4,
38
- ...matroskaToHex(all_segments_1.matroskaElements.DocTypeReadVersion),
39
- ...(0, ebml_1.getVariableInt)(1),
40
- 2,
15
+ function putUintDynamic(number, minimumLength) {
16
+ if (number < 0) {
17
+ throw new Error('This function is designed for non-negative integers only.');
18
+ }
19
+ // Calculate the minimum number of bytes needed to store the integer
20
+ const length = Math.max(minimumLength !== null && minimumLength !== void 0 ? minimumLength : 0, Math.ceil(Math.log2(number + 1) / 8));
21
+ const bytes = new Uint8Array(length);
22
+ for (let i = 0; i < length; i++) {
23
+ // Extract each byte from the number
24
+ bytes[length - 1 - i] = (number >> (8 * i)) & 0xff;
25
+ }
26
+ return bytes;
27
+ }
28
+ const makeFromHeaderStructure = (fields) => {
29
+ if (fields instanceof Uint8Array) {
30
+ return fields;
31
+ }
32
+ const arrays = [];
33
+ const struct = all_segments_1.ebmlMap[(0, all_segments_1.getIdForName)(fields.type)];
34
+ if (struct.type === 'uint8array') {
35
+ return fields.value;
36
+ }
37
+ if (struct.type === 'children') {
38
+ for (const item of fields.value) {
39
+ arrays.push((0, exports.makeMatroskaBytes)(item));
40
+ }
41
+ return (0, exports.combineUint8Arrays)(arrays);
42
+ }
43
+ if (struct.type === 'string') {
44
+ return new TextEncoder().encode(fields.value);
45
+ }
46
+ if (struct.type === 'uint') {
47
+ return putUintDynamic(fields.value.value, fields.value.byteLength);
48
+ }
49
+ if (struct.type === 'hex-string') {
50
+ const hex = fields.value.substring(2);
51
+ const arr = new Uint8Array(hex.length / 2);
52
+ for (let i = 0; i < hex.length; i += 2) {
53
+ const byte = parseInt(hex.substring(i, i + 2), 16);
54
+ arr[i / 2] = byte;
55
+ }
56
+ return arr;
57
+ }
58
+ if (struct.type === 'float') {
59
+ const value = fields.value;
60
+ if (value.size === '32') {
61
+ const dataView = new DataView(new ArrayBuffer(4));
62
+ dataView.setFloat32(0, value.value);
63
+ return new Uint8Array(dataView.buffer);
64
+ }
65
+ const dataView2 = new DataView(new ArrayBuffer(8));
66
+ dataView2.setFloat64(0, value.value);
67
+ return new Uint8Array(dataView2.buffer);
68
+ }
69
+ throw new Error('Unexpected type');
70
+ };
71
+ const makeMatroskaBytes = (fields) => {
72
+ if (fields instanceof Uint8Array) {
73
+ return fields;
74
+ }
75
+ const value = makeFromHeaderStructure(fields);
76
+ return (0, exports.combineUint8Arrays)([
77
+ matroskaToHex((0, all_segments_1.getIdForName)(fields.type)),
78
+ (0, ebml_1.getVariableInt)(value.length, fields.minVintWidth),
79
+ value,
41
80
  ]);
42
- return array;
43
81
  };
44
- exports.makeMatroskaHeader = makeMatroskaHeader;
82
+ exports.makeMatroskaBytes = makeMatroskaBytes;
83
+ const combineUint8Arrays = (arrays) => {
84
+ if (arrays.length === 0) {
85
+ return new Uint8Array([]);
86
+ }
87
+ if (arrays.length === 1) {
88
+ return arrays[0];
89
+ }
90
+ let totalLength = 0;
91
+ for (const array of arrays) {
92
+ totalLength += array.length;
93
+ }
94
+ const result = new Uint8Array(totalLength);
95
+ let offset = 0;
96
+ for (const array of arrays) {
97
+ result.set(array, offset);
98
+ offset += array.length;
99
+ }
100
+ return result;
101
+ };
102
+ exports.combineUint8Arrays = combineUint8Arrays;
@@ -0,0 +1,12 @@
1
+ import { type BufferIterator } from '../../buffer-iterator';
2
+ import type { ParserContext } from '../../parser-context';
3
+ import type { PossibleEbml } from './segments/all-segments';
4
+ export type Prettify<T> = {
5
+ [K in keyof T]: T[K];
6
+ } & {};
7
+ export declare const parseEbml: (iterator: BufferIterator, parserContext: ParserContext) => Promise<Prettify<PossibleEbml>>;
8
+ export declare const postprocessEbml: ({ offset, ebml, parserContext, }: {
9
+ offset: number;
10
+ ebml: Prettify<PossibleEbml>;
11
+ parserContext: ParserContext;
12
+ }) => Promise<Prettify<PossibleEbml>>;