@remotion/media-parser 4.0.285 → 4.0.286
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/aac-codecprivate.d.ts +1 -1
- package/dist/combine-uint8-arrays.d.ts +1 -1
- package/dist/containers/aac/parse-aac.js +0 -3
- package/dist/containers/avc/create-sps-pps-data.d.ts +1 -1
- package/dist/containers/flac/get-channel-count.d.ts +1 -1
- package/dist/containers/flac/parse-flac-frame.js +0 -2
- package/dist/containers/flac/parse-streaminfo.js +0 -2
- package/dist/containers/iso-base-media/collect-sample-positions-from-trak.js +4 -3
- package/dist/containers/iso-base-media/get-moov-atom.js +0 -4
- package/dist/containers/iso-base-media/mdat/mdat.js +0 -3
- package/dist/containers/iso-base-media/mfra/get-mfra-atom.d.ts +3 -3
- package/dist/containers/iso-base-media/parse-boxes.js +0 -2
- package/dist/containers/iso-base-media/process-box.d.ts +0 -2
- package/dist/containers/iso-base-media/process-box.js +1 -3
- package/dist/containers/m3u/iterate-over-segment-files.js +1 -0
- package/dist/containers/m3u/run-over-m3u.js +0 -3
- package/dist/containers/mp3/parse-mpeg-header.js +0 -3
- package/dist/containers/riff/expect-riff-box.js +0 -2
- package/dist/containers/riff/parse-movi.js +0 -3
- package/dist/containers/transport-stream/adts-header.d.ts +1 -1
- package/dist/containers/transport-stream/discard-rest-of-packet.d.ts +1 -1
- package/dist/containers/transport-stream/find-separator.d.ts +17 -1
- package/dist/containers/transport-stream/find-separator.js +6 -5
- package/dist/containers/transport-stream/get-seeking-info.d.ts +4 -0
- package/dist/containers/transport-stream/get-seeking-info.js +17 -0
- package/dist/containers/transport-stream/handle-aac-packet.d.ts +10 -3
- package/dist/containers/transport-stream/handle-aac-packet.js +21 -16
- package/dist/containers/transport-stream/handle-avc-packet.d.ts +10 -3
- package/dist/containers/transport-stream/handle-avc-packet.js +26 -17
- package/dist/containers/transport-stream/parse-packet.d.ts +8 -4
- package/dist/containers/transport-stream/parse-packet.js +15 -16
- package/dist/containers/transport-stream/parse-pes.d.ts +5 -1
- package/dist/containers/transport-stream/parse-pes.js +4 -3
- package/dist/containers/transport-stream/parse-stream-packet.d.ts +6 -6
- package/dist/containers/transport-stream/parse-stream-packet.js +10 -115
- package/dist/containers/transport-stream/parse-transport-stream.js +15 -3
- package/dist/containers/transport-stream/process-stream-buffers.d.ts +26 -6
- package/dist/containers/transport-stream/process-stream-buffers.js +77 -12
- package/dist/containers/transport-stream/traversal.d.ts +3 -1
- package/dist/containers/transport-stream/traversal.js +10 -2
- package/dist/containers/wav/parse-fmt.js +0 -2
- package/dist/containers/wav/parse-media-section.js +0 -2
- package/dist/containers/webm/cues/fetch-web-cues.d.ts +12 -0
- package/dist/containers/webm/cues/fetch-web-cues.js +32 -0
- package/dist/containers/webm/cues/format-cues.d.ts +8 -0
- package/dist/containers/webm/cues/format-cues.js +41 -0
- package/dist/containers/webm/cues/get-seeking-byte.d.ts +14 -0
- package/dist/containers/webm/cues/get-seeking-byte.js +91 -0
- package/dist/containers/webm/fetch-web-cues.d.ts +12 -0
- package/dist/containers/webm/fetch-web-cues.js +29 -0
- package/dist/containers/webm/get-byte-for-cues.d.ts +5 -0
- package/dist/containers/webm/get-byte-for-cues.js +33 -0
- package/dist/containers/webm/get-ready-tracks.d.ts +9 -4
- package/dist/containers/webm/get-ready-tracks.js +6 -6
- package/dist/containers/webm/get-sample-from-block.d.ts +3 -2
- package/dist/containers/webm/get-sample-from-block.js +9 -8
- package/dist/containers/webm/get-seeking-byte.d.ts +14 -0
- package/dist/containers/webm/get-seeking-byte.js +91 -0
- package/dist/containers/webm/get-seeking-info.d.ts +3 -0
- package/dist/containers/webm/get-seeking-info.js +17 -0
- package/dist/containers/webm/parse-ebml.d.ts +5 -4
- package/dist/containers/webm/parse-ebml.js +29 -34
- package/dist/containers/webm/parse-webm-header.js +14 -2
- package/dist/containers/webm/seek/fetch-web-cues.d.ts +12 -0
- package/dist/containers/webm/seek/fetch-web-cues.js +32 -0
- package/dist/containers/webm/seek/format-cues.d.ts +8 -0
- package/dist/containers/webm/seek/format-cues.js +42 -0
- package/dist/containers/webm/seek/get-seeking-byte.d.ts +14 -0
- package/dist/containers/webm/seek/get-seeking-byte.js +100 -0
- package/dist/containers/webm/seek/get-seeking-info.d.ts +3 -0
- package/dist/containers/webm/seek/get-seeking-info.js +17 -0
- package/dist/containers/webm/segments/all-segments.d.ts +1 -0
- package/dist/containers/webm/segments.d.ts +10 -4
- package/dist/containers/webm/segments.js +30 -12
- package/dist/containers/webm/state-for-processing.d.ts +15 -0
- package/dist/containers/webm/state-for-processing.js +14 -0
- package/dist/controller/seek-signal.d.ts +2 -2
- package/dist/download-and-parse-media.js +2 -1
- package/dist/emit-audio-sample.d.ts +2 -5
- package/dist/emit-audio-sample.js +2 -5
- package/dist/esm/index.mjs +5057 -4394
- package/dist/esm/universal.mjs +1 -1
- package/dist/esm/web.mjs +1 -1
- package/dist/esm/worker-server-entry.mjs +2327 -1664
- package/dist/esm/worker-web-entry.mjs +2327 -1664
- package/dist/file-types/detect-file-type.js +3 -1
- package/dist/get-audio-codec.d.ts +2 -1
- package/dist/get-audio-codec.js +15 -1
- package/dist/get-sample-positions-from-mp4.d.ts +3 -0
- package/dist/get-sample-positions-from-mp4.js +46 -0
- package/dist/get-seeking-byte.d.ts +19 -0
- package/dist/get-seeking-byte.js +50 -0
- package/dist/get-seeking-info.d.ts +5 -10
- package/dist/get-seeking-info.js +12 -25
- package/dist/get-tracks.js +6 -2
- package/dist/index.d.ts +44 -19
- package/dist/init-video.js +4 -3
- package/dist/internal-parse-media.js +3 -2
- package/dist/iterator/buffer-iterator.d.ts +3 -3
- package/dist/iterator/buffer-manager.d.ts +3 -3
- package/dist/log.d.ts +5 -5
- package/dist/options.d.ts +1 -0
- package/dist/parse-loop.js +0 -3
- package/dist/parse-media-on-worker-entry.d.ts +1 -1
- package/dist/parse-media.js +2 -1
- package/dist/readers/from-web-file.js +1 -1
- package/dist/register-track.d.ts +2 -5
- package/dist/register-track.js +2 -10
- package/dist/seek-backwards.js +2 -3
- package/dist/seeking-info.d.ts +14 -1
- package/dist/state/iso-base-media/cached-sample-positions.d.ts +1 -1
- package/dist/state/keyframes.js +3 -0
- package/dist/state/matroska/lazy-cues-fetch.d.ts +19 -0
- package/dist/state/matroska/lazy-cues-fetch.js +51 -0
- package/dist/state/matroska/lazy-seek-fetch.d.ts +1 -0
- package/dist/state/matroska/lazy-seek-fetch.js +5 -0
- package/dist/state/matroska/webm.d.ts +46 -0
- package/dist/state/matroska/webm.js +121 -0
- package/dist/state/matroska.d.ts +0 -0
- package/dist/state/matroska.js +1 -0
- package/dist/state/parser-state.d.ts +34 -9
- package/dist/state/parser-state.js +7 -6
- package/dist/state/sample-callbacks.d.ts +1 -1
- package/dist/state/sample-callbacks.js +9 -9
- package/dist/state/samples-observed/slow-duration-fps.d.ts +11 -0
- package/dist/state/samples-observed/slow-duration-fps.js +92 -0
- package/dist/state/seek-infinite-loop.js +12 -2
- package/dist/state/transport-stream/observed-pes-header.d.ts +13 -0
- package/dist/state/transport-stream/observed-pes-header.js +29 -0
- package/dist/state/transport-stream/pts-start-offset.d.ts +5 -0
- package/dist/state/transport-stream/pts-start-offset.js +13 -0
- package/dist/state/transport-stream/start-offset.d.ts +2 -1
- package/dist/state/transport-stream/start-offset.js +3 -3
- package/dist/state/transport-stream/transport-stream.d.ts +6 -0
- package/dist/state/transport-stream/transport-stream.js +4 -2
- package/dist/state/video-section.js +14 -2
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/work-on-seek-request.d.ts +8 -0
- package/dist/work-on-seek-request.js +24 -6
- package/dist/worker-server.js +1 -0
- package/dist/worker.d.ts +0 -1
- package/package.json +4 -4
|
@@ -1,5 +1,9 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { BufferIterator } from '../../iterator/buffer-iterator';
|
|
2
|
+
import type { TransportStreamStructure } from '../../parse-result';
|
|
3
|
+
import type { TransportStreamState } from '../../state/transport-stream/transport-stream';
|
|
2
4
|
import type { TransportStreamBox } from './boxes';
|
|
3
|
-
export declare const parsePacket: ({
|
|
4
|
-
|
|
5
|
-
|
|
5
|
+
export declare const parsePacket: ({ iterator, structure, transportStream, }: {
|
|
6
|
+
iterator: BufferIterator;
|
|
7
|
+
structure: TransportStreamStructure;
|
|
8
|
+
transportStream: TransportStreamState;
|
|
9
|
+
}) => TransportStreamBox | null;
|
|
@@ -6,8 +6,7 @@ const parse_pes_1 = require("./parse-pes");
|
|
|
6
6
|
const parse_pmt_1 = require("./parse-pmt");
|
|
7
7
|
const parse_stream_packet_1 = require("./parse-stream-packet");
|
|
8
8
|
const traversal_1 = require("./traversal");
|
|
9
|
-
const parsePacket =
|
|
10
|
-
const { iterator } = parserState;
|
|
9
|
+
const parsePacket = ({ iterator, structure, transportStream, }) => {
|
|
11
10
|
const offset = iterator.counter.getOffset();
|
|
12
11
|
const syncByte = iterator.getUint8();
|
|
13
12
|
if (syncByte !== 0x47) {
|
|
@@ -44,23 +43,23 @@ const parsePacket = async ({ parserState, }) => {
|
|
|
44
43
|
}
|
|
45
44
|
const read = iterator.counter.getOffset() - offset;
|
|
46
45
|
if (read === 188) {
|
|
47
|
-
return
|
|
46
|
+
return null;
|
|
48
47
|
}
|
|
49
|
-
const structure = parserState.structure.getTsStructure();
|
|
50
48
|
const pat = structure.boxes.find((b) => b.type === 'transport-stream-pmt-box');
|
|
51
49
|
const isPes = payloadUnitStartIndicator && (pat === null || pat === void 0 ? void 0 : pat.streams.find((e) => e.pid === programId));
|
|
52
50
|
if (isPes) {
|
|
53
|
-
const packetPes = (0, parse_pes_1.parsePes)(iterator);
|
|
54
|
-
|
|
51
|
+
const packetPes = (0, parse_pes_1.parsePes)({ iterator, offset });
|
|
52
|
+
transportStream.nextPesHeaderStore.setNextPesHeader(packetPes);
|
|
53
|
+
transportStream.observedPesHeaders.addPesHeader(packetPes);
|
|
55
54
|
}
|
|
56
55
|
else if (payloadUnitStartIndicator === 1) {
|
|
57
56
|
iterator.getUint8(); // pointerField
|
|
58
57
|
}
|
|
59
58
|
if (programId === 0) {
|
|
60
|
-
return
|
|
59
|
+
return (0, parse_pat_1.parsePat)(iterator);
|
|
61
60
|
}
|
|
62
61
|
if (programId === 17) {
|
|
63
|
-
return
|
|
62
|
+
return (0, parse_pat_1.parseSdt)(iterator);
|
|
64
63
|
}
|
|
65
64
|
// PID 17 is SDT
|
|
66
65
|
// https://de.wikipedia.org/wiki/MPEG-Transportstrom
|
|
@@ -68,17 +67,17 @@ const parsePacket = async ({ parserState, }) => {
|
|
|
68
67
|
const program = programId === 17 ? null : (0, traversal_1.getProgramForId)(structure, programId);
|
|
69
68
|
if (program) {
|
|
70
69
|
const pmt = (0, parse_pmt_1.parsePmt)(iterator);
|
|
71
|
-
return
|
|
70
|
+
return pmt;
|
|
72
71
|
}
|
|
73
|
-
const
|
|
74
|
-
if (
|
|
75
|
-
|
|
76
|
-
transportStreamEntry
|
|
77
|
-
|
|
72
|
+
const transportStreamEntry = (0, traversal_1.getStreamForId)(structure, programId);
|
|
73
|
+
if (transportStreamEntry) {
|
|
74
|
+
(0, parse_stream_packet_1.parseStream)({
|
|
75
|
+
transportStreamEntry,
|
|
76
|
+
iterator,
|
|
77
|
+
transportStream,
|
|
78
78
|
programId,
|
|
79
|
-
structure,
|
|
80
79
|
});
|
|
81
|
-
return
|
|
80
|
+
return null;
|
|
82
81
|
}
|
|
83
82
|
throw new Error('Unknown packet identifier');
|
|
84
83
|
};
|
|
@@ -4,5 +4,9 @@ export type PacketPes = {
|
|
|
4
4
|
dts: number | null;
|
|
5
5
|
pts: number;
|
|
6
6
|
priority: number;
|
|
7
|
+
offset: number;
|
|
7
8
|
};
|
|
8
|
-
export declare const parsePes: (iterator
|
|
9
|
+
export declare const parsePes: ({ iterator, offset, }: {
|
|
10
|
+
iterator: BufferIterator;
|
|
11
|
+
offset: number;
|
|
12
|
+
}) => PacketPes;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.parsePes = void 0;
|
|
4
|
-
const parsePes = (iterator) => {
|
|
4
|
+
const parsePes = ({ iterator, offset, }) => {
|
|
5
5
|
const ident = iterator.getUint24();
|
|
6
6
|
if (ident !== 0x000001) {
|
|
7
7
|
throw new Error(`Unexpected PES packet start code: ${ident.toString(16)}`);
|
|
@@ -33,7 +33,7 @@ const parsePes = (iterator) => {
|
|
|
33
33
|
iterator.getBits(1); // crc flag
|
|
34
34
|
iterator.getBits(1); // extension flag
|
|
35
35
|
const pesHeaderLength = iterator.getBits(8);
|
|
36
|
-
const
|
|
36
|
+
const offsetAfterHeader = iterator.counter.getOffset();
|
|
37
37
|
let pts = null;
|
|
38
38
|
if (!ptsPresent) {
|
|
39
39
|
throw new Error(`PTS is required`);
|
|
@@ -64,12 +64,13 @@ const parsePes = (iterator) => {
|
|
|
64
64
|
dts = (dts1 << 30) | (dts2 << 15) | dts3;
|
|
65
65
|
}
|
|
66
66
|
iterator.stopReadingBits();
|
|
67
|
-
iterator.discard(pesHeaderLength - (iterator.counter.getOffset() -
|
|
67
|
+
iterator.discard(pesHeaderLength - (iterator.counter.getOffset() - offsetAfterHeader));
|
|
68
68
|
const packet = {
|
|
69
69
|
dts,
|
|
70
70
|
pts,
|
|
71
71
|
streamId,
|
|
72
72
|
priority,
|
|
73
|
+
offset,
|
|
73
74
|
};
|
|
74
75
|
return packet;
|
|
75
76
|
};
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type {
|
|
1
|
+
import type { BufferIterator } from '../../iterator/buffer-iterator';
|
|
2
|
+
import type { TransportStreamState } from '../../state/transport-stream/transport-stream';
|
|
3
3
|
import type { TransportStreamEntry } from './parse-pmt';
|
|
4
|
-
export declare const parseStream: ({ transportStreamEntry,
|
|
4
|
+
export declare const parseStream: ({ transportStreamEntry, programId, iterator, transportStream, }: {
|
|
5
5
|
transportStreamEntry: TransportStreamEntry;
|
|
6
|
-
state: ParserState;
|
|
7
6
|
programId: number;
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
iterator: BufferIterator;
|
|
8
|
+
transportStream: TransportStreamState;
|
|
9
|
+
}) => void;
|
|
@@ -1,125 +1,20 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.parseStream = void 0;
|
|
4
|
-
const combine_uint8_arrays_1 = require("../../combine-uint8-arrays");
|
|
5
|
-
const adts_header_1 = require("./adts-header");
|
|
6
4
|
const discard_rest_of_packet_1 = require("./discard-rest-of-packet");
|
|
7
|
-
const find_separator_1 = require("./find-separator");
|
|
8
5
|
const process_stream_buffers_1 = require("./process-stream-buffers");
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
const { streamBuffers, nextPesHeaderStore: nextPesHeader } = state.transportStream;
|
|
12
|
-
while (true) {
|
|
13
|
-
const streamBuffer = streamBuffers.get(transportStreamEntry.pid);
|
|
14
|
-
if (!streamBuffer) {
|
|
15
|
-
throw new Error('Stream buffer not found');
|
|
16
|
-
}
|
|
17
|
-
const expectedLength = (_b = (_a = (0, adts_header_1.readAdtsHeader)(streamBuffer.buffer)) === null || _a === void 0 ? void 0 : _a.frameLength) !== null && _b !== void 0 ? _b : null;
|
|
18
|
-
if (expectedLength === null) {
|
|
19
|
-
break;
|
|
20
|
-
}
|
|
21
|
-
if (expectedLength > streamBuffer.buffer.length) {
|
|
22
|
-
break;
|
|
23
|
-
}
|
|
24
|
-
await (0, process_stream_buffers_1.processStreamBuffer)({
|
|
25
|
-
streamBuffer: {
|
|
26
|
-
buffer: streamBuffer.buffer.slice(0, expectedLength),
|
|
27
|
-
offset,
|
|
28
|
-
pesHeader: streamBuffer.pesHeader,
|
|
29
|
-
},
|
|
30
|
-
programId: transportStreamEntry.pid,
|
|
31
|
-
state,
|
|
32
|
-
structure,
|
|
33
|
-
});
|
|
34
|
-
const rest = streamBuffer.buffer.slice(expectedLength);
|
|
35
|
-
streamBuffers.set(transportStreamEntry.pid, {
|
|
36
|
-
buffer: rest,
|
|
37
|
-
pesHeader: nextPesHeader.getNextPesHeader(),
|
|
38
|
-
offset,
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
};
|
|
42
|
-
const parseAvcStream = async ({ programId, state, structure, streamBuffer, }) => {
|
|
43
|
-
const indexOfSeparator = (0, find_separator_1.findNthSubarrayIndex)(streamBuffer.buffer, new Uint8Array([0, 0, 1, 9]), 2);
|
|
44
|
-
if (indexOfSeparator === -1 || indexOfSeparator === 0) {
|
|
45
|
-
return null;
|
|
46
|
-
}
|
|
47
|
-
const packet = streamBuffer.buffer.slice(0, indexOfSeparator);
|
|
48
|
-
const rest = streamBuffer.buffer.slice(indexOfSeparator);
|
|
49
|
-
await (0, process_stream_buffers_1.processStreamBuffer)({
|
|
50
|
-
state,
|
|
51
|
-
streamBuffer: {
|
|
52
|
-
offset: streamBuffer.offset,
|
|
53
|
-
pesHeader: streamBuffer.pesHeader,
|
|
54
|
-
// Replace the regular 0x00000001 with 0x00000002 to avoid confusion with other 0x00000001 (?)
|
|
55
|
-
buffer: packet,
|
|
56
|
-
},
|
|
57
|
-
programId,
|
|
58
|
-
structure,
|
|
59
|
-
});
|
|
60
|
-
return rest;
|
|
61
|
-
};
|
|
62
|
-
const parseStream = async ({ transportStreamEntry, state, programId, structure, }) => {
|
|
63
|
-
const { iterator } = state;
|
|
64
|
-
let restOfPacket = (0, discard_rest_of_packet_1.getRestOfPacket)(iterator);
|
|
6
|
+
const parseStream = ({ transportStreamEntry, programId, iterator, transportStream, }) => {
|
|
7
|
+
const restOfPacket = (0, discard_rest_of_packet_1.getRestOfPacket)(iterator);
|
|
65
8
|
const offset = iterator.counter.getOffset();
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
pesHeader: nextPesHeader.getNextPesHeader(),
|
|
72
|
-
buffer: new Uint8Array([]),
|
|
73
|
-
offset,
|
|
74
|
-
});
|
|
75
|
-
}
|
|
76
|
-
const streamBuffer = streamBuffers.get(transportStreamEntry.pid);
|
|
77
|
-
streamBuffer.buffer = (0, combine_uint8_arrays_1.combineUint8Arrays)([
|
|
78
|
-
streamBuffer.buffer,
|
|
79
|
-
restOfPacket,
|
|
80
|
-
]);
|
|
81
|
-
const rest = await parseAvcStream({
|
|
82
|
-
state,
|
|
83
|
-
programId,
|
|
84
|
-
structure,
|
|
85
|
-
streamBuffer: streamBuffers.get(transportStreamEntry.pid),
|
|
86
|
-
});
|
|
87
|
-
if (rest !== null) {
|
|
88
|
-
streamBuffers.delete(transportStreamEntry.pid);
|
|
89
|
-
if (rest.length === 0) {
|
|
90
|
-
break;
|
|
91
|
-
}
|
|
92
|
-
restOfPacket = rest;
|
|
93
|
-
}
|
|
94
|
-
else {
|
|
95
|
-
break;
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
return;
|
|
99
|
-
}
|
|
100
|
-
if (transportStreamEntry.streamType === 15) {
|
|
101
|
-
const { streamBuffers, nextPesHeaderStore: nextPesHeader } = state.transportStream;
|
|
102
|
-
const streamBuffer = streamBuffers.get(transportStreamEntry.pid);
|
|
103
|
-
if (!streamBuffer) {
|
|
104
|
-
streamBuffers.set(transportStreamEntry.pid, {
|
|
105
|
-
buffer: restOfPacket,
|
|
106
|
-
pesHeader: nextPesHeader.getNextPesHeader(),
|
|
107
|
-
offset,
|
|
108
|
-
});
|
|
109
|
-
}
|
|
110
|
-
else {
|
|
111
|
-
streamBuffer.buffer = (0, combine_uint8_arrays_1.combineUint8Arrays)([
|
|
112
|
-
streamBuffer.buffer,
|
|
113
|
-
restOfPacket,
|
|
114
|
-
]);
|
|
115
|
-
}
|
|
116
|
-
return parseAdtsStream({
|
|
117
|
-
transportStreamEntry,
|
|
118
|
-
state,
|
|
119
|
-
structure,
|
|
9
|
+
const { streamBuffers, nextPesHeaderStore: nextPesHeader } = transportStream;
|
|
10
|
+
if (!streamBuffers.has(transportStreamEntry.pid)) {
|
|
11
|
+
streamBuffers.set(programId, (0, process_stream_buffers_1.makeTransportStreamPacketBuffer)({
|
|
12
|
+
pesHeader: nextPesHeader.getNextPesHeader(),
|
|
13
|
+
buffers: null,
|
|
120
14
|
offset,
|
|
121
|
-
});
|
|
15
|
+
}));
|
|
122
16
|
}
|
|
123
|
-
|
|
17
|
+
const streamBuffer = streamBuffers.get(transportStreamEntry.pid);
|
|
18
|
+
streamBuffer.addBuffer(restOfPacket);
|
|
124
19
|
};
|
|
125
20
|
exports.parseStream = parseStream;
|
|
@@ -2,23 +2,35 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.parseTransportStream = void 0;
|
|
4
4
|
const parse_packet_1 = require("./parse-packet");
|
|
5
|
+
const process_sample_if_possible_1 = require("./process-sample-if-possible");
|
|
5
6
|
const process_stream_buffers_1 = require("./process-stream-buffers");
|
|
6
7
|
const parseTransportStream = async (state) => {
|
|
7
8
|
const structure = state.structure.getTsStructure();
|
|
9
|
+
const processed = await (0, process_sample_if_possible_1.processSampleIfPossible)(state);
|
|
10
|
+
if (processed) {
|
|
11
|
+
return Promise.resolve(null);
|
|
12
|
+
}
|
|
8
13
|
const { iterator } = state;
|
|
9
14
|
if (iterator.bytesRemaining() < 188) {
|
|
10
15
|
return Promise.resolve(null);
|
|
11
16
|
}
|
|
12
|
-
const packet =
|
|
13
|
-
|
|
17
|
+
const packet = (0, parse_packet_1.parsePacket)({
|
|
18
|
+
iterator,
|
|
19
|
+
structure,
|
|
20
|
+
transportStream: state.transportStream,
|
|
14
21
|
});
|
|
15
22
|
if (packet) {
|
|
16
23
|
structure.boxes.push(packet);
|
|
17
24
|
}
|
|
18
25
|
if (iterator.bytesRemaining() === 0) {
|
|
19
26
|
await (0, process_stream_buffers_1.processFinalStreamBuffers)({
|
|
20
|
-
state,
|
|
27
|
+
transportStream: state.transportStream,
|
|
21
28
|
structure,
|
|
29
|
+
sampleCallbacks: state.callbacks,
|
|
30
|
+
logLevel: state.logLevel,
|
|
31
|
+
onAudioTrack: state.onAudioTrack,
|
|
32
|
+
onVideoTrack: state.onVideoTrack,
|
|
33
|
+
makeSamplesStartAtZero: state.makeSamplesStartAtZero,
|
|
22
34
|
});
|
|
23
35
|
}
|
|
24
36
|
return Promise.resolve(null);
|
|
@@ -1,19 +1,39 @@
|
|
|
1
|
+
import type { LogLevel } from '../../log';
|
|
1
2
|
import type { TransportStreamStructure } from '../../parse-result';
|
|
2
|
-
import type {
|
|
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';
|
|
3
6
|
import type { PacketPes } from './parse-pes';
|
|
4
7
|
export type TransportStreamPacketBuffer = {
|
|
5
|
-
buffer: Uint8Array;
|
|
6
8
|
pesHeader: PacketPes;
|
|
7
9
|
offset: number;
|
|
10
|
+
getBuffer: () => Uint8Array;
|
|
11
|
+
addBuffer: (buffer: Uint8Array) => void;
|
|
12
|
+
get2ndSubArrayIndex: () => number;
|
|
8
13
|
};
|
|
14
|
+
export declare const makeTransportStreamPacketBuffer: ({ buffers, pesHeader, offset, }: {
|
|
15
|
+
buffers: Uint8Array | null;
|
|
16
|
+
pesHeader: PacketPes;
|
|
17
|
+
offset: number;
|
|
18
|
+
}) => TransportStreamPacketBuffer;
|
|
9
19
|
export type StreamBufferMap = Map<number, TransportStreamPacketBuffer>;
|
|
10
|
-
export declare const processStreamBuffer: ({ streamBuffer,
|
|
20
|
+
export declare const processStreamBuffer: ({ streamBuffer, programId, structure, sampleCallbacks, logLevel, onAudioTrack, onVideoTrack, transportStream, makeSamplesStartAtZero, }: {
|
|
11
21
|
streamBuffer: TransportStreamPacketBuffer;
|
|
12
|
-
state: ParserState;
|
|
13
22
|
programId: number;
|
|
14
23
|
structure: TransportStreamStructure;
|
|
24
|
+
sampleCallbacks: SampleCallbacks;
|
|
25
|
+
logLevel: LogLevel;
|
|
26
|
+
onAudioTrack: OnAudioTrack | null;
|
|
27
|
+
onVideoTrack: OnVideoTrack | null;
|
|
28
|
+
transportStream: TransportStreamState;
|
|
29
|
+
makeSamplesStartAtZero: boolean;
|
|
15
30
|
}) => Promise<void>;
|
|
16
|
-
export declare const processFinalStreamBuffers: ({
|
|
17
|
-
state: ParserState;
|
|
31
|
+
export declare const processFinalStreamBuffers: ({ structure, sampleCallbacks, logLevel, onAudioTrack, onVideoTrack, transportStream, makeSamplesStartAtZero, }: {
|
|
18
32
|
structure: TransportStreamStructure;
|
|
33
|
+
sampleCallbacks: SampleCallbacks;
|
|
34
|
+
logLevel: LogLevel;
|
|
35
|
+
onAudioTrack: OnAudioTrack | null;
|
|
36
|
+
onVideoTrack: OnVideoTrack | null;
|
|
37
|
+
transportStream: TransportStreamState;
|
|
38
|
+
makeSamplesStartAtZero: boolean;
|
|
19
39
|
}) => Promise<void>;
|
|
@@ -1,52 +1,117 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.processFinalStreamBuffers = exports.processStreamBuffer = void 0;
|
|
3
|
+
exports.processFinalStreamBuffers = exports.processStreamBuffer = exports.makeTransportStreamPacketBuffer = void 0;
|
|
4
|
+
const combine_uint8_arrays_1 = require("../../combine-uint8-arrays");
|
|
5
|
+
const find_separator_1 = require("./find-separator");
|
|
4
6
|
const get_tracks_1 = require("./get-tracks");
|
|
5
7
|
const handle_aac_packet_1 = require("./handle-aac-packet");
|
|
6
8
|
const handle_avc_packet_1 = require("./handle-avc-packet");
|
|
7
9
|
const traversal_1 = require("./traversal");
|
|
8
|
-
const
|
|
10
|
+
const makeTransportStreamPacketBuffer = ({ buffers, pesHeader, offset, }) => {
|
|
11
|
+
let currentBuf = buffers ? [buffers] : [];
|
|
12
|
+
let subarrayIndex = null;
|
|
13
|
+
const getBuffer = () => {
|
|
14
|
+
if (currentBuf.length === 0) {
|
|
15
|
+
return new Uint8Array();
|
|
16
|
+
}
|
|
17
|
+
if (currentBuf.length === 1) {
|
|
18
|
+
return currentBuf[0];
|
|
19
|
+
}
|
|
20
|
+
currentBuf = [(0, combine_uint8_arrays_1.combineUint8Arrays)(currentBuf)];
|
|
21
|
+
return currentBuf[0];
|
|
22
|
+
};
|
|
23
|
+
let fastFind = null;
|
|
24
|
+
return {
|
|
25
|
+
pesHeader,
|
|
26
|
+
offset,
|
|
27
|
+
getBuffer,
|
|
28
|
+
addBuffer: (buffer) => {
|
|
29
|
+
currentBuf.push(buffer);
|
|
30
|
+
subarrayIndex = null;
|
|
31
|
+
},
|
|
32
|
+
get2ndSubArrayIndex: () => {
|
|
33
|
+
var _a, _b;
|
|
34
|
+
if (subarrayIndex === null) {
|
|
35
|
+
const result = (0, find_separator_1.findNthSubarrayIndex)({
|
|
36
|
+
array: getBuffer(),
|
|
37
|
+
subarray: new Uint8Array([0, 0, 1, 9]),
|
|
38
|
+
n: 2,
|
|
39
|
+
startIndex: (_a = fastFind === null || fastFind === void 0 ? void 0 : fastFind.index) !== null && _a !== void 0 ? _a : 0,
|
|
40
|
+
startCount: (_b = fastFind === null || fastFind === void 0 ? void 0 : fastFind.count) !== null && _b !== void 0 ? _b : 0,
|
|
41
|
+
});
|
|
42
|
+
if (result.type === 'found') {
|
|
43
|
+
subarrayIndex = result.index;
|
|
44
|
+
fastFind = null;
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
fastFind = result;
|
|
48
|
+
return -1;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return subarrayIndex;
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
};
|
|
55
|
+
exports.makeTransportStreamPacketBuffer = makeTransportStreamPacketBuffer;
|
|
56
|
+
const processStreamBuffer = async ({ streamBuffer, programId, structure, sampleCallbacks, logLevel, onAudioTrack, onVideoTrack, transportStream, makeSamplesStartAtZero, }) => {
|
|
9
57
|
const stream = (0, traversal_1.getStreamForId)(structure, programId);
|
|
10
58
|
if (!stream) {
|
|
11
59
|
throw new Error('No stream found');
|
|
12
60
|
}
|
|
61
|
+
// 2 = ITU-T Rec. H.262 | ISO/IEC 13818-2 Video or ISO/IEC 11172-2 constrained parameter video stream
|
|
62
|
+
if (stream.streamType === 2) {
|
|
63
|
+
throw new Error('H.262 video stream not supported');
|
|
64
|
+
}
|
|
13
65
|
// 27 = AVC / H.264 Video
|
|
14
66
|
if (stream.streamType === 27) {
|
|
15
67
|
await (0, handle_avc_packet_1.handleAvcPacket)({
|
|
16
68
|
programId,
|
|
17
69
|
streamBuffer,
|
|
18
|
-
|
|
70
|
+
sampleCallbacks,
|
|
71
|
+
logLevel,
|
|
72
|
+
onVideoTrack,
|
|
19
73
|
offset: streamBuffer.offset,
|
|
74
|
+
transportStream,
|
|
75
|
+
makeSamplesStartAtZero,
|
|
20
76
|
});
|
|
21
77
|
}
|
|
22
78
|
// 15 = AAC / ADTS
|
|
23
79
|
else if (stream.streamType === 15) {
|
|
24
80
|
await (0, handle_aac_packet_1.handleAacPacket)({
|
|
25
81
|
streamBuffer,
|
|
26
|
-
state,
|
|
27
82
|
programId,
|
|
28
83
|
offset: streamBuffer.offset,
|
|
84
|
+
sampleCallbacks,
|
|
85
|
+
logLevel,
|
|
86
|
+
onAudioTrack,
|
|
87
|
+
transportStream,
|
|
88
|
+
makeSamplesStartAtZero,
|
|
29
89
|
});
|
|
30
90
|
}
|
|
31
|
-
if (!
|
|
32
|
-
const tracksRegistered =
|
|
91
|
+
if (!sampleCallbacks.tracks.hasAllTracks()) {
|
|
92
|
+
const tracksRegistered = sampleCallbacks.tracks.getTracks().length;
|
|
33
93
|
const { streams } = (0, traversal_1.findProgramMapTableOrThrow)(structure);
|
|
34
94
|
if ((0, get_tracks_1.filterStreamsBySupportedTypes)(streams).length === tracksRegistered) {
|
|
35
|
-
|
|
95
|
+
sampleCallbacks.tracks.setIsDone(logLevel);
|
|
36
96
|
}
|
|
37
97
|
}
|
|
38
98
|
};
|
|
39
99
|
exports.processStreamBuffer = processStreamBuffer;
|
|
40
|
-
const processFinalStreamBuffers = async ({
|
|
41
|
-
for (const [programId, buffer] of
|
|
42
|
-
if (buffer.
|
|
100
|
+
const processFinalStreamBuffers = async ({ structure, sampleCallbacks, logLevel, onAudioTrack, onVideoTrack, transportStream, makeSamplesStartAtZero, }) => {
|
|
101
|
+
for (const [programId, buffer] of transportStream.streamBuffers) {
|
|
102
|
+
if (buffer.getBuffer().byteLength > 0) {
|
|
43
103
|
await (0, exports.processStreamBuffer)({
|
|
44
104
|
streamBuffer: buffer,
|
|
45
|
-
state,
|
|
46
105
|
programId,
|
|
47
106
|
structure,
|
|
107
|
+
sampleCallbacks,
|
|
108
|
+
logLevel,
|
|
109
|
+
onAudioTrack,
|
|
110
|
+
onVideoTrack,
|
|
111
|
+
transportStream,
|
|
112
|
+
makeSamplesStartAtZero,
|
|
48
113
|
});
|
|
49
|
-
|
|
114
|
+
transportStream.streamBuffers.delete(programId);
|
|
50
115
|
}
|
|
51
116
|
}
|
|
52
117
|
};
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import type { TransportStreamStructure } from '../../parse-result';
|
|
2
|
+
import type { TransportStreamPMTBox } from './boxes';
|
|
2
3
|
import type { TransportStreamProgramAssociationTableEntry } from './parse-pat';
|
|
3
4
|
import type { TransportStreamEntry } from './parse-pmt';
|
|
4
|
-
export declare const
|
|
5
|
+
export declare const findProgramMapOrNull: (structure: TransportStreamStructure) => TransportStreamPMTBox | null;
|
|
6
|
+
export declare const findProgramMapTableOrThrow: (structure: TransportStreamStructure) => TransportStreamPMTBox;
|
|
5
7
|
export declare const getProgramForId: (structure: TransportStreamStructure, packetIdentifier: number) => TransportStreamProgramAssociationTableEntry | null;
|
|
6
8
|
export declare const getStreamForId: (structure: TransportStreamStructure, packetIdentifier: number) => TransportStreamEntry | null;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getStreamForId = exports.getProgramForId = exports.findProgramMapTableOrThrow = void 0;
|
|
3
|
+
exports.getStreamForId = exports.getProgramForId = exports.findProgramMapTableOrThrow = exports.findProgramMapOrNull = void 0;
|
|
4
4
|
const findProgramAssociationTableOrThrow = (structure) => {
|
|
5
5
|
const box = structure.boxes.find((b) => b.type === 'transport-stream-pat-box');
|
|
6
6
|
if (!box) {
|
|
@@ -8,8 +8,16 @@ const findProgramAssociationTableOrThrow = (structure) => {
|
|
|
8
8
|
}
|
|
9
9
|
return box;
|
|
10
10
|
};
|
|
11
|
-
const
|
|
11
|
+
const findProgramMapOrNull = (structure) => {
|
|
12
12
|
const box = structure.boxes.find((b) => b.type === 'transport-stream-pmt-box');
|
|
13
|
+
if (!box) {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
return box;
|
|
17
|
+
};
|
|
18
|
+
exports.findProgramMapOrNull = findProgramMapOrNull;
|
|
19
|
+
const findProgramMapTableOrThrow = (structure) => {
|
|
20
|
+
const box = (0, exports.findProgramMapOrNull)(structure);
|
|
13
21
|
if (!box) {
|
|
14
22
|
throw new Error('No PMT box found');
|
|
15
23
|
}
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.parseFmt = void 0;
|
|
4
4
|
const register_track_1 = require("../../register-track");
|
|
5
|
-
const work_on_seek_request_1 = require("../../work-on-seek-request");
|
|
6
5
|
const parseFmt = async ({ state, }) => {
|
|
7
6
|
const { iterator } = state;
|
|
8
7
|
const ckSize = iterator.getUint32Le(); // chunkSize
|
|
@@ -36,7 +35,6 @@ const parseFmt = async ({ state, }) => {
|
|
|
36
35
|
};
|
|
37
36
|
state.structure.getWavStructure().boxes.push(wavHeader);
|
|
38
37
|
await (0, register_track_1.registerAudioTrack)({
|
|
39
|
-
workOnSeekRequestOptions: (0, work_on_seek_request_1.getWorkOnSeekRequestOptions)(state),
|
|
40
38
|
track: {
|
|
41
39
|
type: 'audio',
|
|
42
40
|
codec: format,
|
|
@@ -3,7 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.parseMediaSection = void 0;
|
|
4
4
|
const convert_audio_or_video_sample_1 = require("../../convert-audio-or-video-sample");
|
|
5
5
|
const emit_audio_sample_1 = require("../../emit-audio-sample");
|
|
6
|
-
const work_on_seek_request_1 = require("../../work-on-seek-request");
|
|
7
6
|
const get_seeking_byte_1 = require("./get-seeking-byte");
|
|
8
7
|
const parseMediaSection = async ({ state, }) => {
|
|
9
8
|
const { iterator } = state;
|
|
@@ -36,7 +35,6 @@ const parseMediaSection = async ({ state, }) => {
|
|
|
36
35
|
},
|
|
37
36
|
timescale: 1,
|
|
38
37
|
}),
|
|
39
|
-
workOnSeekRequestOptions: (0, work_on_seek_request_1.getWorkOnSeekRequestOptions)(state),
|
|
40
38
|
callbacks: state.callbacks,
|
|
41
39
|
});
|
|
42
40
|
return null;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { MediaParserController } from '../../../controller/media-parser-controller';
|
|
2
|
+
import type { LogLevel } from '../../../log';
|
|
3
|
+
import type { ParseMediaSrc } from '../../../options';
|
|
4
|
+
import type { ReaderInterface } from '../../../readers/reader';
|
|
5
|
+
import type { MatroskaCue } from './format-cues';
|
|
6
|
+
export declare const fetchWebmCues: ({ src, readerInterface, controller, position, logLevel, }: {
|
|
7
|
+
src: ParseMediaSrc;
|
|
8
|
+
readerInterface: ReaderInterface;
|
|
9
|
+
controller: MediaParserController;
|
|
10
|
+
position: number;
|
|
11
|
+
logLevel: LogLevel;
|
|
12
|
+
}) => Promise<MatroskaCue[] | null>;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.fetchWebmCues = void 0;
|
|
4
|
+
const buffer_iterator_1 = require("../../../iterator/buffer-iterator");
|
|
5
|
+
const segments_1 = require("../segments");
|
|
6
|
+
const format_cues_1 = require("./format-cues");
|
|
7
|
+
const fetchWebmCues = async ({ src, readerInterface, controller, position, logLevel, }) => {
|
|
8
|
+
const result = await readerInterface.read({
|
|
9
|
+
controller,
|
|
10
|
+
range: position,
|
|
11
|
+
src,
|
|
12
|
+
});
|
|
13
|
+
const { value } = await result.reader.reader.read();
|
|
14
|
+
if (!value) {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
result.reader.abort();
|
|
18
|
+
const iterator = (0, buffer_iterator_1.getArrayBufferIterator)(value, value.length);
|
|
19
|
+
const segment = await (0, segments_1.expectSegment)({
|
|
20
|
+
iterator,
|
|
21
|
+
logLevel,
|
|
22
|
+
statesForProcessing: null,
|
|
23
|
+
isInsideSegment: null,
|
|
24
|
+
mediaSectionState: null,
|
|
25
|
+
});
|
|
26
|
+
iterator.destroy();
|
|
27
|
+
if (!(segment === null || segment === void 0 ? void 0 : segment.value)) {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
return (0, format_cues_1.formatCues)(segment.value);
|
|
31
|
+
};
|
|
32
|
+
exports.fetchWebmCues = fetchWebmCues;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { PossibleEbml } from '../segments/all-segments';
|
|
2
|
+
export type MatroskaCue = {
|
|
3
|
+
trackId: number;
|
|
4
|
+
timeInTimescale: number;
|
|
5
|
+
clusterPositionInSegment: number;
|
|
6
|
+
relativePosition: number;
|
|
7
|
+
};
|
|
8
|
+
export declare const formatCues: (cues: PossibleEbml[]) => MatroskaCue[];
|