@remotion/media-parser 4.0.282 → 4.0.284
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/m3u/iterate-over-segment-files.js +2 -1
- package/dist/containers/transport-stream/process-audio.d.ts +21 -0
- package/dist/containers/transport-stream/process-audio.js +54 -0
- package/dist/containers/transport-stream/process-sample-if-possible.d.ts +2 -0
- package/dist/containers/transport-stream/process-sample-if-possible.js +62 -0
- package/dist/containers/transport-stream/process-video.d.ts +20 -0
- package/dist/containers/transport-stream/process-video.js +39 -0
- package/dist/containers/transport-stream/start-offset.d.ts +4 -0
- package/dist/containers/transport-stream/start-offset.js +13 -0
- package/dist/controller/emitter.js +2 -1
- package/dist/esm/index.mjs +16 -4
- package/dist/esm/server-worker.mjs +12 -1
- package/dist/esm/worker-server-entry.mjs +16 -4
- package/dist/esm/worker-web-entry.mjs +16 -4
- package/dist/esm/worker.mjs +12 -1
- package/dist/index.d.ts +1 -0
- package/dist/parse-media-on-worker-entry.js +3 -6
- package/dist/readers/state/aac-state.d.ts +13 -0
- package/dist/readers/state/aac-state.js +17 -0
- package/dist/readers/state/can-skip-tracks.d.ts +16 -0
- package/dist/readers/state/can-skip-tracks.js +60 -0
- package/dist/readers/state/current-reader.d.ts +6 -0
- package/dist/readers/state/current-reader.js +13 -0
- package/dist/readers/state/emitted-fields.d.ts +1 -0
- package/dist/readers/state/emitted-fields.js +37 -0
- package/dist/readers/state/flac-state.d.ts +4 -0
- package/dist/readers/state/flac-state.js +13 -0
- package/dist/readers/state/has-tracks-section.d.ts +14 -0
- package/dist/readers/state/has-tracks-section.js +37 -0
- package/dist/readers/state/images.d.ts +9 -0
- package/dist/readers/state/images.js +14 -0
- package/dist/readers/state/iso-base-media/cached-sample-positions.d.ts +12 -0
- package/dist/readers/state/iso-base-media/cached-sample-positions.js +46 -0
- package/dist/readers/state/iso-base-media/iso-state.d.ts +24 -0
- package/dist/readers/state/iso-base-media/iso-state.js +20 -0
- package/dist/readers/state/iso-base-media/lazy-mfra-load.d.ts +13 -0
- package/dist/readers/state/iso-base-media/lazy-mfra-load.js +29 -0
- package/dist/readers/state/iso-base-media/moov-box.d.ts +5 -0
- package/dist/readers/state/iso-base-media/moov-box.js +13 -0
- package/dist/readers/state/keyframes.d.ts +6 -0
- package/dist/readers/state/keyframes.js +15 -0
- package/dist/readers/state/m3u-state.d.ts +44 -0
- package/dist/readers/state/m3u-state.js +124 -0
- package/dist/readers/state/may-skip-video-data.d.ts +4 -0
- package/dist/readers/state/may-skip-video-data.js +18 -0
- package/dist/readers/state/mp3.d.ts +15 -0
- package/dist/readers/state/mp3.js +19 -0
- package/dist/readers/state/need-samples-for-fields.d.ts +6 -0
- package/dist/readers/state/need-samples-for-fields.js +39 -0
- package/dist/readers/state/parser-state.d.ts +252 -0
- package/dist/readers/state/parser-state.js +124 -0
- package/dist/readers/state/riff.d.ts +10 -0
- package/dist/readers/state/riff.js +32 -0
- package/dist/readers/state/sample-callbacks.d.ts +44 -0
- package/dist/readers/state/sample-callbacks.js +118 -0
- package/dist/readers/state/seek-infinite-loop.d.ts +5 -0
- package/dist/readers/state/seek-infinite-loop.js +22 -0
- package/dist/readers/state/slow-duration-fps.d.ts +11 -0
- package/dist/readers/state/slow-duration-fps.js +86 -0
- package/dist/readers/state/structure.d.ts +15 -0
- package/dist/readers/state/structure.js +78 -0
- package/dist/readers/state/timings.d.ts +8 -0
- package/dist/readers/state/timings.js +13 -0
- package/dist/readers/state/transport-stream/last-emitted-sample.d.ts +6 -0
- package/dist/readers/state/transport-stream/last-emitted-sample.js +16 -0
- package/dist/readers/state/transport-stream/next-pes-header-store.d.ts +6 -0
- package/dist/readers/state/transport-stream/next-pes-header-store.js +18 -0
- package/dist/readers/state/transport-stream/start-offset.d.ts +4 -0
- package/dist/readers/state/transport-stream/start-offset.js +13 -0
- package/dist/readers/state/transport-stream/transport-stream.d.ts +19 -0
- package/dist/readers/state/transport-stream/transport-stream.js +25 -0
- package/dist/readers/state/video-section.d.ts +33 -0
- package/dist/readers/state/video-section.js +65 -0
- package/dist/readers/state/webm.d.ts +28 -0
- package/dist/readers/state/webm.js +109 -0
- package/dist/state/iso-base-media/cached-sample-positions.d.ts +1 -1
- package/dist/state/parser-state.d.ts +1 -0
- package/dist/state/transport-stream/last-emitted-sample.d.ts +6 -0
- package/dist/state/transport-stream/last-emitted-sample.js +16 -0
- package/dist/state/transport-stream/next-pes-header-store.d.ts +6 -0
- package/dist/state/transport-stream/next-pes-header-store.js +18 -0
- package/dist/state/transport-stream/start-offset.d.ts +4 -0
- package/dist/state/transport-stream/start-offset.js +13 -0
- package/dist/state/transport-stream/transport-stream.d.ts +19 -0
- package/dist/state/transport-stream/transport-stream.js +24 -0
- package/dist/state/uml.d.ts +32 -0
- package/dist/state/uml.js +52 -0
- package/dist/state/video-section.d.ts +1 -0
- package/dist/state/video-section.js +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/with-resolvers.d.ts +5 -0
- package/dist/with-resolvers.js +13 -0
- package/dist/worker-server.js +2 -1
- package/dist/worker.js +1 -5
- package/package.json +3 -3
|
@@ -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) => 5 | 1 | 2 | 3 | 4 | 6 | 7 | 8;
|
|
@@ -4,6 +4,7 @@ exports.iteratorOverSegmentFiles = void 0;
|
|
|
4
4
|
const media_parser_controller_1 = require("../../controller/media-parser-controller");
|
|
5
5
|
const forward_controller_1 = require("../../forward-controller");
|
|
6
6
|
const parse_media_1 = require("../../parse-media");
|
|
7
|
+
const with_resolvers_1 = require("../../with-resolvers");
|
|
7
8
|
const get_chunks_1 = require("./get-chunks");
|
|
8
9
|
const get_playlist_1 = require("./get-playlist");
|
|
9
10
|
const iteratorOverSegmentFiles = async ({ structure, onVideoTrack, m3uState, onAudioTrack, onDoneWithTracks, playlistUrl, logLevel, parentController, onInitialProgress, readerInterface, }) => {
|
|
@@ -20,7 +21,7 @@ const iteratorOverSegmentFiles = async ({ structure, onVideoTrack, m3uState, onA
|
|
|
20
21
|
const makeContinuationFn = () => {
|
|
21
22
|
return {
|
|
22
23
|
continue() {
|
|
23
|
-
const { promise, reject, resolve } =
|
|
24
|
+
const { promise, reject, resolve } = (0, with_resolvers_1.withResolvers)();
|
|
24
25
|
resolver = resolve;
|
|
25
26
|
rejector = reject;
|
|
26
27
|
childController.resume();
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { LogLevel } from '../../log';
|
|
2
|
+
import type { TransportStreamStructure } from '../../parse-result';
|
|
3
|
+
import type { SampleCallbacks } from '../../state/sample-callbacks';
|
|
4
|
+
import type { TransportStreamState } from '../../state/transport-stream/transport-stream';
|
|
5
|
+
import type { OnAudioTrack, OnVideoTrack } from '../../webcodec-sample-types';
|
|
6
|
+
import type { TransportStreamEntry } from './parse-pmt';
|
|
7
|
+
import type { TransportStreamPacketBuffer } from './process-stream-buffers';
|
|
8
|
+
export declare const canProcessAudio: ({ streamBuffer, }: {
|
|
9
|
+
streamBuffer: TransportStreamPacketBuffer;
|
|
10
|
+
}) => boolean;
|
|
11
|
+
export declare const processAudio: ({ transportStreamEntry, structure, offset, sampleCallbacks, logLevel, onAudioTrack, onVideoTrack, transportStream, makeSamplesStartAtZero, }: {
|
|
12
|
+
transportStreamEntry: TransportStreamEntry;
|
|
13
|
+
structure: TransportStreamStructure;
|
|
14
|
+
sampleCallbacks: SampleCallbacks;
|
|
15
|
+
logLevel: LogLevel;
|
|
16
|
+
onAudioTrack: OnAudioTrack | null;
|
|
17
|
+
onVideoTrack: OnVideoTrack | null;
|
|
18
|
+
transportStream: TransportStreamState;
|
|
19
|
+
offset: number;
|
|
20
|
+
makeSamplesStartAtZero: boolean;
|
|
21
|
+
}) => Promise<void>;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.processAudio = exports.canProcessAudio = void 0;
|
|
4
|
+
const adts_header_1 = require("./adts-header");
|
|
5
|
+
const process_stream_buffers_1 = require("./process-stream-buffers");
|
|
6
|
+
const canProcessAudio = ({ streamBuffer, }) => {
|
|
7
|
+
var _a, _b;
|
|
8
|
+
const expectedLength = (_b = (_a = (0, adts_header_1.readAdtsHeader)(streamBuffer.getBuffer())) === null || _a === void 0 ? void 0 : _a.frameLength) !== null && _b !== void 0 ? _b : null;
|
|
9
|
+
if (expectedLength === null) {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
if (expectedLength > streamBuffer.getBuffer().length) {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
return true;
|
|
16
|
+
};
|
|
17
|
+
exports.canProcessAudio = canProcessAudio;
|
|
18
|
+
const processAudio = async ({ transportStreamEntry, structure, offset, sampleCallbacks, logLevel, onAudioTrack, onVideoTrack, transportStream, makeSamplesStartAtZero, }) => {
|
|
19
|
+
var _a, _b;
|
|
20
|
+
const { streamBuffers, nextPesHeaderStore: nextPesHeader } = transportStream;
|
|
21
|
+
const streamBuffer = streamBuffers.get(transportStreamEntry.pid);
|
|
22
|
+
if (!streamBuffer) {
|
|
23
|
+
throw new Error('Stream buffer not found');
|
|
24
|
+
}
|
|
25
|
+
const expectedLength = (_b = (_a = (0, adts_header_1.readAdtsHeader)(streamBuffer.getBuffer())) === null || _a === void 0 ? void 0 : _a.frameLength) !== null && _b !== void 0 ? _b : null;
|
|
26
|
+
if (expectedLength === null) {
|
|
27
|
+
throw new Error('Expected length is null');
|
|
28
|
+
}
|
|
29
|
+
if (expectedLength > streamBuffer.getBuffer().length) {
|
|
30
|
+
throw new Error('Expected length is greater than stream buffer length');
|
|
31
|
+
}
|
|
32
|
+
await (0, process_stream_buffers_1.processStreamBuffer)({
|
|
33
|
+
streamBuffer: (0, process_stream_buffers_1.makeTransportStreamPacketBuffer)({
|
|
34
|
+
buffers: streamBuffer.getBuffer().slice(0, expectedLength),
|
|
35
|
+
offset,
|
|
36
|
+
pesHeader: streamBuffer.pesHeader,
|
|
37
|
+
}),
|
|
38
|
+
programId: transportStreamEntry.pid,
|
|
39
|
+
structure,
|
|
40
|
+
sampleCallbacks,
|
|
41
|
+
logLevel,
|
|
42
|
+
onAudioTrack,
|
|
43
|
+
onVideoTrack,
|
|
44
|
+
transportStream,
|
|
45
|
+
makeSamplesStartAtZero,
|
|
46
|
+
});
|
|
47
|
+
const rest = streamBuffer.getBuffer().slice(expectedLength);
|
|
48
|
+
streamBuffers.set(transportStreamEntry.pid, (0, process_stream_buffers_1.makeTransportStreamPacketBuffer)({
|
|
49
|
+
buffers: rest,
|
|
50
|
+
pesHeader: nextPesHeader.getNextPesHeader(),
|
|
51
|
+
offset,
|
|
52
|
+
}));
|
|
53
|
+
};
|
|
54
|
+
exports.processAudio = processAudio;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.processSampleIfPossible = void 0;
|
|
4
|
+
const process_audio_1 = require("./process-audio");
|
|
5
|
+
const process_stream_buffers_1 = require("./process-stream-buffers");
|
|
6
|
+
const process_video_1 = require("./process-video");
|
|
7
|
+
const traversal_1 = require("./traversal");
|
|
8
|
+
const processSampleIfPossible = async (state) => {
|
|
9
|
+
const programMap = (0, traversal_1.findProgramMapOrNull)(state.structure.getTsStructure());
|
|
10
|
+
if (!programMap) {
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
let processed = false;
|
|
14
|
+
for (const stream of programMap.streams) {
|
|
15
|
+
const streamBuffer = state.transportStream.streamBuffers.get(stream.pid);
|
|
16
|
+
if (!streamBuffer) {
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
if (stream.streamType === 27) {
|
|
20
|
+
if ((0, process_video_1.canProcessVideo)({ streamBuffer })) {
|
|
21
|
+
const rest = await (0, process_video_1.processVideo)({
|
|
22
|
+
programId: stream.pid,
|
|
23
|
+
structure: state.structure.getTsStructure(),
|
|
24
|
+
streamBuffer,
|
|
25
|
+
sampleCallbacks: state.callbacks,
|
|
26
|
+
logLevel: state.logLevel,
|
|
27
|
+
onAudioTrack: state.onAudioTrack,
|
|
28
|
+
onVideoTrack: state.onVideoTrack,
|
|
29
|
+
transportStream: state.transportStream,
|
|
30
|
+
makeSamplesStartAtZero: state.makeSamplesStartAtZero,
|
|
31
|
+
});
|
|
32
|
+
state.transportStream.streamBuffers.delete(stream.pid);
|
|
33
|
+
state.transportStream.streamBuffers.set(stream.pid, (0, process_stream_buffers_1.makeTransportStreamPacketBuffer)({
|
|
34
|
+
pesHeader: state.transportStream.nextPesHeaderStore.getNextPesHeader(),
|
|
35
|
+
buffers: rest,
|
|
36
|
+
offset: state.iterator.counter.getOffset(),
|
|
37
|
+
}));
|
|
38
|
+
processed = true;
|
|
39
|
+
break;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (stream.streamType === 15) {
|
|
43
|
+
if ((0, process_audio_1.canProcessAudio)({ streamBuffer })) {
|
|
44
|
+
await (0, process_audio_1.processAudio)({
|
|
45
|
+
structure: state.structure.getTsStructure(),
|
|
46
|
+
offset: state.iterator.counter.getOffset(),
|
|
47
|
+
sampleCallbacks: state.callbacks,
|
|
48
|
+
logLevel: state.logLevel,
|
|
49
|
+
onAudioTrack: state.onAudioTrack,
|
|
50
|
+
onVideoTrack: state.onVideoTrack,
|
|
51
|
+
transportStream: state.transportStream,
|
|
52
|
+
makeSamplesStartAtZero: state.makeSamplesStartAtZero,
|
|
53
|
+
transportStreamEntry: stream,
|
|
54
|
+
});
|
|
55
|
+
processed = true;
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return processed;
|
|
61
|
+
};
|
|
62
|
+
exports.processSampleIfPossible = processSampleIfPossible;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { LogLevel } from '../../log';
|
|
2
|
+
import type { TransportStreamStructure } from '../../parse-result';
|
|
3
|
+
import type { SampleCallbacks } from '../../state/sample-callbacks';
|
|
4
|
+
import type { TransportStreamState } from '../../state/transport-stream/transport-stream';
|
|
5
|
+
import type { OnAudioTrack, OnVideoTrack } from '../../webcodec-sample-types';
|
|
6
|
+
import type { TransportStreamPacketBuffer } from './process-stream-buffers';
|
|
7
|
+
export declare const canProcessVideo: ({ streamBuffer, }: {
|
|
8
|
+
streamBuffer: TransportStreamPacketBuffer;
|
|
9
|
+
}) => boolean;
|
|
10
|
+
export declare const processVideo: ({ programId, structure, streamBuffer, sampleCallbacks, logLevel, onAudioTrack, onVideoTrack, transportStream, makeSamplesStartAtZero, }: {
|
|
11
|
+
programId: number;
|
|
12
|
+
structure: TransportStreamStructure;
|
|
13
|
+
streamBuffer: TransportStreamPacketBuffer;
|
|
14
|
+
sampleCallbacks: SampleCallbacks;
|
|
15
|
+
logLevel: LogLevel;
|
|
16
|
+
onAudioTrack: OnAudioTrack | null;
|
|
17
|
+
onVideoTrack: OnVideoTrack | null;
|
|
18
|
+
transportStream: TransportStreamState;
|
|
19
|
+
makeSamplesStartAtZero: boolean;
|
|
20
|
+
}) => Promise<Uint8Array>;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.processVideo = exports.canProcessVideo = void 0;
|
|
4
|
+
const process_stream_buffers_1 = require("./process-stream-buffers");
|
|
5
|
+
const canProcessVideo = ({ streamBuffer, }) => {
|
|
6
|
+
const indexOfSeparator = streamBuffer.get2ndSubArrayIndex();
|
|
7
|
+
if (indexOfSeparator === -1 || indexOfSeparator === 0) {
|
|
8
|
+
return false;
|
|
9
|
+
}
|
|
10
|
+
return true;
|
|
11
|
+
};
|
|
12
|
+
exports.canProcessVideo = canProcessVideo;
|
|
13
|
+
const processVideo = async ({ programId, structure, streamBuffer, sampleCallbacks, logLevel, onAudioTrack, onVideoTrack, transportStream, makeSamplesStartAtZero, }) => {
|
|
14
|
+
const indexOfSeparator = streamBuffer.get2ndSubArrayIndex();
|
|
15
|
+
if (indexOfSeparator === -1 || indexOfSeparator === 0) {
|
|
16
|
+
throw new Error('cannot process avc stream');
|
|
17
|
+
}
|
|
18
|
+
const buf = streamBuffer.getBuffer();
|
|
19
|
+
const packet = buf.slice(0, indexOfSeparator);
|
|
20
|
+
const rest = buf.slice(indexOfSeparator);
|
|
21
|
+
await (0, process_stream_buffers_1.processStreamBuffer)({
|
|
22
|
+
streamBuffer: (0, process_stream_buffers_1.makeTransportStreamPacketBuffer)({
|
|
23
|
+
offset: streamBuffer.offset,
|
|
24
|
+
pesHeader: streamBuffer.pesHeader,
|
|
25
|
+
// Replace the regular 0x00000001 with 0x00000002 to avoid confusion with other 0x00000001 (?)
|
|
26
|
+
buffers: packet,
|
|
27
|
+
}),
|
|
28
|
+
programId,
|
|
29
|
+
structure,
|
|
30
|
+
sampleCallbacks,
|
|
31
|
+
logLevel,
|
|
32
|
+
onAudioTrack,
|
|
33
|
+
onVideoTrack,
|
|
34
|
+
transportStream,
|
|
35
|
+
makeSamplesStartAtZero,
|
|
36
|
+
});
|
|
37
|
+
return rest;
|
|
38
|
+
};
|
|
39
|
+
exports.processVideo = processVideo;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.startOffsetStore = void 0;
|
|
4
|
+
const startOffsetStore = () => {
|
|
5
|
+
let offset = 0;
|
|
6
|
+
return {
|
|
7
|
+
getOffset: () => offset,
|
|
8
|
+
setOffset: (newOffset) => {
|
|
9
|
+
offset = newOffset;
|
|
10
|
+
},
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
exports.startOffsetStore = startOffsetStore;
|
|
@@ -13,6 +13,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
13
13
|
var _MediaParserEmitter_markAsReady;
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
15
|
exports.MediaParserEmitter = void 0;
|
|
16
|
+
const with_resolvers_1 = require("../with-resolvers");
|
|
16
17
|
class MediaParserEmitter {
|
|
17
18
|
constructor() {
|
|
18
19
|
this.listeners = {
|
|
@@ -51,7 +52,7 @@ class MediaParserEmitter {
|
|
|
51
52
|
this.dispatchEvent('seek', { seek });
|
|
52
53
|
});
|
|
53
54
|
};
|
|
54
|
-
const { promise, resolve } =
|
|
55
|
+
const { promise, resolve } = (0, with_resolvers_1.withResolvers)();
|
|
55
56
|
this.readyPromise = promise;
|
|
56
57
|
__classPrivateFieldSet(this, _MediaParserEmitter_markAsReady, resolve, "f");
|
|
57
58
|
}
|
package/dist/esm/index.mjs
CHANGED
|
@@ -3805,7 +3805,8 @@ var mediaSectionState = () => {
|
|
|
3805
3805
|
isCurrentByteInMediaSection,
|
|
3806
3806
|
isByteInMediaSection,
|
|
3807
3807
|
getCurrentMediaSection,
|
|
3808
|
-
getMediaSectionAssertOnlyOne
|
|
3808
|
+
getMediaSectionAssertOnlyOne,
|
|
3809
|
+
mediaSections
|
|
3809
3810
|
};
|
|
3810
3811
|
};
|
|
3811
3812
|
|
|
@@ -7166,6 +7167,17 @@ var hasBeenAborted = (error) => {
|
|
|
7166
7167
|
return error instanceof MediaParserAbortError || error.name === "MediaParserAbortError";
|
|
7167
7168
|
};
|
|
7168
7169
|
|
|
7170
|
+
// src/with-resolvers.ts
|
|
7171
|
+
var withResolvers = function() {
|
|
7172
|
+
let resolve;
|
|
7173
|
+
let reject;
|
|
7174
|
+
const promise = new Promise((res, rej) => {
|
|
7175
|
+
resolve = res;
|
|
7176
|
+
reject = rej;
|
|
7177
|
+
});
|
|
7178
|
+
return { promise, resolve, reject };
|
|
7179
|
+
};
|
|
7180
|
+
|
|
7169
7181
|
// src/controller/emitter.ts
|
|
7170
7182
|
class MediaParserEmitter {
|
|
7171
7183
|
listeners = {
|
|
@@ -7177,7 +7189,7 @@ class MediaParserEmitter {
|
|
|
7177
7189
|
readyPromise;
|
|
7178
7190
|
#markAsReady;
|
|
7179
7191
|
constructor() {
|
|
7180
|
-
const { promise, resolve } =
|
|
7192
|
+
const { promise, resolve } = withResolvers();
|
|
7181
7193
|
this.readyPromise = promise;
|
|
7182
7194
|
this.#markAsReady = resolve;
|
|
7183
7195
|
}
|
|
@@ -10337,7 +10349,7 @@ var iteratorOverSegmentFiles = async ({
|
|
|
10337
10349
|
const makeContinuationFn = () => {
|
|
10338
10350
|
return {
|
|
10339
10351
|
continue() {
|
|
10340
|
-
const { promise, reject, resolve } =
|
|
10352
|
+
const { promise, reject, resolve } = withResolvers();
|
|
10341
10353
|
resolver = resolve;
|
|
10342
10354
|
rejector = reject;
|
|
10343
10355
|
childController.resume();
|
|
@@ -14062,7 +14074,7 @@ var downloadAndParseMedia = async (options) => {
|
|
|
14062
14074
|
return returnValue;
|
|
14063
14075
|
};
|
|
14064
14076
|
// src/version.ts
|
|
14065
|
-
var VERSION = "4.0.
|
|
14077
|
+
var VERSION = "4.0.284";
|
|
14066
14078
|
|
|
14067
14079
|
// src/index.ts
|
|
14068
14080
|
var MediaParserInternals = {
|
|
@@ -1,3 +1,14 @@
|
|
|
1
|
+
// src/with-resolvers.ts
|
|
2
|
+
var withResolvers = function() {
|
|
3
|
+
let resolve;
|
|
4
|
+
let reject;
|
|
5
|
+
const promise = new Promise((res, rej) => {
|
|
6
|
+
resolve = res;
|
|
7
|
+
reject = rej;
|
|
8
|
+
});
|
|
9
|
+
return { promise, resolve, reject };
|
|
10
|
+
};
|
|
11
|
+
|
|
1
12
|
// src/errors.ts
|
|
2
13
|
class IsAGifError extends Error {
|
|
3
14
|
mimeType;
|
|
@@ -224,7 +235,7 @@ var parseMediaOnWorkerImplementation = async ({ controller, reader, ...params },
|
|
|
224
235
|
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().`);
|
|
225
236
|
}
|
|
226
237
|
post(worker, convertToWorkerPayload(params));
|
|
227
|
-
const { promise, resolve, reject } =
|
|
238
|
+
const { promise, resolve, reject } = withResolvers();
|
|
228
239
|
const onAbort = () => {
|
|
229
240
|
post(worker, { type: "request-abort" });
|
|
230
241
|
};
|
|
@@ -452,6 +452,17 @@ var defaultSelectM3uStreamFn = ({ streams }) => {
|
|
|
452
452
|
return Promise.resolve(streams[0].id);
|
|
453
453
|
};
|
|
454
454
|
|
|
455
|
+
// src/with-resolvers.ts
|
|
456
|
+
var withResolvers = function() {
|
|
457
|
+
let resolve;
|
|
458
|
+
let reject;
|
|
459
|
+
const promise = new Promise((res, rej) => {
|
|
460
|
+
resolve = res;
|
|
461
|
+
reject = rej;
|
|
462
|
+
});
|
|
463
|
+
return { promise, resolve, reject };
|
|
464
|
+
};
|
|
465
|
+
|
|
455
466
|
// src/controller/emitter.ts
|
|
456
467
|
class MediaParserEmitter {
|
|
457
468
|
listeners = {
|
|
@@ -463,7 +474,7 @@ class MediaParserEmitter {
|
|
|
463
474
|
readyPromise;
|
|
464
475
|
#markAsReady;
|
|
465
476
|
constructor() {
|
|
466
|
-
const { promise, resolve } =
|
|
477
|
+
const { promise, resolve } = withResolvers();
|
|
467
478
|
this.readyPromise = promise;
|
|
468
479
|
this.#markAsReady = resolve;
|
|
469
480
|
}
|
|
@@ -5405,7 +5416,8 @@ var mediaSectionState = () => {
|
|
|
5405
5416
|
isCurrentByteInMediaSection,
|
|
5406
5417
|
isByteInMediaSection,
|
|
5407
5418
|
getCurrentMediaSection,
|
|
5408
|
-
getMediaSectionAssertOnlyOne
|
|
5419
|
+
getMediaSectionAssertOnlyOne,
|
|
5420
|
+
mediaSections
|
|
5409
5421
|
};
|
|
5410
5422
|
};
|
|
5411
5423
|
|
|
@@ -9869,7 +9881,7 @@ var iteratorOverSegmentFiles = async ({
|
|
|
9869
9881
|
const makeContinuationFn = () => {
|
|
9870
9882
|
return {
|
|
9871
9883
|
continue() {
|
|
9872
|
-
const { promise, reject, resolve } =
|
|
9884
|
+
const { promise, reject, resolve } = withResolvers();
|
|
9873
9885
|
resolver = resolve;
|
|
9874
9886
|
rejector = reject;
|
|
9875
9887
|
childController.resume();
|
|
@@ -14166,7 +14178,7 @@ var post = (message) => {
|
|
|
14166
14178
|
var controller = mediaParserController();
|
|
14167
14179
|
var executeCallback = (payload) => {
|
|
14168
14180
|
const nonce = crypto.randomUUID();
|
|
14169
|
-
const { promise, resolve, reject } =
|
|
14181
|
+
const { promise, resolve, reject } = withResolvers();
|
|
14170
14182
|
const cb = (msg) => {
|
|
14171
14183
|
const data = msg.data;
|
|
14172
14184
|
if (data.type === "acknowledge-callback" && data.nonce === nonce) {
|
|
@@ -387,6 +387,17 @@ var defaultSelectM3uStreamFn = ({ streams }) => {
|
|
|
387
387
|
return Promise.resolve(streams[0].id);
|
|
388
388
|
};
|
|
389
389
|
|
|
390
|
+
// src/with-resolvers.ts
|
|
391
|
+
var withResolvers = function() {
|
|
392
|
+
let resolve;
|
|
393
|
+
let reject;
|
|
394
|
+
const promise = new Promise((res, rej) => {
|
|
395
|
+
resolve = res;
|
|
396
|
+
reject = rej;
|
|
397
|
+
});
|
|
398
|
+
return { promise, resolve, reject };
|
|
399
|
+
};
|
|
400
|
+
|
|
390
401
|
// src/controller/emitter.ts
|
|
391
402
|
class MediaParserEmitter {
|
|
392
403
|
listeners = {
|
|
@@ -398,7 +409,7 @@ class MediaParserEmitter {
|
|
|
398
409
|
readyPromise;
|
|
399
410
|
#markAsReady;
|
|
400
411
|
constructor() {
|
|
401
|
-
const { promise, resolve } =
|
|
412
|
+
const { promise, resolve } = withResolvers();
|
|
402
413
|
this.readyPromise = promise;
|
|
403
414
|
this.#markAsReady = resolve;
|
|
404
415
|
}
|
|
@@ -5340,7 +5351,8 @@ var mediaSectionState = () => {
|
|
|
5340
5351
|
isCurrentByteInMediaSection,
|
|
5341
5352
|
isByteInMediaSection,
|
|
5342
5353
|
getCurrentMediaSection,
|
|
5343
|
-
getMediaSectionAssertOnlyOne
|
|
5354
|
+
getMediaSectionAssertOnlyOne,
|
|
5355
|
+
mediaSections
|
|
5344
5356
|
};
|
|
5345
5357
|
};
|
|
5346
5358
|
|
|
@@ -9782,7 +9794,7 @@ var iteratorOverSegmentFiles = async ({
|
|
|
9782
9794
|
const makeContinuationFn = () => {
|
|
9783
9795
|
return {
|
|
9784
9796
|
continue() {
|
|
9785
|
-
const { promise, reject, resolve } =
|
|
9797
|
+
const { promise, reject, resolve } = withResolvers();
|
|
9786
9798
|
resolver = resolve;
|
|
9787
9799
|
rejector = reject;
|
|
9788
9800
|
childController.resume();
|
|
@@ -14079,7 +14091,7 @@ var post = (message) => {
|
|
|
14079
14091
|
var controller = mediaParserController();
|
|
14080
14092
|
var executeCallback = (payload) => {
|
|
14081
14093
|
const nonce = crypto.randomUUID();
|
|
14082
|
-
const { promise, resolve, reject } =
|
|
14094
|
+
const { promise, resolve, reject } = withResolvers();
|
|
14083
14095
|
const cb = (msg) => {
|
|
14084
14096
|
const data = msg.data;
|
|
14085
14097
|
if (data.type === "acknowledge-callback" && data.nonce === nonce) {
|
package/dist/esm/worker.mjs
CHANGED
|
@@ -1,3 +1,14 @@
|
|
|
1
|
+
// src/with-resolvers.ts
|
|
2
|
+
var withResolvers = function() {
|
|
3
|
+
let resolve;
|
|
4
|
+
let reject;
|
|
5
|
+
const promise = new Promise((res, rej) => {
|
|
6
|
+
resolve = res;
|
|
7
|
+
reject = rej;
|
|
8
|
+
});
|
|
9
|
+
return { promise, resolve, reject };
|
|
10
|
+
};
|
|
11
|
+
|
|
1
12
|
// src/errors.ts
|
|
2
13
|
class IsAGifError extends Error {
|
|
3
14
|
mimeType;
|
|
@@ -224,7 +235,7 @@ var parseMediaOnWorkerImplementation = async ({ controller, reader, ...params },
|
|
|
224
235
|
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().`);
|
|
225
236
|
}
|
|
226
237
|
post(worker, convertToWorkerPayload(params));
|
|
227
|
-
const { promise, resolve, reject } =
|
|
238
|
+
const { promise, resolve, reject } = withResolvers();
|
|
228
239
|
const onAbort = () => {
|
|
229
240
|
post(worker, { type: "request-abort" });
|
|
230
241
|
};
|
package/dist/index.d.ts
CHANGED
|
@@ -944,6 +944,7 @@ export declare const MediaParserInternals: {
|
|
|
944
944
|
mediaSections: import("./state/video-section").MediaSection[];
|
|
945
945
|
}) => import("./state/video-section").MediaSection | null;
|
|
946
946
|
getMediaSectionAssertOnlyOne: () => import("./state/video-section").MediaSection;
|
|
947
|
+
mediaSections: import("./state/video-section").MediaSection[];
|
|
947
948
|
};
|
|
948
949
|
logLevel: "trace" | "verbose" | "info" | "warn" | "error";
|
|
949
950
|
iterator: {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.parseMediaOnWorkerImplementation = void 0;
|
|
4
|
+
const with_resolvers_1 = require("./with-resolvers");
|
|
4
5
|
const serialize_error_1 = require("./worker/serialize-error");
|
|
5
6
|
const convertToWorkerPayload = (
|
|
6
7
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
@@ -48,16 +49,12 @@ payload) => {
|
|
|
48
49
|
const post = (worker, payload) => {
|
|
49
50
|
worker.postMessage(payload);
|
|
50
51
|
};
|
|
51
|
-
const parseMediaOnWorkerImplementation = async ({ controller, reader, ...params },
|
|
52
|
-
if (typeof Worker === 'undefined') {
|
|
53
|
-
throw new Error('"Worker" is not available. Cannot call workerClient()');
|
|
54
|
-
}
|
|
52
|
+
const parseMediaOnWorkerImplementation = async ({ controller, reader, ...params }, worker, apiName) => {
|
|
55
53
|
if (reader) {
|
|
56
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().`);
|
|
57
55
|
}
|
|
58
|
-
const worker = new Worker(workerUrlEntry);
|
|
59
56
|
post(worker, convertToWorkerPayload(params));
|
|
60
|
-
const { promise, resolve, reject } =
|
|
57
|
+
const { promise, resolve, reject } = (0, with_resolvers_1.withResolvers)();
|
|
61
58
|
const onAbort = () => {
|
|
62
59
|
post(worker, { type: 'request-abort' });
|
|
63
60
|
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
type AacSamplePosition = {
|
|
2
|
+
offset: number;
|
|
3
|
+
index: number;
|
|
4
|
+
size: number;
|
|
5
|
+
};
|
|
6
|
+
export declare const aacState: () => {
|
|
7
|
+
addSample: ({ offset, size }: {
|
|
8
|
+
offset: number;
|
|
9
|
+
size: number;
|
|
10
|
+
}) => AacSamplePosition;
|
|
11
|
+
getSamples: () => AacSamplePosition[];
|
|
12
|
+
};
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.aacState = void 0;
|
|
4
|
+
const aacState = () => {
|
|
5
|
+
const samples = [];
|
|
6
|
+
return {
|
|
7
|
+
addSample: ({ offset, size }) => {
|
|
8
|
+
if (samples.find((s) => s.offset === offset)) {
|
|
9
|
+
throw new Error('Duplicate sample');
|
|
10
|
+
}
|
|
11
|
+
samples.push({ offset, index: samples.length, size });
|
|
12
|
+
return samples[samples.length - 1];
|
|
13
|
+
},
|
|
14
|
+
getSamples: () => samples,
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
exports.aacState = aacState;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Options, ParseMediaFields } from '../fields';
|
|
2
|
+
import type { MediaParserStructureUnstable } from '../parse-result';
|
|
3
|
+
import type { StructureState } from './structure';
|
|
4
|
+
export declare const needsTracksForField: ({ field, structure, }: {
|
|
5
|
+
field: keyof Options<ParseMediaFields>;
|
|
6
|
+
structure: MediaParserStructureUnstable | null;
|
|
7
|
+
}) => boolean;
|
|
8
|
+
export declare const makeCanSkipTracksState: ({ hasAudioTrackHandlers, fields, hasVideoTrackHandlers, structure, }: {
|
|
9
|
+
hasAudioTrackHandlers: boolean;
|
|
10
|
+
hasVideoTrackHandlers: boolean;
|
|
11
|
+
fields: Options<ParseMediaFields>;
|
|
12
|
+
structure: StructureState;
|
|
13
|
+
}) => {
|
|
14
|
+
canSkipTracks: () => boolean;
|
|
15
|
+
};
|
|
16
|
+
export type CanSkipTracksState = ReturnType<typeof makeCanSkipTracksState>;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.makeCanSkipTracksState = exports.needsTracksForField = void 0;
|
|
4
|
+
const needsTracksForField = ({ field, structure, }) => {
|
|
5
|
+
if (field === 'dimensions') {
|
|
6
|
+
if ((structure === null || structure === void 0 ? void 0 : structure.type) === 'riff') {
|
|
7
|
+
return false;
|
|
8
|
+
}
|
|
9
|
+
return true;
|
|
10
|
+
}
|
|
11
|
+
if (field === 'audioCodec' ||
|
|
12
|
+
field === 'durationInSeconds' ||
|
|
13
|
+
field === 'slowDurationInSeconds' ||
|
|
14
|
+
field === 'slowFps' ||
|
|
15
|
+
field === 'fps' ||
|
|
16
|
+
field === 'isHdr' ||
|
|
17
|
+
field === 'rotation' ||
|
|
18
|
+
field === 'structure' ||
|
|
19
|
+
field === 'tracks' ||
|
|
20
|
+
field === 'unrotatedDimensions' ||
|
|
21
|
+
field === 'videoCodec' ||
|
|
22
|
+
field === 'metadata' ||
|
|
23
|
+
field === 'location' ||
|
|
24
|
+
field === 'slowKeyframes' ||
|
|
25
|
+
field === 'slowNumberOfFrames' ||
|
|
26
|
+
field === 'keyframes' ||
|
|
27
|
+
field === 'images' ||
|
|
28
|
+
field === 'sampleRate' ||
|
|
29
|
+
field === 'numberOfAudioChannels' ||
|
|
30
|
+
field === 'slowAudioBitrate' ||
|
|
31
|
+
field === 'slowVideoBitrate' ||
|
|
32
|
+
field === 'm3uStreams') {
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
if (field === 'container' ||
|
|
36
|
+
field === 'internalStats' ||
|
|
37
|
+
field === 'mimeType' ||
|
|
38
|
+
field === 'name' ||
|
|
39
|
+
field === 'size') {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
throw new Error(`field not implemeted ${field}`);
|
|
43
|
+
};
|
|
44
|
+
exports.needsTracksForField = needsTracksForField;
|
|
45
|
+
const makeCanSkipTracksState = ({ hasAudioTrackHandlers, fields, hasVideoTrackHandlers, structure, }) => {
|
|
46
|
+
return {
|
|
47
|
+
canSkipTracks: () => {
|
|
48
|
+
if (hasAudioTrackHandlers || hasVideoTrackHandlers) {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
const keys = Object.keys(fields !== null && fields !== void 0 ? fields : {});
|
|
52
|
+
const selectedKeys = keys.filter((k) => fields[k]);
|
|
53
|
+
return !selectedKeys.some((k) => (0, exports.needsTracksForField)({
|
|
54
|
+
field: k,
|
|
55
|
+
structure: structure.getStructureOrNull(),
|
|
56
|
+
}));
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
};
|
|
60
|
+
exports.makeCanSkipTracksState = makeCanSkipTracksState;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.currentReader = void 0;
|
|
4
|
+
const currentReader = (initialReader) => {
|
|
5
|
+
let current = initialReader;
|
|
6
|
+
return {
|
|
7
|
+
getCurrent: () => current,
|
|
8
|
+
setCurrent: (newReader) => {
|
|
9
|
+
current = newReader;
|
|
10
|
+
},
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
exports.currentReader = currentReader;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const emittedState: () => AllOptions<ParseMediaFields>;
|