@remotion/media-parser 4.0.278 → 4.0.280
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/check-if-done.d.ts +2 -0
- package/dist/check-if-done.js +34 -0
- package/dist/containers/aac/parse-aac.js +15 -10
- package/dist/containers/avc/parse-avc.js +1 -1
- package/dist/containers/flac/get-block-size.d.ts +1 -1
- package/dist/containers/flac/get-channel-count.d.ts +2 -2
- package/dist/containers/flac/get-sample-rate.d.ts +1 -1
- package/dist/containers/flac/parse-flac-frame.d.ts +1 -1
- package/dist/containers/flac/parse-flac-frame.js +16 -11
- package/dist/containers/flac/parse-flac.d.ts +1 -1
- package/dist/containers/flac/parse-header.d.ts +1 -1
- package/dist/containers/flac/parse-metadata.d.ts +1 -1
- package/dist/containers/flac/parse-streaminfo.d.ts +1 -1
- package/dist/containers/flac/parse-unknown-block.d.ts +1 -1
- package/dist/containers/iso-base-media/esds/decoder-specific-config.d.ts +1 -1
- package/dist/containers/iso-base-media/esds/esds-descriptors.d.ts +1 -1
- package/dist/containers/iso-base-media/esds/esds.d.ts +1 -1
- package/dist/containers/iso-base-media/ftyp.d.ts +1 -1
- package/dist/containers/iso-base-media/get-moov-atom.js +9 -3
- package/dist/containers/iso-base-media/get-seeking-from-mp4.d.ts +5 -0
- package/dist/containers/iso-base-media/get-seeking-from-mp4.js +56 -0
- package/dist/containers/iso-base-media/mdat/mdat.js +29 -20
- package/dist/containers/iso-base-media/mdhd.d.ts +1 -1
- package/dist/containers/iso-base-media/meta/hdlr.d.ts +1 -1
- package/dist/containers/iso-base-media/meta/ilst.d.ts +1 -1
- package/dist/containers/iso-base-media/mvhd.d.ts +1 -1
- package/dist/containers/iso-base-media/mvhd.js +1 -1
- package/dist/containers/iso-base-media/parse-icc-profile.js +1 -1
- package/dist/containers/iso-base-media/stsd/av1c.d.ts +1 -1
- package/dist/containers/iso-base-media/stsd/avcc.d.ts +1 -1
- package/dist/containers/iso-base-media/stsd/colr.d.ts +1 -1
- package/dist/containers/iso-base-media/stsd/ctts.d.ts +1 -1
- package/dist/containers/iso-base-media/stsd/hvcc.d.ts +1 -1
- package/dist/containers/iso-base-media/stsd/keys.d.ts +1 -1
- package/dist/containers/iso-base-media/stsd/pasp.d.ts +1 -1
- package/dist/containers/iso-base-media/stsd/stco.d.ts +1 -1
- package/dist/containers/iso-base-media/stsd/stsc.d.ts +1 -1
- package/dist/containers/iso-base-media/stsd/stss.d.ts +1 -1
- package/dist/containers/iso-base-media/stsd/stsz.d.ts +1 -1
- package/dist/containers/iso-base-media/stsd/stts.d.ts +1 -1
- package/dist/containers/iso-base-media/tfdt.d.ts +1 -1
- package/dist/containers/iso-base-media/tfhd.d.ts +1 -1
- package/dist/containers/iso-base-media/tkhd.d.ts +1 -1
- package/dist/containers/iso-base-media/trun.d.ts +1 -1
- package/dist/containers/m3u/parse-m3u-manifest.d.ts +1 -1
- package/dist/containers/mp3/id3-v1.d.ts +1 -1
- package/dist/containers/mp3/parse-mpeg-header.js +14 -9
- package/dist/containers/riff/is-movi.d.ts +1 -1
- package/dist/containers/riff/parse-avih.d.ts +1 -1
- package/dist/containers/riff/parse-isft.d.ts +1 -1
- package/dist/containers/riff/parse-movi.js +29 -20
- package/dist/containers/riff/parse-strf.d.ts +1 -1
- package/dist/containers/riff/parse-strh.d.ts +1 -1
- package/dist/containers/transport-stream/adts-header.js +1 -1
- package/dist/containers/transport-stream/discard-rest-of-packet.d.ts +1 -1
- package/dist/containers/transport-stream/handle-aac-packet.js +6 -1
- package/dist/containers/transport-stream/handle-avc-packet.js +6 -1
- package/dist/containers/transport-stream/parse-pat.d.ts +1 -1
- package/dist/containers/transport-stream/parse-pes.d.ts +1 -1
- package/dist/containers/transport-stream/parse-pmt.d.ts +1 -1
- package/dist/containers/wav/parse-video-section.js +15 -10
- package/dist/containers/webm/av1-codec-private.js +1 -1
- package/dist/containers/webm/description.js +1 -1
- package/dist/containers/webm/get-sample-from-block.js +1 -1
- package/dist/containers/webm/make-track.js +1 -1
- package/dist/containers/webm/parse-ebml.js +16 -3
- package/dist/containers/webm/segments/block-simple-block-flags.d.ts +1 -1
- package/dist/emit-all-info.d.ts +3 -0
- package/dist/emit-all-info.js +30 -0
- package/dist/emit-audio-sample.d.ts +12 -0
- package/dist/emit-audio-sample.js +14 -0
- package/dist/emit-available-info.d.ts +2 -7
- package/dist/emit-available-info.js +34 -31
- package/dist/esm/index.mjs +1936 -1635
- package/dist/esm/worker-server-entry.mjs +855 -554
- package/dist/esm/worker-web-entry.mjs +855 -554
- package/dist/fields.d.ts +61 -0
- package/dist/fields.js +2 -0
- package/dist/get-fields-from-callbacks.d.ts +2 -1
- package/dist/get-seeking-info.d.ts +4 -0
- package/dist/get-seeking-info.js +22 -0
- package/dist/has-all-info.d.ts +3 -5
- package/dist/has-all-info.js +3 -4
- package/dist/index.d.ts +53 -14
- package/dist/index.js +1 -1
- package/dist/init-video.d.ts +1 -4
- package/dist/init-video.js +2 -1
- package/dist/internal-parse-media.js +25 -188
- package/dist/{buffer-iterator.d.ts → iterator/buffer-iterator.d.ts} +12 -15
- package/dist/{buffer-iterator.js → iterator/buffer-iterator.js} +8 -116
- package/dist/iterator/buffer-manager.d.ts +18 -0
- package/dist/iterator/buffer-manager.js +86 -0
- package/dist/iterator/offset-counter.d.ts +10 -0
- package/dist/iterator/offset-counter.js +31 -0
- package/dist/make-hvc1-codec-strings.d.ts +1 -1
- package/dist/make-progress-object.d.ts +6 -0
- package/dist/make-progress-object.js +13 -0
- package/dist/media-parser-controller.d.ts +3 -0
- package/dist/media-parser-controller.js +4 -0
- package/dist/options.d.ts +1 -61
- package/dist/parse-loop.d.ts +8 -0
- package/dist/parse-loop.js +93 -0
- package/dist/parse-media-on-worker-entry.d.ts +2 -1
- package/dist/perform-seek.d.ts +2 -7
- package/dist/perform-seek.js +23 -24
- package/dist/print-timings.d.ts +2 -0
- package/dist/print-timings.js +12 -0
- package/dist/register-track.js +3 -0
- package/dist/run-parse-iteration.d.ts +1 -4
- package/dist/run-parse-iteration.js +1 -4
- package/dist/seek-backwards.d.ts +2 -0
- package/dist/seek-backwards.js +26 -0
- package/dist/seek-forwards.d.ts +2 -0
- package/dist/seek-forwards.js +28 -0
- package/dist/seek-signal.d.ts +22 -0
- package/dist/seek-signal.js +26 -0
- package/dist/seeking-info.d.ts +8 -0
- package/dist/seeking-info.js +2 -0
- package/dist/state/can-skip-tracks.d.ts +2 -2
- package/dist/state/can-skip-tracks.js +5 -2
- package/dist/state/emitted-fields.d.ts +1 -1
- package/dist/state/has-tracks-section.d.ts +2 -1
- package/dist/state/need-samples-for-fields.d.ts +1 -1
- package/dist/state/parser-state.d.ts +38 -8
- package/dist/state/parser-state.js +22 -2
- package/dist/state/sample-callbacks.d.ts +8 -3
- package/dist/state/sample-callbacks.js +16 -3
- package/dist/state/slow-duration-fps.js +15 -17
- package/dist/state/timings.d.ts +8 -0
- package/dist/state/timings.js +13 -0
- package/dist/state/video-section.d.ts +1 -1
- package/dist/state/webm.d.ts +1 -1
- package/dist/throttled-progress.d.ts +2 -3
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/work-on-seek-request.d.ts +2 -0
- package/dist/work-on-seek-request.js +43 -0
- package/dist/worker/worker-types.d.ts +2 -1
- package/package.json +10 -10
- package/dist/parse-media-on-server-worker.d.ts +0 -2
- package/dist/parse-media-on-server-worker.js +0 -4
- package/dist/parse-media-on-web-worker.d.ts +0 -2
- package/dist/parse-media-on-web-worker.js +0 -4
- package/dist/worker.module.d.ts +0 -4
- package/dist/worker.module.js +0 -16
package/dist/perform-seek.js
CHANGED
|
@@ -2,36 +2,35 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.performSeek = void 0;
|
|
4
4
|
const log_1 = require("./log");
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
5
|
+
const seek_backwards_1 = require("./seek-backwards");
|
|
6
|
+
const seek_forwards_1 = require("./seek-forwards");
|
|
7
|
+
const performSeek = async ({ seekTo, state, }) => {
|
|
8
|
+
var _a, _b;
|
|
9
|
+
const { iterator, logLevel, mode, contentLength } = state;
|
|
10
|
+
if (seekTo <= iterator.counter.getOffset() && mode === 'download') {
|
|
11
|
+
throw new Error(`Seeking backwards is not supported in parseAndDownloadMedia() mode. Current position: ${iterator.counter.getOffset()}, seekTo: ${seekTo}`);
|
|
9
12
|
}
|
|
10
13
|
if (seekTo > state.contentLength) {
|
|
11
|
-
throw new Error(`
|
|
12
|
-
}
|
|
13
|
-
if (iterator.counter.getOffset() + iterator.bytesRemaining() >= seekTo) {
|
|
14
|
-
log_1.Log.verbose(logLevel, `Skipping over video data from position ${iterator.counter.getOffset()} -> ${seekTo}. Data already fetched`);
|
|
15
|
-
iterator.discard(seekTo - iterator.counter.getOffset());
|
|
16
|
-
return currentReader;
|
|
14
|
+
throw new Error(`Cannot seek beyond the end of the file: ${seekTo} > ${contentLength}`);
|
|
17
15
|
}
|
|
18
16
|
if (mode === 'download') {
|
|
19
17
|
log_1.Log.verbose(logLevel, `Skipping over video data from position ${iterator.counter.getOffset()} -> ${seekTo}. Fetching but not reading all the data inbetween because in download mode`);
|
|
20
18
|
iterator.discard(seekTo - iterator.counter.getOffset());
|
|
21
|
-
return
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
await ((_a = state.controller) === null || _a === void 0 ? void 0 : _a._internals.checkForAbortAndPause());
|
|
22
|
+
const alreadyAtByte = iterator.counter.getOffset() === seekTo;
|
|
23
|
+
if (alreadyAtByte) {
|
|
24
|
+
log_1.Log.verbose(logLevel, `Already at the desired position, seeking done`);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
const skippingForward = seekTo > iterator.counter.getOffset();
|
|
28
|
+
if (skippingForward) {
|
|
29
|
+
await (0, seek_forwards_1.seekForward)(state, seekTo);
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
await (0, seek_backwards_1.seekBackwards)(state, seekTo);
|
|
22
33
|
}
|
|
23
|
-
|
|
24
|
-
log_1.Log.verbose(logLevel, `Skipping over video data from position ${iterator.counter.getOffset()} -> ${seekTo}. Re-reading because this portion is not available`);
|
|
25
|
-
currentReader.abort();
|
|
26
|
-
await (controller === null || controller === void 0 ? void 0 : controller._internals.checkForAbortAndPause());
|
|
27
|
-
const { reader: newReader } = await readerInterface.read({
|
|
28
|
-
src,
|
|
29
|
-
range: seekTo,
|
|
30
|
-
controller,
|
|
31
|
-
});
|
|
32
|
-
iterator.skipTo(seekTo);
|
|
33
|
-
await state.discardReadBytes(true);
|
|
34
|
-
log_1.Log.verbose(logLevel, `Re-reading took ${Date.now() - time}ms. New position: ${iterator.counter.getOffset()}`);
|
|
35
|
-
return newReader;
|
|
34
|
+
await ((_b = state.controller) === null || _b === void 0 ? void 0 : _b._internals.checkForAbortAndPause());
|
|
36
35
|
};
|
|
37
36
|
exports.performSeek = performSeek;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.printTimings = void 0;
|
|
4
|
+
const log_1 = require("./log");
|
|
5
|
+
const printTimings = (state) => {
|
|
6
|
+
log_1.Log.verbose(state.logLevel, `Time iterating over file: ${state.timings.timeIterating}ms`);
|
|
7
|
+
log_1.Log.verbose(state.logLevel, `Time fetching data: ${state.timings.timeReadingData}ms`);
|
|
8
|
+
log_1.Log.verbose(state.logLevel, `Time seeking: ${state.timings.timeSeeking}ms`);
|
|
9
|
+
log_1.Log.verbose(state.logLevel, `Time checking if done: ${state.timings.timeCheckingIfDone}ms`);
|
|
10
|
+
log_1.Log.verbose(state.logLevel, `Time freeing data: ${state.timings.timeFreeingData}ms`);
|
|
11
|
+
};
|
|
12
|
+
exports.printTimings = printTimings;
|
package/dist/register-track.js
CHANGED
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.registerVideoTrackWhenProfileIsAvailable = exports.registerAudioTrack = exports.registerVideoTrack = void 0;
|
|
4
4
|
const add_avc_profile_to_track_1 = require("./add-avc-profile-to-track");
|
|
5
5
|
const log_1 = require("./log");
|
|
6
|
+
const work_on_seek_request_1 = require("./work-on-seek-request");
|
|
6
7
|
const registerVideoTrack = async ({ state, track, container, }) => {
|
|
7
8
|
if (state.callbacks.tracks.getTracks().find((t) => t.trackId === track.trackId)) {
|
|
8
9
|
log_1.Log.trace(state.logLevel, `Track ${track.trackId} already registered, skipping`);
|
|
@@ -17,6 +18,7 @@ const registerVideoTrack = async ({ state, track, container, }) => {
|
|
|
17
18
|
}
|
|
18
19
|
const callback = await state.onVideoTrack({ track, container });
|
|
19
20
|
await state.callbacks.registerVideoSampleCallback(track.trackId, callback !== null && callback !== void 0 ? callback : null);
|
|
21
|
+
await (0, work_on_seek_request_1.workOnSeekRequest)(state);
|
|
20
22
|
return callback;
|
|
21
23
|
};
|
|
22
24
|
exports.registerVideoTrack = registerVideoTrack;
|
|
@@ -34,6 +36,7 @@ const registerAudioTrack = async ({ state, track, container, }) => {
|
|
|
34
36
|
}
|
|
35
37
|
const callback = await state.onAudioTrack({ track, container });
|
|
36
38
|
await state.callbacks.registerAudioSampleCallback(track.trackId, callback !== null && callback !== void 0 ? callback : null);
|
|
39
|
+
await (0, work_on_seek_request_1.workOnSeekRequest)(state);
|
|
37
40
|
return callback;
|
|
38
41
|
};
|
|
39
42
|
exports.registerAudioTrack = registerAudioTrack;
|
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
import type { ParseResult } from './parse-result';
|
|
2
2
|
import type { ParserState } from './state/parser-state';
|
|
3
|
-
export declare const runParseIteration: ({ state,
|
|
3
|
+
export declare const runParseIteration: ({ state, }: {
|
|
4
4
|
state: ParserState;
|
|
5
|
-
mimeType: string | null;
|
|
6
|
-
contentLength: number;
|
|
7
|
-
name: string | null;
|
|
8
5
|
}) => Promise<ParseResult>;
|
|
@@ -11,7 +11,7 @@ const parse_transport_stream_1 = require("./containers/transport-stream/parse-tr
|
|
|
11
11
|
const parse_wav_1 = require("./containers/wav/parse-wav");
|
|
12
12
|
const parse_webm_header_1 = require("./containers/webm/parse-webm-header");
|
|
13
13
|
const init_video_1 = require("./init-video");
|
|
14
|
-
const runParseIteration = async ({ state,
|
|
14
|
+
const runParseIteration = async ({ state, }) => {
|
|
15
15
|
const structure = state.getStructureOrNull();
|
|
16
16
|
// m3u8 is busy parsing the chunks once the manifest has been read
|
|
17
17
|
if (structure && structure.type === 'm3u') {
|
|
@@ -23,9 +23,6 @@ const runParseIteration = async ({ state, mimeType, contentLength, name, }) => {
|
|
|
23
23
|
if (structure === null) {
|
|
24
24
|
await (0, init_video_1.initVideo)({
|
|
25
25
|
state,
|
|
26
|
-
mimeType,
|
|
27
|
-
name,
|
|
28
|
-
contentLength,
|
|
29
26
|
});
|
|
30
27
|
return null;
|
|
31
28
|
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.seekBackwards = void 0;
|
|
4
|
+
const log_1 = require("./log");
|
|
5
|
+
const seekBackwards = async (state, seekTo) => {
|
|
6
|
+
const { iterator } = state;
|
|
7
|
+
// (a) data has not been discarded yet
|
|
8
|
+
const howManyBytesNotYetDiscarded = iterator.counter.getDiscardedOffset();
|
|
9
|
+
const howManyBytesWeCanGoBack = iterator.counter.getOffset() - howManyBytesNotYetDiscarded;
|
|
10
|
+
if (iterator.counter.getOffset() - howManyBytesWeCanGoBack <= seekTo) {
|
|
11
|
+
iterator.skipTo(seekTo);
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
// (b) data has been discarded, making new reader
|
|
15
|
+
const time = Date.now();
|
|
16
|
+
log_1.Log.verbose(state.logLevel, `Seeking in video from position ${iterator.counter.getOffset()} -> ${seekTo}. Re-reading because this portion is not available`);
|
|
17
|
+
const { reader: newReader } = await state.readerInterface.read({
|
|
18
|
+
src: state.src,
|
|
19
|
+
range: seekTo,
|
|
20
|
+
controller: state.controller,
|
|
21
|
+
});
|
|
22
|
+
iterator.replaceData(new Uint8Array([]), seekTo);
|
|
23
|
+
log_1.Log.verbose(state.logLevel, `Re-reading took ${Date.now() - time}ms. New position: ${iterator.counter.getOffset()}`);
|
|
24
|
+
state.currentReader = newReader;
|
|
25
|
+
};
|
|
26
|
+
exports.seekBackwards = seekBackwards;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.seekForward = void 0;
|
|
4
|
+
const log_1 = require("./log");
|
|
5
|
+
const seekForward = async (state, seekTo) => {
|
|
6
|
+
const { iterator } = state;
|
|
7
|
+
const alreadyHasBuffer = iterator.bytesRemaining() >= seekTo - iterator.counter.getOffset();
|
|
8
|
+
log_1.Log.verbose(state.logLevel, `Performing seek from ${iterator.counter.getOffset()} to ${seekTo}`);
|
|
9
|
+
// (a) starting byte has already been fetched
|
|
10
|
+
if (alreadyHasBuffer) {
|
|
11
|
+
iterator.skipTo(seekTo);
|
|
12
|
+
log_1.Log.verbose(state.logLevel, `Already read ahead enough, skipping forward`);
|
|
13
|
+
return state.currentReader;
|
|
14
|
+
}
|
|
15
|
+
// (b) starting byte has not been fetched yet, making new reader
|
|
16
|
+
const time = Date.now();
|
|
17
|
+
log_1.Log.verbose(state.logLevel, `Skipping over video data from position ${iterator.counter.getOffset()} -> ${seekTo}. Re-reading because this portion is not available`);
|
|
18
|
+
const { reader: newReader } = await state.readerInterface.read({
|
|
19
|
+
src: state.src,
|
|
20
|
+
range: seekTo,
|
|
21
|
+
controller: state.controller,
|
|
22
|
+
});
|
|
23
|
+
iterator.skipTo(seekTo);
|
|
24
|
+
await state.discardReadBytes(true);
|
|
25
|
+
log_1.Log.verbose(state.logLevel, `Re-reading took ${Date.now() - time}ms. New position: ${iterator.counter.getOffset()}`);
|
|
26
|
+
state.currentReader = newReader;
|
|
27
|
+
};
|
|
28
|
+
exports.seekForward = seekForward;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export type SeekSignal = {
|
|
2
|
+
seek: (seek: Seek) => void;
|
|
3
|
+
getSeek: () => Seek | undefined;
|
|
4
|
+
clearSeekIfStillSame: (previousSeek: Seek) => {
|
|
5
|
+
hasChanged: boolean;
|
|
6
|
+
};
|
|
7
|
+
};
|
|
8
|
+
type SeekToTime = {
|
|
9
|
+
type: 'keyframe-before-time-in-seconds';
|
|
10
|
+
time: number;
|
|
11
|
+
};
|
|
12
|
+
type SeekToByte = {
|
|
13
|
+
type: 'byte';
|
|
14
|
+
byte: number;
|
|
15
|
+
};
|
|
16
|
+
type ForceSeekToByte = {
|
|
17
|
+
type: 'force-seek-to-byte';
|
|
18
|
+
byte: number;
|
|
19
|
+
};
|
|
20
|
+
export type Seek = SeekToTime | SeekToByte | ForceSeekToByte;
|
|
21
|
+
export declare const makeSeekSignal: () => SeekSignal;
|
|
22
|
+
export {};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.makeSeekSignal = void 0;
|
|
4
|
+
const makeSeekSignal = () => {
|
|
5
|
+
let seek;
|
|
6
|
+
return {
|
|
7
|
+
seek: (time) => {
|
|
8
|
+
if (seek) {
|
|
9
|
+
throw new Error('Seek already requested, must wait');
|
|
10
|
+
}
|
|
11
|
+
seek = time;
|
|
12
|
+
},
|
|
13
|
+
getSeek() {
|
|
14
|
+
return seek;
|
|
15
|
+
},
|
|
16
|
+
// In the meanwhile a new seek could have been queued
|
|
17
|
+
clearSeekIfStillSame(previousSeek) {
|
|
18
|
+
if (seek === previousSeek) {
|
|
19
|
+
seek = undefined;
|
|
20
|
+
return { hasChanged: false };
|
|
21
|
+
}
|
|
22
|
+
return { hasChanged: true };
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
exports.makeSeekSignal = makeSeekSignal;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { IsoBaseMediaBox } from './containers/iso-base-media/base-media-box';
|
|
2
|
+
import type { MoovBox } from './containers/iso-base-media/moov/moov';
|
|
3
|
+
export type IsoBaseMediaSeekingInfo = {
|
|
4
|
+
type: 'iso-base-media-seeking-info';
|
|
5
|
+
moovBox: MoovBox;
|
|
6
|
+
moofBoxes: IsoBaseMediaBox[];
|
|
7
|
+
};
|
|
8
|
+
export type SeekingInfo = IsoBaseMediaSeekingInfo;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import type { Options, ParseMediaFields } from '../
|
|
1
|
+
import type { Options, ParseMediaFields } from '../fields';
|
|
2
2
|
import type { MediaParserStructureUnstable } from '../parse-result';
|
|
3
3
|
import type { StructureState } from './structure';
|
|
4
4
|
export declare const needsTracksForField: ({ field, structure, }: {
|
|
5
5
|
field: keyof Options<ParseMediaFields>;
|
|
6
|
-
structure: MediaParserStructureUnstable;
|
|
6
|
+
structure: MediaParserStructureUnstable | null;
|
|
7
7
|
}) => boolean;
|
|
8
8
|
export declare const makeCanSkipTracksState: ({ hasAudioTrackHandlers, fields, hasVideoTrackHandlers, structure, }: {
|
|
9
9
|
hasAudioTrackHandlers: boolean;
|
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.makeCanSkipTracksState = exports.needsTracksForField = void 0;
|
|
4
4
|
const needsTracksForField = ({ field, structure, }) => {
|
|
5
5
|
if (field === 'dimensions') {
|
|
6
|
-
if (structure.type === 'riff') {
|
|
6
|
+
if ((structure === null || structure === void 0 ? void 0 : structure.type) === 'riff') {
|
|
7
7
|
return false;
|
|
8
8
|
}
|
|
9
9
|
return true;
|
|
@@ -50,7 +50,10 @@ const makeCanSkipTracksState = ({ hasAudioTrackHandlers, fields, hasVideoTrackHa
|
|
|
50
50
|
}
|
|
51
51
|
const keys = Object.keys(fields !== null && fields !== void 0 ? fields : {});
|
|
52
52
|
const selectedKeys = keys.filter((k) => fields[k]);
|
|
53
|
-
return !selectedKeys.some((k) => (0, exports.needsTracksForField)({
|
|
53
|
+
return !selectedKeys.some((k) => (0, exports.needsTracksForField)({
|
|
54
|
+
field: k,
|
|
55
|
+
structure: structure.getStructureOrNull(),
|
|
56
|
+
}));
|
|
54
57
|
},
|
|
55
58
|
};
|
|
56
59
|
};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type { AllOptions, ParseMediaFields } from '../
|
|
1
|
+
import type { AllOptions, ParseMediaFields } from '../fields';
|
|
2
2
|
export declare const emittedState: () => AllOptions<ParseMediaFields>;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import type { Options, ParseMediaFields } from '../fields';
|
|
1
2
|
import type { Track } from '../get-tracks';
|
|
2
3
|
import type { LogLevel } from '../log';
|
|
3
|
-
import type {
|
|
4
|
+
import type { ParseMediaSrc } from '../options';
|
|
4
5
|
import type { CanSkipTracksState } from './can-skip-tracks';
|
|
5
6
|
export declare const makeTracksSectionState: (canSkipTracksState: CanSkipTracksState, src: ParseMediaSrc) => {
|
|
6
7
|
hasAllTracks: () => boolean;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AllOptions, Options, ParseMediaFields } from '../
|
|
1
|
+
import type { AllOptions, Options, ParseMediaFields } from '../fields';
|
|
2
2
|
export declare const needsToIterateOverSamples: ({ fields, emittedFields, }: {
|
|
3
3
|
fields: Options<ParseMediaFields>;
|
|
4
4
|
emittedFields: AllOptions<ParseMediaFields>;
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import { type BufferIterator } from '../buffer-iterator';
|
|
2
1
|
import type { AvcPPs, AvcProfileInfo } from '../containers/avc/parse-avc';
|
|
3
2
|
import type { SelectM3uAssociatedPlaylistsFn, SelectM3uStreamFn } from '../containers/m3u/select-stream';
|
|
3
|
+
import type { Options, ParseMediaFields } from '../fields';
|
|
4
|
+
import { type BufferIterator } from '../iterator/buffer-iterator';
|
|
4
5
|
import { type LogLevel } from '../log';
|
|
5
6
|
import type { MediaParserController } from '../media-parser-controller';
|
|
6
|
-
import type {
|
|
7
|
+
import type { AllParseMediaFields, OnDiscardedData, ParseMediaCallbacks, ParseMediaMode, ParseMediaResult, ParseMediaSrc } from '../options';
|
|
7
8
|
import type { IsoBaseMediaStructure } from '../parse-result';
|
|
8
|
-
import type { ReaderInterface } from '../readers/reader';
|
|
9
|
+
import type { Reader, ReaderInterface } from '../readers/reader';
|
|
9
10
|
import type { OnAudioTrack, OnVideoTrack } from '../webcodec-sample-types';
|
|
10
11
|
export type InternalStats = {
|
|
11
12
|
skippedBytes: number;
|
|
@@ -15,11 +16,10 @@ export type SpsAndPps = {
|
|
|
15
16
|
sps: AvcProfileInfo;
|
|
16
17
|
pps: AvcPPs;
|
|
17
18
|
};
|
|
18
|
-
export declare const makeParserState: ({ hasAudioTrackHandlers, hasVideoTrackHandlers, controller,
|
|
19
|
+
export declare const makeParserState: ({ hasAudioTrackHandlers, hasVideoTrackHandlers, controller, onAudioTrack, onVideoTrack, contentLength, logLevel, mode, src, readerInterface, onDiscardedData, selectM3uStreamFn, selectM3uAssociatedPlaylistsFn, mp4HeaderSegment, contentType, name, callbacks, fieldsInReturnValue, mimeType, initialReaderInstance, }: {
|
|
19
20
|
hasAudioTrackHandlers: boolean;
|
|
20
21
|
hasVideoTrackHandlers: boolean;
|
|
21
22
|
controller: MediaParserController;
|
|
22
|
-
fields: Options<ParseMediaFields>;
|
|
23
23
|
onAudioTrack: OnAudioTrack | null;
|
|
24
24
|
onVideoTrack: OnVideoTrack | null;
|
|
25
25
|
contentLength: number;
|
|
@@ -31,11 +31,17 @@ export declare const makeParserState: ({ hasAudioTrackHandlers, hasVideoTrackHan
|
|
|
31
31
|
selectM3uStreamFn: SelectM3uStreamFn;
|
|
32
32
|
selectM3uAssociatedPlaylistsFn: SelectM3uAssociatedPlaylistsFn;
|
|
33
33
|
mp4HeaderSegment: IsoBaseMediaStructure | null;
|
|
34
|
+
contentType: string | null;
|
|
35
|
+
name: string;
|
|
36
|
+
callbacks: ParseMediaCallbacks;
|
|
37
|
+
fieldsInReturnValue: Options<ParseMediaFields>;
|
|
38
|
+
mimeType: string | null;
|
|
39
|
+
initialReaderInstance: Reader;
|
|
34
40
|
}) => {
|
|
35
41
|
onAudioTrack: OnAudioTrack | null;
|
|
36
42
|
onVideoTrack: OnVideoTrack | null;
|
|
37
|
-
emittedFields: import("../
|
|
38
|
-
fields: Partial<import("../
|
|
43
|
+
emittedFields: import("../fields").AllOptions<ParseMediaFields>;
|
|
44
|
+
fields: Partial<import("../fields").AllOptions<ParseMediaFields>>;
|
|
39
45
|
slowDurationAndFps: {
|
|
40
46
|
addVideoSample: (videoSample: import("../webcodec-sample-types").AudioOrVideoSample) => void;
|
|
41
47
|
addAudioSample: (audioSample: import("../webcodec-sample-types").AudioOrVideoSample) => void;
|
|
@@ -67,7 +73,15 @@ export declare const makeParserState: ({ hasAudioTrackHandlers, hasVideoTrackHan
|
|
|
67
73
|
stopReadingBits: () => void;
|
|
68
74
|
skipTo: (offset: number) => void;
|
|
69
75
|
addData: (newData: Uint8Array) => void;
|
|
70
|
-
counter:
|
|
76
|
+
counter: {
|
|
77
|
+
getOffset: () => number;
|
|
78
|
+
discardBytes: (bytes: number) => void;
|
|
79
|
+
increment: (bytes: number) => void;
|
|
80
|
+
getDiscardedBytes: () => number;
|
|
81
|
+
setDiscardedOffset: (bytes: number) => void;
|
|
82
|
+
getDiscardedOffset: () => number;
|
|
83
|
+
decrement: (bytes: number) => void;
|
|
84
|
+
};
|
|
71
85
|
peekB: (length: number) => void;
|
|
72
86
|
peekD: (length: number) => void;
|
|
73
87
|
getBits: (bits: number) => number;
|
|
@@ -124,6 +138,7 @@ export declare const makeParserState: ({ hasAudioTrackHandlers, hasVideoTrackHan
|
|
|
124
138
|
getFlacCodecNumber: () => number;
|
|
125
139
|
readUntilLineEnd: () => string | null;
|
|
126
140
|
getSyncSafeInt32: () => number;
|
|
141
|
+
replaceData: (newData: Uint8Array, seekTo: number) => void;
|
|
127
142
|
};
|
|
128
143
|
controller: MediaParserController;
|
|
129
144
|
mode: ParseMediaMode;
|
|
@@ -133,6 +148,14 @@ export declare const makeParserState: ({ hasAudioTrackHandlers, hasVideoTrackHan
|
|
|
133
148
|
selectM3uStreamFn: SelectM3uStreamFn;
|
|
134
149
|
selectM3uAssociatedPlaylistsFn: SelectM3uAssociatedPlaylistsFn;
|
|
135
150
|
mp4HeaderSegment: IsoBaseMediaStructure | null;
|
|
151
|
+
contentType: string | null;
|
|
152
|
+
name: string;
|
|
153
|
+
returnValue: ParseMediaResult<AllParseMediaFields>;
|
|
154
|
+
callbackFunctions: Partial<import("../options").ParseMediaCallbacksMandatory>;
|
|
155
|
+
fieldsInReturnValue: Partial<import("../fields").AllOptions<ParseMediaFields>>;
|
|
156
|
+
mimeType: string | null;
|
|
157
|
+
errored: Error | null;
|
|
158
|
+
currentReader: Reader;
|
|
136
159
|
getStructureOrNull: () => import("../parse-result").MediaParserStructureUnstable | null;
|
|
137
160
|
getStructure: () => import("../parse-result").MediaParserStructureUnstable;
|
|
138
161
|
setStructure: (value: import("../parse-result").MediaParserStructureUnstable) => void;
|
|
@@ -245,6 +268,13 @@ export declare const makeParserState: ({ hasAudioTrackHandlers, hasVideoTrackHan
|
|
|
245
268
|
setMp4HeaderSegment: (playlistUrl: string, structure: IsoBaseMediaStructure) => void;
|
|
246
269
|
getMp4HeaderSegment: (playlistUrl: string) => IsoBaseMediaStructure;
|
|
247
270
|
};
|
|
271
|
+
timings: {
|
|
272
|
+
timeIterating: number;
|
|
273
|
+
timeReadingData: number;
|
|
274
|
+
timeSeeking: number;
|
|
275
|
+
timeCheckingIfDone: number;
|
|
276
|
+
timeFreeingData: number;
|
|
277
|
+
};
|
|
248
278
|
callbacks: {
|
|
249
279
|
registerVideoSampleCallback: (id: number, callback: import("../webcodec-sample-types").OnVideoSample | null) => Promise<void>;
|
|
250
280
|
onAudioSample: (trackId: number, audioSample: import("../webcodec-sample-types").AudioOrVideoSample) => Promise<void>;
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.makeParserState = void 0;
|
|
4
|
-
const
|
|
4
|
+
const get_fields_from_callbacks_1 = require("../get-fields-from-callbacks");
|
|
5
|
+
const buffer_iterator_1 = require("../iterator/buffer-iterator");
|
|
5
6
|
const log_1 = require("../log");
|
|
6
7
|
const aac_state_1 = require("./aac-state");
|
|
7
8
|
const emitted_fields_1 = require("./emitted-fields");
|
|
@@ -15,11 +16,13 @@ const riff_1 = require("./riff");
|
|
|
15
16
|
const sample_callbacks_1 = require("./sample-callbacks");
|
|
16
17
|
const slow_duration_fps_1 = require("./slow-duration-fps");
|
|
17
18
|
const structure_1 = require("./structure");
|
|
19
|
+
const timings_1 = require("./timings");
|
|
18
20
|
const transport_stream_1 = require("./transport-stream");
|
|
19
21
|
const video_section_1 = require("./video-section");
|
|
20
22
|
const webm_1 = require("./webm");
|
|
21
|
-
const makeParserState = ({ hasAudioTrackHandlers, hasVideoTrackHandlers, controller,
|
|
23
|
+
const makeParserState = ({ hasAudioTrackHandlers, hasVideoTrackHandlers, controller, onAudioTrack, onVideoTrack, contentLength, logLevel, mode, src, readerInterface, onDiscardedData, selectM3uStreamFn, selectM3uAssociatedPlaylistsFn, mp4HeaderSegment, contentType, name, callbacks, fieldsInReturnValue, mimeType, initialReaderInstance, }) => {
|
|
22
24
|
let skippedBytes = 0;
|
|
25
|
+
const returnValue = {};
|
|
23
26
|
const iterator = (0, buffer_iterator_1.getArrayBufferIterator)(new Uint8Array([]), contentLength);
|
|
24
27
|
const increaseSkippedBytes = (bytes) => {
|
|
25
28
|
skippedBytes += bytes;
|
|
@@ -30,6 +33,8 @@ const makeParserState = ({ hasAudioTrackHandlers, hasVideoTrackHandlers, control
|
|
|
30
33
|
const slowDurationAndFps = (0, slow_duration_fps_1.slowDurationAndFpsState)();
|
|
31
34
|
const mp3Info = (0, mp3_1.makeMp3State)();
|
|
32
35
|
const images = (0, images_1.imagesState)();
|
|
36
|
+
const timings = (0, timings_1.timingsState)();
|
|
37
|
+
const errored = null;
|
|
33
38
|
const discardReadBytes = async (force) => {
|
|
34
39
|
const { bytesRemoved, removedData } = iterator.removeBytesRead(force, mode);
|
|
35
40
|
if (bytesRemoved) {
|
|
@@ -39,6 +44,10 @@ const makeParserState = ({ hasAudioTrackHandlers, hasVideoTrackHandlers, control
|
|
|
39
44
|
await onDiscardedData(removedData);
|
|
40
45
|
}
|
|
41
46
|
};
|
|
47
|
+
const fields = (0, get_fields_from_callbacks_1.getFieldsFromCallback)({
|
|
48
|
+
fields: fieldsInReturnValue,
|
|
49
|
+
callbacks,
|
|
50
|
+
});
|
|
42
51
|
return {
|
|
43
52
|
riff: (0, riff_1.riffSpecificState)(),
|
|
44
53
|
transportStream: (0, transport_stream_1.transportStreamState)(),
|
|
@@ -48,6 +57,7 @@ const makeParserState = ({ hasAudioTrackHandlers, hasVideoTrackHandlers, control
|
|
|
48
57
|
aac: (0, aac_state_1.aacState)(),
|
|
49
58
|
flac: (0, flac_state_1.flacState)(),
|
|
50
59
|
m3u: (0, m3u_state_1.m3uState)(logLevel),
|
|
60
|
+
timings,
|
|
51
61
|
callbacks: (0, sample_callbacks_1.sampleCallback)({
|
|
52
62
|
controller,
|
|
53
63
|
hasAudioTrackHandlers,
|
|
@@ -58,6 +68,8 @@ const makeParserState = ({ hasAudioTrackHandlers, hasVideoTrackHandlers, control
|
|
|
58
68
|
slowDurationAndFpsState: slowDurationAndFps,
|
|
59
69
|
structure,
|
|
60
70
|
src,
|
|
71
|
+
seekSignal: controller._internals.seekSignal,
|
|
72
|
+
logLevel,
|
|
61
73
|
}),
|
|
62
74
|
getInternalStats: () => {
|
|
63
75
|
var _a;
|
|
@@ -88,6 +100,14 @@ const makeParserState = ({ hasAudioTrackHandlers, hasVideoTrackHandlers, control
|
|
|
88
100
|
selectM3uStreamFn,
|
|
89
101
|
selectM3uAssociatedPlaylistsFn,
|
|
90
102
|
mp4HeaderSegment,
|
|
103
|
+
contentType,
|
|
104
|
+
name,
|
|
105
|
+
returnValue,
|
|
106
|
+
callbackFunctions: callbacks,
|
|
107
|
+
fieldsInReturnValue,
|
|
108
|
+
mimeType,
|
|
109
|
+
errored: errored,
|
|
110
|
+
currentReader: initialReaderInstance,
|
|
91
111
|
};
|
|
92
112
|
};
|
|
93
113
|
exports.makeParserState = makeParserState;
|
|
@@ -1,10 +1,13 @@
|
|
|
1
|
+
import type { AllOptions, Options, ParseMediaFields } from '../fields';
|
|
2
|
+
import type { LogLevel } from '../log';
|
|
1
3
|
import type { MediaParserController } from '../media-parser-controller';
|
|
2
|
-
import type {
|
|
4
|
+
import type { ParseMediaSrc } from '../options';
|
|
5
|
+
import type { SeekSignal } from '../seek-signal';
|
|
3
6
|
import type { AudioOrVideoSample, OnAudioSample, OnVideoSample } from '../webcodec-sample-types';
|
|
4
7
|
import { type KeyframesState } from './keyframes';
|
|
5
8
|
import type { SlowDurationAndFpsState } from './slow-duration-fps';
|
|
6
9
|
import type { StructureState } from './structure';
|
|
7
|
-
export declare const sampleCallback: ({ controller, hasAudioTrackHandlers, hasVideoTrackHandlers, fields, keyframes, emittedFields, slowDurationAndFpsState, structure, src, }: {
|
|
10
|
+
export declare const sampleCallback: ({ controller, hasAudioTrackHandlers, hasVideoTrackHandlers, fields, keyframes, emittedFields, slowDurationAndFpsState, structure, src, seekSignal, logLevel, }: {
|
|
8
11
|
controller: MediaParserController;
|
|
9
12
|
hasAudioTrackHandlers: boolean;
|
|
10
13
|
hasVideoTrackHandlers: boolean;
|
|
@@ -14,6 +17,8 @@ export declare const sampleCallback: ({ controller, hasAudioTrackHandlers, hasVi
|
|
|
14
17
|
slowDurationAndFpsState: SlowDurationAndFpsState;
|
|
15
18
|
structure: StructureState;
|
|
16
19
|
src: ParseMediaSrc;
|
|
20
|
+
seekSignal: SeekSignal;
|
|
21
|
+
logLevel: LogLevel;
|
|
17
22
|
}) => {
|
|
18
23
|
registerVideoSampleCallback: (id: number, callback: OnVideoSample | null) => Promise<void>;
|
|
19
24
|
onAudioSample: (trackId: number, audioSample: AudioOrVideoSample) => Promise<void>;
|
|
@@ -26,7 +31,7 @@ export declare const sampleCallback: ({ controller, hasAudioTrackHandlers, hasVi
|
|
|
26
31
|
tracks: {
|
|
27
32
|
hasAllTracks: () => boolean;
|
|
28
33
|
getIsDone: () => boolean;
|
|
29
|
-
setIsDone: (logLevel:
|
|
34
|
+
setIsDone: (logLevel: LogLevel) => void;
|
|
30
35
|
addTrack: (track: import("..").Track) => void;
|
|
31
36
|
getTracks: () => import("..").Track[];
|
|
32
37
|
ensureHasTracksAtEnd: (fields: Options<ParseMediaFields>) => void;
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.sampleCallback = void 0;
|
|
4
|
+
const log_1 = require("../log");
|
|
4
5
|
const can_skip_tracks_1 = require("./can-skip-tracks");
|
|
5
6
|
const has_tracks_section_1 = require("./has-tracks-section");
|
|
6
7
|
const need_samples_for_fields_1 = require("./need-samples-for-fields");
|
|
7
|
-
const sampleCallback = ({ controller, hasAudioTrackHandlers, hasVideoTrackHandlers, fields, keyframes, emittedFields, slowDurationAndFpsState, structure, src, }) => {
|
|
8
|
+
const sampleCallback = ({ controller, hasAudioTrackHandlers, hasVideoTrackHandlers, fields, keyframes, emittedFields, slowDurationAndFpsState, structure, src, seekSignal, logLevel, }) => {
|
|
8
9
|
const videoSampleCallbacks = {};
|
|
9
10
|
const audioSampleCallbacks = {};
|
|
10
11
|
const queuedAudioSamples = {};
|
|
@@ -42,7 +43,13 @@ const sampleCallback = ({ controller, hasAudioTrackHandlers, hasVideoTrackHandle
|
|
|
42
43
|
samplesForTrack[trackId]++;
|
|
43
44
|
// If we emit samples with data length 0, Chrome will fail
|
|
44
45
|
if (callback) {
|
|
45
|
-
|
|
46
|
+
if (seekSignal.getSeek()) {
|
|
47
|
+
log_1.Log.verbose(logLevel, 'Not emitting sample because seek is processing');
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
await callback(audioSample);
|
|
51
|
+
// TODO: work on seek request
|
|
52
|
+
}
|
|
46
53
|
}
|
|
47
54
|
}
|
|
48
55
|
if ((0, need_samples_for_fields_1.needsToIterateOverSamples)({ emittedFields, fields })) {
|
|
@@ -65,7 +72,13 @@ const sampleCallback = ({ controller, hasAudioTrackHandlers, hasVideoTrackHandle
|
|
|
65
72
|
const callback = videoSampleCallbacks[trackId];
|
|
66
73
|
// If we emit samples with data 0, Chrome will fail
|
|
67
74
|
if (callback) {
|
|
68
|
-
|
|
75
|
+
if (seekSignal.getSeek()) {
|
|
76
|
+
log_1.Log.verbose(logLevel, 'Not emitting sample because seek is processing');
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
await callback(videoSample);
|
|
80
|
+
// TODO: work on seek request
|
|
81
|
+
}
|
|
69
82
|
}
|
|
70
83
|
}
|
|
71
84
|
if ((0, need_samples_for_fields_1.needsToIterateOverSamples)({
|