@remotion/media-parser 4.0.280 → 4.0.284
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/check-if-done.js +1 -1
- package/dist/containers/aac/parse-aac.js +21 -12
- package/dist/containers/flac/get-channel-count.d.ts +1 -1
- package/dist/containers/flac/get-duration-from-flac.js +1 -1
- package/dist/containers/flac/get-sample-rate.js +1 -1
- package/dist/containers/flac/parse-flac-frame.js +18 -13
- package/dist/containers/flac/parse-flac.js +3 -3
- package/dist/containers/flac/parse-header.js +1 -1
- package/dist/containers/flac/parse-metadata.js +1 -1
- package/dist/containers/flac/parse-streaminfo.js +7 -2
- package/dist/containers/flac/parse-unknown-block.js +1 -1
- package/dist/containers/iso-base-media/base-media-box.d.ts +2 -1
- package/dist/containers/iso-base-media/collect-sample-positions-from-moof-boxes.d.ts +11 -0
- package/dist/containers/iso-base-media/collect-sample-positions-from-moof-boxes.js +13 -0
- package/dist/containers/iso-base-media/collect-sample-positions-from-trak.d.ts +2 -0
- package/dist/containers/iso-base-media/collect-sample-positions-from-trak.js +46 -0
- package/dist/containers/iso-base-media/find-keyframe-before-time.d.ts +10 -0
- package/dist/containers/iso-base-media/find-keyframe-before-time.js +28 -0
- package/dist/containers/iso-base-media/get-children.d.ts +7 -3
- package/dist/containers/iso-base-media/get-children.js +7 -3
- package/dist/containers/iso-base-media/get-keyframes.js +9 -4
- package/dist/containers/iso-base-media/get-mfra-atom.d.ts +9 -0
- package/dist/containers/iso-base-media/get-mfra-atom.js +12 -0
- package/dist/containers/iso-base-media/get-mfra-seeking-box.d.ts +13 -0
- package/dist/containers/iso-base-media/get-mfra-seeking-box.js +32 -0
- package/dist/containers/iso-base-media/get-moov-atom.js +58 -42
- package/dist/containers/iso-base-media/get-sample-position-bounds.d.ts +5 -0
- package/dist/containers/iso-base-media/get-sample-position-bounds.js +19 -0
- package/dist/containers/iso-base-media/get-sample-positions-from-track.d.ts +7 -2
- package/dist/containers/iso-base-media/get-sample-positions-from-track.js +18 -48
- package/dist/containers/iso-base-media/get-seeking-from-mp4.d.ts +11 -5
- package/dist/containers/iso-base-media/get-seeking-from-mp4.js +100 -36
- package/dist/containers/iso-base-media/get-seeking-info-from-mp4.d.ts +11 -0
- package/dist/containers/iso-base-media/get-seeking-info-from-mp4.js +25 -0
- package/dist/containers/iso-base-media/mdat/mdat.js +42 -26
- package/dist/containers/iso-base-media/mfra/find-best-segment-from-tfra.d.ts +11 -0
- package/dist/containers/iso-base-media/mfra/find-best-segment-from-tfra.js +27 -0
- package/dist/containers/iso-base-media/mfra/get-mfra-atom.d.ts +81 -0
- package/dist/containers/iso-base-media/mfra/get-mfra-atom.js +23 -0
- package/dist/containers/iso-base-media/mfra/get-mfro-atom.d.ts +9 -0
- package/dist/containers/iso-base-media/mfra/get-mfro-atom.js +38 -0
- package/dist/containers/iso-base-media/mfra/mfra.d.ts +2 -0
- package/dist/containers/iso-base-media/mfra/mfra.js +11 -0
- package/dist/containers/iso-base-media/mfra/tfra.d.ts +19 -0
- package/dist/containers/iso-base-media/mfra/tfra.js +100 -0
- package/dist/containers/iso-base-media/moov/moov.d.ts +7 -3
- package/dist/containers/iso-base-media/moov/moov.js +4 -2
- package/dist/containers/iso-base-media/parse-boxes.js +20 -4
- package/dist/containers/iso-base-media/process-box.d.ts +26 -2
- package/dist/containers/iso-base-media/process-box.js +54 -15
- package/dist/containers/iso-base-media/stsd/mebx.d.ts +5 -3
- package/dist/containers/iso-base-media/stsd/mebx.js +6 -4
- package/dist/containers/iso-base-media/stsd/samples.d.ts +8 -5
- package/dist/containers/iso-base-media/stsd/samples.js +16 -9
- package/dist/containers/iso-base-media/stsd/stsd.d.ts +5 -3
- package/dist/containers/iso-base-media/stsd/stsd.js +3 -3
- package/dist/containers/iso-base-media/trak/trak.d.ts +5 -3
- package/dist/containers/iso-base-media/trak/trak.js +4 -2
- package/dist/containers/iso-base-media/traversal.d.ts +9 -2
- package/dist/containers/iso-base-media/traversal.js +15 -7
- package/dist/containers/m3u/get-duration-from-m3u.js +1 -1
- package/dist/containers/m3u/get-streams.js +1 -1
- package/dist/containers/m3u/iterate-over-segment-files.d.ts +1 -1
- package/dist/containers/m3u/iterate-over-segment-files.js +3 -2
- package/dist/containers/m3u/parse-m3u.js +1 -1
- package/dist/containers/m3u/run-over-m3u.js +11 -2
- package/dist/containers/mp3/id3.js +1 -1
- package/dist/containers/mp3/parse-mpeg-header.js +8 -2
- package/dist/containers/riff/expect-riff-box.js +7 -2
- package/dist/containers/riff/get-tracks-from-avi.js +1 -1
- package/dist/containers/riff/parse-movi.js +35 -26
- package/dist/containers/riff/parse-riff-body.js +13 -5
- package/dist/containers/riff/parse-riff-header.js +1 -1
- package/dist/containers/riff/parse-video-section.d.ts +1 -1
- package/dist/containers/riff/parse-video-section.js +3 -3
- package/dist/containers/transport-stream/get-tracks.js +1 -1
- package/dist/containers/transport-stream/handle-aac-packet.js +12 -3
- package/dist/containers/transport-stream/handle-avc-packet.js +16 -3
- package/dist/containers/transport-stream/parse-packet.js +1 -1
- package/dist/containers/transport-stream/parse-transport-stream.js +1 -1
- package/dist/containers/transport-stream/process-audio.d.ts +21 -0
- package/dist/containers/transport-stream/process-audio.js +54 -0
- package/dist/containers/transport-stream/process-sample-if-possible.d.ts +2 -0
- package/dist/containers/transport-stream/process-sample-if-possible.js +62 -0
- package/dist/containers/transport-stream/process-video.d.ts +20 -0
- package/dist/containers/transport-stream/process-video.js +39 -0
- package/dist/containers/transport-stream/start-offset.d.ts +4 -0
- package/dist/containers/transport-stream/start-offset.js +13 -0
- package/dist/containers/wav/get-duration-from-wav.js +1 -1
- package/dist/containers/wav/get-seeking-byte.d.ts +7 -0
- package/dist/containers/wav/get-seeking-byte.js +15 -0
- package/dist/containers/wav/get-seeking-info.d.ts +7 -0
- package/dist/containers/wav/get-seeking-info.js +20 -0
- package/dist/containers/wav/parse-data.js +2 -2
- package/dist/containers/wav/parse-fmt.js +7 -2
- package/dist/containers/wav/parse-header.js +1 -1
- package/dist/containers/wav/parse-id3.js +1 -1
- package/dist/containers/wav/parse-list.js +1 -1
- package/dist/containers/wav/parse-media-section.d.ts +5 -0
- package/dist/containers/wav/parse-media-section.js +44 -0
- package/dist/containers/wav/parse-video-section.js +7 -5
- package/dist/containers/wav/parse-wav.js +4 -4
- package/dist/containers/webm/get-ready-tracks.js +2 -2
- package/dist/containers/webm/parse-ebml.js +17 -5
- package/dist/containers/webm/parse-webm-header.js +1 -1
- package/dist/controller/emitter.d.ts +33 -0
- package/dist/controller/emitter.js +66 -0
- package/dist/controller/media-parser-controller.d.ts +23 -0
- package/dist/controller/media-parser-controller.js +41 -0
- package/dist/controller/pause-signal.d.ts +11 -0
- package/dist/controller/pause-signal.js +38 -0
- package/dist/controller/performed-seeks-stats.d.ts +11 -0
- package/dist/controller/performed-seeks-stats.js +21 -0
- package/dist/controller/seek-signal.d.ts +19 -0
- package/dist/controller/seek-signal.js +24 -0
- package/dist/convert-audio-or-video-sample.d.ts +4 -1
- package/dist/convert-audio-or-video-sample.js +19 -6
- package/dist/disallow-forward-seek-if-samples-are-needed.d.ts +6 -0
- package/dist/disallow-forward-seek-if-samples-are-needed.js +14 -0
- package/dist/emit-audio-sample.d.ts +8 -5
- package/dist/emit-audio-sample.js +6 -6
- package/dist/emit-available-info.js +6 -6
- package/dist/emitter.d.ts +9 -0
- package/dist/emitter.js +35 -3
- package/dist/esm/index.mjs +5698 -4585
- package/dist/esm/server-worker.mjs +464 -0
- package/dist/esm/worker-server-entry.mjs +6554 -5438
- package/dist/esm/worker-web-entry.mjs +5498 -4382
- package/dist/esm/worker.mjs +26 -12
- package/dist/forward-controller.d.ts +1 -1
- package/dist/get-dimensions.js +2 -2
- package/dist/get-duration.js +21 -31
- package/dist/get-fps.js +7 -3
- package/dist/get-keyframes.js +2 -2
- package/dist/get-seeking-info.d.ts +19 -3
- package/dist/get-seeking-info.js +33 -7
- package/dist/get-tracks.js +12 -4
- package/dist/has-all-info.js +1 -1
- package/dist/index.d.ts +154 -135
- package/dist/index.js +3 -1
- package/dist/init-video.js +21 -12
- package/dist/internal-parse-media.js +6 -2
- package/dist/media-parser-controller.d.ts +2 -1
- package/dist/media-parser-controller.js +3 -2
- package/dist/metadata/get-metadata.js +1 -1
- package/dist/metadata/metadata-from-iso.js +5 -1
- package/dist/options.d.ts +1 -1
- package/dist/parse-loop.js +17 -4
- package/dist/parse-media-on-worker-entry.js +10 -6
- package/dist/perform-seek.d.ts +23 -3
- package/dist/perform-seek.js +44 -8
- package/dist/readers/reader.d.ts +1 -1
- package/dist/readers/state/aac-state.d.ts +13 -0
- package/dist/readers/state/aac-state.js +17 -0
- package/dist/readers/state/can-skip-tracks.d.ts +16 -0
- package/dist/readers/state/can-skip-tracks.js +60 -0
- package/dist/readers/state/current-reader.d.ts +6 -0
- package/dist/readers/state/current-reader.js +13 -0
- package/dist/readers/state/emitted-fields.d.ts +1 -0
- package/dist/readers/state/emitted-fields.js +37 -0
- package/dist/readers/state/flac-state.d.ts +4 -0
- package/dist/readers/state/flac-state.js +13 -0
- package/dist/readers/state/has-tracks-section.d.ts +14 -0
- package/dist/readers/state/has-tracks-section.js +37 -0
- package/dist/readers/state/images.d.ts +9 -0
- package/dist/readers/state/images.js +14 -0
- package/dist/readers/state/iso-base-media/cached-sample-positions.d.ts +12 -0
- package/dist/readers/state/iso-base-media/cached-sample-positions.js +46 -0
- package/dist/readers/state/iso-base-media/iso-state.d.ts +24 -0
- package/dist/readers/state/iso-base-media/iso-state.js +20 -0
- package/dist/readers/state/iso-base-media/lazy-mfra-load.d.ts +13 -0
- package/dist/readers/state/iso-base-media/lazy-mfra-load.js +29 -0
- package/dist/readers/state/iso-base-media/moov-box.d.ts +5 -0
- package/dist/readers/state/iso-base-media/moov-box.js +13 -0
- package/dist/readers/state/keyframes.d.ts +6 -0
- package/dist/readers/state/keyframes.js +15 -0
- package/dist/readers/state/m3u-state.d.ts +44 -0
- package/dist/readers/state/m3u-state.js +124 -0
- package/dist/readers/state/may-skip-video-data.d.ts +4 -0
- package/dist/readers/state/may-skip-video-data.js +18 -0
- package/dist/readers/state/mp3.d.ts +15 -0
- package/dist/readers/state/mp3.js +19 -0
- package/dist/readers/state/need-samples-for-fields.d.ts +6 -0
- package/dist/readers/state/need-samples-for-fields.js +39 -0
- package/dist/readers/state/parser-state.d.ts +252 -0
- package/dist/readers/state/parser-state.js +124 -0
- package/dist/readers/state/riff.d.ts +10 -0
- package/dist/readers/state/riff.js +32 -0
- package/dist/readers/state/sample-callbacks.d.ts +44 -0
- package/dist/readers/state/sample-callbacks.js +118 -0
- package/dist/readers/state/seek-infinite-loop.d.ts +5 -0
- package/dist/readers/state/seek-infinite-loop.js +22 -0
- package/dist/readers/state/slow-duration-fps.d.ts +11 -0
- package/dist/readers/state/slow-duration-fps.js +86 -0
- package/dist/readers/state/structure.d.ts +15 -0
- package/dist/readers/state/structure.js +78 -0
- package/dist/readers/state/timings.d.ts +8 -0
- package/dist/readers/state/timings.js +13 -0
- package/dist/readers/state/transport-stream/last-emitted-sample.d.ts +6 -0
- package/dist/readers/state/transport-stream/last-emitted-sample.js +16 -0
- package/dist/readers/state/transport-stream/next-pes-header-store.d.ts +6 -0
- package/dist/readers/state/transport-stream/next-pes-header-store.js +18 -0
- package/dist/readers/state/transport-stream/start-offset.d.ts +4 -0
- package/dist/readers/state/transport-stream/start-offset.js +13 -0
- package/dist/readers/state/transport-stream/transport-stream.d.ts +19 -0
- package/dist/readers/state/transport-stream/transport-stream.js +25 -0
- package/dist/readers/state/video-section.d.ts +33 -0
- package/dist/readers/state/video-section.js +65 -0
- package/dist/readers/state/webm.d.ts +28 -0
- package/dist/readers/state/webm.js +109 -0
- package/dist/register-track.d.ts +17 -4
- package/dist/register-track.js +31 -17
- package/dist/run-parse-iteration.js +1 -1
- package/dist/seek-backwards.d.ts +15 -2
- package/dist/seek-backwards.js +7 -8
- package/dist/seek-forwards.d.ts +19 -2
- package/dist/seek-forwards.js +19 -12
- package/dist/seek-signal.d.ts +3 -6
- package/dist/seek-signal.js +4 -6
- package/dist/seeking-info.d.ts +11 -1
- package/dist/server-worker.d.ts +3 -0
- package/dist/server-worker.js +7 -0
- package/dist/server-worker.module.d.ts +2 -0
- package/dist/server-worker.module.js +12 -0
- package/dist/state/current-reader.d.ts +6 -0
- package/dist/state/current-reader.js +13 -0
- package/dist/state/iso-base-media/cached-sample-positions.d.ts +1 -1
- package/dist/state/iso-base-media/cached-sample-positions.js +7 -9
- package/dist/state/iso-base-media/iso-state.d.ts +15 -1
- package/dist/state/iso-base-media/iso-state.js +9 -1
- package/dist/state/iso-base-media/lazy-mfra-load.d.ts +14 -0
- package/dist/state/iso-base-media/lazy-mfra-load.js +29 -0
- package/dist/state/need-samples-for-fields.d.ts +1 -0
- package/dist/state/need-samples-for-fields.js +3 -3
- package/dist/state/parser-state.d.ts +146 -130
- package/dist/state/parser-state.js +15 -4
- package/dist/state/sample-callbacks.d.ts +3 -2
- package/dist/state/sample-callbacks.js +2 -4
- package/dist/state/seek-infinite-loop.d.ts +5 -0
- package/dist/state/seek-infinite-loop.js +22 -0
- package/dist/state/transport-stream/last-emitted-sample.d.ts +6 -0
- package/dist/state/transport-stream/last-emitted-sample.js +16 -0
- package/dist/state/transport-stream/next-pes-header-store.d.ts +6 -0
- package/dist/state/transport-stream/next-pes-header-store.js +18 -0
- package/dist/state/transport-stream/start-offset.d.ts +4 -0
- package/dist/state/transport-stream/start-offset.js +13 -0
- package/dist/state/transport-stream/transport-stream.d.ts +19 -0
- package/dist/state/transport-stream/transport-stream.js +24 -0
- package/dist/state/uml.d.ts +32 -0
- package/dist/state/uml.js +52 -0
- package/dist/state/video-section.d.ts +24 -6
- package/dist/state/video-section.js +51 -22
- package/dist/state/work-on-seek-request-options.d.ts +3 -0
- package/dist/state/work-on-seek-request-options.js +26 -0
- package/dist/throttled-progress.d.ts +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/with-resolvers.d.ts +5 -0
- package/dist/with-resolvers.js +13 -0
- package/dist/work-on-seek-request.d.ts +42 -1
- package/dist/work-on-seek-request.js +104 -15
- package/dist/worker/forward-controller.d.ts +1 -1
- package/dist/worker/forward-controller.js +4 -0
- package/dist/worker/worker-types.d.ts +6 -1
- package/dist/worker-server.js +3 -2
- package/dist/worker.js +1 -5
- package/dist/worker.module.d.ts +4 -0
- package/dist/worker.module.js +12 -0
- package/package.json +12 -3
package/dist/check-if-done.js
CHANGED
|
@@ -15,7 +15,7 @@ const checkIfDone = async (state) => {
|
|
|
15
15
|
return true;
|
|
16
16
|
}
|
|
17
17
|
if (state.iterator.counter.getOffset() === state.contentLength) {
|
|
18
|
-
if (state.getStructure().type === 'm3u' &&
|
|
18
|
+
if (state.structure.getStructure().type === 'm3u' &&
|
|
19
19
|
!state.m3u.getAllChunksProcessedOverall()) {
|
|
20
20
|
return false;
|
|
21
21
|
}
|
|
@@ -5,6 +5,7 @@ const aac_codecprivate_1 = require("../../aac-codecprivate");
|
|
|
5
5
|
const convert_audio_or_video_sample_1 = require("../../convert-audio-or-video-sample");
|
|
6
6
|
const emit_audio_sample_1 = require("../../emit-audio-sample");
|
|
7
7
|
const register_track_1 = require("../../register-track");
|
|
8
|
+
const work_on_seek_request_1 = require("../../work-on-seek-request");
|
|
8
9
|
const parseAac = async (state) => {
|
|
9
10
|
const { iterator } = state;
|
|
10
11
|
const startOffset = iterator.counter.getOffset();
|
|
@@ -48,7 +49,7 @@ const parseAac = async (state) => {
|
|
|
48
49
|
const data = iterator.getSlice(frameLength);
|
|
49
50
|
if (state.callbacks.tracks.getTracks().length === 0) {
|
|
50
51
|
await (0, register_track_1.registerAudioTrack)({
|
|
51
|
-
state,
|
|
52
|
+
workOnSeekRequestOptions: (0, work_on_seek_request_1.getWorkOnSeekRequestOptions)(state),
|
|
52
53
|
container: 'aac',
|
|
53
54
|
track: {
|
|
54
55
|
codec: (0, aac_codecprivate_1.mapAudioObjectTypeToCodecString)(audioObjectType),
|
|
@@ -62,6 +63,10 @@ const parseAac = async (state) => {
|
|
|
62
63
|
trakBox: null,
|
|
63
64
|
type: 'audio',
|
|
64
65
|
},
|
|
66
|
+
registerAudioSampleCallback: state.callbacks.registerAudioSampleCallback,
|
|
67
|
+
tracks: state.callbacks.tracks,
|
|
68
|
+
logLevel: state.logLevel,
|
|
69
|
+
onAudioTrack: state.onAudioTrack,
|
|
65
70
|
});
|
|
66
71
|
state.callbacks.tracks.setIsDone(state.logLevel);
|
|
67
72
|
}
|
|
@@ -72,17 +77,21 @@ const parseAac = async (state) => {
|
|
|
72
77
|
await (0, emit_audio_sample_1.emitAudioSample)({
|
|
73
78
|
trackId: 0,
|
|
74
79
|
audioSample: (0, convert_audio_or_video_sample_1.convertAudioOrVideoSampleToWebCodecsTimestamps)({
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
80
|
+
sample: {
|
|
81
|
+
duration,
|
|
82
|
+
type: 'key',
|
|
83
|
+
data,
|
|
84
|
+
offset: startOffset,
|
|
85
|
+
timescale: 1000000,
|
|
86
|
+
trackId: 0,
|
|
87
|
+
cts: timestamp,
|
|
88
|
+
dts: timestamp,
|
|
89
|
+
timestamp,
|
|
90
|
+
},
|
|
91
|
+
timescale: 1,
|
|
92
|
+
}),
|
|
93
|
+
workOnSeekRequestOptions: (0, work_on_seek_request_1.getWorkOnSeekRequestOptions)(state),
|
|
94
|
+
callbacks: state.callbacks,
|
|
86
95
|
});
|
|
87
96
|
return Promise.resolve(null);
|
|
88
97
|
};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import type { BufferIterator } from '../../iterator/buffer-iterator';
|
|
2
|
-
export declare const getChannelCount: (iterator: BufferIterator) => 1 | 2 | 3 | 4 |
|
|
2
|
+
export declare const getChannelCount: (iterator: BufferIterator) => 5 | 1 | 2 | 3 | 4 | 6 | 7 | 8;
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.getDurationFromFlac = void 0;
|
|
4
4
|
const getDurationFromFlac = (parserState) => {
|
|
5
|
-
const structure = parserState.getFlacStructure();
|
|
5
|
+
const structure = parserState.structure.getFlacStructure();
|
|
6
6
|
const streaminfo = structure.boxes.find((b) => b.type === 'flac-streaminfo');
|
|
7
7
|
if (!streaminfo) {
|
|
8
8
|
throw new Error('Streaminfo not found');
|
|
@@ -6,7 +6,7 @@ const getSampleRate = (iterator, state) => {
|
|
|
6
6
|
var _a, _b;
|
|
7
7
|
const mode = iterator.getBits(4);
|
|
8
8
|
if (mode === 0b0000) {
|
|
9
|
-
const structure = state.getFlacStructure();
|
|
9
|
+
const structure = state.structure.getFlacStructure();
|
|
10
10
|
const sampleRate = (_b = (_a = structure.boxes.find((box) => box.type === 'flac-streaminfo')) === null || _a === void 0 ? void 0 : _a.sampleRate) !== null && _b !== void 0 ? _b : null;
|
|
11
11
|
if (sampleRate === null) {
|
|
12
12
|
throw new Error('Sample rate not found');
|
|
@@ -4,6 +4,7 @@ exports.parseFlacFrame = exports.parseFrameHeader = void 0;
|
|
|
4
4
|
const convert_audio_or_video_sample_1 = require("../../convert-audio-or-video-sample");
|
|
5
5
|
const emit_audio_sample_1 = require("../../emit-audio-sample");
|
|
6
6
|
const buffer_iterator_1 = require("../../iterator/buffer-iterator");
|
|
7
|
+
const work_on_seek_request_1 = require("../../work-on-seek-request");
|
|
7
8
|
const get_block_size_1 = require("./get-block-size");
|
|
8
9
|
const get_channel_count_1 = require("./get-channel-count");
|
|
9
10
|
const get_sample_rate_1 = require("./get-sample-rate");
|
|
@@ -72,7 +73,7 @@ const emitSample = async ({ state, data, offset, }) => {
|
|
|
72
73
|
}
|
|
73
74
|
const { blockSize, num, sampleRate } = parsed;
|
|
74
75
|
const duration = blockSize / sampleRate;
|
|
75
|
-
const structure = state.getFlacStructure();
|
|
76
|
+
const structure = state.structure.getFlacStructure();
|
|
76
77
|
const streamInfo = structure.boxes.find((box) => box.type === 'flac-streaminfo');
|
|
77
78
|
if (!streamInfo) {
|
|
78
79
|
throw new Error('Stream info not found');
|
|
@@ -84,17 +85,21 @@ const emitSample = async ({ state, data, offset, }) => {
|
|
|
84
85
|
await (0, emit_audio_sample_1.emitAudioSample)({
|
|
85
86
|
trackId: 0,
|
|
86
87
|
audioSample: (0, convert_audio_or_video_sample_1.convertAudioOrVideoSampleToWebCodecsTimestamps)({
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
88
|
+
sample: {
|
|
89
|
+
data,
|
|
90
|
+
duration,
|
|
91
|
+
cts: timestamp,
|
|
92
|
+
dts: timestamp,
|
|
93
|
+
timestamp,
|
|
94
|
+
type: 'key',
|
|
95
|
+
offset,
|
|
96
|
+
timescale: 1000000,
|
|
97
|
+
trackId: 0,
|
|
98
|
+
},
|
|
99
|
+
timescale: 1,
|
|
100
|
+
}),
|
|
101
|
+
workOnSeekRequestOptions: (0, work_on_seek_request_1.getWorkOnSeekRequestOptions)(state),
|
|
102
|
+
callbacks: state.callbacks,
|
|
98
103
|
});
|
|
99
104
|
iterator.destroy();
|
|
100
105
|
};
|
|
@@ -128,7 +133,7 @@ const parseFlacFrame = async ({ state, iterator, }) => {
|
|
|
128
133
|
throw new Error('Blocking bit should be set');
|
|
129
134
|
}
|
|
130
135
|
iterator.stopReadingBits();
|
|
131
|
-
const structure = state.getFlacStructure();
|
|
136
|
+
const structure = state.structure.getFlacStructure();
|
|
132
137
|
const minimumFrameSize = (_b = (_a = structure.boxes.find((b) => b.type === 'flac-streaminfo')) === null || _a === void 0 ? void 0 : _a.minimumFrameSize) !== null && _b !== void 0 ? _b : null;
|
|
133
138
|
if (minimumFrameSize === null) {
|
|
134
139
|
throw new Error('Expected flac-streaminfo');
|
|
@@ -13,8 +13,8 @@ const flacTypes = {
|
|
|
13
13
|
vorbisComment: 4,
|
|
14
14
|
};
|
|
15
15
|
const parseFlac = ({ iterator, state, }) => {
|
|
16
|
-
const
|
|
17
|
-
if (
|
|
16
|
+
const mediaSectionState = state.mediaSection.isCurrentByteInMediaSection(iterator);
|
|
17
|
+
if (mediaSectionState === 'in-section') {
|
|
18
18
|
if ((0, may_skip_video_data_1.maySkipVideoData)({ state })) {
|
|
19
19
|
return Promise.resolve((0, skip_1.makeSkip)(state.contentLength));
|
|
20
20
|
}
|
|
@@ -33,7 +33,7 @@ const parseFlac = ({ iterator, state, }) => {
|
|
|
33
33
|
iterator.stopReadingBits();
|
|
34
34
|
const size = iterator.getUint24();
|
|
35
35
|
if (isLastMetadata) {
|
|
36
|
-
state.
|
|
36
|
+
state.mediaSection.addMediaSection({
|
|
37
37
|
start: iterator.counter.getOffset() + size,
|
|
38
38
|
size: state.contentLength - iterator.counter.getOffset() - size,
|
|
39
39
|
});
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.parseFlacHeader = void 0;
|
|
4
4
|
const parseFlacHeader = ({ state, }) => {
|
|
5
|
-
state.getFlacStructure().boxes.push({
|
|
5
|
+
state.structure.getFlacStructure().boxes.push({
|
|
6
6
|
type: 'flac-header',
|
|
7
7
|
});
|
|
8
8
|
return Promise.resolve(null);
|
|
@@ -17,7 +17,7 @@ const parseVorbisComment = ({ state, iterator, size, }) => {
|
|
|
17
17
|
const [key, value] = field.split('=');
|
|
18
18
|
box.fields.push({ key: key.toLowerCase(), value, trackId: null });
|
|
19
19
|
}
|
|
20
|
-
state.getFlacStructure().boxes.push(box);
|
|
20
|
+
state.structure.getFlacStructure().boxes.push(box);
|
|
21
21
|
expectNoMoreBytes();
|
|
22
22
|
return Promise.resolve(null);
|
|
23
23
|
};
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.parseStreamInfo = void 0;
|
|
4
4
|
const register_track_1 = require("../../register-track");
|
|
5
|
+
const work_on_seek_request_1 = require("../../work-on-seek-request");
|
|
5
6
|
const parseStreamInfo = async ({ iterator, state, }) => {
|
|
6
7
|
const counter = iterator.counter.getOffset();
|
|
7
8
|
const minimumBlockSize = iterator.getUint16();
|
|
@@ -30,10 +31,10 @@ const parseStreamInfo = async ({ iterator, state, }) => {
|
|
|
30
31
|
sampleRate,
|
|
31
32
|
totalSamples,
|
|
32
33
|
};
|
|
33
|
-
state.getFlacStructure().boxes.push(flacStreamInfo);
|
|
34
|
+
state.structure.getFlacStructure().boxes.push(flacStreamInfo);
|
|
34
35
|
await (0, register_track_1.registerAudioTrack)({
|
|
35
36
|
container: 'flac',
|
|
36
|
-
state,
|
|
37
|
+
workOnSeekRequestOptions: (0, work_on_seek_request_1.getWorkOnSeekRequestOptions)(state),
|
|
37
38
|
track: {
|
|
38
39
|
codec: 'flac',
|
|
39
40
|
type: 'audio',
|
|
@@ -46,6 +47,10 @@ const parseStreamInfo = async ({ iterator, state, }) => {
|
|
|
46
47
|
trackId: 0,
|
|
47
48
|
trakBox: null,
|
|
48
49
|
},
|
|
50
|
+
registerAudioSampleCallback: state.callbacks.registerAudioSampleCallback,
|
|
51
|
+
tracks: state.callbacks.tracks,
|
|
52
|
+
logLevel: state.logLevel,
|
|
53
|
+
onAudioTrack: state.onAudioTrack,
|
|
49
54
|
});
|
|
50
55
|
state.callbacks.tracks.setIsDone(state.logLevel);
|
|
51
56
|
return Promise.resolve(null);
|
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.parseFlacUnkownBlock = void 0;
|
|
4
4
|
const parseFlacUnkownBlock = ({ iterator, state, size, }) => {
|
|
5
5
|
iterator.discard(size);
|
|
6
|
-
state.getFlacStructure().boxes.push({
|
|
6
|
+
state.structure.getFlacStructure().boxes.push({
|
|
7
7
|
type: 'flac-header',
|
|
8
8
|
});
|
|
9
9
|
return Promise.resolve(null);
|
|
@@ -4,6 +4,7 @@ import type { FtypBox } from './ftyp';
|
|
|
4
4
|
import type { MdhdBox } from './mdhd';
|
|
5
5
|
import type { HdlrBox } from './meta/hdlr';
|
|
6
6
|
import type { IlstBox } from './meta/ilst';
|
|
7
|
+
import type { TfraBox } from './mfra/tfra';
|
|
7
8
|
import type { MoovBox } from './moov/moov';
|
|
8
9
|
import type { MvhdBox } from './mvhd';
|
|
9
10
|
import type { Av1CBox } from './stsd/av1c';
|
|
@@ -34,4 +35,4 @@ export interface RegularBox extends BaseBox {
|
|
|
34
35
|
type: 'regular-box';
|
|
35
36
|
}
|
|
36
37
|
export type BoxAndNext = IsoBaseMediaBox | null;
|
|
37
|
-
export type IsoBaseMediaBox = RegularBox | FtypBox | MvhdBox | TkhdBox | StsdBox | MebxBox | KeysBox | MoovBox | TrakBox | SttsBox | MdhdBox | IlstBox | EsdsBox | StszBox | StcoBox | StscBox | AvccBox | HvccBox | VoidBox | StssBox | PaspBox | CttsBox | Av1CBox | TrunBox | HdlrBox | ColorParameterBox | TfdtBox | TfhdBox;
|
|
38
|
+
export type IsoBaseMediaBox = RegularBox | FtypBox | MvhdBox | TkhdBox | StsdBox | MebxBox | KeysBox | MoovBox | TrakBox | SttsBox | MdhdBox | IlstBox | EsdsBox | StszBox | StcoBox | StscBox | AvccBox | HvccBox | VoidBox | StssBox | PaspBox | CttsBox | Av1CBox | TrunBox | HdlrBox | ColorParameterBox | TfdtBox | TfhdBox | TfraBox;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { IsoBaseMediaBox } from './base-media-box';
|
|
2
|
+
import type { TfraBox } from './mfra/tfra';
|
|
3
|
+
import type { TkhdBox } from './tkhd';
|
|
4
|
+
export declare const collectSamplePositionsFromMoofBoxes: ({ moofBoxes, tfraBoxes, tkhdBox, }: {
|
|
5
|
+
moofBoxes: IsoBaseMediaBox[];
|
|
6
|
+
tfraBoxes: TfraBox[];
|
|
7
|
+
tkhdBox: TkhdBox;
|
|
8
|
+
}) => {
|
|
9
|
+
samplePositions: import("../..").SamplePosition[][];
|
|
10
|
+
isComplete: boolean;
|
|
11
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.collectSamplePositionsFromMoofBoxes = void 0;
|
|
4
|
+
const samples_from_moof_1 = require("../../samples-from-moof");
|
|
5
|
+
const collectSamplePositionsFromMoofBoxes = ({ moofBoxes, tfraBoxes, tkhdBox, }) => {
|
|
6
|
+
const isComplete = tfraBoxes.length > 0 &&
|
|
7
|
+
tfraBoxes.every((t) => t.entries.length === moofBoxes.length);
|
|
8
|
+
const samplePositions_ = moofBoxes.map((m) => {
|
|
9
|
+
return (0, samples_from_moof_1.getSamplesFromMoof)({ moofBox: m, trackId: tkhdBox.trackId });
|
|
10
|
+
});
|
|
11
|
+
return { samplePositions: samplePositions_, isComplete };
|
|
12
|
+
};
|
|
13
|
+
exports.collectSamplePositionsFromMoofBoxes = collectSamplePositionsFromMoofBoxes;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.collectSamplePositionsFromTrak = void 0;
|
|
4
|
+
const get_audio_codec_1 = require("../../get-audio-codec");
|
|
5
|
+
const get_fps_1 = require("../../get-fps");
|
|
6
|
+
const get_sample_positions_1 = require("../../get-sample-positions");
|
|
7
|
+
const get_sample_positions_from_lpcm_1 = require("../../get-sample-positions-from-lpcm");
|
|
8
|
+
const traversal_1 = require("./traversal");
|
|
9
|
+
const collectSamplePositionsFromTrak = (trakBox) => {
|
|
10
|
+
const isLpcm = (0, get_audio_codec_1.isLpcmAudioCodec)(trakBox);
|
|
11
|
+
const timescaleAndDuration = (0, get_fps_1.getTimescaleAndDuration)(trakBox);
|
|
12
|
+
if (isLpcm) {
|
|
13
|
+
return (0, get_sample_positions_from_lpcm_1.getSamplePositionsFromLpcm)(trakBox);
|
|
14
|
+
}
|
|
15
|
+
const stszBox = (0, traversal_1.getStszBox)(trakBox);
|
|
16
|
+
const stcoBox = (0, traversal_1.getStcoBox)(trakBox);
|
|
17
|
+
const stscBox = (0, traversal_1.getStscBox)(trakBox);
|
|
18
|
+
const stssBox = (0, traversal_1.getStssBox)(trakBox);
|
|
19
|
+
const sttsBox = (0, traversal_1.getSttsBox)(trakBox);
|
|
20
|
+
const cttsBox = (0, traversal_1.getCttsBox)(trakBox);
|
|
21
|
+
if (!stszBox) {
|
|
22
|
+
throw new Error('Expected stsz box in trak box');
|
|
23
|
+
}
|
|
24
|
+
if (!stcoBox) {
|
|
25
|
+
throw new Error('Expected stco box in trak box');
|
|
26
|
+
}
|
|
27
|
+
if (!stscBox) {
|
|
28
|
+
throw new Error('Expected stsc box in trak box');
|
|
29
|
+
}
|
|
30
|
+
if (!sttsBox) {
|
|
31
|
+
throw new Error('Expected stts box in trak box');
|
|
32
|
+
}
|
|
33
|
+
if (!timescaleAndDuration) {
|
|
34
|
+
throw new Error('Expected timescale and duration in trak box');
|
|
35
|
+
}
|
|
36
|
+
const samplePositions = (0, get_sample_positions_1.getSamplePositions)({
|
|
37
|
+
stcoBox,
|
|
38
|
+
stscBox,
|
|
39
|
+
stszBox,
|
|
40
|
+
stssBox,
|
|
41
|
+
sttsBox,
|
|
42
|
+
cttsBox,
|
|
43
|
+
});
|
|
44
|
+
return samplePositions;
|
|
45
|
+
};
|
|
46
|
+
exports.collectSamplePositionsFromTrak = collectSamplePositionsFromTrak;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { SamplePosition } from '../../get-sample-positions';
|
|
2
|
+
import type { LogLevel } from '../../log';
|
|
3
|
+
import type { MediaSection } from '../../state/video-section';
|
|
4
|
+
export declare const findKeyframeBeforeTime: ({ samplePositions, time, timescale, mediaSections, logLevel, }: {
|
|
5
|
+
samplePositions: SamplePosition[];
|
|
6
|
+
time: number;
|
|
7
|
+
timescale: number;
|
|
8
|
+
mediaSections: MediaSection[];
|
|
9
|
+
logLevel: LogLevel;
|
|
10
|
+
}) => number | null;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.findKeyframeBeforeTime = void 0;
|
|
4
|
+
const log_1 = require("../../log");
|
|
5
|
+
const findKeyframeBeforeTime = ({ samplePositions, time, timescale, mediaSections, logLevel, }) => {
|
|
6
|
+
let byte = 0;
|
|
7
|
+
let sam = null;
|
|
8
|
+
for (const sample of samplePositions) {
|
|
9
|
+
const ctsInSeconds = sample.cts / timescale;
|
|
10
|
+
const dtsInSeconds = sample.dts / timescale;
|
|
11
|
+
if ((ctsInSeconds <= time || dtsInSeconds <= time) &&
|
|
12
|
+
byte <= sample.offset &&
|
|
13
|
+
sample.isKeyframe) {
|
|
14
|
+
byte = sample.offset;
|
|
15
|
+
sam = sample;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
if (!sam) {
|
|
19
|
+
throw new Error('No sample found');
|
|
20
|
+
}
|
|
21
|
+
const mediaSection = mediaSections.find((section) => sam.offset >= section.start && sam.offset < section.start + section.size);
|
|
22
|
+
if (!mediaSection) {
|
|
23
|
+
log_1.Log.trace(logLevel, 'Found a sample, but the offset has not yet been marked as a video section yet. Not yet able to seek, but probably once we have started reading the next box.', sam);
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
return sam.offset;
|
|
27
|
+
};
|
|
28
|
+
exports.findKeyframeBeforeTime = findKeyframeBeforeTime;
|
|
@@ -1,6 +1,10 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { BufferIterator } from '../../iterator/buffer-iterator';
|
|
2
|
+
import type { LogLevel } from '../../log';
|
|
2
3
|
import type { IsoBaseMediaBox } from './base-media-box';
|
|
3
|
-
|
|
4
|
-
|
|
4
|
+
import type { OnlyIfMoovAtomExpected } from './process-box';
|
|
5
|
+
export declare const getIsoBaseMediaChildren: ({ size, iterator, logLevel, onlyIfMoovAtomExpected, }: {
|
|
5
6
|
size: number;
|
|
7
|
+
iterator: BufferIterator;
|
|
8
|
+
logLevel: LogLevel;
|
|
9
|
+
onlyIfMoovAtomExpected: OnlyIfMoovAtomExpected | null;
|
|
6
10
|
}) => Promise<IsoBaseMediaBox[]>;
|
|
@@ -2,12 +2,16 @@
|
|
|
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 ({
|
|
5
|
+
const getIsoBaseMediaChildren = async ({ size, iterator, logLevel, onlyIfMoovAtomExpected, }) => {
|
|
6
6
|
const boxes = [];
|
|
7
|
-
const { iterator } = state;
|
|
8
7
|
const initial = iterator.counter.getOffset();
|
|
9
8
|
while (iterator.counter.getOffset() < size + initial) {
|
|
10
|
-
const parsed = await (0, process_box_1.processBox)(
|
|
9
|
+
const parsed = await (0, process_box_1.processBox)({
|
|
10
|
+
iterator,
|
|
11
|
+
logLevel,
|
|
12
|
+
onlyIfMoovAtomExpected,
|
|
13
|
+
onlyIfMdatAtomExpected: null,
|
|
14
|
+
});
|
|
11
15
|
if (!parsed) {
|
|
12
16
|
throw new Error('Expected box');
|
|
13
17
|
}
|
|
@@ -6,14 +6,19 @@ const get_sample_positions_from_track_1 = require("./get-sample-positions-from-t
|
|
|
6
6
|
const traversal_1 = require("./traversal");
|
|
7
7
|
const getKeyframesFromIsoBaseMedia = (state) => {
|
|
8
8
|
const { videoTracks } = (0, get_tracks_1.getTracksFromIsoBaseMedia)(state);
|
|
9
|
-
const structure = state.getIsoStructure();
|
|
10
|
-
const
|
|
9
|
+
const structure = state.structure.getIsoStructure();
|
|
10
|
+
const moofBoxes = (0, traversal_1.getMoofBoxes)(structure.boxes);
|
|
11
|
+
const tfraBoxes = (0, traversal_1.getTfraBoxes)(structure);
|
|
11
12
|
const allSamples = videoTracks.map((t) => {
|
|
12
13
|
const { timescale: ts } = t;
|
|
13
|
-
const samplePositions = (0, get_sample_positions_from_track_1.getSamplePositionsFromTrack)({
|
|
14
|
+
const { samplePositions, isComplete } = (0, get_sample_positions_from_track_1.getSamplePositionsFromTrack)({
|
|
14
15
|
trakBox: t.trakBox,
|
|
15
|
-
moofBoxes
|
|
16
|
+
moofBoxes,
|
|
17
|
+
tfraBoxes,
|
|
16
18
|
});
|
|
19
|
+
if (!isComplete) {
|
|
20
|
+
return [];
|
|
21
|
+
}
|
|
17
22
|
const keyframes = samplePositions
|
|
18
23
|
.filter((k) => {
|
|
19
24
|
return k.isKeyframe;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { MediaParserController } from '../../controller/media-parser-controller';
|
|
2
|
+
import type { ParseMediaSrc } from '../../options';
|
|
3
|
+
import type { ReaderInterface } from '../../readers/reader';
|
|
4
|
+
export declare const getMfraAtom: ({ src, contentLength, readerInterface, controller, }: {
|
|
5
|
+
src: ParseMediaSrc;
|
|
6
|
+
contentLength: number;
|
|
7
|
+
readerInterface: ReaderInterface;
|
|
8
|
+
controller: MediaParserController;
|
|
9
|
+
}) => Promise<import("../../readers/reader").Reader>;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getMfraAtom = void 0;
|
|
4
|
+
const getMfraAtom = async ({ src, contentLength, readerInterface, controller, }) => {
|
|
5
|
+
const result = await readerInterface.read({
|
|
6
|
+
controller,
|
|
7
|
+
range: [contentLength - 16, contentLength - 1],
|
|
8
|
+
src,
|
|
9
|
+
});
|
|
10
|
+
return result.reader;
|
|
11
|
+
};
|
|
12
|
+
exports.getMfraAtom = getMfraAtom;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { MediaParserController } from '../../controller/media-parser-controller';
|
|
2
|
+
import type { LogLevel } from '../../log';
|
|
3
|
+
import type { ParseMediaSrc } from '../../options';
|
|
4
|
+
import type { ReaderInterface } from '../../readers/reader';
|
|
5
|
+
import type { IsoBaseMediaBox } from './base-media-box';
|
|
6
|
+
export type MfraSeekingBoxOptions = {
|
|
7
|
+
contentLength: number;
|
|
8
|
+
controller: MediaParserController;
|
|
9
|
+
readerInterface: ReaderInterface;
|
|
10
|
+
src: ParseMediaSrc;
|
|
11
|
+
logLevel: LogLevel;
|
|
12
|
+
};
|
|
13
|
+
export declare const getMfraSeekingBox: ({ contentLength, controller, readerInterface, src, logLevel, }: MfraSeekingBoxOptions) => Promise<IsoBaseMediaBox[] | null>;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getMfraSeekingBox = void 0;
|
|
4
|
+
const get_children_1 = require("./get-children");
|
|
5
|
+
const get_mfra_atom_1 = require("./mfra/get-mfra-atom");
|
|
6
|
+
const get_mfro_atom_1 = require("./mfra/get-mfro-atom");
|
|
7
|
+
const getMfraSeekingBox = async ({ contentLength, controller, readerInterface, src, logLevel, }) => {
|
|
8
|
+
const parentSize = await (0, get_mfro_atom_1.getMfroAtom)({
|
|
9
|
+
contentLength,
|
|
10
|
+
controller,
|
|
11
|
+
readerInterface,
|
|
12
|
+
src,
|
|
13
|
+
});
|
|
14
|
+
if (!parentSize) {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
const mfraAtom = await (0, get_mfra_atom_1.getMfraAtom)({
|
|
18
|
+
contentLength,
|
|
19
|
+
controller,
|
|
20
|
+
readerInterface,
|
|
21
|
+
src,
|
|
22
|
+
parentSize,
|
|
23
|
+
});
|
|
24
|
+
mfraAtom.discard(8);
|
|
25
|
+
return (0, get_children_1.getIsoBaseMediaChildren)({
|
|
26
|
+
iterator: mfraAtom,
|
|
27
|
+
logLevel,
|
|
28
|
+
size: parentSize - 8,
|
|
29
|
+
onlyIfMoovAtomExpected: null,
|
|
30
|
+
});
|
|
31
|
+
};
|
|
32
|
+
exports.getMfraSeekingBox = getMfraSeekingBox;
|
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.getMoovAtom = void 0;
|
|
4
|
+
const buffer_iterator_1 = require("../../iterator/buffer-iterator");
|
|
4
5
|
const log_1 = require("../../log");
|
|
5
6
|
const register_track_1 = require("../../register-track");
|
|
6
|
-
const
|
|
7
|
+
const can_skip_tracks_1 = require("../../state/can-skip-tracks");
|
|
8
|
+
const has_tracks_section_1 = require("../../state/has-tracks-section");
|
|
9
|
+
const structure_1 = require("../../state/structure");
|
|
10
|
+
const work_on_seek_request_1 = require("../../work-on-seek-request");
|
|
7
11
|
const process_box_1 = require("./process-box");
|
|
8
12
|
const traversal_1 = require("./traversal");
|
|
9
|
-
// TODO: await parseMedia({fields: {moovAtom: true}) would be a nicer API
|
|
10
13
|
const getMoovAtom = async ({ endOfMdat, state, }) => {
|
|
11
14
|
const headerSegment = state.mp4HeaderSegment;
|
|
12
15
|
if (headerSegment) {
|
|
@@ -23,61 +26,74 @@ const getMoovAtom = async ({ endOfMdat, state, }) => {
|
|
|
23
26
|
range: endOfMdat,
|
|
24
27
|
controller: state.controller,
|
|
25
28
|
});
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
contentType: null,
|
|
56
|
-
mimeType: null,
|
|
57
|
-
name: '',
|
|
58
|
-
initialReaderInstance: reader,
|
|
59
|
-
});
|
|
29
|
+
const onAudioTrack = state.onAudioTrack
|
|
30
|
+
? async ({ track, container }) => {
|
|
31
|
+
await (0, register_track_1.registerAudioTrack)({
|
|
32
|
+
workOnSeekRequestOptions: (0, work_on_seek_request_1.getWorkOnSeekRequestOptions)(state),
|
|
33
|
+
track,
|
|
34
|
+
container,
|
|
35
|
+
logLevel: state.logLevel,
|
|
36
|
+
onAudioTrack: state.onAudioTrack,
|
|
37
|
+
registerAudioSampleCallback: state.callbacks.registerAudioSampleCallback,
|
|
38
|
+
tracks: state.callbacks.tracks,
|
|
39
|
+
});
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
: null;
|
|
43
|
+
const onVideoTrack = state.onVideoTrack
|
|
44
|
+
? async ({ track, container }) => {
|
|
45
|
+
await (0, register_track_1.registerVideoTrack)({
|
|
46
|
+
workOnSeekRequestOptions: (0, work_on_seek_request_1.getWorkOnSeekRequestOptions)(state),
|
|
47
|
+
track,
|
|
48
|
+
container,
|
|
49
|
+
logLevel: state.logLevel,
|
|
50
|
+
onVideoTrack: state.onVideoTrack,
|
|
51
|
+
registerVideoSampleCallback: state.callbacks.registerVideoSampleCallback,
|
|
52
|
+
tracks: state.callbacks.tracks,
|
|
53
|
+
});
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
: null;
|
|
57
|
+
const iterator = (0, buffer_iterator_1.getArrayBufferIterator)(new Uint8Array([]), state.contentLength);
|
|
60
58
|
while (true) {
|
|
61
59
|
const result = await reader.reader.read();
|
|
62
60
|
if (result.value) {
|
|
63
|
-
|
|
61
|
+
iterator.addData(result.value);
|
|
64
62
|
}
|
|
65
63
|
if (result.done) {
|
|
66
64
|
break;
|
|
67
65
|
}
|
|
68
66
|
}
|
|
69
67
|
const boxes = [];
|
|
68
|
+
const canSkipTracksState = (0, can_skip_tracks_1.makeCanSkipTracksState)({
|
|
69
|
+
hasAudioTrackHandlers: false,
|
|
70
|
+
fields: { structure: true },
|
|
71
|
+
hasVideoTrackHandlers: false,
|
|
72
|
+
structure: (0, structure_1.structureState)(),
|
|
73
|
+
});
|
|
74
|
+
const tracksState = (0, has_tracks_section_1.makeTracksSectionState)(canSkipTracksState, state.src);
|
|
70
75
|
while (true) {
|
|
71
|
-
const box = await (0, process_box_1.processBox)(
|
|
76
|
+
const box = await (0, process_box_1.processBox)({
|
|
77
|
+
iterator,
|
|
78
|
+
logLevel: state.logLevel,
|
|
79
|
+
onlyIfMoovAtomExpected: {
|
|
80
|
+
tracks: tracksState,
|
|
81
|
+
isoState: null,
|
|
82
|
+
workOnSeekRequestOptions: null,
|
|
83
|
+
onAudioTrack,
|
|
84
|
+
onVideoTrack,
|
|
85
|
+
registerVideoSampleCallback: () => Promise.resolve(),
|
|
86
|
+
registerAudioSampleCallback: () => Promise.resolve(),
|
|
87
|
+
},
|
|
88
|
+
onlyIfMdatAtomExpected: null,
|
|
89
|
+
});
|
|
72
90
|
if (box) {
|
|
73
91
|
boxes.push(box);
|
|
74
92
|
}
|
|
75
|
-
if (
|
|
76
|
-
state.contentLength) {
|
|
93
|
+
if (iterator.counter.getOffset() + endOfMdat > state.contentLength) {
|
|
77
94
|
throw new Error('Read past end of file');
|
|
78
95
|
}
|
|
79
|
-
if (
|
|
80
|
-
state.contentLength) {
|
|
96
|
+
if (iterator.counter.getOffset() + endOfMdat === state.contentLength) {
|
|
81
97
|
break;
|
|
82
98
|
}
|
|
83
99
|
}
|