@remotion/media-parser 4.0.209 → 4.0.210
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/buffer.js +2 -0
- package/dist/boxes/iso-base-media/get-sample-positions-from-track.js +1 -1
- package/dist/boxes/iso-base-media/make-track.js +14 -2
- package/dist/boxes/iso-base-media/mdat/mdat.d.ts +2 -1
- package/dist/boxes/iso-base-media/mdat/mdat.js +8 -3
- package/dist/boxes/iso-base-media/moov/moov.d.ts +2 -1
- package/dist/boxes/iso-base-media/moov/moov.js +2 -1
- package/dist/boxes/iso-base-media/process-box.d.ts +6 -3
- package/dist/boxes/iso-base-media/process-box.js +20 -5
- package/dist/boxes/iso-base-media/stsd/avcc.d.ts +1 -1
- package/dist/boxes/iso-base-media/stsd/avcc.js +2 -2
- package/dist/boxes/iso-base-media/stsd/ctts.js +2 -5
- package/dist/boxes/iso-base-media/stsd/hvcc.d.ts +1 -1
- package/dist/boxes/iso-base-media/stsd/hvcc.js +2 -2
- 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.d.ts +4 -2
- package/dist/boxes/iso-base-media/stsd/samples.js +69 -11
- package/dist/boxes/iso-base-media/stsd/stsd.d.ts +2 -1
- package/dist/boxes/iso-base-media/stsd/stsd.js +2 -1
- package/dist/boxes/iso-base-media/trak/trak.d.ts +2 -1
- package/dist/boxes/iso-base-media/trak/trak.js +2 -1
- package/dist/boxes/iso-base-media/traversal.d.ts +44 -0
- package/dist/boxes/iso-base-media/traversal.js +211 -0
- package/dist/boxes/webm/color.d.ts +4 -0
- package/dist/boxes/webm/color.js +120 -0
- package/dist/boxes/webm/description.js +1 -1
- package/dist/boxes/webm/get-ready-tracks.js +3 -3
- package/dist/boxes/webm/get-sample-from-block.js +1 -1
- package/dist/boxes/webm/get-track.js +16 -1
- package/dist/boxes/webm/make-track.d.ts +9 -0
- package/dist/boxes/webm/make-track.js +260 -0
- package/dist/boxes/webm/parse-ebml.js +2 -2
- package/dist/boxes/webm/segments/all-segments.d.ts +36 -3
- package/dist/boxes/webm/segments/all-segments.js +34 -6
- package/dist/boxes/webm/traversal.d.ts +26 -1
- package/dist/boxes/webm/traversal.js +214 -1
- package/dist/create/cluster-segment.js +0 -2
- package/dist/create/cluster.d.ts +10 -2
- package/dist/create/cluster.js +16 -10
- package/dist/create/create-media.d.ts +4 -2
- package/dist/create/create-media.js +76 -14
- package/dist/create/cues.d.ts +0 -0
- package/dist/create/cues.js +1 -0
- package/dist/create/make-duration-with-padding.d.ts +1 -1
- package/dist/create/make-duration-with-padding.js +3 -3
- package/dist/create/matroska-cues.d.ts +6 -0
- package/dist/create/matroska-cues.js +50 -0
- package/dist/create/matroska-info.js +1 -1
- package/dist/create/matroska-seek.d.ts +6 -0
- package/dist/create/matroska-seek.js +32 -0
- package/dist/create/matroska-segment.d.ts +1 -0
- package/dist/create/matroska-segment.js +3 -2
- package/dist/create/matroska-trackentry.d.ts +9 -14
- package/dist/create/matroska-trackentry.js +79 -94
- package/dist/emit-available-info.d.ts +12 -0
- package/dist/emit-available-info.js +133 -0
- package/dist/esm/buffer.mjs +57 -0
- package/dist/esm/from-fetch.mjs +72 -0
- package/dist/esm/from-node.mjs +48 -0
- package/dist/esm/from-web-file.mjs +48 -0
- package/dist/esm/index.mjs +6689 -0
- package/dist/esm/web-fs.mjs +67 -0
- package/dist/get-audio-codec.d.ts +5 -5
- package/dist/get-audio-codec.js +41 -57
- package/dist/get-container.d.ts +4 -0
- package/dist/get-container.js +26 -0
- package/dist/get-duration.js +1 -1
- package/dist/get-fps.js +1 -1
- package/dist/get-sample-aspect-ratio.d.ts +1 -1
- package/dist/get-sample-aspect-ratio.js +19 -19
- package/dist/get-tracks.d.ts +13 -0
- package/dist/get-tracks.js +8 -8
- package/dist/get-video-codec.d.ts +5 -2
- package/dist/get-video-codec.js +111 -21
- package/dist/has-all-info.d.ts +2 -2
- package/dist/has-all-info.js +23 -9
- package/dist/index.d.ts +3 -1
- package/dist/options.d.ts +97 -30
- package/dist/parse-media.js +43 -62
- package/dist/parse-video.d.ts +2 -1
- package/dist/parse-video.js +3 -1
- package/dist/parser-state.js +1 -2
- package/dist/readers/from-fetch.js +24 -4
- package/dist/readers/from-node.js +13 -3
- package/dist/readers/from-web-file.js +14 -2
- package/dist/readers/reader.d.ts +6 -1
- package/dist/samples-from-moof.js +1 -1
- package/dist/traversal.d.ts +0 -21
- package/dist/traversal.js +1 -158
- package/dist/truthy.d.ts +3 -0
- package/dist/truthy.js +7 -0
- package/dist/writers/buffer.d.ts +2 -0
- package/dist/writers/buffer.js +58 -0
- package/dist/writers/web-fs.d.ts +1 -0
- package/dist/writers/web-fs.js +42 -18
- package/dist/writers/writer.d.ts +4 -2
- package/fetch.js +2 -0
- package/node.js +2 -0
- package/package.json +43 -8
- package/web-file.js +2 -0
- package/web-fs.js +2 -0
- package/.eslintrc +0 -8
- package/input.webm +0 -0
- package/src/add-new-matroska-tracks.ts +0 -23
- package/src/boxes/iso-base-media/base-type.ts +0 -4
- package/src/boxes/iso-base-media/esds/decoder-specific-config.ts +0 -68
- package/src/boxes/iso-base-media/esds/esds-descriptors.ts +0 -135
- package/src/boxes/iso-base-media/esds/esds.ts +0 -49
- package/src/boxes/iso-base-media/ftyp.ts +0 -39
- package/src/boxes/iso-base-media/get-sample-positions-from-track.ts +0 -69
- package/src/boxes/iso-base-media/make-track.ts +0 -116
- package/src/boxes/iso-base-media/mdat/mdat.ts +0 -140
- package/src/boxes/iso-base-media/mdhd.ts +0 -59
- package/src/boxes/iso-base-media/moov/moov.ts +0 -43
- package/src/boxes/iso-base-media/mvhd.ts +0 -114
- package/src/boxes/iso-base-media/process-box.ts +0 -748
- package/src/boxes/iso-base-media/stsd/av1c.ts +0 -19
- package/src/boxes/iso-base-media/stsd/avcc.ts +0 -36
- package/src/boxes/iso-base-media/stsd/colr.ts +0 -49
- package/src/boxes/iso-base-media/stsd/ctts.ts +0 -64
- package/src/boxes/iso-base-media/stsd/hvcc.ts +0 -32
- package/src/boxes/iso-base-media/stsd/keys.ts +0 -27
- package/src/boxes/iso-base-media/stsd/mebx.ts +0 -54
- package/src/boxes/iso-base-media/stsd/pasp.ts +0 -32
- package/src/boxes/iso-base-media/stsd/samples.ts +0 -359
- package/src/boxes/iso-base-media/stsd/stco.ts +0 -52
- package/src/boxes/iso-base-media/stsd/stsc.ts +0 -61
- package/src/boxes/iso-base-media/stsd/stsd.ts +0 -55
- package/src/boxes/iso-base-media/stsd/stss.ts +0 -47
- package/src/boxes/iso-base-media/stsd/stsz.ts +0 -75
- package/src/boxes/iso-base-media/stsd/stts.ts +0 -62
- package/src/boxes/iso-base-media/tfdt.ts +0 -37
- package/src/boxes/iso-base-media/tfhd.ts +0 -66
- package/src/boxes/iso-base-media/tkhd.ts +0 -150
- package/src/boxes/iso-base-media/to-date.ts +0 -9
- package/src/boxes/iso-base-media/trak/trak.ts +0 -43
- package/src/boxes/iso-base-media/trun.ts +0 -74
- package/src/boxes/iso-base-media/void-box.ts +0 -4
- package/src/boxes/webm/allowed-partial-segments.ts +0 -1
- package/src/boxes/webm/av1-codec-private.ts +0 -113
- package/src/boxes/webm/description.ts +0 -104
- package/src/boxes/webm/ebml.ts +0 -98
- package/src/boxes/webm/get-ready-tracks.ts +0 -36
- package/src/boxes/webm/get-sample-from-block.ts +0 -125
- package/src/boxes/webm/get-track.ts +0 -257
- package/src/boxes/webm/make-header.ts +0 -253
- package/src/boxes/webm/parse-ebml.ts +0 -259
- package/src/boxes/webm/parse-webm-header.ts +0 -18
- package/src/boxes/webm/segments/all-segments.ts +0 -888
- package/src/boxes/webm/segments/block-simple-block-flags.ts +0 -52
- package/src/boxes/webm/segments/parse-children.ts +0 -144
- package/src/boxes/webm/segments/track-entry.ts +0 -38
- package/src/boxes/webm/segments.ts +0 -147
- package/src/boxes/webm/traversal.ts +0 -45
- package/src/buffer-iterator.ts +0 -555
- package/src/create/cluster-segment.ts +0 -62
- package/src/create/cluster.ts +0 -64
- package/src/create/create-media.ts +0 -136
- package/src/create/make-duration-with-padding.ts +0 -15
- package/src/create/matroska-header.ts +0 -63
- package/src/create/matroska-info.ts +0 -30
- package/src/create/matroska-segment.ts +0 -10
- package/src/create/matroska-trackentry.ts +0 -325
- package/src/create/timescale.ts +0 -1
- package/src/get-audio-codec.ts +0 -270
- package/src/get-dimensions.ts +0 -47
- package/src/get-duration.ts +0 -103
- package/src/get-fps.ts +0 -113
- package/src/get-sample-aspect-ratio.ts +0 -204
- package/src/get-sample-positions.ts +0 -93
- package/src/get-tracks.ts +0 -147
- package/src/get-video-codec.ts +0 -117
- package/src/has-all-info.ts +0 -81
- package/src/index.ts +0 -18
- package/src/make-hvc1-codec-strings.ts +0 -55
- package/src/options.ts +0 -118
- package/src/parse-media.ts +0 -183
- package/src/parse-result.ts +0 -79
- package/src/parse-video.ts +0 -83
- package/src/parser-context.ts +0 -10
- package/src/parser-state.ts +0 -178
- package/src/readers/from-fetch.ts +0 -90
- package/src/readers/from-node.ts +0 -51
- package/src/readers/from-web-file.ts +0 -49
- package/src/readers/reader.ts +0 -15
- package/src/samples-from-moof.ts +0 -102
- package/src/test/aspect-ratio.test.ts +0 -42
- package/src/test/av1.test.ts +0 -108
- package/src/test/create-matroska.test.ts +0 -287
- package/src/test/duration.test.ts +0 -18
- package/src/test/keys.test.ts +0 -47
- package/src/test/matroska.test.ts +0 -463
- package/src/test/mvhd.test.ts +0 -94
- package/src/test/parse-esds.test.ts +0 -98
- package/src/test/parse-stco.test.ts +0 -61
- package/src/test/parse-stsc.test.ts +0 -104
- package/src/test/parse-stsz.test.ts +0 -57
- package/src/test/parse-stts.test.ts +0 -38
- package/src/test/parse-video.test.ts +0 -101
- package/src/test/parse-webm.test.ts +0 -17
- package/src/test/samples-from-moof.test.ts +0 -2496
- package/src/test/stream-local.test.ts +0 -743
- package/src/test/stream-remote.test.ts +0 -59
- package/src/test/stream-samples.test.ts +0 -181
- package/src/test/stsd.test.ts +0 -265
- package/src/test/tkhd.test.ts +0 -87
- package/src/traversal.ts +0 -528
- package/src/webcodec-sample-types.ts +0 -29
- package/src/writers/web-fs.ts +0 -50
- package/src/writers/writer.ts +0 -12
- package/tsconfig.json +0 -14
- package/tsconfig.tsbuildinfo +0 -1
|
@@ -1,81 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.makeMatroskaTracks = exports.makeMatroskaVideoTrackEntryBytes = exports.makeMatroskaAudioTrackEntryBytes = exports.makeMatroskaVideoBytes =
|
|
3
|
+
exports.makeMatroskaTracks = exports.makeMatroskaVideoTrackEntryBytes = exports.makeMatroskaAudioTrackEntryBytes = exports.makeMatroskaVideoBytes = void 0;
|
|
4
|
+
const color_1 = require("../boxes/webm/color");
|
|
4
5
|
const make_header_1 = require("../boxes/webm/make-header");
|
|
5
|
-
const makeMatroskaColorBytes = ({ transferChracteristics, matrixCoefficients, primaries, fullRange, }) => {
|
|
6
|
-
const rangeValue = transferChracteristics && matrixCoefficients
|
|
7
|
-
? 3
|
|
8
|
-
: fullRange === true
|
|
9
|
-
? 2
|
|
10
|
-
: fullRange === false
|
|
11
|
-
? 1
|
|
12
|
-
: 0;
|
|
13
|
-
// https://datatracker.ietf.org/doc/draft-ietf-cellar-matroska/
|
|
14
|
-
// 5.1.4.1.28.27
|
|
15
|
-
const primariesValue = primaries === 'bt709'
|
|
16
|
-
? 1
|
|
17
|
-
: primaries === 'smpte170m'
|
|
18
|
-
? 6
|
|
19
|
-
: primaries === 'bt470bg'
|
|
20
|
-
? 5
|
|
21
|
-
: 2;
|
|
22
|
-
const transferChracteristicsValue = transferChracteristics === 'bt709'
|
|
23
|
-
? 1
|
|
24
|
-
: transferChracteristics === 'smpte170m'
|
|
25
|
-
? 6
|
|
26
|
-
: transferChracteristics === 'iec61966-2-1'
|
|
27
|
-
? 13
|
|
28
|
-
: 2;
|
|
29
|
-
if (matrixCoefficients === 'rgb') {
|
|
30
|
-
throw new Error('Cannot encode Matroska in RGB');
|
|
31
|
-
}
|
|
32
|
-
const matrixCoefficientsValue = matrixCoefficients === 'bt709'
|
|
33
|
-
? 1
|
|
34
|
-
: matrixCoefficients === 'bt470bg'
|
|
35
|
-
? 5
|
|
36
|
-
: matrixCoefficients === 'smpte170m'
|
|
37
|
-
? 6
|
|
38
|
-
: 2;
|
|
39
|
-
return (0, make_header_1.makeMatroskaBytes)({
|
|
40
|
-
type: 'Colour',
|
|
41
|
-
minVintWidth: null,
|
|
42
|
-
value: [
|
|
43
|
-
{
|
|
44
|
-
type: 'TransferCharacteristics',
|
|
45
|
-
value: {
|
|
46
|
-
value: transferChracteristicsValue,
|
|
47
|
-
byteLength: null,
|
|
48
|
-
},
|
|
49
|
-
minVintWidth: null,
|
|
50
|
-
},
|
|
51
|
-
{
|
|
52
|
-
type: 'MatrixCoefficients',
|
|
53
|
-
value: {
|
|
54
|
-
value: matrixCoefficientsValue,
|
|
55
|
-
byteLength: null,
|
|
56
|
-
},
|
|
57
|
-
minVintWidth: null,
|
|
58
|
-
},
|
|
59
|
-
{
|
|
60
|
-
type: 'Primaries',
|
|
61
|
-
value: {
|
|
62
|
-
value: primariesValue,
|
|
63
|
-
byteLength: null,
|
|
64
|
-
},
|
|
65
|
-
minVintWidth: null,
|
|
66
|
-
},
|
|
67
|
-
{
|
|
68
|
-
type: 'Range',
|
|
69
|
-
value: {
|
|
70
|
-
value: rangeValue,
|
|
71
|
-
byteLength: null,
|
|
72
|
-
},
|
|
73
|
-
minVintWidth: null,
|
|
74
|
-
},
|
|
75
|
-
],
|
|
76
|
-
});
|
|
77
|
-
};
|
|
78
|
-
exports.makeMatroskaColorBytes = makeMatroskaColorBytes;
|
|
79
6
|
const makeMatroskaVideoBytes = ({ color, width, height, }) => {
|
|
80
7
|
return (0, make_header_1.makeMatroskaBytes)({
|
|
81
8
|
type: 'Video',
|
|
@@ -106,13 +33,67 @@ const makeMatroskaVideoBytes = ({ color, width, height, }) => {
|
|
|
106
33
|
},
|
|
107
34
|
minVintWidth: null,
|
|
108
35
|
},
|
|
109
|
-
(0,
|
|
36
|
+
(0, color_1.makeMatroskaColorBytes)(color),
|
|
110
37
|
],
|
|
111
38
|
minVintWidth: null,
|
|
112
39
|
});
|
|
113
40
|
};
|
|
114
41
|
exports.makeMatroskaVideoBytes = makeMatroskaVideoBytes;
|
|
115
|
-
const
|
|
42
|
+
const makeVideoCodecId = (codecId) => {
|
|
43
|
+
if (codecId === 'vp8') {
|
|
44
|
+
return 'V_VP8';
|
|
45
|
+
}
|
|
46
|
+
if (codecId === 'vp9') {
|
|
47
|
+
return 'V_VP9';
|
|
48
|
+
}
|
|
49
|
+
if (codecId === 'h264') {
|
|
50
|
+
return 'V_MPEG4/ISO/AVC';
|
|
51
|
+
}
|
|
52
|
+
if (codecId === 'av1') {
|
|
53
|
+
return 'V_AV1';
|
|
54
|
+
}
|
|
55
|
+
if (codecId === 'h265') {
|
|
56
|
+
return 'V_MPEGH/ISO/HEVC';
|
|
57
|
+
}
|
|
58
|
+
if (codecId === 'prores') {
|
|
59
|
+
return 'V_PRORES';
|
|
60
|
+
}
|
|
61
|
+
throw new Error(`Unknown codec: ${codecId}`);
|
|
62
|
+
};
|
|
63
|
+
const makeAudioCodecId = (codecId) => {
|
|
64
|
+
if (codecId === 'opus') {
|
|
65
|
+
return 'A_OPUS';
|
|
66
|
+
}
|
|
67
|
+
if (codecId === 'aac') {
|
|
68
|
+
return 'A_AAC';
|
|
69
|
+
}
|
|
70
|
+
if (codecId === 'mp3') {
|
|
71
|
+
return 'A_MPEG/L3';
|
|
72
|
+
}
|
|
73
|
+
if (codecId === 'vorbis') {
|
|
74
|
+
return 'A_VORBIS';
|
|
75
|
+
}
|
|
76
|
+
if (codecId === 'pcm-u8') {
|
|
77
|
+
return 'A_PCM/INT/LIT';
|
|
78
|
+
}
|
|
79
|
+
if (codecId === 'pcm-s16') {
|
|
80
|
+
return 'A_PCM/INT/LIT';
|
|
81
|
+
}
|
|
82
|
+
if (codecId === 'pcm-s24') {
|
|
83
|
+
return 'A_PCM/INT/LIT';
|
|
84
|
+
}
|
|
85
|
+
if (codecId === 'pcm-s32') {
|
|
86
|
+
return 'A_PCM/INT/LIT';
|
|
87
|
+
}
|
|
88
|
+
if (codecId === 'pcm-f32') {
|
|
89
|
+
return 'A_PCM/INT/LIT';
|
|
90
|
+
}
|
|
91
|
+
if (codecId === 'aiff') {
|
|
92
|
+
throw new Error('aiff is not supported in Matroska');
|
|
93
|
+
}
|
|
94
|
+
throw new Error(`Unknown codec: ${codecId}`);
|
|
95
|
+
};
|
|
96
|
+
const makeMatroskaAudioTrackEntryBytes = ({ trackNumber, codec, numberOfChannels, sampleRate, codecPrivate, }) => {
|
|
116
97
|
return (0, make_header_1.makeMatroskaBytes)({
|
|
117
98
|
type: 'TrackEntry',
|
|
118
99
|
minVintWidth: null,
|
|
@@ -148,7 +129,7 @@ const makeMatroskaAudioTrackEntryBytes = ({ trackNumber, codecId, numberOfChanne
|
|
|
148
129
|
},
|
|
149
130
|
{
|
|
150
131
|
type: 'CodecID',
|
|
151
|
-
value:
|
|
132
|
+
value: makeAudioCodecId(codec),
|
|
152
133
|
minVintWidth: null,
|
|
153
134
|
},
|
|
154
135
|
{
|
|
@@ -158,7 +139,7 @@ const makeMatroskaAudioTrackEntryBytes = ({ trackNumber, codecId, numberOfChanne
|
|
|
158
139
|
type: 'Channels',
|
|
159
140
|
minVintWidth: null,
|
|
160
141
|
value: {
|
|
161
|
-
value:
|
|
142
|
+
value: numberOfChannels,
|
|
162
143
|
byteLength: null,
|
|
163
144
|
},
|
|
164
145
|
},
|
|
@@ -181,11 +162,18 @@ const makeMatroskaAudioTrackEntryBytes = ({ trackNumber, codecId, numberOfChanne
|
|
|
181
162
|
],
|
|
182
163
|
minVintWidth: null,
|
|
183
164
|
},
|
|
184
|
-
|
|
165
|
+
codecPrivate
|
|
166
|
+
? {
|
|
167
|
+
type: 'CodecPrivate',
|
|
168
|
+
minVintWidth: null,
|
|
169
|
+
value: codecPrivate,
|
|
170
|
+
}
|
|
171
|
+
: null,
|
|
172
|
+
].filter(Boolean),
|
|
185
173
|
});
|
|
186
174
|
};
|
|
187
175
|
exports.makeMatroskaAudioTrackEntryBytes = makeMatroskaAudioTrackEntryBytes;
|
|
188
|
-
const makeMatroskaVideoTrackEntryBytes = ({ color, width, height,
|
|
176
|
+
const makeMatroskaVideoTrackEntryBytes = ({ color, width, height, trackNumber, codec, codecPrivate, }) => {
|
|
189
177
|
return (0, make_header_1.makeMatroskaBytes)({
|
|
190
178
|
type: 'TrackEntry',
|
|
191
179
|
minVintWidth: null,
|
|
@@ -226,7 +214,7 @@ const makeMatroskaVideoTrackEntryBytes = ({ color, width, height, defaultDuratio
|
|
|
226
214
|
},
|
|
227
215
|
{
|
|
228
216
|
type: 'CodecID',
|
|
229
|
-
value:
|
|
217
|
+
value: makeVideoCodecId(codec),
|
|
230
218
|
minVintWidth: null,
|
|
231
219
|
},
|
|
232
220
|
{
|
|
@@ -237,20 +225,19 @@ const makeMatroskaVideoTrackEntryBytes = ({ color, width, height, defaultDuratio
|
|
|
237
225
|
},
|
|
238
226
|
minVintWidth: null,
|
|
239
227
|
},
|
|
240
|
-
{
|
|
241
|
-
type: 'DefaultDuration',
|
|
242
|
-
value: {
|
|
243
|
-
value: defaultDuration,
|
|
244
|
-
byteLength: null,
|
|
245
|
-
},
|
|
246
|
-
minVintWidth: null,
|
|
247
|
-
},
|
|
248
228
|
(0, exports.makeMatroskaVideoBytes)({
|
|
249
229
|
color,
|
|
250
230
|
width,
|
|
251
231
|
height,
|
|
252
232
|
}),
|
|
253
|
-
|
|
233
|
+
codecPrivate
|
|
234
|
+
? {
|
|
235
|
+
type: 'CodecPrivate',
|
|
236
|
+
minVintWidth: null,
|
|
237
|
+
value: codecPrivate,
|
|
238
|
+
}
|
|
239
|
+
: null,
|
|
240
|
+
].filter(Boolean),
|
|
254
241
|
});
|
|
255
242
|
};
|
|
256
243
|
exports.makeMatroskaVideoTrackEntryBytes = makeMatroskaVideoTrackEntryBytes;
|
|
@@ -259,8 +246,6 @@ const makeMatroskaTracks = (tracks) => {
|
|
|
259
246
|
type: 'Tracks',
|
|
260
247
|
value: tracks,
|
|
261
248
|
minVintWidth: null,
|
|
262
|
-
}),
|
|
263
|
-
// TODO: That's too much padding
|
|
264
|
-
1000);
|
|
249
|
+
}), 500);
|
|
265
250
|
};
|
|
266
251
|
exports.makeMatroskaTracks = makeMatroskaTracks;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { AllParseMediaFields, Options, ParseMediaCallbacks, ParseMediaFields, ParseMediaResult } from './options';
|
|
2
|
+
import type { ParseResult } from './parse-result';
|
|
3
|
+
import type { ParserState } from './parser-state';
|
|
4
|
+
export declare const emitAvailableInfo: ({ hasInfo, parseResult, moreFields, state, returnValue, contentLength, name, }: {
|
|
5
|
+
hasInfo: Record<keyof Options<ParseMediaFields>, boolean>;
|
|
6
|
+
parseResult: ParseResult;
|
|
7
|
+
moreFields: ParseMediaCallbacks<AllParseMediaFields>;
|
|
8
|
+
state: ParserState;
|
|
9
|
+
returnValue: ParseMediaResult<AllParseMediaFields>;
|
|
10
|
+
contentLength: number | null;
|
|
11
|
+
name: string;
|
|
12
|
+
}) => void;
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.emitAvailableInfo = void 0;
|
|
4
|
+
const get_audio_codec_1 = require("./get-audio-codec");
|
|
5
|
+
const get_container_1 = require("./get-container");
|
|
6
|
+
const get_dimensions_1 = require("./get-dimensions");
|
|
7
|
+
const get_duration_1 = require("./get-duration");
|
|
8
|
+
const get_fps_1 = require("./get-fps");
|
|
9
|
+
const get_tracks_1 = require("./get-tracks");
|
|
10
|
+
const get_video_codec_1 = require("./get-video-codec");
|
|
11
|
+
const emitAvailableInfo = ({ hasInfo, parseResult, moreFields, state, returnValue, contentLength, name, }) => {
|
|
12
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
|
|
13
|
+
const keys = Object.keys(hasInfo);
|
|
14
|
+
for (const key of keys) {
|
|
15
|
+
if (key === 'boxes') {
|
|
16
|
+
if (hasInfo.boxes && returnValue.boxes === undefined) {
|
|
17
|
+
(_a = moreFields.onBoxes) === null || _a === void 0 ? void 0 : _a.call(moreFields, parseResult.segments);
|
|
18
|
+
returnValue.boxes = parseResult.segments;
|
|
19
|
+
}
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
if (key === 'durationInSeconds') {
|
|
23
|
+
if (hasInfo.durationInSeconds &&
|
|
24
|
+
returnValue.durationInSeconds === undefined) {
|
|
25
|
+
const durationInSeconds = (0, get_duration_1.getDuration)(parseResult.segments, state);
|
|
26
|
+
(_b = moreFields.onDurationInSeconds) === null || _b === void 0 ? void 0 : _b.call(moreFields, durationInSeconds);
|
|
27
|
+
returnValue.durationInSeconds = durationInSeconds;
|
|
28
|
+
}
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
if (key === 'dimensions') {
|
|
32
|
+
if (hasInfo.dimensions && returnValue.dimensions === undefined) {
|
|
33
|
+
const dimensionsQueried = (0, get_dimensions_1.getDimensions)(parseResult.segments, state);
|
|
34
|
+
const dimensions = {
|
|
35
|
+
height: dimensionsQueried.height,
|
|
36
|
+
width: dimensionsQueried.width,
|
|
37
|
+
};
|
|
38
|
+
(_c = moreFields.onDimensions) === null || _c === void 0 ? void 0 : _c.call(moreFields, dimensions);
|
|
39
|
+
returnValue.dimensions = dimensions;
|
|
40
|
+
}
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
if (key === 'unrotatedDimensions') {
|
|
44
|
+
if (returnValue.unrotatedDimensions === undefined &&
|
|
45
|
+
hasInfo.unrotatedDimensions) {
|
|
46
|
+
const dimensionsQueried = (0, get_dimensions_1.getDimensions)(parseResult.segments, state);
|
|
47
|
+
const unrotatedDimensions = {
|
|
48
|
+
height: dimensionsQueried.unrotatedHeight,
|
|
49
|
+
width: dimensionsQueried.unrotatedWidth,
|
|
50
|
+
};
|
|
51
|
+
(_d = moreFields.onUnrotatedDimensions) === null || _d === void 0 ? void 0 : _d.call(moreFields, unrotatedDimensions);
|
|
52
|
+
returnValue.unrotatedDimensions = unrotatedDimensions;
|
|
53
|
+
}
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
if (key === 'rotation') {
|
|
57
|
+
if (returnValue.rotation === undefined && hasInfo.rotation) {
|
|
58
|
+
const dimensionsQueried = (0, get_dimensions_1.getDimensions)(parseResult.segments, state);
|
|
59
|
+
const { rotation } = dimensionsQueried;
|
|
60
|
+
(_e = moreFields.onRotation) === null || _e === void 0 ? void 0 : _e.call(moreFields, rotation);
|
|
61
|
+
returnValue.rotation = rotation;
|
|
62
|
+
}
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
if (key === 'fps') {
|
|
66
|
+
if (returnValue.fps === undefined && hasInfo.fps) {
|
|
67
|
+
const fps = (0, get_fps_1.getFps)(parseResult.segments);
|
|
68
|
+
(_f = moreFields.onFps) === null || _f === void 0 ? void 0 : _f.call(moreFields, fps);
|
|
69
|
+
returnValue.fps = fps;
|
|
70
|
+
}
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
if (key === 'videoCodec') {
|
|
74
|
+
if (returnValue.videoCodec === undefined && hasInfo.videoCodec) {
|
|
75
|
+
const videoCodec = (0, get_video_codec_1.getVideoCodec)(parseResult.segments);
|
|
76
|
+
(_g = moreFields.onVideoCodec) === null || _g === void 0 ? void 0 : _g.call(moreFields, videoCodec);
|
|
77
|
+
returnValue.videoCodec = videoCodec;
|
|
78
|
+
}
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
if (key === 'audioCodec') {
|
|
82
|
+
if (returnValue.audioCodec === undefined && hasInfo.audioCodec) {
|
|
83
|
+
const audioCodec = (0, get_audio_codec_1.getAudioCodec)(parseResult.segments, state);
|
|
84
|
+
(_h = moreFields.onAudioCodec) === null || _h === void 0 ? void 0 : _h.call(moreFields, audioCodec);
|
|
85
|
+
returnValue.audioCodec = audioCodec;
|
|
86
|
+
}
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
if (key === 'tracks') {
|
|
90
|
+
if (hasInfo.tracks &&
|
|
91
|
+
returnValue.videoTracks === undefined &&
|
|
92
|
+
returnValue.audioTracks === undefined) {
|
|
93
|
+
const { videoTracks, audioTracks } = (0, get_tracks_1.getTracks)(parseResult.segments, state);
|
|
94
|
+
(_j = moreFields.onTracks) === null || _j === void 0 ? void 0 : _j.call(moreFields, { videoTracks, audioTracks });
|
|
95
|
+
returnValue.videoTracks = videoTracks;
|
|
96
|
+
returnValue.audioTracks = audioTracks;
|
|
97
|
+
}
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
if (key === 'internalStats') {
|
|
101
|
+
if (hasInfo.internalStats && returnValue.internalStats === undefined) {
|
|
102
|
+
const internalStats = state.getInternalStats();
|
|
103
|
+
(_k = moreFields.onInternalStats) === null || _k === void 0 ? void 0 : _k.call(moreFields, internalStats);
|
|
104
|
+
returnValue.internalStats = internalStats;
|
|
105
|
+
}
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
if (key === 'size') {
|
|
109
|
+
if (returnValue.size === undefined && hasInfo.size) {
|
|
110
|
+
(_l = moreFields.onSize) === null || _l === void 0 ? void 0 : _l.call(moreFields, contentLength);
|
|
111
|
+
returnValue.size = contentLength;
|
|
112
|
+
}
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
if (key === 'name') {
|
|
116
|
+
if (returnValue.name === undefined && hasInfo.name) {
|
|
117
|
+
(_m = moreFields.onName) === null || _m === void 0 ? void 0 : _m.call(moreFields, name);
|
|
118
|
+
returnValue.name = name;
|
|
119
|
+
}
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
if (key === 'container') {
|
|
123
|
+
if (returnValue.container === undefined && hasInfo.container) {
|
|
124
|
+
const container = (0, get_container_1.getContainer)(parseResult.segments);
|
|
125
|
+
(_o = moreFields.onContainer) === null || _o === void 0 ? void 0 : _o.call(moreFields, container);
|
|
126
|
+
returnValue.container = container;
|
|
127
|
+
}
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
throw new Error(`Unhandled key: ${key}`);
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
exports.emitAvailableInfo = emitAvailableInfo;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
// src/writers/buffer.ts
|
|
2
|
+
var createContent = () => {
|
|
3
|
+
const buf = new ArrayBuffer(0, {
|
|
4
|
+
maxByteLength: 1e8
|
|
5
|
+
});
|
|
6
|
+
if (!buf.resize) {
|
|
7
|
+
throw new Error("Could not create buffer writer");
|
|
8
|
+
}
|
|
9
|
+
let data = new Uint8Array(buf);
|
|
10
|
+
const write = (newData) => {
|
|
11
|
+
const oldLength = buf.byteLength;
|
|
12
|
+
const newLength = oldLength + newData.byteLength;
|
|
13
|
+
buf.resize(newLength);
|
|
14
|
+
const newArray = new Uint8Array(buf);
|
|
15
|
+
newArray.set(newData, oldLength);
|
|
16
|
+
data = newArray;
|
|
17
|
+
};
|
|
18
|
+
const updateDataAt = (position, newData) => {
|
|
19
|
+
const newArray = new Uint8Array(buf);
|
|
20
|
+
newArray.set(newData, position);
|
|
21
|
+
data = newArray;
|
|
22
|
+
};
|
|
23
|
+
let writPromise = Promise.resolve();
|
|
24
|
+
let removed = false;
|
|
25
|
+
const writer = {
|
|
26
|
+
write: (arr) => {
|
|
27
|
+
writPromise = writPromise.then(() => write(arr));
|
|
28
|
+
return writPromise;
|
|
29
|
+
},
|
|
30
|
+
save: () => {
|
|
31
|
+
if (removed) {
|
|
32
|
+
return Promise.reject(new Error("Already called .remove() on the result"));
|
|
33
|
+
}
|
|
34
|
+
return Promise.resolve(new File([data], "hithere", {}));
|
|
35
|
+
},
|
|
36
|
+
remove() {
|
|
37
|
+
removed = true;
|
|
38
|
+
data = new Uint8Array(0);
|
|
39
|
+
return Promise.resolve();
|
|
40
|
+
},
|
|
41
|
+
getWrittenByteCount: () => buf.byteLength,
|
|
42
|
+
updateDataAt: (position, newData) => {
|
|
43
|
+
writPromise = writPromise.then(() => updateDataAt(position, newData));
|
|
44
|
+
return writPromise;
|
|
45
|
+
},
|
|
46
|
+
waitForFinish: async () => {
|
|
47
|
+
await writPromise;
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
return Promise.resolve(writer);
|
|
51
|
+
};
|
|
52
|
+
var bufferWriter = {
|
|
53
|
+
createContent
|
|
54
|
+
};
|
|
55
|
+
export {
|
|
56
|
+
bufferWriter
|
|
57
|
+
};
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
// src/readers/from-fetch.ts
|
|
2
|
+
var fetchReader = {
|
|
3
|
+
read: async (src, range, signal) => {
|
|
4
|
+
if (typeof src !== "string") {
|
|
5
|
+
throw new Error("src must be a string when using `fetchReader`");
|
|
6
|
+
}
|
|
7
|
+
const resolvedUrl = typeof window !== "undefined" && typeof window.location !== "undefined" ? new URL(src, window.location.origin).toString() : src;
|
|
8
|
+
if (!resolvedUrl.startsWith("https://") && !resolvedUrl.startsWith("blob:") && !resolvedUrl.startsWith("http://")) {
|
|
9
|
+
return Promise.reject(new Error(resolvedUrl + " is not a URL - needs to start with http:// or https:// or blob:. If you want to read a local file, pass `reader: nodeReader` to parseMedia()."));
|
|
10
|
+
}
|
|
11
|
+
const controller = new AbortController;
|
|
12
|
+
const res = await fetch(resolvedUrl, {
|
|
13
|
+
headers: range === null ? {} : typeof range === "number" ? {
|
|
14
|
+
Range: `bytes=${range}`
|
|
15
|
+
} : {
|
|
16
|
+
Range: `bytes=${`${range[0]}-${range[1]}`}`
|
|
17
|
+
},
|
|
18
|
+
signal: controller.signal,
|
|
19
|
+
cache: "no-store"
|
|
20
|
+
});
|
|
21
|
+
signal?.addEventListener("abort", () => {
|
|
22
|
+
controller.abort();
|
|
23
|
+
}, { once: true });
|
|
24
|
+
if (res.status.toString().startsWith("4") || res.status.toString().startsWith("5")) {
|
|
25
|
+
throw new Error(`Server returned status code ${res.status} for ${src}`);
|
|
26
|
+
}
|
|
27
|
+
if (!res.body) {
|
|
28
|
+
throw new Error("No body");
|
|
29
|
+
}
|
|
30
|
+
const length = res.headers.get("content-length");
|
|
31
|
+
const contentLength = length === null ? null : parseInt(length, 10);
|
|
32
|
+
const contentDisposition = res.headers.get("content-disposition");
|
|
33
|
+
const name = contentDisposition?.match(/filename="([^"]+)"/)?.[1];
|
|
34
|
+
const fallbackName = src.split("/").pop();
|
|
35
|
+
const reader = res.body.getReader();
|
|
36
|
+
if (signal) {
|
|
37
|
+
signal.addEventListener("abort", () => {
|
|
38
|
+
reader.cancel().catch(() => {
|
|
39
|
+
});
|
|
40
|
+
}, { once: true });
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
reader: {
|
|
44
|
+
reader,
|
|
45
|
+
abort: () => {
|
|
46
|
+
controller.abort();
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
contentLength,
|
|
50
|
+
name: name ?? fallbackName
|
|
51
|
+
};
|
|
52
|
+
},
|
|
53
|
+
getLength: async (src) => {
|
|
54
|
+
if (typeof src !== "string") {
|
|
55
|
+
throw new Error("src must be a string when using `fetchReader`");
|
|
56
|
+
}
|
|
57
|
+
const res = await fetch(src, {
|
|
58
|
+
method: "HEAD"
|
|
59
|
+
});
|
|
60
|
+
if (!res.body) {
|
|
61
|
+
throw new Error("No body");
|
|
62
|
+
}
|
|
63
|
+
const length = res.headers.get("content-length");
|
|
64
|
+
if (!length) {
|
|
65
|
+
throw new Error("No content-length");
|
|
66
|
+
}
|
|
67
|
+
return parseInt(length, 10);
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
export {
|
|
71
|
+
fetchReader
|
|
72
|
+
};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// src/readers/from-node.ts
|
|
2
|
+
import {createReadStream} from "fs";
|
|
3
|
+
import {stat} from "node:fs/promises";
|
|
4
|
+
import {Readable} from "stream";
|
|
5
|
+
var nodeReader = {
|
|
6
|
+
read: async (src, range, signal) => {
|
|
7
|
+
if (typeof src !== "string") {
|
|
8
|
+
throw new Error("src must be a string when using `nodeReader`");
|
|
9
|
+
}
|
|
10
|
+
const controller = new AbortController;
|
|
11
|
+
const stream = createReadStream(src, {
|
|
12
|
+
start: range === null ? 0 : typeof range === "number" ? range : range[0],
|
|
13
|
+
end: range === null ? Infinity : typeof range === "number" ? Infinity : range[1],
|
|
14
|
+
signal: controller.signal
|
|
15
|
+
});
|
|
16
|
+
signal?.addEventListener("abort", () => {
|
|
17
|
+
controller.abort();
|
|
18
|
+
}, { once: true });
|
|
19
|
+
const stats = await stat(src);
|
|
20
|
+
const reader = Readable.toWeb(stream).getReader();
|
|
21
|
+
if (signal) {
|
|
22
|
+
signal.addEventListener("abort", () => {
|
|
23
|
+
reader.cancel().catch(() => {
|
|
24
|
+
});
|
|
25
|
+
}, { once: true });
|
|
26
|
+
}
|
|
27
|
+
return {
|
|
28
|
+
reader: {
|
|
29
|
+
reader,
|
|
30
|
+
abort: () => {
|
|
31
|
+
controller.abort();
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
contentLength: stats.size,
|
|
35
|
+
name: src.split("/").pop()
|
|
36
|
+
};
|
|
37
|
+
},
|
|
38
|
+
getLength: async (src) => {
|
|
39
|
+
if (typeof src !== "string") {
|
|
40
|
+
throw new Error("src must be a string when using `nodeReader`");
|
|
41
|
+
}
|
|
42
|
+
const stats = await stat(src);
|
|
43
|
+
return stats.size;
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
export {
|
|
47
|
+
nodeReader
|
|
48
|
+
};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// src/readers/from-web-file.ts
|
|
2
|
+
var webFileReader = {
|
|
3
|
+
read: (file, range, signal) => {
|
|
4
|
+
if (typeof file === "string") {
|
|
5
|
+
throw new Error("`inputTypeFileReader` only supports `File` objects");
|
|
6
|
+
}
|
|
7
|
+
const part = range === null ? file : typeof range === "number" ? file.slice(range) : file.slice(range[0], range[1]);
|
|
8
|
+
const reader = new FileReader;
|
|
9
|
+
reader.readAsArrayBuffer(file);
|
|
10
|
+
const controller = new AbortController;
|
|
11
|
+
if (controller) {
|
|
12
|
+
controller.signal.addEventListener("abort", () => {
|
|
13
|
+
reader.abort();
|
|
14
|
+
}, { once: true });
|
|
15
|
+
}
|
|
16
|
+
if (signal) {
|
|
17
|
+
signal.addEventListener("abort", () => {
|
|
18
|
+
controller.abort();
|
|
19
|
+
}, { once: true });
|
|
20
|
+
}
|
|
21
|
+
return new Promise((resolve, reject) => {
|
|
22
|
+
reader.onload = () => {
|
|
23
|
+
resolve({
|
|
24
|
+
reader: {
|
|
25
|
+
reader: part.stream().getReader(),
|
|
26
|
+
abort() {
|
|
27
|
+
controller.abort();
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
contentLength: file.size,
|
|
31
|
+
name: file.name
|
|
32
|
+
});
|
|
33
|
+
};
|
|
34
|
+
reader.onerror = (error) => {
|
|
35
|
+
reject(error);
|
|
36
|
+
};
|
|
37
|
+
});
|
|
38
|
+
},
|
|
39
|
+
getLength: (src) => {
|
|
40
|
+
if (typeof src === "string") {
|
|
41
|
+
throw new Error("`inputTypeFileReader` only supports `File` objects");
|
|
42
|
+
}
|
|
43
|
+
return Promise.resolve(src.size);
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
export {
|
|
47
|
+
webFileReader
|
|
48
|
+
};
|