@remotion/media-parser 4.0.286 → 4.0.288

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 (243) hide show
  1. package/dist/containers/flac/get-channel-count.d.ts +1 -1
  2. package/dist/containers/flac/get-seeking-byte.d.ts +6 -0
  3. package/dist/containers/flac/get-seeking-byte.js +26 -0
  4. package/dist/containers/flac/parse-meta.d.ts +6 -0
  5. package/dist/containers/flac/parse-meta.js +31 -0
  6. package/dist/containers/flac/seeking-hints.d.ts +15 -0
  7. package/dist/containers/flac/seeking-hints.js +19 -0
  8. package/dist/containers/iso-base-media/collect-sample-positions-from-moof-boxes.d.ts +2 -2
  9. package/dist/containers/iso-base-media/collect-sample-positions-from-moof-boxes.js +6 -3
  10. package/dist/containers/iso-base-media/collect-sample-positions-from-trak.js +7 -5
  11. package/dist/containers/iso-base-media/get-keyframes.js +1 -1
  12. package/dist/containers/iso-base-media/get-sample-positions-from-track.d.ts +2 -2
  13. package/dist/containers/iso-base-media/get-seeking-byte.d.ts +15 -0
  14. package/dist/containers/iso-base-media/{get-seeking-from-mp4.js → get-seeking-byte.js} +16 -2
  15. package/dist/containers/iso-base-media/mdat/mdat.js +13 -5
  16. package/dist/containers/iso-base-media/mdat/postprocess-bytes.d.ts +5 -0
  17. package/dist/containers/iso-base-media/mdat/postprocess-bytes.js +25 -0
  18. package/dist/containers/iso-base-media/process-box.js +5 -3
  19. package/dist/containers/iso-base-media/{get-seeking-info-from-mp4.d.ts → seeking-hints.d.ts} +8 -3
  20. package/dist/containers/iso-base-media/seeking-hints.js +53 -0
  21. package/dist/containers/iso-base-media/should-group-audio-samples.d.ts +6 -0
  22. package/dist/containers/iso-base-media/should-group-audio-samples.js +16 -0
  23. package/dist/containers/iso-base-media/traversal.d.ts +4 -2
  24. package/dist/containers/iso-base-media/traversal.js +6 -5
  25. package/dist/containers/m3u/iterate-over-segment-files.js +23 -20
  26. package/dist/containers/riff/parse-video-section.js +1 -1
  27. package/dist/containers/transport-stream/handle-aac-packet.js +4 -1
  28. package/dist/containers/transport-stream/handle-avc-packet.js +4 -1
  29. package/dist/containers/transport-stream/seeking-hints.d.ts +9 -0
  30. package/dist/containers/transport-stream/seeking-hints.js +26 -0
  31. package/dist/containers/wav/get-seeking-byte.d.ts +2 -2
  32. package/dist/containers/wav/get-seeking-byte.js +2 -2
  33. package/dist/containers/wav/seeking-hints.d.ts +12 -0
  34. package/dist/containers/wav/seeking-hints.js +25 -0
  35. package/dist/containers/webm/seek/get-seeking-byte.d.ts +3 -5
  36. package/dist/containers/webm/seek/get-seeking-byte.js +5 -5
  37. package/dist/containers/webm/seek/seeking-hints.d.ts +10 -0
  38. package/dist/containers/webm/seek/seeking-hints.js +28 -0
  39. package/dist/controller/media-parser-controller.d.ts +3 -0
  40. package/dist/controller/media-parser-controller.js +15 -0
  41. package/dist/download-and-parse-media.js +2 -1
  42. package/dist/emit-available-info.js +1 -1
  43. package/dist/esm/index.mjs +491 -208
  44. package/dist/esm/node-writer.mjs +1 -2
  45. package/dist/esm/node.mjs +1 -2
  46. package/dist/esm/server-worker.mjs +46 -1
  47. package/dist/esm/universal.mjs +2 -4
  48. package/dist/esm/web.mjs +1 -2
  49. package/dist/esm/worker-server-entry.mjs +527 -215
  50. package/dist/esm/worker-web-entry.mjs +526 -213
  51. package/dist/esm/worker.mjs +46 -1
  52. package/dist/{forward-controller.d.ts → forward-controller-pause-resume-abort.d.ts} +1 -1
  53. package/dist/{forward-controller.js → forward-controller-pause-resume-abort.js} +3 -3
  54. package/dist/get-audio-codec.d.ts +1 -0
  55. package/dist/get-audio-codec.js +15 -4
  56. package/dist/get-dimensions.js +1 -1
  57. package/dist/get-duration.js +3 -2
  58. package/dist/get-fps.js +1 -0
  59. package/dist/get-is-hdr.js +2 -2
  60. package/dist/get-keyframes.js +1 -1
  61. package/dist/get-sample-positions-from-mp4.d.ts +4 -1
  62. package/dist/get-sample-positions-from-mp4.js +3 -1
  63. package/dist/get-sample-positions.d.ts +2 -0
  64. package/dist/get-sample-positions.js +2 -0
  65. package/dist/get-seeking-byte.d.ts +7 -5
  66. package/dist/get-seeking-byte.js +13 -12
  67. package/dist/{get-seeking-info.d.ts → get-seeking-hints.d.ts} +7 -3
  68. package/dist/get-seeking-hints.js +35 -0
  69. package/dist/get-tracks.d.ts +4 -4
  70. package/dist/get-tracks.js +8 -6
  71. package/dist/get-video-codec.js +2 -2
  72. package/dist/has-all-info.js +1 -1
  73. package/dist/index.d.ts +31 -3
  74. package/dist/internal-parse-media.js +16 -1
  75. package/dist/iterator/buffer-iterator.js +3 -4
  76. package/dist/metadata/metadata-from-iso.js +1 -0
  77. package/dist/options.d.ts +2 -0
  78. package/dist/parse-media-on-worker-entry.js +51 -1
  79. package/dist/parse-media.js +2 -1
  80. package/dist/samples-from-moof.d.ts +2 -2
  81. package/dist/samples-from-moof.js +7 -8
  82. package/dist/seeking-hints.d.ts +39 -0
  83. package/dist/set-seeking-hints.d.ts +6 -0
  84. package/dist/set-seeking-hints.js +27 -0
  85. package/dist/state/audio-sample-map.d.ts +11 -0
  86. package/dist/state/audio-sample-map.js +21 -0
  87. package/dist/state/has-tracks-section.js +3 -1
  88. package/dist/state/iso-base-media/cached-sample-positions.js +1 -1
  89. package/dist/state/iso-base-media/iso-state.d.ts +18 -2
  90. package/dist/state/iso-base-media/iso-state.js +4 -0
  91. package/dist/state/iso-base-media/lazy-mfra-load.d.ts +3 -0
  92. package/dist/state/iso-base-media/lazy-mfra-load.js +13 -0
  93. package/dist/state/iso-base-media/moov-box.d.ts +7 -2
  94. package/dist/state/iso-base-media/moov-box.js +1 -1
  95. package/dist/state/iso-base-media/precomputed-moof.d.ts +11 -0
  96. package/dist/state/iso-base-media/precomputed-moof.js +28 -0
  97. package/dist/state/iso-base-media/precomputed-tfra.d.ts +6 -0
  98. package/dist/state/iso-base-media/precomputed-tfra.js +17 -0
  99. package/dist/state/keyframes.d.ts +2 -0
  100. package/dist/state/keyframes.js +17 -9
  101. package/dist/state/matroska/lazy-cues-fetch.d.ts +7 -1
  102. package/dist/state/matroska/lazy-cues-fetch.js +21 -0
  103. package/dist/state/matroska/webm.d.ts +7 -0
  104. package/dist/state/matroska/webm.js +9 -1
  105. package/dist/state/parser-state.d.ts +31 -3
  106. package/dist/state/samples-observed/slow-duration-fps.js +0 -3
  107. package/dist/state/transport-stream/observed-pes-header.d.ts +2 -0
  108. package/dist/state/transport-stream/observed-pes-header.js +22 -12
  109. package/dist/state/transport-stream/pts-start-offset.d.ts +4 -1
  110. package/dist/state/transport-stream/pts-start-offset.js +1 -1
  111. package/dist/state/transport-stream/transport-stream.d.ts +5 -1
  112. package/dist/version.d.ts +1 -1
  113. package/dist/version.js +1 -1
  114. package/dist/with-resolvers.d.ts +5 -0
  115. package/dist/work-on-seek-request.js +8 -5
  116. package/dist/worker/{forward-controller.js → forward-controller-to-worker.js} +17 -0
  117. package/dist/worker/serialize-error.d.ts +6 -1
  118. package/dist/worker/serialize-error.js +2 -1
  119. package/dist/worker/worker-types.d.ts +12 -2
  120. package/dist/worker-server.js +16 -5
  121. package/package.json +3 -3
  122. package/dist/containers/iso-base-media/get-mfra-atom.d.ts +0 -9
  123. package/dist/containers/iso-base-media/get-mfra-atom.js +0 -12
  124. package/dist/containers/iso-base-media/get-seeking-from-mp4.d.ts +0 -11
  125. package/dist/containers/iso-base-media/get-seeking-info-from-mp4.js +0 -25
  126. package/dist/containers/iso-base-media/mfra/mfra.d.ts +0 -2
  127. package/dist/containers/iso-base-media/mfra/mfra.js +0 -11
  128. package/dist/containers/transport-stream/get-seeking-info.d.ts +0 -4
  129. package/dist/containers/transport-stream/get-seeking-info.js +0 -17
  130. package/dist/containers/transport-stream/next-pes-header-store.d.ts +0 -6
  131. package/dist/containers/transport-stream/next-pes-header-store.js +0 -18
  132. package/dist/containers/transport-stream/start-offset.d.ts +0 -4
  133. package/dist/containers/transport-stream/start-offset.js +0 -13
  134. package/dist/containers/wav/get-seeking-info.d.ts +0 -7
  135. package/dist/containers/wav/get-seeking-info.js +0 -20
  136. package/dist/containers/wav/parse-video-section.d.ts +0 -5
  137. package/dist/containers/wav/parse-video-section.js +0 -41
  138. package/dist/containers/webm/cues/fetch-web-cues.d.ts +0 -12
  139. package/dist/containers/webm/cues/fetch-web-cues.js +0 -32
  140. package/dist/containers/webm/cues/format-cues.d.ts +0 -8
  141. package/dist/containers/webm/cues/format-cues.js +0 -41
  142. package/dist/containers/webm/cues/get-seeking-byte.d.ts +0 -14
  143. package/dist/containers/webm/cues/get-seeking-byte.js +0 -91
  144. package/dist/containers/webm/fetch-web-cues.d.ts +0 -12
  145. package/dist/containers/webm/fetch-web-cues.js +0 -29
  146. package/dist/containers/webm/get-seeking-byte.d.ts +0 -14
  147. package/dist/containers/webm/get-seeking-byte.js +0 -91
  148. package/dist/containers/webm/get-seeking-info.d.ts +0 -3
  149. package/dist/containers/webm/get-seeking-info.js +0 -17
  150. package/dist/containers/webm/seek/get-seeking-info.d.ts +0 -3
  151. package/dist/containers/webm/seek/get-seeking-info.js +0 -17
  152. package/dist/emitter.d.ts +0 -33
  153. package/dist/emitter.js +0 -65
  154. package/dist/get-sample-positions-from-lpcm.d.ts +0 -3
  155. package/dist/get-sample-positions-from-lpcm.js +0 -46
  156. package/dist/get-seeking-info.js +0 -35
  157. package/dist/media-parser-controller.d.ts +0 -21
  158. package/dist/media-parser-controller.js +0 -38
  159. package/dist/pause-signal.d.ts +0 -11
  160. package/dist/pause-signal.js +0 -38
  161. package/dist/readers/state/aac-state.d.ts +0 -13
  162. package/dist/readers/state/aac-state.js +0 -17
  163. package/dist/readers/state/can-skip-tracks.d.ts +0 -16
  164. package/dist/readers/state/can-skip-tracks.js +0 -60
  165. package/dist/readers/state/current-reader.d.ts +0 -6
  166. package/dist/readers/state/current-reader.js +0 -13
  167. package/dist/readers/state/emitted-fields.d.ts +0 -1
  168. package/dist/readers/state/emitted-fields.js +0 -37
  169. package/dist/readers/state/flac-state.d.ts +0 -4
  170. package/dist/readers/state/flac-state.js +0 -13
  171. package/dist/readers/state/has-tracks-section.d.ts +0 -14
  172. package/dist/readers/state/has-tracks-section.js +0 -37
  173. package/dist/readers/state/images.d.ts +0 -9
  174. package/dist/readers/state/images.js +0 -14
  175. package/dist/readers/state/iso-base-media/cached-sample-positions.d.ts +0 -12
  176. package/dist/readers/state/iso-base-media/cached-sample-positions.js +0 -46
  177. package/dist/readers/state/iso-base-media/iso-state.d.ts +0 -24
  178. package/dist/readers/state/iso-base-media/iso-state.js +0 -20
  179. package/dist/readers/state/iso-base-media/lazy-mfra-load.d.ts +0 -13
  180. package/dist/readers/state/iso-base-media/lazy-mfra-load.js +0 -29
  181. package/dist/readers/state/iso-base-media/moov-box.d.ts +0 -5
  182. package/dist/readers/state/iso-base-media/moov-box.js +0 -13
  183. package/dist/readers/state/keyframes.d.ts +0 -6
  184. package/dist/readers/state/keyframes.js +0 -15
  185. package/dist/readers/state/m3u-state.d.ts +0 -44
  186. package/dist/readers/state/m3u-state.js +0 -124
  187. package/dist/readers/state/may-skip-video-data.d.ts +0 -4
  188. package/dist/readers/state/may-skip-video-data.js +0 -18
  189. package/dist/readers/state/mp3.d.ts +0 -15
  190. package/dist/readers/state/mp3.js +0 -19
  191. package/dist/readers/state/need-samples-for-fields.d.ts +0 -6
  192. package/dist/readers/state/need-samples-for-fields.js +0 -39
  193. package/dist/readers/state/parser-state.d.ts +0 -252
  194. package/dist/readers/state/parser-state.js +0 -124
  195. package/dist/readers/state/riff.d.ts +0 -10
  196. package/dist/readers/state/riff.js +0 -32
  197. package/dist/readers/state/sample-callbacks.d.ts +0 -44
  198. package/dist/readers/state/sample-callbacks.js +0 -118
  199. package/dist/readers/state/seek-infinite-loop.d.ts +0 -5
  200. package/dist/readers/state/seek-infinite-loop.js +0 -22
  201. package/dist/readers/state/slow-duration-fps.d.ts +0 -11
  202. package/dist/readers/state/slow-duration-fps.js +0 -86
  203. package/dist/readers/state/structure.d.ts +0 -15
  204. package/dist/readers/state/structure.js +0 -78
  205. package/dist/readers/state/timings.d.ts +0 -8
  206. package/dist/readers/state/timings.js +0 -13
  207. package/dist/readers/state/transport-stream/last-emitted-sample.d.ts +0 -6
  208. package/dist/readers/state/transport-stream/last-emitted-sample.js +0 -16
  209. package/dist/readers/state/transport-stream/next-pes-header-store.d.ts +0 -6
  210. package/dist/readers/state/transport-stream/next-pes-header-store.js +0 -18
  211. package/dist/readers/state/transport-stream/start-offset.d.ts +0 -4
  212. package/dist/readers/state/transport-stream/start-offset.js +0 -13
  213. package/dist/readers/state/transport-stream/transport-stream.d.ts +0 -19
  214. package/dist/readers/state/transport-stream/transport-stream.js +0 -25
  215. package/dist/readers/state/video-section.d.ts +0 -33
  216. package/dist/readers/state/video-section.js +0 -65
  217. package/dist/readers/state/webm.d.ts +0 -28
  218. package/dist/readers/state/webm.js +0 -109
  219. package/dist/seek-signal.d.ts +0 -19
  220. package/dist/seek-signal.js +0 -24
  221. package/dist/seeking-info.d.ts +0 -31
  222. package/dist/server-worker.module.d.ts +0 -2
  223. package/dist/server-worker.module.js +0 -12
  224. package/dist/state/matroska/lazy-seek-fetch.d.ts +0 -1
  225. package/dist/state/matroska/lazy-seek-fetch.js +0 -5
  226. package/dist/state/matroska.d.ts +0 -0
  227. package/dist/state/matroska.js +0 -1
  228. package/dist/state/slow-duration-fps.d.ts +0 -11
  229. package/dist/state/slow-duration-fps.js +0 -86
  230. package/dist/state/transport-stream/start-offset.d.ts +0 -5
  231. package/dist/state/transport-stream/start-offset.js +0 -13
  232. package/dist/state/transport-stream.d.ts +0 -8
  233. package/dist/state/transport-stream.js +0 -11
  234. package/dist/state/uml.d.ts +0 -32
  235. package/dist/state/uml.js +0 -52
  236. package/dist/state/webm.d.ts +0 -30
  237. package/dist/state/webm.js +0 -109
  238. package/dist/state/work-on-seek-request-options.d.ts +0 -3
  239. package/dist/state/work-on-seek-request-options.js +0 -26
  240. package/dist/worker.module.d.ts +0 -4
  241. package/dist/worker.module.js +0 -12
  242. /package/dist/{seeking-info.js → seeking-hints.js} +0 -0
  243. /package/dist/worker/{forward-controller.d.ts → forward-controller-to-worker.d.ts} +0 -0
@@ -3,13 +3,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.internalParseMedia = void 0;
4
4
  const media_parser_controller_1 = require("./controller/media-parser-controller");
5
5
  const emit_all_info_1 = require("./emit-all-info");
6
+ const get_seeking_hints_1 = require("./get-seeking-hints");
6
7
  const log_1 = require("./log");
7
8
  const parse_loop_1 = require("./parse-loop");
8
9
  const print_timings_1 = require("./print-timings");
9
10
  const remotion_license_acknowledge_1 = require("./remotion-license-acknowledge");
11
+ const set_seeking_hints_1 = require("./set-seeking-hints");
10
12
  const parser_state_1 = require("./state/parser-state");
11
13
  const throttled_progress_1 = require("./throttled-progress");
12
- const internalParseMedia = async function ({ src, fields: _fieldsInReturnValue, reader: readerInterface, onAudioTrack, onVideoTrack, controller = (0, media_parser_controller_1.mediaParserController)(), logLevel, onParseProgress: onParseProgressDoNotCallDirectly, progressIntervalInMs, mode, onDiscardedData, onError, acknowledgeRemotionLicense, apiName, selectM3uStream: selectM3uStreamFn, selectM3uAssociatedPlaylists: selectM3uAssociatedPlaylistsFn, mp4HeaderSegment, makeSamplesStartAtZero, ...more }) {
14
+ const internalParseMedia = async function ({ src, fields: _fieldsInReturnValue, reader: readerInterface, onAudioTrack, onVideoTrack, controller = (0, media_parser_controller_1.mediaParserController)(), logLevel, onParseProgress: onParseProgressDoNotCallDirectly, progressIntervalInMs, mode, onDiscardedData, onError, acknowledgeRemotionLicense, apiName, selectM3uStream: selectM3uStreamFn, selectM3uAssociatedPlaylists: selectM3uAssociatedPlaylistsFn, mp4HeaderSegment, makeSamplesStartAtZero, seekingHints, ...more }) {
13
15
  var _a;
14
16
  controller._internals.markAsReadyToEmitEvents();
15
17
  (0, remotion_license_acknowledge_1.warnIfRemotionLicenseNotAcknowledged)({
@@ -50,6 +52,19 @@ const internalParseMedia = async function ({ src, fields: _fieldsInReturnValue,
50
52
  initialReaderInstance: readerInstance,
51
53
  makeSamplesStartAtZero,
52
54
  });
55
+ if (seekingHints) {
56
+ (0, set_seeking_hints_1.setSeekingHints)({ hints: seekingHints, state });
57
+ }
58
+ controller._internals.attachSeekingHintResolution(() => Promise.resolve((0, get_seeking_hints_1.getSeekingHints)({
59
+ tracksState: state.callbacks.tracks,
60
+ keyframesState: state.keyframes,
61
+ webmState: state.webm,
62
+ structureState: state.structure,
63
+ mp4HeaderSegment: state.mp4HeaderSegment,
64
+ mediaSectionState: state.mediaSection,
65
+ isoState: state.iso,
66
+ transportStream: state.transportStream,
67
+ })));
53
68
  if (!hasAudioTrackHandlers &&
54
69
  !hasVideoTrackHandlers &&
55
70
  Object.values(state.fields).every((v) => !v) &&
@@ -4,6 +4,7 @@ exports.getArrayBufferIterator = void 0;
4
4
  /* eslint-disable @typescript-eslint/no-use-before-define */
5
5
  const all_segments_1 = require("../containers/webm/segments/all-segments");
6
6
  const file_types_1 = require("../file-types");
7
+ const log_1 = require("../log");
7
8
  const buffer_manager_1 = require("./buffer-manager");
8
9
  const offset_counter_1 = require("./offset-counter");
9
10
  const getArrayBufferIterator = (initialData, maxBytes) => {
@@ -174,13 +175,11 @@ const getArrayBufferIterator = (initialData, maxBytes) => {
174
175
  return (1 << zerosCount) - 1 + suffix;
175
176
  };
176
177
  const peekB = (length) => {
177
- // eslint-disable-next-line no-console
178
- console.log([...getSlice(length)].map((b) => b.toString(16).padStart(2, '0')));
178
+ log_1.Log.info('info', [...getSlice(length)].map((b) => b.toString(16).padStart(2, '0')));
179
179
  counter.decrement(length);
180
180
  };
181
181
  const peekD = (length) => {
182
- // eslint-disable-next-line no-console
183
- console.log([...getSlice(length)].map((b) => b));
182
+ log_1.Log.info('info', [...getSlice(length)].map((b) => b.toString(16).padStart(2, '0')));
184
183
  counter.decrement(length);
185
184
  };
186
185
  const leb128 = () => {
@@ -120,6 +120,7 @@ const getMetadataFromIsoBase = (state) => {
120
120
  structureState: state.structure,
121
121
  isoState: state.iso,
122
122
  mp4HeaderSegment: state.mp4HeaderSegment,
123
+ mayUsePrecomputed: true,
123
124
  });
124
125
  if (!moov) {
125
126
  return [];
package/dist/options.d.ts CHANGED
@@ -9,6 +9,7 @@ import type { LogLevel } from './log';
9
9
  import type { MediaParserMetadataEntry } from './metadata/get-metadata';
10
10
  import type { IsoBaseMediaStructure, MediaParserStructureUnstable } from './parse-result';
11
11
  import type { ReaderInterface } from './readers/reader';
12
+ import type { SeekingHints } from './seeking-hints';
12
13
  import type { MediaParserEmbeddedImage } from './state/images';
13
14
  import type { InternalStats } from './state/parser-state';
14
15
  import type { OnAudioTrack, OnVideoTrack } from './webcodec-sample-types';
@@ -136,6 +137,7 @@ export type SerializeableOptionalParseMediaParams<F extends Options<ParseMediaFi
136
137
  acknowledgeRemotionLicense: boolean;
137
138
  mp4HeaderSegment: IsoBaseMediaStructure | null;
138
139
  makeSamplesStartAtZero: boolean;
140
+ seekingHints: SeekingHints | null;
139
141
  };
140
142
  type OptionalParseMediaParams<F extends Options<ParseMediaFields>> = SerializeableOptionalParseMediaParams<F> & {
141
143
  controller: MediaParserController | undefined;
@@ -54,6 +54,7 @@ const parseMediaOnWorkerImplementation = async ({ controller, reader, ...params
54
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().`);
55
55
  }
56
56
  post(worker, convertToWorkerPayload(params));
57
+ let workerTerminated = false;
57
58
  const { promise, resolve, reject } = (0, with_resolvers_1.withResolvers)();
58
59
  const onAbort = () => {
59
60
  post(worker, { type: 'request-abort' });
@@ -68,16 +69,54 @@ const parseMediaOnWorkerImplementation = async ({ controller, reader, ...params
68
69
  post(worker, { type: 'request-seek', payload: seek });
69
70
  controller === null || controller === void 0 ? void 0 : controller._internals.seekSignal.clearSeekIfStillSame(seek);
70
71
  };
72
+ const seekingHintPromises = [];
73
+ let finalSeekingHints = null;
74
+ controller === null || controller === void 0 ? void 0 : controller._internals.attachSeekingHintResolution(() => {
75
+ if (finalSeekingHints) {
76
+ return Promise.resolve(finalSeekingHints);
77
+ }
78
+ if (workerTerminated) {
79
+ return Promise.reject(new Error('Worker terminated'));
80
+ }
81
+ const prom = (0, with_resolvers_1.withResolvers)();
82
+ post(worker, { type: 'request-get-seeking-hints' });
83
+ seekingHintPromises.push(prom);
84
+ return prom.promise;
85
+ });
71
86
  const callbacks = {};
72
87
  function onMessage(message) {
73
88
  const data = message.data;
74
89
  if (data.type === 'response-done') {
75
90
  resolve(data.payload);
91
+ if (data.seekingHints) {
92
+ finalSeekingHints = data.seekingHints;
93
+ for (const prom of seekingHintPromises) {
94
+ prom.resolve(finalSeekingHints);
95
+ }
96
+ }
97
+ return;
76
98
  }
77
99
  if (data.type === 'response-error') {
78
100
  // eslint-disable-next-line @typescript-eslint/no-use-before-define
79
101
  cleanup();
80
- reject((0, serialize_error_1.deserializeError)(data));
102
+ // Reject main loop
103
+ const error = (0, serialize_error_1.deserializeError)(data);
104
+ reject(error);
105
+ // If aborted, we send the seeking hints we got,
106
+ // otherwise we reject all .getSeekingHints() promises
107
+ if (data.errorName === 'MediaParserAbortError') {
108
+ finalSeekingHints = data.seekingHints;
109
+ for (const prom of seekingHintPromises) {
110
+ prom.resolve(finalSeekingHints);
111
+ }
112
+ }
113
+ else {
114
+ // Reject all .getSeekingHints() promises
115
+ for (const prom of seekingHintPromises) {
116
+ prom.reject(error);
117
+ }
118
+ }
119
+ return;
81
120
  }
82
121
  if (data.type === 'response-on-callback-request') {
83
122
  Promise.resolve()
@@ -254,7 +293,17 @@ const parseMediaOnWorkerImplementation = async ({ controller, reader, ...params
254
293
  nonce: data.nonce,
255
294
  });
256
295
  });
296
+ return;
297
+ }
298
+ if (data.type === 'response-get-seeking-hints') {
299
+ const firstPromise = seekingHintPromises.shift();
300
+ if (!firstPromise) {
301
+ throw new Error('No seeking hint promise found');
302
+ }
303
+ firstPromise.resolve(data.payload);
304
+ return;
257
305
  }
306
+ throw new Error(`Unknown response type: ${JSON.stringify(data)}`);
258
307
  }
259
308
  worker.addEventListener('message', onMessage);
260
309
  controller === null || controller === void 0 ? void 0 : controller.addEventListener('abort', onAbort);
@@ -267,6 +316,7 @@ const parseMediaOnWorkerImplementation = async ({ controller, reader, ...params
267
316
  controller === null || controller === void 0 ? void 0 : controller.removeEventListener('resume', onResume);
268
317
  controller === null || controller === void 0 ? void 0 : controller.removeEventListener('pause', onPause);
269
318
  controller === null || controller === void 0 ? void 0 : controller.removeEventListener('seek', onSeek);
319
+ workerTerminated = true;
270
320
  worker.terminate();
271
321
  }
272
322
  controller === null || controller === void 0 ? void 0 : controller._internals.markAsReadyToEmitEvents();
@@ -5,7 +5,7 @@ const select_stream_1 = require("./containers/m3u/select-stream");
5
5
  const internal_parse_media_1 = require("./internal-parse-media");
6
6
  const web_1 = require("./web");
7
7
  const parseMedia = (options) => {
8
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15;
8
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16;
9
9
  return (0, internal_parse_media_1.internalParseMedia)({
10
10
  fields: (_a = options.fields) !== null && _a !== void 0 ? _a : null,
11
11
  logLevel: (_b = options.logLevel) !== null && _b !== void 0 ? _b : 'info',
@@ -53,6 +53,7 @@ const parseMedia = (options) => {
53
53
  acknowledgeRemotionLicense: Boolean(options.acknowledgeRemotionLicense),
54
54
  apiName: 'parseMedia()',
55
55
  makeSamplesStartAtZero: (_15 = options.makeSamplesStartAtZero) !== null && _15 !== void 0 ? _15 : true,
56
+ seekingHints: (_16 = options.seekingHints) !== null && _16 !== void 0 ? _16 : null,
56
57
  });
57
58
  };
58
59
  exports.parseMedia = parseMedia;
@@ -1,6 +1,6 @@
1
1
  import type { SamplePosition } from './get-sample-positions';
2
- import type { AnySegment } from './parse-result';
2
+ import type { MoofBox } from './state/iso-base-media/precomputed-moof';
3
3
  export declare const getSamplesFromMoof: ({ moofBox, trackId, }: {
4
- moofBox: AnySegment;
4
+ moofBox: MoofBox;
5
5
  trackId: number;
6
6
  }) => SamplePosition[];
@@ -52,6 +52,8 @@ const getSamplesFromTraf = (trafSegment, moofOffset) => {
52
52
  isKeyframe: keyframe,
53
53
  size,
54
54
  chunk: 0,
55
+ bigEndian: false,
56
+ chunkSize: null,
55
57
  };
56
58
  samples.push(samplePosition);
57
59
  offset += size;
@@ -61,15 +63,12 @@ const getSamplesFromTraf = (trafSegment, moofOffset) => {
61
63
  return samples;
62
64
  };
63
65
  const getSamplesFromMoof = ({ moofBox, trackId, }) => {
64
- if (moofBox.type !== 'regular-box') {
65
- throw new Error('Expected moof-box');
66
- }
67
- const trafs = moofBox.children.filter((c) => c.type === 'regular-box' && c.boxType === 'traf');
68
- const mapped = trafs.map((traf) => {
66
+ const mapped = moofBox.trafBoxes.map((traf) => {
69
67
  const tfhdBox = (0, traversal_1.getTfhdBox)(traf);
70
- return (tfhdBox === null || tfhdBox === void 0 ? void 0 : tfhdBox.trackId) === trackId
71
- ? getSamplesFromTraf(traf, moofBox.offset)
72
- : [];
68
+ if (!tfhdBox || tfhdBox.trackId !== trackId) {
69
+ return [];
70
+ }
71
+ return getSamplesFromTraf(traf, moofBox.offset);
73
72
  });
74
73
  return mapped.flat(1);
75
74
  };
@@ -0,0 +1,39 @@
1
+ import type { IsoBaseMediaBox } from './containers/iso-base-media/base-media-box';
2
+ import type { TfraBox } from './containers/iso-base-media/mfra/tfra';
3
+ import type { MoovBox } from './containers/iso-base-media/moov/moov';
4
+ import type { PacketPes } from './containers/transport-stream/parse-pes';
5
+ import type { MediaParserKeyframe } from './options';
6
+ import type { MoofBox } from './state/iso-base-media/precomputed-moof';
7
+ import type { LazyCuesLoadedOrNull } from './state/matroska/lazy-cues-fetch';
8
+ import type { MediaSection } from './state/video-section';
9
+ export type IsoBaseMediaSeekingHints = {
10
+ type: 'iso-base-media-seeking-hints';
11
+ moovBox: MoovBox;
12
+ moofBoxes: MoofBox[];
13
+ tfraBoxes: TfraBox[];
14
+ mediaSections: MediaSection[];
15
+ mfraAlreadyLoaded: IsoBaseMediaBox[] | null;
16
+ };
17
+ export type WavSeekingHints = {
18
+ type: 'wav-seeking-hints';
19
+ sampleRate: number;
20
+ blockAlign: number;
21
+ mediaSection: MediaSection;
22
+ };
23
+ export type TransportStreamSeekingHints = {
24
+ type: 'transport-stream-seeking-hints';
25
+ observedPesHeaders: PacketPes[];
26
+ ptsStartOffset: number;
27
+ firstVideoTrackId: number;
28
+ };
29
+ export type WebmSeekingHints = {
30
+ type: 'webm-seeking-hints';
31
+ track: null | {
32
+ timescale: number;
33
+ trackId: number;
34
+ };
35
+ keyframes: MediaParserKeyframe[];
36
+ loadedCues: LazyCuesLoadedOrNull;
37
+ timestampMap: Map<number, number>;
38
+ };
39
+ export type SeekingHints = IsoBaseMediaSeekingHints | WavSeekingHints | TransportStreamSeekingHints | WebmSeekingHints;
@@ -0,0 +1,6 @@
1
+ import type { SeekingHints } from './seeking-hints';
2
+ import type { ParserState } from './state/parser-state';
3
+ export declare const setSeekingHints: ({ hints, state, }: {
4
+ hints: SeekingHints;
5
+ state: ParserState;
6
+ }) => void;
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setSeekingHints = void 0;
4
+ const seeking_hints_1 = require("./containers/iso-base-media/seeking-hints");
5
+ const seeking_hints_2 = require("./containers/transport-stream/seeking-hints");
6
+ const seeking_hints_3 = require("./containers/wav/seeking-hints");
7
+ const seeking_hints_4 = require("./containers/webm/seek/seeking-hints");
8
+ const setSeekingHints = ({ hints, state, }) => {
9
+ if (hints.type === 'iso-base-media-seeking-hints') {
10
+ (0, seeking_hints_1.setSeekingHintsForMp4)({ hints, state });
11
+ return;
12
+ }
13
+ if (hints.type === 'wav-seeking-hints') {
14
+ (0, seeking_hints_3.setSeekingHintsForWav)({ hints, state });
15
+ return;
16
+ }
17
+ if (hints.type === 'transport-stream-seeking-hints') {
18
+ (0, seeking_hints_2.setSeekingHintsForTransportStream)({ hints, state });
19
+ return;
20
+ }
21
+ if (hints.type === 'webm-seeking-hints') {
22
+ (0, seeking_hints_4.setSeekingHintsForWebm)({ hints, state });
23
+ return;
24
+ }
25
+ throw new Error(`Unknown seeking hints type: ${hints}`);
26
+ };
27
+ exports.setSeekingHints = setSeekingHints;
@@ -0,0 +1,11 @@
1
+ export type AudioSampleOffset = {
2
+ timeInSeconds: number;
3
+ offset: number;
4
+ durationInSeconds: number;
5
+ };
6
+ export declare const audioSampleMapState: () => {
7
+ addSample: (audioSampleOffset: AudioSampleOffset) => void;
8
+ getSamples: () => AudioSampleOffset[];
9
+ setFromSeekingHints: (newMap: AudioSampleOffset[]) => void;
10
+ };
11
+ export type AudioSampleMapState = ReturnType<typeof audioSampleMapState>;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.audioSampleMapState = void 0;
4
+ const audioSampleMapState = () => {
5
+ // {[]}
6
+ let map = [];
7
+ const addSample = (audioSampleOffset) => {
8
+ if (map.find((m) => m.offset === audioSampleOffset.offset)) {
9
+ return;
10
+ }
11
+ map.push(audioSampleOffset);
12
+ };
13
+ return {
14
+ addSample,
15
+ getSamples: () => map,
16
+ setFromSeekingHints: (newMap) => {
17
+ map = newMap;
18
+ },
19
+ };
20
+ };
21
+ exports.audioSampleMapState = audioSampleMapState;
@@ -18,7 +18,9 @@ const makeTracksSectionState = (canSkipTracksState, src) => {
18
18
  addTrack: (track) => {
19
19
  tracks.push(track);
20
20
  },
21
- getTracks: () => tracks,
21
+ getTracks: () => {
22
+ return tracks;
23
+ },
22
24
  ensureHasTracksAtEnd: (fields) => {
23
25
  if (canSkipTracksState.canSkipTracks()) {
24
26
  return;
@@ -5,7 +5,7 @@ const get_sample_positions_from_track_1 = require("../../containers/iso-base-med
5
5
  const traversal_1 = require("../../containers/iso-base-media/traversal");
6
6
  const get_tracks_1 = require("../../get-tracks");
7
7
  const calculateFlatSamples = (state) => {
8
- const tracks = (0, get_tracks_1.getTracks)(state);
8
+ const tracks = (0, get_tracks_1.getTracks)(state, true);
9
9
  const allTracks = [
10
10
  ...tracks.videoTracks,
11
11
  ...tracks.audioTracks,
@@ -14,11 +14,27 @@ export declare const isoBaseMediaState: ({ contentLength, controller, readerInte
14
14
  setSamples: (mdatStart: number, samples: import("./cached-sample-positions").FlatSample[]) => void;
15
15
  };
16
16
  moov: {
17
- setMoovBox: (moov: import("../../containers/iso-base-media/moov/moov").MoovBox) => void;
18
- getMoovBox: () => import("../../containers/iso-base-media/moov/moov").MoovBox | null;
17
+ setMoovBox: (moov: {
18
+ moovBox: import("../../containers/iso-base-media/moov/moov").MoovBox;
19
+ precomputed: boolean;
20
+ }) => void;
21
+ getMoovBoxAndPrecomputed: () => {
22
+ moovBox: import("../../containers/iso-base-media/moov/moov").MoovBox;
23
+ precomputed: boolean;
24
+ } | null;
19
25
  };
20
26
  mfra: {
21
27
  triggerLoad: () => Promise<import("../../containers/iso-base-media/base-media-box").IsoBaseMediaBox[] | null>;
28
+ getIfAlreadyLoaded: () => import("../../containers/iso-base-media/base-media-box").IsoBaseMediaBox[] | null;
29
+ setFromSeekingHints: (hints: import("../../seeking-hints").IsoBaseMediaSeekingHints) => void;
30
+ };
31
+ moof: {
32
+ getMoofBoxes: () => import("./precomputed-moof").MoofBox[];
33
+ setMoofBoxes: (boxes: import("./precomputed-moof").MoofBox[]) => void;
34
+ };
35
+ tfra: {
36
+ getTfraBoxes: () => import("../../containers/iso-base-media/mfra/tfra").TfraBox[];
37
+ setTfraBoxes: (boxes: import("../../containers/iso-base-media/mfra/tfra").TfraBox[]) => void;
22
38
  };
23
39
  };
24
40
  export type IsoBaseMediaState = ReturnType<typeof isoBaseMediaState>;
@@ -4,6 +4,8 @@ exports.isoBaseMediaState = void 0;
4
4
  const cached_sample_positions_1 = require("./cached-sample-positions");
5
5
  const lazy_mfra_load_1 = require("./lazy-mfra-load");
6
6
  const moov_box_1 = require("./moov-box");
7
+ const precomputed_moof_1 = require("./precomputed-moof");
8
+ const precomputed_tfra_1 = require("./precomputed-tfra");
7
9
  const isoBaseMediaState = ({ contentLength, controller, readerInterface, src, logLevel, }) => {
8
10
  return {
9
11
  flatSamples: (0, cached_sample_positions_1.cachedSamplePositionsState)(),
@@ -15,6 +17,8 @@ const isoBaseMediaState = ({ contentLength, controller, readerInterface, src, lo
15
17
  src,
16
18
  logLevel,
17
19
  }),
20
+ moof: (0, precomputed_moof_1.precomputedMoofState)(),
21
+ tfra: (0, precomputed_tfra_1.precomputedTfraState)(),
18
22
  };
19
23
  };
20
24
  exports.isoBaseMediaState = isoBaseMediaState;
@@ -3,6 +3,7 @@ import type { MediaParserController } from '../../controller/media-parser-contro
3
3
  import { type LogLevel } from '../../log';
4
4
  import type { ParseMediaSrc } from '../../options';
5
5
  import type { ReaderInterface } from '../../readers/reader';
6
+ import type { IsoBaseMediaSeekingHints } from '../../seeking-hints';
6
7
  export declare const lazyMfraLoad: ({ contentLength, controller, readerInterface, src, logLevel, }: {
7
8
  contentLength: number;
8
9
  controller: MediaParserController;
@@ -11,4 +12,6 @@ export declare const lazyMfraLoad: ({ contentLength, controller, readerInterface
11
12
  logLevel: LogLevel;
12
13
  }) => {
13
14
  triggerLoad: () => Promise<IsoBaseMediaBox[] | null>;
15
+ getIfAlreadyLoaded: () => IsoBaseMediaBox[] | null;
16
+ setFromSeekingHints: (hints: IsoBaseMediaSeekingHints) => void;
14
17
  };
@@ -5,6 +5,7 @@ const get_mfra_seeking_box_1 = require("../../containers/iso-base-media/get-mfra
5
5
  const log_1 = require("../../log");
6
6
  const lazyMfraLoad = ({ contentLength, controller, readerInterface, src, logLevel, }) => {
7
7
  let prom = null;
8
+ let result = null;
8
9
  const triggerLoad = () => {
9
10
  if (prom) {
10
11
  return prom;
@@ -18,12 +19,24 @@ const lazyMfraLoad = ({ contentLength, controller, readerInterface, src, logLeve
18
19
  logLevel,
19
20
  }).then((boxes) => {
20
21
  log_1.Log.verbose(logLevel, 'Lazily found mfra atom.');
22
+ result = boxes;
21
23
  return boxes;
22
24
  });
23
25
  return prom;
24
26
  };
27
+ const getIfAlreadyLoaded = () => {
28
+ if (result) {
29
+ return result;
30
+ }
31
+ return null;
32
+ };
33
+ const setFromSeekingHints = (hints) => {
34
+ result = hints.mfraAlreadyLoaded;
35
+ };
25
36
  return {
26
37
  triggerLoad,
38
+ getIfAlreadyLoaded,
39
+ setFromSeekingHints,
27
40
  };
28
41
  };
29
42
  exports.lazyMfraLoad = lazyMfraLoad;
@@ -1,5 +1,10 @@
1
1
  import type { MoovBox } from '../../containers/iso-base-media/moov/moov';
2
+ type MoovBoxAndPrecomputed = {
3
+ moovBox: MoovBox;
4
+ precomputed: boolean;
5
+ };
2
6
  export declare const moovState: () => {
3
- setMoovBox: (moov: MoovBox) => void;
4
- getMoovBox: () => MoovBox | null;
7
+ setMoovBox: (moov: MoovBoxAndPrecomputed) => void;
8
+ getMoovBoxAndPrecomputed: () => MoovBoxAndPrecomputed | null;
5
9
  };
10
+ export {};
@@ -7,7 +7,7 @@ const moovState = () => {
7
7
  setMoovBox: (moov) => {
8
8
  moovBox = moov;
9
9
  },
10
- getMoovBox: () => moovBox,
10
+ getMoovBoxAndPrecomputed: () => moovBox,
11
11
  };
12
12
  };
13
13
  exports.moovState = moovState;
@@ -0,0 +1,11 @@
1
+ import type { IsoBaseMediaBox } from '../../containers/iso-base-media/base-media-box';
2
+ export type MoofBox = {
3
+ offset: number;
4
+ trafBoxes: IsoBaseMediaBox[];
5
+ };
6
+ export declare const precomputedMoofState: () => {
7
+ getMoofBoxes: () => MoofBox[];
8
+ setMoofBoxes: (boxes: MoofBox[]) => void;
9
+ };
10
+ export declare const toMoofBox: (box: IsoBaseMediaBox) => MoofBox;
11
+ export declare const deduplicateMoofBoxesByOffset: (moofBoxes: MoofBox[]) => MoofBox[];
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.deduplicateMoofBoxesByOffset = exports.toMoofBox = exports.precomputedMoofState = void 0;
4
+ // Note: May be duplicated!
5
+ const precomputedMoofState = () => {
6
+ let moofBoxes = [];
7
+ return {
8
+ getMoofBoxes: () => moofBoxes,
9
+ setMoofBoxes: (boxes) => {
10
+ moofBoxes = boxes;
11
+ },
12
+ };
13
+ };
14
+ exports.precomputedMoofState = precomputedMoofState;
15
+ const toMoofBox = (box) => {
16
+ if (box.type !== 'regular-box') {
17
+ throw new Error('expected regular bpx');
18
+ }
19
+ return {
20
+ offset: box.offset,
21
+ trafBoxes: box.children.filter((c) => c.type === 'regular-box' && c.boxType === 'traf'),
22
+ };
23
+ };
24
+ exports.toMoofBox = toMoofBox;
25
+ const deduplicateMoofBoxesByOffset = (moofBoxes) => {
26
+ return moofBoxes.filter((m, i, arr) => i === arr.findIndex((t) => t.offset === m.offset));
27
+ };
28
+ exports.deduplicateMoofBoxesByOffset = deduplicateMoofBoxesByOffset;
@@ -0,0 +1,6 @@
1
+ import type { TfraBox } from '../../containers/iso-base-media/mfra/tfra';
2
+ export declare const precomputedTfraState: () => {
3
+ getTfraBoxes: () => TfraBox[];
4
+ setTfraBoxes: (boxes: TfraBox[]) => void;
5
+ };
6
+ export declare const deduplicateTfraBoxesByOffset: (tfraBoxes: TfraBox[]) => TfraBox[];
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.deduplicateTfraBoxesByOffset = exports.precomputedTfraState = void 0;
4
+ const precomputedTfraState = () => {
5
+ let tfraBoxes = [];
6
+ return {
7
+ getTfraBoxes: () => tfraBoxes,
8
+ setTfraBoxes: (boxes) => {
9
+ tfraBoxes = boxes;
10
+ },
11
+ };
12
+ };
13
+ exports.precomputedTfraState = precomputedTfraState;
14
+ const deduplicateTfraBoxesByOffset = (tfraBoxes) => {
15
+ return tfraBoxes.filter((m, i, arr) => i === arr.findIndex((t) => t.offset === m.offset));
16
+ };
17
+ exports.deduplicateTfraBoxesByOffset = deduplicateTfraBoxesByOffset;
@@ -1,6 +1,8 @@
1
1
  import type { MediaParserKeyframe } from '../options';
2
+ import type { WebmSeekingHints } from '../seeking-hints';
2
3
  export declare const keyframesState: () => {
3
4
  addKeyframe: (keyframe: MediaParserKeyframe) => void;
4
5
  getKeyframes: () => MediaParserKeyframe[];
6
+ setFromSeekingHints: (hints: WebmSeekingHints) => void;
5
7
  };
6
8
  export type KeyframesState = ReturnType<typeof keyframesState>;
@@ -3,16 +3,24 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.keyframesState = void 0;
4
4
  const keyframesState = () => {
5
5
  const keyframes = [];
6
+ const addKeyframe = (keyframe) => {
7
+ if (keyframes.find((k) => k.positionInBytes === keyframe.positionInBytes)) {
8
+ return;
9
+ }
10
+ keyframes.push(keyframe);
11
+ };
12
+ const getKeyframes = () => {
13
+ return keyframes;
14
+ };
15
+ const setFromSeekingHints = (hints) => {
16
+ for (const keyframe of hints.keyframes) {
17
+ addKeyframe(keyframe);
18
+ }
19
+ };
6
20
  return {
7
- addKeyframe: (keyframe) => {
8
- if (keyframes.find((k) => k.positionInBytes === keyframe.positionInBytes)) {
9
- return;
10
- }
11
- keyframes.push(keyframe);
12
- },
13
- getKeyframes: () => {
14
- return keyframes;
15
- },
21
+ addKeyframe,
22
+ getKeyframes,
23
+ setFromSeekingHints,
16
24
  };
17
25
  };
18
26
  exports.keyframesState = keyframesState;
@@ -3,6 +3,7 @@ import type { MediaParserController } from '../../controller/media-parser-contro
3
3
  import type { LogLevel } from '../../log';
4
4
  import type { ParseMediaSrc } from '../../options';
5
5
  import type { ReaderInterface } from '../../readers/reader';
6
+ import type { WebmSeekingHints } from '../../seeking-hints';
6
7
  export declare const lazyCuesFetch: ({ controller, logLevel, readerInterface, src, }: {
7
8
  controller: MediaParserController;
8
9
  logLevel: LogLevel;
@@ -14,6 +15,11 @@ export declare const lazyCuesFetch: ({ controller, logLevel, readerInterface, sr
14
15
  cues: MatroskaCue[];
15
16
  segmentOffset: number;
16
17
  } | null>;
18
+ getIfAlreadyLoaded: () => {
19
+ cues: MatroskaCue[];
20
+ segmentOffset: number;
21
+ } | null;
22
+ setFromSeekingHints: (hints: WebmSeekingHints) => void;
17
23
  };
18
24
  export type LazyCuesFetch = ReturnType<typeof lazyCuesFetch>;
19
- export type LazyCuesLoaded = Awaited<ReturnType<LazyCuesFetch['getLoadedCues']>>;
25
+ export type LazyCuesLoadedOrNull = Awaited<ReturnType<LazyCuesFetch['getLoadedCues']>>;