@remotion/media-parser 4.0.286 → 4.0.287
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/collect-sample-positions-from-moof-boxes.d.ts +2 -2
- package/dist/containers/iso-base-media/collect-sample-positions-from-moof-boxes.js +6 -3
- package/dist/containers/iso-base-media/get-keyframes.js +1 -1
- package/dist/containers/iso-base-media/get-sample-positions-from-track.d.ts +2 -2
- package/dist/containers/iso-base-media/get-seeking-byte.d.ts +15 -0
- package/dist/containers/iso-base-media/{get-seeking-from-mp4.js → get-seeking-byte.js} +16 -2
- package/dist/containers/iso-base-media/mdat/mdat.js +6 -3
- package/dist/containers/iso-base-media/process-box.js +5 -3
- package/dist/containers/iso-base-media/{get-seeking-info-from-mp4.d.ts → seeking-hints.d.ts} +8 -3
- package/dist/containers/iso-base-media/seeking-hints.js +52 -0
- package/dist/containers/iso-base-media/traversal.d.ts +4 -2
- package/dist/containers/iso-base-media/traversal.js +6 -5
- package/dist/containers/m3u/iterate-over-segment-files.js +23 -20
- package/dist/containers/riff/parse-video-section.js +1 -1
- package/dist/containers/transport-stream/handle-aac-packet.js +4 -1
- package/dist/containers/transport-stream/handle-avc-packet.js +4 -1
- package/dist/containers/transport-stream/seeking-hints.d.ts +9 -0
- package/dist/containers/transport-stream/seeking-hints.js +26 -0
- package/dist/containers/wav/get-seeking-byte.d.ts +2 -2
- package/dist/containers/wav/get-seeking-byte.js +2 -2
- package/dist/containers/wav/seeking-hints.d.ts +12 -0
- package/dist/containers/wav/seeking-hints.js +25 -0
- package/dist/containers/webm/seek/get-seeking-byte.d.ts +3 -5
- package/dist/containers/webm/seek/get-seeking-byte.js +5 -5
- package/dist/containers/webm/seek/seeking-hints.d.ts +10 -0
- package/dist/containers/webm/seek/seeking-hints.js +28 -0
- package/dist/controller/media-parser-controller.d.ts +3 -0
- package/dist/controller/media-parser-controller.js +15 -0
- package/dist/download-and-parse-media.js +2 -1
- package/dist/emit-available-info.js +1 -1
- package/dist/esm/index.mjs +430 -197
- package/dist/esm/node-writer.mjs +1 -2
- package/dist/esm/node.mjs +1 -2
- package/dist/esm/server-worker.mjs +46 -1
- package/dist/esm/universal.mjs +2 -4
- package/dist/esm/web.mjs +1 -2
- package/dist/esm/worker-server-entry.mjs +466 -204
- package/dist/esm/worker-web-entry.mjs +465 -202
- package/dist/esm/worker.mjs +46 -1
- package/dist/{forward-controller.d.ts → forward-controller-pause-resume-abort.d.ts} +1 -1
- package/dist/{forward-controller.js → forward-controller-pause-resume-abort.js} +3 -3
- package/dist/get-audio-codec.js +2 -2
- package/dist/get-dimensions.js +1 -1
- package/dist/get-duration.js +3 -2
- package/dist/get-fps.js +1 -0
- package/dist/get-is-hdr.js +2 -2
- package/dist/get-keyframes.js +1 -1
- package/dist/get-seeking-byte.d.ts +7 -5
- package/dist/get-seeking-byte.js +13 -12
- package/dist/{get-seeking-info.d.ts → get-seeking-hints.d.ts} +7 -3
- package/dist/get-seeking-hints.js +35 -0
- package/dist/get-tracks.d.ts +4 -4
- package/dist/get-tracks.js +8 -6
- package/dist/get-video-codec.js +2 -2
- package/dist/has-all-info.js +1 -1
- package/dist/index.d.ts +31 -3
- package/dist/internal-parse-media.js +16 -1
- package/dist/iterator/buffer-iterator.js +3 -4
- package/dist/metadata/metadata-from-iso.js +1 -0
- package/dist/options.d.ts +2 -0
- package/dist/parse-media-on-worker-entry.js +51 -1
- package/dist/parse-media.js +2 -1
- package/dist/samples-from-moof.d.ts +2 -2
- package/dist/samples-from-moof.js +5 -8
- package/dist/seeking-hints.d.ts +39 -0
- package/dist/set-seeking-hints.d.ts +6 -0
- package/dist/set-seeking-hints.js +27 -0
- package/dist/state/has-tracks-section.js +3 -1
- package/dist/state/iso-base-media/cached-sample-positions.js +1 -1
- package/dist/state/iso-base-media/iso-state.d.ts +18 -2
- package/dist/state/iso-base-media/iso-state.js +4 -0
- package/dist/state/iso-base-media/lazy-mfra-load.d.ts +3 -0
- package/dist/state/iso-base-media/lazy-mfra-load.js +13 -0
- package/dist/state/iso-base-media/moov-box.d.ts +7 -2
- package/dist/state/iso-base-media/moov-box.js +1 -1
- package/dist/state/iso-base-media/precomputed-moof.d.ts +11 -0
- package/dist/state/iso-base-media/precomputed-moof.js +28 -0
- package/dist/state/iso-base-media/precomputed-tfra.d.ts +6 -0
- package/dist/state/iso-base-media/precomputed-tfra.js +17 -0
- package/dist/state/keyframes.d.ts +2 -0
- package/dist/state/keyframes.js +17 -9
- package/dist/state/matroska/lazy-cues-fetch.d.ts +7 -1
- package/dist/state/matroska/lazy-cues-fetch.js +21 -0
- package/dist/state/matroska/webm.d.ts +7 -0
- package/dist/state/matroska/webm.js +9 -1
- package/dist/state/parser-state.d.ts +31 -3
- package/dist/state/samples-observed/slow-duration-fps.js +0 -3
- package/dist/state/transport-stream/observed-pes-header.d.ts +2 -0
- package/dist/state/transport-stream/observed-pes-header.js +22 -12
- package/dist/state/transport-stream/pts-start-offset.d.ts +4 -1
- package/dist/state/transport-stream/pts-start-offset.js +1 -1
- package/dist/state/transport-stream/transport-stream.d.ts +5 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/with-resolvers.d.ts +5 -0
- package/dist/work-on-seek-request.js +8 -5
- package/dist/worker/{forward-controller.js → forward-controller-to-worker.js} +17 -0
- package/dist/worker/serialize-error.d.ts +6 -1
- package/dist/worker/serialize-error.js +2 -1
- package/dist/worker/worker-types.d.ts +12 -2
- package/dist/worker-server.js +16 -5
- package/package.json +3 -3
- package/dist/containers/iso-base-media/get-mfra-atom.d.ts +0 -9
- package/dist/containers/iso-base-media/get-mfra-atom.js +0 -12
- package/dist/containers/iso-base-media/get-seeking-from-mp4.d.ts +0 -11
- package/dist/containers/iso-base-media/get-seeking-info-from-mp4.js +0 -25
- package/dist/containers/iso-base-media/mfra/mfra.d.ts +0 -2
- package/dist/containers/iso-base-media/mfra/mfra.js +0 -11
- package/dist/containers/transport-stream/get-seeking-info.d.ts +0 -4
- package/dist/containers/transport-stream/get-seeking-info.js +0 -17
- package/dist/containers/transport-stream/next-pes-header-store.d.ts +0 -6
- package/dist/containers/transport-stream/next-pes-header-store.js +0 -18
- package/dist/containers/transport-stream/start-offset.d.ts +0 -4
- package/dist/containers/transport-stream/start-offset.js +0 -13
- package/dist/containers/wav/get-seeking-info.d.ts +0 -7
- package/dist/containers/wav/get-seeking-info.js +0 -20
- package/dist/containers/wav/parse-video-section.d.ts +0 -5
- package/dist/containers/wav/parse-video-section.js +0 -41
- package/dist/containers/webm/cues/fetch-web-cues.d.ts +0 -12
- package/dist/containers/webm/cues/fetch-web-cues.js +0 -32
- package/dist/containers/webm/cues/format-cues.d.ts +0 -8
- package/dist/containers/webm/cues/format-cues.js +0 -41
- package/dist/containers/webm/cues/get-seeking-byte.d.ts +0 -14
- package/dist/containers/webm/cues/get-seeking-byte.js +0 -91
- package/dist/containers/webm/fetch-web-cues.d.ts +0 -12
- package/dist/containers/webm/fetch-web-cues.js +0 -29
- package/dist/containers/webm/get-seeking-byte.d.ts +0 -14
- package/dist/containers/webm/get-seeking-byte.js +0 -91
- package/dist/containers/webm/get-seeking-info.d.ts +0 -3
- package/dist/containers/webm/get-seeking-info.js +0 -17
- package/dist/containers/webm/seek/get-seeking-info.d.ts +0 -3
- package/dist/containers/webm/seek/get-seeking-info.js +0 -17
- package/dist/emitter.d.ts +0 -33
- package/dist/emitter.js +0 -65
- package/dist/get-sample-positions-from-lpcm.d.ts +0 -3
- package/dist/get-sample-positions-from-lpcm.js +0 -46
- package/dist/get-seeking-info.js +0 -35
- package/dist/media-parser-controller.d.ts +0 -21
- package/dist/media-parser-controller.js +0 -38
- package/dist/pause-signal.d.ts +0 -11
- package/dist/pause-signal.js +0 -38
- package/dist/readers/state/aac-state.d.ts +0 -13
- package/dist/readers/state/aac-state.js +0 -17
- package/dist/readers/state/can-skip-tracks.d.ts +0 -16
- package/dist/readers/state/can-skip-tracks.js +0 -60
- package/dist/readers/state/current-reader.d.ts +0 -6
- package/dist/readers/state/current-reader.js +0 -13
- package/dist/readers/state/emitted-fields.d.ts +0 -1
- package/dist/readers/state/emitted-fields.js +0 -37
- package/dist/readers/state/flac-state.d.ts +0 -4
- package/dist/readers/state/flac-state.js +0 -13
- package/dist/readers/state/has-tracks-section.d.ts +0 -14
- package/dist/readers/state/has-tracks-section.js +0 -37
- package/dist/readers/state/images.d.ts +0 -9
- package/dist/readers/state/images.js +0 -14
- package/dist/readers/state/iso-base-media/cached-sample-positions.d.ts +0 -12
- package/dist/readers/state/iso-base-media/cached-sample-positions.js +0 -46
- package/dist/readers/state/iso-base-media/iso-state.d.ts +0 -24
- package/dist/readers/state/iso-base-media/iso-state.js +0 -20
- package/dist/readers/state/iso-base-media/lazy-mfra-load.d.ts +0 -13
- package/dist/readers/state/iso-base-media/lazy-mfra-load.js +0 -29
- package/dist/readers/state/iso-base-media/moov-box.d.ts +0 -5
- package/dist/readers/state/iso-base-media/moov-box.js +0 -13
- package/dist/readers/state/keyframes.d.ts +0 -6
- package/dist/readers/state/keyframes.js +0 -15
- package/dist/readers/state/m3u-state.d.ts +0 -44
- package/dist/readers/state/m3u-state.js +0 -124
- package/dist/readers/state/may-skip-video-data.d.ts +0 -4
- package/dist/readers/state/may-skip-video-data.js +0 -18
- package/dist/readers/state/mp3.d.ts +0 -15
- package/dist/readers/state/mp3.js +0 -19
- package/dist/readers/state/need-samples-for-fields.d.ts +0 -6
- package/dist/readers/state/need-samples-for-fields.js +0 -39
- package/dist/readers/state/parser-state.d.ts +0 -252
- package/dist/readers/state/parser-state.js +0 -124
- package/dist/readers/state/riff.d.ts +0 -10
- package/dist/readers/state/riff.js +0 -32
- package/dist/readers/state/sample-callbacks.d.ts +0 -44
- package/dist/readers/state/sample-callbacks.js +0 -118
- package/dist/readers/state/seek-infinite-loop.d.ts +0 -5
- package/dist/readers/state/seek-infinite-loop.js +0 -22
- package/dist/readers/state/slow-duration-fps.d.ts +0 -11
- package/dist/readers/state/slow-duration-fps.js +0 -86
- package/dist/readers/state/structure.d.ts +0 -15
- package/dist/readers/state/structure.js +0 -78
- package/dist/readers/state/timings.d.ts +0 -8
- package/dist/readers/state/timings.js +0 -13
- package/dist/readers/state/transport-stream/last-emitted-sample.d.ts +0 -6
- package/dist/readers/state/transport-stream/last-emitted-sample.js +0 -16
- package/dist/readers/state/transport-stream/next-pes-header-store.d.ts +0 -6
- package/dist/readers/state/transport-stream/next-pes-header-store.js +0 -18
- package/dist/readers/state/transport-stream/start-offset.d.ts +0 -4
- package/dist/readers/state/transport-stream/start-offset.js +0 -13
- package/dist/readers/state/transport-stream/transport-stream.d.ts +0 -19
- package/dist/readers/state/transport-stream/transport-stream.js +0 -25
- package/dist/readers/state/video-section.d.ts +0 -33
- package/dist/readers/state/video-section.js +0 -65
- package/dist/readers/state/webm.d.ts +0 -28
- package/dist/readers/state/webm.js +0 -109
- package/dist/seek-signal.d.ts +0 -19
- package/dist/seek-signal.js +0 -24
- package/dist/seeking-info.d.ts +0 -31
- package/dist/server-worker.module.d.ts +0 -2
- package/dist/server-worker.module.js +0 -12
- package/dist/state/matroska/lazy-seek-fetch.d.ts +0 -1
- package/dist/state/matroska/lazy-seek-fetch.js +0 -5
- package/dist/state/matroska.d.ts +0 -0
- package/dist/state/matroska.js +0 -1
- package/dist/state/slow-duration-fps.d.ts +0 -11
- package/dist/state/slow-duration-fps.js +0 -86
- package/dist/state/transport-stream/start-offset.d.ts +0 -5
- package/dist/state/transport-stream/start-offset.js +0 -13
- package/dist/state/transport-stream.d.ts +0 -8
- package/dist/state/transport-stream.js +0 -11
- package/dist/state/uml.d.ts +0 -32
- package/dist/state/uml.js +0 -52
- package/dist/state/webm.d.ts +0 -30
- package/dist/state/webm.js +0 -109
- package/dist/state/work-on-seek-request-options.d.ts +0 -3
- package/dist/state/work-on-seek-request-options.js +0 -26
- package/dist/worker.module.d.ts +0 -4
- package/dist/worker.module.js +0 -12
- /package/dist/{seeking-info.js → seeking-hints.js} +0 -0
- /package/dist/worker/{forward-controller.d.ts → forward-controller-to-worker.d.ts} +0 -0
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import type { BufferIterator } from '../../iterator/buffer-iterator';
|
|
2
|
-
export declare const getChannelCount: (iterator: BufferIterator) =>
|
|
2
|
+
export declare const getChannelCount: (iterator: BufferIterator) => 2 | 8 | 1 | 7 | 3 | 4 | 5 | 6;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { MoofBox } from '../../state/iso-base-media/precomputed-moof';
|
|
2
2
|
import type { TfraBox } from './mfra/tfra';
|
|
3
3
|
import type { TkhdBox } from './tkhd';
|
|
4
4
|
export declare const collectSamplePositionsFromMoofBoxes: ({ moofBoxes, tfraBoxes, tkhdBox, }: {
|
|
5
|
-
moofBoxes:
|
|
5
|
+
moofBoxes: MoofBox[];
|
|
6
6
|
tfraBoxes: TfraBox[];
|
|
7
7
|
tkhdBox: TkhdBox;
|
|
8
8
|
}) => {
|
|
@@ -5,9 +5,12 @@ const samples_from_moof_1 = require("../../samples-from-moof");
|
|
|
5
5
|
const collectSamplePositionsFromMoofBoxes = ({ moofBoxes, tfraBoxes, tkhdBox, }) => {
|
|
6
6
|
const isComplete = tfraBoxes.length > 0 &&
|
|
7
7
|
tfraBoxes.every((t) => t.entries.length === moofBoxes.length);
|
|
8
|
-
const
|
|
9
|
-
return (0, samples_from_moof_1.getSamplesFromMoof)({
|
|
8
|
+
const samplePositions = moofBoxes.map((m) => {
|
|
9
|
+
return (0, samples_from_moof_1.getSamplesFromMoof)({
|
|
10
|
+
moofBox: m,
|
|
11
|
+
trackId: tkhdBox.trackId,
|
|
12
|
+
});
|
|
10
13
|
});
|
|
11
|
-
return { samplePositions
|
|
14
|
+
return { samplePositions, isComplete };
|
|
12
15
|
};
|
|
13
16
|
exports.collectSamplePositionsFromMoofBoxes = collectSamplePositionsFromMoofBoxes;
|
|
@@ -5,7 +5,7 @@ const get_tracks_1 = require("../../get-tracks");
|
|
|
5
5
|
const get_sample_positions_from_track_1 = require("./get-sample-positions-from-track");
|
|
6
6
|
const traversal_1 = require("./traversal");
|
|
7
7
|
const getKeyframesFromIsoBaseMedia = (state) => {
|
|
8
|
-
const { videoTracks } = (0, get_tracks_1.getTracksFromIsoBaseMedia)(state);
|
|
8
|
+
const { videoTracks } = (0, get_tracks_1.getTracksFromIsoBaseMedia)(state, true);
|
|
9
9
|
const structure = state.structure.getIsoStructure();
|
|
10
10
|
const moofBoxes = (0, traversal_1.getMoofBoxes)(structure.boxes);
|
|
11
11
|
const tfraBoxes = (0, traversal_1.getTfraBoxes)(structure);
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import type { SamplePosition } from '../../get-sample-positions';
|
|
2
|
-
import type {
|
|
2
|
+
import type { MoofBox } from '../../state/iso-base-media/precomputed-moof';
|
|
3
3
|
import type { TfraBox } from './mfra/tfra';
|
|
4
4
|
import type { TrakBox } from './trak/trak';
|
|
5
5
|
export declare const getSamplePositionsFromTrack: ({ trakBox, moofBoxes, tfraBoxes, }: {
|
|
6
6
|
trakBox: TrakBox;
|
|
7
|
-
moofBoxes:
|
|
7
|
+
moofBoxes: MoofBox[];
|
|
8
8
|
tfraBoxes: TfraBox[];
|
|
9
9
|
}) => {
|
|
10
10
|
samplePositions: SamplePosition[];
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { LogLevel } from '../../log';
|
|
2
|
+
import type { IsoBaseMediaStructure } from '../../parse-result';
|
|
3
|
+
import type { IsoBaseMediaSeekingHints } from '../../seeking-hints';
|
|
4
|
+
import type { IsoBaseMediaState } from '../../state/iso-base-media/iso-state';
|
|
5
|
+
import type { StructureState } from '../../state/structure';
|
|
6
|
+
import type { SeekResolution } from '../../work-on-seek-request';
|
|
7
|
+
export declare const getSeekingByteFromIsoBaseMedia: ({ info, time, logLevel, currentPosition, isoState, mp4HeaderSegment, structure, }: {
|
|
8
|
+
info: IsoBaseMediaSeekingHints;
|
|
9
|
+
time: number;
|
|
10
|
+
logLevel: LogLevel;
|
|
11
|
+
currentPosition: number;
|
|
12
|
+
isoState: IsoBaseMediaState;
|
|
13
|
+
mp4HeaderSegment: IsoBaseMediaStructure | null;
|
|
14
|
+
structure: StructureState;
|
|
15
|
+
}) => Promise<SeekResolution>;
|
|
@@ -10,13 +10,25 @@ const get_sample_position_bounds_1 = require("./get-sample-position-bounds");
|
|
|
10
10
|
const get_sample_positions_from_track_1 = require("./get-sample-positions-from-track");
|
|
11
11
|
const find_best_segment_from_tfra_1 = require("./mfra/find-best-segment-from-tfra");
|
|
12
12
|
const traversal_1 = require("./traversal");
|
|
13
|
-
const getSeekingByteFromIsoBaseMedia = async ({ info, time, logLevel, currentPosition, isoState, }) => {
|
|
13
|
+
const getSeekingByteFromIsoBaseMedia = async ({ info, time, logLevel, currentPosition, isoState, mp4HeaderSegment, structure, }) => {
|
|
14
14
|
const tracks = (0, get_tracks_1.getTracksFromMoovBox)(info.moovBox);
|
|
15
15
|
const allTracks = [
|
|
16
16
|
...tracks.videoTracks,
|
|
17
17
|
...tracks.audioTracks,
|
|
18
18
|
...tracks.otherTracks,
|
|
19
19
|
];
|
|
20
|
+
const hasMoov = Boolean((0, traversal_1.getMoovBoxFromState)({
|
|
21
|
+
mp4HeaderSegment,
|
|
22
|
+
structureState: structure,
|
|
23
|
+
isoState,
|
|
24
|
+
mayUsePrecomputed: false,
|
|
25
|
+
}));
|
|
26
|
+
if (!hasMoov) {
|
|
27
|
+
log_1.Log.trace(logLevel, 'No moov box found, must wait');
|
|
28
|
+
return {
|
|
29
|
+
type: 'valid-but-must-wait',
|
|
30
|
+
};
|
|
31
|
+
}
|
|
20
32
|
const firstVideoTrack = allTracks.find((t) => t.type === 'video');
|
|
21
33
|
if (!firstVideoTrack) {
|
|
22
34
|
throw new Error('No video track found');
|
|
@@ -52,7 +64,9 @@ const getSeekingByteFromIsoBaseMedia = async ({ info, time, logLevel, currentPos
|
|
|
52
64
|
}
|
|
53
65
|
}
|
|
54
66
|
}
|
|
55
|
-
const atom = await
|
|
67
|
+
const atom = await (info.mfraAlreadyLoaded
|
|
68
|
+
? Promise.resolve(info.mfraAlreadyLoaded)
|
|
69
|
+
: isoState.mfra.triggerLoad());
|
|
56
70
|
if (atom) {
|
|
57
71
|
const moofOffset = (0, find_best_segment_from_tfra_1.findBestSegmentFromTfra)({
|
|
58
72
|
mfra: atom,
|
|
@@ -22,13 +22,16 @@ const parseMdatSection = async (state) => {
|
|
|
22
22
|
if ((0, may_skip_video_data_1.maySkipVideoData)({ state })) {
|
|
23
23
|
return (0, skip_1.makeSkip)(endOfMdat);
|
|
24
24
|
}
|
|
25
|
-
const
|
|
26
|
-
if (!
|
|
25
|
+
const alreadyHasMoov = (0, get_tracks_1.getHasTracks)(state, true);
|
|
26
|
+
if (!alreadyHasMoov) {
|
|
27
27
|
const moov = await (0, get_moov_atom_1.getMoovAtom)({
|
|
28
28
|
endOfMdat,
|
|
29
29
|
state,
|
|
30
30
|
});
|
|
31
|
-
state.iso.moov.setMoovBox(
|
|
31
|
+
state.iso.moov.setMoovBox({
|
|
32
|
+
moovBox: moov,
|
|
33
|
+
precomputed: false,
|
|
34
|
+
});
|
|
32
35
|
state.callbacks.tracks.setIsDone(state.logLevel);
|
|
33
36
|
state.structure.getIsoStructure().boxes.push(moov);
|
|
34
37
|
return (0, exports.parseMdatSection)(state);
|
|
@@ -33,7 +33,7 @@ const tkhd_1 = require("./tkhd");
|
|
|
33
33
|
const trak_1 = require("./trak/trak");
|
|
34
34
|
const trun_1 = require("./trun");
|
|
35
35
|
const processBox = async ({ iterator, logLevel, onlyIfMoovAtomExpected, onlyIfMdatAtomExpected, }) => {
|
|
36
|
-
var _a;
|
|
36
|
+
var _a, _b;
|
|
37
37
|
const fileOffset = iterator.counter.getOffset();
|
|
38
38
|
const { returnToCheckpoint } = iterator.startCheckpoint();
|
|
39
39
|
const bytesRemaining = iterator.bytesRemaining();
|
|
@@ -179,7 +179,9 @@ const processBox = async ({ iterator, logLevel, onlyIfMoovAtomExpected, onlyIfMd
|
|
|
179
179
|
iterator.discard(boxSize - 8);
|
|
180
180
|
return null;
|
|
181
181
|
}
|
|
182
|
-
if (isoState &&
|
|
182
|
+
if (isoState &&
|
|
183
|
+
isoState.moov.getMoovBoxAndPrecomputed() &&
|
|
184
|
+
!((_a = isoState.moov.getMoovBoxAndPrecomputed()) === null || _a === void 0 ? void 0 : _a.precomputed)) {
|
|
183
185
|
log_1.Log.verbose(logLevel, 'Moov box already parsed, skipping');
|
|
184
186
|
iterator.discard(boxSize - 8);
|
|
185
187
|
return null;
|
|
@@ -276,7 +278,7 @@ const processBox = async ({ iterator, logLevel, onlyIfMoovAtomExpected, onlyIfMd
|
|
|
276
278
|
});
|
|
277
279
|
}
|
|
278
280
|
if (boxType === 'moof') {
|
|
279
|
-
(
|
|
281
|
+
(_b = onlyIfMoovAtomExpected === null || onlyIfMoovAtomExpected === void 0 ? void 0 : onlyIfMoovAtomExpected.isoState) === null || _b === void 0 ? void 0 : _b.mfra.triggerLoad();
|
|
280
282
|
}
|
|
281
283
|
if (boxType === 'mdia' ||
|
|
282
284
|
boxType === 'minf' ||
|
package/dist/containers/iso-base-media/{get-seeking-info-from-mp4.d.ts → seeking-hints.d.ts}
RENAMED
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
import type { IsoBaseMediaStructure } from '../../parse-result';
|
|
2
|
-
import type {
|
|
2
|
+
import type { IsoBaseMediaSeekingHints } from '../../seeking-hints';
|
|
3
3
|
import type { IsoBaseMediaState } from '../../state/iso-base-media/iso-state';
|
|
4
|
+
import type { ParserState } from '../../state/parser-state';
|
|
4
5
|
import type { StructureState } from '../../state/structure';
|
|
5
6
|
import type { MediaSectionState } from '../../state/video-section';
|
|
6
|
-
export declare const
|
|
7
|
+
export declare const getSeekingHintsFromMp4: ({ structureState, isoState, mp4HeaderSegment, mediaSectionState, }: {
|
|
7
8
|
structureState: StructureState;
|
|
8
9
|
isoState: IsoBaseMediaState;
|
|
9
10
|
mp4HeaderSegment: IsoBaseMediaStructure | null;
|
|
10
11
|
mediaSectionState: MediaSectionState;
|
|
11
|
-
}) =>
|
|
12
|
+
}) => IsoBaseMediaSeekingHints | null;
|
|
13
|
+
export declare const setSeekingHintsForMp4: ({ hints, state, }: {
|
|
14
|
+
hints: IsoBaseMediaSeekingHints;
|
|
15
|
+
state: ParserState;
|
|
16
|
+
}) => void;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.setSeekingHintsForMp4 = exports.getSeekingHintsFromMp4 = void 0;
|
|
4
|
+
const precomputed_moof_1 = require("../../state/iso-base-media/precomputed-moof");
|
|
5
|
+
const precomputed_tfra_1 = require("../../state/iso-base-media/precomputed-tfra");
|
|
6
|
+
const traversal_1 = require("./traversal");
|
|
7
|
+
const getSeekingHintsFromMp4 = ({ structureState, isoState, mp4HeaderSegment, mediaSectionState, }) => {
|
|
8
|
+
const structure = structureState.getIsoStructure();
|
|
9
|
+
const moovAtom = (0, traversal_1.getMoovBoxFromState)({
|
|
10
|
+
isoState,
|
|
11
|
+
mp4HeaderSegment,
|
|
12
|
+
structureState,
|
|
13
|
+
mayUsePrecomputed: true,
|
|
14
|
+
});
|
|
15
|
+
const moofBoxes = (0, precomputed_moof_1.deduplicateMoofBoxesByOffset)([
|
|
16
|
+
...isoState.moof.getMoofBoxes(),
|
|
17
|
+
...(0, traversal_1.getMoofBoxes)(structure.boxes),
|
|
18
|
+
]);
|
|
19
|
+
const tfraBoxes = (0, precomputed_tfra_1.deduplicateTfraBoxesByOffset)([
|
|
20
|
+
...isoState.tfra.getTfraBoxes(),
|
|
21
|
+
...(0, traversal_1.getTfraBoxes)(structure),
|
|
22
|
+
]);
|
|
23
|
+
if (!moovAtom) {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
return {
|
|
27
|
+
type: 'iso-base-media-seeking-hints',
|
|
28
|
+
moovBox: moovAtom,
|
|
29
|
+
moofBoxes,
|
|
30
|
+
tfraBoxes,
|
|
31
|
+
mediaSections: mediaSectionState.getMediaSections(),
|
|
32
|
+
mfraAlreadyLoaded: isoState.mfra.getIfAlreadyLoaded(),
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
exports.getSeekingHintsFromMp4 = getSeekingHintsFromMp4;
|
|
36
|
+
const setSeekingHintsForMp4 = ({ hints, state, }) => {
|
|
37
|
+
state.iso.moov.setMoovBox({
|
|
38
|
+
moovBox: hints.moovBox,
|
|
39
|
+
precomputed: true,
|
|
40
|
+
});
|
|
41
|
+
// state.iso.mfra.setFromSeekingHints(hints);
|
|
42
|
+
// state.iso.moof.setMoofBoxes(hints.moofBoxes);
|
|
43
|
+
// TODO: Make use of these seeking hints and make tests pass
|
|
44
|
+
/*
|
|
45
|
+
// state.iso.tfra.setTfraBoxes(hints.tfraBoxes);
|
|
46
|
+
|
|
47
|
+
for (const mediaSection of hints.mediaSections) {
|
|
48
|
+
// state.mediaSection.addMediaSection(mediaSection);
|
|
49
|
+
}
|
|
50
|
+
*/
|
|
51
|
+
};
|
|
52
|
+
exports.setSeekingHintsForMp4 = setSeekingHintsForMp4;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { AnySegment, IsoBaseMediaStructure } from '../../parse-result';
|
|
2
2
|
import type { IsoBaseMediaState } from '../../state/iso-base-media/iso-state';
|
|
3
|
+
import type { MoofBox } from '../../state/iso-base-media/precomputed-moof';
|
|
3
4
|
import type { StructureState } from '../../state/structure';
|
|
4
5
|
import type { IsoBaseMediaBox, RegularBox } from './base-media-box';
|
|
5
6
|
import type { FtypBox } from './ftyp';
|
|
@@ -21,12 +22,13 @@ import type { TrakBox } from './trak/trak';
|
|
|
21
22
|
import type { TrunBox } from './trun';
|
|
22
23
|
export declare const getFtypBox: (segments: AnySegment[]) => FtypBox | null;
|
|
23
24
|
export declare const getMoovFromFromIsoStructure: (structure: IsoBaseMediaStructure) => MoovBox | null;
|
|
24
|
-
export declare const getMoovBoxFromState: ({ structureState, isoState, mp4HeaderSegment, }: {
|
|
25
|
+
export declare const getMoovBoxFromState: ({ structureState, isoState, mp4HeaderSegment, mayUsePrecomputed, }: {
|
|
25
26
|
structureState: StructureState;
|
|
26
27
|
isoState: IsoBaseMediaState;
|
|
27
28
|
mp4HeaderSegment: IsoBaseMediaStructure | null;
|
|
29
|
+
mayUsePrecomputed: boolean;
|
|
28
30
|
}) => MoovBox | null;
|
|
29
|
-
export declare const getMoofBoxes: (main: AnySegment[]) =>
|
|
31
|
+
export declare const getMoofBoxes: (main: AnySegment[]) => MoofBox[];
|
|
30
32
|
export declare const getMvhdBox: (moovBox: MoovBox) => MvhdBox | null;
|
|
31
33
|
export declare const getTraks: (moovBox: MoovBox) => TrakBox[];
|
|
32
34
|
export declare const getTkhdBox: (trakBox: TrakBox) => TkhdBox | null;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.getTfraBoxes = exports.getTrunBoxes = exports.getTfhdBox = exports.getTfdtBox = exports.getStssBox = exports.getStscBox = exports.getStszBox = exports.getCttsBox = exports.getSttsBox = exports.getStcoBox = exports.getVideoDescriptors = exports.getStsdBox = exports.getStblBox = exports.getMdhdBox = exports.getMdiaBox = exports.getTkhdBox = exports.getTraks = exports.getMvhdBox = exports.getMoofBoxes = exports.getMoovBoxFromState = exports.getMoovFromFromIsoStructure = exports.getFtypBox = void 0;
|
|
4
|
+
const precomputed_moof_1 = require("../../state/iso-base-media/precomputed-moof");
|
|
4
5
|
const getFtypBox = (segments) => {
|
|
5
6
|
const ftypBox = segments.find((s) => s.type === 'ftyp-box');
|
|
6
7
|
if (!ftypBox || ftypBox.type !== 'ftyp-box') {
|
|
@@ -17,10 +18,10 @@ const getMoovFromFromIsoStructure = (structure) => {
|
|
|
17
18
|
return moovBox;
|
|
18
19
|
};
|
|
19
20
|
exports.getMoovFromFromIsoStructure = getMoovFromFromIsoStructure;
|
|
20
|
-
const getMoovBoxFromState = ({ structureState, isoState, mp4HeaderSegment, }) => {
|
|
21
|
-
const got = isoState.moov.
|
|
22
|
-
if (got) {
|
|
23
|
-
return got;
|
|
21
|
+
const getMoovBoxFromState = ({ structureState, isoState, mp4HeaderSegment, mayUsePrecomputed, }) => {
|
|
22
|
+
const got = isoState.moov.getMoovBoxAndPrecomputed();
|
|
23
|
+
if (got && (mayUsePrecomputed || !got.precomputed)) {
|
|
24
|
+
return got.moovBox;
|
|
24
25
|
}
|
|
25
26
|
if (mp4HeaderSegment) {
|
|
26
27
|
return (0, exports.getMoovFromFromIsoStructure)(mp4HeaderSegment);
|
|
@@ -31,7 +32,7 @@ const getMoovBoxFromState = ({ structureState, isoState, mp4HeaderSegment, }) =>
|
|
|
31
32
|
exports.getMoovBoxFromState = getMoovBoxFromState;
|
|
32
33
|
const getMoofBoxes = (main) => {
|
|
33
34
|
const moofBoxes = main.filter((s) => s.type === 'regular-box' && s.boxType === 'moof');
|
|
34
|
-
return moofBoxes;
|
|
35
|
+
return moofBoxes.map((m) => (0, precomputed_moof_1.toMoofBox)(m));
|
|
35
36
|
};
|
|
36
37
|
exports.getMoofBoxes = getMoofBoxes;
|
|
37
38
|
const getMvhdBox = (moovBox) => {
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.iteratorOverSegmentFiles = void 0;
|
|
4
4
|
const media_parser_controller_1 = require("../../controller/media-parser-controller");
|
|
5
|
-
const
|
|
5
|
+
const forward_controller_pause_resume_abort_1 = require("../../forward-controller-pause-resume-abort");
|
|
6
6
|
const parse_media_1 = require("../../parse-media");
|
|
7
7
|
const with_resolvers_1 = require("../../with-resolvers");
|
|
8
8
|
const get_chunks_1 = require("./get-chunks");
|
|
@@ -13,26 +13,29 @@ const iteratorOverSegmentFiles = async ({ structure, onVideoTrack, m3uState, onA
|
|
|
13
13
|
let resolver = onInitialProgress;
|
|
14
14
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
15
15
|
let rejector = (_e) => { };
|
|
16
|
-
const childController = (0, media_parser_controller_1.mediaParserController)();
|
|
17
|
-
const forwarded = (0, forward_controller_1.forwardMediaParserController)({
|
|
18
|
-
childController,
|
|
19
|
-
parentController,
|
|
20
|
-
});
|
|
21
|
-
const makeContinuationFn = () => {
|
|
22
|
-
return {
|
|
23
|
-
continue() {
|
|
24
|
-
const { promise, reject, resolve } = (0, with_resolvers_1.withResolvers)();
|
|
25
|
-
resolver = resolve;
|
|
26
|
-
rejector = reject;
|
|
27
|
-
childController.resume();
|
|
28
|
-
return promise;
|
|
29
|
-
},
|
|
30
|
-
abort() {
|
|
31
|
-
childController.abort();
|
|
32
|
-
},
|
|
33
|
-
};
|
|
34
|
-
};
|
|
35
16
|
for (const chunk of chunks) {
|
|
17
|
+
resolver = onInitialProgress;
|
|
18
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
19
|
+
rejector = (_e) => { };
|
|
20
|
+
const childController = (0, media_parser_controller_1.mediaParserController)();
|
|
21
|
+
const forwarded = (0, forward_controller_pause_resume_abort_1.forwardMediaParserControllerPauseResume)({
|
|
22
|
+
childController,
|
|
23
|
+
parentController,
|
|
24
|
+
});
|
|
25
|
+
const makeContinuationFn = () => {
|
|
26
|
+
return {
|
|
27
|
+
continue() {
|
|
28
|
+
const { promise, reject, resolve } = (0, with_resolvers_1.withResolvers)();
|
|
29
|
+
resolver = resolve;
|
|
30
|
+
rejector = reject;
|
|
31
|
+
childController.resume();
|
|
32
|
+
return promise;
|
|
33
|
+
},
|
|
34
|
+
abort() {
|
|
35
|
+
childController.abort();
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
};
|
|
36
39
|
const isLastChunk = chunk === chunks[chunks.length - 1];
|
|
37
40
|
await childController._internals.checkForAbortAndPause();
|
|
38
41
|
const src = readerInterface.createAdjacentFileSource(chunk.url, playlistUrl);
|
|
@@ -8,7 +8,7 @@ const parseMediaSection = async (state) => {
|
|
|
8
8
|
await (0, parse_movi_1.parseMovi)({
|
|
9
9
|
state,
|
|
10
10
|
});
|
|
11
|
-
const tracks = (0, get_tracks_1.getTracks)(state);
|
|
11
|
+
const tracks = (0, get_tracks_1.getTracks)(state, false);
|
|
12
12
|
if (!tracks.videoTracks.some((t) => t.codec === get_tracks_from_avi_1.TO_BE_OVERRIDDEN_LATER) &&
|
|
13
13
|
!state.callbacks.tracks.getIsDone()) {
|
|
14
14
|
state.callbacks.tracks.setIsDone(state.logLevel);
|
|
@@ -21,7 +21,10 @@ const handleAacPacket = async ({ streamBuffer, programId, offset, sampleCallback
|
|
|
21
21
|
const startOffset = makeSamplesStartAtZero
|
|
22
22
|
? Math.min(streamBuffer.pesHeader.pts, (_a = streamBuffer.pesHeader.dts) !== null && _a !== void 0 ? _a : Infinity)
|
|
23
23
|
: 0;
|
|
24
|
-
transportStream.startOffset.setOffset(
|
|
24
|
+
transportStream.startOffset.setOffset({
|
|
25
|
+
trackId: programId,
|
|
26
|
+
newOffset: startOffset,
|
|
27
|
+
});
|
|
25
28
|
const track = {
|
|
26
29
|
type: 'audio',
|
|
27
30
|
codecPrivate,
|
|
@@ -24,7 +24,10 @@ const handleAvcPacket = async ({ streamBuffer, programId, offset, sampleCallback
|
|
|
24
24
|
const startOffset = makeSamplesStartAtZero
|
|
25
25
|
? Math.min(streamBuffer.pesHeader.pts, (_a = streamBuffer.pesHeader.dts) !== null && _a !== void 0 ? _a : Infinity)
|
|
26
26
|
: 0;
|
|
27
|
-
transportStream.startOffset.setOffset(
|
|
27
|
+
transportStream.startOffset.setOffset({
|
|
28
|
+
trackId: programId,
|
|
29
|
+
newOffset: startOffset,
|
|
30
|
+
});
|
|
28
31
|
const track = {
|
|
29
32
|
m3uStreamFormat: null,
|
|
30
33
|
rotation: 0,
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { TransportStreamSeekingHints } from '../../seeking-hints';
|
|
2
|
+
import type { TracksState } from '../../state/has-tracks-section';
|
|
3
|
+
import type { ParserState } from '../../state/parser-state';
|
|
4
|
+
import type { TransportStreamState } from '../../state/transport-stream/transport-stream';
|
|
5
|
+
export declare const getSeekingHintsFromTransportStream: (transportStream: TransportStreamState, tracksState: TracksState) => TransportStreamSeekingHints | null;
|
|
6
|
+
export declare const setSeekingHintsForTransportStream: ({ hints, state, }: {
|
|
7
|
+
hints: TransportStreamSeekingHints;
|
|
8
|
+
state: ParserState;
|
|
9
|
+
}) => void;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.setSeekingHintsForTransportStream = exports.getSeekingHintsFromTransportStream = void 0;
|
|
4
|
+
const getSeekingHintsFromTransportStream = (transportStream, tracksState) => {
|
|
5
|
+
const firstVideoTrack = tracksState
|
|
6
|
+
.getTracks()
|
|
7
|
+
.find((t) => t.type === 'video');
|
|
8
|
+
if (!firstVideoTrack) {
|
|
9
|
+
return null;
|
|
10
|
+
}
|
|
11
|
+
return {
|
|
12
|
+
type: 'transport-stream-seeking-hints',
|
|
13
|
+
observedPesHeaders: transportStream.observedPesHeaders.getPesKeyframeHeaders(),
|
|
14
|
+
ptsStartOffset: transportStream.startOffset.getOffset(firstVideoTrack.trackId),
|
|
15
|
+
firstVideoTrackId: firstVideoTrack.trackId,
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
exports.getSeekingHintsFromTransportStream = getSeekingHintsFromTransportStream;
|
|
19
|
+
const setSeekingHintsForTransportStream = ({ hints, state, }) => {
|
|
20
|
+
state.transportStream.observedPesHeaders.setPesKeyframesFromSeekingHints(hints);
|
|
21
|
+
state.transportStream.startOffset.setOffset({
|
|
22
|
+
trackId: hints.firstVideoTrackId,
|
|
23
|
+
newOffset: hints.ptsStartOffset,
|
|
24
|
+
});
|
|
25
|
+
};
|
|
26
|
+
exports.setSeekingHintsForTransportStream = setSeekingHintsForTransportStream;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { WavSeekingHints } from '../../seeking-hints';
|
|
2
2
|
import type { SeekResolution } from '../../work-on-seek-request';
|
|
3
3
|
export declare const WAVE_SAMPLES_PER_SECOND = 25;
|
|
4
4
|
export declare const getSeekingByteFromWav: ({ info, time, }: {
|
|
5
|
-
info:
|
|
5
|
+
info: WavSeekingHints;
|
|
6
6
|
time: number;
|
|
7
7
|
}) => Promise<SeekResolution>;
|
|
@@ -4,12 +4,12 @@ exports.getSeekingByteFromWav = exports.WAVE_SAMPLES_PER_SECOND = void 0;
|
|
|
4
4
|
exports.WAVE_SAMPLES_PER_SECOND = 25;
|
|
5
5
|
const getSeekingByteFromWav = ({ info, time, }) => {
|
|
6
6
|
const bytesPerSecond = info.sampleRate * info.blockAlign;
|
|
7
|
-
const durationInSeconds = info.
|
|
7
|
+
const durationInSeconds = info.mediaSection.size / bytesPerSecond;
|
|
8
8
|
const timeRoundedDown = Math.floor(Math.min(time, durationInSeconds - 0.0000001) * exports.WAVE_SAMPLES_PER_SECOND) / exports.WAVE_SAMPLES_PER_SECOND;
|
|
9
9
|
const byteOffset = bytesPerSecond * timeRoundedDown;
|
|
10
10
|
return Promise.resolve({
|
|
11
11
|
type: 'do-seek',
|
|
12
|
-
byte: byteOffset + info.
|
|
12
|
+
byte: byteOffset + info.mediaSection.start,
|
|
13
13
|
});
|
|
14
14
|
};
|
|
15
15
|
exports.getSeekingByteFromWav = getSeekingByteFromWav;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { WavSeekingHints } from '../../seeking-hints';
|
|
2
|
+
import type { ParserState } from '../../state/parser-state';
|
|
3
|
+
import type { MediaSectionState } from '../../state/video-section';
|
|
4
|
+
import type { WavStructure } from './types';
|
|
5
|
+
export declare const getSeekingHintsFromWav: ({ structure, mediaSectionState, }: {
|
|
6
|
+
structure: WavStructure;
|
|
7
|
+
mediaSectionState: MediaSectionState;
|
|
8
|
+
}) => WavSeekingHints | null;
|
|
9
|
+
export declare const setSeekingHintsForWav: ({ hints, state, }: {
|
|
10
|
+
hints: WavSeekingHints;
|
|
11
|
+
state: ParserState;
|
|
12
|
+
}) => void;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.setSeekingHintsForWav = exports.getSeekingHintsFromWav = void 0;
|
|
4
|
+
const getSeekingHintsFromWav = ({ structure, mediaSectionState, }) => {
|
|
5
|
+
const fmtBox = structure.boxes.find((box) => box.type === 'wav-fmt');
|
|
6
|
+
if (!fmtBox) {
|
|
7
|
+
return null;
|
|
8
|
+
}
|
|
9
|
+
const mediaSection = mediaSectionState.getMediaSections();
|
|
10
|
+
if (mediaSection.length !== 1) {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
return {
|
|
14
|
+
type: 'wav-seeking-hints',
|
|
15
|
+
sampleRate: fmtBox.sampleRate,
|
|
16
|
+
blockAlign: fmtBox.blockAlign,
|
|
17
|
+
mediaSection: mediaSection[0],
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
exports.getSeekingHintsFromWav = getSeekingHintsFromWav;
|
|
21
|
+
const setSeekingHintsForWav = ({ hints, state, }) => {
|
|
22
|
+
// abstaining from setting fmt box, usually it is at the very beginning
|
|
23
|
+
state.mediaSection.addMediaSection(hints.mediaSection);
|
|
24
|
+
};
|
|
25
|
+
exports.setSeekingHintsForWav = setSeekingHintsForWav;
|
|
@@ -1,14 +1,12 @@
|
|
|
1
1
|
import type { LogLevel } from '../../../log';
|
|
2
|
-
import type {
|
|
3
|
-
import type { KeyframesState } from '../../../state/keyframes';
|
|
2
|
+
import type { WebmSeekingHints } from '../../../seeking-hints';
|
|
4
3
|
import type { WebmState } from '../../../state/matroska/webm';
|
|
5
4
|
import type { MediaSectionState } from '../../../state/video-section';
|
|
6
5
|
import type { SeekResolution } from '../../../work-on-seek-request';
|
|
7
|
-
export declare const getSeekingByteFromMatroska: ({ time, webmState, info, logLevel, mediaSection,
|
|
6
|
+
export declare const getSeekingByteFromMatroska: ({ time, webmState, info, logLevel, mediaSection, }: {
|
|
8
7
|
time: number;
|
|
9
8
|
webmState: WebmState;
|
|
10
|
-
info:
|
|
9
|
+
info: WebmSeekingHints;
|
|
11
10
|
logLevel: LogLevel;
|
|
12
11
|
mediaSection: MediaSectionState;
|
|
13
|
-
keyframes: KeyframesState;
|
|
14
12
|
}) => Promise<SeekResolution>;
|
|
@@ -48,18 +48,18 @@ const getByteFromCues = ({ cuesResponse, time, info, logLevel, }) => {
|
|
|
48
48
|
}
|
|
49
49
|
return biggestCueBeforeTime.clusterPositionInSegment + segmentOffset;
|
|
50
50
|
};
|
|
51
|
-
const getSeekingByteFromMatroska = async ({ time, webmState, info, logLevel, mediaSection,
|
|
52
|
-
var _a, _b;
|
|
51
|
+
const getSeekingByteFromMatroska = async ({ time, webmState, info, logLevel, mediaSection, }) => {
|
|
52
|
+
var _a, _b, _c;
|
|
53
53
|
if (!info.track) {
|
|
54
54
|
log_1.Log.trace(logLevel, 'No video track found, cannot seek yet');
|
|
55
55
|
return {
|
|
56
56
|
type: 'valid-but-must-wait',
|
|
57
57
|
};
|
|
58
58
|
}
|
|
59
|
-
const cuesResponse = (await webmState.cues.getLoadedCues());
|
|
59
|
+
const cuesResponse = (_a = info.loadedCues) !== null && _a !== void 0 ? _a : (await webmState.cues.getLoadedCues());
|
|
60
60
|
// Check if we have already read keyframes
|
|
61
61
|
const byteFromObservedKeyframe = findKeyframeBeforeTime({
|
|
62
|
-
keyframes: keyframes
|
|
62
|
+
keyframes: info.keyframes,
|
|
63
63
|
time,
|
|
64
64
|
});
|
|
65
65
|
// Check if we have `Cues`
|
|
@@ -70,7 +70,7 @@ const getSeekingByteFromMatroska = async ({ time, webmState, info, logLevel, med
|
|
|
70
70
|
logLevel,
|
|
71
71
|
});
|
|
72
72
|
// Fallback: back to the beginning
|
|
73
|
-
const byteFromFirstMediaSection = (
|
|
73
|
+
const byteFromFirstMediaSection = (_c = (_b = webmState.getFirstCluster()) === null || _b === void 0 ? void 0 : _b.start) !== null && _c !== void 0 ? _c : null;
|
|
74
74
|
// Optimization possibility for later:
|
|
75
75
|
// Don't seek back, if the last seen time is smaller than the time we want to seek to
|
|
76
76
|
const seekPossibilities = [
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { WebmSeekingHints } from '../../../seeking-hints';
|
|
2
|
+
import type { TracksState } from '../../../state/has-tracks-section';
|
|
3
|
+
import type { KeyframesState } from '../../../state/keyframes';
|
|
4
|
+
import type { WebmState } from '../../../state/matroska/webm';
|
|
5
|
+
import type { ParserState } from '../../../state/parser-state';
|
|
6
|
+
export declare const getSeekingHintsFromMatroska: (tracksState: TracksState, keyframesState: KeyframesState, webmState: WebmState) => WebmSeekingHints;
|
|
7
|
+
export declare const setSeekingHintsForWebm: ({ hints, state, }: {
|
|
8
|
+
hints: WebmSeekingHints;
|
|
9
|
+
state: ParserState;
|
|
10
|
+
}) => void;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.setSeekingHintsForWebm = exports.getSeekingHintsFromMatroska = void 0;
|
|
4
|
+
const getSeekingHintsFromMatroska = (tracksState, keyframesState, webmState) => {
|
|
5
|
+
const tracks = tracksState.getTracks();
|
|
6
|
+
const firstVideoTrack = tracks.find((track) => track.type === 'video');
|
|
7
|
+
const keyframes = keyframesState.getKeyframes();
|
|
8
|
+
const loadedCues = webmState.cues.getIfAlreadyLoaded();
|
|
9
|
+
return {
|
|
10
|
+
type: 'webm-seeking-hints',
|
|
11
|
+
track: firstVideoTrack
|
|
12
|
+
? {
|
|
13
|
+
timescale: firstVideoTrack.timescale,
|
|
14
|
+
trackId: firstVideoTrack.trackId,
|
|
15
|
+
}
|
|
16
|
+
: null,
|
|
17
|
+
keyframes,
|
|
18
|
+
loadedCues,
|
|
19
|
+
timestampMap: webmState.getTimeStampMapForSeekingHints(),
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
exports.getSeekingHintsFromMatroska = getSeekingHintsFromMatroska;
|
|
23
|
+
const setSeekingHintsForWebm = ({ hints, state, }) => {
|
|
24
|
+
state.webm.cues.setFromSeekingHints(hints);
|
|
25
|
+
state.keyframes.setFromSeekingHints(hints);
|
|
26
|
+
state.webm.setTimeStampMapForSeekingHints(hints.timestampMap);
|
|
27
|
+
};
|
|
28
|
+
exports.setSeekingHintsForWebm = setSeekingHintsForWebm;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { SeekingHints } from '../seeking-hints';
|
|
1
2
|
import { MediaParserEmitter } from './emitter';
|
|
2
3
|
import type { PauseSignal } from './pause-signal';
|
|
3
4
|
import type { PerformedSeeksSignal } from './performed-seeks-stats';
|
|
@@ -9,6 +10,7 @@ export type MediaParserController = {
|
|
|
9
10
|
_experimentalSeek: SeekSignal['seek'];
|
|
10
11
|
addEventListener: MediaParserEmitter['addEventListener'];
|
|
11
12
|
removeEventListener: MediaParserEmitter['removeEventListener'];
|
|
13
|
+
getSeekingHints: () => Promise<SeekingHints | null>;
|
|
12
14
|
/**
|
|
13
15
|
* @deprecated Not public API
|
|
14
16
|
*/
|
|
@@ -18,6 +20,7 @@ export type MediaParserController = {
|
|
|
18
20
|
seekSignal: SeekSignal;
|
|
19
21
|
markAsReadyToEmitEvents: () => void;
|
|
20
22
|
performedSeeksSignal: PerformedSeeksSignal;
|
|
23
|
+
attachSeekingHintResolution: (callback: () => Promise<SeekingHints | null>) => void;
|
|
21
24
|
};
|
|
22
25
|
};
|
|
23
26
|
export declare const mediaParserController: () => MediaParserController;
|