@remotion/media-parser 4.0.289 → 4.0.291
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/flac/get-channel-count.d.ts +1 -1
- 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/get-video-codec-from-iso-track.d.ts +1 -1
- 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/seeking-hints.d.ts +1 -1
- 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/mp3/get-duration.d.ts +5 -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/wav/get-duration-from-wav.d.ts +0 -1
- 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/mp3.d.ts +16 -5
- package/dist/state/mp3.js +7 -5
- package/dist/state/parser-state.d.ts +31 -15
- package/dist/state/parser-state.js +19 -5
- package/dist/state/riff/lazy-idx1-fetch.d.ts +5 -3
- package/dist/state/riff/lazy-idx1-fetch.js +2 -1
- package/dist/state/riff.d.ts +5 -3
- 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
|
@@ -2,8 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.runOverM3u = void 0;
|
|
4
4
|
const log_1 = require("../../log");
|
|
5
|
-
const
|
|
6
|
-
const iterate_over_segment_files_1 = require("./iterate-over-segment-files");
|
|
5
|
+
const process_m3u_chunk_1 = require("./process-m3u-chunk");
|
|
7
6
|
const runOverM3u = async ({ state, structure, playlistUrl, logLevel, }) => {
|
|
8
7
|
const tracksDone = state.m3u.getTrackDone(playlistUrl);
|
|
9
8
|
const hasAudioStreamToConsider = state.m3u.sampleSorter.hasAudioStreamToConsider(playlistUrl);
|
|
@@ -26,84 +25,12 @@ const runOverM3u = async ({ state, structure, playlistUrl, logLevel, }) => {
|
|
|
26
25
|
return;
|
|
27
26
|
}
|
|
28
27
|
log_1.Log.trace(logLevel, 'Starting new M3U parsing process for', playlistUrl);
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
resolve();
|
|
36
|
-
},
|
|
37
|
-
logLevel: state.logLevel,
|
|
38
|
-
onDoneWithTracks() {
|
|
39
|
-
const allDone = state.m3u.setTracksDone(playlistUrl);
|
|
40
|
-
if (allDone) {
|
|
41
|
-
state.callbacks.tracks.setIsDone(state.logLevel);
|
|
42
|
-
}
|
|
43
|
-
},
|
|
44
|
-
onAudioTrack: audioDone
|
|
45
|
-
? null
|
|
46
|
-
: async (track) => {
|
|
47
|
-
const existingTracks = state.callbacks.tracks.getTracks();
|
|
48
|
-
let { trackId } = track;
|
|
49
|
-
while (existingTracks.find((t) => t.trackId === trackId)) {
|
|
50
|
-
trackId++;
|
|
51
|
-
}
|
|
52
|
-
const onAudioSample = await (0, register_track_1.registerAudioTrack)({
|
|
53
|
-
container: 'm3u8',
|
|
54
|
-
track: {
|
|
55
|
-
...track,
|
|
56
|
-
trackId,
|
|
57
|
-
},
|
|
58
|
-
registerAudioSampleCallback: state.callbacks.registerAudioSampleCallback,
|
|
59
|
-
tracks: state.callbacks.tracks,
|
|
60
|
-
logLevel: state.logLevel,
|
|
61
|
-
onAudioTrack: state.onAudioTrack,
|
|
62
|
-
});
|
|
63
|
-
state.m3u.sampleSorter.addToStreamWithTrack(playlistUrl);
|
|
64
|
-
if (onAudioSample === null) {
|
|
65
|
-
return null;
|
|
66
|
-
}
|
|
67
|
-
state.m3u.sampleSorter.addAudioStreamToConsider(playlistUrl, onAudioSample);
|
|
68
|
-
return async (sample) => {
|
|
69
|
-
await state.m3u.sampleSorter.addAudioSample(playlistUrl, sample);
|
|
70
|
-
};
|
|
71
|
-
},
|
|
72
|
-
onVideoTrack: videoDone
|
|
73
|
-
? null
|
|
74
|
-
: async (track) => {
|
|
75
|
-
const existingTracks = state.callbacks.tracks.getTracks();
|
|
76
|
-
let { trackId } = track;
|
|
77
|
-
while (existingTracks.find((t) => t.trackId === trackId)) {
|
|
78
|
-
trackId++;
|
|
79
|
-
}
|
|
80
|
-
const onVideoSample = await (0, register_track_1.registerVideoTrack)({
|
|
81
|
-
container: 'm3u8',
|
|
82
|
-
track: {
|
|
83
|
-
...track,
|
|
84
|
-
trackId,
|
|
85
|
-
},
|
|
86
|
-
logLevel: state.logLevel,
|
|
87
|
-
onVideoTrack: state.onVideoTrack,
|
|
88
|
-
registerVideoSampleCallback: state.callbacks.registerVideoSampleCallback,
|
|
89
|
-
tracks: state.callbacks.tracks,
|
|
90
|
-
});
|
|
91
|
-
state.m3u.sampleSorter.addToStreamWithTrack(playlistUrl);
|
|
92
|
-
if (onVideoSample === null) {
|
|
93
|
-
return null;
|
|
94
|
-
}
|
|
95
|
-
state.m3u.sampleSorter.addVideoStreamToConsider(playlistUrl, onVideoSample);
|
|
96
|
-
return async (sample) => {
|
|
97
|
-
await state.m3u.sampleSorter.addVideoSample(playlistUrl, sample);
|
|
98
|
-
};
|
|
99
|
-
},
|
|
100
|
-
m3uState: state.m3u,
|
|
101
|
-
parentController: state.controller,
|
|
102
|
-
readerInterface: state.readerInterface,
|
|
103
|
-
});
|
|
104
|
-
run.catch((err) => {
|
|
105
|
-
reject(err);
|
|
106
|
-
});
|
|
28
|
+
await (0, process_m3u_chunk_1.processM3uChunk)({
|
|
29
|
+
playlistUrl,
|
|
30
|
+
state,
|
|
31
|
+
structure,
|
|
32
|
+
audioDone,
|
|
33
|
+
videoDone,
|
|
107
34
|
});
|
|
108
35
|
};
|
|
109
36
|
exports.runOverM3u = runOverM3u;
|
|
@@ -4,6 +4,7 @@ export declare const sampleSorter: ({ logLevel, getAllChunksProcessedForPlaylist
|
|
|
4
4
|
logLevel: LogLevel;
|
|
5
5
|
getAllChunksProcessedForPlaylist: (src: string) => boolean;
|
|
6
6
|
}) => {
|
|
7
|
+
clearSamples: () => void;
|
|
7
8
|
addToStreamWithTrack: (src: string) => void;
|
|
8
9
|
addVideoStreamToConsider: (src: string, callback: OnVideoSample) => void;
|
|
9
10
|
addAudioStreamToConsider: (src: string, callback: OnAudioSample) => void;
|
|
@@ -6,8 +6,11 @@ const sampleSorter = ({ logLevel, getAllChunksProcessedForPlaylist, }) => {
|
|
|
6
6
|
const streamsWithTracks = [];
|
|
7
7
|
const audioCallbacks = {};
|
|
8
8
|
const videoCallbacks = {};
|
|
9
|
-
|
|
9
|
+
let latestSample = {};
|
|
10
10
|
return {
|
|
11
|
+
clearSamples: () => {
|
|
12
|
+
latestSample = {};
|
|
13
|
+
},
|
|
11
14
|
addToStreamWithTrack: (src) => {
|
|
12
15
|
streamsWithTracks.push(src);
|
|
13
16
|
},
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getChunkToSeekTo = void 0;
|
|
4
|
+
const getChunkToSeekTo = ({ chunks, seekToSecondsToProcess, }) => {
|
|
5
|
+
let duration = 0;
|
|
6
|
+
for (let i = 0; i < chunks.length; i++) {
|
|
7
|
+
if (duration >= seekToSecondsToProcess) {
|
|
8
|
+
return Math.max(0, i - 1);
|
|
9
|
+
}
|
|
10
|
+
duration += chunks[i].duration;
|
|
11
|
+
}
|
|
12
|
+
return Math.max(0, chunks.length - 1);
|
|
13
|
+
};
|
|
14
|
+
exports.getChunkToSeekTo = getChunkToSeekTo;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getSeekingHintsForM3u = void 0;
|
|
4
|
+
const getSeekingHintsForM3u = () => {
|
|
5
|
+
return {
|
|
6
|
+
type: 'm3u8-seeking-hints',
|
|
7
|
+
};
|
|
8
|
+
};
|
|
9
|
+
exports.getSeekingHintsForM3u = getSeekingHintsForM3u;
|
|
@@ -7,9 +7,10 @@ export type SelectM3uAssociatedPlaylistsFnOptions = {
|
|
|
7
7
|
associatedPlaylists: M3uAssociatedPlaylist[];
|
|
8
8
|
};
|
|
9
9
|
export type SelectM3uAssociatedPlaylistsFn = (options: SelectM3uAssociatedPlaylistsFnOptions) => M3uAssociatedPlaylist[] | Promise<M3uAssociatedPlaylist[]>;
|
|
10
|
-
export declare const selectAssociatedPlaylists: ({ playlists, fn, }: {
|
|
10
|
+
export declare const selectAssociatedPlaylists: ({ playlists, fn, skipAudioTracks, }: {
|
|
11
11
|
playlists: M3uAssociatedPlaylist[];
|
|
12
12
|
fn: SelectM3uAssociatedPlaylistsFn;
|
|
13
|
+
skipAudioTracks: boolean;
|
|
13
14
|
}) => Promise<M3uAssociatedPlaylist[]>;
|
|
14
15
|
export declare const defaultSelectM3uAssociatedPlaylists: SelectM3uAssociatedPlaylistsFn;
|
|
15
16
|
export declare const selectStream: ({ streams, fn, }: {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.defaultSelectM3uStreamFn = exports.selectStream = exports.defaultSelectM3uAssociatedPlaylists = exports.selectAssociatedPlaylists = void 0;
|
|
4
|
-
const selectAssociatedPlaylists = async ({ playlists, fn, }) => {
|
|
4
|
+
const selectAssociatedPlaylists = async ({ playlists, fn, skipAudioTracks, }) => {
|
|
5
5
|
if (playlists.length < 1) {
|
|
6
6
|
return Promise.resolve([]);
|
|
7
7
|
}
|
|
@@ -9,12 +9,17 @@ const selectAssociatedPlaylists = async ({ playlists, fn, }) => {
|
|
|
9
9
|
if (!Array.isArray(streams)) {
|
|
10
10
|
throw new Error('Expected an array of associated playlists');
|
|
11
11
|
}
|
|
12
|
+
const selectedStreams = [];
|
|
12
13
|
for (const stream of streams) {
|
|
14
|
+
if (stream.isAudio && skipAudioTracks) {
|
|
15
|
+
continue;
|
|
16
|
+
}
|
|
13
17
|
if (!playlists.find((playlist) => playlist.src === stream.src)) {
|
|
14
18
|
throw new Error(`The associated playlist ${JSON.stringify(streams)} cannot be selected because it was not in the list of selectable playlists`);
|
|
15
19
|
}
|
|
20
|
+
selectedStreams.push(stream);
|
|
16
21
|
}
|
|
17
|
-
return
|
|
22
|
+
return selectedStreams;
|
|
18
23
|
};
|
|
19
24
|
exports.selectAssociatedPlaylists = selectAssociatedPlaylists;
|
|
20
25
|
const defaultSelectM3uAssociatedPlaylists = ({ associatedPlaylists }) => {
|
|
@@ -1,2 +1,7 @@
|
|
|
1
1
|
import type { ParserState } from '../../state/parser-state';
|
|
2
|
+
import type { XingData } from './parse-xing';
|
|
3
|
+
export declare const getDurationFromMp3Xing: ({ xingData, samplesPerFrame, }: {
|
|
4
|
+
xingData: XingData;
|
|
5
|
+
samplesPerFrame: number;
|
|
6
|
+
}) => number;
|
|
2
7
|
export declare const getDurationFromMp3: (state: ParserState) => number | null;
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import type { MediaParserController } from '../../../controller/media-parser-controller';
|
|
2
|
+
import type { PrefetchCache } from '../../../fetch';
|
|
2
3
|
import { type LogLevel } from '../../../log';
|
|
3
4
|
import type { ParseMediaSrc } from '../../../options';
|
|
4
5
|
import type { ReaderInterface } from '../../../readers/reader';
|
|
5
|
-
export declare const fetchIdx1: ({ src, readerInterface, controller, position, logLevel, }: {
|
|
6
|
+
export declare const fetchIdx1: ({ src, readerInterface, controller, position, logLevel, prefetchCache, }: {
|
|
6
7
|
src: ParseMediaSrc;
|
|
7
8
|
readerInterface: ReaderInterface;
|
|
8
9
|
controller: MediaParserController;
|
|
9
10
|
position: number;
|
|
10
11
|
logLevel: LogLevel;
|
|
12
|
+
prefetchCache: PrefetchCache;
|
|
11
13
|
}) => Promise<{
|
|
12
14
|
entries: import("../riff-box").Idx1Entry[];
|
|
13
15
|
videoTrackIndex: number | null;
|
|
@@ -4,12 +4,14 @@ exports.fetchIdx1 = void 0;
|
|
|
4
4
|
const buffer_iterator_1 = require("../../../iterator/buffer-iterator");
|
|
5
5
|
const log_1 = require("../../../log");
|
|
6
6
|
const expect_riff_box_1 = require("../expect-riff-box");
|
|
7
|
-
const fetchIdx1 = async ({ src, readerInterface, controller, position, logLevel, }) => {
|
|
7
|
+
const fetchIdx1 = async ({ src, readerInterface, controller, position, logLevel, prefetchCache, }) => {
|
|
8
8
|
log_1.Log.verbose(logLevel, 'Making request to fetch idx1 from ', src, 'position', position);
|
|
9
9
|
const result = await readerInterface.read({
|
|
10
10
|
controller,
|
|
11
11
|
range: position,
|
|
12
12
|
src,
|
|
13
|
+
logLevel,
|
|
14
|
+
prefetchCache,
|
|
13
15
|
});
|
|
14
16
|
const iterator = (0, buffer_iterator_1.getArrayBufferIterator)(new Uint8Array(), Infinity);
|
|
15
17
|
while (true) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { LogLevel } from '../../log';
|
|
2
|
-
import type {
|
|
2
|
+
import type { CallbacksState } from '../../state/sample-callbacks';
|
|
3
3
|
import type { TransportStreamState } from '../../state/transport-stream/transport-stream';
|
|
4
4
|
import type { OnAudioTrack } from '../../webcodec-sample-types';
|
|
5
5
|
import type { TransportStreamPacketBuffer } from './process-stream-buffers';
|
|
@@ -7,7 +7,7 @@ export declare const handleAacPacket: ({ streamBuffer, programId, offset, sample
|
|
|
7
7
|
streamBuffer: TransportStreamPacketBuffer;
|
|
8
8
|
programId: number;
|
|
9
9
|
offset: number;
|
|
10
|
-
sampleCallbacks:
|
|
10
|
+
sampleCallbacks: CallbacksState;
|
|
11
11
|
logLevel: LogLevel;
|
|
12
12
|
onAudioTrack: OnAudioTrack | null;
|
|
13
13
|
transportStream: TransportStreamState;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { LogLevel } from '../../log';
|
|
2
|
-
import type {
|
|
2
|
+
import type { CallbacksState } from '../../state/sample-callbacks';
|
|
3
3
|
import type { TransportStreamState } from '../../state/transport-stream/transport-stream';
|
|
4
4
|
import type { OnVideoTrack } from '../../webcodec-sample-types';
|
|
5
5
|
import type { TransportStreamPacketBuffer } from './process-stream-buffers';
|
|
@@ -8,7 +8,7 @@ export declare const handleAvcPacket: ({ streamBuffer, programId, offset, sample
|
|
|
8
8
|
streamBuffer: TransportStreamPacketBuffer;
|
|
9
9
|
programId: number;
|
|
10
10
|
offset: number;
|
|
11
|
-
sampleCallbacks:
|
|
11
|
+
sampleCallbacks: CallbacksState;
|
|
12
12
|
logLevel: LogLevel;
|
|
13
13
|
onVideoTrack: OnVideoTrack | null;
|
|
14
14
|
transportStream: TransportStreamState;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { LogLevel } from '../../log';
|
|
2
2
|
import type { TransportStreamStructure } from '../../parse-result';
|
|
3
|
-
import type {
|
|
3
|
+
import type { CallbacksState } from '../../state/sample-callbacks';
|
|
4
4
|
import type { TransportStreamState } from '../../state/transport-stream/transport-stream';
|
|
5
5
|
import type { OnAudioTrack, OnVideoTrack } from '../../webcodec-sample-types';
|
|
6
6
|
import type { TransportStreamEntry } from './parse-pmt';
|
|
@@ -11,7 +11,7 @@ export declare const canProcessAudio: ({ streamBuffer, }: {
|
|
|
11
11
|
export declare const processAudio: ({ transportStreamEntry, structure, offset, sampleCallbacks, logLevel, onAudioTrack, onVideoTrack, transportStream, makeSamplesStartAtZero, }: {
|
|
12
12
|
transportStreamEntry: TransportStreamEntry;
|
|
13
13
|
structure: TransportStreamStructure;
|
|
14
|
-
sampleCallbacks:
|
|
14
|
+
sampleCallbacks: CallbacksState;
|
|
15
15
|
logLevel: LogLevel;
|
|
16
16
|
onAudioTrack: OnAudioTrack | null;
|
|
17
17
|
onVideoTrack: OnVideoTrack | null;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { LogLevel } from '../../log';
|
|
2
2
|
import type { TransportStreamStructure } from '../../parse-result';
|
|
3
|
-
import type {
|
|
3
|
+
import type { CallbacksState } from '../../state/sample-callbacks';
|
|
4
4
|
import type { TransportStreamState } from '../../state/transport-stream/transport-stream';
|
|
5
5
|
import type { OnAudioTrack, OnVideoTrack } from '../../webcodec-sample-types';
|
|
6
6
|
import type { PacketPes } from './parse-pes';
|
|
@@ -21,7 +21,7 @@ export declare const processStreamBuffer: ({ streamBuffer, programId, structure,
|
|
|
21
21
|
streamBuffer: TransportStreamPacketBuffer;
|
|
22
22
|
programId: number;
|
|
23
23
|
structure: TransportStreamStructure;
|
|
24
|
-
sampleCallbacks:
|
|
24
|
+
sampleCallbacks: CallbacksState;
|
|
25
25
|
logLevel: LogLevel;
|
|
26
26
|
onAudioTrack: OnAudioTrack | null;
|
|
27
27
|
onVideoTrack: OnVideoTrack | null;
|
|
@@ -30,7 +30,7 @@ export declare const processStreamBuffer: ({ streamBuffer, programId, structure,
|
|
|
30
30
|
}) => Promise<void>;
|
|
31
31
|
export declare const processFinalStreamBuffers: ({ structure, sampleCallbacks, logLevel, onAudioTrack, onVideoTrack, transportStream, makeSamplesStartAtZero, }: {
|
|
32
32
|
structure: TransportStreamStructure;
|
|
33
|
-
sampleCallbacks:
|
|
33
|
+
sampleCallbacks: CallbacksState;
|
|
34
34
|
logLevel: LogLevel;
|
|
35
35
|
onAudioTrack: OnAudioTrack | null;
|
|
36
36
|
onVideoTrack: OnVideoTrack | null;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { LogLevel } from '../../log';
|
|
2
2
|
import type { TransportStreamStructure } from '../../parse-result';
|
|
3
|
-
import type {
|
|
3
|
+
import type { CallbacksState } from '../../state/sample-callbacks';
|
|
4
4
|
import type { TransportStreamState } from '../../state/transport-stream/transport-stream';
|
|
5
5
|
import type { OnAudioTrack, OnVideoTrack } from '../../webcodec-sample-types';
|
|
6
6
|
import type { TransportStreamPacketBuffer } from './process-stream-buffers';
|
|
@@ -11,7 +11,7 @@ export declare const processVideo: ({ programId, structure, streamBuffer, sample
|
|
|
11
11
|
programId: number;
|
|
12
12
|
structure: TransportStreamStructure;
|
|
13
13
|
streamBuffer: TransportStreamPacketBuffer;
|
|
14
|
-
sampleCallbacks:
|
|
14
|
+
sampleCallbacks: CallbacksState;
|
|
15
15
|
logLevel: LogLevel;
|
|
16
16
|
onAudioTrack: OnAudioTrack | null;
|
|
17
17
|
onVideoTrack: OnVideoTrack | null;
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
import type { LogLevel } from '../../log';
|
|
1
2
|
import type { WebmState } from '../../state/matroska/webm';
|
|
3
|
+
import type { CallbacksState } from '../../state/sample-callbacks';
|
|
2
4
|
import type { StructureState } from '../../state/structure';
|
|
3
|
-
import type { AudioOrVideoSample } from '../../webcodec-sample-types';
|
|
5
|
+
import type { AudioOrVideoSample, OnVideoTrack } from '../../webcodec-sample-types';
|
|
4
6
|
import type { BlockSegment, SimpleBlockSegment } from './segments/all-segments';
|
|
5
7
|
type SampleResult = {
|
|
6
8
|
type: 'video-sample';
|
|
@@ -14,5 +16,13 @@ type SampleResult = {
|
|
|
14
16
|
} | {
|
|
15
17
|
type: 'no-sample';
|
|
16
18
|
};
|
|
17
|
-
export declare const getSampleFromBlock: (ebml
|
|
19
|
+
export declare const getSampleFromBlock: ({ ebml, webmState, offset, structureState, callbacks, logLevel, onVideoTrack, }: {
|
|
20
|
+
ebml: BlockSegment | SimpleBlockSegment;
|
|
21
|
+
webmState: WebmState;
|
|
22
|
+
offset: number;
|
|
23
|
+
structureState: StructureState;
|
|
24
|
+
callbacks: CallbacksState;
|
|
25
|
+
logLevel: LogLevel;
|
|
26
|
+
onVideoTrack: OnVideoTrack | null;
|
|
27
|
+
}) => Promise<SampleResult>;
|
|
18
28
|
export {};
|
|
@@ -2,22 +2,50 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.getSampleFromBlock = void 0;
|
|
4
4
|
const buffer_iterator_1 = require("../../iterator/buffer-iterator");
|
|
5
|
+
const register_track_1 = require("../../register-track");
|
|
5
6
|
const parse_avc_1 = require("../avc/parse-avc");
|
|
6
7
|
const get_ready_tracks_1 = require("./get-ready-tracks");
|
|
7
8
|
const all_segments_1 = require("./segments/all-segments");
|
|
8
9
|
const block_simple_block_flags_1 = require("./segments/block-simple-block-flags");
|
|
9
|
-
const
|
|
10
|
-
if (codec
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
10
|
+
const addAvcToTrackAndActivateTrackIfNecessary = async ({ partialVideoSample, codec, structureState, webmState, trackNumber, logLevel, callbacks, onVideoTrack, }) => {
|
|
11
|
+
if (codec !== 'V_MPEG4/ISO/AVC') {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
const missingTracks = (0, get_ready_tracks_1.getTracksFromMatroska)({
|
|
15
|
+
structureState,
|
|
16
|
+
webmState,
|
|
17
|
+
}).missingInfo;
|
|
18
|
+
if (missingTracks.length === 0) {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const parsed = (0, parse_avc_1.parseAvc)(partialVideoSample.data);
|
|
22
|
+
for (const parse of parsed) {
|
|
23
|
+
if (parse.type === 'avc-profile') {
|
|
24
|
+
webmState.setAvcProfileForTrackNumber(trackNumber, parse);
|
|
25
|
+
const track = missingTracks.find((t) => t.trackId === trackNumber);
|
|
26
|
+
if (!track) {
|
|
27
|
+
throw new Error('Could not find track ' + trackNumber);
|
|
28
|
+
}
|
|
29
|
+
const resolvedTracks = (0, get_ready_tracks_1.getTracksFromMatroska)({
|
|
30
|
+
structureState,
|
|
31
|
+
webmState,
|
|
32
|
+
}).resolved;
|
|
33
|
+
const resolvedTrack = resolvedTracks.find((t) => t.trackId === trackNumber);
|
|
34
|
+
if (!resolvedTrack) {
|
|
35
|
+
throw new Error('Could not find track ' + trackNumber);
|
|
16
36
|
}
|
|
37
|
+
await (0, register_track_1.registerVideoTrack)({
|
|
38
|
+
track: resolvedTrack,
|
|
39
|
+
container: 'webm',
|
|
40
|
+
logLevel,
|
|
41
|
+
onVideoTrack,
|
|
42
|
+
registerVideoSampleCallback: callbacks.registerVideoSampleCallback,
|
|
43
|
+
tracks: callbacks.tracks,
|
|
44
|
+
});
|
|
17
45
|
}
|
|
18
46
|
}
|
|
19
47
|
};
|
|
20
|
-
const getSampleFromBlock = (ebml, webmState, offset, structureState) => {
|
|
48
|
+
const getSampleFromBlock = async ({ ebml, webmState, offset, structureState, callbacks, logLevel, onVideoTrack, }) => {
|
|
21
49
|
const iterator = (0, buffer_iterator_1.getArrayBufferIterator)(ebml.value, ebml.value.length);
|
|
22
50
|
const trackNumber = iterator.getVint();
|
|
23
51
|
if (trackNumber === null) {
|
|
@@ -62,12 +90,15 @@ const getSampleFromBlock = (ebml, webmState, offset, structureState) => {
|
|
|
62
90
|
partialVideoSample,
|
|
63
91
|
};
|
|
64
92
|
}
|
|
65
|
-
|
|
93
|
+
await addAvcToTrackAndActivateTrackIfNecessary({
|
|
66
94
|
codec,
|
|
67
95
|
partialVideoSample,
|
|
68
96
|
structureState,
|
|
69
97
|
webmState,
|
|
70
98
|
trackNumber,
|
|
99
|
+
callbacks,
|
|
100
|
+
logLevel,
|
|
101
|
+
onVideoTrack,
|
|
71
102
|
});
|
|
72
103
|
const sample = {
|
|
73
104
|
...partialVideoSample,
|
|
@@ -131,21 +131,31 @@ const postprocessEbml = async ({ offset, ebml, statesForProcessing: { webmState,
|
|
|
131
131
|
});
|
|
132
132
|
}
|
|
133
133
|
if (track && track.type === 'video') {
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
134
|
+
if (track.codec !== make_track_1.NO_CODEC_PRIVATE_SHOULD_BE_DERIVED_FROM_SPS) {
|
|
135
|
+
await (0, register_track_1.registerVideoTrack)({
|
|
136
|
+
track,
|
|
137
|
+
container: 'webm',
|
|
138
|
+
logLevel,
|
|
139
|
+
onVideoTrack,
|
|
140
|
+
registerVideoSampleCallback: callbacks.registerVideoSampleCallback,
|
|
141
|
+
tracks: callbacks.tracks,
|
|
142
|
+
});
|
|
143
|
+
}
|
|
142
144
|
}
|
|
143
145
|
}
|
|
144
146
|
if (ebml.type === 'Timestamp') {
|
|
145
147
|
webmState.setTimestampOffset(offset, ebml.value.value);
|
|
146
148
|
}
|
|
147
149
|
if (ebml.type === 'Block' || ebml.type === 'SimpleBlock') {
|
|
148
|
-
const sample = (0, get_sample_from_block_1.getSampleFromBlock)(
|
|
150
|
+
const sample = await (0, get_sample_from_block_1.getSampleFromBlock)({
|
|
151
|
+
ebml,
|
|
152
|
+
webmState,
|
|
153
|
+
offset,
|
|
154
|
+
structureState,
|
|
155
|
+
callbacks,
|
|
156
|
+
logLevel,
|
|
157
|
+
onVideoTrack,
|
|
158
|
+
});
|
|
149
159
|
if (sample.type === 'video-sample') {
|
|
150
160
|
await callbacks.onVideoSample(sample.videoSample.trackId, sample.videoSample);
|
|
151
161
|
return {
|
|
@@ -182,7 +192,15 @@ const postprocessEbml = async ({ offset, ebml, statesForProcessing: { webmState,
|
|
|
182
192
|
const hasReferenceBlock = ebml.value.find((c) => c.type === 'ReferenceBlock');
|
|
183
193
|
const sample = block.value.length === 0
|
|
184
194
|
? null
|
|
185
|
-
: (0, get_sample_from_block_1.getSampleFromBlock)(
|
|
195
|
+
: await (0, get_sample_from_block_1.getSampleFromBlock)({
|
|
196
|
+
ebml: block,
|
|
197
|
+
webmState,
|
|
198
|
+
offset,
|
|
199
|
+
structureState,
|
|
200
|
+
callbacks,
|
|
201
|
+
logLevel,
|
|
202
|
+
onVideoTrack,
|
|
203
|
+
});
|
|
186
204
|
if (sample && sample.type === 'partial-video-sample') {
|
|
187
205
|
const completeFrame = {
|
|
188
206
|
...sample.partialVideoSample,
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import type { MediaParserController } from '../../../controller/media-parser-controller';
|
|
2
|
+
import type { PrefetchCache } from '../../../fetch';
|
|
2
3
|
import type { LogLevel } from '../../../log';
|
|
3
4
|
import type { ParseMediaSrc } from '../../../options';
|
|
4
5
|
import type { ReaderInterface } from '../../../readers/reader';
|
|
5
6
|
import type { MatroskaCue } from './format-cues';
|
|
6
|
-
export declare const fetchWebmCues: ({ src, readerInterface, controller, position, logLevel, }: {
|
|
7
|
+
export declare const fetchWebmCues: ({ src, readerInterface, controller, position, logLevel, prefetchCache, }: {
|
|
7
8
|
src: ParseMediaSrc;
|
|
8
9
|
readerInterface: ReaderInterface;
|
|
9
10
|
controller: MediaParserController;
|
|
10
11
|
position: number;
|
|
11
12
|
logLevel: LogLevel;
|
|
13
|
+
prefetchCache: PrefetchCache;
|
|
12
14
|
}) => Promise<MatroskaCue[] | null>;
|
|
@@ -4,11 +4,13 @@ exports.fetchWebmCues = void 0;
|
|
|
4
4
|
const buffer_iterator_1 = require("../../../iterator/buffer-iterator");
|
|
5
5
|
const segments_1 = require("../segments");
|
|
6
6
|
const format_cues_1 = require("./format-cues");
|
|
7
|
-
const fetchWebmCues = async ({ src, readerInterface, controller, position, logLevel, }) => {
|
|
7
|
+
const fetchWebmCues = async ({ src, readerInterface, controller, position, logLevel, prefetchCache, }) => {
|
|
8
8
|
const result = await readerInterface.read({
|
|
9
9
|
controller,
|
|
10
10
|
range: position,
|
|
11
11
|
src,
|
|
12
|
+
logLevel,
|
|
13
|
+
prefetchCache,
|
|
12
14
|
});
|
|
13
15
|
const { value } = await result.reader.reader.read();
|
|
14
16
|
if (!value) {
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import type { LogLevel } from '../../log';
|
|
2
2
|
import type { WebmState } from '../../state/matroska/webm';
|
|
3
3
|
import type { ParserState } from '../../state/parser-state';
|
|
4
|
-
import type {
|
|
4
|
+
import type { CallbacksState } from '../../state/sample-callbacks';
|
|
5
5
|
import type { StructureState } from '../../state/structure';
|
|
6
6
|
import type { OnAudioTrack, OnVideoTrack } from '../../webcodec-sample-types';
|
|
7
7
|
export type WebmRequiredStatesForProcessing = {
|
|
8
8
|
webmState: WebmState;
|
|
9
|
-
callbacks:
|
|
9
|
+
callbacks: CallbacksState;
|
|
10
10
|
logLevel: LogLevel;
|
|
11
11
|
onAudioTrack: OnAudioTrack | null;
|
|
12
12
|
onVideoTrack: OnVideoTrack | null;
|
|
@@ -7,7 +7,7 @@ export type MediaParserController = {
|
|
|
7
7
|
abort: (reason?: any) => void;
|
|
8
8
|
pause: PauseSignal['pause'];
|
|
9
9
|
resume: PauseSignal['resume'];
|
|
10
|
-
|
|
10
|
+
seek: SeekSignal['seek'];
|
|
11
11
|
addEventListener: MediaParserEmitter['addEventListener'];
|
|
12
12
|
removeEventListener: MediaParserEmitter['removeEventListener'];
|
|
13
13
|
getSeekingHints: () => Promise<SeekingHints | null>;
|
|
@@ -14,7 +14,11 @@ const mediaParserController = () => {
|
|
|
14
14
|
const performedSeeksSignal = (0, performed_seeks_stats_1.performedSeeksStats)();
|
|
15
15
|
const checkForAbortAndPause = async () => {
|
|
16
16
|
if (abortController.signal.aborted) {
|
|
17
|
-
|
|
17
|
+
const err = new errors_1.MediaParserAbortError('Aborted');
|
|
18
|
+
if (abortController.signal.reason) {
|
|
19
|
+
err.cause = abortController.signal.reason;
|
|
20
|
+
}
|
|
21
|
+
throw err;
|
|
18
22
|
}
|
|
19
23
|
await pauseSignal.waitUntilResume();
|
|
20
24
|
};
|
|
@@ -37,7 +41,7 @@ const mediaParserController = () => {
|
|
|
37
41
|
abortController.abort(reason);
|
|
38
42
|
emitter.dispatchAbort(reason);
|
|
39
43
|
},
|
|
40
|
-
|
|
44
|
+
seek: seekSignal.seek,
|
|
41
45
|
pause: pauseSignal.pause,
|
|
42
46
|
resume: pauseSignal.resume,
|
|
43
47
|
addEventListener: emitter.addEventListener,
|
|
@@ -10,10 +10,6 @@ type SeekToTime = {
|
|
|
10
10
|
type: 'keyframe-before-time';
|
|
11
11
|
timeInSeconds: number;
|
|
12
12
|
};
|
|
13
|
-
type
|
|
14
|
-
type: 'byte';
|
|
15
|
-
byte: number;
|
|
16
|
-
};
|
|
17
|
-
export type Seek = SeekToTime | SeekToByte;
|
|
13
|
+
export type Seek = SeekToTime;
|
|
18
14
|
export declare const makeSeekSignal: (emitter: MediaParserEmitter) => SeekSignal;
|
|
19
15
|
export {};
|
|
@@ -23,7 +23,7 @@ const downloadAndParseMedia = async (options) => {
|
|
|
23
23
|
onDimensions: (_f = options.onDimensions) !== null && _f !== void 0 ? _f : null,
|
|
24
24
|
selectM3uStream: (_g = options.selectM3uStream) !== null && _g !== void 0 ? _g : select_stream_1.defaultSelectM3uStreamFn,
|
|
25
25
|
selectM3uAssociatedPlaylists: (_h = options.selectM3uAssociatedPlaylists) !== null && _h !== void 0 ? _h : select_stream_1.defaultSelectM3uAssociatedPlaylists,
|
|
26
|
-
|
|
26
|
+
m3uPlaylistContext: (_j = options.m3uPlaylistContext) !== null && _j !== void 0 ? _j : null,
|
|
27
27
|
onDiscardedData: async (data) => {
|
|
28
28
|
await content.write(data);
|
|
29
29
|
},
|