@remotion/media-parser 4.0.288 → 4.0.289
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/containers/aac/get-seeking-byte.d.ts +6 -0
- package/dist/containers/aac/get-seeking-byte.js +30 -0
- package/dist/containers/aac/parse-aac.js +23 -18
- package/dist/containers/aac/seeking-hints.d.ts +13 -0
- package/dist/containers/aac/seeking-hints.js +14 -0
- package/dist/containers/flac/get-channel-count.d.ts +1 -1
- package/dist/containers/flac/get-seeking-byte.d.ts +1 -2
- package/dist/containers/flac/get-seeking-byte.js +6 -2
- package/dist/containers/flac/parse-flac-frame.js +18 -17
- package/dist/containers/flac/parse-flac.js +5 -25
- package/dist/containers/flac/seeking-hints.d.ts +4 -1
- package/dist/containers/flac/seeking-hints.js +2 -1
- package/dist/containers/iso-base-media/get-children.d.ts +2 -1
- package/dist/containers/iso-base-media/get-children.js +2 -1
- package/dist/containers/iso-base-media/get-mfra-seeking-box.js +1 -0
- package/dist/containers/iso-base-media/get-moov-atom.js +2 -1
- package/dist/containers/iso-base-media/get-video-codec-from-iso-track.d.ts +1 -1
- package/dist/containers/iso-base-media/mdat/mdat.js +26 -33
- package/dist/containers/iso-base-media/moov/moov.d.ts +2 -1
- package/dist/containers/iso-base-media/moov/moov.js +2 -1
- package/dist/containers/iso-base-media/parse-boxes.js +1 -0
- package/dist/containers/iso-base-media/process-box.d.ts +2 -1
- package/dist/containers/iso-base-media/process-box.js +10 -4
- package/dist/containers/iso-base-media/stsd/mebx.d.ts +2 -1
- package/dist/containers/iso-base-media/stsd/mebx.js +2 -1
- package/dist/containers/iso-base-media/stsd/samples.d.ts +4 -2
- package/dist/containers/iso-base-media/stsd/samples.js +7 -2
- package/dist/containers/iso-base-media/stsd/stsd.d.ts +2 -1
- package/dist/containers/iso-base-media/stsd/stsd.js +2 -1
- package/dist/containers/iso-base-media/trak/trak.d.ts +2 -1
- package/dist/containers/iso-base-media/trak/trak.js +2 -1
- package/dist/containers/mp3/audio-sample-from-cbr.d.ts +11 -0
- package/dist/containers/mp3/audio-sample-from-cbr.js +35 -0
- package/dist/containers/mp3/get-duration.js +33 -6
- package/dist/containers/mp3/get-seeking-byte.d.ts +6 -0
- package/dist/containers/mp3/get-seeking-byte.js +49 -0
- package/dist/containers/mp3/parse-mp3.js +9 -0
- package/dist/containers/mp3/parse-mpeg-header.js +74 -263
- package/dist/containers/mp3/parse-packet-header.d.ts +30 -0
- package/dist/containers/mp3/parse-packet-header.js +258 -0
- package/dist/containers/mp3/parse-xing.d.ts +19 -0
- package/dist/containers/mp3/parse-xing.js +120 -0
- package/dist/containers/mp3/seek/audio-sample-from-cbr.d.ts +16 -0
- package/dist/containers/mp3/seek/audio-sample-from-cbr.js +35 -0
- package/dist/containers/mp3/seek/audio-sample-from-vbr.d.ts +8 -0
- package/dist/containers/mp3/seek/audio-sample-from-vbr.js +47 -0
- package/dist/containers/mp3/seek/get-approximate-byte-from-bitrate.d.ts +9 -0
- package/dist/containers/mp3/seek/get-approximate-byte-from-bitrate.js +28 -0
- package/dist/containers/mp3/seek/get-byte-from-observed-samples.d.ts +6 -0
- package/dist/containers/mp3/seek/get-byte-from-observed-samples.js +27 -0
- package/dist/containers/mp3/seek/get-seek-point-from-xing.d.ts +7 -0
- package/dist/containers/mp3/seek/get-seek-point-from-xing.js +29 -0
- package/dist/containers/mp3/seek/wait-until-syncword.d.ts +4 -0
- package/dist/containers/mp3/seek/wait-until-syncword.js +25 -0
- package/dist/containers/mp3/seeking-hints.d.ts +24 -0
- package/dist/containers/mp3/seeking-hints.js +21 -0
- package/dist/containers/riff/expect-riff-box.d.ts +6 -1
- package/dist/containers/riff/expect-riff-box.js +37 -27
- package/dist/containers/riff/get-seeking-byte.d.ts +8 -0
- package/dist/containers/riff/get-seeking-byte.js +56 -0
- package/dist/containers/riff/has-index.d.ts +2 -0
- package/dist/containers/riff/has-index.js +8 -0
- package/dist/containers/riff/parse-avih.js +3 -0
- package/dist/containers/riff/parse-idx1.d.ts +6 -0
- package/dist/containers/riff/parse-idx1.js +47 -0
- package/dist/containers/riff/parse-list-box.d.ts +4 -2
- package/dist/containers/riff/parse-list-box.js +8 -3
- package/dist/containers/riff/parse-movi.js +35 -40
- package/dist/containers/riff/parse-riff-body.js +5 -1
- package/dist/containers/riff/parse-riff-box.d.ts +4 -2
- package/dist/containers/riff/parse-riff-box.js +10 -3
- package/dist/containers/riff/riff-box.d.ts +14 -1
- package/dist/containers/riff/seek/fetch-idx1.d.ts +15 -0
- package/dist/containers/riff/seek/fetch-idx1.js +38 -0
- package/dist/containers/riff/seeking-hints.d.ts +23 -0
- package/dist/containers/riff/seeking-hints.js +36 -0
- package/dist/containers/transport-stream/handle-aac-packet.js +4 -8
- package/dist/containers/transport-stream/handle-avc-packet.js +4 -8
- package/dist/containers/wav/get-duration-from-wav.js +1 -10
- package/dist/containers/wav/parse-media-section.js +14 -18
- package/dist/containers/webm/parse-ebml.js +3 -16
- package/dist/containers/webm/seek/seeking-hints.js +1 -1
- package/dist/emit-available-info.js +8 -8
- package/dist/esm/index.mjs +1479 -383
- package/dist/esm/worker-server-entry.mjs +1475 -379
- package/dist/esm/worker-web-entry.mjs +1475 -379
- package/dist/find-last-keyframe.d.ts +5 -0
- package/dist/find-last-keyframe.js +18 -0
- package/dist/get-seeking-byte.d.ts +3 -1
- package/dist/get-seeking-byte.js +45 -7
- package/dist/get-seeking-hints.d.ts +12 -1
- package/dist/get-seeking-hints.js +40 -9
- package/dist/index.d.ts +56 -8
- package/dist/internal-parse-media.js +6 -0
- package/dist/parse-loop.js +15 -0
- package/dist/seeking-hints.d.ts +5 -1
- package/dist/set-seeking-hints.js +28 -8
- package/dist/state/aac-state.d.ts +6 -0
- package/dist/state/aac-state.js +7 -2
- package/dist/state/flac-state.d.ts +6 -0
- package/dist/state/flac-state.js +3 -0
- package/dist/state/keyframes.d.ts +1 -2
- package/dist/state/keyframes.js +2 -2
- package/dist/state/matroska/lazy-cues-fetch.js +13 -1
- package/dist/state/parser-state.d.ts +52 -6
- package/dist/state/parser-state.js +6 -6
- package/dist/state/riff/lazy-idx1-fetch.d.ts +30 -0
- package/dist/state/riff/lazy-idx1-fetch.js +63 -0
- package/dist/state/riff/riff-keyframes.d.ts +10 -0
- package/dist/state/riff/riff-keyframes.js +26 -0
- package/dist/state/riff/sample-counter.d.ts +12 -0
- package/dist/state/riff/sample-counter.js +52 -0
- package/dist/state/riff.d.ts +41 -1
- package/dist/state/riff.js +12 -1
- package/dist/state/sample-callbacks.d.ts +3 -4
- package/dist/state/sample-callbacks.js +3 -16
- package/dist/state/samples-observed/slow-duration-fps.d.ts +3 -1
- package/dist/state/samples-observed/slow-duration-fps.js +7 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/work-on-seek-request.d.ts +10 -0
- package/dist/work-on-seek-request.js +20 -2
- package/package.json +3 -3
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getSeekingByteForAac = void 0;
|
|
4
|
+
const getSeekingByteForAac = ({ time, seekingHints, }) => {
|
|
5
|
+
let bestAudioSample;
|
|
6
|
+
for (const hint of seekingHints.audioSampleMap) {
|
|
7
|
+
if (hint.timeInSeconds > time) {
|
|
8
|
+
continue;
|
|
9
|
+
}
|
|
10
|
+
// Everything is a keyframe in flac, so if this sample does not cover the time, it's not a good candidate.
|
|
11
|
+
// Let's go to the next one. Exception: If we already saw the last sample, we use it so we find can at least
|
|
12
|
+
// find the closest one.
|
|
13
|
+
if (hint.timeInSeconds + hint.durationInSeconds < time &&
|
|
14
|
+
!seekingHints.lastSampleObserved) {
|
|
15
|
+
continue;
|
|
16
|
+
}
|
|
17
|
+
if (!bestAudioSample) {
|
|
18
|
+
bestAudioSample = hint;
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
if (bestAudioSample.timeInSeconds < hint.timeInSeconds) {
|
|
22
|
+
bestAudioSample = hint;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
if (bestAudioSample) {
|
|
26
|
+
return { type: 'do-seek', byte: bestAudioSample.offset };
|
|
27
|
+
}
|
|
28
|
+
return { type: 'valid-but-must-wait' };
|
|
29
|
+
};
|
|
30
|
+
exports.getSeekingByteForAac = getSeekingByteForAac;
|
|
@@ -3,7 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.parseAac = void 0;
|
|
4
4
|
const aac_codecprivate_1 = require("../../aac-codecprivate");
|
|
5
5
|
const convert_audio_or_video_sample_1 = require("../../convert-audio-or-video-sample");
|
|
6
|
-
const emit_audio_sample_1 = require("../../emit-audio-sample");
|
|
7
6
|
const register_track_1 = require("../../register-track");
|
|
8
7
|
const parseAac = async (state) => {
|
|
9
8
|
const { iterator } = state;
|
|
@@ -47,6 +46,10 @@ const parseAac = async (state) => {
|
|
|
47
46
|
iterator.counter.decrement(iterator.counter.getOffset() - startOffset);
|
|
48
47
|
const data = iterator.getSlice(frameLength);
|
|
49
48
|
if (state.callbacks.tracks.getTracks().length === 0) {
|
|
49
|
+
state.mediaSection.addMediaSection({
|
|
50
|
+
start: startOffset,
|
|
51
|
+
size: state.contentLength - startOffset,
|
|
52
|
+
});
|
|
50
53
|
await (0, register_track_1.registerAudioTrack)({
|
|
51
54
|
container: 'aac',
|
|
52
55
|
track: {
|
|
@@ -71,25 +74,27 @@ const parseAac = async (state) => {
|
|
|
71
74
|
const duration = 1024 / sampleRate;
|
|
72
75
|
const { index } = state.aac.addSample({ offset: startOffset, size: frameLength });
|
|
73
76
|
const timestamp = (1024 / sampleRate) * index;
|
|
77
|
+
state.aac.audioSamples.addSample({
|
|
78
|
+
timeInSeconds: timestamp,
|
|
79
|
+
offset: startOffset,
|
|
80
|
+
durationInSeconds: duration,
|
|
81
|
+
});
|
|
74
82
|
// One ADTS frame contains 1024 samples
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
},
|
|
89
|
-
timescale: 1,
|
|
90
|
-
}),
|
|
91
|
-
callbacks: state.callbacks,
|
|
83
|
+
const audioSample = (0, convert_audio_or_video_sample_1.convertAudioOrVideoSampleToWebCodecsTimestamps)({
|
|
84
|
+
sample: {
|
|
85
|
+
duration,
|
|
86
|
+
type: 'key',
|
|
87
|
+
data,
|
|
88
|
+
offset: startOffset,
|
|
89
|
+
timescale: 1000000,
|
|
90
|
+
trackId: 0,
|
|
91
|
+
cts: timestamp,
|
|
92
|
+
dts: timestamp,
|
|
93
|
+
timestamp,
|
|
94
|
+
},
|
|
95
|
+
timescale: 1,
|
|
92
96
|
});
|
|
97
|
+
await state.callbacks.onAudioSample(0, audioSample);
|
|
93
98
|
return Promise.resolve(null);
|
|
94
99
|
};
|
|
95
100
|
exports.parseAac = parseAac;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { AacState } from '../../state/aac-state';
|
|
2
|
+
import type { AudioSampleOffset } from '../../state/audio-sample-map';
|
|
3
|
+
import type { SamplesObservedState } from '../../state/samples-observed/slow-duration-fps';
|
|
4
|
+
export type AacSeekingHints = {
|
|
5
|
+
type: 'aac-seeking-hints';
|
|
6
|
+
audioSampleMap: AudioSampleOffset[];
|
|
7
|
+
lastSampleObserved: boolean;
|
|
8
|
+
};
|
|
9
|
+
export declare const getSeekingHintsForAac: ({ aacState, samplesObserved, }: {
|
|
10
|
+
aacState: AacState;
|
|
11
|
+
samplesObserved: SamplesObservedState;
|
|
12
|
+
}) => AacSeekingHints;
|
|
13
|
+
export declare const setSeekingHintsForAac: () => void;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.setSeekingHintsForAac = exports.getSeekingHintsForAac = void 0;
|
|
4
|
+
const getSeekingHintsForAac = ({ aacState, samplesObserved, }) => {
|
|
5
|
+
return {
|
|
6
|
+
type: 'aac-seeking-hints',
|
|
7
|
+
audioSampleMap: aacState.audioSamples.getSamples(),
|
|
8
|
+
lastSampleObserved: samplesObserved.getLastSampleObserved(),
|
|
9
|
+
};
|
|
10
|
+
};
|
|
11
|
+
exports.getSeekingHintsForAac = getSeekingHintsForAac;
|
|
12
|
+
// TODO: Implement this and maintain index
|
|
13
|
+
const setSeekingHintsForAac = () => { };
|
|
14
|
+
exports.setSeekingHintsForAac = setSeekingHintsForAac;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import type { BufferIterator } from '../../iterator/buffer-iterator';
|
|
2
|
-
export declare const getChannelCount: (iterator: BufferIterator) => 2 |
|
|
2
|
+
export declare const getChannelCount: (iterator: BufferIterator) => 2 | 1 | 4 | 3 | 5 | 6 | 8 | 7;
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import type { FlacSeekingHints } from './seeking-hints';
|
|
2
|
-
export declare const getSeekingByteForFlac: ({ time, seekingHints,
|
|
2
|
+
export declare const getSeekingByteForFlac: ({ time, seekingHints, }: {
|
|
3
3
|
time: number;
|
|
4
4
|
seekingHints: FlacSeekingHints;
|
|
5
|
-
endOfFile: boolean;
|
|
6
5
|
}) => number | null;
|
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.getSeekingByteForFlac = void 0;
|
|
4
|
-
const getSeekingByteForFlac = ({ time, seekingHints,
|
|
4
|
+
const getSeekingByteForFlac = ({ time, seekingHints, }) => {
|
|
5
5
|
let bestAudioSample;
|
|
6
6
|
for (const hint of seekingHints.audioSampleMap) {
|
|
7
7
|
if (hint.timeInSeconds > time) {
|
|
8
8
|
continue;
|
|
9
9
|
}
|
|
10
|
-
if
|
|
10
|
+
// Everything is a keyframe in flac, so if this sample does not cover the time, it's not a good candidate.
|
|
11
|
+
// Let's go to the next one. Exception: If we already saw the last sample, we use it so we find can at least
|
|
12
|
+
// find the closest one.
|
|
13
|
+
if (hint.timeInSeconds + hint.durationInSeconds < time &&
|
|
14
|
+
!seekingHints.lastSampleObserved) {
|
|
11
15
|
continue;
|
|
12
16
|
}
|
|
13
17
|
if (!bestAudioSample) {
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.parseFlacFrame = exports.parseFrameHeader = void 0;
|
|
4
4
|
const convert_audio_or_video_sample_1 = require("../../convert-audio-or-video-sample");
|
|
5
|
-
const emit_audio_sample_1 = require("../../emit-audio-sample");
|
|
6
5
|
const buffer_iterator_1 = require("../../iterator/buffer-iterator");
|
|
7
6
|
const get_block_size_1 = require("./get-block-size");
|
|
8
7
|
const get_channel_count_1 = require("./get-channel-count");
|
|
@@ -81,24 +80,26 @@ const emitSample = async ({ state, data, offset, }) => {
|
|
|
81
80
|
throw new Error('Cannot determine timestamp');
|
|
82
81
|
}
|
|
83
82
|
const timestamp = (num * streamInfo.maximumBlockSize) / streamInfo.sampleRate;
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
83
|
+
state.flac.audioSamples.addSample({
|
|
84
|
+
timeInSeconds: timestamp,
|
|
85
|
+
offset,
|
|
86
|
+
durationInSeconds: duration,
|
|
87
|
+
});
|
|
88
|
+
const audioSample = (0, convert_audio_or_video_sample_1.convertAudioOrVideoSampleToWebCodecsTimestamps)({
|
|
89
|
+
sample: {
|
|
90
|
+
data,
|
|
91
|
+
duration,
|
|
92
|
+
cts: timestamp,
|
|
93
|
+
dts: timestamp,
|
|
94
|
+
timestamp,
|
|
95
|
+
type: 'key',
|
|
96
|
+
offset,
|
|
98
97
|
timescale: 1,
|
|
99
|
-
|
|
100
|
-
|
|
98
|
+
trackId: 0,
|
|
99
|
+
},
|
|
100
|
+
timescale: 1,
|
|
101
101
|
});
|
|
102
|
+
await state.callbacks.onAudioSample(0, audioSample);
|
|
102
103
|
iterator.destroy();
|
|
103
104
|
};
|
|
104
105
|
const parseFlacFrame = async ({ state, iterator, }) => {
|
|
@@ -5,13 +5,7 @@ const skip_1 = require("../../skip");
|
|
|
5
5
|
const may_skip_video_data_1 = require("../../state/may-skip-video-data");
|
|
6
6
|
const parse_flac_frame_1 = require("./parse-flac-frame");
|
|
7
7
|
const parse_header_1 = require("./parse-header");
|
|
8
|
-
const
|
|
9
|
-
const parse_streaminfo_1 = require("./parse-streaminfo");
|
|
10
|
-
const parse_unknown_block_1 = require("./parse-unknown-block");
|
|
11
|
-
const flacTypes = {
|
|
12
|
-
streaminfo: 0,
|
|
13
|
-
vorbisComment: 4,
|
|
14
|
-
};
|
|
8
|
+
const parse_meta_1 = require("./parse-meta");
|
|
15
9
|
const parseFlac = ({ iterator, state, }) => {
|
|
16
10
|
const mediaSectionState = state.mediaSection.isCurrentByteInMediaSection(iterator);
|
|
17
11
|
if (mediaSectionState === 'in-section') {
|
|
@@ -27,23 +21,9 @@ const parseFlac = ({ iterator, state, }) => {
|
|
|
27
21
|
iterator.counter.decrement(4);
|
|
28
22
|
// https://www.rfc-editor.org/rfc/rfc9639.html#name-streaminfo
|
|
29
23
|
// section 8.1
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
const size = iterator.getUint24();
|
|
35
|
-
if (isLastMetadata) {
|
|
36
|
-
state.mediaSection.addMediaSection({
|
|
37
|
-
start: iterator.counter.getOffset() + size,
|
|
38
|
-
size: state.contentLength - iterator.counter.getOffset() - size,
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
if (metaBlockType === flacTypes.streaminfo) {
|
|
42
|
-
return (0, parse_streaminfo_1.parseStreamInfo)({ iterator, state });
|
|
43
|
-
}
|
|
44
|
-
if (metaBlockType === flacTypes.vorbisComment) {
|
|
45
|
-
return (0, parse_metadata_1.parseVorbisComment)({ iterator, state, size });
|
|
46
|
-
}
|
|
47
|
-
return (0, parse_unknown_block_1.parseFlacUnkownBlock)({ iterator, state, size });
|
|
24
|
+
return (0, parse_meta_1.parseMetaBlock)({
|
|
25
|
+
iterator,
|
|
26
|
+
state,
|
|
27
|
+
});
|
|
48
28
|
};
|
|
49
29
|
exports.parseFlac = parseFlac;
|
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
import type { AudioSampleOffset } from '../../state/audio-sample-map';
|
|
2
2
|
import type { FlacState } from '../../state/flac-state';
|
|
3
3
|
import type { ParserState } from '../../state/parser-state';
|
|
4
|
+
import type { SamplesObservedState } from '../../state/samples-observed/slow-duration-fps';
|
|
4
5
|
export type FlacSeekingHints = {
|
|
5
6
|
type: 'flac-seeking-hints';
|
|
6
7
|
audioSampleMap: AudioSampleOffset[];
|
|
7
8
|
blockingBitStrategy: number | null;
|
|
9
|
+
lastSampleObserved: boolean;
|
|
8
10
|
};
|
|
9
|
-
export declare const getSeekingHintsForFlac: ({ flacState, }: {
|
|
11
|
+
export declare const getSeekingHintsForFlac: ({ flacState, samplesObserved, }: {
|
|
10
12
|
flacState: FlacState;
|
|
13
|
+
samplesObserved: SamplesObservedState;
|
|
11
14
|
}) => FlacSeekingHints;
|
|
12
15
|
export declare const setSeekingHintsForFlac: ({ hints, state, }: {
|
|
13
16
|
hints: FlacSeekingHints;
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.setSeekingHintsForFlac = exports.getSeekingHintsForFlac = void 0;
|
|
4
|
-
const getSeekingHintsForFlac = ({ flacState, }) => {
|
|
4
|
+
const getSeekingHintsForFlac = ({ flacState, samplesObserved, }) => {
|
|
5
5
|
var _a;
|
|
6
6
|
return {
|
|
7
7
|
type: 'flac-seeking-hints',
|
|
8
8
|
audioSampleMap: flacState.audioSamples.getSamples(),
|
|
9
9
|
blockingBitStrategy: (_a = flacState.getBlockingBitStrategy()) !== null && _a !== void 0 ? _a : null,
|
|
10
|
+
lastSampleObserved: samplesObserved.getLastSampleObserved(),
|
|
10
11
|
};
|
|
11
12
|
};
|
|
12
13
|
exports.getSeekingHintsForFlac = getSeekingHintsForFlac;
|
|
@@ -2,9 +2,10 @@ import type { BufferIterator } from '../../iterator/buffer-iterator';
|
|
|
2
2
|
import type { LogLevel } from '../../log';
|
|
3
3
|
import type { IsoBaseMediaBox } from './base-media-box';
|
|
4
4
|
import type { OnlyIfMoovAtomExpected } from './process-box';
|
|
5
|
-
export declare const getIsoBaseMediaChildren: ({ size, iterator, logLevel, onlyIfMoovAtomExpected, }: {
|
|
5
|
+
export declare const getIsoBaseMediaChildren: ({ size, iterator, logLevel, onlyIfMoovAtomExpected, contentLength, }: {
|
|
6
6
|
size: number;
|
|
7
7
|
iterator: BufferIterator;
|
|
8
8
|
logLevel: LogLevel;
|
|
9
9
|
onlyIfMoovAtomExpected: OnlyIfMoovAtomExpected | null;
|
|
10
|
+
contentLength: number;
|
|
10
11
|
}) => Promise<IsoBaseMediaBox[]>;
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.getIsoBaseMediaChildren = void 0;
|
|
4
4
|
const process_box_1 = require("./process-box");
|
|
5
|
-
const getIsoBaseMediaChildren = async ({ size, iterator, logLevel, onlyIfMoovAtomExpected, }) => {
|
|
5
|
+
const getIsoBaseMediaChildren = async ({ size, iterator, logLevel, onlyIfMoovAtomExpected, contentLength, }) => {
|
|
6
6
|
const boxes = [];
|
|
7
7
|
const initial = iterator.counter.getOffset();
|
|
8
8
|
while (iterator.counter.getOffset() < size + initial) {
|
|
@@ -11,6 +11,7 @@ const getIsoBaseMediaChildren = async ({ size, iterator, logLevel, onlyIfMoovAto
|
|
|
11
11
|
logLevel,
|
|
12
12
|
onlyIfMoovAtomExpected,
|
|
13
13
|
onlyIfMdatAtomExpected: null,
|
|
14
|
+
contentLength,
|
|
14
15
|
});
|
|
15
16
|
if (!parsed) {
|
|
16
17
|
throw new Error('Expected box');
|
|
@@ -51,7 +51,7 @@ const getMoovAtom = async ({ endOfMdat, state, }) => {
|
|
|
51
51
|
return null;
|
|
52
52
|
}
|
|
53
53
|
: null;
|
|
54
|
-
const iterator = (0, buffer_iterator_1.getArrayBufferIterator)(new Uint8Array([]), state.contentLength);
|
|
54
|
+
const iterator = (0, buffer_iterator_1.getArrayBufferIterator)(new Uint8Array([]), state.contentLength - endOfMdat);
|
|
55
55
|
while (true) {
|
|
56
56
|
const result = await reader.reader.read();
|
|
57
57
|
if (result.value) {
|
|
@@ -82,6 +82,7 @@ const getMoovAtom = async ({ endOfMdat, state, }) => {
|
|
|
82
82
|
registerAudioSampleCallback: () => Promise.resolve(),
|
|
83
83
|
},
|
|
84
84
|
onlyIfMdatAtomExpected: null,
|
|
85
|
+
contentLength: state.contentLength - endOfMdat,
|
|
85
86
|
});
|
|
86
87
|
if (box) {
|
|
87
88
|
boxes.push(box);
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import type { TrakBox } from './trak/trak';
|
|
2
|
-
export declare const getVideoCodecFromIsoTrak: (trakBox: TrakBox) => "
|
|
2
|
+
export declare const getVideoCodecFromIsoTrak: (trakBox: TrakBox) => "h265" | "h264" | "av1" | "prores";
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.parseMdatSection = void 0;
|
|
4
4
|
const convert_audio_or_video_sample_1 = require("../../../convert-audio-or-video-sample");
|
|
5
|
-
const emit_audio_sample_1 = require("../../../emit-audio-sample");
|
|
6
5
|
const get_tracks_1 = require("../../../get-tracks");
|
|
7
6
|
const skip_1 = require("../../../skip");
|
|
8
7
|
const cached_sample_positions_1 = require("../../../state/iso-base-media/cached-sample-positions");
|
|
@@ -70,24 +69,21 @@ const parseMdatSection = async (state) => {
|
|
|
70
69
|
chunkSize,
|
|
71
70
|
});
|
|
72
71
|
if (samplesWithIndex.track.type === 'audio') {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
type: isKeyframe ? 'key' : 'delta',
|
|
84
|
-
offset,
|
|
85
|
-
timescale: samplesWithIndex.track.timescale,
|
|
86
|
-
},
|
|
72
|
+
const audioSample = (0, convert_audio_or_video_sample_1.convertAudioOrVideoSampleToWebCodecsTimestamps)({
|
|
73
|
+
sample: {
|
|
74
|
+
data: bytes,
|
|
75
|
+
timestamp: cts,
|
|
76
|
+
duration,
|
|
77
|
+
cts,
|
|
78
|
+
dts,
|
|
79
|
+
trackId: samplesWithIndex.track.trackId,
|
|
80
|
+
type: isKeyframe ? 'key' : 'delta',
|
|
81
|
+
offset,
|
|
87
82
|
timescale: samplesWithIndex.track.timescale,
|
|
88
|
-
}
|
|
89
|
-
|
|
83
|
+
},
|
|
84
|
+
timescale: samplesWithIndex.track.timescale,
|
|
90
85
|
});
|
|
86
|
+
await state.callbacks.onAudioSample(samplesWithIndex.track.trackId, audioSample);
|
|
91
87
|
}
|
|
92
88
|
if (samplesWithIndex.track.type === 'video') {
|
|
93
89
|
// https://remotion-assets.s3.eu-central-1.amazonaws.com/example-videos/sei_checkpoint.mp4
|
|
@@ -102,24 +98,21 @@ const parseMdatSection = async (state) => {
|
|
|
102
98
|
const seiType = bytes[5];
|
|
103
99
|
isRecoveryPoint = seiType === 6;
|
|
104
100
|
}
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
type: isKeyframe && !isRecoveryPoint ? 'key' : 'delta',
|
|
116
|
-
offset,
|
|
117
|
-
timescale: samplesWithIndex.track.timescale,
|
|
118
|
-
},
|
|
101
|
+
const videoSample = (0, convert_audio_or_video_sample_1.convertAudioOrVideoSampleToWebCodecsTimestamps)({
|
|
102
|
+
sample: {
|
|
103
|
+
data: bytes,
|
|
104
|
+
timestamp: cts,
|
|
105
|
+
duration,
|
|
106
|
+
cts,
|
|
107
|
+
dts,
|
|
108
|
+
trackId: samplesWithIndex.track.trackId,
|
|
109
|
+
type: isKeyframe && !isRecoveryPoint ? 'key' : 'delta',
|
|
110
|
+
offset,
|
|
119
111
|
timescale: samplesWithIndex.track.timescale,
|
|
120
|
-
}
|
|
121
|
-
|
|
112
|
+
},
|
|
113
|
+
timescale: samplesWithIndex.track.timescale,
|
|
122
114
|
});
|
|
115
|
+
await state.callbacks.onVideoSample(samplesWithIndex.track.trackId, videoSample);
|
|
123
116
|
}
|
|
124
117
|
return null;
|
|
125
118
|
};
|
|
@@ -7,10 +7,11 @@ export interface MoovBox extends BaseBox {
|
|
|
7
7
|
type: 'moov-box';
|
|
8
8
|
children: AnySegment[];
|
|
9
9
|
}
|
|
10
|
-
export declare const parseMoov: ({ offset, size, onlyIfMoovAtomExpected, iterator, logLevel, }: {
|
|
10
|
+
export declare const parseMoov: ({ offset, size, onlyIfMoovAtomExpected, iterator, logLevel, contentLength, }: {
|
|
11
11
|
offset: number;
|
|
12
12
|
size: number;
|
|
13
13
|
onlyIfMoovAtomExpected: OnlyIfMoovAtomExpected;
|
|
14
14
|
iterator: BufferIterator;
|
|
15
15
|
logLevel: LogLevel;
|
|
16
|
+
contentLength: number;
|
|
16
17
|
}) => Promise<MoovBox>;
|
|
@@ -2,12 +2,13 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.parseMoov = void 0;
|
|
4
4
|
const get_children_1 = require("../get-children");
|
|
5
|
-
const parseMoov = async ({ offset, size, onlyIfMoovAtomExpected, iterator, logLevel, }) => {
|
|
5
|
+
const parseMoov = async ({ offset, size, onlyIfMoovAtomExpected, iterator, logLevel, contentLength, }) => {
|
|
6
6
|
const children = await (0, get_children_1.getIsoBaseMediaChildren)({
|
|
7
7
|
onlyIfMoovAtomExpected,
|
|
8
8
|
size: size - 8,
|
|
9
9
|
iterator,
|
|
10
10
|
logLevel,
|
|
11
|
+
contentLength,
|
|
11
12
|
});
|
|
12
13
|
return {
|
|
13
14
|
offset,
|
|
@@ -17,9 +17,10 @@ export type OnlyIfMoovAtomExpected = {
|
|
|
17
17
|
export type OnlyIfMdatAtomExpected = {
|
|
18
18
|
mediaSectionState: MediaSectionState;
|
|
19
19
|
};
|
|
20
|
-
export declare const processBox: ({ iterator, logLevel, onlyIfMoovAtomExpected, onlyIfMdatAtomExpected, }: {
|
|
20
|
+
export declare const processBox: ({ iterator, logLevel, onlyIfMoovAtomExpected, onlyIfMdatAtomExpected, contentLength, }: {
|
|
21
21
|
iterator: BufferIterator;
|
|
22
22
|
logLevel: LogLevel;
|
|
23
23
|
onlyIfMoovAtomExpected: OnlyIfMoovAtomExpected | null;
|
|
24
24
|
onlyIfMdatAtomExpected: OnlyIfMdatAtomExpected | null;
|
|
25
|
+
contentLength: number;
|
|
25
26
|
}) => Promise<BoxAndNext>;
|
|
@@ -32,7 +32,7 @@ const tfhd_1 = require("./tfhd");
|
|
|
32
32
|
const tkhd_1 = require("./tkhd");
|
|
33
33
|
const trak_1 = require("./trak/trak");
|
|
34
34
|
const trun_1 = require("./trun");
|
|
35
|
-
const processBox = async ({ iterator, logLevel, onlyIfMoovAtomExpected, onlyIfMdatAtomExpected, }) => {
|
|
35
|
+
const processBox = async ({ iterator, logLevel, onlyIfMoovAtomExpected, onlyIfMdatAtomExpected, contentLength, }) => {
|
|
36
36
|
var _a, _b;
|
|
37
37
|
const fileOffset = iterator.counter.getOffset();
|
|
38
38
|
const { returnToCheckpoint } = iterator.startCheckpoint();
|
|
@@ -51,13 +51,14 @@ const processBox = async ({ iterator, logLevel, onlyIfMoovAtomExpected, onlyIfMd
|
|
|
51
51
|
iterator.counter.decrement(iterator.counter.getOffset() - fileOffset);
|
|
52
52
|
throw new Error(`Expected box size of ${bytesRemaining}, got ${boxSizeRaw}. Incomplete boxes are not allowed.`);
|
|
53
53
|
}
|
|
54
|
+
const maxSize = contentLength - startOff;
|
|
54
55
|
const boxType = iterator.getByteString(4, false);
|
|
55
|
-
const
|
|
56
|
-
|
|
56
|
+
const boxSizeUnlimited = boxSizeRaw === 1 ? iterator.getEightByteNumber() : boxSizeRaw;
|
|
57
|
+
const boxSize = Math.min(boxSizeUnlimited, maxSize);
|
|
57
58
|
const headerLength = iterator.counter.getOffset() - startOff;
|
|
58
59
|
if (boxType === 'mdat') {
|
|
59
60
|
if (!onlyIfMdatAtomExpected) {
|
|
60
|
-
|
|
61
|
+
return null;
|
|
61
62
|
}
|
|
62
63
|
const { mediaSectionState } = onlyIfMdatAtomExpected;
|
|
63
64
|
mediaSectionState.addMediaSection({
|
|
@@ -97,6 +98,7 @@ const processBox = async ({ iterator, logLevel, onlyIfMoovAtomExpected, onlyIfMd
|
|
|
97
98
|
size: boxSize,
|
|
98
99
|
iterator,
|
|
99
100
|
logLevel,
|
|
101
|
+
contentLength,
|
|
100
102
|
});
|
|
101
103
|
}
|
|
102
104
|
if (boxType === 'stsz') {
|
|
@@ -148,6 +150,7 @@ const processBox = async ({ iterator, logLevel, onlyIfMoovAtomExpected, onlyIfMd
|
|
|
148
150
|
size: boxSize,
|
|
149
151
|
iterator,
|
|
150
152
|
logLevel,
|
|
153
|
+
contentLength,
|
|
151
154
|
});
|
|
152
155
|
}
|
|
153
156
|
if (boxType === 'hdlr') {
|
|
@@ -192,6 +195,7 @@ const processBox = async ({ iterator, logLevel, onlyIfMoovAtomExpected, onlyIfMd
|
|
|
192
195
|
onlyIfMoovAtomExpected,
|
|
193
196
|
iterator,
|
|
194
197
|
logLevel,
|
|
198
|
+
contentLength,
|
|
195
199
|
});
|
|
196
200
|
tracks.setIsDone(logLevel);
|
|
197
201
|
return box;
|
|
@@ -206,6 +210,7 @@ const processBox = async ({ iterator, logLevel, onlyIfMoovAtomExpected, onlyIfMd
|
|
|
206
210
|
offsetAtStart: fileOffset,
|
|
207
211
|
iterator,
|
|
208
212
|
logLevel,
|
|
213
|
+
contentLength,
|
|
209
214
|
});
|
|
210
215
|
const transformedTrack = (0, make_track_1.makeBaseMediaTrack)(box);
|
|
211
216
|
if (transformedTrack && transformedTrack.type === 'video') {
|
|
@@ -296,6 +301,7 @@ const processBox = async ({ iterator, logLevel, onlyIfMoovAtomExpected, onlyIfMd
|
|
|
296
301
|
size: boxSize - 8,
|
|
297
302
|
logLevel,
|
|
298
303
|
onlyIfMoovAtomExpected,
|
|
304
|
+
contentLength,
|
|
299
305
|
});
|
|
300
306
|
return {
|
|
301
307
|
type: 'regular-box',
|
|
@@ -8,9 +8,10 @@ export interface MebxBox extends BaseBox {
|
|
|
8
8
|
format: string;
|
|
9
9
|
children: AnySegment[];
|
|
10
10
|
}
|
|
11
|
-
export declare const parseMebx: ({ offset, size, iterator, logLevel, }: {
|
|
11
|
+
export declare const parseMebx: ({ offset, size, iterator, logLevel, contentLength, }: {
|
|
12
12
|
offset: number;
|
|
13
13
|
size: number;
|
|
14
14
|
iterator: BufferIterator;
|
|
15
15
|
logLevel: LogLevel;
|
|
16
|
+
contentLength: number;
|
|
16
17
|
}) => Promise<MebxBox>;
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.parseMebx = void 0;
|
|
4
4
|
const get_children_1 = require("../get-children");
|
|
5
|
-
const parseMebx = async ({ offset, size, iterator, logLevel, }) => {
|
|
5
|
+
const parseMebx = async ({ offset, size, iterator, logLevel, contentLength, }) => {
|
|
6
6
|
// reserved, 6 bit
|
|
7
7
|
iterator.discard(6);
|
|
8
8
|
const dataReferenceIndex = iterator.getUint16();
|
|
@@ -11,6 +11,7 @@ const parseMebx = async ({ offset, size, iterator, logLevel, }) => {
|
|
|
11
11
|
size: size - 8,
|
|
12
12
|
logLevel,
|
|
13
13
|
onlyIfMoovAtomExpected: null,
|
|
14
|
+
contentLength,
|
|
14
15
|
});
|
|
15
16
|
return {
|
|
16
17
|
type: 'mebx-box',
|
|
@@ -49,13 +49,15 @@ export type Sample = AudioSample | VideoSample | UnknownSample;
|
|
|
49
49
|
type FormatBoxAndNext = {
|
|
50
50
|
sample: Sample | null;
|
|
51
51
|
};
|
|
52
|
-
export declare const processIsoFormatBox: ({ iterator, logLevel, }: {
|
|
52
|
+
export declare const processIsoFormatBox: ({ iterator, logLevel, contentLength, }: {
|
|
53
53
|
iterator: BufferIterator;
|
|
54
54
|
logLevel: LogLevel;
|
|
55
|
+
contentLength: number;
|
|
55
56
|
}) => Promise<FormatBoxAndNext>;
|
|
56
|
-
export declare const parseIsoFormatBoxes: ({ maxBytes, logLevel, iterator, }: {
|
|
57
|
+
export declare const parseIsoFormatBoxes: ({ maxBytes, logLevel, iterator, contentLength, }: {
|
|
57
58
|
maxBytes: number;
|
|
58
59
|
logLevel: LogLevel;
|
|
59
60
|
iterator: BufferIterator;
|
|
61
|
+
contentLength: number;
|
|
60
62
|
}) => Promise<Sample[]>;
|
|
61
63
|
export {};
|