@remotion/media-parser 4.0.287 → 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 +5 -0
- package/dist/containers/flac/get-seeking-byte.js +30 -0
- package/dist/containers/flac/parse-flac-frame.js +18 -17
- package/dist/containers/flac/parse-flac.js +5 -25
- package/dist/containers/flac/parse-meta.d.ts +6 -0
- package/dist/containers/flac/parse-meta.js +31 -0
- package/dist/containers/flac/seeking-hints.d.ts +18 -0
- package/dist/containers/flac/seeking-hints.js +20 -0
- package/dist/containers/iso-base-media/collect-sample-positions-from-trak.js +7 -5
- 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 +33 -35
- package/dist/containers/iso-base-media/mdat/postprocess-bytes.d.ts +5 -0
- package/dist/containers/iso-base-media/mdat/postprocess-bytes.js +25 -0
- 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/seeking-hints.js +6 -5
- package/dist/containers/iso-base-media/should-group-audio-samples.d.ts +6 -0
- package/dist/containers/iso-base-media/should-group-audio-samples.js +16 -0
- 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 +1549 -403
- package/dist/esm/worker-server-entry.mjs +1543 -397
- package/dist/esm/worker-web-entry.mjs +1543 -397
- package/dist/find-last-keyframe.d.ts +5 -0
- package/dist/find-last-keyframe.js +18 -0
- package/dist/get-audio-codec.d.ts +1 -0
- package/dist/get-audio-codec.js +13 -2
- package/dist/get-sample-positions-from-mp4.d.ts +4 -1
- package/dist/get-sample-positions-from-mp4.js +3 -1
- package/dist/get-sample-positions.d.ts +2 -0
- package/dist/get-sample-positions.js +2 -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/samples-from-moof.js +2 -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/audio-sample-map.d.ts +11 -0
- package/dist/state/audio-sample-map.js +21 -0
- 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;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getSeekingByteForFlac = void 0;
|
|
4
|
+
const getSeekingByteForFlac = ({ 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 bestAudioSample.offset;
|
|
27
|
+
}
|
|
28
|
+
return null;
|
|
29
|
+
};
|
|
30
|
+
exports.getSeekingByteForFlac = getSeekingByteForFlac;
|
|
@@ -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;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { BufferIterator } from '../../iterator/buffer-iterator';
|
|
2
|
+
import type { ParserState } from '../../state/parser-state';
|
|
3
|
+
export declare const parseMetaBlock: ({ iterator, state, }: {
|
|
4
|
+
iterator: BufferIterator;
|
|
5
|
+
state: ParserState;
|
|
6
|
+
}) => Promise<import("../../parse-result").ParseResult>;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseMetaBlock = void 0;
|
|
4
|
+
const parse_metadata_1 = require("./parse-metadata");
|
|
5
|
+
const parse_streaminfo_1 = require("./parse-streaminfo");
|
|
6
|
+
const parse_unknown_block_1 = require("./parse-unknown-block");
|
|
7
|
+
const flacTypes = {
|
|
8
|
+
streaminfo: 0,
|
|
9
|
+
vorbisComment: 4,
|
|
10
|
+
};
|
|
11
|
+
const parseMetaBlock = ({ iterator, state, }) => {
|
|
12
|
+
iterator.startReadingBits();
|
|
13
|
+
const isLastMetadata = iterator.getBits(1);
|
|
14
|
+
const metaBlockType = iterator.getBits(7);
|
|
15
|
+
iterator.stopReadingBits();
|
|
16
|
+
const size = iterator.getUint24();
|
|
17
|
+
if (isLastMetadata) {
|
|
18
|
+
state.mediaSection.addMediaSection({
|
|
19
|
+
start: iterator.counter.getOffset() + size,
|
|
20
|
+
size: state.contentLength - iterator.counter.getOffset() - size,
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
if (metaBlockType === flacTypes.streaminfo) {
|
|
24
|
+
return (0, parse_streaminfo_1.parseStreamInfo)({ iterator, state });
|
|
25
|
+
}
|
|
26
|
+
if (metaBlockType === flacTypes.vorbisComment) {
|
|
27
|
+
return (0, parse_metadata_1.parseVorbisComment)({ iterator, state, size });
|
|
28
|
+
}
|
|
29
|
+
return (0, parse_unknown_block_1.parseFlacUnkownBlock)({ iterator, state, size });
|
|
30
|
+
};
|
|
31
|
+
exports.parseMetaBlock = parseMetaBlock;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { AudioSampleOffset } from '../../state/audio-sample-map';
|
|
2
|
+
import type { FlacState } from '../../state/flac-state';
|
|
3
|
+
import type { ParserState } from '../../state/parser-state';
|
|
4
|
+
import type { SamplesObservedState } from '../../state/samples-observed/slow-duration-fps';
|
|
5
|
+
export type FlacSeekingHints = {
|
|
6
|
+
type: 'flac-seeking-hints';
|
|
7
|
+
audioSampleMap: AudioSampleOffset[];
|
|
8
|
+
blockingBitStrategy: number | null;
|
|
9
|
+
lastSampleObserved: boolean;
|
|
10
|
+
};
|
|
11
|
+
export declare const getSeekingHintsForFlac: ({ flacState, samplesObserved, }: {
|
|
12
|
+
flacState: FlacState;
|
|
13
|
+
samplesObserved: SamplesObservedState;
|
|
14
|
+
}) => FlacSeekingHints;
|
|
15
|
+
export declare const setSeekingHintsForFlac: ({ hints, state, }: {
|
|
16
|
+
hints: FlacSeekingHints;
|
|
17
|
+
state: ParserState;
|
|
18
|
+
}) => void;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.setSeekingHintsForFlac = exports.getSeekingHintsForFlac = void 0;
|
|
4
|
+
const getSeekingHintsForFlac = ({ flacState, samplesObserved, }) => {
|
|
5
|
+
var _a;
|
|
6
|
+
return {
|
|
7
|
+
type: 'flac-seeking-hints',
|
|
8
|
+
audioSampleMap: flacState.audioSamples.getSamples(),
|
|
9
|
+
blockingBitStrategy: (_a = flacState.getBlockingBitStrategy()) !== null && _a !== void 0 ? _a : null,
|
|
10
|
+
lastSampleObserved: samplesObserved.getLastSampleObserved(),
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
exports.getSeekingHintsForFlac = getSeekingHintsForFlac;
|
|
14
|
+
const setSeekingHintsForFlac = ({ hints, state, }) => {
|
|
15
|
+
if (hints.blockingBitStrategy !== null) {
|
|
16
|
+
state.flac.setBlockingBitStrategy(hints.blockingBitStrategy);
|
|
17
|
+
}
|
|
18
|
+
state.flac.audioSamples.setFromSeekingHints(hints.audioSampleMap);
|
|
19
|
+
};
|
|
20
|
+
exports.setSeekingHintsForFlac = setSeekingHintsForFlac;
|
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.collectSamplePositionsFromTrak = void 0;
|
|
4
|
-
const get_audio_codec_1 = require("../../get-audio-codec");
|
|
5
4
|
const get_fps_1 = require("../../get-fps");
|
|
6
5
|
const get_sample_positions_1 = require("../../get-sample-positions");
|
|
7
6
|
const get_sample_positions_from_mp4_1 = require("../../get-sample-positions-from-mp4");
|
|
7
|
+
const should_group_audio_samples_1 = require("./should-group-audio-samples");
|
|
8
8
|
const traversal_1 = require("./traversal");
|
|
9
9
|
const collectSamplePositionsFromTrak = (trakBox) => {
|
|
10
|
-
const
|
|
10
|
+
const shouldGroupSamples = (0, should_group_audio_samples_1.shouldGroupAudioSamples)(trakBox);
|
|
11
11
|
const timescaleAndDuration = (0, get_fps_1.getTimescaleAndDuration)(trakBox);
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
if (shouldGroupSamples) {
|
|
13
|
+
return (0, get_sample_positions_from_mp4_1.getGroupedSamplesPositionsFromMp4)({
|
|
14
|
+
trakBox,
|
|
15
|
+
bigEndian: shouldGroupSamples.bigEndian,
|
|
16
|
+
});
|
|
15
17
|
}
|
|
16
18
|
const stszBox = (0, traversal_1.getStszBox)(trakBox);
|
|
17
19
|
const stcoBox = (0, traversal_1.getStcoBox)(trakBox);
|
|
@@ -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,13 +2,13 @@
|
|
|
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");
|
|
9
8
|
const may_skip_video_data_1 = require("../../../state/may-skip-video-data");
|
|
10
9
|
const video_section_1 = require("../../../state/video-section");
|
|
11
10
|
const get_moov_atom_1 = require("../get-moov-atom");
|
|
11
|
+
const postprocess_bytes_1 = require("./postprocess-bytes");
|
|
12
12
|
const parseMdatSection = async (state) => {
|
|
13
13
|
const mediaSection = (0, video_section_1.getCurrentMediaSection)({
|
|
14
14
|
offset: state.iterator.counter.getOffset(),
|
|
@@ -62,27 +62,28 @@ const parseMdatSection = async (state) => {
|
|
|
62
62
|
if (iterator.bytesRemaining() < samplesWithIndex.samplePosition.size) {
|
|
63
63
|
return null;
|
|
64
64
|
}
|
|
65
|
-
const
|
|
66
|
-
const
|
|
65
|
+
const { cts, dts, duration, isKeyframe, offset, bigEndian, chunkSize } = samplesWithIndex.samplePosition;
|
|
66
|
+
const bytes = (0, postprocess_bytes_1.postprocessBytes)({
|
|
67
|
+
bytes: iterator.getSlice(samplesWithIndex.samplePosition.size),
|
|
68
|
+
bigEndian,
|
|
69
|
+
chunkSize,
|
|
70
|
+
});
|
|
67
71
|
if (samplesWithIndex.track.type === 'audio') {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
type: isKeyframe ? 'key' : 'delta',
|
|
79
|
-
offset,
|
|
80
|
-
timescale: samplesWithIndex.track.timescale,
|
|
81
|
-
},
|
|
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,
|
|
82
82
|
timescale: samplesWithIndex.track.timescale,
|
|
83
|
-
}
|
|
84
|
-
|
|
83
|
+
},
|
|
84
|
+
timescale: samplesWithIndex.track.timescale,
|
|
85
85
|
});
|
|
86
|
+
await state.callbacks.onAudioSample(samplesWithIndex.track.trackId, audioSample);
|
|
86
87
|
}
|
|
87
88
|
if (samplesWithIndex.track.type === 'video') {
|
|
88
89
|
// https://remotion-assets.s3.eu-central-1.amazonaws.com/example-videos/sei_checkpoint.mp4
|
|
@@ -97,24 +98,21 @@ const parseMdatSection = async (state) => {
|
|
|
97
98
|
const seiType = bytes[5];
|
|
98
99
|
isRecoveryPoint = seiType === 6;
|
|
99
100
|
}
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
type: isKeyframe && !isRecoveryPoint ? 'key' : 'delta',
|
|
111
|
-
offset,
|
|
112
|
-
timescale: samplesWithIndex.track.timescale,
|
|
113
|
-
},
|
|
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,
|
|
114
111
|
timescale: samplesWithIndex.track.timescale,
|
|
115
|
-
}
|
|
116
|
-
|
|
112
|
+
},
|
|
113
|
+
timescale: samplesWithIndex.track.timescale,
|
|
117
114
|
});
|
|
115
|
+
await state.callbacks.onVideoSample(samplesWithIndex.track.trackId, videoSample);
|
|
118
116
|
}
|
|
119
117
|
return null;
|
|
120
118
|
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Addressing the issue of audio that is stored in big-endian format!
|
|
3
|
+
// If a "twos" atom is present, that is the case.
|
|
4
|
+
// The samples are stored internally in small chunks, like 4 bytes
|
|
5
|
+
// but WebCodecs does not accept such small chunks.
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.postprocessBytes = void 0;
|
|
8
|
+
// When entering this function, they are already concatenated, but in litte endian order.
|
|
9
|
+
// This function reverses the bytes in each chunk, so that they are in big-endian order.
|
|
10
|
+
const postprocessBytes = ({ bytes, bigEndian, chunkSize, }) => {
|
|
11
|
+
if (!bigEndian) {
|
|
12
|
+
return bytes;
|
|
13
|
+
}
|
|
14
|
+
if (chunkSize === null) {
|
|
15
|
+
return bytes;
|
|
16
|
+
}
|
|
17
|
+
const newBuffer = new Uint8Array(bytes);
|
|
18
|
+
for (let i = 0; i < newBuffer.length; i += chunkSize) {
|
|
19
|
+
const slice = newBuffer.slice(i, i + chunkSize);
|
|
20
|
+
slice.reverse();
|
|
21
|
+
newBuffer.set(slice, i);
|
|
22
|
+
}
|
|
23
|
+
return newBuffer;
|
|
24
|
+
};
|
|
25
|
+
exports.postprocessBytes = postprocessBytes;
|
|
@@ -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>;
|