@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.
Files changed (143) hide show
  1. package/dist/aac-codecprivate.d.ts +1 -1
  2. package/dist/combine-uint8-arrays.d.ts +1 -1
  3. package/dist/containers/aac/parse-aac.js +0 -3
  4. package/dist/containers/avc/create-sps-pps-data.d.ts +1 -1
  5. package/dist/containers/flac/get-channel-count.d.ts +1 -1
  6. package/dist/containers/flac/parse-flac-frame.js +0 -2
  7. package/dist/containers/flac/parse-streaminfo.js +0 -2
  8. package/dist/containers/iso-base-media/collect-sample-positions-from-trak.js +4 -3
  9. package/dist/containers/iso-base-media/get-moov-atom.js +0 -4
  10. package/dist/containers/iso-base-media/mdat/mdat.js +0 -3
  11. package/dist/containers/iso-base-media/mfra/get-mfra-atom.d.ts +3 -3
  12. package/dist/containers/iso-base-media/parse-boxes.js +0 -2
  13. package/dist/containers/iso-base-media/process-box.d.ts +0 -2
  14. package/dist/containers/iso-base-media/process-box.js +1 -3
  15. package/dist/containers/m3u/iterate-over-segment-files.js +1 -0
  16. package/dist/containers/m3u/run-over-m3u.js +0 -3
  17. package/dist/containers/mp3/parse-mpeg-header.js +0 -3
  18. package/dist/containers/riff/expect-riff-box.js +0 -2
  19. package/dist/containers/riff/parse-movi.js +0 -3
  20. package/dist/containers/transport-stream/adts-header.d.ts +1 -1
  21. package/dist/containers/transport-stream/discard-rest-of-packet.d.ts +1 -1
  22. package/dist/containers/transport-stream/find-separator.d.ts +17 -1
  23. package/dist/containers/transport-stream/find-separator.js +6 -5
  24. package/dist/containers/transport-stream/get-seeking-info.d.ts +4 -0
  25. package/dist/containers/transport-stream/get-seeking-info.js +17 -0
  26. package/dist/containers/transport-stream/handle-aac-packet.d.ts +10 -3
  27. package/dist/containers/transport-stream/handle-aac-packet.js +21 -16
  28. package/dist/containers/transport-stream/handle-avc-packet.d.ts +10 -3
  29. package/dist/containers/transport-stream/handle-avc-packet.js +26 -17
  30. package/dist/containers/transport-stream/parse-packet.d.ts +8 -4
  31. package/dist/containers/transport-stream/parse-packet.js +15 -16
  32. package/dist/containers/transport-stream/parse-pes.d.ts +5 -1
  33. package/dist/containers/transport-stream/parse-pes.js +4 -3
  34. package/dist/containers/transport-stream/parse-stream-packet.d.ts +6 -6
  35. package/dist/containers/transport-stream/parse-stream-packet.js +10 -115
  36. package/dist/containers/transport-stream/parse-transport-stream.js +15 -3
  37. package/dist/containers/transport-stream/process-stream-buffers.d.ts +26 -6
  38. package/dist/containers/transport-stream/process-stream-buffers.js +77 -12
  39. package/dist/containers/transport-stream/traversal.d.ts +3 -1
  40. package/dist/containers/transport-stream/traversal.js +10 -2
  41. package/dist/containers/wav/parse-fmt.js +0 -2
  42. package/dist/containers/wav/parse-media-section.js +0 -2
  43. package/dist/containers/webm/cues/fetch-web-cues.d.ts +12 -0
  44. package/dist/containers/webm/cues/fetch-web-cues.js +32 -0
  45. package/dist/containers/webm/cues/format-cues.d.ts +8 -0
  46. package/dist/containers/webm/cues/format-cues.js +41 -0
  47. package/dist/containers/webm/cues/get-seeking-byte.d.ts +14 -0
  48. package/dist/containers/webm/cues/get-seeking-byte.js +91 -0
  49. package/dist/containers/webm/fetch-web-cues.d.ts +12 -0
  50. package/dist/containers/webm/fetch-web-cues.js +29 -0
  51. package/dist/containers/webm/get-byte-for-cues.d.ts +5 -0
  52. package/dist/containers/webm/get-byte-for-cues.js +33 -0
  53. package/dist/containers/webm/get-ready-tracks.d.ts +9 -4
  54. package/dist/containers/webm/get-ready-tracks.js +6 -6
  55. package/dist/containers/webm/get-sample-from-block.d.ts +3 -2
  56. package/dist/containers/webm/get-sample-from-block.js +9 -8
  57. package/dist/containers/webm/get-seeking-byte.d.ts +14 -0
  58. package/dist/containers/webm/get-seeking-byte.js +91 -0
  59. package/dist/containers/webm/get-seeking-info.d.ts +3 -0
  60. package/dist/containers/webm/get-seeking-info.js +17 -0
  61. package/dist/containers/webm/parse-ebml.d.ts +5 -4
  62. package/dist/containers/webm/parse-ebml.js +29 -34
  63. package/dist/containers/webm/parse-webm-header.js +14 -2
  64. package/dist/containers/webm/seek/fetch-web-cues.d.ts +12 -0
  65. package/dist/containers/webm/seek/fetch-web-cues.js +32 -0
  66. package/dist/containers/webm/seek/format-cues.d.ts +8 -0
  67. package/dist/containers/webm/seek/format-cues.js +42 -0
  68. package/dist/containers/webm/seek/get-seeking-byte.d.ts +14 -0
  69. package/dist/containers/webm/seek/get-seeking-byte.js +100 -0
  70. package/dist/containers/webm/seek/get-seeking-info.d.ts +3 -0
  71. package/dist/containers/webm/seek/get-seeking-info.js +17 -0
  72. package/dist/containers/webm/segments/all-segments.d.ts +1 -0
  73. package/dist/containers/webm/segments.d.ts +10 -4
  74. package/dist/containers/webm/segments.js +30 -12
  75. package/dist/containers/webm/state-for-processing.d.ts +15 -0
  76. package/dist/containers/webm/state-for-processing.js +14 -0
  77. package/dist/controller/seek-signal.d.ts +2 -2
  78. package/dist/download-and-parse-media.js +2 -1
  79. package/dist/emit-audio-sample.d.ts +2 -5
  80. package/dist/emit-audio-sample.js +2 -5
  81. package/dist/esm/index.mjs +5057 -4394
  82. package/dist/esm/universal.mjs +1 -1
  83. package/dist/esm/web.mjs +1 -1
  84. package/dist/esm/worker-server-entry.mjs +2327 -1664
  85. package/dist/esm/worker-web-entry.mjs +2327 -1664
  86. package/dist/file-types/detect-file-type.js +3 -1
  87. package/dist/get-audio-codec.d.ts +2 -1
  88. package/dist/get-audio-codec.js +15 -1
  89. package/dist/get-sample-positions-from-mp4.d.ts +3 -0
  90. package/dist/get-sample-positions-from-mp4.js +46 -0
  91. package/dist/get-seeking-byte.d.ts +19 -0
  92. package/dist/get-seeking-byte.js +50 -0
  93. package/dist/get-seeking-info.d.ts +5 -10
  94. package/dist/get-seeking-info.js +12 -25
  95. package/dist/get-tracks.js +6 -2
  96. package/dist/index.d.ts +44 -19
  97. package/dist/init-video.js +4 -3
  98. package/dist/internal-parse-media.js +3 -2
  99. package/dist/iterator/buffer-iterator.d.ts +3 -3
  100. package/dist/iterator/buffer-manager.d.ts +3 -3
  101. package/dist/log.d.ts +5 -5
  102. package/dist/options.d.ts +1 -0
  103. package/dist/parse-loop.js +0 -3
  104. package/dist/parse-media-on-worker-entry.d.ts +1 -1
  105. package/dist/parse-media.js +2 -1
  106. package/dist/readers/from-web-file.js +1 -1
  107. package/dist/register-track.d.ts +2 -5
  108. package/dist/register-track.js +2 -10
  109. package/dist/seek-backwards.js +2 -3
  110. package/dist/seeking-info.d.ts +14 -1
  111. package/dist/state/iso-base-media/cached-sample-positions.d.ts +1 -1
  112. package/dist/state/keyframes.js +3 -0
  113. package/dist/state/matroska/lazy-cues-fetch.d.ts +19 -0
  114. package/dist/state/matroska/lazy-cues-fetch.js +51 -0
  115. package/dist/state/matroska/lazy-seek-fetch.d.ts +1 -0
  116. package/dist/state/matroska/lazy-seek-fetch.js +5 -0
  117. package/dist/state/matroska/webm.d.ts +46 -0
  118. package/dist/state/matroska/webm.js +121 -0
  119. package/dist/state/matroska.d.ts +0 -0
  120. package/dist/state/matroska.js +1 -0
  121. package/dist/state/parser-state.d.ts +34 -9
  122. package/dist/state/parser-state.js +7 -6
  123. package/dist/state/sample-callbacks.d.ts +1 -1
  124. package/dist/state/sample-callbacks.js +9 -9
  125. package/dist/state/samples-observed/slow-duration-fps.d.ts +11 -0
  126. package/dist/state/samples-observed/slow-duration-fps.js +92 -0
  127. package/dist/state/seek-infinite-loop.js +12 -2
  128. package/dist/state/transport-stream/observed-pes-header.d.ts +13 -0
  129. package/dist/state/transport-stream/observed-pes-header.js +29 -0
  130. package/dist/state/transport-stream/pts-start-offset.d.ts +5 -0
  131. package/dist/state/transport-stream/pts-start-offset.js +13 -0
  132. package/dist/state/transport-stream/start-offset.d.ts +2 -1
  133. package/dist/state/transport-stream/start-offset.js +3 -3
  134. package/dist/state/transport-stream/transport-stream.d.ts +6 -0
  135. package/dist/state/transport-stream/transport-stream.js +4 -2
  136. package/dist/state/video-section.js +14 -2
  137. package/dist/version.d.ts +1 -1
  138. package/dist/version.js +1 -1
  139. package/dist/work-on-seek-request.d.ts +8 -0
  140. package/dist/work-on-seek-request.js +24 -6
  141. package/dist/worker-server.js +1 -0
  142. package/dist/worker.d.ts +0 -1
  143. package/package.json +4 -4
@@ -1,5 +1,9 @@
1
- import type { ParserState } from '../../state/parser-state';
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: ({ parserState, }: {
4
- parserState: ParserState;
5
- }) => Promise<TransportStreamBox | null>;
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 = async ({ parserState, }) => {
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 Promise.resolve(null);
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
- parserState.transportStream.nextPesHeaderStore.setNextPesHeader(packetPes);
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 Promise.resolve((0, parse_pat_1.parsePat)(iterator));
59
+ return (0, parse_pat_1.parsePat)(iterator);
61
60
  }
62
61
  if (programId === 17) {
63
- return Promise.resolve((0, parse_pat_1.parseSdt)(iterator));
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 Promise.resolve(pmt);
70
+ return pmt;
72
71
  }
73
- const stream = (0, traversal_1.getStreamForId)(structure, programId);
74
- if (stream) {
75
- await (0, parse_stream_packet_1.parseStream)({
76
- transportStreamEntry: stream,
77
- state: parserState,
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 Promise.resolve(null);
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: BufferIterator) => PacketPes;
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 offset = iterator.counter.getOffset();
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() - offset));
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 { TransportStreamStructure } from '../../parse-result';
2
- import type { ParserState } from '../../state/parser-state';
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, state, programId, structure, }: {
4
+ export declare const parseStream: ({ transportStreamEntry, programId, iterator, transportStream, }: {
5
5
  transportStreamEntry: TransportStreamEntry;
6
- state: ParserState;
7
6
  programId: number;
8
- structure: TransportStreamStructure;
9
- }) => Promise<void>;
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 parseAdtsStream = async ({ transportStreamEntry, state, structure, offset, }) => {
10
- var _a, _b;
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
- if (transportStreamEntry.streamType === 27) {
67
- const { streamBuffers, nextPesHeaderStore: nextPesHeader } = state.transportStream;
68
- while (true) {
69
- if (!streamBuffers.has(transportStreamEntry.pid)) {
70
- streamBuffers.set(programId, {
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
- throw new Error(`Unsupported stream type ${transportStreamEntry.streamType}`);
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 = await (0, parse_packet_1.parsePacket)({
13
- parserState: state,
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 { ParserState } from '../../state/parser-state';
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, state, programId, structure, }: {
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: ({ state, structure, }: {
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 processStreamBuffer = async ({ streamBuffer, state, programId, structure, }) => {
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
- state,
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 (!state.callbacks.tracks.hasAllTracks()) {
32
- const tracksRegistered = state.callbacks.tracks.getTracks().length;
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
- state.callbacks.tracks.setIsDone(state.logLevel);
95
+ sampleCallbacks.tracks.setIsDone(logLevel);
36
96
  }
37
97
  }
38
98
  };
39
99
  exports.processStreamBuffer = processStreamBuffer;
40
- const processFinalStreamBuffers = async ({ state, structure, }) => {
41
- for (const [programId, buffer] of state.transportStream.streamBuffers) {
42
- if (buffer.buffer.byteLength > 0) {
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
- state.transportStream.streamBuffers.delete(programId);
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 findProgramMapTableOrThrow: (structure: TransportStreamStructure) => import("./boxes").TransportStreamPMTBox;
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 findProgramMapTableOrThrow = (structure) => {
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[];