@remotion/media-parser 4.0.231 → 4.0.232
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/add-avc-profile-to-track.d.ts +3 -0
- package/dist/add-avc-profile-to-track.js +35 -0
- package/dist/add-new-matroska-tracks.d.ts +6 -1
- package/dist/add-new-matroska-tracks.js +16 -1
- package/dist/boxes/avc/parse-avc.d.ts +18 -0
- package/dist/boxes/avc/parse-avc.js +96 -0
- package/dist/boxes/iso-base-media/make-track.js +3 -3
- package/dist/boxes/iso-base-media/mdat/mdat.d.ts +2 -2
- package/dist/boxes/iso-base-media/mdat/mdat.js +5 -2
- package/dist/boxes/iso-base-media/moov/moov.js +2 -2
- package/dist/boxes/iso-base-media/process-box.d.ts +5 -5
- package/dist/boxes/iso-base-media/process-box.js +38 -37
- package/dist/boxes/iso-base-media/stsd/mebx.js +2 -2
- package/dist/boxes/iso-base-media/stsd/samples.d.ts +2 -2
- package/dist/boxes/iso-base-media/stsd/samples.js +9 -9
- package/dist/boxes/iso-base-media/trak/trak.js +2 -2
- package/dist/boxes/iso-base-media/traversal.d.ts +1 -1
- package/dist/boxes/riff/expect-riff-box.d.ts +16 -0
- package/dist/boxes/riff/expect-riff-box.js +49 -0
- package/dist/boxes/riff/get-tracks-from-avi.d.ts +21 -0
- package/dist/boxes/riff/get-tracks-from-avi.js +108 -0
- package/dist/boxes/riff/is-movi.d.ts +2 -0
- package/dist/boxes/riff/is-movi.js +12 -0
- package/dist/boxes/riff/parse-avih.d.ts +6 -0
- package/dist/boxes/riff/parse-avih.js +32 -0
- package/dist/boxes/riff/parse-box.d.ts +13 -0
- package/dist/boxes/riff/parse-box.js +113 -0
- package/dist/boxes/riff/parse-fmt-box.d.ts +7 -0
- package/dist/boxes/riff/parse-fmt-box.js +33 -0
- package/dist/boxes/riff/parse-list-box.d.ts +8 -0
- package/dist/boxes/riff/parse-list-box.js +30 -0
- package/dist/boxes/riff/parse-movi.d.ts +17 -0
- package/dist/boxes/riff/parse-movi.js +122 -0
- package/dist/boxes/riff/parse-riff-box.d.ts +10 -0
- package/dist/boxes/riff/parse-riff-box.js +33 -0
- package/dist/boxes/riff/parse-strf.d.ts +7 -0
- package/dist/boxes/riff/parse-strf.js +67 -0
- package/dist/boxes/riff/parse-strh.d.ts +6 -0
- package/dist/boxes/riff/parse-strh.js +46 -0
- package/dist/boxes/riff/riff-box.d.ts +81 -0
- package/dist/boxes/riff/riff-box.js +2 -0
- package/dist/boxes/riff/strf.d.ts +7 -0
- package/dist/boxes/riff/strf.js +67 -0
- package/dist/boxes/riff/timescale.d.ts +1 -0
- package/dist/boxes/riff/timescale.js +4 -0
- package/dist/boxes/riff/traversal.d.ts +8 -0
- package/dist/boxes/riff/traversal.js +36 -0
- package/dist/boxes/webm/parse-ebml.js +2 -2
- package/dist/boxes/webm/parse-webm-header.d.ts +2 -2
- package/dist/boxes/webm/parse-webm-header.js +7 -7
- package/dist/boxes/webm/traversal.d.ts +2 -2
- package/dist/buffer-iterator.d.ts +6 -1
- package/dist/buffer-iterator.js +24 -5
- package/dist/create/iso-base-media/create-iso-base-media.js +0 -4
- package/dist/create/matroska/create-matroska-media.js +0 -4
- package/dist/create/media-fn.d.ts +0 -1
- package/dist/create/mp3/create-mp3.d.ts +2 -0
- package/dist/create/mp3/create-mp3.js +49 -0
- package/dist/create/wav/create-wav.d.ts +2 -0
- package/dist/create/wav/create-wav.js +108 -0
- package/dist/emit-available-info.d.ts +2 -2
- package/dist/emit-available-info.js +6 -4
- package/dist/esm/from-node.mjs +2 -1
- package/dist/esm/index.mjs +1487 -431
- package/dist/get-audio-codec.d.ts +3 -3
- package/dist/get-audio-codec.js +2 -2
- package/dist/get-container.d.ts +3 -3
- package/dist/get-container.js +9 -7
- package/dist/get-dimensions.d.ts +3 -3
- package/dist/get-duration.d.ts +3 -3
- package/dist/get-duration.js +32 -14
- package/dist/get-fps.d.ts +3 -3
- package/dist/get-fps.js +31 -4
- package/dist/get-tracks.d.ts +4 -7
- package/dist/get-tracks.js +55 -27
- package/dist/get-video-codec.d.ts +5 -4
- package/dist/get-video-codec.js +38 -10
- package/dist/has-all-info.d.ts +2 -2
- package/dist/has-all-info.js +4 -4
- package/dist/index.d.ts +1 -0
- package/dist/index.js +2 -0
- package/dist/options.d.ts +9 -9
- package/dist/parse-media.js +2 -0
- package/dist/parse-result.d.ts +20 -6
- package/dist/parse-video.d.ts +2 -2
- package/dist/parse-video.js +5 -16
- package/dist/parser-context.d.ts +1 -0
- package/dist/parser-state.d.ts +11 -0
- package/dist/parser-state.js +30 -0
- package/dist/readers/from-node.js +2 -1
- package/dist/register-track.d.ts +13 -0
- package/dist/register-track.js +25 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseStrf = void 0;
|
|
4
|
+
const parseStrfAudio = ({ iterator, size, }) => {
|
|
5
|
+
const box = iterator.startBox(size);
|
|
6
|
+
const formatTag = iterator.getUint16Le();
|
|
7
|
+
const numberOfChannels = iterator.getUint16Le();
|
|
8
|
+
const samplesPerSec = iterator.getUint32Le();
|
|
9
|
+
const avgBytesPerSec = iterator.getUint32Le();
|
|
10
|
+
const blockAlign = iterator.getUint16Le();
|
|
11
|
+
const bitsPerSample = iterator.getUint16Le();
|
|
12
|
+
const cbSize = iterator.getUint16Le();
|
|
13
|
+
box.expectNoMoreBytes();
|
|
14
|
+
return {
|
|
15
|
+
type: 'strf-box-audio',
|
|
16
|
+
avgBytesPerSecond: avgBytesPerSec,
|
|
17
|
+
bitsPerSample,
|
|
18
|
+
blockAlign,
|
|
19
|
+
cbSize,
|
|
20
|
+
formatTag,
|
|
21
|
+
numberOfChannels,
|
|
22
|
+
sampleRate: samplesPerSec,
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
const parseStrfVideo = ({ iterator, size, }) => {
|
|
26
|
+
const box = iterator.startBox(size);
|
|
27
|
+
const biSize = iterator.getUint32Le();
|
|
28
|
+
const width = iterator.getInt32Le();
|
|
29
|
+
const height = iterator.getInt32Le();
|
|
30
|
+
const planes = iterator.getUint16Le();
|
|
31
|
+
const bitCount = iterator.getUint16Le();
|
|
32
|
+
const compression = iterator.getByteString(4);
|
|
33
|
+
const sizeImage = iterator.getUint32Le();
|
|
34
|
+
const xPelsPerMeter = iterator.getInt32Le();
|
|
35
|
+
const yPelsPerMeter = iterator.getInt32Le();
|
|
36
|
+
const clrUsed = iterator.getUint32Le();
|
|
37
|
+
const clrImportant = iterator.getUint32Le();
|
|
38
|
+
box.expectNoMoreBytes();
|
|
39
|
+
return {
|
|
40
|
+
type: 'strf-box-video',
|
|
41
|
+
biSize,
|
|
42
|
+
bitCount,
|
|
43
|
+
clrImportant,
|
|
44
|
+
clrUsed,
|
|
45
|
+
compression,
|
|
46
|
+
height,
|
|
47
|
+
planes,
|
|
48
|
+
sizeImage,
|
|
49
|
+
width,
|
|
50
|
+
xPelsPerMeter,
|
|
51
|
+
yPelsPerMeter,
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
const parseStrf = ({ iterator, size, boxes, }) => {
|
|
55
|
+
const strh = boxes.find((b) => b.type === 'strh-box');
|
|
56
|
+
if (!strh) {
|
|
57
|
+
throw new Error('strh box not found');
|
|
58
|
+
}
|
|
59
|
+
if (strh.fccType === 'vids') {
|
|
60
|
+
return parseStrfVideo({ iterator, size });
|
|
61
|
+
}
|
|
62
|
+
if (strh.fccType === 'auds') {
|
|
63
|
+
return parseStrfAudio({ iterator, size });
|
|
64
|
+
}
|
|
65
|
+
throw new Error(`Unsupported fccType: ${strh.fccType}`);
|
|
66
|
+
};
|
|
67
|
+
exports.parseStrf = parseStrf;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseStrh = void 0;
|
|
4
|
+
const parseStrh = ({ iterator, size, }) => {
|
|
5
|
+
const box = iterator.startBox(size);
|
|
6
|
+
const fccType = iterator.getByteString(4);
|
|
7
|
+
if (fccType !== 'vids' && fccType !== 'auds') {
|
|
8
|
+
throw new Error('Expected AVI handler to be vids / auds');
|
|
9
|
+
}
|
|
10
|
+
const handler = fccType === 'vids' ? iterator.getByteString(4) : iterator.getUint32Le();
|
|
11
|
+
if (typeof handler === 'string' && handler !== 'H264') {
|
|
12
|
+
throw new Error(`Only H264 is supported as a stream type in .avi, got ${handler}`);
|
|
13
|
+
}
|
|
14
|
+
if (fccType === 'auds' && handler !== 1) {
|
|
15
|
+
throw new Error(`Only "1" is supported as a stream type in .avi, got ${handler}`);
|
|
16
|
+
}
|
|
17
|
+
const flags = iterator.getUint32Le();
|
|
18
|
+
const priority = iterator.getUint16Le();
|
|
19
|
+
const language = iterator.getUint16Le();
|
|
20
|
+
const initialFrames = iterator.getUint32Le();
|
|
21
|
+
const scale = iterator.getUint32Le();
|
|
22
|
+
const rate = iterator.getUint32Le();
|
|
23
|
+
const start = iterator.getUint32Le();
|
|
24
|
+
const length = iterator.getUint32Le();
|
|
25
|
+
const suggestedBufferSize = iterator.getUint32Le();
|
|
26
|
+
const quality = iterator.getUint32Le();
|
|
27
|
+
const sampleSize = iterator.getUint32Le();
|
|
28
|
+
box.discardRest();
|
|
29
|
+
return {
|
|
30
|
+
type: 'strh-box',
|
|
31
|
+
fccType,
|
|
32
|
+
handler,
|
|
33
|
+
flags,
|
|
34
|
+
priority,
|
|
35
|
+
initialFrames,
|
|
36
|
+
length,
|
|
37
|
+
quality,
|
|
38
|
+
rate,
|
|
39
|
+
sampleSize,
|
|
40
|
+
scale,
|
|
41
|
+
start,
|
|
42
|
+
suggestedBufferSize,
|
|
43
|
+
language,
|
|
44
|
+
};
|
|
45
|
+
};
|
|
46
|
+
exports.parseStrh = parseStrh;
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
export type WaveFormatBox = {
|
|
2
|
+
type: 'wave-format-box';
|
|
3
|
+
formatTag: 1;
|
|
4
|
+
numberOfChannels: number;
|
|
5
|
+
sampleRate: number;
|
|
6
|
+
blockAlign: number;
|
|
7
|
+
byteRate: number;
|
|
8
|
+
bitsPerSample: number;
|
|
9
|
+
};
|
|
10
|
+
export type ListBox = {
|
|
11
|
+
type: 'list-box';
|
|
12
|
+
listType: string;
|
|
13
|
+
children: RiffBox[];
|
|
14
|
+
};
|
|
15
|
+
export type RiffRegularBox = {
|
|
16
|
+
type: 'riff-box';
|
|
17
|
+
size: number;
|
|
18
|
+
id: string;
|
|
19
|
+
};
|
|
20
|
+
export type AvihBox = {
|
|
21
|
+
type: 'avih-box';
|
|
22
|
+
microSecPerFrame: number;
|
|
23
|
+
maxBytesPerSecond: number;
|
|
24
|
+
paddingGranularity: number;
|
|
25
|
+
flags: number;
|
|
26
|
+
totalFrames: number;
|
|
27
|
+
initialFrames: number;
|
|
28
|
+
streams: number;
|
|
29
|
+
suggestedBufferSize: number;
|
|
30
|
+
width: number;
|
|
31
|
+
height: number;
|
|
32
|
+
};
|
|
33
|
+
export type StrhBox = {
|
|
34
|
+
type: 'strh-box';
|
|
35
|
+
fccType: 'vids' | 'auds';
|
|
36
|
+
handler: 'H264' | number;
|
|
37
|
+
flags: number;
|
|
38
|
+
priority: number;
|
|
39
|
+
initialFrames: number;
|
|
40
|
+
scale: number;
|
|
41
|
+
rate: number;
|
|
42
|
+
start: number;
|
|
43
|
+
length: number;
|
|
44
|
+
suggestedBufferSize: number;
|
|
45
|
+
quality: number;
|
|
46
|
+
sampleSize: number;
|
|
47
|
+
language: number;
|
|
48
|
+
};
|
|
49
|
+
export type StrfBoxVideo = {
|
|
50
|
+
type: 'strf-box-video';
|
|
51
|
+
biSize: number;
|
|
52
|
+
width: number;
|
|
53
|
+
height: number;
|
|
54
|
+
planes: number;
|
|
55
|
+
bitCount: number;
|
|
56
|
+
compression: string;
|
|
57
|
+
sizeImage: number;
|
|
58
|
+
xPelsPerMeter: number;
|
|
59
|
+
yPelsPerMeter: number;
|
|
60
|
+
clrUsed: number;
|
|
61
|
+
clrImportant: number;
|
|
62
|
+
};
|
|
63
|
+
export type StrfBoxAudio = {
|
|
64
|
+
type: 'strf-box-audio';
|
|
65
|
+
formatTag: number;
|
|
66
|
+
numberOfChannels: number;
|
|
67
|
+
sampleRate: number;
|
|
68
|
+
avgBytesPerSecond: number;
|
|
69
|
+
blockAlign: number;
|
|
70
|
+
bitsPerSample: number;
|
|
71
|
+
cbSize: number;
|
|
72
|
+
};
|
|
73
|
+
export type RiffHeader = {
|
|
74
|
+
type: 'riff-header';
|
|
75
|
+
fileSize: number;
|
|
76
|
+
fileType: string;
|
|
77
|
+
};
|
|
78
|
+
export type MoviBox = {
|
|
79
|
+
type: 'movi-box';
|
|
80
|
+
};
|
|
81
|
+
export type RiffBox = RiffRegularBox | WaveFormatBox | RiffHeader | ListBox | AvihBox | StrhBox | StrfBoxVideo | StrfBoxAudio | MoviBox;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseStrf = void 0;
|
|
4
|
+
const parseStrfAudio = ({ iterator, size, }) => {
|
|
5
|
+
const box = iterator.startBox(size);
|
|
6
|
+
const formatTag = iterator.getUint16Le();
|
|
7
|
+
const numberOfChannels = iterator.getUint16Le();
|
|
8
|
+
const samplesPerSec = iterator.getUint32Le();
|
|
9
|
+
const avgBytesPerSec = iterator.getUint32Le();
|
|
10
|
+
const blockAlign = iterator.getUint16Le();
|
|
11
|
+
const bitsPerSample = iterator.getUint16Le();
|
|
12
|
+
const cbSize = iterator.getUint16Le();
|
|
13
|
+
box.expectNoMoreBytes();
|
|
14
|
+
return {
|
|
15
|
+
type: 'strf-box-audio',
|
|
16
|
+
avgBytesPerSecond: avgBytesPerSec,
|
|
17
|
+
bitsPerSample,
|
|
18
|
+
blockAlign,
|
|
19
|
+
cbSize,
|
|
20
|
+
formatTag,
|
|
21
|
+
numberOfChannels,
|
|
22
|
+
sampleRate: samplesPerSec,
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
const parseStrfVideo = ({ iterator, size, }) => {
|
|
26
|
+
const box = iterator.startBox(size);
|
|
27
|
+
const biSize = iterator.getUint32Le();
|
|
28
|
+
const width = iterator.getInt32Le();
|
|
29
|
+
const height = iterator.getInt32Le();
|
|
30
|
+
const planes = iterator.getUint16Le();
|
|
31
|
+
const bitCount = iterator.getUint16Le();
|
|
32
|
+
const compression = iterator.getByteString(4);
|
|
33
|
+
const sizeImage = iterator.getUint32Le();
|
|
34
|
+
const xPelsPerMeter = iterator.getInt32Le();
|
|
35
|
+
const yPelsPerMeter = iterator.getInt32Le();
|
|
36
|
+
const clrUsed = iterator.getUint32Le();
|
|
37
|
+
const clrImportant = iterator.getUint32Le();
|
|
38
|
+
box.expectNoMoreBytes();
|
|
39
|
+
return {
|
|
40
|
+
type: 'strf-box-video',
|
|
41
|
+
biSize,
|
|
42
|
+
bitCount,
|
|
43
|
+
clrImportant,
|
|
44
|
+
clrUsed,
|
|
45
|
+
compression,
|
|
46
|
+
height,
|
|
47
|
+
planes,
|
|
48
|
+
sizeImage,
|
|
49
|
+
width,
|
|
50
|
+
xPelsPerMeter,
|
|
51
|
+
yPelsPerMeter,
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
const parseStrf = ({ iterator, size, boxes, }) => {
|
|
55
|
+
const strh = boxes.find((b) => b.type === 'strh-box');
|
|
56
|
+
if (!strh) {
|
|
57
|
+
throw new Error('strh box not found');
|
|
58
|
+
}
|
|
59
|
+
if (strh.fccType === 'vids') {
|
|
60
|
+
return parseStrfVideo({ iterator, size });
|
|
61
|
+
}
|
|
62
|
+
if (strh.fccType === 'auds') {
|
|
63
|
+
return parseStrfAudio({ iterator, size });
|
|
64
|
+
}
|
|
65
|
+
throw new Error(`Unsupported fccType: ${strh.fccType}`);
|
|
66
|
+
};
|
|
67
|
+
exports.parseStrf = parseStrf;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const MEDIA_PARSER_RIFF_TIMESCALE = 1000000;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { RiffStructure } from '../../parse-result';
|
|
2
|
+
import type { AvihBox, ListBox, RiffBox, StrfBoxAudio, StrfBoxVideo, StrhBox } from './riff-box';
|
|
3
|
+
export declare const isRiffAvi: (structure: RiffStructure) => boolean;
|
|
4
|
+
export declare const getHdlrBox: (structure: RiffStructure) => ListBox | null;
|
|
5
|
+
export declare const getAvihBox: (structure: RiffStructure) => AvihBox | null;
|
|
6
|
+
export declare const getStrlBoxes: (structure: RiffStructure) => ListBox[];
|
|
7
|
+
export declare const getStrhBox: (strlBoxChildren: RiffBox[]) => StrhBox | null;
|
|
8
|
+
export declare const getStrfBox: (strlBoxChildren: RiffBox[]) => StrfBoxAudio | StrfBoxVideo | null;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getStrfBox = exports.getStrhBox = exports.getStrlBoxes = exports.getAvihBox = exports.getHdlrBox = exports.isRiffAvi = void 0;
|
|
4
|
+
const isRiffAvi = (structure) => {
|
|
5
|
+
return structure.boxes.some((box) => box.type === 'riff-header' && box.fileType === 'AVI');
|
|
6
|
+
};
|
|
7
|
+
exports.isRiffAvi = isRiffAvi;
|
|
8
|
+
const getHdlrBox = (structure) => {
|
|
9
|
+
return structure.boxes.find((box) => box.type === 'list-box' && box.listType === 'hdrl');
|
|
10
|
+
};
|
|
11
|
+
exports.getHdlrBox = getHdlrBox;
|
|
12
|
+
const getAvihBox = (structure) => {
|
|
13
|
+
const hdlrBox = (0, exports.getHdlrBox)(structure);
|
|
14
|
+
if (!hdlrBox) {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
return hdlrBox.children.find((box) => box.type === 'avih-box');
|
|
18
|
+
};
|
|
19
|
+
exports.getAvihBox = getAvihBox;
|
|
20
|
+
const getStrlBoxes = (structure) => {
|
|
21
|
+
const hdlrBox = (0, exports.getHdlrBox)(structure);
|
|
22
|
+
if (!hdlrBox) {
|
|
23
|
+
return [];
|
|
24
|
+
}
|
|
25
|
+
return hdlrBox.children.filter((box) => box.type === 'list-box' && box.listType === 'strl');
|
|
26
|
+
};
|
|
27
|
+
exports.getStrlBoxes = getStrlBoxes;
|
|
28
|
+
const getStrhBox = (strlBoxChildren) => {
|
|
29
|
+
return strlBoxChildren.find((box) => box.type === 'strh-box');
|
|
30
|
+
};
|
|
31
|
+
exports.getStrhBox = getStrhBox;
|
|
32
|
+
const getStrfBox = (strlBoxChildren) => {
|
|
33
|
+
var _a;
|
|
34
|
+
return ((_a = strlBoxChildren.find((box) => box.type === 'strf-box-audio' || box.type === 'strf-box-video')) !== null && _a !== void 0 ? _a : null);
|
|
35
|
+
};
|
|
36
|
+
exports.getStrfBox = getStrfBox;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.postprocessEbml = exports.parseEbml = void 0;
|
|
4
|
-
const
|
|
4
|
+
const register_track_1 = require("../../register-track");
|
|
5
5
|
const get_sample_from_block_1 = require("./get-sample-from-block");
|
|
6
6
|
const make_track_1 = require("./make-track");
|
|
7
7
|
const all_segments_1 = require("./segments/all-segments");
|
|
@@ -115,7 +115,7 @@ const postprocessEbml = async ({ offset, ebml, parserContext, }) => {
|
|
|
115
115
|
timescale: parserContext.parserState.getTimescale(),
|
|
116
116
|
});
|
|
117
117
|
if (track) {
|
|
118
|
-
await (0,
|
|
118
|
+
await (0, register_track_1.registerTrack)({
|
|
119
119
|
state: parserContext.parserState,
|
|
120
120
|
options: parserContext,
|
|
121
121
|
track,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type { BufferIterator } from '../../buffer-iterator';
|
|
2
|
-
import type { ParseResult } from '../../parse-result';
|
|
2
|
+
import type { MatroskaStructure, ParseResult } from '../../parse-result';
|
|
3
3
|
import type { ParserContext } from '../../parser-context';
|
|
4
|
-
export declare const parseWebm: (counter: BufferIterator, parserContext: ParserContext) => Promise<ParseResult
|
|
4
|
+
export declare const parseWebm: (counter: BufferIterator, parserContext: ParserContext) => Promise<ParseResult<MatroskaStructure>>;
|
|
@@ -2,33 +2,33 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.parseWebm = void 0;
|
|
4
4
|
const parse_children_1 = require("./segments/parse-children");
|
|
5
|
-
const continueAfterMatroskaResult = (result,
|
|
5
|
+
const continueAfterMatroskaResult = (result, structure) => {
|
|
6
6
|
if (result.status === 'done') {
|
|
7
7
|
return {
|
|
8
8
|
status: 'done',
|
|
9
|
-
segments:
|
|
9
|
+
segments: structure,
|
|
10
10
|
};
|
|
11
11
|
}
|
|
12
12
|
return {
|
|
13
13
|
status: 'incomplete',
|
|
14
|
-
segments:
|
|
14
|
+
segments: structure,
|
|
15
15
|
continueParsing: async () => {
|
|
16
16
|
const newResult = await result.continueParsing();
|
|
17
|
-
return continueAfterMatroskaResult(newResult,
|
|
17
|
+
return continueAfterMatroskaResult(newResult, structure);
|
|
18
18
|
},
|
|
19
19
|
skipTo: null,
|
|
20
20
|
};
|
|
21
21
|
};
|
|
22
22
|
// Parsing according to https://darkcoding.net/software/reading-mediarecorders-webm-opus-output/
|
|
23
23
|
const parseWebm = async (counter, parserContext) => {
|
|
24
|
-
const
|
|
24
|
+
const structure = { type: 'matroska', boxes: [] };
|
|
25
25
|
const results = await (0, parse_children_1.expectChildren)({
|
|
26
26
|
iterator: counter,
|
|
27
27
|
length: Infinity,
|
|
28
|
-
children,
|
|
28
|
+
children: structure.boxes,
|
|
29
29
|
parserContext,
|
|
30
30
|
startOffset: counter.counter.getOffset(),
|
|
31
31
|
});
|
|
32
|
-
return continueAfterMatroskaResult(results,
|
|
32
|
+
return continueAfterMatroskaResult(results, structure);
|
|
33
33
|
};
|
|
34
34
|
exports.parseWebm = parseWebm;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { MatroskaSegment } from './segments';
|
|
2
2
|
import type { AudioSegment, ClusterSegment, CodecIdSegment, ColourSegment, DisplayHeightSegment, DisplayWidthSegment, HeightSegment, MainSegment, MatrixCoefficientsSegment, PrimariesSegment, RangeSegment, TimestampScaleSegment, TrackEntry, TrackTypeSegment, TransferCharacteristicsSegment, VideoSegment, WidthSegment } from './segments/all-segments';
|
|
3
|
-
export declare const getMainSegment: (segments:
|
|
3
|
+
export declare const getMainSegment: (segments: MatroskaSegment[]) => MainSegment | null;
|
|
4
4
|
export declare const getTrackNumber: (track: TrackEntry) => import("./segments/all-segments").UintWithSize | null;
|
|
5
5
|
export declare const getTrackCodec: (track: TrackEntry) => CodecIdSegment | null;
|
|
6
6
|
export declare const getTrackTimestampScale: (track: TrackEntry) => import("./segments/all-segments").FloatWithSize | null;
|
|
@@ -37,9 +37,10 @@ export declare const getArrayBufferIterator: (initialData: Uint8Array, maxBytes:
|
|
|
37
37
|
getEBML: () => number;
|
|
38
38
|
getInt8: () => number;
|
|
39
39
|
getUint16: () => number;
|
|
40
|
+
getUint16Le: () => number;
|
|
40
41
|
getUint24: () => number;
|
|
41
42
|
getInt16: () => number;
|
|
42
|
-
getUint32: (
|
|
43
|
+
getUint32: () => number;
|
|
43
44
|
getUint64: (littleEndian?: boolean) => bigint;
|
|
44
45
|
getFixedPointUnsigned1616Number: () => number;
|
|
45
46
|
getFixedPointSigned1616Number: () => number;
|
|
@@ -56,5 +57,9 @@ export declare const getArrayBufferIterator: (initialData: Uint8Array, maxBytes:
|
|
|
56
57
|
isMp3: () => boolean;
|
|
57
58
|
disallowDiscard: () => void;
|
|
58
59
|
allowDiscard: () => void;
|
|
60
|
+
startBox: (size: number) => {
|
|
61
|
+
discardRest: () => void;
|
|
62
|
+
expectNoMoreBytes: () => void;
|
|
63
|
+
};
|
|
59
64
|
};
|
|
60
65
|
export type BufferIterator = ReturnType<typeof getArrayBufferIterator>;
|
package/dist/buffer-iterator.js
CHANGED
|
@@ -89,6 +89,9 @@ const getArrayBufferIterator = (initialData, maxBytes) => {
|
|
|
89
89
|
const allowDiscard = () => {
|
|
90
90
|
discardAllowed = true;
|
|
91
91
|
};
|
|
92
|
+
const discard = (length) => {
|
|
93
|
+
counter.increment(length);
|
|
94
|
+
};
|
|
92
95
|
const getUint8 = () => {
|
|
93
96
|
const val = view.getUint8(counter.getDiscardedOffset());
|
|
94
97
|
counter.increment(1);
|
|
@@ -142,8 +145,8 @@ const getArrayBufferIterator = (initialData, maxBytes) => {
|
|
|
142
145
|
}
|
|
143
146
|
return lastInt;
|
|
144
147
|
};
|
|
145
|
-
const getUint32 = (
|
|
146
|
-
const val = view.getUint32(counter.getDiscardedOffset()
|
|
148
|
+
const getUint32 = () => {
|
|
149
|
+
const val = view.getUint32(counter.getDiscardedOffset());
|
|
147
150
|
counter.increment(4);
|
|
148
151
|
return val;
|
|
149
152
|
};
|
|
@@ -152,6 +155,18 @@ const getArrayBufferIterator = (initialData, maxBytes) => {
|
|
|
152
155
|
counter.increment(8);
|
|
153
156
|
return val;
|
|
154
157
|
};
|
|
158
|
+
const startBox = (size) => {
|
|
159
|
+
const startOffset = counter.getOffset();
|
|
160
|
+
return {
|
|
161
|
+
discardRest: () => discard(size - (counter.getOffset() - startOffset)),
|
|
162
|
+
expectNoMoreBytes: () => {
|
|
163
|
+
const remaining = size - (counter.getOffset() - startOffset);
|
|
164
|
+
if (remaining !== 0) {
|
|
165
|
+
throw new Error('expected 0 bytes, got ' + remaining);
|
|
166
|
+
}
|
|
167
|
+
},
|
|
168
|
+
};
|
|
169
|
+
};
|
|
155
170
|
const getUint32Le = () => {
|
|
156
171
|
const val = view.getUint32(counter.getDiscardedOffset(), true);
|
|
157
172
|
counter.increment(4);
|
|
@@ -300,9 +315,7 @@ const getArrayBufferIterator = (initialData, maxBytes) => {
|
|
|
300
315
|
leb128,
|
|
301
316
|
removeBytesRead,
|
|
302
317
|
isWebm,
|
|
303
|
-
discard
|
|
304
|
-
counter.increment(length);
|
|
305
|
-
},
|
|
318
|
+
discard,
|
|
306
319
|
getEightByteNumber,
|
|
307
320
|
getFourByteNumber,
|
|
308
321
|
getSlice,
|
|
@@ -414,6 +427,11 @@ const getArrayBufferIterator = (initialData, maxBytes) => {
|
|
|
414
427
|
counter.increment(2);
|
|
415
428
|
return val;
|
|
416
429
|
},
|
|
430
|
+
getUint16Le: () => {
|
|
431
|
+
const val = view.getUint16(counter.getDiscardedOffset(), true);
|
|
432
|
+
counter.increment(2);
|
|
433
|
+
return val;
|
|
434
|
+
},
|
|
417
435
|
getUint24: () => {
|
|
418
436
|
const val1 = view.getUint8(counter.getDiscardedOffset());
|
|
419
437
|
const val2 = view.getUint8(counter.getDiscardedOffset() + 1);
|
|
@@ -472,6 +490,7 @@ const getArrayBufferIterator = (initialData, maxBytes) => {
|
|
|
472
490
|
isMp3,
|
|
473
491
|
disallowDiscard,
|
|
474
492
|
allowDiscard,
|
|
493
|
+
startBox,
|
|
475
494
|
};
|
|
476
495
|
};
|
|
477
496
|
exports.getArrayBufferIterator = getArrayBufferIterator;
|
|
@@ -158,10 +158,6 @@ const createIsoBaseMedia = async ({ writer, onBytesProgress, onMillisecondsProgr
|
|
|
158
158
|
log_1.Log.verbose(logLevel, 'All write operations done. Waiting for finish...');
|
|
159
159
|
await w.waitForFinish();
|
|
160
160
|
},
|
|
161
|
-
updateDuration: (duration) => {
|
|
162
|
-
operationProm.current = operationProm.current.then(() => updateDuration(duration));
|
|
163
|
-
return operationProm.current;
|
|
164
|
-
},
|
|
165
161
|
};
|
|
166
162
|
};
|
|
167
163
|
exports.createIsoBaseMedia = createIsoBaseMedia;
|
|
@@ -160,10 +160,6 @@ const createMatroskaMedia = async ({ writer, onBytesProgress, onMillisecondsProg
|
|
|
160
160
|
operationProm.current = operationProm.current.then(() => addSample({ chunk, trackNumber, isVideo }));
|
|
161
161
|
return operationProm.current;
|
|
162
162
|
},
|
|
163
|
-
updateDuration: (duration) => {
|
|
164
|
-
operationProm.current = operationProm.current.then(() => updateDuration(duration));
|
|
165
|
-
return operationProm.current;
|
|
166
|
-
},
|
|
167
163
|
addTrack: (track) => {
|
|
168
164
|
const trackNumber = currentTracks.length + 1;
|
|
169
165
|
operationProm.current = operationProm.current.then(() => addTrack({ ...track, trackNumber }));
|
|
@@ -12,7 +12,6 @@ export type MediaFn = {
|
|
|
12
12
|
timescale: number;
|
|
13
13
|
codecPrivate: Uint8Array | null;
|
|
14
14
|
}) => Promise<void>;
|
|
15
|
-
updateDuration: (duration: number) => Promise<void>;
|
|
16
15
|
addTrack: (track: Omit<MakeTrackAudio, 'trackNumber'> | Omit<MakeTrackVideo, 'trackNumber'>) => Promise<{
|
|
17
16
|
trackNumber: number;
|
|
18
17
|
}>;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createMp3 = void 0;
|
|
4
|
+
const log_1 = require("../../log");
|
|
5
|
+
const createMp3 = async ({ filename, logLevel, onBytesProgress, onMillisecondsProgress, writer, }) => {
|
|
6
|
+
const w = await writer.createContent({ filename, mimeType: 'audio/mpeg' });
|
|
7
|
+
const operationProm = { current: Promise.resolve() };
|
|
8
|
+
const addSample = async (chunk) => {
|
|
9
|
+
var _a;
|
|
10
|
+
await w.write(chunk.data);
|
|
11
|
+
onMillisecondsProgress(chunk.timestamp + ((_a = chunk.duration) !== null && _a !== void 0 ? _a : 0));
|
|
12
|
+
onBytesProgress(w.getWrittenByteCount());
|
|
13
|
+
};
|
|
14
|
+
const waitForFinishPromises = [];
|
|
15
|
+
return {
|
|
16
|
+
save: () => {
|
|
17
|
+
return w.save();
|
|
18
|
+
},
|
|
19
|
+
remove: () => {
|
|
20
|
+
return w.remove();
|
|
21
|
+
},
|
|
22
|
+
addSample: ({ chunk, trackNumber }) => {
|
|
23
|
+
if (trackNumber !== 1) {
|
|
24
|
+
throw new Error('Only one track supported for WAV');
|
|
25
|
+
}
|
|
26
|
+
operationProm.current = operationProm.current.then(() => addSample(chunk));
|
|
27
|
+
return operationProm.current;
|
|
28
|
+
},
|
|
29
|
+
updateTrackSampleRate: () => {
|
|
30
|
+
throw new Error('updateTrackSampleRate() not implemented for WAV encoder');
|
|
31
|
+
},
|
|
32
|
+
addWaitForFinishPromise(promise) {
|
|
33
|
+
waitForFinishPromises.push(promise);
|
|
34
|
+
},
|
|
35
|
+
async waitForFinish() {
|
|
36
|
+
log_1.Log.verbose(logLevel, 'All write operations queued. Waiting for finish...');
|
|
37
|
+
await Promise.all(waitForFinishPromises.map((p) => p()));
|
|
38
|
+
await operationProm.current;
|
|
39
|
+
await w.waitForFinish();
|
|
40
|
+
},
|
|
41
|
+
addTrack: (track) => {
|
|
42
|
+
if (track.type !== 'audio') {
|
|
43
|
+
throw new Error('Only audio tracks supported for WAV');
|
|
44
|
+
}
|
|
45
|
+
return Promise.resolve({ trackNumber: 1 });
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
exports.createMp3 = createMp3;
|