@remotion/media-parser 4.0.290 → 4.0.292
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/iso-base-media/base-media-box.d.ts +0 -1
- package/dist/containers/iso-base-media/collect-sample-positions-from-moof-boxes.d.ts +4 -1
- package/dist/containers/iso-base-media/collect-sample-positions-from-moof-boxes.js +9 -5
- package/dist/containers/iso-base-media/find-keyframe-before-time.js +16 -11
- package/dist/containers/iso-base-media/find-track-to-seek.d.ts +14 -0
- package/dist/containers/iso-base-media/find-track-to-seek.js +39 -0
- package/dist/containers/iso-base-media/get-children.js +2 -2
- package/dist/containers/iso-base-media/get-keyframes.js +6 -1
- package/dist/containers/iso-base-media/get-mfra-seeking-box.d.ts +3 -1
- package/dist/containers/iso-base-media/get-mfra-seeking-box.js +5 -1
- package/dist/containers/iso-base-media/get-moov-atom.js +6 -3
- package/dist/containers/iso-base-media/get-sample-position-bounds.js +3 -1
- package/dist/containers/iso-base-media/get-sample-positions-from-track.js +1 -1
- package/dist/containers/iso-base-media/get-seeking-byte-from-fragmented-mp4.d.ts +14 -0
- package/dist/containers/iso-base-media/get-seeking-byte-from-fragmented-mp4.js +89 -0
- package/dist/containers/iso-base-media/get-seeking-byte.d.ts +3 -3
- package/dist/containers/iso-base-media/get-seeking-byte.js +32 -96
- package/dist/containers/iso-base-media/mdat/calculate-jump-marks.d.ts +6 -0
- package/dist/containers/iso-base-media/mdat/calculate-jump-marks.js +131 -0
- package/dist/containers/iso-base-media/mdat/mdat.d.ts +2 -2
- package/dist/containers/iso-base-media/mdat/mdat.js +18 -2
- package/dist/containers/iso-base-media/mfra/find-best-segment-from-tfra.d.ts +3 -3
- package/dist/containers/iso-base-media/mfra/find-best-segment-from-tfra.js +2 -2
- package/dist/containers/iso-base-media/mfra/get-mfra-atom.d.ts +5 -1
- package/dist/containers/iso-base-media/mfra/get-mfra-atom.js +3 -1
- package/dist/containers/iso-base-media/mfra/get-mfro-atom.d.ts +5 -1
- package/dist/containers/iso-base-media/mfra/get-mfro-atom.js +3 -1
- package/dist/containers/iso-base-media/parse-boxes.js +5 -2
- package/dist/containers/iso-base-media/process-box.d.ts +16 -5
- package/dist/containers/iso-base-media/process-box.js +206 -118
- package/dist/containers/iso-base-media/sample-positions.d.ts +25 -0
- package/dist/containers/iso-base-media/sample-positions.js +37 -0
- package/dist/containers/iso-base-media/stsd/samples.js +1 -0
- package/dist/containers/iso-base-media/stsd/stsc.d.ts +1 -6
- package/dist/containers/iso-base-media/stsd/stsc.js +2 -5
- package/dist/containers/iso-base-media/stsd/stss.d.ts +1 -1
- package/dist/containers/iso-base-media/stsd/stss.js +2 -2
- package/dist/containers/iso-base-media/turn-sample-positions-into-array.d.ts +19 -0
- package/dist/containers/iso-base-media/turn-sample-positions-into-array.js +73 -0
- package/dist/containers/m3u/after-manifest-fetch.d.ts +5 -1
- package/dist/containers/m3u/after-manifest-fetch.js +3 -1
- package/dist/containers/m3u/first-sample-in-m3u-chunk.d.ts +13 -0
- package/dist/containers/m3u/first-sample-in-m3u-chunk.js +31 -0
- package/dist/containers/m3u/get-seeking-byte.d.ts +13 -0
- package/dist/containers/m3u/get-seeking-byte.js +32 -0
- package/dist/containers/m3u/get-streams.d.ts +1 -0
- package/dist/containers/m3u/get-streams.js +1 -0
- package/dist/containers/m3u/iterate-over-segment-files.d.ts +5 -3
- package/dist/containers/m3u/iterate-over-segment-files.js +11 -1
- package/dist/containers/m3u/parse-m3u-media-directive.js +1 -0
- package/dist/containers/m3u/parse-m3u.js +8 -0
- package/dist/containers/m3u/process-m3u-chunk.d.ts +12 -0
- package/dist/containers/m3u/process-m3u-chunk.js +274 -0
- package/dist/containers/m3u/run-over-m3u.js +7 -80
- package/dist/containers/m3u/sample-sorter.d.ts +1 -0
- package/dist/containers/m3u/sample-sorter.js +4 -1
- package/dist/containers/m3u/seek/get-chunk-to-seek-to.d.ts +5 -0
- package/dist/containers/m3u/seek/get-chunk-to-seek-to.js +14 -0
- package/dist/containers/m3u/seeking-hints.d.ts +2 -0
- package/dist/containers/m3u/seeking-hints.js +9 -0
- package/dist/containers/m3u/select-stream.d.ts +2 -1
- package/dist/containers/m3u/select-stream.js +7 -2
- package/dist/containers/m3u/types.d.ts +1 -0
- package/dist/containers/riff/seek/fetch-idx1.d.ts +3 -1
- package/dist/containers/riff/seek/fetch-idx1.js +3 -1
- package/dist/containers/transport-stream/handle-aac-packet.d.ts +2 -2
- package/dist/containers/transport-stream/handle-avc-packet.d.ts +2 -2
- package/dist/containers/transport-stream/process-audio.d.ts +2 -2
- package/dist/containers/transport-stream/process-stream-buffers.d.ts +3 -3
- package/dist/containers/transport-stream/process-video.d.ts +2 -2
- package/dist/containers/webm/get-sample-from-block.d.ts +12 -2
- package/dist/containers/webm/get-sample-from-block.js +40 -9
- package/dist/containers/webm/parse-ebml.js +28 -10
- package/dist/containers/webm/seek/fetch-web-cues.d.ts +3 -1
- package/dist/containers/webm/seek/fetch-web-cues.js +3 -1
- package/dist/containers/webm/state-for-processing.d.ts +2 -2
- package/dist/controller/media-parser-controller.d.ts +1 -1
- package/dist/controller/media-parser-controller.js +6 -2
- package/dist/controller/seek-signal.d.ts +1 -5
- package/dist/download-and-parse-media.js +1 -1
- package/dist/esm/index.mjs +1400 -611
- package/dist/esm/node.mjs +23 -3
- package/dist/esm/server-worker.mjs +8 -1
- package/dist/esm/universal.mjs +168 -15
- package/dist/esm/web.mjs +145 -13
- package/dist/esm/worker-server-entry.mjs +1467 -635
- package/dist/esm/worker-web-entry.mjs +1439 -634
- package/dist/esm/worker.mjs +8 -1
- package/dist/get-audio-codec.js +3 -0
- package/dist/get-duration.js +2 -1
- package/dist/get-fps.js +2 -1
- package/dist/get-sample-positions-from-mp4.js +10 -5
- package/dist/get-sample-positions.js +4 -4
- package/dist/get-seeking-byte.d.ts +5 -3
- package/dist/get-seeking-byte.js +19 -10
- package/dist/get-seeking-hints.d.ts +3 -3
- package/dist/get-seeking-hints.js +18 -13
- package/dist/get-tracks.d.ts +9 -1
- package/dist/get-tracks.js +13 -6
- package/dist/index.d.ts +21 -5
- package/dist/init-video.js +3 -2
- package/dist/internal-parse-media.js +13 -4
- package/dist/iterator/buffer-iterator.js +5 -3
- package/dist/metadata/metadata-from-iso.js +2 -1
- package/dist/options.d.ts +6 -1
- package/dist/parse-loop.js +22 -6
- package/dist/parse-media-on-worker-entry.js +1 -0
- package/dist/parse-media.js +1 -1
- package/dist/parse-result.d.ts +2 -2
- package/dist/perform-seek.d.ts +3 -1
- package/dist/perform-seek.js +3 -1
- package/dist/readers/fetch/get-body-and-reader.js +17 -2
- package/dist/readers/from-fetch.d.ts +17 -1
- package/dist/readers/from-fetch.js +68 -13
- package/dist/readers/from-node.js +24 -2
- package/dist/readers/from-web-file.js +3 -0
- package/dist/readers/reader.d.ts +19 -2
- package/dist/readers/universal.js +9 -0
- package/dist/readers/web.js +6 -0
- package/dist/register-track.d.ts +3 -3
- package/dist/seek-backwards.d.ts +3 -1
- package/dist/seek-backwards.js +4 -1
- package/dist/seek-forwards.d.ts +3 -1
- package/dist/seek-forwards.js +3 -1
- package/dist/seeking-hints.d.ts +4 -1
- package/dist/set-seeking-hints.js +4 -0
- package/dist/skip.d.ts +5 -0
- package/dist/skip.js +6 -1
- package/dist/state/can-skip-tracks.d.ts +1 -0
- package/dist/state/can-skip-tracks.js +10 -6
- package/dist/state/iso-base-media/cached-sample-positions.d.ts +15 -1
- package/dist/state/iso-base-media/cached-sample-positions.js +9 -4
- package/dist/state/iso-base-media/iso-state.d.ts +5 -1
- package/dist/state/iso-base-media/iso-state.js +2 -1
- package/dist/state/iso-base-media/lazy-mfra-load.d.ts +3 -1
- package/dist/state/iso-base-media/lazy-mfra-load.js +2 -1
- package/dist/state/keyframes.js +1 -0
- package/dist/state/m3u-state.d.ts +15 -4
- package/dist/state/m3u-state.js +20 -0
- package/dist/state/matroska/lazy-cues-fetch.d.ts +3 -1
- package/dist/state/matroska/lazy-cues-fetch.js +2 -1
- package/dist/state/matroska/webm.d.ts +3 -1
- package/dist/state/matroska/webm.js +2 -1
- package/dist/state/parser-state.d.ts +29 -13
- package/dist/state/parser-state.js +19 -5
- package/dist/state/riff/lazy-idx1-fetch.d.ts +3 -1
- package/dist/state/riff/lazy-idx1-fetch.js +2 -1
- package/dist/state/riff.d.ts +3 -1
- package/dist/state/riff.js +2 -1
- package/dist/state/sample-callbacks.d.ts +3 -2
- package/dist/state/sample-callbacks.js +3 -3
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/work-on-seek-request.d.ts +6 -3
- package/dist/work-on-seek-request.js +13 -13
- package/dist/worker/forward-controller-to-worker.js +1 -1
- package/dist/worker/serialize-error.js +26 -3
- package/dist/worker/worker-types.d.ts +7 -1
- package/dist/worker-server.js +2 -2
- package/package.json +3 -3
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
https://discord.com/channels/809501355504959528/1001500302375125055/1364798934832119870
|
|
4
|
+
Android 13 produces MP4 videos where first, all video samples are at the beginning,
|
|
5
|
+
then all audio samples are at the end.
|
|
6
|
+
|
|
7
|
+
This causes issues with our video decoder: "Waited too long for VideoDecoder" because
|
|
8
|
+
the overall progress is stuck.
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.calculateJumpMarks = void 0;
|
|
12
|
+
// In WebCodecs, we require the tracks to deviate by at most 10 seconds
|
|
13
|
+
// Therefore, we need to emit them to be less than 10 seconds apart
|
|
14
|
+
const MAX_SPREAD_IN_SECONDS = 8;
|
|
15
|
+
const getKey = (samplePositionTrack) => {
|
|
16
|
+
return `${samplePositionTrack.track.trackId}-${samplePositionTrack.samplePosition.dts}`;
|
|
17
|
+
};
|
|
18
|
+
const findBestJump = ({ allSamplesSortedByOffset, visited, progresses, }) => {
|
|
19
|
+
var _a;
|
|
20
|
+
const minProgress = Math.min(...Object.values(progresses));
|
|
21
|
+
const trackNumberWithLowestProgress = (_a = Object.entries(progresses).find(([, progress]) => progress === minProgress)) === null || _a === void 0 ? void 0 : _a[0];
|
|
22
|
+
const firstSampleAboveMinProgress = allSamplesSortedByOffset.findIndex((sample) => sample.track.trackId === Number(trackNumberWithLowestProgress) &&
|
|
23
|
+
!visited.has(getKey(sample)));
|
|
24
|
+
return firstSampleAboveMinProgress;
|
|
25
|
+
};
|
|
26
|
+
const calculateJumpMarks = (samplePositionTracks, endOfMdat) => {
|
|
27
|
+
const progresses = {};
|
|
28
|
+
for (const track of samplePositionTracks) {
|
|
29
|
+
progresses[track[0].track.trackId] = 0;
|
|
30
|
+
}
|
|
31
|
+
const jumpMarks = [];
|
|
32
|
+
const allSamplesSortedByOffset = samplePositionTracks
|
|
33
|
+
.flat(1)
|
|
34
|
+
.sort((a, b) => a.samplePosition.offset - b.samplePosition.offset);
|
|
35
|
+
let indexToVisit = 0;
|
|
36
|
+
const visited = new Set();
|
|
37
|
+
let rollOverToProcess = false;
|
|
38
|
+
const increaseIndex = () => {
|
|
39
|
+
indexToVisit++;
|
|
40
|
+
if (indexToVisit >= allSamplesSortedByOffset.length) {
|
|
41
|
+
rollOverToProcess = true;
|
|
42
|
+
indexToVisit = 0;
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
let lastVisitedSample = null;
|
|
46
|
+
const addJumpMark = ({ firstSampleAboveMinProgress, }) => {
|
|
47
|
+
if (!lastVisitedSample) {
|
|
48
|
+
throw new Error('no last visited sample');
|
|
49
|
+
}
|
|
50
|
+
const jumpMark = {
|
|
51
|
+
afterSampleWithOffset: lastVisitedSample.samplePosition.offset,
|
|
52
|
+
jumpToOffset: allSamplesSortedByOffset[firstSampleAboveMinProgress].samplePosition
|
|
53
|
+
.offset,
|
|
54
|
+
};
|
|
55
|
+
indexToVisit = firstSampleAboveMinProgress;
|
|
56
|
+
jumpMarks.push(jumpMark);
|
|
57
|
+
};
|
|
58
|
+
const addFinalJumpIfNecessary = () => {
|
|
59
|
+
if (indexToVisit === allSamplesSortedByOffset.length - 1) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
jumpMarks.push({
|
|
63
|
+
afterSampleWithOffset: allSamplesSortedByOffset[indexToVisit].samplePosition.offset,
|
|
64
|
+
jumpToOffset: endOfMdat,
|
|
65
|
+
});
|
|
66
|
+
};
|
|
67
|
+
const considerJump = () => {
|
|
68
|
+
const firstSampleAboveMinProgress = findBestJump({
|
|
69
|
+
allSamplesSortedByOffset,
|
|
70
|
+
visited,
|
|
71
|
+
progresses,
|
|
72
|
+
});
|
|
73
|
+
if (firstSampleAboveMinProgress > -1 &&
|
|
74
|
+
firstSampleAboveMinProgress !== indexToVisit + 1) {
|
|
75
|
+
addJumpMark({ firstSampleAboveMinProgress });
|
|
76
|
+
indexToVisit = firstSampleAboveMinProgress;
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
while (true) {
|
|
80
|
+
increaseIndex();
|
|
81
|
+
if (!visited.has(getKey(allSamplesSortedByOffset[indexToVisit]))) {
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
while (true) {
|
|
88
|
+
const currentSamplePosition = allSamplesSortedByOffset[indexToVisit];
|
|
89
|
+
const sampleKey = getKey(currentSamplePosition);
|
|
90
|
+
if (visited.has(sampleKey)) {
|
|
91
|
+
considerJump();
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
visited.add(sampleKey);
|
|
95
|
+
if (rollOverToProcess) {
|
|
96
|
+
if (!lastVisitedSample) {
|
|
97
|
+
throw new Error('no last visited sample');
|
|
98
|
+
}
|
|
99
|
+
jumpMarks.push({
|
|
100
|
+
afterSampleWithOffset: lastVisitedSample.samplePosition.offset,
|
|
101
|
+
jumpToOffset: currentSamplePosition.samplePosition.offset,
|
|
102
|
+
});
|
|
103
|
+
rollOverToProcess = false;
|
|
104
|
+
}
|
|
105
|
+
lastVisitedSample = currentSamplePosition;
|
|
106
|
+
if (visited.size === allSamplesSortedByOffset.length) {
|
|
107
|
+
addFinalJumpIfNecessary();
|
|
108
|
+
break;
|
|
109
|
+
}
|
|
110
|
+
const timestamp = currentSamplePosition.samplePosition.dts /
|
|
111
|
+
currentSamplePosition.track.timescale;
|
|
112
|
+
progresses[currentSamplePosition.track.trackId] = timestamp;
|
|
113
|
+
const progressValues = Object.values(progresses);
|
|
114
|
+
const maxProgress = Math.max(...progressValues);
|
|
115
|
+
const minProgress = Math.min(...progressValues);
|
|
116
|
+
const spread = maxProgress - minProgress;
|
|
117
|
+
if (visited.size === allSamplesSortedByOffset.length) {
|
|
118
|
+
addFinalJumpIfNecessary();
|
|
119
|
+
break;
|
|
120
|
+
}
|
|
121
|
+
// Also don't allow audio progress to go more
|
|
122
|
+
if (spread > MAX_SPREAD_IN_SECONDS) {
|
|
123
|
+
considerJump();
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
increaseIndex();
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return jumpMarks;
|
|
130
|
+
};
|
|
131
|
+
exports.calculateJumpMarks = calculateJumpMarks;
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import type { Skip } from '../../../skip';
|
|
1
|
+
import type { FetchMoreData, Skip } from '../../../skip';
|
|
2
2
|
import type { ParserState } from '../../../state/parser-state';
|
|
3
|
-
export declare const parseMdatSection: (state: ParserState) => Promise<Skip | null>;
|
|
3
|
+
export declare const parseMdatSection: (state: ParserState) => Promise<Skip | FetchMoreData | null>;
|
|
@@ -8,6 +8,7 @@ const cached_sample_positions_1 = require("../../../state/iso-base-media/cached-
|
|
|
8
8
|
const may_skip_video_data_1 = require("../../../state/may-skip-video-data");
|
|
9
9
|
const video_section_1 = require("../../../state/video-section");
|
|
10
10
|
const get_moov_atom_1 = require("../get-moov-atom");
|
|
11
|
+
const calculate_jump_marks_1 = require("./calculate-jump-marks");
|
|
11
12
|
const postprocess_bytes_1 = require("./postprocess-bytes");
|
|
12
13
|
const parseMdatSection = async (state) => {
|
|
13
14
|
const mediaSection = (0, video_section_1.getCurrentMediaSection)({
|
|
@@ -37,9 +38,13 @@ const parseMdatSection = async (state) => {
|
|
|
37
38
|
return (0, exports.parseMdatSection)(state);
|
|
38
39
|
}
|
|
39
40
|
if (!state.iso.flatSamples.getSamples(mediaSection.start)) {
|
|
40
|
-
|
|
41
|
+
const flattedSamples = (0, cached_sample_positions_1.calculateFlatSamples)(state);
|
|
42
|
+
const calcedJumpMarks = (0, calculate_jump_marks_1.calculateJumpMarks)(flattedSamples, endOfMdat);
|
|
43
|
+
state.iso.flatSamples.setJumpMarks(mediaSection.start, calcedJumpMarks);
|
|
44
|
+
state.iso.flatSamples.setSamples(mediaSection.start, flattedSamples.flat(1));
|
|
41
45
|
}
|
|
42
46
|
const flatSamples = state.iso.flatSamples.getSamples(mediaSection.start);
|
|
47
|
+
const jumpMarks = state.iso.flatSamples.getJumpMarks(mediaSection.start);
|
|
43
48
|
const { iterator } = state;
|
|
44
49
|
const samplesWithIndex = flatSamples.find((sample) => {
|
|
45
50
|
return sample.samplePosition.offset === iterator.counter.getOffset();
|
|
@@ -59,8 +64,15 @@ const parseMdatSection = async (state) => {
|
|
|
59
64
|
// iphonevideo.mov has extra padding here, so let's make sure to jump ahead
|
|
60
65
|
return (0, skip_1.makeSkip)(endOfMdat);
|
|
61
66
|
}
|
|
67
|
+
// Corrupt file: Sample is beyond the end of the file. Don't process it.
|
|
68
|
+
if (samplesWithIndex.samplePosition.offset +
|
|
69
|
+
samplesWithIndex.samplePosition.size >
|
|
70
|
+
state.contentLength) {
|
|
71
|
+
return (0, skip_1.makeSkip)(endOfMdat);
|
|
72
|
+
}
|
|
73
|
+
// Need to fetch more data
|
|
62
74
|
if (iterator.bytesRemaining() < samplesWithIndex.samplePosition.size) {
|
|
63
|
-
return
|
|
75
|
+
return (0, skip_1.makeFetchMoreData)(samplesWithIndex.samplePosition.size - iterator.bytesRemaining());
|
|
64
76
|
}
|
|
65
77
|
const { cts, dts, duration, isKeyframe, offset, bigEndian, chunkSize } = samplesWithIndex.samplePosition;
|
|
66
78
|
const bytes = (0, postprocess_bytes_1.postprocessBytes)({
|
|
@@ -114,6 +126,10 @@ const parseMdatSection = async (state) => {
|
|
|
114
126
|
});
|
|
115
127
|
await state.callbacks.onVideoSample(samplesWithIndex.track.trackId, videoSample);
|
|
116
128
|
}
|
|
129
|
+
const jump = jumpMarks.find((j) => j.afterSampleWithOffset === offset);
|
|
130
|
+
if (jump) {
|
|
131
|
+
return (0, skip_1.makeSkip)(jump.jumpToOffset);
|
|
132
|
+
}
|
|
117
133
|
return null;
|
|
118
134
|
};
|
|
119
135
|
exports.parseMdatSection = parseMdatSection;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import type { VideoTrack } from '../../../get-tracks';
|
|
1
|
+
import type { AudioTrack, VideoTrack } from '../../../get-tracks';
|
|
2
2
|
import type { IsoBaseMediaBox } from '../base-media-box';
|
|
3
|
-
export declare const findBestSegmentFromTfra: ({ mfra, time,
|
|
3
|
+
export declare const findBestSegmentFromTfra: ({ mfra, time, firstTrack, timescale, }: {
|
|
4
4
|
mfra: IsoBaseMediaBox[];
|
|
5
5
|
time: number;
|
|
6
|
-
|
|
6
|
+
firstTrack: VideoTrack | AudioTrack;
|
|
7
7
|
timescale: number;
|
|
8
8
|
}) => {
|
|
9
9
|
start: number;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.findBestSegmentFromTfra = void 0;
|
|
4
|
-
const findBestSegmentFromTfra = ({ mfra, time,
|
|
5
|
-
const tfra = mfra.find((b) => b.type === 'tfra-box' && b.trackId ===
|
|
4
|
+
const findBestSegmentFromTfra = ({ mfra, time, firstTrack, timescale, }) => {
|
|
5
|
+
const tfra = mfra.find((b) => b.type === 'tfra-box' && b.trackId === firstTrack.trackId);
|
|
6
6
|
if (!tfra) {
|
|
7
7
|
return null;
|
|
8
8
|
}
|
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
import type { MediaParserController } from '../../../controller/media-parser-controller';
|
|
2
|
+
import type { PrefetchCache } from '../../../fetch';
|
|
3
|
+
import type { LogLevel } from '../../../log';
|
|
2
4
|
import type { ParseMediaSrc } from '../../../options';
|
|
3
5
|
import type { ReaderInterface } from '../../../readers/reader';
|
|
4
|
-
export declare const getMfraAtom: ({ src, contentLength, readerInterface, controller, parentSize, }: {
|
|
6
|
+
export declare const getMfraAtom: ({ src, contentLength, readerInterface, controller, parentSize, logLevel, prefetchCache, }: {
|
|
5
7
|
src: ParseMediaSrc;
|
|
6
8
|
contentLength: number;
|
|
7
9
|
readerInterface: ReaderInterface;
|
|
8
10
|
controller: MediaParserController;
|
|
9
11
|
parentSize: number;
|
|
12
|
+
logLevel: LogLevel;
|
|
13
|
+
prefetchCache: PrefetchCache;
|
|
10
14
|
}) => Promise<{
|
|
11
15
|
startReadingBits: () => void;
|
|
12
16
|
stopReadingBits: () => void;
|
|
@@ -2,11 +2,13 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.getMfraAtom = void 0;
|
|
4
4
|
const buffer_iterator_1 = require("../../../iterator/buffer-iterator");
|
|
5
|
-
const getMfraAtom = async ({ src, contentLength, readerInterface, controller, parentSize, }) => {
|
|
5
|
+
const getMfraAtom = async ({ src, contentLength, readerInterface, controller, parentSize, logLevel, prefetchCache, }) => {
|
|
6
6
|
const result = await readerInterface.read({
|
|
7
7
|
controller,
|
|
8
8
|
range: [contentLength - parentSize, contentLength - 1],
|
|
9
9
|
src,
|
|
10
|
+
logLevel,
|
|
11
|
+
prefetchCache,
|
|
10
12
|
});
|
|
11
13
|
const iterator = (0, buffer_iterator_1.getArrayBufferIterator)(new Uint8Array(), parentSize);
|
|
12
14
|
while (true) {
|
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
import type { MediaParserController } from '../../../controller/media-parser-controller';
|
|
2
|
+
import type { PrefetchCache } from '../../../fetch';
|
|
3
|
+
import type { LogLevel } from '../../../log';
|
|
2
4
|
import type { ParseMediaSrc } from '../../../options';
|
|
3
5
|
import type { ReaderInterface } from '../../../readers/reader';
|
|
4
|
-
export declare const getMfroAtom: ({ src, contentLength, readerInterface, controller, }: {
|
|
6
|
+
export declare const getMfroAtom: ({ src, contentLength, readerInterface, controller, logLevel, prefetchCache, }: {
|
|
5
7
|
src: ParseMediaSrc;
|
|
6
8
|
contentLength: number;
|
|
7
9
|
readerInterface: ReaderInterface;
|
|
8
10
|
controller: MediaParserController;
|
|
11
|
+
logLevel: LogLevel;
|
|
12
|
+
prefetchCache: PrefetchCache;
|
|
9
13
|
}) => Promise<number | null>;
|
|
@@ -2,11 +2,13 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.getMfroAtom = void 0;
|
|
4
4
|
const buffer_iterator_1 = require("../../../iterator/buffer-iterator");
|
|
5
|
-
const getMfroAtom = async ({ src, contentLength, readerInterface, controller, }) => {
|
|
5
|
+
const getMfroAtom = async ({ src, contentLength, readerInterface, controller, logLevel, prefetchCache, }) => {
|
|
6
6
|
const result = await readerInterface.read({
|
|
7
7
|
controller,
|
|
8
8
|
range: [contentLength - 16, contentLength - 1],
|
|
9
9
|
src,
|
|
10
|
+
logLevel,
|
|
11
|
+
prefetchCache,
|
|
10
12
|
});
|
|
11
13
|
const { value } = await result.reader.reader.read();
|
|
12
14
|
if (!value) {
|
|
@@ -25,8 +25,11 @@ const parseIsoBaseMedia = async (state) => {
|
|
|
25
25
|
},
|
|
26
26
|
contentLength: state.contentLength,
|
|
27
27
|
});
|
|
28
|
-
if (result) {
|
|
29
|
-
|
|
28
|
+
if (result.type === 'fetch-more-data') {
|
|
29
|
+
return result.bytesNeeded;
|
|
30
|
+
}
|
|
31
|
+
if (result.type === 'box') {
|
|
32
|
+
state.structure.getIsoStructure().boxes.push(result.box);
|
|
30
33
|
}
|
|
31
34
|
return null;
|
|
32
35
|
};
|
|
@@ -1,26 +1,37 @@
|
|
|
1
1
|
import type { BufferIterator } from '../../iterator/buffer-iterator';
|
|
2
2
|
import type { LogLevel } from '../../log';
|
|
3
|
+
import type { FetchMoreData } from '../../skip';
|
|
3
4
|
import type { TracksState } from '../../state/has-tracks-section';
|
|
4
5
|
import type { IsoBaseMediaState } from '../../state/iso-base-media/iso-state';
|
|
5
|
-
import type {
|
|
6
|
+
import type { CallbacksState } from '../../state/sample-callbacks';
|
|
6
7
|
import type { MediaSectionState } from '../../state/video-section';
|
|
7
8
|
import type { OnAudioTrack, OnVideoTrack } from '../../webcodec-sample-types';
|
|
8
|
-
import type {
|
|
9
|
+
import type { IsoBaseMediaBox } from './base-media-box';
|
|
9
10
|
export type OnlyIfMoovAtomExpected = {
|
|
10
11
|
tracks: TracksState;
|
|
11
12
|
isoState: IsoBaseMediaState | null;
|
|
12
13
|
onVideoTrack: OnVideoTrack | null;
|
|
13
14
|
onAudioTrack: OnAudioTrack | null;
|
|
14
|
-
registerVideoSampleCallback:
|
|
15
|
-
registerAudioSampleCallback:
|
|
15
|
+
registerVideoSampleCallback: CallbacksState['registerVideoSampleCallback'];
|
|
16
|
+
registerAudioSampleCallback: CallbacksState['registerAudioSampleCallback'];
|
|
16
17
|
};
|
|
17
18
|
export type OnlyIfMdatAtomExpected = {
|
|
18
19
|
mediaSectionState: MediaSectionState;
|
|
19
20
|
};
|
|
21
|
+
type ProcessBoxResult = {
|
|
22
|
+
type: 'box';
|
|
23
|
+
box: IsoBaseMediaBox;
|
|
24
|
+
} | {
|
|
25
|
+
type: 'nothing';
|
|
26
|
+
} | {
|
|
27
|
+
type: 'fetch-more-data';
|
|
28
|
+
bytesNeeded: FetchMoreData;
|
|
29
|
+
};
|
|
20
30
|
export declare const processBox: ({ iterator, logLevel, onlyIfMoovAtomExpected, onlyIfMdatAtomExpected, contentLength, }: {
|
|
21
31
|
iterator: BufferIterator;
|
|
22
32
|
logLevel: LogLevel;
|
|
23
33
|
onlyIfMoovAtomExpected: OnlyIfMoovAtomExpected | null;
|
|
24
34
|
onlyIfMdatAtomExpected: OnlyIfMdatAtomExpected | null;
|
|
25
35
|
contentLength: number;
|
|
26
|
-
}) => Promise<
|
|
36
|
+
}) => Promise<ProcessBoxResult>;
|
|
37
|
+
export {};
|