@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.
Files changed (97) hide show
  1. package/dist/containers/flac/get-channel-count.d.ts +1 -1
  2. package/dist/containers/m3u/iterate-over-segment-files.js +2 -1
  3. package/dist/containers/transport-stream/process-audio.d.ts +21 -0
  4. package/dist/containers/transport-stream/process-audio.js +54 -0
  5. package/dist/containers/transport-stream/process-sample-if-possible.d.ts +2 -0
  6. package/dist/containers/transport-stream/process-sample-if-possible.js +62 -0
  7. package/dist/containers/transport-stream/process-video.d.ts +20 -0
  8. package/dist/containers/transport-stream/process-video.js +39 -0
  9. package/dist/containers/transport-stream/start-offset.d.ts +4 -0
  10. package/dist/containers/transport-stream/start-offset.js +13 -0
  11. package/dist/controller/emitter.js +2 -1
  12. package/dist/esm/index.mjs +16 -4
  13. package/dist/esm/server-worker.mjs +12 -1
  14. package/dist/esm/worker-server-entry.mjs +16 -4
  15. package/dist/esm/worker-web-entry.mjs +16 -4
  16. package/dist/esm/worker.mjs +12 -1
  17. package/dist/index.d.ts +1 -0
  18. package/dist/parse-media-on-worker-entry.js +3 -6
  19. package/dist/readers/state/aac-state.d.ts +13 -0
  20. package/dist/readers/state/aac-state.js +17 -0
  21. package/dist/readers/state/can-skip-tracks.d.ts +16 -0
  22. package/dist/readers/state/can-skip-tracks.js +60 -0
  23. package/dist/readers/state/current-reader.d.ts +6 -0
  24. package/dist/readers/state/current-reader.js +13 -0
  25. package/dist/readers/state/emitted-fields.d.ts +1 -0
  26. package/dist/readers/state/emitted-fields.js +37 -0
  27. package/dist/readers/state/flac-state.d.ts +4 -0
  28. package/dist/readers/state/flac-state.js +13 -0
  29. package/dist/readers/state/has-tracks-section.d.ts +14 -0
  30. package/dist/readers/state/has-tracks-section.js +37 -0
  31. package/dist/readers/state/images.d.ts +9 -0
  32. package/dist/readers/state/images.js +14 -0
  33. package/dist/readers/state/iso-base-media/cached-sample-positions.d.ts +12 -0
  34. package/dist/readers/state/iso-base-media/cached-sample-positions.js +46 -0
  35. package/dist/readers/state/iso-base-media/iso-state.d.ts +24 -0
  36. package/dist/readers/state/iso-base-media/iso-state.js +20 -0
  37. package/dist/readers/state/iso-base-media/lazy-mfra-load.d.ts +13 -0
  38. package/dist/readers/state/iso-base-media/lazy-mfra-load.js +29 -0
  39. package/dist/readers/state/iso-base-media/moov-box.d.ts +5 -0
  40. package/dist/readers/state/iso-base-media/moov-box.js +13 -0
  41. package/dist/readers/state/keyframes.d.ts +6 -0
  42. package/dist/readers/state/keyframes.js +15 -0
  43. package/dist/readers/state/m3u-state.d.ts +44 -0
  44. package/dist/readers/state/m3u-state.js +124 -0
  45. package/dist/readers/state/may-skip-video-data.d.ts +4 -0
  46. package/dist/readers/state/may-skip-video-data.js +18 -0
  47. package/dist/readers/state/mp3.d.ts +15 -0
  48. package/dist/readers/state/mp3.js +19 -0
  49. package/dist/readers/state/need-samples-for-fields.d.ts +6 -0
  50. package/dist/readers/state/need-samples-for-fields.js +39 -0
  51. package/dist/readers/state/parser-state.d.ts +252 -0
  52. package/dist/readers/state/parser-state.js +124 -0
  53. package/dist/readers/state/riff.d.ts +10 -0
  54. package/dist/readers/state/riff.js +32 -0
  55. package/dist/readers/state/sample-callbacks.d.ts +44 -0
  56. package/dist/readers/state/sample-callbacks.js +118 -0
  57. package/dist/readers/state/seek-infinite-loop.d.ts +5 -0
  58. package/dist/readers/state/seek-infinite-loop.js +22 -0
  59. package/dist/readers/state/slow-duration-fps.d.ts +11 -0
  60. package/dist/readers/state/slow-duration-fps.js +86 -0
  61. package/dist/readers/state/structure.d.ts +15 -0
  62. package/dist/readers/state/structure.js +78 -0
  63. package/dist/readers/state/timings.d.ts +8 -0
  64. package/dist/readers/state/timings.js +13 -0
  65. package/dist/readers/state/transport-stream/last-emitted-sample.d.ts +6 -0
  66. package/dist/readers/state/transport-stream/last-emitted-sample.js +16 -0
  67. package/dist/readers/state/transport-stream/next-pes-header-store.d.ts +6 -0
  68. package/dist/readers/state/transport-stream/next-pes-header-store.js +18 -0
  69. package/dist/readers/state/transport-stream/start-offset.d.ts +4 -0
  70. package/dist/readers/state/transport-stream/start-offset.js +13 -0
  71. package/dist/readers/state/transport-stream/transport-stream.d.ts +19 -0
  72. package/dist/readers/state/transport-stream/transport-stream.js +25 -0
  73. package/dist/readers/state/video-section.d.ts +33 -0
  74. package/dist/readers/state/video-section.js +65 -0
  75. package/dist/readers/state/webm.d.ts +28 -0
  76. package/dist/readers/state/webm.js +109 -0
  77. package/dist/state/iso-base-media/cached-sample-positions.d.ts +1 -1
  78. package/dist/state/parser-state.d.ts +1 -0
  79. package/dist/state/transport-stream/last-emitted-sample.d.ts +6 -0
  80. package/dist/state/transport-stream/last-emitted-sample.js +16 -0
  81. package/dist/state/transport-stream/next-pes-header-store.d.ts +6 -0
  82. package/dist/state/transport-stream/next-pes-header-store.js +18 -0
  83. package/dist/state/transport-stream/start-offset.d.ts +4 -0
  84. package/dist/state/transport-stream/start-offset.js +13 -0
  85. package/dist/state/transport-stream/transport-stream.d.ts +19 -0
  86. package/dist/state/transport-stream/transport-stream.js +24 -0
  87. package/dist/state/uml.d.ts +32 -0
  88. package/dist/state/uml.js +52 -0
  89. package/dist/state/video-section.d.ts +1 -0
  90. package/dist/state/video-section.js +1 -0
  91. package/dist/version.d.ts +1 -1
  92. package/dist/version.js +1 -1
  93. package/dist/with-resolvers.d.ts +5 -0
  94. package/dist/with-resolvers.js +13 -0
  95. package/dist/worker-server.js +2 -1
  96. package/dist/worker.js +1 -5
  97. 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 | 7 | 1 | 8 | 4 | 3 | 5 | 6;
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 } = Promise.withResolvers();
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,2 @@
1
+ import type { ParserState } from '../../state/parser-state';
2
+ export declare const processSampleIfPossible: (state: ParserState) => Promise<boolean | undefined>;
@@ -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,4 @@
1
+ export declare const startOffsetStore: () => {
2
+ getOffset: () => number;
3
+ setOffset: (newOffset: number) => void;
4
+ };
@@ -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 } = Promise.withResolvers();
55
+ const { promise, resolve } = (0, with_resolvers_1.withResolvers)();
55
56
  this.readyPromise = promise;
56
57
  __classPrivateFieldSet(this, _MediaParserEmitter_markAsReady, resolve, "f");
57
58
  }
@@ -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 } = Promise.withResolvers();
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 } = Promise.withResolvers();
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.282";
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 } = Promise.withResolvers();
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 } = Promise.withResolvers();
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 } = Promise.withResolvers();
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 } = Promise.withResolvers();
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 } = Promise.withResolvers();
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 } = Promise.withResolvers();
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 } = Promise.withResolvers();
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) {
@@ -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 } = Promise.withResolvers();
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 }, workerUrlEntry, apiName) => {
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 } = Promise.withResolvers();
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,6 @@
1
+ import type { Reader } from '../readers/reader';
2
+ export declare const currentReader: (initialReader: Reader) => {
3
+ getCurrent: () => Reader;
4
+ setCurrent: (newReader: Reader) => void;
5
+ };
6
+ export type CurrentReader = ReturnType<typeof currentReader>;
@@ -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>;