@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.
- package/dist/av1-codec-string.d.ts +5 -0
- package/dist/av1-codec-string.js +18 -1
- package/dist/bitstream/av1.d.ts +2 -0
- package/dist/bitstream/av1.js +12 -0
- package/dist/boxes/iso-base-media/avcc-hvcc.d.ts +20 -0
- package/dist/boxes/iso-base-media/avcc-hvcc.js +73 -0
- package/dist/boxes/iso-base-media/avcc.d.ts +18 -0
- package/dist/boxes/iso-base-media/avcc.js +27 -0
- package/dist/boxes/iso-base-media/esds-descriptors.d.ts +21 -0
- package/dist/boxes/iso-base-media/esds-descriptors.js +62 -0
- package/dist/boxes/iso-base-media/esds.d.ts +15 -0
- package/dist/boxes/iso-base-media/esds.js +27 -0
- package/dist/boxes/iso-base-media/mdat/mdat.js +2 -1
- package/dist/boxes/iso-base-media/moov/moov.js +1 -0
- package/dist/boxes/iso-base-media/mvhd.js +2 -2
- package/dist/boxes/iso-base-media/process-box.d.ts +4 -2
- package/dist/boxes/iso-base-media/process-box.js +56 -40
- package/dist/boxes/iso-base-media/stsd/keys.js +1 -1
- package/dist/boxes/iso-base-media/stsd/mebx.d.ts +2 -1
- package/dist/boxes/iso-base-media/stsd/mebx.js +2 -1
- package/dist/boxes/iso-base-media/stsd/samples.js +3 -0
- package/dist/boxes/iso-base-media/stsd/stco.d.ts +3 -2
- package/dist/boxes/iso-base-media/stsd/stco.js +2 -2
- package/dist/boxes/iso-base-media/trak/trak.js +1 -0
- package/dist/boxes/webm/av1-codec-private.js +1 -1
- package/dist/boxes/webm/bitstream/av1.js +10 -1
- package/dist/boxes/webm/description.d.ts +2 -2
- package/dist/boxes/webm/description.js +2 -2
- package/dist/boxes/webm/ebml.d.ts +2 -2
- package/dist/boxes/webm/ebml.js +23 -1
- package/dist/boxes/webm/get-ready-tracks.d.ts +1 -1
- package/dist/boxes/webm/get-ready-tracks.js +3 -3
- package/dist/boxes/webm/get-sample-from-block.d.ts +17 -0
- package/dist/boxes/webm/get-sample-from-block.js +78 -0
- package/dist/boxes/webm/get-track.d.ts +2 -2
- package/dist/boxes/webm/get-track.js +26 -25
- package/dist/boxes/webm/make-header.d.ts +3 -1
- package/dist/boxes/webm/make-header.js +90 -32
- package/dist/boxes/webm/parse-ebml.d.ts +12 -0
- package/dist/boxes/webm/parse-ebml.js +175 -0
- package/dist/boxes/webm/parse-webm-header.js +8 -9
- package/dist/boxes/webm/segments/all-segments.d.ts +572 -1
- package/dist/boxes/webm/segments/all-segments.js +353 -2
- package/dist/boxes/webm/segments/track-entry.d.ts +5 -189
- package/dist/boxes/webm/segments/track-entry.js +2 -457
- package/dist/boxes/webm/segments.d.ts +3 -16
- package/dist/boxes/webm/segments.js +40 -219
- package/dist/boxes/webm/traversal.d.ts +5 -5
- package/dist/boxes/webm/traversal.js +17 -6
- package/dist/buffer-iterator.d.ts +10 -7
- package/dist/buffer-iterator.js +83 -7
- package/dist/create/create-media.d.ts +2 -0
- package/dist/create/create-media.js +36 -0
- package/dist/create/matroska-header.d.ts +1 -0
- package/dist/create/matroska-header.js +66 -0
- package/dist/create/matroska-info.d.ts +4 -0
- package/dist/create/matroska-info.js +39 -0
- package/dist/create/matroska-segment.d.ts +1 -0
- package/dist/create/matroska-segment.js +12 -0
- package/dist/create/matroska-trackentry.d.ts +21 -0
- package/dist/create/matroska-trackentry.js +191 -0
- package/dist/create-media.d.ts +1 -0
- package/dist/create-media.js +78 -0
- package/dist/from-fetch.js +13 -3
- package/dist/from-input-type-file.d.ts +2 -0
- package/dist/from-input-type-file.js +37 -0
- package/dist/from-node.js +9 -2
- package/dist/from-web-file.js +6 -1
- package/dist/from-web.js +15 -6
- package/dist/get-audio-codec.d.ts +2 -2
- package/dist/get-audio-codec.js +13 -13
- package/dist/get-codec.d.ts +4 -0
- package/dist/get-codec.js +22 -0
- package/dist/get-duration.js +12 -14
- package/dist/get-sample-positions.js +1 -1
- package/dist/get-tracks.js +2 -2
- package/dist/get-video-codec.js +13 -13
- package/dist/has-all-info.js +1 -1
- package/dist/options.d.ts +3 -2
- package/dist/parse-media.js +17 -10
- package/dist/parse-video.js +16 -0
- package/dist/parser-context.d.ts +1 -0
- package/dist/parser-state.d.ts +4 -3
- package/dist/parser-state.js +16 -3
- package/dist/reader.d.ts +1 -1
- package/dist/readers/from-fetch.d.ts +2 -0
- package/dist/readers/from-fetch.js +64 -0
- package/dist/readers/from-node.d.ts +2 -0
- package/dist/readers/from-node.js +40 -0
- package/dist/readers/from-web-file.d.ts +2 -0
- package/dist/readers/from-web-file.js +39 -0
- package/dist/readers/reader.d.ts +11 -0
- package/dist/readers/reader.js +2 -0
- package/dist/traversal.d.ts +19 -17
- package/dist/traversal.js +38 -39
- package/dist/web-file.d.ts +2 -0
- package/dist/web-file.js +37 -0
- package/dist/writers/web-fs.d.ts +2 -0
- package/dist/writers/web-fs.js +28 -0
- package/dist/writers/writer.d.ts +9 -0
- package/dist/writers/writer.js +2 -0
- package/input.webm +0 -0
- package/package.json +2 -2
- package/src/boxes/iso-base-media/mdat/mdat.ts +2 -1
- package/src/boxes/iso-base-media/moov/moov.ts +1 -0
- package/src/boxes/iso-base-media/mvhd.ts +2 -2
- package/src/boxes/iso-base-media/process-box.ts +70 -40
- package/src/boxes/iso-base-media/stsd/keys.ts +1 -1
- package/src/boxes/iso-base-media/stsd/mebx.ts +3 -0
- package/src/boxes/iso-base-media/stsd/samples.ts +3 -0
- package/src/boxes/iso-base-media/stsd/stco.ts +5 -3
- package/src/boxes/iso-base-media/trak/trak.ts +1 -0
- package/src/boxes/webm/av1-codec-private.ts +1 -1
- package/src/boxes/webm/description.ts +7 -4
- package/src/boxes/webm/ebml.ts +24 -4
- package/src/boxes/webm/get-ready-tracks.ts +4 -4
- package/src/boxes/webm/get-sample-from-block.ts +125 -0
- package/src/boxes/webm/get-track.ts +38 -31
- package/src/boxes/webm/make-header.ts +129 -32
- package/src/boxes/webm/parse-ebml.ts +247 -0
- package/src/boxes/webm/parse-webm-header.ts +8 -12
- package/src/boxes/webm/segments/all-segments.ts +539 -1
- package/src/boxes/webm/segments/track-entry.ts +5 -843
- package/src/boxes/webm/segments.ts +48 -435
- package/src/boxes/webm/traversal.ts +28 -15
- package/src/buffer-iterator.ts +104 -10
- package/src/from-fetch.ts +22 -3
- package/src/from-node.ts +18 -4
- package/src/from-web-file.ts +11 -1
- package/src/get-audio-codec.ts +14 -16
- package/src/get-duration.ts +15 -16
- package/src/get-sample-positions.ts +1 -1
- package/src/get-tracks.ts +2 -2
- package/src/get-video-codec.ts +13 -15
- package/src/has-all-info.ts +1 -1
- package/src/options.ts +3 -2
- package/src/parse-media.ts +20 -9
- package/src/parse-video.ts +17 -0
- package/src/parser-context.ts +1 -0
- package/src/parser-state.ts +22 -5
- package/src/reader.ts +1 -0
- package/src/test/create-matroska.test.ts +255 -7
- package/src/test/matroska.test.ts +311 -334
- package/src/test/mvhd.test.ts +1 -1
- package/src/test/parse-esds.test.ts +2 -2
- package/src/test/parse-stco.test.ts +4 -2
- package/src/test/parse-stsc.test.ts +2 -2
- package/src/test/parse-stsz.test.ts +2 -2
- package/src/test/parse-stts.test.ts +1 -1
- package/src/test/stream-local.test.ts +23 -9
- package/src/test/stream-remote.test.ts +23 -19
- package/src/test/stsd.test.ts +6 -2
- package/src/test/tkhd.test.ts +1 -1
- package/src/traversal.ts +62 -85
- package/tsconfig.tsbuildinfo +1 -1
- package/dist/boxes/iso-base-media/ftype.d.ts +0 -9
- package/dist/boxes/iso-base-media/ftype.js +0 -31
- package/dist/get-video-metadata.d.ts +0 -2
- package/dist/get-video-metadata.js +0 -44
- package/dist/read-and-increment-offset.d.ts +0 -28
- package/dist/read-and-increment-offset.js +0 -177
- package/dist/understand-vorbis.d.ts +0 -1
- package/dist/understand-vorbis.js +0 -12
- package/src/boxes/webm/segments/duration.ts +0 -29
- package/src/boxes/webm/segments/info.ts +0 -34
- package/src/boxes/webm/segments/main.ts +0 -6
- package/src/boxes/webm/segments/muxing.ts +0 -18
- package/src/boxes/webm/segments/seek-head.ts +0 -34
- package/src/boxes/webm/segments/seek-position.ts +0 -18
- package/src/boxes/webm/segments/seek.ts +0 -45
- package/src/boxes/webm/segments/timestamp-scale.ts +0 -17
- package/src/boxes/webm/segments/tracks.ts +0 -32
- package/src/boxes/webm/segments/unknown.ts +0 -19
- package/src/boxes/webm/segments/void.ts +0 -18
- package/src/boxes/webm/segments/writing.ts +0 -18
- package/src/combine-uint8array.ts +0 -13
- /package/dist/{boxes/webm/bitstream/av1/frame.d.ts → get-samples.d.ts} +0 -0
- /package/dist/{boxes/webm/bitstream/av1/frame.js → get-samples.js} +0 -0
- /package/dist/{boxes/webm/bitstream/h264/get-h264-descriptor.d.ts → sample-aspect-ratio.d.ts} +0 -0
- /package/dist/{boxes/webm/bitstream/h264/get-h264-descriptor.js → sample-aspect-ratio.js} +0 -0
package/dist/traversal.js
CHANGED
|
@@ -151,41 +151,41 @@ const getStssBox = (trakBox) => {
|
|
|
151
151
|
};
|
|
152
152
|
exports.getStssBox = getStssBox;
|
|
153
153
|
const getClusterSegment = (segment) => {
|
|
154
|
-
const clusterSegment = segment.
|
|
154
|
+
const clusterSegment = segment.value.find((b) => b.type === 'Cluster');
|
|
155
155
|
return clusterSegment !== null && clusterSegment !== void 0 ? clusterSegment : null;
|
|
156
156
|
};
|
|
157
157
|
exports.getClusterSegment = getClusterSegment;
|
|
158
158
|
const getTracksSegment = (segment) => {
|
|
159
|
-
const tracksSegment = segment.
|
|
160
|
-
if (!tracksSegment || tracksSegment.type !== '
|
|
159
|
+
const tracksSegment = segment.value.find((b) => b.type === 'Tracks');
|
|
160
|
+
if (!tracksSegment || tracksSegment.type !== 'Tracks') {
|
|
161
161
|
return null;
|
|
162
162
|
}
|
|
163
163
|
return tracksSegment;
|
|
164
164
|
};
|
|
165
165
|
exports.getTracksSegment = getTracksSegment;
|
|
166
166
|
const getTimescaleSegment = (segment) => {
|
|
167
|
-
const infoSegment = segment.
|
|
168
|
-
if (!infoSegment || infoSegment.type !== '
|
|
167
|
+
const infoSegment = segment.value.find((b) => b.type === 'Info');
|
|
168
|
+
if (!infoSegment || infoSegment.type !== 'Info') {
|
|
169
169
|
return null;
|
|
170
170
|
}
|
|
171
|
-
const timescale = infoSegment.
|
|
172
|
-
if (!timescale || timescale.type !== '
|
|
171
|
+
const timescale = infoSegment.value.find((b) => b.type === 'TimestampScale');
|
|
172
|
+
if (!timescale || timescale.type !== 'TimestampScale') {
|
|
173
173
|
return null;
|
|
174
174
|
}
|
|
175
175
|
return timescale;
|
|
176
176
|
};
|
|
177
177
|
exports.getTimescaleSegment = getTimescaleSegment;
|
|
178
178
|
const getVideoSegment = (track) => {
|
|
179
|
-
const videoSegment = track.
|
|
180
|
-
if (!videoSegment || videoSegment.type !== '
|
|
179
|
+
const videoSegment = track.value.find((b) => b.type === 'Video');
|
|
180
|
+
if (!videoSegment || videoSegment.type !== 'Video') {
|
|
181
181
|
return null;
|
|
182
182
|
}
|
|
183
183
|
return videoSegment !== null && videoSegment !== void 0 ? videoSegment : null;
|
|
184
184
|
};
|
|
185
185
|
exports.getVideoSegment = getVideoSegment;
|
|
186
186
|
const getAudioSegment = (track) => {
|
|
187
|
-
const audioSegment = track.
|
|
188
|
-
if (!audioSegment || audioSegment.type !== '
|
|
187
|
+
const audioSegment = track.value.find((b) => b.type === 'Audio');
|
|
188
|
+
if (!audioSegment || audioSegment.type !== 'Audio') {
|
|
189
189
|
return null;
|
|
190
190
|
}
|
|
191
191
|
return audioSegment !== null && audioSegment !== void 0 ? audioSegment : null;
|
|
@@ -196,12 +196,11 @@ const getSampleRate = (track) => {
|
|
|
196
196
|
if (!audioSegment) {
|
|
197
197
|
return null;
|
|
198
198
|
}
|
|
199
|
-
const samplingFrequency = audioSegment.
|
|
200
|
-
if (!samplingFrequency ||
|
|
201
|
-
samplingFrequency.type !== 'sampling-frequency-segment') {
|
|
199
|
+
const samplingFrequency = audioSegment.value.find((b) => b.type === 'SamplingFrequency');
|
|
200
|
+
if (!samplingFrequency || samplingFrequency.type !== 'SamplingFrequency') {
|
|
202
201
|
return null;
|
|
203
202
|
}
|
|
204
|
-
return samplingFrequency.
|
|
203
|
+
return samplingFrequency.value.value;
|
|
205
204
|
};
|
|
206
205
|
exports.getSampleRate = getSampleRate;
|
|
207
206
|
const getNumberOfChannels = (track) => {
|
|
@@ -209,11 +208,11 @@ const getNumberOfChannels = (track) => {
|
|
|
209
208
|
if (!audioSegment) {
|
|
210
209
|
throw new Error('Could not find audio segment');
|
|
211
210
|
}
|
|
212
|
-
const channels = audioSegment.
|
|
213
|
-
if (!channels || channels.type !== '
|
|
211
|
+
const channels = audioSegment.value.find((b) => b.type === 'Channels');
|
|
212
|
+
if (!channels || channels.type !== 'Channels') {
|
|
214
213
|
return 1;
|
|
215
214
|
}
|
|
216
|
-
return channels.
|
|
215
|
+
return channels.value.value;
|
|
217
216
|
};
|
|
218
217
|
exports.getNumberOfChannels = getNumberOfChannels;
|
|
219
218
|
const getBitDepth = (track) => {
|
|
@@ -221,19 +220,19 @@ const getBitDepth = (track) => {
|
|
|
221
220
|
if (!audioSegment) {
|
|
222
221
|
return null;
|
|
223
222
|
}
|
|
224
|
-
const bitDepth = audioSegment.
|
|
225
|
-
if (!bitDepth || bitDepth.type !== '
|
|
223
|
+
const bitDepth = audioSegment.value.find((b) => b.type === 'BitDepth');
|
|
224
|
+
if (!bitDepth || bitDepth.type !== 'BitDepth') {
|
|
226
225
|
return null;
|
|
227
226
|
}
|
|
228
|
-
return bitDepth.
|
|
227
|
+
return bitDepth.value.value;
|
|
229
228
|
};
|
|
230
229
|
exports.getBitDepth = getBitDepth;
|
|
231
230
|
const getPrivateData = (track) => {
|
|
232
|
-
const privateData = track.
|
|
233
|
-
if (!privateData || privateData.type !== '
|
|
231
|
+
const privateData = track.value.find((b) => b.type === 'CodecPrivate');
|
|
232
|
+
if (!privateData || privateData.type !== 'CodecPrivate') {
|
|
234
233
|
return null;
|
|
235
234
|
}
|
|
236
|
-
return privateData.
|
|
235
|
+
return privateData.value;
|
|
237
236
|
};
|
|
238
237
|
exports.getPrivateData = getPrivateData;
|
|
239
238
|
const getWidthSegment = (track) => {
|
|
@@ -241,8 +240,8 @@ const getWidthSegment = (track) => {
|
|
|
241
240
|
if (!videoSegment) {
|
|
242
241
|
return null;
|
|
243
242
|
}
|
|
244
|
-
const width = videoSegment.
|
|
245
|
-
if (!width || width.type !== '
|
|
243
|
+
const width = videoSegment.value.find((b) => b.type === 'PixelWidth');
|
|
244
|
+
if (!width || width.type !== 'PixelWidth') {
|
|
246
245
|
return null;
|
|
247
246
|
}
|
|
248
247
|
return width;
|
|
@@ -253,8 +252,8 @@ const getHeightSegment = (track) => {
|
|
|
253
252
|
if (!videoSegment) {
|
|
254
253
|
return null;
|
|
255
254
|
}
|
|
256
|
-
const height = videoSegment.
|
|
257
|
-
if (!height || height.type !== '
|
|
255
|
+
const height = videoSegment.value.find((b) => b.type === 'PixelHeight');
|
|
256
|
+
if (!height || height.type !== 'PixelHeight') {
|
|
258
257
|
return null;
|
|
259
258
|
}
|
|
260
259
|
return height;
|
|
@@ -265,8 +264,8 @@ const getDisplayWidthSegment = (track) => {
|
|
|
265
264
|
if (!videoSegment) {
|
|
266
265
|
return null;
|
|
267
266
|
}
|
|
268
|
-
const displayWidth = videoSegment.
|
|
269
|
-
if (!displayWidth || displayWidth.type !== '
|
|
267
|
+
const displayWidth = videoSegment.value.find((b) => b.type === 'DisplayWidth');
|
|
268
|
+
if (!displayWidth || displayWidth.type !== 'DisplayWidth') {
|
|
270
269
|
return null;
|
|
271
270
|
}
|
|
272
271
|
return displayWidth;
|
|
@@ -277,32 +276,32 @@ const getDisplayHeightSegment = (track) => {
|
|
|
277
276
|
if (!videoSegment) {
|
|
278
277
|
return null;
|
|
279
278
|
}
|
|
280
|
-
const displayHeight = videoSegment.
|
|
281
|
-
if (!displayHeight || displayHeight.type !== '
|
|
279
|
+
const displayHeight = videoSegment.value.find((b) => b.type === 'DisplayHeight');
|
|
280
|
+
if (!displayHeight || displayHeight.type !== 'DisplayHeight') {
|
|
282
281
|
return null;
|
|
283
282
|
}
|
|
284
283
|
return displayHeight;
|
|
285
284
|
};
|
|
286
285
|
exports.getDisplayHeightSegment = getDisplayHeightSegment;
|
|
287
286
|
const getTrackTypeSegment = (track) => {
|
|
288
|
-
const trackType = track.
|
|
289
|
-
if (!trackType || trackType.type !== '
|
|
287
|
+
const trackType = track.value.find((b) => b.type === 'TrackType');
|
|
288
|
+
if (!trackType || trackType.type !== 'TrackType') {
|
|
290
289
|
return null;
|
|
291
290
|
}
|
|
292
291
|
return trackType;
|
|
293
292
|
};
|
|
294
293
|
exports.getTrackTypeSegment = getTrackTypeSegment;
|
|
295
294
|
const getTrackId = (track) => {
|
|
296
|
-
const trackId = track.
|
|
297
|
-
if (!trackId || trackId.type !== '
|
|
295
|
+
const trackId = track.value.find((b) => b.type === 'TrackNumber');
|
|
296
|
+
if (!trackId || trackId.type !== 'TrackNumber') {
|
|
298
297
|
throw new Error('Expected track number segment');
|
|
299
298
|
}
|
|
300
|
-
return trackId.
|
|
299
|
+
return trackId.value.value;
|
|
301
300
|
};
|
|
302
301
|
exports.getTrackId = getTrackId;
|
|
303
302
|
const getCodecSegment = (track) => {
|
|
304
|
-
const codec = track.
|
|
305
|
-
if (!codec || codec.type !== '
|
|
303
|
+
const codec = track.value.find((b) => b.type === 'CodecID');
|
|
304
|
+
if (!codec || codec.type !== 'CodecID') {
|
|
306
305
|
return null;
|
|
307
306
|
}
|
|
308
307
|
return codec;
|
package/dist/web-file.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.inputTypeFileReader = void 0;
|
|
4
|
+
exports.inputTypeFileReader = {
|
|
5
|
+
read: (file, range) => {
|
|
6
|
+
if (typeof file === 'string') {
|
|
7
|
+
throw new Error('`inputTypeFileReader` only supports `File` objects');
|
|
8
|
+
}
|
|
9
|
+
if (range !== null) {
|
|
10
|
+
throw new Error('`inputTypeFileReader` does not support `range`');
|
|
11
|
+
}
|
|
12
|
+
const part = range === null
|
|
13
|
+
? file
|
|
14
|
+
: typeof range === 'number'
|
|
15
|
+
? file.slice(range)
|
|
16
|
+
: file.slice(range[0], range[1]);
|
|
17
|
+
const reader = new FileReader();
|
|
18
|
+
reader.readAsArrayBuffer(file);
|
|
19
|
+
return new Promise((resolve, reject) => {
|
|
20
|
+
reader.onload = () => {
|
|
21
|
+
resolve({
|
|
22
|
+
reader: part.stream().getReader(),
|
|
23
|
+
contentLength: file.size,
|
|
24
|
+
});
|
|
25
|
+
};
|
|
26
|
+
reader.onerror = (error) => {
|
|
27
|
+
reject(error);
|
|
28
|
+
};
|
|
29
|
+
});
|
|
30
|
+
},
|
|
31
|
+
getLength: (src) => {
|
|
32
|
+
if (typeof src === 'string') {
|
|
33
|
+
throw new Error('`inputTypeFileReader` only supports `File` objects');
|
|
34
|
+
}
|
|
35
|
+
return Promise.resolve(src.size);
|
|
36
|
+
},
|
|
37
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.webFsWriter = void 0;
|
|
4
|
+
const createContent = async () => {
|
|
5
|
+
const directoryHandle = await navigator.storage.getDirectory();
|
|
6
|
+
const fileHandle = await directoryHandle.getFileHandle('out.web', {
|
|
7
|
+
create: true,
|
|
8
|
+
});
|
|
9
|
+
const f = await fileHandle.getFile();
|
|
10
|
+
const writable = await fileHandle.createWritable();
|
|
11
|
+
return {
|
|
12
|
+
write: async (arr) => {
|
|
13
|
+
await writable.write(arr);
|
|
14
|
+
},
|
|
15
|
+
save: async () => {
|
|
16
|
+
const picker = await window.showSaveFilePicker({
|
|
17
|
+
suggestedName: `${Math.random().toString().replace('.', '')}.webm`,
|
|
18
|
+
});
|
|
19
|
+
const pickerWriteable = await picker.createWritable();
|
|
20
|
+
const stream = f.stream();
|
|
21
|
+
await stream.pipeTo(pickerWriteable);
|
|
22
|
+
await writable.close();
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
exports.webFsWriter = {
|
|
27
|
+
createContent,
|
|
28
|
+
};
|
package/input.webm
ADDED
|
Binary file
|
package/package.json
CHANGED
|
@@ -3,11 +3,11 @@
|
|
|
3
3
|
"url": "https://github.com/remotion-dev/remotion/tree/main/packages/media-parser"
|
|
4
4
|
},
|
|
5
5
|
"name": "@remotion/media-parser",
|
|
6
|
-
"version": "4.0.
|
|
6
|
+
"version": "4.0.202",
|
|
7
7
|
"main": "dist/index.js",
|
|
8
8
|
"sideEffects": false,
|
|
9
9
|
"devDependencies": {
|
|
10
|
-
"@remotion/renderer": "4.0.
|
|
10
|
+
"@remotion/renderer": "4.0.202"
|
|
11
11
|
},
|
|
12
12
|
"publishConfig": {
|
|
13
13
|
"access": "public"
|
|
@@ -26,7 +26,7 @@ export const parseMdat = async ({
|
|
|
26
26
|
}): Promise<MdatBox> => {
|
|
27
27
|
const alreadyHas = hasTracks(existingBoxes);
|
|
28
28
|
if (!alreadyHas) {
|
|
29
|
-
data.discard(size -
|
|
29
|
+
data.discard(size - (data.counter.getOffset() - fileOffset));
|
|
30
30
|
return Promise.resolve({
|
|
31
31
|
type: 'mdat-box',
|
|
32
32
|
boxSize: size,
|
|
@@ -116,6 +116,7 @@ export const parseMdat = async ({
|
|
|
116
116
|
}
|
|
117
117
|
|
|
118
118
|
const remaining = size - (data.counter.getOffset() - fileOffset);
|
|
119
|
+
data.removeBytesRead();
|
|
119
120
|
if (remaining === 0) {
|
|
120
121
|
break;
|
|
121
122
|
}
|
|
@@ -59,7 +59,7 @@ export const parseMvhd = ({
|
|
|
59
59
|
const durationInSeconds = durationInUnits / timeScale;
|
|
60
60
|
|
|
61
61
|
const rateArray = iterator.getSlice(4);
|
|
62
|
-
const rateView = getArrayBufferIterator(rateArray);
|
|
62
|
+
const rateView = getArrayBufferIterator(rateArray, rateArray.length);
|
|
63
63
|
const rate =
|
|
64
64
|
rateView.getInt8() * 10 +
|
|
65
65
|
rateView.getInt8() +
|
|
@@ -67,7 +67,7 @@ export const parseMvhd = ({
|
|
|
67
67
|
rateView.getInt8() * 0.01;
|
|
68
68
|
|
|
69
69
|
const volumeArray = iterator.getSlice(2);
|
|
70
|
-
const volumeView = getArrayBufferIterator(volumeArray);
|
|
70
|
+
const volumeView = getArrayBufferIterator(volumeArray, volumeArray.length);
|
|
71
71
|
|
|
72
72
|
const volume = volumeView.getInt8() + volumeView.getInt8() * 0.1;
|
|
73
73
|
|
|
@@ -37,11 +37,13 @@ const getChildren = async ({
|
|
|
37
37
|
iterator,
|
|
38
38
|
bytesRemainingInBox,
|
|
39
39
|
options,
|
|
40
|
+
littleEndian,
|
|
40
41
|
}: {
|
|
41
42
|
boxType: string;
|
|
42
43
|
iterator: BufferIterator;
|
|
43
44
|
bytesRemainingInBox: number;
|
|
44
45
|
options: ParserContext;
|
|
46
|
+
littleEndian: boolean;
|
|
45
47
|
}) => {
|
|
46
48
|
const parseChildren =
|
|
47
49
|
boxType === 'mdia' ||
|
|
@@ -59,6 +61,7 @@ const getChildren = async ({
|
|
|
59
61
|
initialBoxes: [],
|
|
60
62
|
options,
|
|
61
63
|
continueMdat: false,
|
|
64
|
+
littleEndian,
|
|
62
65
|
});
|
|
63
66
|
|
|
64
67
|
if (parsed.status === 'incomplete') {
|
|
@@ -121,17 +124,37 @@ export const processBox = async ({
|
|
|
121
124
|
allowIncompleteBoxes,
|
|
122
125
|
parsedBoxes,
|
|
123
126
|
options,
|
|
127
|
+
littleEndian,
|
|
124
128
|
}: {
|
|
125
129
|
iterator: BufferIterator;
|
|
126
130
|
allowIncompleteBoxes: boolean;
|
|
127
131
|
parsedBoxes: AnySegment[];
|
|
128
132
|
options: ParserContext;
|
|
133
|
+
littleEndian: boolean;
|
|
129
134
|
}): Promise<BoxAndNext> => {
|
|
130
135
|
const fileOffset = iterator.counter.getOffset();
|
|
131
136
|
const bytesRemaining = iterator.bytesRemaining();
|
|
132
137
|
|
|
133
|
-
const
|
|
134
|
-
|
|
138
|
+
const boxSizeRaw = iterator.getFourByteNumber(littleEndian);
|
|
139
|
+
|
|
140
|
+
// If `boxSize === 1`, the 8 bytes after the box type are the size of the box.
|
|
141
|
+
if (
|
|
142
|
+
(boxSizeRaw === 1 && iterator.bytesRemaining() < 12) ||
|
|
143
|
+
iterator.bytesRemaining() < 4
|
|
144
|
+
) {
|
|
145
|
+
iterator.counter.decrement(iterator.counter.getOffset() - fileOffset);
|
|
146
|
+
if (allowIncompleteBoxes) {
|
|
147
|
+
return {
|
|
148
|
+
type: 'incomplete',
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
throw new Error(
|
|
153
|
+
`Expected box size of ${bytesRemaining}, got ${boxSizeRaw}. Incomplete boxes are not allowed.`,
|
|
154
|
+
);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
if (boxSizeRaw === 0) {
|
|
135
158
|
return {
|
|
136
159
|
type: 'complete',
|
|
137
160
|
box: {
|
|
@@ -143,42 +166,41 @@ export const processBox = async ({
|
|
|
143
166
|
};
|
|
144
167
|
}
|
|
145
168
|
|
|
169
|
+
const boxType = iterator.getByteString(4);
|
|
170
|
+
|
|
171
|
+
const boxSize =
|
|
172
|
+
boxSizeRaw === 1 ? iterator.getEightByteNumber(littleEndian) : boxSizeRaw;
|
|
173
|
+
|
|
146
174
|
if (bytesRemaining < boxSize) {
|
|
147
|
-
if (
|
|
148
|
-
const
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
const
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
},
|
|
168
|
-
size: boxSize,
|
|
169
|
-
skipTo: fileOffset + boxSize,
|
|
170
|
-
};
|
|
171
|
-
}
|
|
172
|
-
} else {
|
|
173
|
-
iterator.discard(4);
|
|
174
|
-
return parseMdatPartially({
|
|
175
|
-
iterator,
|
|
176
|
-
boxSize,
|
|
177
|
-
fileOffset,
|
|
178
|
-
parsedBoxes,
|
|
179
|
-
options,
|
|
180
|
-
});
|
|
175
|
+
if (boxType === 'mdat') {
|
|
176
|
+
const shouldSkip = options.canSkipVideoData || !hasTracks(parsedBoxes);
|
|
177
|
+
|
|
178
|
+
if (shouldSkip) {
|
|
179
|
+
const skipTo = fileOffset + boxSize;
|
|
180
|
+
const bytesToSkip = skipTo - iterator.counter.getOffset();
|
|
181
|
+
|
|
182
|
+
// If there is a huge mdat chunk, we can skip it because we don't need it for the metadata
|
|
183
|
+
if (bytesToSkip > 1_000_000) {
|
|
184
|
+
return {
|
|
185
|
+
type: 'complete',
|
|
186
|
+
box: {
|
|
187
|
+
type: 'mdat-box',
|
|
188
|
+
boxSize,
|
|
189
|
+
fileOffset,
|
|
190
|
+
samplesProcessed: false,
|
|
191
|
+
},
|
|
192
|
+
size: boxSize,
|
|
193
|
+
skipTo: fileOffset + boxSize,
|
|
194
|
+
};
|
|
181
195
|
}
|
|
196
|
+
} else {
|
|
197
|
+
return parseMdatPartially({
|
|
198
|
+
iterator,
|
|
199
|
+
boxSize,
|
|
200
|
+
fileOffset,
|
|
201
|
+
parsedBoxes,
|
|
202
|
+
options,
|
|
203
|
+
});
|
|
182
204
|
}
|
|
183
205
|
}
|
|
184
206
|
|
|
@@ -194,8 +216,6 @@ export const processBox = async ({
|
|
|
194
216
|
);
|
|
195
217
|
}
|
|
196
218
|
|
|
197
|
-
const boxType = iterator.getByteString(4);
|
|
198
|
-
|
|
199
219
|
if (boxType === 'ftyp') {
|
|
200
220
|
const box = parseFtyp({iterator, size: boxSize, offset: fileOffset});
|
|
201
221
|
return {
|
|
@@ -271,11 +291,12 @@ export const processBox = async ({
|
|
|
271
291
|
};
|
|
272
292
|
}
|
|
273
293
|
|
|
274
|
-
if (boxType === 'stco') {
|
|
294
|
+
if (boxType === 'stco' || boxType === 'co64') {
|
|
275
295
|
const box = parseStco({
|
|
276
296
|
iterator,
|
|
277
297
|
offset: fileOffset,
|
|
278
298
|
size: boxSize,
|
|
299
|
+
mode64Bit: boxType === 'co64',
|
|
279
300
|
});
|
|
280
301
|
|
|
281
302
|
return {
|
|
@@ -352,6 +373,7 @@ export const processBox = async ({
|
|
|
352
373
|
offset: fileOffset,
|
|
353
374
|
size: boxSize,
|
|
354
375
|
options,
|
|
376
|
+
littleEndian,
|
|
355
377
|
});
|
|
356
378
|
|
|
357
379
|
return {
|
|
@@ -525,6 +547,7 @@ export const processBox = async ({
|
|
|
525
547
|
iterator,
|
|
526
548
|
bytesRemainingInBox,
|
|
527
549
|
options,
|
|
550
|
+
littleEndian,
|
|
528
551
|
});
|
|
529
552
|
|
|
530
553
|
return {
|
|
@@ -548,6 +571,7 @@ export const parseBoxes = async ({
|
|
|
548
571
|
initialBoxes,
|
|
549
572
|
options,
|
|
550
573
|
continueMdat,
|
|
574
|
+
littleEndian,
|
|
551
575
|
}: {
|
|
552
576
|
iterator: BufferIterator;
|
|
553
577
|
maxBytes: number;
|
|
@@ -555,6 +579,7 @@ export const parseBoxes = async ({
|
|
|
555
579
|
initialBoxes: IsoBaseMediaBox[];
|
|
556
580
|
options: ParserContext;
|
|
557
581
|
continueMdat: false | PartialMdatBox;
|
|
582
|
+
littleEndian: boolean;
|
|
558
583
|
}): Promise<ParseResult> => {
|
|
559
584
|
let boxes: IsoBaseMediaBox[] = initialBoxes;
|
|
560
585
|
const initialOffset = iterator.counter.getOffset();
|
|
@@ -577,6 +602,7 @@ export const parseBoxes = async ({
|
|
|
577
602
|
allowIncompleteBoxes,
|
|
578
603
|
parsedBoxes: initialBoxes,
|
|
579
604
|
options,
|
|
605
|
+
littleEndian,
|
|
580
606
|
});
|
|
581
607
|
|
|
582
608
|
if (result.type === 'incomplete') {
|
|
@@ -595,6 +621,7 @@ export const parseBoxes = async ({
|
|
|
595
621
|
initialBoxes: boxes,
|
|
596
622
|
options,
|
|
597
623
|
continueMdat: false,
|
|
624
|
+
littleEndian,
|
|
598
625
|
});
|
|
599
626
|
},
|
|
600
627
|
skipTo: null,
|
|
@@ -614,6 +641,7 @@ export const parseBoxes = async ({
|
|
|
614
641
|
initialBoxes: boxes,
|
|
615
642
|
options,
|
|
616
643
|
continueMdat: result,
|
|
644
|
+
littleEndian,
|
|
617
645
|
}),
|
|
618
646
|
);
|
|
619
647
|
},
|
|
@@ -641,13 +669,14 @@ export const parseBoxes = async ({
|
|
|
641
669
|
initialBoxes: boxes,
|
|
642
670
|
options,
|
|
643
671
|
continueMdat: false,
|
|
672
|
+
littleEndian,
|
|
644
673
|
});
|
|
645
674
|
},
|
|
646
675
|
skipTo: result.skipTo,
|
|
647
676
|
};
|
|
648
677
|
}
|
|
649
678
|
|
|
650
|
-
iterator.
|
|
679
|
+
iterator.removeBytesRead();
|
|
651
680
|
}
|
|
652
681
|
|
|
653
682
|
const mdatState = hasSkippedMdatProcessing(boxes);
|
|
@@ -663,6 +692,7 @@ export const parseBoxes = async ({
|
|
|
663
692
|
initialBoxes: boxes,
|
|
664
693
|
options,
|
|
665
694
|
continueMdat: false,
|
|
695
|
+
littleEndian,
|
|
666
696
|
});
|
|
667
697
|
},
|
|
668
698
|
skipTo: mdatState.fileOffset,
|
|
@@ -6,7 +6,7 @@ export interface KeysBox extends BaseBox {
|
|
|
6
6
|
}
|
|
7
7
|
|
|
8
8
|
export const parseKeys = (data: Uint8Array, offset: number): KeysBox => {
|
|
9
|
-
const iterator = getArrayBufferIterator(data);
|
|
9
|
+
const iterator = getArrayBufferIterator(data, data.byteLength);
|
|
10
10
|
const size = iterator.getUint32();
|
|
11
11
|
if (size !== data.byteLength) {
|
|
12
12
|
throw new Error(`Expected keys size of ${data.byteLength}, got ${size}`);
|
|
@@ -16,11 +16,13 @@ export const parseMebx = async ({
|
|
|
16
16
|
offset,
|
|
17
17
|
size,
|
|
18
18
|
options,
|
|
19
|
+
littleEndian,
|
|
19
20
|
}: {
|
|
20
21
|
iterator: BufferIterator;
|
|
21
22
|
offset: number;
|
|
22
23
|
size: number;
|
|
23
24
|
options: ParserContext;
|
|
25
|
+
littleEndian: boolean;
|
|
24
26
|
}): Promise<MebxBox> => {
|
|
25
27
|
// reserved, 6 bit
|
|
26
28
|
iterator.discard(6);
|
|
@@ -34,6 +36,7 @@ export const parseMebx = async ({
|
|
|
34
36
|
initialBoxes: [],
|
|
35
37
|
options,
|
|
36
38
|
continueMdat: false,
|
|
39
|
+
littleEndian,
|
|
37
40
|
});
|
|
38
41
|
|
|
39
42
|
if (children.status === 'incomplete') {
|
|
@@ -179,6 +179,7 @@ export const processSample = async ({
|
|
|
179
179
|
initialBoxes: [],
|
|
180
180
|
options,
|
|
181
181
|
continueMdat: false,
|
|
182
|
+
littleEndian: false,
|
|
182
183
|
});
|
|
183
184
|
|
|
184
185
|
if (children.status === 'incomplete') {
|
|
@@ -232,6 +233,7 @@ export const processSample = async ({
|
|
|
232
233
|
initialBoxes: [],
|
|
233
234
|
options,
|
|
234
235
|
continueMdat: false,
|
|
236
|
+
littleEndian: false,
|
|
235
237
|
});
|
|
236
238
|
|
|
237
239
|
if (children.status === 'incomplete') {
|
|
@@ -288,6 +290,7 @@ export const processSample = async ({
|
|
|
288
290
|
initialBoxes: [],
|
|
289
291
|
options,
|
|
290
292
|
continueMdat: false,
|
|
293
|
+
littleEndian: false,
|
|
291
294
|
});
|
|
292
295
|
|
|
293
296
|
if (children.status === 'incomplete') {
|
|
@@ -6,17 +6,19 @@ export interface StcoBox extends BaseBox {
|
|
|
6
6
|
version: number;
|
|
7
7
|
flags: number[];
|
|
8
8
|
entryCount: number;
|
|
9
|
-
entries: number[];
|
|
9
|
+
entries: (number | bigint)[];
|
|
10
10
|
}
|
|
11
11
|
|
|
12
12
|
export const parseStco = ({
|
|
13
13
|
iterator,
|
|
14
14
|
offset,
|
|
15
15
|
size,
|
|
16
|
+
mode64Bit,
|
|
16
17
|
}: {
|
|
17
18
|
iterator: BufferIterator;
|
|
18
19
|
offset: number;
|
|
19
20
|
size: number;
|
|
21
|
+
mode64Bit: boolean;
|
|
20
22
|
}): StcoBox => {
|
|
21
23
|
const version = iterator.getUint8();
|
|
22
24
|
if (version !== 0) {
|
|
@@ -26,14 +28,14 @@ export const parseStco = ({
|
|
|
26
28
|
const flags = iterator.getSlice(3);
|
|
27
29
|
const entryCount = iterator.getUint32();
|
|
28
30
|
|
|
29
|
-
const entries: number[] = [];
|
|
31
|
+
const entries: (number | bigint)[] = [];
|
|
30
32
|
for (let i = 0; i < entryCount; i++) {
|
|
31
33
|
const bytesRemaining = size - (iterator.counter.getOffset() - offset);
|
|
32
34
|
if (bytesRemaining < 4) {
|
|
33
35
|
break;
|
|
34
36
|
}
|
|
35
37
|
|
|
36
|
-
entries.push(iterator.getUint32());
|
|
38
|
+
entries.push(mode64Bit ? iterator.getUint64() : iterator.getUint32());
|
|
37
39
|
}
|
|
38
40
|
|
|
39
41
|
iterator.discard(size - (iterator.counter.getOffset() - offset));
|