@remotion/media-parser 4.0.240 → 4.0.242

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 (186) hide show
  1. package/dist/add-avc-profile-to-track.js +2 -2
  2. package/dist/boxes/avc/codec-private.d.ts +1 -1
  3. package/dist/boxes/avc/codec-private.js +2 -2
  4. package/dist/boxes/avc/create-sps-pps-data.d.ts +2 -0
  5. package/dist/boxes/avc/create-sps-pps-data.js +28 -0
  6. package/dist/boxes/iso-base-media/get-keyframes.d.ts +3 -0
  7. package/dist/boxes/iso-base-media/get-keyframes.js +30 -0
  8. package/dist/boxes/iso-base-media/mdat/mdat.d.ts +3 -3
  9. package/dist/boxes/iso-base-media/mdat/mdat.js +9 -5
  10. package/dist/boxes/iso-base-media/moov/moov.d.ts +3 -3
  11. package/dist/boxes/iso-base-media/moov/moov.js +5 -4
  12. package/dist/boxes/iso-base-media/process-box.d.ts +9 -9
  13. package/dist/boxes/iso-base-media/process-box.js +48 -56
  14. package/dist/boxes/iso-base-media/stsd/mebx.d.ts +3 -3
  15. package/dist/boxes/iso-base-media/stsd/mebx.js +5 -4
  16. package/dist/boxes/iso-base-media/stsd/samples.d.ts +5 -5
  17. package/dist/boxes/iso-base-media/stsd/samples.js +19 -16
  18. package/dist/boxes/iso-base-media/stsd/stsd.d.ts +3 -3
  19. package/dist/boxes/iso-base-media/stsd/stsd.js +2 -2
  20. package/dist/boxes/iso-base-media/trak/trak.d.ts +3 -3
  21. package/dist/boxes/iso-base-media/trak/trak.js +7 -6
  22. package/dist/boxes/riff/expect-riff-box.d.ts +3 -3
  23. package/dist/boxes/riff/expect-riff-box.js +5 -5
  24. package/dist/boxes/riff/get-tracks-from-avi.js +1 -1
  25. package/dist/boxes/riff/parse-box.d.ts +7 -7
  26. package/dist/boxes/riff/parse-box.js +29 -24
  27. package/dist/boxes/riff/parse-list-box.d.ts +3 -3
  28. package/dist/boxes/riff/parse-list-box.js +2 -2
  29. package/dist/boxes/riff/parse-movi.d.ts +5 -5
  30. package/dist/boxes/riff/parse-movi.js +35 -20
  31. package/dist/boxes/riff/parse-riff-box.d.ts +3 -3
  32. package/dist/boxes/riff/parse-riff-box.js +2 -2
  33. package/dist/boxes/transport-stream/adts-header.d.ts +1 -1
  34. package/dist/boxes/transport-stream/discard-rest-of-packet.d.ts +1 -1
  35. package/dist/boxes/transport-stream/get-tracks.js +1 -1
  36. package/dist/boxes/transport-stream/handle-aac-packet.d.ts +4 -3
  37. package/dist/boxes/transport-stream/handle-aac-packet.js +6 -4
  38. package/dist/boxes/transport-stream/handle-avc-packet.d.ts +4 -3
  39. package/dist/boxes/transport-stream/handle-avc-packet.js +8 -6
  40. package/dist/boxes/transport-stream/parse-packet.d.ts +3 -3
  41. package/dist/boxes/transport-stream/parse-packet.js +2 -2
  42. package/dist/boxes/transport-stream/parse-stream-packet.d.ts +3 -3
  43. package/dist/boxes/transport-stream/parse-stream-packet.js +14 -7
  44. package/dist/boxes/transport-stream/parse-transport-stream.d.ts +5 -6
  45. package/dist/boxes/transport-stream/parse-transport-stream.js +10 -9
  46. package/dist/boxes/transport-stream/process-stream-buffers.d.ts +6 -5
  47. package/dist/boxes/transport-stream/process-stream-buffers.js +18 -8
  48. package/dist/boxes/webm/ebml.d.ts +1 -1
  49. package/dist/boxes/webm/get-sample-from-block.d.ts +2 -2
  50. package/dist/boxes/webm/get-sample-from-block.js +8 -4
  51. package/dist/boxes/webm/make-header.d.ts +3 -3
  52. package/dist/boxes/webm/parse-ebml.d.ts +4 -4
  53. package/dist/boxes/webm/parse-ebml.js +18 -18
  54. package/dist/boxes/webm/parse-webm-header.d.ts +5 -5
  55. package/dist/boxes/webm/parse-webm-header.js +6 -5
  56. package/dist/boxes/webm/segments/parse-children.d.ts +5 -5
  57. package/dist/boxes/webm/segments/parse-children.js +12 -13
  58. package/dist/boxes/webm/segments.d.ts +3 -3
  59. package/dist/boxes/webm/segments.js +13 -13
  60. package/dist/buffer-iterator.d.ts +2 -6
  61. package/dist/buffer-iterator.js +4 -29
  62. package/dist/convert-audio-or-video-sample.js +2 -0
  63. package/dist/create/iso-base-media/codec-specific/avc1.d.ts +1 -1
  64. package/dist/create/iso-base-media/codec-specific/create-codec-specific-data.d.ts +1 -1
  65. package/dist/create/iso-base-media/codec-specific/mp4a.d.ts +1 -1
  66. package/dist/create/iso-base-media/create-colr.d.ts +1 -1
  67. package/dist/create/iso-base-media/create-ftyp.d.ts +2 -2
  68. package/dist/create/iso-base-media/create-ilst.d.ts +1 -1
  69. package/dist/create/iso-base-media/create-mdia.d.ts +1 -1
  70. package/dist/create/iso-base-media/create-moov.d.ts +1 -1
  71. package/dist/create/iso-base-media/create-mvhd.d.ts +1 -1
  72. package/dist/create/iso-base-media/create-trak.d.ts +1 -1
  73. package/dist/create/iso-base-media/create-udta.d.ts +1 -1
  74. package/dist/create/iso-base-media/create-url.d.ts +1 -1
  75. package/dist/create/iso-base-media/ilst/create-cmt.d.ts +1 -1
  76. package/dist/create/iso-base-media/ilst/create-too.d.ts +1 -1
  77. package/dist/create/iso-base-media/mdia/create-mdhd.d.ts +1 -1
  78. package/dist/create/iso-base-media/mp4-header.d.ts +1 -1
  79. package/dist/create/iso-base-media/primitives.d.ts +13 -13
  80. package/dist/create/iso-base-media/serialize-track.d.ts +1 -1
  81. package/dist/create/iso-base-media/trak/create-tkhd.d.ts +2 -2
  82. package/dist/create/iso-base-media/trak/mdia/create-minf.d.ts +1 -1
  83. package/dist/create/iso-base-media/trak/mdia/minf/create-dinf.d.ts +1 -1
  84. package/dist/create/iso-base-media/trak/mdia/minf/create-smhd.d.ts +1 -1
  85. package/dist/create/iso-base-media/trak/mdia/minf/create-stbl.d.ts +1 -1
  86. package/dist/create/iso-base-media/trak/mdia/minf/create-vmhd.d.ts +1 -1
  87. package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-ctts.d.ts +1 -1
  88. package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-stco.d.ts +1 -1
  89. package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-stsc.d.ts +1 -1
  90. package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-stss.d.ts +1 -1
  91. package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-stsz.d.ts +1 -1
  92. package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-stts.d.ts +1 -1
  93. package/dist/create/iso-base-media/trak/mdia/minf/stbl/stsd/create-avc1.d.ts +1 -1
  94. package/dist/create/iso-base-media/trak/mdia/minf/stbl/stsd/create-avcc.d.ts +1 -1
  95. package/dist/create/iso-base-media/trak/mdia/minf/stbl/stsd/create-pasp.d.ts +1 -1
  96. package/dist/create/iso-base-media/udta/create-meta.d.ts +1 -1
  97. package/dist/create/iso-base-media/udta/meta/create-hdlr.d.ts +1 -1
  98. package/dist/create/matroska/cluster-segment.d.ts +1 -1
  99. package/dist/emit-available-info.d.ts +6 -4
  100. package/dist/emit-available-info.js +231 -79
  101. package/dist/errors/detect-file-type.d.ts +1 -0
  102. package/dist/errors/detect-file-type.js +88 -0
  103. package/dist/errors/file-types.d.ts +1 -0
  104. package/dist/errors/file-types.js +88 -0
  105. package/dist/errors.d.ts +68 -0
  106. package/dist/errors.js +71 -0
  107. package/dist/esm/from-fetch.mjs +1 -0
  108. package/dist/esm/from-node.mjs +1 -0
  109. package/dist/esm/from-web-file.mjs +2 -1
  110. package/dist/esm/index.mjs +1457 -542
  111. package/dist/file-types/bmp.d.ts +6 -0
  112. package/dist/file-types/bmp.js +23 -0
  113. package/dist/file-types/detect-file-type.d.ts +42 -0
  114. package/dist/file-types/detect-file-type.js +59 -0
  115. package/dist/file-types/get-jpeg-dimensions.d.ts +4 -0
  116. package/dist/file-types/get-jpeg-dimensions.js +32 -0
  117. package/dist/file-types/index.d.ts +2 -0
  118. package/dist/file-types/index.js +57 -0
  119. package/dist/file-types/jpeg.d.ts +12 -0
  120. package/dist/file-types/jpeg.js +44 -0
  121. package/dist/file-types/pdf.d.ts +4 -0
  122. package/dist/file-types/pdf.js +12 -0
  123. package/dist/file-types/png.d.ts +10 -0
  124. package/dist/file-types/png.js +32 -0
  125. package/dist/file-types/webp.d.ts +6 -0
  126. package/dist/file-types/webp.js +69 -0
  127. package/dist/file-types.d.ts +1 -0
  128. package/dist/file-types.js +88 -0
  129. package/dist/get-audio-codec.d.ts +1 -1
  130. package/dist/get-duration.d.ts +1 -0
  131. package/dist/get-duration.js +14 -1
  132. package/dist/get-fields-from-callbacks.d.ts +5 -0
  133. package/dist/get-fields-from-callbacks.js +32 -0
  134. package/dist/get-fps.d.ts +1 -0
  135. package/dist/get-fps.js +17 -12
  136. package/dist/get-keyframes.d.ts +5 -0
  137. package/dist/get-keyframes.js +20 -0
  138. package/dist/get-tracks.d.ts +7 -1
  139. package/dist/get-tracks.js +15 -10
  140. package/dist/has-all-info.d.ts +5 -4
  141. package/dist/has-all-info.js +31 -5
  142. package/dist/index.d.ts +2 -0
  143. package/dist/index.js +7 -1
  144. package/dist/may-skip-video-data/may-skip-video-data.d.ts +4 -0
  145. package/dist/may-skip-video-data/may-skip-video-data.js +14 -0
  146. package/dist/may-skip-video-data/need-samples-for-fields.d.ts +5 -0
  147. package/dist/may-skip-video-data/need-samples-for-fields.js +33 -0
  148. package/dist/options.d.ts +68 -53
  149. package/dist/parse-media.js +42 -31
  150. package/dist/parse-result.d.ts +2 -4
  151. package/dist/parse-video.d.ts +8 -5
  152. package/dist/parse-video.js +94 -17
  153. package/dist/probing/detect-file-type.d.ts +1 -0
  154. package/dist/probing/detect-file-type.js +88 -0
  155. package/dist/probing/get-jpeg-dimensions.d.ts +4 -0
  156. package/dist/probing/get-jpeg-dimensions.js +32 -0
  157. package/dist/readers/from-fetch.js +1 -0
  158. package/dist/readers/from-node.js +1 -0
  159. package/dist/readers/from-web-file.js +1 -0
  160. package/dist/readers/reader.d.ts +1 -0
  161. package/dist/register-track.d.ts +5 -5
  162. package/dist/register-track.js +12 -12
  163. package/dist/state/can-skip-tracks.js +6 -0
  164. package/dist/state/emitted-fields.d.ts +2 -0
  165. package/dist/state/emitted-fields.js +31 -0
  166. package/dist/state/has-tracks-section.d.ts +1 -0
  167. package/dist/state/keyframes.d.ts +6 -0
  168. package/dist/state/keyframes.js +15 -0
  169. package/dist/state/parser-state.d.ts +60 -29
  170. package/dist/state/parser-state.js +32 -150
  171. package/dist/state/riff.d.ts +10 -0
  172. package/dist/state/riff.js +32 -0
  173. package/dist/state/sample-callbacks.d.ts +31 -0
  174. package/dist/state/sample-callbacks.js +96 -0
  175. package/dist/state/slow-duration-fps.d.ts +8 -0
  176. package/dist/state/slow-duration-fps.js +36 -0
  177. package/dist/state/structure.d.ts +7 -0
  178. package/dist/state/structure.js +21 -0
  179. package/dist/state/tracks-and-samples.d.ts +0 -0
  180. package/dist/state/tracks-and-samples.js +1 -0
  181. package/dist/state/webm.d.ts +11 -0
  182. package/dist/state/webm.js +67 -0
  183. package/dist/version.d.ts +1 -1
  184. package/dist/version.js +1 -1
  185. package/dist/webcodec-sample-types.d.ts +2 -0
  186. package/package.json +3 -3
@@ -4,7 +4,7 @@ exports.getSampleFromBlock = void 0;
4
4
  const buffer_iterator_1 = require("../../buffer-iterator");
5
5
  const all_segments_1 = require("./segments/all-segments");
6
6
  const block_simple_block_flags_1 = require("./segments/block-simple-block-flags");
7
- const getSampleFromBlock = (ebml, parserContext, offset) => {
7
+ const getSampleFromBlock = (ebml, state, offset) => {
8
8
  const iterator = (0, buffer_iterator_1.getArrayBufferIterator)(ebml.value, ebml.value.length);
9
9
  const trackNumber = iterator.getVint();
10
10
  if (trackNumber === null) {
@@ -14,9 +14,9 @@ const getSampleFromBlock = (ebml, parserContext, offset) => {
14
14
  const { keyframe } = (0, block_simple_block_flags_1.parseBlockFlags)(iterator, ebml.type === 'SimpleBlock'
15
15
  ? all_segments_1.matroskaElements.SimpleBlock
16
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();
17
+ const { codec, trackTimescale } = state.webm.getTrackInfoByNumber(trackNumber);
18
+ const clusterOffset = state.webm.getTimestampOffsetForByteOffset(offset);
19
+ const timescale = state.webm.getTimescale();
20
20
  if (clusterOffset === undefined) {
21
21
  throw new Error('Could not find offset for byte offset ' + offset);
22
22
  }
@@ -39,6 +39,8 @@ const getSampleFromBlock = (ebml, parserContext, offset) => {
39
39
  duration: undefined,
40
40
  trackId: trackNumber,
41
41
  timestamp: timecodeInMicroseconds,
42
+ offset,
43
+ timescale,
42
44
  };
43
45
  if (keyframe === null) {
44
46
  iterator.destroy();
@@ -66,6 +68,8 @@ const getSampleFromBlock = (ebml, parserContext, offset) => {
66
68
  duration: undefined,
67
69
  cts: timecodeInMicroseconds,
68
70
  dts: timecodeInMicroseconds,
71
+ offset,
72
+ timescale,
69
73
  };
70
74
  iterator.destroy();
71
75
  return {
@@ -1,8 +1,8 @@
1
1
  import type { BytesAndOffset, PossibleEbmlOrUint8Array } from './segments/all-segments';
2
2
  import { matroskaElements } from './segments/all-segments';
3
- export declare const webmPattern: Uint8Array;
4
- export declare const matroskaToHex: (matrId: (typeof matroskaElements)[keyof typeof matroskaElements]) => Uint8Array;
3
+ export declare const webmPattern: Uint8Array<ArrayBuffer>;
4
+ export declare const matroskaToHex: (matrId: (typeof matroskaElements)[keyof typeof matroskaElements]) => Uint8Array<ArrayBufferLike>;
5
5
  export declare const makeMatroskaBytes: (fields: PossibleEbmlOrUint8Array) => BytesAndOffset;
6
6
  export declare const padMatroskaBytes: (fields: PossibleEbmlOrUint8Array, totalLength: number) => BytesAndOffset[];
7
- export declare const combineUint8Arrays: (arrays: Uint8Array[]) => Uint8Array;
7
+ export declare const combineUint8Arrays: (arrays: Uint8Array[]) => Uint8Array<ArrayBufferLike>;
8
8
  export declare function serializeUint16(value: number): Uint8Array;
@@ -1,12 +1,12 @@
1
1
  import { type BufferIterator } from '../../buffer-iterator';
2
- import type { ParserContext } from '../../parser-context';
2
+ import type { ParserState } from '../../state/parser-state';
3
3
  import type { PossibleEbml } from './segments/all-segments';
4
4
  export type Prettify<T> = {
5
5
  [K in keyof T]: T[K];
6
6
  } & {};
7
- export declare const parseEbml: (iterator: BufferIterator, parserContext: ParserContext) => Promise<Prettify<PossibleEbml>>;
8
- export declare const postprocessEbml: ({ offset, ebml, parserContext, }: {
7
+ export declare const parseEbml: (iterator: BufferIterator, state: ParserState) => Promise<Prettify<PossibleEbml>>;
8
+ export declare const postprocessEbml: ({ offset, ebml, state, }: {
9
9
  offset: number;
10
10
  ebml: Prettify<PossibleEbml>;
11
- parserContext: ParserContext;
11
+ state: ParserState;
12
12
  }) => Promise<Prettify<PossibleEbml>>;
@@ -5,7 +5,7 @@ const register_track_1 = require("../../register-track");
5
5
  const get_sample_from_block_1 = require("./get-sample-from-block");
6
6
  const make_track_1 = require("./make-track");
7
7
  const all_segments_1 = require("./segments/all-segments");
8
- const parseEbml = async (iterator, parserContext) => {
8
+ const parseEbml = async (iterator, state) => {
9
9
  const hex = iterator.getMatroskaSegmentId();
10
10
  if (hex === null) {
11
11
  throw new Error('Not enough bytes left to parse EBML - this should not happen');
@@ -83,12 +83,12 @@ const parseEbml = async (iterator, parserContext) => {
83
83
  break;
84
84
  }
85
85
  const offset = iterator.counter.getOffset();
86
- const value = await (0, exports.parseEbml)(iterator, parserContext);
86
+ const value = await (0, exports.parseEbml)(iterator, state);
87
87
  // eslint-disable-next-line @typescript-eslint/no-use-before-define
88
88
  const remapped = await (0, exports.postprocessEbml)({
89
89
  offset,
90
90
  ebml: value,
91
- parserContext,
91
+ state,
92
92
  });
93
93
  children.push(remapped);
94
94
  const offsetNow = iterator.counter.getOffset();
@@ -105,46 +105,46 @@ const parseEbml = async (iterator, parserContext) => {
105
105
  throw new Error(`Unknown segment type ${hasInMap.type}`);
106
106
  };
107
107
  exports.parseEbml = parseEbml;
108
- const postprocessEbml = async ({ offset, ebml, parserContext, }) => {
108
+ const postprocessEbml = async ({ offset, ebml, state, }) => {
109
109
  if (ebml.type === 'TimestampScale') {
110
- parserContext.parserState.setTimescale(ebml.value.value);
110
+ state.webm.setTimescale(ebml.value.value);
111
111
  }
112
112
  if (ebml.type === 'TrackEntry') {
113
- parserContext.parserState.onTrackEntrySegment(ebml);
113
+ state.webm.onTrackEntrySegment(ebml);
114
114
  const track = (0, make_track_1.getTrack)({
115
115
  track: ebml,
116
- timescale: parserContext.parserState.getTimescale(),
116
+ timescale: state.webm.getTimescale(),
117
117
  });
118
118
  if (track) {
119
119
  await (0, register_track_1.registerTrack)({
120
- options: parserContext,
120
+ state,
121
121
  track,
122
122
  container: 'webm',
123
123
  });
124
124
  }
125
125
  }
126
126
  if (ebml.type === 'Timestamp') {
127
- parserContext.parserState.setTimestampOffset(offset, ebml.value.value);
127
+ state.webm.setTimestampOffset(offset, ebml.value.value);
128
128
  }
129
129
  if (ebml.type === 'Block' || ebml.type === 'SimpleBlock') {
130
- const sample = (0, get_sample_from_block_1.getSampleFromBlock)(ebml, parserContext, offset);
131
- if (sample.type === 'video-sample' && parserContext.nullifySamples) {
132
- await parserContext.parserState.onVideoSample(sample.videoSample.trackId, sample.videoSample);
130
+ const sample = (0, get_sample_from_block_1.getSampleFromBlock)(ebml, state, offset);
131
+ if (sample.type === 'video-sample' && state.nullifySamples) {
132
+ await state.callbacks.onVideoSample(sample.videoSample.trackId, sample.videoSample);
133
133
  return {
134
134
  type: 'Block',
135
135
  value: new Uint8Array([]),
136
136
  minVintWidth: ebml.minVintWidth,
137
137
  };
138
138
  }
139
- if (sample.type === 'audio-sample' && parserContext.nullifySamples) {
140
- await parserContext.parserState.onAudioSample(sample.audioSample.trackId, sample.audioSample);
139
+ if (sample.type === 'audio-sample' && state.nullifySamples) {
140
+ await state.callbacks.onAudioSample(sample.audioSample.trackId, sample.audioSample);
141
141
  return {
142
142
  type: 'Block',
143
143
  value: new Uint8Array([]),
144
144
  minVintWidth: ebml.minVintWidth,
145
145
  };
146
146
  }
147
- if (sample.type === 'no-sample' && parserContext.nullifySamples) {
147
+ if (sample.type === 'no-sample' && state.nullifySamples) {
148
148
  return {
149
149
  type: 'Block',
150
150
  value: new Uint8Array([]),
@@ -164,15 +164,15 @@ const postprocessEbml = async ({ offset, ebml, parserContext, }) => {
164
164
  const hasReferenceBlock = ebml.value.find((c) => c.type === 'ReferenceBlock');
165
165
  const sample = block.value.length === 0
166
166
  ? null
167
- : (0, get_sample_from_block_1.getSampleFromBlock)(block, parserContext, offset);
167
+ : (0, get_sample_from_block_1.getSampleFromBlock)(block, state, offset);
168
168
  if (sample && sample.type === 'partial-video-sample') {
169
169
  const completeFrame = {
170
170
  ...sample.partialVideoSample,
171
171
  type: hasReferenceBlock ? 'delta' : 'key',
172
172
  };
173
- await parserContext.parserState.onVideoSample(sample.partialVideoSample.trackId, completeFrame);
173
+ await state.callbacks.onVideoSample(sample.partialVideoSample.trackId, completeFrame);
174
174
  }
175
- if (parserContext.nullifySamples) {
175
+ if (state.nullifySamples) {
176
176
  return {
177
177
  type: 'BlockGroup',
178
178
  value: [],
@@ -1,9 +1,9 @@
1
1
  import type { BufferIterator } from '../../buffer-iterator';
2
2
  import type { Options, ParseMediaFields } from '../../options';
3
- import type { MatroskaStructure, ParseResult } from '../../parse-result';
4
- import type { ParserContext } from '../../parser-context';
5
- export declare const parseWebm: ({ counter, parserContext, fields, }: {
3
+ import type { ParseResult } from '../../parse-result';
4
+ import type { ParserState } from '../../state/parser-state';
5
+ export declare const parseWebm: ({ counter, state, fields, }: {
6
6
  counter: BufferIterator;
7
- parserContext: ParserContext;
7
+ state: ParserState;
8
8
  fields: Options<ParseMediaFields>;
9
- }) => Promise<ParseResult<MatroskaStructure>>;
9
+ }) => Promise<ParseResult>;
@@ -6,12 +6,10 @@ const continueAfterMatroskaResult = (result, structure) => {
6
6
  if (result.status === 'done') {
7
7
  return {
8
8
  status: 'done',
9
- segments: structure,
10
9
  };
11
10
  }
12
11
  return {
13
12
  status: 'incomplete',
14
- segments: structure,
15
13
  continueParsing: async () => {
16
14
  const newResult = await result.continueParsing();
17
15
  return continueAfterMatroskaResult(newResult, structure);
@@ -20,13 +18,16 @@ const continueAfterMatroskaResult = (result, structure) => {
20
18
  };
21
19
  };
22
20
  // Parsing according to https://darkcoding.net/software/reading-mediarecorders-webm-opus-output/
23
- const parseWebm = async ({ counter, parserContext, fields, }) => {
24
- const structure = { type: 'matroska', boxes: [] };
21
+ const parseWebm = async ({ counter, state, fields, }) => {
22
+ const structure = state.structure.getStructure();
23
+ if (structure.type !== 'matroska') {
24
+ throw new Error('Invalid structure type');
25
+ }
25
26
  const results = await (0, parse_children_1.expectChildren)({
26
27
  iterator: counter,
27
28
  length: Infinity,
28
29
  children: structure.boxes,
29
- parserContext,
30
+ state,
30
31
  startOffset: counter.counter.getOffset(),
31
32
  fields,
32
33
  topLevelStructure: structure,
@@ -1,22 +1,22 @@
1
1
  import type { BufferIterator } from '../../../buffer-iterator';
2
2
  import type { Options, ParseMediaFields } from '../../../options';
3
3
  import type { ExpectSegmentParseResult, MatroskaParseResult, MatroskaStructure } from '../../../parse-result';
4
- import type { ParserContext } from '../../../parser-context';
4
+ import type { ParserState } from '../../../state/parser-state';
5
5
  import type { MatroskaSegment } from '../segments';
6
6
  import type { PossibleEbml } from './all-segments';
7
- export declare const expectAndProcessSegment: ({ iterator, parserContext, offset, children, fields, topLevelStructure, }: {
7
+ export declare const expectAndProcessSegment: ({ iterator, state, offset, children, fields, topLevelStructure, }: {
8
8
  iterator: BufferIterator;
9
- parserContext: ParserContext;
9
+ state: ParserState;
10
10
  offset: number;
11
11
  children: PossibleEbml[];
12
12
  fields: Options<ParseMediaFields>;
13
13
  topLevelStructure: MatroskaStructure;
14
14
  }) => Promise<ExpectSegmentParseResult>;
15
- export declare const expectChildren: ({ iterator, length, children, parserContext, startOffset, fields, topLevelStructure, }: {
15
+ export declare const expectChildren: ({ iterator, length, children, state, startOffset, fields, topLevelStructure, }: {
16
16
  iterator: BufferIterator;
17
17
  length: number;
18
18
  children: MatroskaSegment[];
19
- parserContext: ParserContext;
19
+ state: ParserState;
20
20
  startOffset: number;
21
21
  fields: Options<ParseMediaFields>;
22
22
  topLevelStructure: MatroskaStructure;
@@ -6,14 +6,14 @@ const segments_1 = require("../segments");
6
6
  const processParseResult = ({ parseResult, children, state, fields, topLevelStructure, }) => {
7
7
  if (parseResult.segment && !children.includes(parseResult.segment)) {
8
8
  children.push(parseResult.segment);
9
- if ((0, has_all_info_1.hasAllInfo)({ fields, state, structure: topLevelStructure })) {
9
+ if ((0, has_all_info_1.hasAllInfo)({ fields, state })) {
10
10
  return {
11
11
  status: 'done',
12
12
  segment: parseResult.segment,
13
13
  };
14
14
  }
15
15
  if (parseResult.segment.type === 'Tracks') {
16
- state.tracks.setIsDone();
16
+ state.callbacks.tracks.setIsDone();
17
17
  }
18
18
  }
19
19
  if (parseResult.status === 'incomplete') {
@@ -38,10 +38,10 @@ const processParseResult = ({ parseResult, children, state, fields, topLevelStru
38
38
  segment: parseResult.segment,
39
39
  };
40
40
  };
41
- const expectAndProcessSegment = async ({ iterator, parserContext, offset, children, fields, topLevelStructure, }) => {
41
+ const expectAndProcessSegment = async ({ iterator, state, offset, children, fields, topLevelStructure, }) => {
42
42
  const segment = await (0, segments_1.expectSegment)({
43
43
  iterator,
44
- parserContext,
44
+ state,
45
45
  offset,
46
46
  children,
47
47
  fields,
@@ -50,13 +50,13 @@ const expectAndProcessSegment = async ({ iterator, parserContext, offset, childr
50
50
  return processParseResult({
51
51
  children,
52
52
  parseResult: segment,
53
- state: parserContext.parserState,
53
+ state,
54
54
  fields,
55
55
  topLevelStructure,
56
56
  });
57
57
  };
58
58
  exports.expectAndProcessSegment = expectAndProcessSegment;
59
- const continueAfterSegmentResult = async ({ result, length, children, parserContext, iterator, startOffset, fields, topLevelStructure, }) => {
59
+ const continueAfterSegmentResult = async ({ result, length, children, state, iterator, startOffset, fields, topLevelStructure, }) => {
60
60
  if (result.status === 'done') {
61
61
  throw new Error('Should not continue after done');
62
62
  }
@@ -70,7 +70,7 @@ const continueAfterSegmentResult = async ({ result, length, children, parserCont
70
70
  children,
71
71
  iterator,
72
72
  length,
73
- parserContext,
73
+ state,
74
74
  startOffset,
75
75
  fields,
76
76
  topLevelStructure,
@@ -87,7 +87,7 @@ const continueAfterSegmentResult = async ({ result, length, children, parserCont
87
87
  children,
88
88
  iterator,
89
89
  length,
90
- parserContext,
90
+ state,
91
91
  startOffset,
92
92
  fields,
93
93
  topLevelStructure,
@@ -96,7 +96,7 @@ const continueAfterSegmentResult = async ({ result, length, children, parserCont
96
96
  skipTo: null,
97
97
  };
98
98
  };
99
- const expectChildren = async ({ iterator, length, children, parserContext, startOffset, fields, topLevelStructure, }) => {
99
+ const expectChildren = async ({ iterator, length, children, state, startOffset, fields, topLevelStructure, }) => {
100
100
  while (iterator.counter.getOffset() < startOffset + length) {
101
101
  if (iterator.bytesRemaining() === 0) {
102
102
  break;
@@ -104,7 +104,7 @@ const expectChildren = async ({ iterator, length, children, parserContext, start
104
104
  const currentOffset = iterator.counter.getOffset();
105
105
  const child = await (0, exports.expectAndProcessSegment)({
106
106
  iterator,
107
- parserContext,
107
+ state,
108
108
  offset: currentOffset,
109
109
  children,
110
110
  fields,
@@ -112,8 +112,7 @@ const expectChildren = async ({ iterator, length, children, parserContext, start
112
112
  });
113
113
  if ((0, has_all_info_1.hasAllInfo)({
114
114
  fields,
115
- state: parserContext.parserState,
116
- structure: topLevelStructure,
115
+ state,
117
116
  })) {
118
117
  return {
119
118
  status: 'done',
@@ -128,7 +127,7 @@ const expectChildren = async ({ iterator, length, children, parserContext, start
128
127
  children,
129
128
  iterator,
130
129
  length: length - (currentOffset - startOffset),
131
- parserContext,
130
+ state,
132
131
  startOffset: currentOffset,
133
132
  fields,
134
133
  topLevelStructure,
@@ -1,13 +1,13 @@
1
1
  import type { BufferIterator } from '../../buffer-iterator';
2
2
  import type { Options, ParseMediaFields } from '../../options';
3
3
  import type { ExpectSegmentParseResult, MatroskaStructure } from '../../parse-result';
4
- import type { ParserContext } from '../../parser-context';
4
+ import type { ParserState } from '../../state/parser-state';
5
5
  import { type PossibleEbml, type TrackEntry } from './segments/all-segments';
6
6
  export type MatroskaSegment = PossibleEbml;
7
7
  export type OnTrackEntrySegment = (trackEntry: TrackEntry) => void;
8
- export declare const expectSegment: ({ iterator, parserContext, offset, children, fields, topLevelStructure, }: {
8
+ export declare const expectSegment: ({ iterator, state, offset, children, fields, topLevelStructure, }: {
9
9
  iterator: BufferIterator;
10
- parserContext: ParserContext;
10
+ state: ParserState;
11
11
  offset: number;
12
12
  children: PossibleEbml[];
13
13
  fields: Options<ParseMediaFields>;
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.expectSegment = void 0;
4
4
  const parse_ebml_1 = require("./parse-ebml");
5
5
  const parse_children_1 = require("./segments/parse-children");
6
- const continueAfterMatroskaParseResult = async ({ result, iterator, parserContext, segment, }) => {
6
+ const continueAfterMatroskaParseResult = async ({ result, iterator, state, segment, }) => {
7
7
  if (result.status === 'done') {
8
8
  throw new Error('Should not continue after done');
9
9
  }
@@ -19,7 +19,7 @@ const continueAfterMatroskaParseResult = async ({ result, iterator, parserContex
19
19
  return continueAfterMatroskaParseResult({
20
20
  result: proceeded,
21
21
  iterator,
22
- parserContext,
22
+ state,
23
23
  segment,
24
24
  });
25
25
  },
@@ -27,7 +27,7 @@ const continueAfterMatroskaParseResult = async ({ result, iterator, parserContex
27
27
  status: 'incomplete',
28
28
  };
29
29
  };
30
- const expectSegment = async ({ iterator, parserContext, offset, children, fields, topLevelStructure, }) => {
30
+ const expectSegment = async ({ iterator, state, offset, children, fields, topLevelStructure, }) => {
31
31
  iterator.counter.decrement(iterator.counter.getOffset() - offset);
32
32
  if (iterator.bytesRemaining() === 0) {
33
33
  return {
@@ -35,7 +35,7 @@ const expectSegment = async ({ iterator, parserContext, offset, children, fields
35
35
  continueParsing: () => {
36
36
  return (0, parse_children_1.expectAndProcessSegment)({
37
37
  iterator,
38
- parserContext,
38
+ state,
39
39
  offset,
40
40
  children,
41
41
  fields,
@@ -53,7 +53,7 @@ const expectSegment = async ({ iterator, parserContext, offset, children, fields
53
53
  continueParsing: () => {
54
54
  return (0, parse_children_1.expectAndProcessSegment)({
55
55
  iterator,
56
- parserContext,
56
+ state,
57
57
  offset,
58
58
  children,
59
59
  fields,
@@ -73,7 +73,7 @@ const expectSegment = async ({ iterator, parserContext, offset, children, fields
73
73
  continueParsing: () => {
74
74
  return (0, exports.expectSegment)({
75
75
  iterator,
76
- parserContext,
76
+ state,
77
77
  offset,
78
78
  children,
79
79
  fields,
@@ -94,7 +94,7 @@ const expectSegment = async ({ iterator, parserContext, offset, children, fields
94
94
  iterator,
95
95
  length,
96
96
  children: newSegment.value,
97
- parserContext,
97
+ state,
98
98
  startOffset: iterator.counter.getOffset(),
99
99
  fields,
100
100
  topLevelStructure,
@@ -105,7 +105,7 @@ const expectSegment = async ({ iterator, parserContext, offset, children, fields
105
105
  continueParsing: () => {
106
106
  return continueAfterMatroskaParseResult({
107
107
  iterator,
108
- parserContext,
108
+ state,
109
109
  result: main,
110
110
  segment: newSegment,
111
111
  });
@@ -127,7 +127,7 @@ const expectSegment = async ({ iterator, parserContext, offset, children, fields
127
127
  continueParsing: () => {
128
128
  return (0, exports.expectSegment)({
129
129
  iterator,
130
- parserContext,
130
+ state,
131
131
  offset,
132
132
  children,
133
133
  fields,
@@ -140,7 +140,7 @@ const expectSegment = async ({ iterator, parserContext, offset, children, fields
140
140
  segmentId,
141
141
  iterator,
142
142
  length,
143
- parserContext,
143
+ state,
144
144
  headerReadSoFar: iterator.counter.getOffset() - offset,
145
145
  });
146
146
  return {
@@ -149,13 +149,13 @@ const expectSegment = async ({ iterator, parserContext, offset, children, fields
149
149
  };
150
150
  };
151
151
  exports.expectSegment = expectSegment;
152
- const parseSegment = async ({ segmentId, iterator, length, parserContext, headerReadSoFar, }) => {
152
+ const parseSegment = async ({ segmentId, iterator, length, state, headerReadSoFar, }) => {
153
153
  if (length < 0) {
154
154
  throw new Error(`Expected length of ${segmentId} to be greater or equal 0`);
155
155
  }
156
156
  iterator.counter.decrement(headerReadSoFar);
157
157
  const offset = iterator.counter.getOffset();
158
- const ebml = await (0, parse_ebml_1.parseEbml)(iterator, parserContext);
159
- const remapped = await (0, parse_ebml_1.postprocessEbml)({ offset, ebml, parserContext });
158
+ const ebml = await (0, parse_ebml_1.parseEbml)(iterator, state);
159
+ const remapped = await (0, parse_ebml_1.postprocessEbml)({ offset, ebml, state });
160
160
  return remapped;
161
161
  };
@@ -20,16 +20,14 @@ export declare const getArrayBufferIterator: (initialData: Uint8Array, maxBytes:
20
20
  getBits: (bits: number) => number;
21
21
  byteLength: () => number;
22
22
  bytesRemaining: () => number;
23
- isIsoBaseMedia: () => boolean;
24
23
  leb128: () => number;
25
24
  removeBytesRead: () => void;
26
- isWebm: () => boolean;
27
25
  discard: (length: number) => void;
28
26
  getEightByteNumber: (littleEndian?: boolean) => number;
29
27
  getFourByteNumber: () => number;
30
- getSlice: (amount: number) => Uint8Array;
28
+ getSlice: (amount: number) => Uint8Array<ArrayBuffer>;
31
29
  getAtom: () => string;
32
- isRiff: () => boolean;
30
+ detectFileType: () => import("./file-types/detect-file-type").FileType;
33
31
  getPaddedFourByteNumber: () => number;
34
32
  getMatroskaSegmentId: () => string | null;
35
33
  getVint: () => number | null;
@@ -57,14 +55,12 @@ export declare const getArrayBufferIterator: (initialData: Uint8Array, maxBytes:
57
55
  getInt32Le: () => number;
58
56
  getInt32: () => number;
59
57
  destroy: () => void;
60
- isMp3: () => boolean;
61
58
  disallowDiscard: () => void;
62
59
  allowDiscard: () => void;
63
60
  startBox: (size: number) => {
64
61
  discardRest: () => void;
65
62
  expectNoMoreBytes: () => void;
66
63
  };
67
- isTransportStream: () => boolean;
68
64
  readExpGolomb: () => number;
69
65
  };
70
66
  export type BufferIterator = ReturnType<typeof getArrayBufferIterator>;
@@ -14,8 +14,8 @@ var _OffsetCounter_offset, _OffsetCounter_discardedBytes;
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.getArrayBufferIterator = exports.OffsetCounter = void 0;
16
16
  /* eslint-disable @typescript-eslint/no-use-before-define */
17
- const make_header_1 = require("./boxes/webm/make-header");
18
17
  const all_segments_1 = require("./boxes/webm/segments/all-segments");
18
+ const file_types_1 = require("./file-types");
19
19
  class OffsetCounter {
20
20
  constructor(initial) {
21
21
  _OffsetCounter_offset.set(this, void 0);
@@ -53,14 +53,6 @@ class OffsetCounter {
53
53
  }
54
54
  exports.OffsetCounter = OffsetCounter;
55
55
  _OffsetCounter_offset = new WeakMap(), _OffsetCounter_discardedBytes = new WeakMap();
56
- const isoBaseMediaMp4Pattern = new TextEncoder().encode('ftyp');
57
- const mpegPattern = new Uint8Array([0xff, 0xf3, 0xe4, 0x64]);
58
- const riffPattern = new Uint8Array([0x52, 0x49, 0x46, 0x46]);
59
- const matchesPattern = (pattern) => {
60
- return (data) => {
61
- return pattern.every((value, index) => data[index] === value);
62
- };
63
- };
64
56
  const makeOffsetCounter = () => {
65
57
  return new OffsetCounter(0);
66
58
  };
@@ -211,21 +203,6 @@ const getArrayBufferIterator = (initialData, maxBytes) => {
211
203
  const bytesRemaining = () => {
212
204
  return data.byteLength - counter.getDiscardedOffset();
213
205
  };
214
- const isIsoBaseMedia = () => {
215
- return matchesPattern(isoBaseMediaMp4Pattern)(data.subarray(4, 8));
216
- };
217
- const isRiff = () => {
218
- return matchesPattern(riffPattern)(data.subarray(0, 4));
219
- };
220
- const isWebm = () => {
221
- return matchesPattern(make_header_1.webmPattern)(data.subarray(0, 4));
222
- };
223
- const isMp3 = () => {
224
- return matchesPattern(mpegPattern)(data.subarray(0, 4));
225
- };
226
- const isTransportStream = () => {
227
- return data[0] === 0x47;
228
- };
229
206
  const removeBytesRead = () => {
230
207
  if (!discardAllowed) {
231
208
  return;
@@ -348,10 +325,8 @@ const getArrayBufferIterator = (initialData, maxBytes) => {
348
325
  getBits,
349
326
  byteLength,
350
327
  bytesRemaining,
351
- isIsoBaseMedia,
352
328
  leb128,
353
329
  removeBytesRead,
354
- isWebm,
355
330
  discard,
356
331
  getEightByteNumber,
357
332
  getFourByteNumber,
@@ -360,7 +335,9 @@ const getArrayBufferIterator = (initialData, maxBytes) => {
360
335
  const atom = getSlice(4);
361
336
  return new TextDecoder().decode(atom);
362
337
  },
363
- isRiff,
338
+ detectFileType: () => {
339
+ return (0, file_types_1.detectFileType)(data);
340
+ },
364
341
  getPaddedFourByteNumber,
365
342
  getMatroskaSegmentId: () => {
366
343
  if (bytesRemaining() === 0) {
@@ -533,11 +510,9 @@ const getArrayBufferIterator = (initialData, maxBytes) => {
533
510
  getInt32Le,
534
511
  getInt32,
535
512
  destroy,
536
- isMp3,
537
513
  disallowDiscard,
538
514
  allowDiscard,
539
515
  startBox,
540
- isTransportStream,
541
516
  readExpGolomb,
542
517
  };
543
518
  };
@@ -12,6 +12,8 @@ const convertAudioOrVideoSampleToWebCodecsTimestamps = (sample, timescale) => {
12
12
  data: sample.data,
13
13
  trackId: sample.trackId,
14
14
  type: sample.type,
15
+ offset: sample.offset,
16
+ timescale: 1000000,
15
17
  };
16
18
  };
17
19
  exports.convertAudioOrVideoSampleToWebCodecsTimestamps = convertAudioOrVideoSampleToWebCodecsTimestamps;
@@ -1,2 +1,2 @@
1
1
  import type { Avc1Data } from './create-codec-specific-data';
2
- export declare const createAvc1Data: ({ avccBox, pasp, width, height, horizontalResolution, verticalResolution, compressorName, depth, }: Avc1Data) => Uint8Array;
2
+ export declare const createAvc1Data: ({ avccBox, pasp, width, height, horizontalResolution, verticalResolution, compressorName, depth, }: Avc1Data) => Uint8Array<ArrayBufferLike>;
@@ -19,4 +19,4 @@ export type Mp4aData = {
19
19
  codecPrivate: Uint8Array | null;
20
20
  };
21
21
  export type CodecSpecificData = Avc1Data | Mp4aData;
22
- export declare const createCodecSpecificData: (track: MakeTrackAudio | MakeTrackVideo) => Uint8Array;
22
+ export declare const createCodecSpecificData: (track: MakeTrackAudio | MakeTrackVideo) => Uint8Array<ArrayBufferLike>;
@@ -1,2 +1,2 @@
1
1
  import type { Mp4aData } from './create-codec-specific-data';
2
- export declare const createMp4a: ({ sampleRate, channelCount, avgBitrate, maxBitrate, codecPrivate, }: Mp4aData) => Uint8Array;
2
+ export declare const createMp4a: ({ sampleRate, channelCount, avgBitrate, maxBitrate, codecPrivate, }: Mp4aData) => Uint8Array<ArrayBufferLike>;
@@ -3,4 +3,4 @@ export declare const createColr: ({ fullRange, matrixIndex, primaries, transferF
3
3
  matrixIndex: number;
4
4
  primaries: number;
5
5
  transferFunction: number;
6
- }) => Uint8Array;
6
+ }) => Uint8Array<ArrayBufferLike>;
@@ -2,9 +2,9 @@ export declare const createFtyp: ({ majorBrand, minorBrand, compatibleBrands, }:
2
2
  majorBrand: string;
3
3
  minorBrand: number;
4
4
  compatibleBrands: string[];
5
- }) => Uint8Array;
5
+ }) => Uint8Array<ArrayBufferLike>;
6
6
  export declare const createIsoBaseMediaFtyp: ({ majorBrand, minorBrand, compatibleBrands, }: {
7
7
  majorBrand: string;
8
8
  minorBrand: number;
9
9
  compatibleBrands: string[];
10
- }) => Uint8Array;
10
+ }) => Uint8Array<ArrayBufferLike>;
@@ -1 +1 @@
1
- export declare const createIlst: (items: Uint8Array[]) => Uint8Array;
1
+ export declare const createIlst: (items: Uint8Array[]) => Uint8Array<ArrayBufferLike>;
@@ -2,4 +2,4 @@ export declare const createMdia: ({ mdhd, hdlr, minf, }: {
2
2
  mdhd: Uint8Array;
3
3
  hdlr: Uint8Array;
4
4
  minf: Uint8Array;
5
- }) => Uint8Array;
5
+ }) => Uint8Array<ArrayBufferLike>;
@@ -2,4 +2,4 @@ export declare const createMoov: ({ mvhd, traks, udta, }: {
2
2
  mvhd: Uint8Array;
3
3
  traks: Uint8Array[];
4
4
  udta: Uint8Array;
5
- }) => Uint8Array;
5
+ }) => Uint8Array<ArrayBufferLike>;