@remotion/media-parser 4.0.208 → 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 +5 -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/buffer-iterator.js +6 -0
- package/dist/create/cluster-segment.d.ts +1 -1
- package/dist/create/cluster-segment.js +3 -5
- package/dist/create/cluster.d.ts +13 -0
- package/dist/create/cluster.js +54 -0
- package/dist/create/create-media.d.ts +4 -2
- package/dist/create/create-media.js +87 -47
- 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 -0
- package/dist/create/make-duration-with-padding.js +15 -0
- package/dist/create/matroska-cues.d.ts +6 -0
- package/dist/create/matroska-cues.js +50 -0
- package/dist/create/matroska-info.d.ts +1 -2
- package/dist/create/matroska-info.js +3 -11
- 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/create/timescale.d.ts +1 -0
- package/dist/create/timescale.js +4 -0
- 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 -255
- 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 -548
- package/src/create/cluster-segment.ts +0 -62
- package/src/create/create-media.ts +0 -172
- package/src/create/matroska-header.ts +0 -63
- package/src/create/matroska-info.ts +0 -46
- package/src/create/matroska-segment.ts +0 -10
- package/src/create/matroska-trackentry.ts +0 -325
- 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,257 +0,0 @@
|
|
|
1
|
-
import {getArrayBufferIterator} from '../../buffer-iterator';
|
|
2
|
-
import type {AudioTrack, VideoTrack} from '../../get-tracks';
|
|
3
|
-
import {getHvc1CodecString} from '../../make-hvc1-codec-strings';
|
|
4
|
-
import {
|
|
5
|
-
getBitDepth,
|
|
6
|
-
getCodecSegment,
|
|
7
|
-
getDisplayHeightSegment,
|
|
8
|
-
getDisplayWidthSegment,
|
|
9
|
-
getHeightSegment,
|
|
10
|
-
getNumberOfChannels,
|
|
11
|
-
getPrivateData,
|
|
12
|
-
getSampleRate,
|
|
13
|
-
getTrackId,
|
|
14
|
-
getTrackTypeSegment,
|
|
15
|
-
getWidthSegment,
|
|
16
|
-
} from '../../traversal';
|
|
17
|
-
import {parseAv1PrivateData} from './av1-codec-private';
|
|
18
|
-
import {getAudioDescription} from './description';
|
|
19
|
-
import type {CodecIdSegment, TrackEntry} from './segments/all-segments';
|
|
20
|
-
import {trackTypeToString} from './segments/track-entry';
|
|
21
|
-
|
|
22
|
-
const getDescription = (track: TrackEntry): undefined | Uint8Array => {
|
|
23
|
-
const codec = getCodecSegment(track);
|
|
24
|
-
if (!codec) {
|
|
25
|
-
return undefined;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
if (codec.value === 'V_MPEG4/ISO/AVC' || codec.value === 'V_MPEGH/ISO/HEVC') {
|
|
29
|
-
const priv = getPrivateData(track);
|
|
30
|
-
if (priv) {
|
|
31
|
-
return priv;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
return undefined;
|
|
36
|
-
};
|
|
37
|
-
|
|
38
|
-
const getMatroskaVideoCodecString = ({
|
|
39
|
-
track,
|
|
40
|
-
codecSegment: codec,
|
|
41
|
-
}: {
|
|
42
|
-
track: TrackEntry;
|
|
43
|
-
codecSegment: CodecIdSegment;
|
|
44
|
-
}): string | null => {
|
|
45
|
-
if (codec.value === 'V_VP8') {
|
|
46
|
-
return 'vp8';
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
if (codec.value === 'V_VP9') {
|
|
50
|
-
const priv = getPrivateData(track);
|
|
51
|
-
if (priv) {
|
|
52
|
-
throw new Error(
|
|
53
|
-
'@remotion/media-parser cannot handle the private data for VP9. Do you have an example file you could send so we can implement it?',
|
|
54
|
-
);
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
return 'vp09.00.10.08';
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
if (codec.value === 'V_MPEG4/ISO/AVC') {
|
|
61
|
-
const priv = getPrivateData(track);
|
|
62
|
-
if (priv) {
|
|
63
|
-
return `avc1.${priv[1].toString(16).padStart(2, '0')}${priv[2].toString(16).padStart(2, '0')}${priv[3].toString(16).padStart(2, '0')}`;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
throw new Error('Could not find a CodecPrivate field in TrackEntry');
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
if (codec.value === 'V_AV1') {
|
|
70
|
-
const priv = getPrivateData(track);
|
|
71
|
-
|
|
72
|
-
if (!priv) {
|
|
73
|
-
throw new Error('Expected private data in AV1 track');
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
return parseAv1PrivateData(priv, null);
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
if (codec.value === 'V_MPEGH/ISO/HEVC') {
|
|
80
|
-
const priv = getPrivateData(track);
|
|
81
|
-
const iterator = getArrayBufferIterator(
|
|
82
|
-
priv as Uint8Array,
|
|
83
|
-
(priv as Uint8Array).length,
|
|
84
|
-
);
|
|
85
|
-
|
|
86
|
-
return 'hvc1.' + getHvc1CodecString(iterator);
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
throw new Error(`Unknown codec: ${codec.value}`);
|
|
90
|
-
};
|
|
91
|
-
|
|
92
|
-
const getMatroskaAudioCodecString = (track: TrackEntry): string => {
|
|
93
|
-
const codec = getCodecSegment(track);
|
|
94
|
-
if (!codec) {
|
|
95
|
-
throw new Error('Expected codec segment');
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
if (codec.value === 'A_OPUS') {
|
|
99
|
-
return 'opus';
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
if (codec.value === 'A_VORBIS') {
|
|
103
|
-
return 'vorbis';
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
if (codec.value === 'A_PCM/INT/LIT') {
|
|
107
|
-
// https://github.com/ietf-wg-cellar/matroska-specification/issues/142#issuecomment-330004950
|
|
108
|
-
// Audio samples MUST be considered as signed values, except if the audio bit depth is 8 which MUST be interpreted as unsigned values.
|
|
109
|
-
|
|
110
|
-
const bitDepth = getBitDepth(track);
|
|
111
|
-
if (bitDepth === null) {
|
|
112
|
-
throw new Error('Expected bit depth');
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
if (bitDepth === 8) {
|
|
116
|
-
return 'pcm-u8';
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
return 'pcm-s' + bitDepth;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
if (codec.value === 'A_AAC') {
|
|
123
|
-
const priv = getPrivateData(track);
|
|
124
|
-
|
|
125
|
-
const iterator = getArrayBufferIterator(
|
|
126
|
-
priv as Uint8Array,
|
|
127
|
-
(priv as Uint8Array).length,
|
|
128
|
-
);
|
|
129
|
-
|
|
130
|
-
iterator.startReadingBits();
|
|
131
|
-
/**
|
|
132
|
-
* ChatGPT
|
|
133
|
-
* ▪ The first 5 bits represent the AOT.
|
|
134
|
-
▪ Common values:
|
|
135
|
-
◦ 1 for AAC Main
|
|
136
|
-
◦ 2 for AAC LC (Low Complexity)
|
|
137
|
-
◦ 3 for AAC SSR (Scalable Sample Rate)
|
|
138
|
-
◦ 4 for AAC LTP (Long Term Prediction)
|
|
139
|
-
◦ 5 for SBR (Spectral Band Replication)
|
|
140
|
-
◦ 29 for HE-AAC (which uses SBR with AAC LC)
|
|
141
|
-
*/
|
|
142
|
-
/**
|
|
143
|
-
* Fully qualified codec:
|
|
144
|
-
* This codec has multiple possible codec strings:
|
|
145
|
-
"mp4a.40.2" — MPEG-4 AAC LC
|
|
146
|
-
"mp4a.40.02" — MPEG-4 AAC LC, leading 0 for Aud-OTI compatibility
|
|
147
|
-
"mp4a.40.5" — MPEG-4 HE-AAC v1 (AAC LC + SBR)
|
|
148
|
-
"mp4a.40.05" — MPEG-4 HE-AAC v1 (AAC LC + SBR), leading 0 for Aud-OTI compatibility
|
|
149
|
-
"mp4a.40.29" — MPEG-4 HE-AAC v2 (AAC LC + SBR + PS)
|
|
150
|
-
"mp4a.67" — MPEG-2 AAC LC
|
|
151
|
-
*/
|
|
152
|
-
|
|
153
|
-
const profile = iterator.getBits(5);
|
|
154
|
-
iterator.stopReadingBits();
|
|
155
|
-
iterator.destroy();
|
|
156
|
-
|
|
157
|
-
return `mp4a.40.${profile.toString().padStart(2, '0')}`;
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
if (codec.value === 'A_MPEG/L3') {
|
|
161
|
-
return 'mp3';
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
throw new Error(`Unknown codec: ${codec.value}`);
|
|
165
|
-
};
|
|
166
|
-
|
|
167
|
-
export const getTrack = ({
|
|
168
|
-
timescale,
|
|
169
|
-
track,
|
|
170
|
-
}: {
|
|
171
|
-
timescale: number;
|
|
172
|
-
track: TrackEntry;
|
|
173
|
-
}): VideoTrack | AudioTrack | null => {
|
|
174
|
-
const trackType = getTrackTypeSegment(track);
|
|
175
|
-
|
|
176
|
-
if (!trackType) {
|
|
177
|
-
throw new Error('Expected track type segment');
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
const trackId = getTrackId(track);
|
|
181
|
-
|
|
182
|
-
if (trackTypeToString(trackType.value.value) === 'video') {
|
|
183
|
-
const width = getWidthSegment(track);
|
|
184
|
-
|
|
185
|
-
if (width === null) {
|
|
186
|
-
throw new Error('Expected width segment');
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
const height = getHeightSegment(track);
|
|
190
|
-
|
|
191
|
-
if (height === null) {
|
|
192
|
-
throw new Error('Expected height segment');
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
const displayHeight = getDisplayHeightSegment(track);
|
|
196
|
-
const displayWidth = getDisplayWidthSegment(track);
|
|
197
|
-
|
|
198
|
-
const codec = getCodecSegment(track);
|
|
199
|
-
if (!codec) {
|
|
200
|
-
return null;
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
const codecString = getMatroskaVideoCodecString({
|
|
204
|
-
track,
|
|
205
|
-
codecSegment: codec,
|
|
206
|
-
});
|
|
207
|
-
|
|
208
|
-
if (!codecString) {
|
|
209
|
-
return null;
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
return {
|
|
213
|
-
type: 'video',
|
|
214
|
-
trackId,
|
|
215
|
-
codec: codecString,
|
|
216
|
-
description: getDescription(track),
|
|
217
|
-
height: displayHeight ? displayHeight.value.value : height.value.value,
|
|
218
|
-
width: displayWidth ? displayWidth.value.value : width.value.value,
|
|
219
|
-
sampleAspectRatio: {
|
|
220
|
-
numerator: 1,
|
|
221
|
-
denominator: 1,
|
|
222
|
-
},
|
|
223
|
-
timescale,
|
|
224
|
-
codedHeight: height.value.value,
|
|
225
|
-
codedWidth: width.value.value,
|
|
226
|
-
displayAspectHeight: displayHeight
|
|
227
|
-
? displayHeight.value.value
|
|
228
|
-
: height.value.value,
|
|
229
|
-
displayAspectWidth: displayWidth
|
|
230
|
-
? displayWidth.value.value
|
|
231
|
-
: width.value.value,
|
|
232
|
-
rotation: 0,
|
|
233
|
-
trakBox: null,
|
|
234
|
-
};
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
if (trackTypeToString(trackType.value.value) === 'audio') {
|
|
238
|
-
const sampleRate = getSampleRate(track);
|
|
239
|
-
const numberOfChannels = getNumberOfChannels(track);
|
|
240
|
-
if (sampleRate === null) {
|
|
241
|
-
throw new Error('Could not find sample rate or number of channels');
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
return {
|
|
245
|
-
type: 'audio',
|
|
246
|
-
trackId,
|
|
247
|
-
codec: getMatroskaAudioCodecString(track),
|
|
248
|
-
timescale,
|
|
249
|
-
numberOfChannels,
|
|
250
|
-
sampleRate,
|
|
251
|
-
description: getAudioDescription(track),
|
|
252
|
-
trakBox: null,
|
|
253
|
-
};
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
return null;
|
|
257
|
-
};
|
|
@@ -1,253 +0,0 @@
|
|
|
1
|
-
import {getVariableInt} from './ebml';
|
|
2
|
-
import type {
|
|
3
|
-
BytesAndOffset,
|
|
4
|
-
FloatWithSize,
|
|
5
|
-
OffsetAndChildren,
|
|
6
|
-
PossibleEbml,
|
|
7
|
-
PossibleEbmlOrUint8Array,
|
|
8
|
-
UintWithSize,
|
|
9
|
-
} from './segments/all-segments';
|
|
10
|
-
import {
|
|
11
|
-
ebmlMap,
|
|
12
|
-
getIdForName,
|
|
13
|
-
incrementOffsetAndChildren,
|
|
14
|
-
matroskaElements,
|
|
15
|
-
} from './segments/all-segments';
|
|
16
|
-
|
|
17
|
-
export const webmPattern = new Uint8Array([0x1a, 0x45, 0xdf, 0xa3]);
|
|
18
|
-
|
|
19
|
-
export const matroskaToHex = (
|
|
20
|
-
matrId: (typeof matroskaElements)[keyof typeof matroskaElements],
|
|
21
|
-
) => {
|
|
22
|
-
const numbers: Uint8Array = new Uint8Array((matrId.length - 2) / 2);
|
|
23
|
-
|
|
24
|
-
for (let i = 2; i < matrId.length; i += 2) {
|
|
25
|
-
const hex = matrId.substring(i, i + 2);
|
|
26
|
-
numbers[(i - 2) / 2] = parseInt(hex, 16);
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
return numbers;
|
|
30
|
-
};
|
|
31
|
-
|
|
32
|
-
function putUintDynamic(number: number, minimumLength: number | null) {
|
|
33
|
-
if (number < 0) {
|
|
34
|
-
throw new Error(
|
|
35
|
-
'This function is designed for non-negative integers only.',
|
|
36
|
-
);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
// Calculate the minimum number of bytes needed to store the integer
|
|
40
|
-
const length = Math.max(
|
|
41
|
-
minimumLength ?? 0,
|
|
42
|
-
Math.ceil(Math.log2(number + 1) / 8),
|
|
43
|
-
);
|
|
44
|
-
const bytes = new Uint8Array(length);
|
|
45
|
-
|
|
46
|
-
for (let i = 0; i < length; i++) {
|
|
47
|
-
// Extract each byte from the number
|
|
48
|
-
bytes[length - 1 - i] = (number >> (8 * i)) & 0xff;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
return bytes;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
const makeFromStructure = (
|
|
55
|
-
fields: PossibleEbmlOrUint8Array,
|
|
56
|
-
): BytesAndOffset => {
|
|
57
|
-
if ('bytes' in fields) {
|
|
58
|
-
return fields;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
const arrays: Uint8Array[] = [];
|
|
62
|
-
|
|
63
|
-
const struct = ebmlMap[getIdForName(fields.type)];
|
|
64
|
-
|
|
65
|
-
if (struct.type === 'uint8array') {
|
|
66
|
-
return {
|
|
67
|
-
bytes: fields.value as Uint8Array,
|
|
68
|
-
offsets: {offset: 0, children: [], field: fields.type},
|
|
69
|
-
};
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
if (struct.type === 'children') {
|
|
73
|
-
const children: OffsetAndChildren[] = [];
|
|
74
|
-
let bytesWritten = 0;
|
|
75
|
-
for (const item of fields.value as PossibleEbml[]) {
|
|
76
|
-
const {bytes, offsets} = makeMatroskaBytes(item);
|
|
77
|
-
arrays.push(bytes);
|
|
78
|
-
children.push(incrementOffsetAndChildren(offsets, bytesWritten));
|
|
79
|
-
bytesWritten += bytes.byteLength;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
return {
|
|
83
|
-
bytes: combineUint8Arrays(arrays),
|
|
84
|
-
offsets: {offset: 0, children, field: fields.type},
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
if (struct.type === 'string') {
|
|
89
|
-
return {
|
|
90
|
-
bytes: new TextEncoder().encode(fields.value as string),
|
|
91
|
-
offsets: {
|
|
92
|
-
children: [],
|
|
93
|
-
offset: 0,
|
|
94
|
-
field: fields.type,
|
|
95
|
-
},
|
|
96
|
-
};
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
if (struct.type === 'uint') {
|
|
100
|
-
return {
|
|
101
|
-
bytes: putUintDynamic(
|
|
102
|
-
(fields.value as UintWithSize).value,
|
|
103
|
-
(fields.value as UintWithSize).byteLength,
|
|
104
|
-
),
|
|
105
|
-
offsets: {
|
|
106
|
-
children: [],
|
|
107
|
-
offset: 0,
|
|
108
|
-
field: fields.type,
|
|
109
|
-
},
|
|
110
|
-
};
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
if (struct.type === 'hex-string') {
|
|
114
|
-
const hex = (fields.value as string).substring(2);
|
|
115
|
-
const arr = new Uint8Array(hex.length / 2);
|
|
116
|
-
for (let i = 0; i < hex.length; i += 2) {
|
|
117
|
-
const byte = parseInt(hex.substring(i, i + 2), 16);
|
|
118
|
-
arr[i / 2] = byte;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
return {
|
|
122
|
-
bytes: arr,
|
|
123
|
-
offsets: {
|
|
124
|
-
children: [],
|
|
125
|
-
offset: 0,
|
|
126
|
-
field: fields.type,
|
|
127
|
-
},
|
|
128
|
-
};
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
if (struct.type === 'float') {
|
|
132
|
-
const value = fields.value as FloatWithSize;
|
|
133
|
-
if (value.size === '32') {
|
|
134
|
-
const dataView = new DataView(new ArrayBuffer(4));
|
|
135
|
-
dataView.setFloat32(0, value.value);
|
|
136
|
-
return {
|
|
137
|
-
bytes: new Uint8Array(dataView.buffer),
|
|
138
|
-
offsets: {
|
|
139
|
-
children: [],
|
|
140
|
-
offset: 0,
|
|
141
|
-
field: fields.type,
|
|
142
|
-
},
|
|
143
|
-
};
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
const dataView2 = new DataView(new ArrayBuffer(8));
|
|
147
|
-
dataView2.setFloat64(0, value.value);
|
|
148
|
-
return {
|
|
149
|
-
bytes: new Uint8Array(dataView2.buffer),
|
|
150
|
-
offsets: {
|
|
151
|
-
children: [],
|
|
152
|
-
offset: 0,
|
|
153
|
-
field: fields.type,
|
|
154
|
-
},
|
|
155
|
-
};
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
throw new Error('Unexpected type');
|
|
159
|
-
};
|
|
160
|
-
|
|
161
|
-
export const makeMatroskaBytes = (
|
|
162
|
-
fields: PossibleEbmlOrUint8Array,
|
|
163
|
-
): BytesAndOffset => {
|
|
164
|
-
if ('bytes' in fields) {
|
|
165
|
-
return fields;
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
const value = makeFromStructure(fields);
|
|
169
|
-
const header = matroskaToHex(getIdForName(fields.type));
|
|
170
|
-
const size = getVariableInt(value.bytes.length, fields.minVintWidth);
|
|
171
|
-
|
|
172
|
-
const bytes = combineUint8Arrays([header, size, value.bytes]);
|
|
173
|
-
|
|
174
|
-
return {
|
|
175
|
-
bytes,
|
|
176
|
-
offsets: {
|
|
177
|
-
offset: value.offsets.offset,
|
|
178
|
-
field: value.offsets.field,
|
|
179
|
-
children: value.offsets.children.map((c) => {
|
|
180
|
-
return incrementOffsetAndChildren(
|
|
181
|
-
c,
|
|
182
|
-
header.byteLength + size.byteLength,
|
|
183
|
-
);
|
|
184
|
-
}),
|
|
185
|
-
},
|
|
186
|
-
};
|
|
187
|
-
};
|
|
188
|
-
|
|
189
|
-
export const padMatroskaBytes = (
|
|
190
|
-
fields: PossibleEbmlOrUint8Array,
|
|
191
|
-
totalLength: number,
|
|
192
|
-
): BytesAndOffset[] => {
|
|
193
|
-
const regular = makeMatroskaBytes(fields);
|
|
194
|
-
const paddingLength =
|
|
195
|
-
totalLength -
|
|
196
|
-
regular.bytes.byteLength -
|
|
197
|
-
matroskaToHex(matroskaElements.Void).byteLength;
|
|
198
|
-
|
|
199
|
-
if (paddingLength < 0) {
|
|
200
|
-
throw new Error('ooops');
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
const padding = makeMatroskaBytes({
|
|
204
|
-
type: 'Void',
|
|
205
|
-
value: new Uint8Array(paddingLength).fill(0),
|
|
206
|
-
minVintWidth: null,
|
|
207
|
-
});
|
|
208
|
-
|
|
209
|
-
return [
|
|
210
|
-
regular,
|
|
211
|
-
{
|
|
212
|
-
bytes: padding.bytes,
|
|
213
|
-
offsets: incrementOffsetAndChildren(
|
|
214
|
-
padding.offsets,
|
|
215
|
-
regular.bytes.length,
|
|
216
|
-
),
|
|
217
|
-
},
|
|
218
|
-
];
|
|
219
|
-
};
|
|
220
|
-
|
|
221
|
-
export const combineUint8Arrays = (arrays: Uint8Array[]) => {
|
|
222
|
-
if (arrays.length === 0) {
|
|
223
|
-
return new Uint8Array([]);
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
if (arrays.length === 1) {
|
|
227
|
-
return arrays[0];
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
let totalLength = 0;
|
|
231
|
-
for (const array of arrays) {
|
|
232
|
-
totalLength += array.length;
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
const result = new Uint8Array(totalLength);
|
|
236
|
-
let offset = 0;
|
|
237
|
-
for (const array of arrays) {
|
|
238
|
-
result.set(array, offset);
|
|
239
|
-
offset += array.length;
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
return result;
|
|
243
|
-
};
|
|
244
|
-
|
|
245
|
-
export function serializeUint16(value: number): Uint8Array {
|
|
246
|
-
const buffer = new ArrayBuffer(2);
|
|
247
|
-
|
|
248
|
-
const view = new DataView(buffer);
|
|
249
|
-
|
|
250
|
-
view.setUint16(0, value);
|
|
251
|
-
|
|
252
|
-
return new Uint8Array(buffer);
|
|
253
|
-
}
|