@remotion/media-parser 4.0.286 → 4.0.288
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/flac/get-seeking-byte.d.ts +6 -0
- package/dist/containers/flac/get-seeking-byte.js +26 -0
- package/dist/containers/flac/parse-meta.d.ts +6 -0
- package/dist/containers/flac/parse-meta.js +31 -0
- package/dist/containers/flac/seeking-hints.d.ts +15 -0
- package/dist/containers/flac/seeking-hints.js +19 -0
- 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/collect-sample-positions-from-trak.js +7 -5
- 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 +13 -5
- package/dist/containers/iso-base-media/mdat/postprocess-bytes.d.ts +5 -0
- package/dist/containers/iso-base-media/mdat/postprocess-bytes.js +25 -0
- 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 +53 -0
- package/dist/containers/iso-base-media/should-group-audio-samples.d.ts +6 -0
- package/dist/containers/iso-base-media/should-group-audio-samples.js +16 -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 +491 -208
- 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 +527 -215
- package/dist/esm/worker-web-entry.mjs +526 -213
- 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.d.ts +1 -0
- package/dist/get-audio-codec.js +15 -4
- 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-sample-positions-from-mp4.d.ts +4 -1
- package/dist/get-sample-positions-from-mp4.js +3 -1
- package/dist/get-sample-positions.d.ts +2 -0
- package/dist/get-sample-positions.js +2 -0
- 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 +7 -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/audio-sample-map.d.ts +11 -0
- package/dist/state/audio-sample-map.js +21 -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
|
@@ -3,13 +3,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.internalParseMedia = void 0;
|
|
4
4
|
const media_parser_controller_1 = require("./controller/media-parser-controller");
|
|
5
5
|
const emit_all_info_1 = require("./emit-all-info");
|
|
6
|
+
const get_seeking_hints_1 = require("./get-seeking-hints");
|
|
6
7
|
const log_1 = require("./log");
|
|
7
8
|
const parse_loop_1 = require("./parse-loop");
|
|
8
9
|
const print_timings_1 = require("./print-timings");
|
|
9
10
|
const remotion_license_acknowledge_1 = require("./remotion-license-acknowledge");
|
|
11
|
+
const set_seeking_hints_1 = require("./set-seeking-hints");
|
|
10
12
|
const parser_state_1 = require("./state/parser-state");
|
|
11
13
|
const throttled_progress_1 = require("./throttled-progress");
|
|
12
|
-
const internalParseMedia = async function ({ src, fields: _fieldsInReturnValue, reader: readerInterface, onAudioTrack, onVideoTrack, controller = (0, media_parser_controller_1.mediaParserController)(), logLevel, onParseProgress: onParseProgressDoNotCallDirectly, progressIntervalInMs, mode, onDiscardedData, onError, acknowledgeRemotionLicense, apiName, selectM3uStream: selectM3uStreamFn, selectM3uAssociatedPlaylists: selectM3uAssociatedPlaylistsFn, mp4HeaderSegment, makeSamplesStartAtZero, ...more }) {
|
|
14
|
+
const internalParseMedia = async function ({ src, fields: _fieldsInReturnValue, reader: readerInterface, onAudioTrack, onVideoTrack, controller = (0, media_parser_controller_1.mediaParserController)(), logLevel, onParseProgress: onParseProgressDoNotCallDirectly, progressIntervalInMs, mode, onDiscardedData, onError, acknowledgeRemotionLicense, apiName, selectM3uStream: selectM3uStreamFn, selectM3uAssociatedPlaylists: selectM3uAssociatedPlaylistsFn, mp4HeaderSegment, makeSamplesStartAtZero, seekingHints, ...more }) {
|
|
13
15
|
var _a;
|
|
14
16
|
controller._internals.markAsReadyToEmitEvents();
|
|
15
17
|
(0, remotion_license_acknowledge_1.warnIfRemotionLicenseNotAcknowledged)({
|
|
@@ -50,6 +52,19 @@ const internalParseMedia = async function ({ src, fields: _fieldsInReturnValue,
|
|
|
50
52
|
initialReaderInstance: readerInstance,
|
|
51
53
|
makeSamplesStartAtZero,
|
|
52
54
|
});
|
|
55
|
+
if (seekingHints) {
|
|
56
|
+
(0, set_seeking_hints_1.setSeekingHints)({ hints: seekingHints, state });
|
|
57
|
+
}
|
|
58
|
+
controller._internals.attachSeekingHintResolution(() => Promise.resolve((0, get_seeking_hints_1.getSeekingHints)({
|
|
59
|
+
tracksState: state.callbacks.tracks,
|
|
60
|
+
keyframesState: state.keyframes,
|
|
61
|
+
webmState: state.webm,
|
|
62
|
+
structureState: state.structure,
|
|
63
|
+
mp4HeaderSegment: state.mp4HeaderSegment,
|
|
64
|
+
mediaSectionState: state.mediaSection,
|
|
65
|
+
isoState: state.iso,
|
|
66
|
+
transportStream: state.transportStream,
|
|
67
|
+
})));
|
|
53
68
|
if (!hasAudioTrackHandlers &&
|
|
54
69
|
!hasVideoTrackHandlers &&
|
|
55
70
|
Object.values(state.fields).every((v) => !v) &&
|
|
@@ -4,6 +4,7 @@ exports.getArrayBufferIterator = void 0;
|
|
|
4
4
|
/* eslint-disable @typescript-eslint/no-use-before-define */
|
|
5
5
|
const all_segments_1 = require("../containers/webm/segments/all-segments");
|
|
6
6
|
const file_types_1 = require("../file-types");
|
|
7
|
+
const log_1 = require("../log");
|
|
7
8
|
const buffer_manager_1 = require("./buffer-manager");
|
|
8
9
|
const offset_counter_1 = require("./offset-counter");
|
|
9
10
|
const getArrayBufferIterator = (initialData, maxBytes) => {
|
|
@@ -174,13 +175,11 @@ const getArrayBufferIterator = (initialData, maxBytes) => {
|
|
|
174
175
|
return (1 << zerosCount) - 1 + suffix;
|
|
175
176
|
};
|
|
176
177
|
const peekB = (length) => {
|
|
177
|
-
|
|
178
|
-
console.log([...getSlice(length)].map((b) => b.toString(16).padStart(2, '0')));
|
|
178
|
+
log_1.Log.info('info', [...getSlice(length)].map((b) => b.toString(16).padStart(2, '0')));
|
|
179
179
|
counter.decrement(length);
|
|
180
180
|
};
|
|
181
181
|
const peekD = (length) => {
|
|
182
|
-
|
|
183
|
-
console.log([...getSlice(length)].map((b) => b));
|
|
182
|
+
log_1.Log.info('info', [...getSlice(length)].map((b) => b.toString(16).padStart(2, '0')));
|
|
184
183
|
counter.decrement(length);
|
|
185
184
|
};
|
|
186
185
|
const leb128 = () => {
|
package/dist/options.d.ts
CHANGED
|
@@ -9,6 +9,7 @@ import type { LogLevel } from './log';
|
|
|
9
9
|
import type { MediaParserMetadataEntry } from './metadata/get-metadata';
|
|
10
10
|
import type { IsoBaseMediaStructure, MediaParserStructureUnstable } from './parse-result';
|
|
11
11
|
import type { ReaderInterface } from './readers/reader';
|
|
12
|
+
import type { SeekingHints } from './seeking-hints';
|
|
12
13
|
import type { MediaParserEmbeddedImage } from './state/images';
|
|
13
14
|
import type { InternalStats } from './state/parser-state';
|
|
14
15
|
import type { OnAudioTrack, OnVideoTrack } from './webcodec-sample-types';
|
|
@@ -136,6 +137,7 @@ export type SerializeableOptionalParseMediaParams<F extends Options<ParseMediaFi
|
|
|
136
137
|
acknowledgeRemotionLicense: boolean;
|
|
137
138
|
mp4HeaderSegment: IsoBaseMediaStructure | null;
|
|
138
139
|
makeSamplesStartAtZero: boolean;
|
|
140
|
+
seekingHints: SeekingHints | null;
|
|
139
141
|
};
|
|
140
142
|
type OptionalParseMediaParams<F extends Options<ParseMediaFields>> = SerializeableOptionalParseMediaParams<F> & {
|
|
141
143
|
controller: MediaParserController | undefined;
|
|
@@ -54,6 +54,7 @@ const parseMediaOnWorkerImplementation = async ({ controller, reader, ...params
|
|
|
54
54
|
throw new Error(`\`reader\` should not be provided to \`${apiName}\`. If you want to use it in the browser, use parseMediaOnWorker(). If you also want to read files from the file system, use parseMediaOnServerWorker().`);
|
|
55
55
|
}
|
|
56
56
|
post(worker, convertToWorkerPayload(params));
|
|
57
|
+
let workerTerminated = false;
|
|
57
58
|
const { promise, resolve, reject } = (0, with_resolvers_1.withResolvers)();
|
|
58
59
|
const onAbort = () => {
|
|
59
60
|
post(worker, { type: 'request-abort' });
|
|
@@ -68,16 +69,54 @@ const parseMediaOnWorkerImplementation = async ({ controller, reader, ...params
|
|
|
68
69
|
post(worker, { type: 'request-seek', payload: seek });
|
|
69
70
|
controller === null || controller === void 0 ? void 0 : controller._internals.seekSignal.clearSeekIfStillSame(seek);
|
|
70
71
|
};
|
|
72
|
+
const seekingHintPromises = [];
|
|
73
|
+
let finalSeekingHints = null;
|
|
74
|
+
controller === null || controller === void 0 ? void 0 : controller._internals.attachSeekingHintResolution(() => {
|
|
75
|
+
if (finalSeekingHints) {
|
|
76
|
+
return Promise.resolve(finalSeekingHints);
|
|
77
|
+
}
|
|
78
|
+
if (workerTerminated) {
|
|
79
|
+
return Promise.reject(new Error('Worker terminated'));
|
|
80
|
+
}
|
|
81
|
+
const prom = (0, with_resolvers_1.withResolvers)();
|
|
82
|
+
post(worker, { type: 'request-get-seeking-hints' });
|
|
83
|
+
seekingHintPromises.push(prom);
|
|
84
|
+
return prom.promise;
|
|
85
|
+
});
|
|
71
86
|
const callbacks = {};
|
|
72
87
|
function onMessage(message) {
|
|
73
88
|
const data = message.data;
|
|
74
89
|
if (data.type === 'response-done') {
|
|
75
90
|
resolve(data.payload);
|
|
91
|
+
if (data.seekingHints) {
|
|
92
|
+
finalSeekingHints = data.seekingHints;
|
|
93
|
+
for (const prom of seekingHintPromises) {
|
|
94
|
+
prom.resolve(finalSeekingHints);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return;
|
|
76
98
|
}
|
|
77
99
|
if (data.type === 'response-error') {
|
|
78
100
|
// eslint-disable-next-line @typescript-eslint/no-use-before-define
|
|
79
101
|
cleanup();
|
|
80
|
-
|
|
102
|
+
// Reject main loop
|
|
103
|
+
const error = (0, serialize_error_1.deserializeError)(data);
|
|
104
|
+
reject(error);
|
|
105
|
+
// If aborted, we send the seeking hints we got,
|
|
106
|
+
// otherwise we reject all .getSeekingHints() promises
|
|
107
|
+
if (data.errorName === 'MediaParserAbortError') {
|
|
108
|
+
finalSeekingHints = data.seekingHints;
|
|
109
|
+
for (const prom of seekingHintPromises) {
|
|
110
|
+
prom.resolve(finalSeekingHints);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
// Reject all .getSeekingHints() promises
|
|
115
|
+
for (const prom of seekingHintPromises) {
|
|
116
|
+
prom.reject(error);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return;
|
|
81
120
|
}
|
|
82
121
|
if (data.type === 'response-on-callback-request') {
|
|
83
122
|
Promise.resolve()
|
|
@@ -254,7 +293,17 @@ const parseMediaOnWorkerImplementation = async ({ controller, reader, ...params
|
|
|
254
293
|
nonce: data.nonce,
|
|
255
294
|
});
|
|
256
295
|
});
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
298
|
+
if (data.type === 'response-get-seeking-hints') {
|
|
299
|
+
const firstPromise = seekingHintPromises.shift();
|
|
300
|
+
if (!firstPromise) {
|
|
301
|
+
throw new Error('No seeking hint promise found');
|
|
302
|
+
}
|
|
303
|
+
firstPromise.resolve(data.payload);
|
|
304
|
+
return;
|
|
257
305
|
}
|
|
306
|
+
throw new Error(`Unknown response type: ${JSON.stringify(data)}`);
|
|
258
307
|
}
|
|
259
308
|
worker.addEventListener('message', onMessage);
|
|
260
309
|
controller === null || controller === void 0 ? void 0 : controller.addEventListener('abort', onAbort);
|
|
@@ -267,6 +316,7 @@ const parseMediaOnWorkerImplementation = async ({ controller, reader, ...params
|
|
|
267
316
|
controller === null || controller === void 0 ? void 0 : controller.removeEventListener('resume', onResume);
|
|
268
317
|
controller === null || controller === void 0 ? void 0 : controller.removeEventListener('pause', onPause);
|
|
269
318
|
controller === null || controller === void 0 ? void 0 : controller.removeEventListener('seek', onSeek);
|
|
319
|
+
workerTerminated = true;
|
|
270
320
|
worker.terminate();
|
|
271
321
|
}
|
|
272
322
|
controller === null || controller === void 0 ? void 0 : controller._internals.markAsReadyToEmitEvents();
|
package/dist/parse-media.js
CHANGED
|
@@ -5,7 +5,7 @@ const select_stream_1 = require("./containers/m3u/select-stream");
|
|
|
5
5
|
const internal_parse_media_1 = require("./internal-parse-media");
|
|
6
6
|
const web_1 = require("./web");
|
|
7
7
|
const parseMedia = (options) => {
|
|
8
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15;
|
|
8
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16;
|
|
9
9
|
return (0, internal_parse_media_1.internalParseMedia)({
|
|
10
10
|
fields: (_a = options.fields) !== null && _a !== void 0 ? _a : null,
|
|
11
11
|
logLevel: (_b = options.logLevel) !== null && _b !== void 0 ? _b : 'info',
|
|
@@ -53,6 +53,7 @@ const parseMedia = (options) => {
|
|
|
53
53
|
acknowledgeRemotionLicense: Boolean(options.acknowledgeRemotionLicense),
|
|
54
54
|
apiName: 'parseMedia()',
|
|
55
55
|
makeSamplesStartAtZero: (_15 = options.makeSamplesStartAtZero) !== null && _15 !== void 0 ? _15 : true,
|
|
56
|
+
seekingHints: (_16 = options.seekingHints) !== null && _16 !== void 0 ? _16 : null,
|
|
56
57
|
});
|
|
57
58
|
};
|
|
58
59
|
exports.parseMedia = parseMedia;
|
|
@@ -1,6 +1,6 @@
|
|
|
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
|
export declare const getSamplesFromMoof: ({ moofBox, trackId, }: {
|
|
4
|
-
moofBox:
|
|
4
|
+
moofBox: MoofBox;
|
|
5
5
|
trackId: number;
|
|
6
6
|
}) => SamplePosition[];
|
|
@@ -52,6 +52,8 @@ const getSamplesFromTraf = (trafSegment, moofOffset) => {
|
|
|
52
52
|
isKeyframe: keyframe,
|
|
53
53
|
size,
|
|
54
54
|
chunk: 0,
|
|
55
|
+
bigEndian: false,
|
|
56
|
+
chunkSize: null,
|
|
55
57
|
};
|
|
56
58
|
samples.push(samplePosition);
|
|
57
59
|
offset += size;
|
|
@@ -61,15 +63,12 @@ const getSamplesFromTraf = (trafSegment, moofOffset) => {
|
|
|
61
63
|
return samples;
|
|
62
64
|
};
|
|
63
65
|
const getSamplesFromMoof = ({ moofBox, trackId, }) => {
|
|
64
|
-
|
|
65
|
-
throw new Error('Expected moof-box');
|
|
66
|
-
}
|
|
67
|
-
const trafs = moofBox.children.filter((c) => c.type === 'regular-box' && c.boxType === 'traf');
|
|
68
|
-
const mapped = trafs.map((traf) => {
|
|
66
|
+
const mapped = moofBox.trafBoxes.map((traf) => {
|
|
69
67
|
const tfhdBox = (0, traversal_1.getTfhdBox)(traf);
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
68
|
+
if (!tfhdBox || tfhdBox.trackId !== trackId) {
|
|
69
|
+
return [];
|
|
70
|
+
}
|
|
71
|
+
return getSamplesFromTraf(traf, moofBox.offset);
|
|
73
72
|
});
|
|
74
73
|
return mapped.flat(1);
|
|
75
74
|
};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { IsoBaseMediaBox } from './containers/iso-base-media/base-media-box';
|
|
2
|
+
import type { TfraBox } from './containers/iso-base-media/mfra/tfra';
|
|
3
|
+
import type { MoovBox } from './containers/iso-base-media/moov/moov';
|
|
4
|
+
import type { PacketPes } from './containers/transport-stream/parse-pes';
|
|
5
|
+
import type { MediaParserKeyframe } from './options';
|
|
6
|
+
import type { MoofBox } from './state/iso-base-media/precomputed-moof';
|
|
7
|
+
import type { LazyCuesLoadedOrNull } from './state/matroska/lazy-cues-fetch';
|
|
8
|
+
import type { MediaSection } from './state/video-section';
|
|
9
|
+
export type IsoBaseMediaSeekingHints = {
|
|
10
|
+
type: 'iso-base-media-seeking-hints';
|
|
11
|
+
moovBox: MoovBox;
|
|
12
|
+
moofBoxes: MoofBox[];
|
|
13
|
+
tfraBoxes: TfraBox[];
|
|
14
|
+
mediaSections: MediaSection[];
|
|
15
|
+
mfraAlreadyLoaded: IsoBaseMediaBox[] | null;
|
|
16
|
+
};
|
|
17
|
+
export type WavSeekingHints = {
|
|
18
|
+
type: 'wav-seeking-hints';
|
|
19
|
+
sampleRate: number;
|
|
20
|
+
blockAlign: number;
|
|
21
|
+
mediaSection: MediaSection;
|
|
22
|
+
};
|
|
23
|
+
export type TransportStreamSeekingHints = {
|
|
24
|
+
type: 'transport-stream-seeking-hints';
|
|
25
|
+
observedPesHeaders: PacketPes[];
|
|
26
|
+
ptsStartOffset: number;
|
|
27
|
+
firstVideoTrackId: number;
|
|
28
|
+
};
|
|
29
|
+
export type WebmSeekingHints = {
|
|
30
|
+
type: 'webm-seeking-hints';
|
|
31
|
+
track: null | {
|
|
32
|
+
timescale: number;
|
|
33
|
+
trackId: number;
|
|
34
|
+
};
|
|
35
|
+
keyframes: MediaParserKeyframe[];
|
|
36
|
+
loadedCues: LazyCuesLoadedOrNull;
|
|
37
|
+
timestampMap: Map<number, number>;
|
|
38
|
+
};
|
|
39
|
+
export type SeekingHints = IsoBaseMediaSeekingHints | WavSeekingHints | TransportStreamSeekingHints | WebmSeekingHints;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.setSeekingHints = void 0;
|
|
4
|
+
const seeking_hints_1 = require("./containers/iso-base-media/seeking-hints");
|
|
5
|
+
const seeking_hints_2 = require("./containers/transport-stream/seeking-hints");
|
|
6
|
+
const seeking_hints_3 = require("./containers/wav/seeking-hints");
|
|
7
|
+
const seeking_hints_4 = require("./containers/webm/seek/seeking-hints");
|
|
8
|
+
const setSeekingHints = ({ hints, state, }) => {
|
|
9
|
+
if (hints.type === 'iso-base-media-seeking-hints') {
|
|
10
|
+
(0, seeking_hints_1.setSeekingHintsForMp4)({ hints, state });
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
if (hints.type === 'wav-seeking-hints') {
|
|
14
|
+
(0, seeking_hints_3.setSeekingHintsForWav)({ hints, state });
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
if (hints.type === 'transport-stream-seeking-hints') {
|
|
18
|
+
(0, seeking_hints_2.setSeekingHintsForTransportStream)({ hints, state });
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
if (hints.type === 'webm-seeking-hints') {
|
|
22
|
+
(0, seeking_hints_4.setSeekingHintsForWebm)({ hints, state });
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
throw new Error(`Unknown seeking hints type: ${hints}`);
|
|
26
|
+
};
|
|
27
|
+
exports.setSeekingHints = setSeekingHints;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export type AudioSampleOffset = {
|
|
2
|
+
timeInSeconds: number;
|
|
3
|
+
offset: number;
|
|
4
|
+
durationInSeconds: number;
|
|
5
|
+
};
|
|
6
|
+
export declare const audioSampleMapState: () => {
|
|
7
|
+
addSample: (audioSampleOffset: AudioSampleOffset) => void;
|
|
8
|
+
getSamples: () => AudioSampleOffset[];
|
|
9
|
+
setFromSeekingHints: (newMap: AudioSampleOffset[]) => void;
|
|
10
|
+
};
|
|
11
|
+
export type AudioSampleMapState = ReturnType<typeof audioSampleMapState>;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.audioSampleMapState = void 0;
|
|
4
|
+
const audioSampleMapState = () => {
|
|
5
|
+
// {[]}
|
|
6
|
+
let map = [];
|
|
7
|
+
const addSample = (audioSampleOffset) => {
|
|
8
|
+
if (map.find((m) => m.offset === audioSampleOffset.offset)) {
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
map.push(audioSampleOffset);
|
|
12
|
+
};
|
|
13
|
+
return {
|
|
14
|
+
addSample,
|
|
15
|
+
getSamples: () => map,
|
|
16
|
+
setFromSeekingHints: (newMap) => {
|
|
17
|
+
map = newMap;
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
exports.audioSampleMapState = audioSampleMapState;
|
|
@@ -18,7 +18,9 @@ const makeTracksSectionState = (canSkipTracksState, src) => {
|
|
|
18
18
|
addTrack: (track) => {
|
|
19
19
|
tracks.push(track);
|
|
20
20
|
},
|
|
21
|
-
getTracks: () =>
|
|
21
|
+
getTracks: () => {
|
|
22
|
+
return tracks;
|
|
23
|
+
},
|
|
22
24
|
ensureHasTracksAtEnd: (fields) => {
|
|
23
25
|
if (canSkipTracksState.canSkipTracks()) {
|
|
24
26
|
return;
|
|
@@ -5,7 +5,7 @@ const get_sample_positions_from_track_1 = require("../../containers/iso-base-med
|
|
|
5
5
|
const traversal_1 = require("../../containers/iso-base-media/traversal");
|
|
6
6
|
const get_tracks_1 = require("../../get-tracks");
|
|
7
7
|
const calculateFlatSamples = (state) => {
|
|
8
|
-
const tracks = (0, get_tracks_1.getTracks)(state);
|
|
8
|
+
const tracks = (0, get_tracks_1.getTracks)(state, true);
|
|
9
9
|
const allTracks = [
|
|
10
10
|
...tracks.videoTracks,
|
|
11
11
|
...tracks.audioTracks,
|
|
@@ -14,11 +14,27 @@ export declare const isoBaseMediaState: ({ contentLength, controller, readerInte
|
|
|
14
14
|
setSamples: (mdatStart: number, samples: import("./cached-sample-positions").FlatSample[]) => void;
|
|
15
15
|
};
|
|
16
16
|
moov: {
|
|
17
|
-
setMoovBox: (moov:
|
|
18
|
-
|
|
17
|
+
setMoovBox: (moov: {
|
|
18
|
+
moovBox: import("../../containers/iso-base-media/moov/moov").MoovBox;
|
|
19
|
+
precomputed: boolean;
|
|
20
|
+
}) => void;
|
|
21
|
+
getMoovBoxAndPrecomputed: () => {
|
|
22
|
+
moovBox: import("../../containers/iso-base-media/moov/moov").MoovBox;
|
|
23
|
+
precomputed: boolean;
|
|
24
|
+
} | null;
|
|
19
25
|
};
|
|
20
26
|
mfra: {
|
|
21
27
|
triggerLoad: () => Promise<import("../../containers/iso-base-media/base-media-box").IsoBaseMediaBox[] | null>;
|
|
28
|
+
getIfAlreadyLoaded: () => import("../../containers/iso-base-media/base-media-box").IsoBaseMediaBox[] | null;
|
|
29
|
+
setFromSeekingHints: (hints: import("../../seeking-hints").IsoBaseMediaSeekingHints) => void;
|
|
30
|
+
};
|
|
31
|
+
moof: {
|
|
32
|
+
getMoofBoxes: () => import("./precomputed-moof").MoofBox[];
|
|
33
|
+
setMoofBoxes: (boxes: import("./precomputed-moof").MoofBox[]) => void;
|
|
34
|
+
};
|
|
35
|
+
tfra: {
|
|
36
|
+
getTfraBoxes: () => import("../../containers/iso-base-media/mfra/tfra").TfraBox[];
|
|
37
|
+
setTfraBoxes: (boxes: import("../../containers/iso-base-media/mfra/tfra").TfraBox[]) => void;
|
|
22
38
|
};
|
|
23
39
|
};
|
|
24
40
|
export type IsoBaseMediaState = ReturnType<typeof isoBaseMediaState>;
|
|
@@ -4,6 +4,8 @@ exports.isoBaseMediaState = void 0;
|
|
|
4
4
|
const cached_sample_positions_1 = require("./cached-sample-positions");
|
|
5
5
|
const lazy_mfra_load_1 = require("./lazy-mfra-load");
|
|
6
6
|
const moov_box_1 = require("./moov-box");
|
|
7
|
+
const precomputed_moof_1 = require("./precomputed-moof");
|
|
8
|
+
const precomputed_tfra_1 = require("./precomputed-tfra");
|
|
7
9
|
const isoBaseMediaState = ({ contentLength, controller, readerInterface, src, logLevel, }) => {
|
|
8
10
|
return {
|
|
9
11
|
flatSamples: (0, cached_sample_positions_1.cachedSamplePositionsState)(),
|
|
@@ -15,6 +17,8 @@ const isoBaseMediaState = ({ contentLength, controller, readerInterface, src, lo
|
|
|
15
17
|
src,
|
|
16
18
|
logLevel,
|
|
17
19
|
}),
|
|
20
|
+
moof: (0, precomputed_moof_1.precomputedMoofState)(),
|
|
21
|
+
tfra: (0, precomputed_tfra_1.precomputedTfraState)(),
|
|
18
22
|
};
|
|
19
23
|
};
|
|
20
24
|
exports.isoBaseMediaState = isoBaseMediaState;
|
|
@@ -3,6 +3,7 @@ import type { MediaParserController } from '../../controller/media-parser-contro
|
|
|
3
3
|
import { type LogLevel } from '../../log';
|
|
4
4
|
import type { ParseMediaSrc } from '../../options';
|
|
5
5
|
import type { ReaderInterface } from '../../readers/reader';
|
|
6
|
+
import type { IsoBaseMediaSeekingHints } from '../../seeking-hints';
|
|
6
7
|
export declare const lazyMfraLoad: ({ contentLength, controller, readerInterface, src, logLevel, }: {
|
|
7
8
|
contentLength: number;
|
|
8
9
|
controller: MediaParserController;
|
|
@@ -11,4 +12,6 @@ export declare const lazyMfraLoad: ({ contentLength, controller, readerInterface
|
|
|
11
12
|
logLevel: LogLevel;
|
|
12
13
|
}) => {
|
|
13
14
|
triggerLoad: () => Promise<IsoBaseMediaBox[] | null>;
|
|
15
|
+
getIfAlreadyLoaded: () => IsoBaseMediaBox[] | null;
|
|
16
|
+
setFromSeekingHints: (hints: IsoBaseMediaSeekingHints) => void;
|
|
14
17
|
};
|
|
@@ -5,6 +5,7 @@ const get_mfra_seeking_box_1 = require("../../containers/iso-base-media/get-mfra
|
|
|
5
5
|
const log_1 = require("../../log");
|
|
6
6
|
const lazyMfraLoad = ({ contentLength, controller, readerInterface, src, logLevel, }) => {
|
|
7
7
|
let prom = null;
|
|
8
|
+
let result = null;
|
|
8
9
|
const triggerLoad = () => {
|
|
9
10
|
if (prom) {
|
|
10
11
|
return prom;
|
|
@@ -18,12 +19,24 @@ const lazyMfraLoad = ({ contentLength, controller, readerInterface, src, logLeve
|
|
|
18
19
|
logLevel,
|
|
19
20
|
}).then((boxes) => {
|
|
20
21
|
log_1.Log.verbose(logLevel, 'Lazily found mfra atom.');
|
|
22
|
+
result = boxes;
|
|
21
23
|
return boxes;
|
|
22
24
|
});
|
|
23
25
|
return prom;
|
|
24
26
|
};
|
|
27
|
+
const getIfAlreadyLoaded = () => {
|
|
28
|
+
if (result) {
|
|
29
|
+
return result;
|
|
30
|
+
}
|
|
31
|
+
return null;
|
|
32
|
+
};
|
|
33
|
+
const setFromSeekingHints = (hints) => {
|
|
34
|
+
result = hints.mfraAlreadyLoaded;
|
|
35
|
+
};
|
|
25
36
|
return {
|
|
26
37
|
triggerLoad,
|
|
38
|
+
getIfAlreadyLoaded,
|
|
39
|
+
setFromSeekingHints,
|
|
27
40
|
};
|
|
28
41
|
};
|
|
29
42
|
exports.lazyMfraLoad = lazyMfraLoad;
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import type { MoovBox } from '../../containers/iso-base-media/moov/moov';
|
|
2
|
+
type MoovBoxAndPrecomputed = {
|
|
3
|
+
moovBox: MoovBox;
|
|
4
|
+
precomputed: boolean;
|
|
5
|
+
};
|
|
2
6
|
export declare const moovState: () => {
|
|
3
|
-
setMoovBox: (moov:
|
|
4
|
-
|
|
7
|
+
setMoovBox: (moov: MoovBoxAndPrecomputed) => void;
|
|
8
|
+
getMoovBoxAndPrecomputed: () => MoovBoxAndPrecomputed | null;
|
|
5
9
|
};
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { IsoBaseMediaBox } from '../../containers/iso-base-media/base-media-box';
|
|
2
|
+
export type MoofBox = {
|
|
3
|
+
offset: number;
|
|
4
|
+
trafBoxes: IsoBaseMediaBox[];
|
|
5
|
+
};
|
|
6
|
+
export declare const precomputedMoofState: () => {
|
|
7
|
+
getMoofBoxes: () => MoofBox[];
|
|
8
|
+
setMoofBoxes: (boxes: MoofBox[]) => void;
|
|
9
|
+
};
|
|
10
|
+
export declare const toMoofBox: (box: IsoBaseMediaBox) => MoofBox;
|
|
11
|
+
export declare const deduplicateMoofBoxesByOffset: (moofBoxes: MoofBox[]) => MoofBox[];
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.deduplicateMoofBoxesByOffset = exports.toMoofBox = exports.precomputedMoofState = void 0;
|
|
4
|
+
// Note: May be duplicated!
|
|
5
|
+
const precomputedMoofState = () => {
|
|
6
|
+
let moofBoxes = [];
|
|
7
|
+
return {
|
|
8
|
+
getMoofBoxes: () => moofBoxes,
|
|
9
|
+
setMoofBoxes: (boxes) => {
|
|
10
|
+
moofBoxes = boxes;
|
|
11
|
+
},
|
|
12
|
+
};
|
|
13
|
+
};
|
|
14
|
+
exports.precomputedMoofState = precomputedMoofState;
|
|
15
|
+
const toMoofBox = (box) => {
|
|
16
|
+
if (box.type !== 'regular-box') {
|
|
17
|
+
throw new Error('expected regular bpx');
|
|
18
|
+
}
|
|
19
|
+
return {
|
|
20
|
+
offset: box.offset,
|
|
21
|
+
trafBoxes: box.children.filter((c) => c.type === 'regular-box' && c.boxType === 'traf'),
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
exports.toMoofBox = toMoofBox;
|
|
25
|
+
const deduplicateMoofBoxesByOffset = (moofBoxes) => {
|
|
26
|
+
return moofBoxes.filter((m, i, arr) => i === arr.findIndex((t) => t.offset === m.offset));
|
|
27
|
+
};
|
|
28
|
+
exports.deduplicateMoofBoxesByOffset = deduplicateMoofBoxesByOffset;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { TfraBox } from '../../containers/iso-base-media/mfra/tfra';
|
|
2
|
+
export declare const precomputedTfraState: () => {
|
|
3
|
+
getTfraBoxes: () => TfraBox[];
|
|
4
|
+
setTfraBoxes: (boxes: TfraBox[]) => void;
|
|
5
|
+
};
|
|
6
|
+
export declare const deduplicateTfraBoxesByOffset: (tfraBoxes: TfraBox[]) => TfraBox[];
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.deduplicateTfraBoxesByOffset = exports.precomputedTfraState = void 0;
|
|
4
|
+
const precomputedTfraState = () => {
|
|
5
|
+
let tfraBoxes = [];
|
|
6
|
+
return {
|
|
7
|
+
getTfraBoxes: () => tfraBoxes,
|
|
8
|
+
setTfraBoxes: (boxes) => {
|
|
9
|
+
tfraBoxes = boxes;
|
|
10
|
+
},
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
exports.precomputedTfraState = precomputedTfraState;
|
|
14
|
+
const deduplicateTfraBoxesByOffset = (tfraBoxes) => {
|
|
15
|
+
return tfraBoxes.filter((m, i, arr) => i === arr.findIndex((t) => t.offset === m.offset));
|
|
16
|
+
};
|
|
17
|
+
exports.deduplicateTfraBoxesByOffset = deduplicateTfraBoxesByOffset;
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import type { MediaParserKeyframe } from '../options';
|
|
2
|
+
import type { WebmSeekingHints } from '../seeking-hints';
|
|
2
3
|
export declare const keyframesState: () => {
|
|
3
4
|
addKeyframe: (keyframe: MediaParserKeyframe) => void;
|
|
4
5
|
getKeyframes: () => MediaParserKeyframe[];
|
|
6
|
+
setFromSeekingHints: (hints: WebmSeekingHints) => void;
|
|
5
7
|
};
|
|
6
8
|
export type KeyframesState = ReturnType<typeof keyframesState>;
|
package/dist/state/keyframes.js
CHANGED
|
@@ -3,16 +3,24 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.keyframesState = void 0;
|
|
4
4
|
const keyframesState = () => {
|
|
5
5
|
const keyframes = [];
|
|
6
|
+
const addKeyframe = (keyframe) => {
|
|
7
|
+
if (keyframes.find((k) => k.positionInBytes === keyframe.positionInBytes)) {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
keyframes.push(keyframe);
|
|
11
|
+
};
|
|
12
|
+
const getKeyframes = () => {
|
|
13
|
+
return keyframes;
|
|
14
|
+
};
|
|
15
|
+
const setFromSeekingHints = (hints) => {
|
|
16
|
+
for (const keyframe of hints.keyframes) {
|
|
17
|
+
addKeyframe(keyframe);
|
|
18
|
+
}
|
|
19
|
+
};
|
|
6
20
|
return {
|
|
7
|
-
addKeyframe
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
}
|
|
11
|
-
keyframes.push(keyframe);
|
|
12
|
-
},
|
|
13
|
-
getKeyframes: () => {
|
|
14
|
-
return keyframes;
|
|
15
|
-
},
|
|
21
|
+
addKeyframe,
|
|
22
|
+
getKeyframes,
|
|
23
|
+
setFromSeekingHints,
|
|
16
24
|
};
|
|
17
25
|
};
|
|
18
26
|
exports.keyframesState = keyframesState;
|
|
@@ -3,6 +3,7 @@ import type { MediaParserController } from '../../controller/media-parser-contro
|
|
|
3
3
|
import type { LogLevel } from '../../log';
|
|
4
4
|
import type { ParseMediaSrc } from '../../options';
|
|
5
5
|
import type { ReaderInterface } from '../../readers/reader';
|
|
6
|
+
import type { WebmSeekingHints } from '../../seeking-hints';
|
|
6
7
|
export declare const lazyCuesFetch: ({ controller, logLevel, readerInterface, src, }: {
|
|
7
8
|
controller: MediaParserController;
|
|
8
9
|
logLevel: LogLevel;
|
|
@@ -14,6 +15,11 @@ export declare const lazyCuesFetch: ({ controller, logLevel, readerInterface, sr
|
|
|
14
15
|
cues: MatroskaCue[];
|
|
15
16
|
segmentOffset: number;
|
|
16
17
|
} | null>;
|
|
18
|
+
getIfAlreadyLoaded: () => {
|
|
19
|
+
cues: MatroskaCue[];
|
|
20
|
+
segmentOffset: number;
|
|
21
|
+
} | null;
|
|
22
|
+
setFromSeekingHints: (hints: WebmSeekingHints) => void;
|
|
17
23
|
};
|
|
18
24
|
export type LazyCuesFetch = ReturnType<typeof lazyCuesFetch>;
|
|
19
|
-
export type
|
|
25
|
+
export type LazyCuesLoadedOrNull = Awaited<ReturnType<LazyCuesFetch['getLoadedCues']>>;
|