@remotion/media-parser 4.0.285 → 4.0.286
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/aac-codecprivate.d.ts +1 -1
- package/dist/combine-uint8-arrays.d.ts +1 -1
- package/dist/containers/aac/parse-aac.js +0 -3
- package/dist/containers/avc/create-sps-pps-data.d.ts +1 -1
- package/dist/containers/flac/get-channel-count.d.ts +1 -1
- package/dist/containers/flac/parse-flac-frame.js +0 -2
- package/dist/containers/flac/parse-streaminfo.js +0 -2
- package/dist/containers/iso-base-media/collect-sample-positions-from-trak.js +4 -3
- package/dist/containers/iso-base-media/get-moov-atom.js +0 -4
- package/dist/containers/iso-base-media/mdat/mdat.js +0 -3
- package/dist/containers/iso-base-media/mfra/get-mfra-atom.d.ts +3 -3
- package/dist/containers/iso-base-media/parse-boxes.js +0 -2
- package/dist/containers/iso-base-media/process-box.d.ts +0 -2
- package/dist/containers/iso-base-media/process-box.js +1 -3
- package/dist/containers/m3u/iterate-over-segment-files.js +1 -0
- package/dist/containers/m3u/run-over-m3u.js +0 -3
- package/dist/containers/mp3/parse-mpeg-header.js +0 -3
- package/dist/containers/riff/expect-riff-box.js +0 -2
- package/dist/containers/riff/parse-movi.js +0 -3
- package/dist/containers/transport-stream/adts-header.d.ts +1 -1
- package/dist/containers/transport-stream/discard-rest-of-packet.d.ts +1 -1
- package/dist/containers/transport-stream/find-separator.d.ts +17 -1
- package/dist/containers/transport-stream/find-separator.js +6 -5
- package/dist/containers/transport-stream/get-seeking-info.d.ts +4 -0
- package/dist/containers/transport-stream/get-seeking-info.js +17 -0
- package/dist/containers/transport-stream/handle-aac-packet.d.ts +10 -3
- package/dist/containers/transport-stream/handle-aac-packet.js +21 -16
- package/dist/containers/transport-stream/handle-avc-packet.d.ts +10 -3
- package/dist/containers/transport-stream/handle-avc-packet.js +26 -17
- package/dist/containers/transport-stream/parse-packet.d.ts +8 -4
- package/dist/containers/transport-stream/parse-packet.js +15 -16
- package/dist/containers/transport-stream/parse-pes.d.ts +5 -1
- package/dist/containers/transport-stream/parse-pes.js +4 -3
- package/dist/containers/transport-stream/parse-stream-packet.d.ts +6 -6
- package/dist/containers/transport-stream/parse-stream-packet.js +10 -115
- package/dist/containers/transport-stream/parse-transport-stream.js +15 -3
- package/dist/containers/transport-stream/process-stream-buffers.d.ts +26 -6
- package/dist/containers/transport-stream/process-stream-buffers.js +77 -12
- package/dist/containers/transport-stream/traversal.d.ts +3 -1
- package/dist/containers/transport-stream/traversal.js +10 -2
- package/dist/containers/wav/parse-fmt.js +0 -2
- package/dist/containers/wav/parse-media-section.js +0 -2
- package/dist/containers/webm/cues/fetch-web-cues.d.ts +12 -0
- package/dist/containers/webm/cues/fetch-web-cues.js +32 -0
- package/dist/containers/webm/cues/format-cues.d.ts +8 -0
- package/dist/containers/webm/cues/format-cues.js +41 -0
- package/dist/containers/webm/cues/get-seeking-byte.d.ts +14 -0
- package/dist/containers/webm/cues/get-seeking-byte.js +91 -0
- package/dist/containers/webm/fetch-web-cues.d.ts +12 -0
- package/dist/containers/webm/fetch-web-cues.js +29 -0
- package/dist/containers/webm/get-byte-for-cues.d.ts +5 -0
- package/dist/containers/webm/get-byte-for-cues.js +33 -0
- package/dist/containers/webm/get-ready-tracks.d.ts +9 -4
- package/dist/containers/webm/get-ready-tracks.js +6 -6
- package/dist/containers/webm/get-sample-from-block.d.ts +3 -2
- package/dist/containers/webm/get-sample-from-block.js +9 -8
- package/dist/containers/webm/get-seeking-byte.d.ts +14 -0
- package/dist/containers/webm/get-seeking-byte.js +91 -0
- package/dist/containers/webm/get-seeking-info.d.ts +3 -0
- package/dist/containers/webm/get-seeking-info.js +17 -0
- package/dist/containers/webm/parse-ebml.d.ts +5 -4
- package/dist/containers/webm/parse-ebml.js +29 -34
- package/dist/containers/webm/parse-webm-header.js +14 -2
- package/dist/containers/webm/seek/fetch-web-cues.d.ts +12 -0
- package/dist/containers/webm/seek/fetch-web-cues.js +32 -0
- package/dist/containers/webm/seek/format-cues.d.ts +8 -0
- package/dist/containers/webm/seek/format-cues.js +42 -0
- package/dist/containers/webm/seek/get-seeking-byte.d.ts +14 -0
- package/dist/containers/webm/seek/get-seeking-byte.js +100 -0
- package/dist/containers/webm/seek/get-seeking-info.d.ts +3 -0
- package/dist/containers/webm/seek/get-seeking-info.js +17 -0
- package/dist/containers/webm/segments/all-segments.d.ts +1 -0
- package/dist/containers/webm/segments.d.ts +10 -4
- package/dist/containers/webm/segments.js +30 -12
- package/dist/containers/webm/state-for-processing.d.ts +15 -0
- package/dist/containers/webm/state-for-processing.js +14 -0
- package/dist/controller/seek-signal.d.ts +2 -2
- package/dist/download-and-parse-media.js +2 -1
- package/dist/emit-audio-sample.d.ts +2 -5
- package/dist/emit-audio-sample.js +2 -5
- package/dist/esm/index.mjs +5057 -4394
- package/dist/esm/universal.mjs +1 -1
- package/dist/esm/web.mjs +1 -1
- package/dist/esm/worker-server-entry.mjs +2327 -1664
- package/dist/esm/worker-web-entry.mjs +2327 -1664
- package/dist/file-types/detect-file-type.js +3 -1
- package/dist/get-audio-codec.d.ts +2 -1
- package/dist/get-audio-codec.js +15 -1
- package/dist/get-sample-positions-from-mp4.d.ts +3 -0
- package/dist/get-sample-positions-from-mp4.js +46 -0
- package/dist/get-seeking-byte.d.ts +19 -0
- package/dist/get-seeking-byte.js +50 -0
- package/dist/get-seeking-info.d.ts +5 -10
- package/dist/get-seeking-info.js +12 -25
- package/dist/get-tracks.js +6 -2
- package/dist/index.d.ts +44 -19
- package/dist/init-video.js +4 -3
- package/dist/internal-parse-media.js +3 -2
- package/dist/iterator/buffer-iterator.d.ts +3 -3
- package/dist/iterator/buffer-manager.d.ts +3 -3
- package/dist/log.d.ts +5 -5
- package/dist/options.d.ts +1 -0
- package/dist/parse-loop.js +0 -3
- package/dist/parse-media-on-worker-entry.d.ts +1 -1
- package/dist/parse-media.js +2 -1
- package/dist/readers/from-web-file.js +1 -1
- package/dist/register-track.d.ts +2 -5
- package/dist/register-track.js +2 -10
- package/dist/seek-backwards.js +2 -3
- package/dist/seeking-info.d.ts +14 -1
- package/dist/state/iso-base-media/cached-sample-positions.d.ts +1 -1
- package/dist/state/keyframes.js +3 -0
- package/dist/state/matroska/lazy-cues-fetch.d.ts +19 -0
- package/dist/state/matroska/lazy-cues-fetch.js +51 -0
- package/dist/state/matroska/lazy-seek-fetch.d.ts +1 -0
- package/dist/state/matroska/lazy-seek-fetch.js +5 -0
- package/dist/state/matroska/webm.d.ts +46 -0
- package/dist/state/matroska/webm.js +121 -0
- package/dist/state/matroska.d.ts +0 -0
- package/dist/state/matroska.js +1 -0
- package/dist/state/parser-state.d.ts +34 -9
- package/dist/state/parser-state.js +7 -6
- package/dist/state/sample-callbacks.d.ts +1 -1
- package/dist/state/sample-callbacks.js +9 -9
- package/dist/state/samples-observed/slow-duration-fps.d.ts +11 -0
- package/dist/state/samples-observed/slow-duration-fps.js +92 -0
- package/dist/state/seek-infinite-loop.js +12 -2
- package/dist/state/transport-stream/observed-pes-header.d.ts +13 -0
- package/dist/state/transport-stream/observed-pes-header.js +29 -0
- package/dist/state/transport-stream/pts-start-offset.d.ts +5 -0
- package/dist/state/transport-stream/pts-start-offset.js +13 -0
- package/dist/state/transport-stream/start-offset.d.ts +2 -1
- package/dist/state/transport-stream/start-offset.js +3 -3
- package/dist/state/transport-stream/transport-stream.d.ts +6 -0
- package/dist/state/transport-stream/transport-stream.js +4 -2
- package/dist/state/video-section.js +14 -2
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/work-on-seek-request.d.ts +8 -0
- package/dist/work-on-seek-request.js +24 -6
- package/dist/worker-server.js +1 -0
- package/dist/worker.d.ts +0 -1
- package/package.json +4 -4
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.samplesObservedState = void 0;
|
|
4
|
+
const samplesObservedState = () => {
|
|
5
|
+
let smallestVideoSample;
|
|
6
|
+
let largestVideoSample;
|
|
7
|
+
let smallestAudioSample;
|
|
8
|
+
let largestAudioSample;
|
|
9
|
+
const videoSamples = new Map();
|
|
10
|
+
const audioSamples = new Map();
|
|
11
|
+
const getSlowVideoDurationInSeconds = () => {
|
|
12
|
+
let videoDuration = null;
|
|
13
|
+
if (smallestVideoSample !== undefined && largestVideoSample !== undefined) {
|
|
14
|
+
const startingTimestampDifference = largestVideoSample - smallestVideoSample;
|
|
15
|
+
const timeBetweenSamples = startingTimestampDifference / (videoSamples.size - 1);
|
|
16
|
+
videoDuration = timeBetweenSamples * videoSamples.size;
|
|
17
|
+
}
|
|
18
|
+
return videoDuration;
|
|
19
|
+
};
|
|
20
|
+
const getSlowDurationInSeconds = () => {
|
|
21
|
+
const videoDuration = getSlowVideoDurationInSeconds();
|
|
22
|
+
let audioDuration = null;
|
|
23
|
+
if (smallestAudioSample !== undefined && largestAudioSample !== undefined) {
|
|
24
|
+
const startingTimestampDifferenceAudio = largestAudioSample - smallestAudioSample;
|
|
25
|
+
const timeBetweenSamplesAudio = startingTimestampDifferenceAudio / (audioSamples.size - 1);
|
|
26
|
+
audioDuration = timeBetweenSamplesAudio * audioSamples.size;
|
|
27
|
+
}
|
|
28
|
+
if (videoDuration === null && audioDuration === null) {
|
|
29
|
+
throw new Error('No samples');
|
|
30
|
+
}
|
|
31
|
+
return Math.max(videoDuration !== null && videoDuration !== void 0 ? videoDuration : 0, audioDuration !== null && audioDuration !== void 0 ? audioDuration : 0);
|
|
32
|
+
};
|
|
33
|
+
const addVideoSample = (videoSample) => {
|
|
34
|
+
videoSamples.set(videoSample.cts, videoSample.data.byteLength);
|
|
35
|
+
const presentationTimeInSeconds = videoSample.cts / videoSample.timescale;
|
|
36
|
+
if (largestVideoSample === undefined ||
|
|
37
|
+
presentationTimeInSeconds > largestVideoSample) {
|
|
38
|
+
largestVideoSample = presentationTimeInSeconds;
|
|
39
|
+
}
|
|
40
|
+
if (smallestVideoSample === undefined ||
|
|
41
|
+
presentationTimeInSeconds < smallestVideoSample) {
|
|
42
|
+
smallestVideoSample = presentationTimeInSeconds;
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
const addAudioSample = (audioSample) => {
|
|
46
|
+
audioSamples.set(audioSample.cts, audioSample.data.byteLength);
|
|
47
|
+
const presentationTimeInSeconds = audioSample.cts / audioSample.timescale;
|
|
48
|
+
if (largestAudioSample === undefined ||
|
|
49
|
+
presentationTimeInSeconds > largestAudioSample) {
|
|
50
|
+
largestAudioSample = presentationTimeInSeconds;
|
|
51
|
+
}
|
|
52
|
+
if (smallestAudioSample === undefined ||
|
|
53
|
+
presentationTimeInSeconds < smallestAudioSample) {
|
|
54
|
+
smallestAudioSample = presentationTimeInSeconds;
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
const getFps = () => {
|
|
58
|
+
var _a;
|
|
59
|
+
const videoDuration = (_a = getSlowVideoDurationInSeconds()) !== null && _a !== void 0 ? _a : 0;
|
|
60
|
+
if (videoDuration === 0) {
|
|
61
|
+
return 0;
|
|
62
|
+
}
|
|
63
|
+
return videoSamples.size / videoDuration;
|
|
64
|
+
};
|
|
65
|
+
const getSlowNumberOfFrames = () => videoSamples.size;
|
|
66
|
+
const getAudioBitrate = () => {
|
|
67
|
+
const audioDuration = getSlowDurationInSeconds();
|
|
68
|
+
if (audioDuration === 0 || audioSamples.size === 0) {
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
const audioSizesInBytes = Array.from(audioSamples.values()).reduce((acc, size) => acc + size, 0);
|
|
72
|
+
return (audioSizesInBytes * 8) / audioDuration;
|
|
73
|
+
};
|
|
74
|
+
const getVideoBitrate = () => {
|
|
75
|
+
const videoDuration = getSlowDurationInSeconds();
|
|
76
|
+
if (videoDuration === 0 || videoSamples.size === 0) {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
const videoSizesInBytes = Array.from(videoSamples.values()).reduce((acc, size) => acc + size, 0);
|
|
80
|
+
return (videoSizesInBytes * 8) / videoDuration;
|
|
81
|
+
};
|
|
82
|
+
return {
|
|
83
|
+
addVideoSample,
|
|
84
|
+
addAudioSample,
|
|
85
|
+
getSlowDurationInSeconds,
|
|
86
|
+
getFps,
|
|
87
|
+
getSlowNumberOfFrames,
|
|
88
|
+
getAudioBitrate,
|
|
89
|
+
getVideoBitrate,
|
|
90
|
+
};
|
|
91
|
+
};
|
|
92
|
+
exports.samplesObservedState = samplesObservedState;
|
|
@@ -3,19 +3,29 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.seekInfiniteLoopDetectionState = void 0;
|
|
4
4
|
const seekInfiniteLoopDetectionState = () => {
|
|
5
5
|
let lastSeek = null;
|
|
6
|
+
let firstSeekTime = null;
|
|
6
7
|
return {
|
|
7
8
|
registerSeek: (byte) => {
|
|
9
|
+
const now = Date.now();
|
|
8
10
|
if (!lastSeek || lastSeek.byte !== byte) {
|
|
9
11
|
lastSeek = { byte, numberOfTimes: 1 };
|
|
12
|
+
firstSeekTime = now;
|
|
10
13
|
return;
|
|
11
14
|
}
|
|
12
15
|
lastSeek.numberOfTimes++;
|
|
13
|
-
if (lastSeek.numberOfTimes >= 10
|
|
14
|
-
|
|
16
|
+
if (lastSeek.numberOfTimes >= 10 &&
|
|
17
|
+
firstSeekTime &&
|
|
18
|
+
now - firstSeekTime <= 2000) {
|
|
19
|
+
throw new Error(`Seeking infinite loop detected: Seeked to byte 0x${byte.toString(16)} ${lastSeek.numberOfTimes} times in a row in the last 2 seconds. Check your usage of .seek().`);
|
|
20
|
+
}
|
|
21
|
+
if (now - firstSeekTime > 2000) {
|
|
22
|
+
lastSeek = { byte, numberOfTimes: 1 };
|
|
23
|
+
firstSeekTime = now;
|
|
15
24
|
}
|
|
16
25
|
},
|
|
17
26
|
reset: () => {
|
|
18
27
|
lastSeek = null;
|
|
28
|
+
firstSeekTime = null;
|
|
19
29
|
},
|
|
20
30
|
};
|
|
21
31
|
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { PacketPes } from '../../containers/transport-stream/parse-pes';
|
|
2
|
+
export declare const makeObservedPesHeader: () => {
|
|
3
|
+
pesHeaders: PacketPes[];
|
|
4
|
+
addPesHeader: (pesHeader: PacketPes) => void;
|
|
5
|
+
markPtsAsKeyframe: (pts: number) => void;
|
|
6
|
+
getPesKeyframeHeaders: () => PacketPes[];
|
|
7
|
+
};
|
|
8
|
+
export type ObservedPesHeaderState = ReturnType<typeof makeObservedPesHeader>;
|
|
9
|
+
export declare const getLastKeyFrameBeforeTimeInSeconds: ({ observedPesHeaders, timeInSeconds, ptsStartOffset, }: {
|
|
10
|
+
observedPesHeaders: ObservedPesHeaderState["pesHeaders"];
|
|
11
|
+
timeInSeconds: number;
|
|
12
|
+
ptsStartOffset: number;
|
|
13
|
+
}) => PacketPes | undefined;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getLastKeyFrameBeforeTimeInSeconds = exports.makeObservedPesHeader = void 0;
|
|
4
|
+
const handle_avc_packet_1 = require("../../containers/transport-stream/handle-avc-packet");
|
|
5
|
+
const makeObservedPesHeader = () => {
|
|
6
|
+
const pesHeaders = [];
|
|
7
|
+
const confirmedAsKeyframe = [];
|
|
8
|
+
const state = {
|
|
9
|
+
pesHeaders,
|
|
10
|
+
addPesHeader: (pesHeader) => {
|
|
11
|
+
if (pesHeaders.find((p) => p.offset === pesHeader.offset)) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
pesHeaders.push(pesHeader);
|
|
15
|
+
},
|
|
16
|
+
markPtsAsKeyframe: (pts) => {
|
|
17
|
+
confirmedAsKeyframe.push(pts);
|
|
18
|
+
},
|
|
19
|
+
getPesKeyframeHeaders: () => {
|
|
20
|
+
return pesHeaders.filter((p) => confirmedAsKeyframe.includes(p.pts));
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
return state;
|
|
24
|
+
};
|
|
25
|
+
exports.makeObservedPesHeader = makeObservedPesHeader;
|
|
26
|
+
const getLastKeyFrameBeforeTimeInSeconds = ({ observedPesHeaders, timeInSeconds, ptsStartOffset, }) => {
|
|
27
|
+
return observedPesHeaders.findLast((k) => (k.pts - ptsStartOffset) / handle_avc_packet_1.MPEG_TIMESCALE <= timeInSeconds);
|
|
28
|
+
};
|
|
29
|
+
exports.getLastKeyFrameBeforeTimeInSeconds = getLastKeyFrameBeforeTimeInSeconds;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ptsStartOffsetStore = void 0;
|
|
4
|
+
const ptsStartOffsetStore = () => {
|
|
5
|
+
const offsets = {};
|
|
6
|
+
return {
|
|
7
|
+
getOffset: (trackId) => offsets[trackId] || 0,
|
|
8
|
+
setOffset: (trackId, newOffset) => {
|
|
9
|
+
offsets[trackId] = newOffset;
|
|
10
|
+
},
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
exports.ptsStartOffsetStore = ptsStartOffsetStore;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
export declare const
|
|
1
|
+
export declare const ptsStartOffsetStore: () => {
|
|
2
2
|
getOffset: (trackId: number) => number;
|
|
3
3
|
setOffset: (trackId: number, newOffset: number) => void;
|
|
4
4
|
};
|
|
5
|
+
export type StartOffsetState = ReturnType<typeof ptsStartOffsetStore>;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
const
|
|
3
|
+
exports.ptsStartOffsetStore = void 0;
|
|
4
|
+
const ptsStartOffsetStore = () => {
|
|
5
5
|
const offsets = {};
|
|
6
6
|
return {
|
|
7
7
|
getOffset: (trackId) => offsets[trackId] || 0,
|
|
@@ -10,4 +10,4 @@ const startOffsetStore = () => {
|
|
|
10
10
|
},
|
|
11
11
|
};
|
|
12
12
|
};
|
|
13
|
-
exports.
|
|
13
|
+
exports.ptsStartOffsetStore = ptsStartOffsetStore;
|
|
@@ -4,6 +4,12 @@ export declare const transportStreamState: () => {
|
|
|
4
4
|
setNextPesHeader: (pesHeader: import("../../containers/transport-stream/parse-pes").PacketPes) => void;
|
|
5
5
|
getNextPesHeader: () => import("../../containers/transport-stream/parse-pes").PacketPes;
|
|
6
6
|
};
|
|
7
|
+
observedPesHeaders: {
|
|
8
|
+
pesHeaders: import("../../containers/transport-stream/parse-pes").PacketPes[];
|
|
9
|
+
addPesHeader: (pesHeader: import("../../containers/transport-stream/parse-pes").PacketPes) => void;
|
|
10
|
+
markPtsAsKeyframe: (pts: number) => void;
|
|
11
|
+
getPesKeyframeHeaders: () => import("../../containers/transport-stream/parse-pes").PacketPes[];
|
|
12
|
+
};
|
|
7
13
|
streamBuffers: Map<number, TransportStreamPacketBuffer>;
|
|
8
14
|
startOffset: {
|
|
9
15
|
getOffset: (trackId: number) => number;
|
|
@@ -3,13 +3,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.transportStreamState = void 0;
|
|
4
4
|
const last_emitted_sample_1 = require("./last-emitted-sample");
|
|
5
5
|
const next_pes_header_store_1 = require("./next-pes-header-store");
|
|
6
|
-
const
|
|
6
|
+
const observed_pes_header_1 = require("./observed-pes-header");
|
|
7
|
+
const pts_start_offset_1 = require("./pts-start-offset");
|
|
7
8
|
const transportStreamState = () => {
|
|
8
9
|
const streamBuffers = new Map();
|
|
9
|
-
const startOffset = (0,
|
|
10
|
+
const startOffset = (0, pts_start_offset_1.ptsStartOffsetStore)();
|
|
10
11
|
const lastEmittedSample = (0, last_emitted_sample_1.lastEmittedSampleState)();
|
|
11
12
|
const state = {
|
|
12
13
|
nextPesHeaderStore: (0, next_pes_header_store_1.makeNextPesHeaderStore)(),
|
|
14
|
+
observedPesHeaders: (0, observed_pes_header_1.makeObservedPesHeader)(),
|
|
13
15
|
streamBuffers,
|
|
14
16
|
startOffset,
|
|
15
17
|
resetBeforeSeek: () => {
|
|
@@ -33,9 +33,21 @@ const mediaSectionState = () => {
|
|
|
33
33
|
// Check if section overlaps with any existing sections
|
|
34
34
|
const overlaps = mediaSections.some((existingSection) => section.start < existingSection.start + existingSection.size &&
|
|
35
35
|
section.start + section.size > existingSection.start);
|
|
36
|
-
if (
|
|
37
|
-
|
|
36
|
+
if (overlaps) {
|
|
37
|
+
return;
|
|
38
38
|
}
|
|
39
|
+
// Remove any existing sections that are encompassed by the new section
|
|
40
|
+
// Needed by Matroska because we need to define a 1 byte media section
|
|
41
|
+
// when seeking into a Cluster we have not seen yet
|
|
42
|
+
for (let i = mediaSections.length - 1; i >= 0; i--) {
|
|
43
|
+
const existingSection = mediaSections[i];
|
|
44
|
+
if (section.start <= existingSection.start &&
|
|
45
|
+
section.start + section.size >=
|
|
46
|
+
existingSection.start + existingSection.size) {
|
|
47
|
+
mediaSections.splice(i, 1);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
mediaSections.push(section);
|
|
39
51
|
};
|
|
40
52
|
const getMediaSections = () => {
|
|
41
53
|
return mediaSections;
|
package/dist/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const VERSION = "4.0.
|
|
1
|
+
export declare const VERSION = "4.0.286";
|
package/dist/version.js
CHANGED
|
@@ -6,10 +6,14 @@ import type { ParseMediaMode, ParseMediaSrc } from './options';
|
|
|
6
6
|
import type { IsoBaseMediaStructure } from './parse-result';
|
|
7
7
|
import type { ReaderInterface } from './readers/reader';
|
|
8
8
|
import type { CurrentReader } from './state/current-reader';
|
|
9
|
+
import type { TracksState } from './state/has-tracks-section';
|
|
9
10
|
import type { IsoBaseMediaState } from './state/iso-base-media/iso-state';
|
|
11
|
+
import type { KeyframesState } from './state/keyframes';
|
|
12
|
+
import type { WebmState } from './state/matroska/webm';
|
|
10
13
|
import type { ParserState } from './state/parser-state';
|
|
11
14
|
import type { SeekInfiniteLoop } from './state/seek-infinite-loop';
|
|
12
15
|
import type { StructureState } from './state/structure';
|
|
16
|
+
import type { TransportStreamState } from './state/transport-stream/transport-stream';
|
|
13
17
|
import { type MediaSectionState } from './state/video-section';
|
|
14
18
|
export type WorkOnSeekRequestOptions = {
|
|
15
19
|
logLevel: LogLevel;
|
|
@@ -22,11 +26,15 @@ export type WorkOnSeekRequestOptions = {
|
|
|
22
26
|
readerInterface: ReaderInterface;
|
|
23
27
|
mediaSection: MediaSectionState;
|
|
24
28
|
mp4HeaderSegment: IsoBaseMediaStructure | null;
|
|
29
|
+
transportStream: TransportStreamState;
|
|
25
30
|
mode: ParseMediaMode;
|
|
26
31
|
seekInfiniteLoop: SeekInfiniteLoop;
|
|
27
32
|
currentReader: CurrentReader;
|
|
28
33
|
discardReadBytes: (force: boolean) => Promise<void>;
|
|
29
34
|
fields: Partial<AllOptions<ParseMediaFields>>;
|
|
35
|
+
tracksState: TracksState;
|
|
36
|
+
webmState: WebmState;
|
|
37
|
+
keyframes: KeyframesState;
|
|
30
38
|
};
|
|
31
39
|
export declare const getWorkOnSeekRequestOptions: (state: ParserState) => WorkOnSeekRequestOptions;
|
|
32
40
|
export declare const workOnSeekRequest: (options: WorkOnSeekRequestOptions) => Promise<void>;
|
|
@@ -1,23 +1,29 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.workOnSeekRequest = exports.getWorkOnSeekRequestOptions = void 0;
|
|
4
|
+
const get_seeking_byte_1 = require("./get-seeking-byte");
|
|
4
5
|
const get_seeking_info_1 = require("./get-seeking-info");
|
|
5
6
|
const log_1 = require("./log");
|
|
6
7
|
const perform_seek_1 = require("./perform-seek");
|
|
7
|
-
const turnSeekIntoByte = async ({ seek, mediaSectionState, logLevel, iterator, structureState, mp4HeaderSegment, isoState, }) => {
|
|
8
|
+
const turnSeekIntoByte = async ({ seek, mediaSectionState, logLevel, iterator, structureState, mp4HeaderSegment, isoState, transportStream, tracksState, webmState, keyframes, }) => {
|
|
8
9
|
const mediaSections = mediaSectionState.getMediaSections();
|
|
9
10
|
if (mediaSections.length === 0) {
|
|
10
|
-
log_1.Log.trace(logLevel, 'No
|
|
11
|
+
log_1.Log.trace(logLevel, 'No media sections defined, cannot seek yet');
|
|
11
12
|
return {
|
|
12
13
|
type: 'valid-but-must-wait',
|
|
13
14
|
};
|
|
14
15
|
}
|
|
15
|
-
if (seek.type === 'keyframe-before-time
|
|
16
|
+
if (seek.type === 'keyframe-before-time') {
|
|
17
|
+
if (seek.timeInSeconds < 0) {
|
|
18
|
+
throw new Error(`Cannot seek to a negative time: ${JSON.stringify(seek)}`);
|
|
19
|
+
}
|
|
16
20
|
const seekingInfo = (0, get_seeking_info_1.getSeekingInfo)({
|
|
17
21
|
structureState,
|
|
18
22
|
mp4HeaderSegment,
|
|
19
23
|
mediaSectionState,
|
|
20
24
|
isoState,
|
|
25
|
+
transportStream,
|
|
26
|
+
tracksState,
|
|
21
27
|
});
|
|
22
28
|
if (!seekingInfo) {
|
|
23
29
|
log_1.Log.trace(logLevel, 'No seeking info, cannot seek yet');
|
|
@@ -25,12 +31,16 @@ const turnSeekIntoByte = async ({ seek, mediaSectionState, logLevel, iterator, s
|
|
|
25
31
|
type: 'valid-but-must-wait',
|
|
26
32
|
};
|
|
27
33
|
}
|
|
28
|
-
const seekingByte = await (0,
|
|
34
|
+
const seekingByte = await (0, get_seeking_byte_1.getSeekingByte)({
|
|
29
35
|
info: seekingInfo,
|
|
30
|
-
time: seek.
|
|
36
|
+
time: seek.timeInSeconds,
|
|
31
37
|
logLevel,
|
|
32
38
|
currentPosition: iterator.counter.getOffset(),
|
|
33
39
|
isoState,
|
|
40
|
+
transportStream,
|
|
41
|
+
webmState,
|
|
42
|
+
mediaSection: mediaSectionState,
|
|
43
|
+
keyframes,
|
|
34
44
|
});
|
|
35
45
|
return seekingByte;
|
|
36
46
|
}
|
|
@@ -59,11 +69,15 @@ const getWorkOnSeekRequestOptions = (state) => {
|
|
|
59
69
|
currentReader: state.currentReader,
|
|
60
70
|
discardReadBytes: state.discardReadBytes,
|
|
61
71
|
fields: state.fields,
|
|
72
|
+
transportStream: state.transportStream,
|
|
73
|
+
tracksState: state.callbacks.tracks,
|
|
74
|
+
webmState: state.webm,
|
|
75
|
+
keyframes: state.keyframes,
|
|
62
76
|
};
|
|
63
77
|
};
|
|
64
78
|
exports.getWorkOnSeekRequestOptions = getWorkOnSeekRequestOptions;
|
|
65
79
|
const workOnSeekRequest = async (options) => {
|
|
66
|
-
const { logLevel, controller, mediaSection, mp4HeaderSegment, isoState, iterator, structureState, src, contentLength, readerInterface, mode, seekInfiniteLoop, currentReader, discardReadBytes, fields, } = options;
|
|
80
|
+
const { logLevel, controller, mediaSection, mp4HeaderSegment, isoState, iterator, structureState, src, contentLength, readerInterface, mode, seekInfiniteLoop, currentReader, discardReadBytes, fields, transportStream, tracksState, webmState, keyframes, } = options;
|
|
67
81
|
const seek = controller._internals.seekSignal.getSeek();
|
|
68
82
|
if (!seek) {
|
|
69
83
|
return;
|
|
@@ -77,6 +91,10 @@ const workOnSeekRequest = async (options) => {
|
|
|
77
91
|
structureState,
|
|
78
92
|
mp4HeaderSegment,
|
|
79
93
|
isoState,
|
|
94
|
+
transportStream,
|
|
95
|
+
tracksState,
|
|
96
|
+
webmState,
|
|
97
|
+
keyframes,
|
|
80
98
|
});
|
|
81
99
|
log_1.Log.trace(logLevel, `Seek action: ${JSON.stringify(resolution)}`);
|
|
82
100
|
if (resolution.type === 'intermediary-seek') {
|
package/dist/worker-server.js
CHANGED
package/dist/worker.d.ts
CHANGED
package/package.json
CHANGED
|
@@ -3,15 +3,15 @@
|
|
|
3
3
|
"url": "https://github.com/remotion-dev/remotion/tree/main/packages/media-parser"
|
|
4
4
|
},
|
|
5
5
|
"name": "@remotion/media-parser",
|
|
6
|
-
"version": "4.0.
|
|
6
|
+
"version": "4.0.286",
|
|
7
7
|
"main": "dist/index.js",
|
|
8
8
|
"sideEffects": false,
|
|
9
9
|
"devDependencies": {
|
|
10
10
|
"@types/wicg-file-system-access": "2023.10.5",
|
|
11
11
|
"eslint": "9.19.0",
|
|
12
|
-
"@types/bun": "1.2.
|
|
13
|
-
"@remotion/example-videos": "4.0.
|
|
14
|
-
"@remotion/eslint-config-internal": "4.0.
|
|
12
|
+
"@types/bun": "1.2.8",
|
|
13
|
+
"@remotion/example-videos": "4.0.286",
|
|
14
|
+
"@remotion/eslint-config-internal": "4.0.286"
|
|
15
15
|
},
|
|
16
16
|
"publishConfig": {
|
|
17
17
|
"access": "public"
|