@remotion/media-parser 4.0.249 → 4.0.250

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 (121) hide show
  1. package/dist/boxes/iso-base-media/continue-mdat-routine.d.ts +14 -0
  2. package/dist/boxes/iso-base-media/continue-mdat-routine.js +74 -0
  3. package/dist/boxes/iso-base-media/get-children.d.ts +2 -8
  4. package/dist/boxes/iso-base-media/get-children.js +14 -30
  5. package/dist/boxes/iso-base-media/mdat/mdat.d.ts +3 -23
  6. package/dist/boxes/iso-base-media/mdat/mdat.js +80 -130
  7. package/dist/boxes/iso-base-media/moov/moov.d.ts +1 -6
  8. package/dist/boxes/iso-base-media/moov/moov.js +5 -14
  9. package/dist/boxes/iso-base-media/parse-all-children.d.ts +8 -0
  10. package/dist/boxes/iso-base-media/parse-all-children.js +20 -0
  11. package/dist/boxes/iso-base-media/parse-boxes.d.ts +2 -10
  12. package/dist/boxes/iso-base-media/parse-boxes.js +33 -116
  13. package/dist/boxes/iso-base-media/parse-mdat-partially.d.ts +1 -4
  14. package/dist/boxes/iso-base-media/parse-mdat-partially.js +2 -11
  15. package/dist/boxes/iso-base-media/process-box.d.ts +1 -9
  16. package/dist/boxes/iso-base-media/process-box.js +49 -143
  17. package/dist/boxes/iso-base-media/stsd/mebx.d.ts +1 -4
  18. package/dist/boxes/iso-base-media/stsd/mebx.js +5 -14
  19. package/dist/boxes/iso-base-media/stsd/samples.d.ts +4 -12
  20. package/dist/boxes/iso-base-media/stsd/samples.js +24 -66
  21. package/dist/boxes/iso-base-media/stsd/stsd.d.ts +1 -4
  22. package/dist/boxes/iso-base-media/stsd/stsd.js +2 -5
  23. package/dist/boxes/iso-base-media/trak/trak.d.ts +1 -6
  24. package/dist/boxes/iso-base-media/trak/trak.js +5 -14
  25. package/dist/boxes/iso-base-media/traversal.d.ts +0 -2
  26. package/dist/boxes/iso-base-media/traversal.js +1 -12
  27. package/dist/boxes/mp3/id3.d.ts +1 -3
  28. package/dist/boxes/mp3/id3.js +7 -5
  29. package/dist/boxes/mp3/parse-mp3.d.ts +2 -3
  30. package/dist/boxes/mp3/parse-mp3.js +3 -19
  31. package/dist/boxes/riff/expect-riff-box.d.ts +1 -9
  32. package/dist/boxes/riff/expect-riff-box.js +47 -25
  33. package/dist/boxes/riff/get-tracks-from-avi.d.ts +1 -1
  34. package/dist/boxes/riff/get-tracks-from-avi.js +6 -10
  35. package/dist/boxes/riff/parse-fmt-box.d.ts +3 -2
  36. package/dist/boxes/riff/parse-fmt-box.js +7 -5
  37. package/dist/boxes/riff/parse-list-box.d.ts +1 -3
  38. package/dist/boxes/riff/parse-list-box.js +16 -16
  39. package/dist/boxes/riff/parse-movi.d.ts +2 -5
  40. package/dist/boxes/riff/parse-movi.js +34 -56
  41. package/dist/boxes/riff/parse-riff-body.d.ts +2 -6
  42. package/dist/boxes/riff/parse-riff-body.js +15 -95
  43. package/dist/boxes/riff/parse-riff-box.d.ts +1 -4
  44. package/dist/boxes/riff/parse-riff-box.js +3 -7
  45. package/dist/boxes/riff/parse-riff-header.d.ts +7 -0
  46. package/dist/boxes/riff/parse-riff-header.js +23 -0
  47. package/dist/boxes/riff/parse-riff.d.ts +7 -0
  48. package/dist/boxes/riff/parse-riff.js +15 -0
  49. package/dist/boxes/riff/parse-strf.d.ts +4 -4
  50. package/dist/boxes/riff/parse-strf.js +4 -8
  51. package/dist/boxes/riff/parse-strh.js +11 -0
  52. package/dist/boxes/riff/parse-video-section.d.ts +6 -0
  53. package/dist/boxes/riff/parse-video-section.js +20 -0
  54. package/dist/boxes/riff/riff-box.d.ts +4 -5
  55. package/dist/boxes/riff/traversal.d.ts +1 -2
  56. package/dist/boxes/riff/traversal.js +1 -6
  57. package/dist/boxes/transport-stream/get-tracks.d.ts +2 -3
  58. package/dist/boxes/transport-stream/get-tracks.js +4 -3
  59. package/dist/boxes/transport-stream/parse-packet.d.ts +1 -7
  60. package/dist/boxes/transport-stream/parse-packet.js +3 -4
  61. package/dist/boxes/transport-stream/parse-stream-packet.d.ts +1 -5
  62. package/dist/boxes/transport-stream/parse-stream-packet.js +10 -12
  63. package/dist/boxes/transport-stream/parse-transport-stream.d.ts +1 -7
  64. package/dist/boxes/transport-stream/parse-transport-stream.js +7 -26
  65. package/dist/boxes/transport-stream/process-stream-buffers.d.ts +1 -2
  66. package/dist/boxes/transport-stream/process-stream-buffers.js +3 -3
  67. package/dist/boxes/webm/parse-ebml.js +3 -0
  68. package/dist/boxes/webm/parse-webm-header.d.ts +2 -4
  69. package/dist/boxes/webm/parse-webm-header.js +41 -25
  70. package/dist/boxes/webm/segments/parse-children.d.ts +2 -16
  71. package/dist/boxes/webm/segments/parse-children.js +7 -130
  72. package/dist/boxes/webm/segments.d.ts +4 -8
  73. package/dist/boxes/webm/segments.js +41 -123
  74. package/dist/buffer-iterator.d.ts +0 -3
  75. package/dist/buffer-iterator.js +6 -16
  76. package/dist/bun-reader.d.ts +1 -0
  77. package/dist/bun-reader.js +17 -0
  78. package/dist/emit-available-info.js +4 -4
  79. package/dist/esm/from-node.mjs +8 -9
  80. package/dist/esm/index.mjs +4224 -4950
  81. package/dist/file-types/detect-file-type.js +4 -2
  82. package/dist/get-audio-codec.d.ts +1 -1
  83. package/dist/get-audio-codec.js +2 -2
  84. package/dist/get-dimensions.js +1 -1
  85. package/dist/get-duration.js +1 -1
  86. package/dist/get-is-hdr.d.ts +1 -1
  87. package/dist/get-is-hdr.js +2 -2
  88. package/dist/get-tracks.d.ts +1 -1
  89. package/dist/get-tracks.js +14 -13
  90. package/dist/get-video-codec.d.ts +1 -1
  91. package/dist/get-video-codec.js +2 -2
  92. package/dist/index.d.ts +50 -24
  93. package/dist/index.js +1 -1
  94. package/dist/may-skip-video-data/may-skip-video-data.js +6 -2
  95. package/dist/parse-media.js +45 -30
  96. package/dist/parse-result.d.ts +1 -18
  97. package/dist/parse-video.d.ts +3 -17
  98. package/dist/parse-video.js +45 -32
  99. package/dist/readers/from-node.js +7 -8
  100. package/dist/state/can-skip-tracks.d.ts +8 -1
  101. package/dist/state/can-skip-tracks.js +38 -27
  102. package/dist/state/iso-base-media/cached-sample-positions.d.ts +15 -0
  103. package/dist/state/iso-base-media/cached-sample-positions.js +42 -0
  104. package/dist/state/iso-base-media/iso-state.d.ts +8 -0
  105. package/dist/state/iso-base-media/iso-state.js +15 -0
  106. package/dist/state/iso-state.d.ts +4 -0
  107. package/dist/state/iso-state.js +13 -0
  108. package/dist/state/parser-state.d.ts +49 -14
  109. package/dist/state/parser-state.js +11 -3
  110. package/dist/state/sample-callbacks.d.ts +5 -1
  111. package/dist/state/sample-callbacks.js +4 -1
  112. package/dist/state/transport-stream.d.ts +8 -0
  113. package/dist/state/transport-stream.js +11 -0
  114. package/dist/state/video-section.d.ts +16 -0
  115. package/dist/state/video-section.js +37 -0
  116. package/dist/state/webm.d.ts +15 -0
  117. package/dist/state/webm.js +32 -0
  118. package/dist/version.d.ts +1 -1
  119. package/dist/version.js +1 -1
  120. package/package.json +3 -3
  121. package/test.json +663 -0
@@ -1,152 +1,70 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.expectSegment = void 0;
4
+ const log_1 = require("../../log");
4
5
  const parse_ebml_1 = require("./parse-ebml");
5
- const parse_children_1 = require("./segments/parse-children");
6
- const continueAfterMatroskaParseResult = async ({ result, iterator, state, segment, }) => {
7
- if (result.status === 'done') {
8
- throw new Error('Should not continue after done');
9
- }
10
- const proceeded = await result.continueParsing();
11
- if (proceeded.status === 'done') {
12
- return {
13
- status: 'done',
14
- segment,
15
- };
16
- }
17
- return {
18
- continueParsing() {
19
- return continueAfterMatroskaParseResult({
20
- result: proceeded,
21
- iterator,
22
- state,
23
- segment,
24
- });
25
- },
26
- segment: null,
27
- status: 'incomplete',
28
- };
29
- };
30
- const expectSegment = async ({ iterator, state, offset, children, fields, topLevelStructure, }) => {
31
- iterator.counter.decrement(iterator.counter.getOffset() - offset);
6
+ const all_segments_1 = require("./segments/all-segments");
7
+ const expectSegment = async ({ iterator, state, isInsideSegment, }) => {
8
+ var _a;
32
9
  if (iterator.bytesRemaining() === 0) {
33
- return {
34
- status: 'incomplete',
35
- continueParsing: () => {
36
- return (0, parse_children_1.expectAndProcessSegment)({
37
- iterator,
38
- state,
39
- offset,
40
- children,
41
- fields,
42
- topLevelStructure,
43
- });
44
- },
45
- segment: null,
46
- };
10
+ throw new Error('has no bytes');
47
11
  }
12
+ const offset = iterator.counter.getOffset();
13
+ const { returnToCheckpoint } = iterator.startCheckpoint();
48
14
  const segmentId = iterator.getMatroskaSegmentId();
49
15
  if (segmentId === null) {
50
- iterator.counter.decrement(iterator.counter.getOffset() - offset);
51
- return {
52
- status: 'incomplete',
53
- continueParsing: () => {
54
- return (0, parse_children_1.expectAndProcessSegment)({
55
- iterator,
56
- state,
57
- offset,
58
- children,
59
- fields,
60
- topLevelStructure,
61
- });
62
- },
63
- segment: null,
64
- };
16
+ returnToCheckpoint();
17
+ return null;
65
18
  }
66
19
  const offsetBeforeVInt = iterator.counter.getOffset();
67
- const length = iterator.getVint();
20
+ const size = iterator.getVint();
68
21
  const offsetAfterVInt = iterator.counter.getOffset();
69
- if (length === null) {
70
- iterator.counter.decrement(iterator.counter.getOffset() - offset);
71
- return {
72
- status: 'incomplete',
73
- continueParsing: () => {
74
- return (0, exports.expectSegment)({
75
- iterator,
76
- state,
77
- offset,
78
- children,
79
- fields,
80
- topLevelStructure,
81
- });
82
- },
83
- segment: null,
84
- };
22
+ if (size === null) {
23
+ returnToCheckpoint();
24
+ return null;
85
25
  }
86
- const bytesRemainingNow = iterator.byteLength() - iterator.counter.getOffset();
87
- if (segmentId === '0x18538067' || segmentId === '0x1f43b675') {
26
+ const bytesRemainingNow = iterator.bytesRemaining();
27
+ log_1.Log.trace(state.logLevel, 'Segment ID:', (_a = all_segments_1.ebmlMap[segmentId]) === null || _a === void 0 ? void 0 : _a.name, 'Size:' + size, bytesRemainingNow);
28
+ if (segmentId === all_segments_1.matroskaElements.Segment) {
29
+ state.webm.addSegment({
30
+ start: offset,
31
+ size,
32
+ });
88
33
  const newSegment = {
89
- type: segmentId === '0x18538067' ? 'Segment' : 'Cluster',
34
+ type: 'Segment',
90
35
  minVintWidth: offsetAfterVInt - offsetBeforeVInt,
91
36
  value: [],
92
37
  };
93
- const main = await (0, parse_children_1.expectChildren)({
94
- iterator,
95
- length,
96
- children: newSegment.value,
97
- state,
98
- startOffset: iterator.counter.getOffset(),
99
- fields,
100
- topLevelStructure,
101
- });
102
- if (main.status === 'incomplete') {
103
- return {
104
- status: 'incomplete',
105
- continueParsing: () => {
106
- return continueAfterMatroskaParseResult({
107
- iterator,
108
- state,
109
- result: main,
110
- segment: newSegment,
111
- });
112
- },
113
- segment: newSegment,
114
- };
38
+ return newSegment;
39
+ }
40
+ if (segmentId === all_segments_1.matroskaElements.Cluster) {
41
+ if (isInsideSegment === null) {
42
+ throw new Error('Expected to be inside segment');
115
43
  }
116
- return {
117
- status: 'done',
118
- segment: newSegment,
44
+ state.webm.addCluster({
45
+ start: offset,
46
+ size,
47
+ segment: isInsideSegment.index,
48
+ });
49
+ const newSegment = {
50
+ type: 'Cluster',
51
+ minVintWidth: offsetAfterVInt - offsetBeforeVInt,
52
+ value: [],
119
53
  };
54
+ return newSegment;
120
55
  }
121
- if (bytesRemainingNow < length) {
122
- const bytesRead = iterator.counter.getOffset() - offset;
123
- iterator.counter.decrement(bytesRead);
124
- return {
125
- status: 'incomplete',
126
- segment: null,
127
- continueParsing: () => {
128
- return (0, exports.expectSegment)({
129
- iterator,
130
- state,
131
- offset,
132
- children,
133
- fields,
134
- topLevelStructure,
135
- });
136
- },
137
- };
56
+ if (bytesRemainingNow < size) {
57
+ returnToCheckpoint();
58
+ return null;
138
59
  }
139
60
  const segment = await parseSegment({
140
61
  segmentId,
141
62
  iterator,
142
- length,
63
+ length: size,
143
64
  state,
144
65
  headerReadSoFar: iterator.counter.getOffset() - offset,
145
66
  });
146
- return {
147
- status: 'done',
148
- segment,
149
- };
67
+ return segment;
150
68
  };
151
69
  exports.expectSegment = expectSegment;
152
70
  const parseSegment = async ({ segmentId, iterator, length, state, headerReadSoFar, }) => {
@@ -18,7 +18,6 @@ export declare const getArrayBufferIterator: (initialData: Uint8Array, maxBytes:
18
18
  peekB: (length: number) => void;
19
19
  peekD: (length: number) => void;
20
20
  getBits: (bits: number) => number;
21
- byteLength: () => number;
22
21
  bytesRemaining: () => number;
23
22
  leb128: () => number;
24
23
  removeBytesRead: () => void;
@@ -58,8 +57,6 @@ export declare const getArrayBufferIterator: (initialData: Uint8Array, maxBytes:
58
57
  getInt32Le: () => number;
59
58
  getInt32: () => number;
60
59
  destroy: () => void;
61
- disallowDiscard: () => void;
62
- allowDiscard: () => void;
63
60
  startBox: (size: number) => {
64
61
  discardRest: () => void;
65
62
  expectNoMoreBytes: () => void;
@@ -69,7 +69,6 @@ const getArrayBufferIterator = (initialData, maxBytes) => {
69
69
  data.set(initialData);
70
70
  let view = new DataView(data.buffer);
71
71
  const counter = makeOffsetCounter();
72
- let discardAllowed = true;
73
72
  const startCheckpoint = () => {
74
73
  const checkpoint = counter.getOffset();
75
74
  return {
@@ -83,12 +82,6 @@ const getArrayBufferIterator = (initialData, maxBytes) => {
83
82
  counter.increment(amount);
84
83
  return value;
85
84
  };
86
- const disallowDiscard = () => {
87
- discardAllowed = false;
88
- };
89
- const allowDiscard = () => {
90
- discardAllowed = true;
91
- };
92
85
  const discard = (length) => {
93
86
  counter.increment(length);
94
87
  };
@@ -199,22 +192,22 @@ const getArrayBufferIterator = (initialData, maxBytes) => {
199
192
  const addData = (newData) => {
200
193
  const oldLength = buf.byteLength;
201
194
  const newLength = oldLength + newData.byteLength;
195
+ if (newLength < oldLength) {
196
+ throw new Error('Cannot decrement size');
197
+ }
198
+ if (newLength > (maxBytes !== null && maxBytes !== void 0 ? maxBytes : Infinity)) {
199
+ throw new Error(`Exceeded maximum byte length ${maxBytes} with ${newLength}`);
200
+ }
202
201
  buf.resize(newLength);
203
202
  const newArray = new Uint8Array(buf);
204
203
  newArray.set(newData, oldLength);
205
204
  data = newArray;
206
205
  view = new DataView(data.buffer);
207
206
  };
208
- const byteLength = () => {
209
- return data.byteLength;
210
- };
211
207
  const bytesRemaining = () => {
212
208
  return data.byteLength - counter.getDiscardedOffset();
213
209
  };
214
210
  const removeBytesRead = () => {
215
- if (!discardAllowed) {
216
- return;
217
- }
218
211
  const bytesToRemove = counter.getDiscardedOffset();
219
212
  // Only do this operation if it is really worth it 😇
220
213
  if (bytesToRemove < 100000) {
@@ -331,7 +324,6 @@ const getArrayBufferIterator = (initialData, maxBytes) => {
331
324
  peekB,
332
325
  peekD,
333
326
  getBits,
334
- byteLength,
335
327
  bytesRemaining,
336
328
  leb128,
337
329
  removeBytesRead,
@@ -536,8 +528,6 @@ const getArrayBufferIterator = (initialData, maxBytes) => {
536
528
  getInt32Le,
537
529
  getInt32,
538
530
  destroy,
539
- disallowDiscard,
540
- allowDiscard,
541
531
  startBox,
542
532
  readExpGolomb,
543
533
  startCheckpoint,
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const example_videos_1 = require("@remotion/example-videos");
4
+ const fs_1 = require("fs");
5
+ const stream_1 = require("stream");
6
+ const range = null;
7
+ const stream = (0, fs_1.createReadStream)(example_videos_1.exampleVideos.framer24fps, {
8
+ start: range === null ? 0 : typeof range === 'number' ? range : range[0],
9
+ end: range === null ? Infinity : typeof range === 'number' ? Infinity : range[1],
10
+ });
11
+ const reader = stream_1.Readable.toWeb(stream).getReader();
12
+ console.log(await reader.read());
13
+ console.log(await reader.read());
14
+ console.log(await reader.read());
15
+ console.log(await reader.read());
16
+ console.log(await reader.read());
17
+ console.log(await reader.read());
@@ -156,7 +156,7 @@ const emitAvailableInfo = ({ hasInfo, parseResult, callbacks, state, returnValue
156
156
  hasInfo.videoCodec &&
157
157
  parseResult &&
158
158
  segments) {
159
- const videoCodec = (0, get_video_codec_1.getVideoCodec)(segments, state);
159
+ const videoCodec = (0, get_video_codec_1.getVideoCodec)(state);
160
160
  (_m = callbacks.onVideoCodec) === null || _m === void 0 ? void 0 : _m.call(callbacks, videoCodec);
161
161
  if (fieldsInReturnValue.videoCodec) {
162
162
  returnValue.videoCodec = videoCodec;
@@ -170,7 +170,7 @@ const emitAvailableInfo = ({ hasInfo, parseResult, callbacks, state, returnValue
170
170
  hasInfo.audioCodec &&
171
171
  parseResult &&
172
172
  segments) {
173
- const audioCodec = (0, get_audio_codec_1.getAudioCodec)(segments, state);
173
+ const audioCodec = (0, get_audio_codec_1.getAudioCodec)(state);
174
174
  (_o = callbacks.onAudioCodec) === null || _o === void 0 ? void 0 : _o.call(callbacks, audioCodec);
175
175
  if (fieldsInReturnValue.audioCodec) {
176
176
  returnValue.audioCodec = audioCodec;
@@ -181,7 +181,7 @@ const emitAvailableInfo = ({ hasInfo, parseResult, callbacks, state, returnValue
181
181
  }
182
182
  if (key === 'tracks') {
183
183
  if (!emittedFields.tracks && hasInfo.tracks && parseResult && segments) {
184
- const { videoTracks, audioTracks } = (0, get_tracks_1.getTracks)(segments, state);
184
+ const { videoTracks, audioTracks } = (0, get_tracks_1.getTracks)(state);
185
185
  (_p = callbacks.onTracks) === null || _p === void 0 ? void 0 : _p.call(callbacks, { videoTracks, audioTracks });
186
186
  if (fieldsInReturnValue.tracks) {
187
187
  returnValue.tracks = { videoTracks, audioTracks };
@@ -233,7 +233,7 @@ const emitAvailableInfo = ({ hasInfo, parseResult, callbacks, state, returnValue
233
233
  }
234
234
  if (key === 'isHdr') {
235
235
  if (!returnValue.isHdr && hasInfo.isHdr && parseResult && segments) {
236
- const isHdr = (0, get_is_hdr_1.getIsHdr)(segments, state);
236
+ const isHdr = (0, get_is_hdr_1.getIsHdr)(state);
237
237
  (_t = callbacks.onIsHdr) === null || _t === void 0 ? void 0 : _t.call(callbacks, isHdr);
238
238
  if (fieldsInReturnValue.isHdr) {
239
239
  returnValue.isHdr = isHdr;
@@ -1,10 +1,9 @@
1
1
  // src/readers/from-node.ts
2
- import { createReadStream } from "fs";
3
- import { stat } from "node:fs/promises";
2
+ import { createReadStream, statSync } from "fs";
4
3
  import { sep } from "path";
5
4
  import { Readable } from "stream";
6
5
  var nodeReader = {
7
- read: async (src, range, signal) => {
6
+ read: (src, range, signal) => {
8
7
  if (typeof src !== "string") {
9
8
  throw new Error("src must be a string when using `nodeReader`");
10
9
  }
@@ -17,7 +16,7 @@ var nodeReader = {
17
16
  signal?.addEventListener("abort", () => {
18
17
  controller.abort();
19
18
  }, { once: true });
20
- const stats = await stat(src);
19
+ const stats = statSync(src);
21
20
  const reader = Readable.toWeb(stream).getReader();
22
21
  if (signal) {
23
22
  signal.addEventListener("abort", () => {
@@ -25,7 +24,7 @@ var nodeReader = {
25
24
  });
26
25
  }, { once: true });
27
26
  }
28
- return {
27
+ return Promise.resolve({
29
28
  reader: {
30
29
  reader,
31
30
  abort: () => {
@@ -36,14 +35,14 @@ var nodeReader = {
36
35
  contentType: null,
37
36
  name: src.split(sep).pop(),
38
37
  supportsContentRange: true
39
- };
38
+ });
40
39
  },
41
- getLength: async (src) => {
40
+ getLength: (src) => {
42
41
  if (typeof src !== "string") {
43
42
  throw new Error("src must be a string when using `nodeReader`");
44
43
  }
45
- const stats = await stat(src);
46
- return stats.size;
44
+ const stats = statSync(src);
45
+ return Promise.resolve(stats.size);
47
46
  }
48
47
  };
49
48
  export {