@remotion/media-parser 4.0.278 → 4.0.280

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