@remotion/media-parser 4.0.247 → 4.0.249
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/boxes/avc/key.d.ts +1 -1
- package/dist/boxes/iso-base-media/get-children.d.ts +14 -0
- package/dist/boxes/iso-base-media/get-children.js +39 -0
- package/dist/boxes/iso-base-media/mdat/mdat.d.ts +2 -1
- package/dist/boxes/iso-base-media/mdat/mdat.js +10 -1
- package/dist/boxes/iso-base-media/moov/moov.js +2 -3
- package/dist/boxes/iso-base-media/parse-boxes.d.ts +15 -0
- package/dist/boxes/iso-base-media/parse-boxes.js +129 -0
- package/dist/boxes/iso-base-media/parse-mdat-partially.d.ts +12 -0
- package/dist/boxes/iso-base-media/parse-mdat-partially.js +33 -0
- package/dist/boxes/iso-base-media/process-box.d.ts +2 -21
- package/dist/boxes/iso-base-media/process-box.js +53 -270
- package/dist/boxes/iso-base-media/stsd/mebx.js +2 -3
- package/dist/boxes/iso-base-media/stsd/samples.js +5 -9
- package/dist/boxes/iso-base-media/trak/trak.js +2 -3
- package/dist/boxes/mp3/get-duration.d.ts +2 -0
- package/dist/boxes/mp3/get-duration.js +30 -0
- package/dist/boxes/mp3/get-frame-length.d.ts +13 -0
- package/dist/boxes/mp3/get-frame-length.js +33 -0
- package/dist/boxes/mp3/get-metadata-from-mp3.d.ts +3 -0
- package/dist/boxes/mp3/get-metadata-from-mp3.js +8 -0
- package/dist/boxes/mp3/get-tracks-from-mp3.d.ts +4 -0
- package/dist/boxes/mp3/get-tracks-from-mp3.js +25 -0
- package/dist/boxes/mp3/id3-v1.d.ts +2 -0
- package/dist/boxes/mp3/id3-v1.js +12 -0
- package/dist/boxes/mp3/id3-v2.d.ts +0 -0
- package/dist/boxes/mp3/id3-v2.js +1 -0
- package/dist/boxes/mp3/id3.d.ts +8 -0
- package/dist/boxes/mp3/id3.js +78 -0
- package/dist/boxes/mp3/parse-mp3.d.ts +8 -0
- package/dist/boxes/mp3/parse-mp3.js +57 -0
- package/dist/boxes/mp3/parse-mpeg-header.d.ts +6 -0
- package/dist/boxes/mp3/parse-mpeg-header.js +274 -0
- package/dist/boxes/mp3/samples-per-mpeg-file.d.ts +4 -0
- package/dist/boxes/mp3/samples-per-mpeg-file.js +26 -0
- package/dist/boxes/riff/continue-after-riff-result.d.ts +13 -0
- package/dist/boxes/riff/continue-after-riff-result.js +34 -0
- package/dist/boxes/riff/expect-riff-box.d.ts +3 -1
- package/dist/boxes/riff/expect-riff-box.js +4 -3
- package/dist/boxes/riff/parse-box.d.ts +1 -7
- package/dist/boxes/riff/parse-box.js +4 -120
- package/dist/boxes/riff/parse-list-box.d.ts +3 -1
- package/dist/boxes/riff/parse-list-box.js +4 -3
- package/dist/boxes/riff/parse-riff-body.d.ts +11 -0
- package/dist/boxes/riff/parse-riff-body.js +105 -0
- package/dist/boxes/riff/parse-riff-box.d.ts +3 -1
- package/dist/boxes/riff/parse-riff-box.js +2 -2
- package/dist/boxes/transport-stream/parse-transport-stream.js +30 -41
- package/dist/buffer-iterator.d.ts +6 -0
- package/dist/buffer-iterator.js +21 -0
- package/dist/continue-mdat-routine.d.ts +17 -0
- package/dist/continue-mdat-routine.js +92 -0
- package/dist/emit-available-info.js +38 -24
- package/dist/esm/index.mjs +1820 -1046
- package/dist/file-types/detect-file-type.js +4 -2
- package/dist/get-audio-codec.js +1 -1
- package/dist/get-container.js +5 -1
- package/dist/get-dimensions.d.ts +1 -1
- package/dist/get-dimensions.js +3 -0
- package/dist/get-duration.js +5 -1
- package/dist/get-fields-from-callbacks.js +1 -0
- package/dist/get-fps.js +3 -0
- package/dist/get-is-hdr.js +1 -1
- package/dist/get-keyframes.js +1 -1
- package/dist/get-tracks.d.ts +1 -1
- package/dist/get-tracks.js +10 -3
- package/dist/get-video-codec.js +1 -1
- package/dist/has-all-info.js +4 -3
- package/dist/index.d.ts +20 -2
- package/dist/may-skip-video-data/need-samples-for-fields.js +1 -0
- package/dist/metadata/get-metadata.d.ts +1 -0
- package/dist/metadata/get-metadata.js +16 -1
- package/dist/options.d.ts +12 -5
- package/dist/parse-media.js +48 -43
- package/dist/parse-result.d.ts +16 -1
- package/dist/parse-video.js +9 -10
- package/dist/state/can-skip-tracks.js +1 -0
- package/dist/state/emitted-fields.js +1 -0
- package/dist/state/images.d.ts +9 -0
- package/dist/state/images.js +14 -0
- package/dist/state/mp3.d.ts +11 -0
- package/dist/state/mp3.js +13 -0
- package/dist/state/parser-state.d.ts +13 -2
- package/dist/state/parser-state.js +8 -1
- package/dist/state/sample-callbacks.js +4 -1
- package/dist/state/slow-duration-fps.d.ts +2 -1
- package/dist/state/slow-duration-fps.js +52 -18
- package/dist/throttled-progress.d.ts +14 -0
- package/dist/throttled-progress.js +44 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +3 -3
|
@@ -1,125 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.parseRiff =
|
|
4
|
-
const get_tracks_1 = require("../../get-tracks");
|
|
3
|
+
exports.parseRiff = void 0;
|
|
5
4
|
const has_all_info_1 = require("../../has-all-info");
|
|
6
|
-
const
|
|
7
|
-
const expect_riff_box_1 = require("./expect-riff-box");
|
|
8
|
-
const get_tracks_from_avi_1 = require("./get-tracks-from-avi");
|
|
9
|
-
const traversal_1 = require("./traversal");
|
|
10
|
-
const continueAfterRiffBoxResult = ({ result, structure, iterator, maxOffset, state: options, }) => {
|
|
11
|
-
if (result.type === 'incomplete') {
|
|
12
|
-
return Promise.resolve({
|
|
13
|
-
status: 'incomplete',
|
|
14
|
-
async continueParsing() {
|
|
15
|
-
return Promise.resolve(continueAfterRiffBoxResult({
|
|
16
|
-
result: await result.continueParsing(),
|
|
17
|
-
structure,
|
|
18
|
-
iterator,
|
|
19
|
-
maxOffset,
|
|
20
|
-
state: options,
|
|
21
|
-
}));
|
|
22
|
-
},
|
|
23
|
-
segments: structure,
|
|
24
|
-
skipTo: null,
|
|
25
|
-
});
|
|
26
|
-
}
|
|
27
|
-
if (result.type === 'complete' && result.box) {
|
|
28
|
-
structure.boxes.push(result.box);
|
|
29
|
-
}
|
|
30
|
-
return (0, exports.parseRiffBody)({ iterator, maxOffset, state: options, structure });
|
|
31
|
-
};
|
|
32
|
-
const parseRiffBody = async ({ iterator, structure, maxOffset, state, }) => {
|
|
33
|
-
while (iterator.bytesRemaining() > 0 &&
|
|
34
|
-
iterator.counter.getOffset() < maxOffset) {
|
|
35
|
-
const result = await (0, expect_riff_box_1.expectRiffBox)({
|
|
36
|
-
iterator,
|
|
37
|
-
state,
|
|
38
|
-
structure,
|
|
39
|
-
});
|
|
40
|
-
if (result.type === 'complete' && result.skipTo !== null) {
|
|
41
|
-
return {
|
|
42
|
-
status: 'incomplete',
|
|
43
|
-
skipTo: result.skipTo,
|
|
44
|
-
continueParsing() {
|
|
45
|
-
return Promise.resolve(continueAfterRiffBoxResult({
|
|
46
|
-
iterator,
|
|
47
|
-
maxOffset,
|
|
48
|
-
state,
|
|
49
|
-
result,
|
|
50
|
-
structure,
|
|
51
|
-
}));
|
|
52
|
-
},
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
if (result.type === 'incomplete') {
|
|
56
|
-
return {
|
|
57
|
-
status: 'incomplete',
|
|
58
|
-
async continueParsing() {
|
|
59
|
-
return Promise.resolve(continueAfterRiffBoxResult({
|
|
60
|
-
iterator,
|
|
61
|
-
maxOffset,
|
|
62
|
-
state,
|
|
63
|
-
result: await result.continueParsing(),
|
|
64
|
-
structure,
|
|
65
|
-
}));
|
|
66
|
-
},
|
|
67
|
-
skipTo: null,
|
|
68
|
-
};
|
|
69
|
-
}
|
|
70
|
-
if (result.box === null) {
|
|
71
|
-
continue;
|
|
72
|
-
}
|
|
73
|
-
structure.boxes.push(result.box);
|
|
74
|
-
// When parsing an AVI
|
|
75
|
-
if (result.box.type === 'list-box' && result.box.listType === 'hdrl') {
|
|
76
|
-
const tracks = (0, get_tracks_1.getTracks)(structure, state);
|
|
77
|
-
if (!tracks.videoTracks.some((t) => t.codec === get_tracks_from_avi_1.TO_BE_OVERRIDDEN_LATER)) {
|
|
78
|
-
state.callbacks.tracks.setIsDone();
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
// When parsing a WAV
|
|
82
|
-
if (result.box.type === 'wave-format-box') {
|
|
83
|
-
state.callbacks.tracks.setIsDone();
|
|
84
|
-
}
|
|
85
|
-
if (result.box.type === 'strf-box-video' ||
|
|
86
|
-
result.box.type === 'strf-box-audio') {
|
|
87
|
-
const strh = (0, traversal_1.getStrhBox)(structure.boxes);
|
|
88
|
-
const strf = (0, traversal_1.getStrfBox)(structure.boxes);
|
|
89
|
-
if (!strh || !strf) {
|
|
90
|
-
throw new Error('strh or strf box missing');
|
|
91
|
-
}
|
|
92
|
-
if (strf.type === 'strf-box-audio' && state.onAudioTrack) {
|
|
93
|
-
const audioTrack = (0, get_tracks_from_avi_1.makeAviAudioTrack)({
|
|
94
|
-
index: state.riff.getNextTrackIndex(),
|
|
95
|
-
strf,
|
|
96
|
-
});
|
|
97
|
-
await (0, register_track_1.registerTrack)({
|
|
98
|
-
state,
|
|
99
|
-
track: audioTrack,
|
|
100
|
-
container: 'avi',
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
if (state.onVideoTrack && strf.type === 'strf-box-video') {
|
|
104
|
-
const videoTrack = (0, get_tracks_from_avi_1.makeAviVideoTrack)({
|
|
105
|
-
strh,
|
|
106
|
-
index: state.riff.getNextTrackIndex(),
|
|
107
|
-
strf,
|
|
108
|
-
});
|
|
109
|
-
(0, register_track_1.registerVideoTrackWhenProfileIsAvailable)({
|
|
110
|
-
state,
|
|
111
|
-
track: videoTrack,
|
|
112
|
-
container: 'avi',
|
|
113
|
-
});
|
|
114
|
-
}
|
|
115
|
-
state.riff.incrementNextTrackIndex();
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
return {
|
|
119
|
-
status: 'done',
|
|
120
|
-
};
|
|
121
|
-
};
|
|
122
|
-
exports.parseRiffBody = parseRiffBody;
|
|
5
|
+
const parse_riff_body_1 = require("./parse-riff-body");
|
|
123
6
|
const parseRiff = ({ iterator, state, fields, }) => {
|
|
124
7
|
const riff = iterator.getByteString(4, false);
|
|
125
8
|
if (riff !== 'RIFF') {
|
|
@@ -141,11 +24,12 @@ const parseRiff = ({ iterator, state, fields, }) => {
|
|
|
141
24
|
segments: structure,
|
|
142
25
|
});
|
|
143
26
|
}
|
|
144
|
-
return (0,
|
|
27
|
+
return (0, parse_riff_body_1.parseRiffBody)({
|
|
145
28
|
iterator,
|
|
146
29
|
maxOffset: Infinity,
|
|
147
30
|
state,
|
|
148
31
|
structure,
|
|
32
|
+
fields,
|
|
149
33
|
});
|
|
150
34
|
};
|
|
151
35
|
exports.parseRiff = parseRiff;
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import type { BufferIterator } from '../../buffer-iterator';
|
|
2
|
+
import type { Options, ParseMediaFields } from '../../options';
|
|
2
3
|
import type { ParserState } from '../../state/parser-state';
|
|
3
4
|
import type { RiffBox } from './riff-box';
|
|
4
|
-
export declare const parseListBox: ({ iterator, size, state, }: {
|
|
5
|
+
export declare const parseListBox: ({ iterator, size, state, fields, }: {
|
|
5
6
|
iterator: BufferIterator;
|
|
6
7
|
size: number;
|
|
7
8
|
state: ParserState;
|
|
9
|
+
fields: Options<ParseMediaFields>;
|
|
8
10
|
}) => Promise<RiffBox>;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.parseListBox = void 0;
|
|
4
|
-
const
|
|
5
|
-
const parseListBox = async ({ iterator, size, state, }) => {
|
|
4
|
+
const parse_riff_body_1 = require("./parse-riff-body");
|
|
5
|
+
const parseListBox = async ({ iterator, size, state, fields, }) => {
|
|
6
6
|
const counter = iterator.counter.getOffset();
|
|
7
7
|
const listType = iterator.getByteString(4, false);
|
|
8
8
|
if (listType === 'movi') {
|
|
@@ -12,11 +12,12 @@ const parseListBox = async ({ iterator, size, state, }) => {
|
|
|
12
12
|
type: 'riff',
|
|
13
13
|
boxes: [],
|
|
14
14
|
};
|
|
15
|
-
const result = await (0,
|
|
15
|
+
const result = await (0, parse_riff_body_1.parseRiffBody)({
|
|
16
16
|
structure,
|
|
17
17
|
iterator,
|
|
18
18
|
maxOffset: counter + size,
|
|
19
19
|
state,
|
|
20
|
+
fields,
|
|
20
21
|
});
|
|
21
22
|
if (result.status === 'incomplete') {
|
|
22
23
|
throw new Error(`Should only parse complete boxes (${listType})`);
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { BufferIterator } from '../../buffer-iterator';
|
|
2
|
+
import type { Options, ParseMediaFields } from '../../options';
|
|
3
|
+
import type { ParseResult, RiffStructure } from '../../parse-result';
|
|
4
|
+
import type { ParserState } from '../../state/parser-state';
|
|
5
|
+
export declare const parseRiffBody: ({ iterator, structure, maxOffset, state, fields, }: {
|
|
6
|
+
iterator: BufferIterator;
|
|
7
|
+
structure: RiffStructure;
|
|
8
|
+
maxOffset: number;
|
|
9
|
+
state: ParserState;
|
|
10
|
+
fields: Options<ParseMediaFields>;
|
|
11
|
+
}) => Promise<ParseResult>;
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseRiffBody = void 0;
|
|
4
|
+
const get_tracks_1 = require("../../get-tracks");
|
|
5
|
+
const has_all_info_1 = require("../../has-all-info");
|
|
6
|
+
const register_track_1 = require("../../register-track");
|
|
7
|
+
const continue_after_riff_result_1 = require("./continue-after-riff-result");
|
|
8
|
+
const expect_riff_box_1 = require("./expect-riff-box");
|
|
9
|
+
const get_tracks_from_avi_1 = require("./get-tracks-from-avi");
|
|
10
|
+
const traversal_1 = require("./traversal");
|
|
11
|
+
const parseRiffBody = async ({ iterator, structure, maxOffset, state, fields, }) => {
|
|
12
|
+
while (iterator.bytesRemaining() > 0 &&
|
|
13
|
+
iterator.counter.getOffset() < maxOffset &&
|
|
14
|
+
!(0, has_all_info_1.hasAllInfo)({ fields, state })) {
|
|
15
|
+
const result = await (0, expect_riff_box_1.expectRiffBox)({
|
|
16
|
+
iterator,
|
|
17
|
+
state,
|
|
18
|
+
structure,
|
|
19
|
+
fields,
|
|
20
|
+
});
|
|
21
|
+
if (result.type === 'complete' && result.skipTo !== null) {
|
|
22
|
+
return {
|
|
23
|
+
status: 'incomplete',
|
|
24
|
+
skipTo: result.skipTo,
|
|
25
|
+
continueParsing() {
|
|
26
|
+
return Promise.resolve((0, continue_after_riff_result_1.continueAfterRiffBoxResult)({
|
|
27
|
+
iterator,
|
|
28
|
+
maxOffset,
|
|
29
|
+
state,
|
|
30
|
+
result,
|
|
31
|
+
structure,
|
|
32
|
+
fields,
|
|
33
|
+
}));
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
if (result.type === 'incomplete') {
|
|
38
|
+
return {
|
|
39
|
+
status: 'incomplete',
|
|
40
|
+
async continueParsing() {
|
|
41
|
+
return Promise.resolve((0, continue_after_riff_result_1.continueAfterRiffBoxResult)({
|
|
42
|
+
iterator,
|
|
43
|
+
maxOffset,
|
|
44
|
+
state,
|
|
45
|
+
result: await result.continueParsing(),
|
|
46
|
+
structure,
|
|
47
|
+
fields,
|
|
48
|
+
}));
|
|
49
|
+
},
|
|
50
|
+
skipTo: null,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
if (result.box === null) {
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
structure.boxes.push(result.box);
|
|
57
|
+
// When parsing an AVI
|
|
58
|
+
if (result.box.type === 'list-box' && result.box.listType === 'hdrl') {
|
|
59
|
+
const tracks = (0, get_tracks_1.getTracks)(structure, state);
|
|
60
|
+
if (!tracks.videoTracks.some((t) => t.codec === get_tracks_from_avi_1.TO_BE_OVERRIDDEN_LATER)) {
|
|
61
|
+
state.callbacks.tracks.setIsDone();
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// When parsing a WAV
|
|
65
|
+
if (result.box.type === 'wave-format-box') {
|
|
66
|
+
state.callbacks.tracks.setIsDone();
|
|
67
|
+
}
|
|
68
|
+
if (result.box.type === 'strf-box-video' ||
|
|
69
|
+
result.box.type === 'strf-box-audio') {
|
|
70
|
+
const strh = (0, traversal_1.getStrhBox)(structure.boxes);
|
|
71
|
+
const strf = (0, traversal_1.getStrfBox)(structure.boxes);
|
|
72
|
+
if (!strh || !strf) {
|
|
73
|
+
throw new Error('strh or strf box missing');
|
|
74
|
+
}
|
|
75
|
+
if (strf.type === 'strf-box-audio' && state.onAudioTrack) {
|
|
76
|
+
const audioTrack = (0, get_tracks_from_avi_1.makeAviAudioTrack)({
|
|
77
|
+
index: state.riff.getNextTrackIndex(),
|
|
78
|
+
strf,
|
|
79
|
+
});
|
|
80
|
+
await (0, register_track_1.registerTrack)({
|
|
81
|
+
state,
|
|
82
|
+
track: audioTrack,
|
|
83
|
+
container: 'avi',
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
if (state.onVideoTrack && strf.type === 'strf-box-video') {
|
|
87
|
+
const videoTrack = (0, get_tracks_from_avi_1.makeAviVideoTrack)({
|
|
88
|
+
strh,
|
|
89
|
+
index: state.riff.getNextTrackIndex(),
|
|
90
|
+
strf,
|
|
91
|
+
});
|
|
92
|
+
(0, register_track_1.registerVideoTrackWhenProfileIsAvailable)({
|
|
93
|
+
state,
|
|
94
|
+
track: videoTrack,
|
|
95
|
+
container: 'avi',
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
state.riff.incrementNextTrackIndex();
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return {
|
|
102
|
+
status: 'done',
|
|
103
|
+
};
|
|
104
|
+
};
|
|
105
|
+
exports.parseRiffBody = parseRiffBody;
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import type { BufferIterator } from '../../buffer-iterator';
|
|
2
|
+
import type { Options, ParseMediaFields } from '../../options';
|
|
2
3
|
import type { ParserState } from '../../state/parser-state';
|
|
3
4
|
import type { RiffBox } from './riff-box';
|
|
4
|
-
export declare const parseRiffBox: ({ iterator, size, id, boxes, state, }: {
|
|
5
|
+
export declare const parseRiffBox: ({ iterator, size, id, boxes, state, fields, }: {
|
|
5
6
|
iterator: BufferIterator;
|
|
6
7
|
size: number;
|
|
7
8
|
id: string;
|
|
8
9
|
boxes: RiffBox[];
|
|
9
10
|
state: ParserState;
|
|
11
|
+
fields: Options<ParseMediaFields>;
|
|
10
12
|
}) => Promise<RiffBox>;
|
|
@@ -7,12 +7,12 @@ const parse_isft_1 = require("./parse-isft");
|
|
|
7
7
|
const parse_list_box_1 = require("./parse-list-box");
|
|
8
8
|
const parse_strf_1 = require("./parse-strf");
|
|
9
9
|
const parse_strh_1 = require("./parse-strh");
|
|
10
|
-
const parseRiffBox = ({ iterator, size, id, boxes, state, }) => {
|
|
10
|
+
const parseRiffBox = ({ iterator, size, id, boxes, state, fields, }) => {
|
|
11
11
|
if (id === 'fmt') {
|
|
12
12
|
return Promise.resolve((0, parse_fmt_box_1.parseFmtBox)({ iterator, boxes, size }));
|
|
13
13
|
}
|
|
14
14
|
if (id === 'LIST') {
|
|
15
|
-
return (0, parse_list_box_1.parseListBox)({ iterator, size, state });
|
|
15
|
+
return (0, parse_list_box_1.parseListBox)({ iterator, size, state, fields });
|
|
16
16
|
}
|
|
17
17
|
if (id === 'ISFT') {
|
|
18
18
|
return Promise.resolve((0, parse_isft_1.parseIsft)({ iterator, size }));
|
|
@@ -17,56 +17,45 @@ const parseTransportStream = async ({ iterator, state, streamBuffers, fields, ne
|
|
|
17
17
|
});
|
|
18
18
|
return Promise.resolve({
|
|
19
19
|
status: 'done',
|
|
20
|
-
segments: structure,
|
|
21
20
|
});
|
|
22
21
|
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
fields,
|
|
26
|
-
state,
|
|
27
|
-
})) {
|
|
28
|
-
break;
|
|
29
|
-
}
|
|
30
|
-
if (iterator.bytesRemaining() < 188) {
|
|
31
|
-
return Promise.resolve({
|
|
32
|
-
status: 'incomplete',
|
|
33
|
-
segments: structure,
|
|
34
|
-
skipTo: null,
|
|
35
|
-
continueParsing: () => {
|
|
36
|
-
return (0, exports.parseTransportStream)({
|
|
37
|
-
iterator,
|
|
38
|
-
state,
|
|
39
|
-
streamBuffers,
|
|
40
|
-
fields,
|
|
41
|
-
nextPesHeaderStore,
|
|
42
|
-
});
|
|
43
|
-
},
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
const packet = await (0, parse_packet_1.parsePacket)({
|
|
22
|
+
const continueParsing = () => {
|
|
23
|
+
return (0, exports.parseTransportStream)({
|
|
47
24
|
iterator,
|
|
48
|
-
|
|
25
|
+
state,
|
|
49
26
|
streamBuffers,
|
|
50
|
-
|
|
27
|
+
fields,
|
|
51
28
|
nextPesHeaderStore,
|
|
52
29
|
});
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
30
|
+
};
|
|
31
|
+
if ((0, has_all_info_1.hasAllInfo)({
|
|
32
|
+
fields,
|
|
33
|
+
state,
|
|
34
|
+
})) {
|
|
35
|
+
return Promise.resolve({
|
|
36
|
+
status: 'done',
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
if (iterator.bytesRemaining() < 188) {
|
|
40
|
+
return Promise.resolve({
|
|
41
|
+
status: 'incomplete',
|
|
42
|
+
continueParsing,
|
|
43
|
+
skipTo: null,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
const packet = await (0, parse_packet_1.parsePacket)({
|
|
47
|
+
iterator,
|
|
48
|
+
structure,
|
|
49
|
+
streamBuffers,
|
|
50
|
+
parserState: state,
|
|
51
|
+
nextPesHeaderStore,
|
|
52
|
+
});
|
|
53
|
+
if (packet) {
|
|
54
|
+
structure.boxes.push(packet);
|
|
57
55
|
}
|
|
58
56
|
return Promise.resolve({
|
|
59
|
-
segments: structure,
|
|
60
57
|
status: 'incomplete',
|
|
61
|
-
continueParsing
|
|
62
|
-
return (0, exports.parseTransportStream)({
|
|
63
|
-
iterator,
|
|
64
|
-
state,
|
|
65
|
-
streamBuffers,
|
|
66
|
-
fields,
|
|
67
|
-
nextPesHeaderStore,
|
|
68
|
-
});
|
|
69
|
-
},
|
|
58
|
+
continueParsing,
|
|
70
59
|
skipTo: null,
|
|
71
60
|
});
|
|
72
61
|
};
|
|
@@ -48,6 +48,9 @@ export declare const getArrayBufferIterator: (initialData: Uint8Array, maxBytes:
|
|
|
48
48
|
getPascalString: () => number[];
|
|
49
49
|
getUint(length: number): number;
|
|
50
50
|
getByteString(length: number, trimTrailingZeroes: boolean): string;
|
|
51
|
+
planBytes: (size: number) => {
|
|
52
|
+
discardRest: () => Uint8Array;
|
|
53
|
+
};
|
|
51
54
|
getFloat64: () => number;
|
|
52
55
|
readUntilNullTerminator: () => string;
|
|
53
56
|
getFloat32: () => number;
|
|
@@ -62,5 +65,8 @@ export declare const getArrayBufferIterator: (initialData: Uint8Array, maxBytes:
|
|
|
62
65
|
expectNoMoreBytes: () => void;
|
|
63
66
|
};
|
|
64
67
|
readExpGolomb: () => number;
|
|
68
|
+
startCheckpoint: () => {
|
|
69
|
+
returnToCheckpoint: () => void;
|
|
70
|
+
};
|
|
65
71
|
};
|
|
66
72
|
export type BufferIterator = ReturnType<typeof getArrayBufferIterator>;
|
package/dist/buffer-iterator.js
CHANGED
|
@@ -70,6 +70,14 @@ const getArrayBufferIterator = (initialData, maxBytes) => {
|
|
|
70
70
|
let view = new DataView(data.buffer);
|
|
71
71
|
const counter = makeOffsetCounter();
|
|
72
72
|
let discardAllowed = true;
|
|
73
|
+
const startCheckpoint = () => {
|
|
74
|
+
const checkpoint = counter.getOffset();
|
|
75
|
+
return {
|
|
76
|
+
returnToCheckpoint: () => {
|
|
77
|
+
counter.decrement(counter.getOffset() - checkpoint);
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
};
|
|
73
81
|
const getSlice = (amount) => {
|
|
74
82
|
const value = data.slice(counter.getDiscardedOffset(), counter.getDiscardedOffset() + amount);
|
|
75
83
|
counter.increment(amount);
|
|
@@ -501,6 +509,18 @@ const getArrayBufferIterator = (initialData, maxBytes) => {
|
|
|
501
509
|
}
|
|
502
510
|
return new TextDecoder().decode(bytes).trim();
|
|
503
511
|
},
|
|
512
|
+
planBytes: (size) => {
|
|
513
|
+
const currentOffset = counter.getOffset();
|
|
514
|
+
return {
|
|
515
|
+
discardRest: () => {
|
|
516
|
+
const toDiscard = size - (counter.getOffset() - currentOffset);
|
|
517
|
+
if (toDiscard < 0) {
|
|
518
|
+
throw new Error('read too many bytes');
|
|
519
|
+
}
|
|
520
|
+
return getSlice(toDiscard);
|
|
521
|
+
},
|
|
522
|
+
};
|
|
523
|
+
},
|
|
504
524
|
getFloat64: () => {
|
|
505
525
|
const val = view.getFloat64(counter.getDiscardedOffset());
|
|
506
526
|
counter.increment(8);
|
|
@@ -520,6 +540,7 @@ const getArrayBufferIterator = (initialData, maxBytes) => {
|
|
|
520
540
|
allowDiscard,
|
|
521
541
|
startBox,
|
|
522
542
|
readExpGolomb,
|
|
543
|
+
startCheckpoint,
|
|
523
544
|
};
|
|
524
545
|
};
|
|
525
546
|
exports.getArrayBufferIterator = getArrayBufferIterator;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { BufferIterator } from './buffer-iterator';
|
|
2
|
+
import type { LogLevel } from './log';
|
|
3
|
+
import type { Options, ParseMediaFields } from './options';
|
|
4
|
+
import type { IsoBaseMediaBox, ParseResult } from './parse-result';
|
|
5
|
+
import type { PartialMdatBox } from './parse-video';
|
|
6
|
+
import type { ParserState } from './state/parser-state';
|
|
7
|
+
export declare const continueMdatRoutine: ({ iterator, maxBytes, allowIncompleteBoxes, initialBoxes, state, continueMdat, signal, logLevel, fields, }: {
|
|
8
|
+
iterator: BufferIterator;
|
|
9
|
+
maxBytes: number;
|
|
10
|
+
allowIncompleteBoxes: boolean;
|
|
11
|
+
initialBoxes: IsoBaseMediaBox[];
|
|
12
|
+
state: ParserState;
|
|
13
|
+
continueMdat: PartialMdatBox;
|
|
14
|
+
signal: AbortSignal | null;
|
|
15
|
+
logLevel: LogLevel;
|
|
16
|
+
fields: Options<ParseMediaFields>;
|
|
17
|
+
}) => Promise<ParseResult>;
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.continueMdatRoutine = void 0;
|
|
4
|
+
const parse_boxes_1 = require("./boxes/iso-base-media/parse-boxes");
|
|
5
|
+
const parse_mdat_partially_1 = require("./boxes/iso-base-media/parse-mdat-partially");
|
|
6
|
+
const traversal_1 = require("./boxes/iso-base-media/traversal");
|
|
7
|
+
const has_all_info_1 = require("./has-all-info");
|
|
8
|
+
const may_skip_video_data_1 = require("./may-skip-video-data/may-skip-video-data");
|
|
9
|
+
const continueMdatRoutine = async ({ iterator, maxBytes, allowIncompleteBoxes, initialBoxes, state, continueMdat, signal, logLevel, fields, }) => {
|
|
10
|
+
var _a;
|
|
11
|
+
const initialOffset = iterator.counter.getOffset();
|
|
12
|
+
while (iterator.bytesRemaining() > 0 &&
|
|
13
|
+
iterator.counter.getOffset() - initialOffset < maxBytes) {
|
|
14
|
+
const result = await (0, parse_mdat_partially_1.parseMdatPartially)({
|
|
15
|
+
iterator,
|
|
16
|
+
boxSize: continueMdat.boxSize,
|
|
17
|
+
fileOffset: continueMdat.fileOffset,
|
|
18
|
+
parsedBoxes: initialBoxes,
|
|
19
|
+
state,
|
|
20
|
+
signal,
|
|
21
|
+
});
|
|
22
|
+
if (result.type === 'incomplete') {
|
|
23
|
+
throw new Error('Incomplete boxes are not allowed in this routine');
|
|
24
|
+
}
|
|
25
|
+
if (result.type === 'partial-mdat-box') {
|
|
26
|
+
return {
|
|
27
|
+
status: 'incomplete',
|
|
28
|
+
continueParsing: () => {
|
|
29
|
+
return Promise.resolve((0, exports.continueMdatRoutine)({
|
|
30
|
+
iterator,
|
|
31
|
+
maxBytes,
|
|
32
|
+
allowIncompleteBoxes,
|
|
33
|
+
initialBoxes,
|
|
34
|
+
state,
|
|
35
|
+
continueMdat: result,
|
|
36
|
+
signal,
|
|
37
|
+
logLevel,
|
|
38
|
+
fields,
|
|
39
|
+
}));
|
|
40
|
+
},
|
|
41
|
+
skipTo: null,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
const alreadyHasMdat = (_a = state.structure
|
|
45
|
+
.getStructureOrNull()) === null || _a === void 0 ? void 0 : _a.boxes.find((b) => b.type === 'mdat-box');
|
|
46
|
+
if (result.box.type === 'mdat-box' && alreadyHasMdat) {
|
|
47
|
+
initialBoxes = initialBoxes.filter((b) => b.type !== 'mdat-box');
|
|
48
|
+
initialBoxes.push(result.box);
|
|
49
|
+
iterator.allowDiscard();
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
initialBoxes.push(result.box);
|
|
54
|
+
if ((0, has_all_info_1.hasAllInfo)({ fields, state })) {
|
|
55
|
+
return {
|
|
56
|
+
status: 'done',
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
iterator.removeBytesRead();
|
|
61
|
+
}
|
|
62
|
+
const mdatState = (0, traversal_1.getMdatBox)(initialBoxes);
|
|
63
|
+
const skipped = (mdatState === null || mdatState === void 0 ? void 0 : mdatState.status) === 'samples-skipped' &&
|
|
64
|
+
!(0, may_skip_video_data_1.maySkipVideoData)({ state }) &&
|
|
65
|
+
state.supportsContentRange;
|
|
66
|
+
const buffered = (mdatState === null || mdatState === void 0 ? void 0 : mdatState.status) === 'samples-buffered' && !(0, may_skip_video_data_1.maySkipVideoData)({ state });
|
|
67
|
+
if (skipped || buffered) {
|
|
68
|
+
return {
|
|
69
|
+
status: 'incomplete',
|
|
70
|
+
continueParsing: () => {
|
|
71
|
+
if (buffered) {
|
|
72
|
+
iterator.skipTo(mdatState.fileOffset, false);
|
|
73
|
+
}
|
|
74
|
+
return (0, parse_boxes_1.parseIsoBaseMediaBoxes)({
|
|
75
|
+
iterator,
|
|
76
|
+
maxBytes,
|
|
77
|
+
allowIncompleteBoxes: false,
|
|
78
|
+
initialBoxes,
|
|
79
|
+
state,
|
|
80
|
+
signal,
|
|
81
|
+
logLevel,
|
|
82
|
+
fields,
|
|
83
|
+
});
|
|
84
|
+
},
|
|
85
|
+
skipTo: skipped ? mdatState.fileOffset : null,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
return {
|
|
89
|
+
status: 'done',
|
|
90
|
+
};
|
|
91
|
+
};
|
|
92
|
+
exports.continueMdatRoutine = continueMdatRoutine;
|