@remotion/media-parser 4.0.286 → 4.0.287

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 (225) hide show
  1. package/dist/containers/flac/get-channel-count.d.ts +1 -1
  2. package/dist/containers/iso-base-media/collect-sample-positions-from-moof-boxes.d.ts +2 -2
  3. package/dist/containers/iso-base-media/collect-sample-positions-from-moof-boxes.js +6 -3
  4. package/dist/containers/iso-base-media/get-keyframes.js +1 -1
  5. package/dist/containers/iso-base-media/get-sample-positions-from-track.d.ts +2 -2
  6. package/dist/containers/iso-base-media/get-seeking-byte.d.ts +15 -0
  7. package/dist/containers/iso-base-media/{get-seeking-from-mp4.js → get-seeking-byte.js} +16 -2
  8. package/dist/containers/iso-base-media/mdat/mdat.js +6 -3
  9. package/dist/containers/iso-base-media/process-box.js +5 -3
  10. package/dist/containers/iso-base-media/{get-seeking-info-from-mp4.d.ts → seeking-hints.d.ts} +8 -3
  11. package/dist/containers/iso-base-media/seeking-hints.js +52 -0
  12. package/dist/containers/iso-base-media/traversal.d.ts +4 -2
  13. package/dist/containers/iso-base-media/traversal.js +6 -5
  14. package/dist/containers/m3u/iterate-over-segment-files.js +23 -20
  15. package/dist/containers/riff/parse-video-section.js +1 -1
  16. package/dist/containers/transport-stream/handle-aac-packet.js +4 -1
  17. package/dist/containers/transport-stream/handle-avc-packet.js +4 -1
  18. package/dist/containers/transport-stream/seeking-hints.d.ts +9 -0
  19. package/dist/containers/transport-stream/seeking-hints.js +26 -0
  20. package/dist/containers/wav/get-seeking-byte.d.ts +2 -2
  21. package/dist/containers/wav/get-seeking-byte.js +2 -2
  22. package/dist/containers/wav/seeking-hints.d.ts +12 -0
  23. package/dist/containers/wav/seeking-hints.js +25 -0
  24. package/dist/containers/webm/seek/get-seeking-byte.d.ts +3 -5
  25. package/dist/containers/webm/seek/get-seeking-byte.js +5 -5
  26. package/dist/containers/webm/seek/seeking-hints.d.ts +10 -0
  27. package/dist/containers/webm/seek/seeking-hints.js +28 -0
  28. package/dist/controller/media-parser-controller.d.ts +3 -0
  29. package/dist/controller/media-parser-controller.js +15 -0
  30. package/dist/download-and-parse-media.js +2 -1
  31. package/dist/emit-available-info.js +1 -1
  32. package/dist/esm/index.mjs +430 -197
  33. package/dist/esm/node-writer.mjs +1 -2
  34. package/dist/esm/node.mjs +1 -2
  35. package/dist/esm/server-worker.mjs +46 -1
  36. package/dist/esm/universal.mjs +2 -4
  37. package/dist/esm/web.mjs +1 -2
  38. package/dist/esm/worker-server-entry.mjs +466 -204
  39. package/dist/esm/worker-web-entry.mjs +465 -202
  40. package/dist/esm/worker.mjs +46 -1
  41. package/dist/{forward-controller.d.ts → forward-controller-pause-resume-abort.d.ts} +1 -1
  42. package/dist/{forward-controller.js → forward-controller-pause-resume-abort.js} +3 -3
  43. package/dist/get-audio-codec.js +2 -2
  44. package/dist/get-dimensions.js +1 -1
  45. package/dist/get-duration.js +3 -2
  46. package/dist/get-fps.js +1 -0
  47. package/dist/get-is-hdr.js +2 -2
  48. package/dist/get-keyframes.js +1 -1
  49. package/dist/get-seeking-byte.d.ts +7 -5
  50. package/dist/get-seeking-byte.js +13 -12
  51. package/dist/{get-seeking-info.d.ts → get-seeking-hints.d.ts} +7 -3
  52. package/dist/get-seeking-hints.js +35 -0
  53. package/dist/get-tracks.d.ts +4 -4
  54. package/dist/get-tracks.js +8 -6
  55. package/dist/get-video-codec.js +2 -2
  56. package/dist/has-all-info.js +1 -1
  57. package/dist/index.d.ts +31 -3
  58. package/dist/internal-parse-media.js +16 -1
  59. package/dist/iterator/buffer-iterator.js +3 -4
  60. package/dist/metadata/metadata-from-iso.js +1 -0
  61. package/dist/options.d.ts +2 -0
  62. package/dist/parse-media-on-worker-entry.js +51 -1
  63. package/dist/parse-media.js +2 -1
  64. package/dist/samples-from-moof.d.ts +2 -2
  65. package/dist/samples-from-moof.js +5 -8
  66. package/dist/seeking-hints.d.ts +39 -0
  67. package/dist/set-seeking-hints.d.ts +6 -0
  68. package/dist/set-seeking-hints.js +27 -0
  69. package/dist/state/has-tracks-section.js +3 -1
  70. package/dist/state/iso-base-media/cached-sample-positions.js +1 -1
  71. package/dist/state/iso-base-media/iso-state.d.ts +18 -2
  72. package/dist/state/iso-base-media/iso-state.js +4 -0
  73. package/dist/state/iso-base-media/lazy-mfra-load.d.ts +3 -0
  74. package/dist/state/iso-base-media/lazy-mfra-load.js +13 -0
  75. package/dist/state/iso-base-media/moov-box.d.ts +7 -2
  76. package/dist/state/iso-base-media/moov-box.js +1 -1
  77. package/dist/state/iso-base-media/precomputed-moof.d.ts +11 -0
  78. package/dist/state/iso-base-media/precomputed-moof.js +28 -0
  79. package/dist/state/iso-base-media/precomputed-tfra.d.ts +6 -0
  80. package/dist/state/iso-base-media/precomputed-tfra.js +17 -0
  81. package/dist/state/keyframes.d.ts +2 -0
  82. package/dist/state/keyframes.js +17 -9
  83. package/dist/state/matroska/lazy-cues-fetch.d.ts +7 -1
  84. package/dist/state/matroska/lazy-cues-fetch.js +21 -0
  85. package/dist/state/matroska/webm.d.ts +7 -0
  86. package/dist/state/matroska/webm.js +9 -1
  87. package/dist/state/parser-state.d.ts +31 -3
  88. package/dist/state/samples-observed/slow-duration-fps.js +0 -3
  89. package/dist/state/transport-stream/observed-pes-header.d.ts +2 -0
  90. package/dist/state/transport-stream/observed-pes-header.js +22 -12
  91. package/dist/state/transport-stream/pts-start-offset.d.ts +4 -1
  92. package/dist/state/transport-stream/pts-start-offset.js +1 -1
  93. package/dist/state/transport-stream/transport-stream.d.ts +5 -1
  94. package/dist/version.d.ts +1 -1
  95. package/dist/version.js +1 -1
  96. package/dist/with-resolvers.d.ts +5 -0
  97. package/dist/work-on-seek-request.js +8 -5
  98. package/dist/worker/{forward-controller.js → forward-controller-to-worker.js} +17 -0
  99. package/dist/worker/serialize-error.d.ts +6 -1
  100. package/dist/worker/serialize-error.js +2 -1
  101. package/dist/worker/worker-types.d.ts +12 -2
  102. package/dist/worker-server.js +16 -5
  103. package/package.json +3 -3
  104. package/dist/containers/iso-base-media/get-mfra-atom.d.ts +0 -9
  105. package/dist/containers/iso-base-media/get-mfra-atom.js +0 -12
  106. package/dist/containers/iso-base-media/get-seeking-from-mp4.d.ts +0 -11
  107. package/dist/containers/iso-base-media/get-seeking-info-from-mp4.js +0 -25
  108. package/dist/containers/iso-base-media/mfra/mfra.d.ts +0 -2
  109. package/dist/containers/iso-base-media/mfra/mfra.js +0 -11
  110. package/dist/containers/transport-stream/get-seeking-info.d.ts +0 -4
  111. package/dist/containers/transport-stream/get-seeking-info.js +0 -17
  112. package/dist/containers/transport-stream/next-pes-header-store.d.ts +0 -6
  113. package/dist/containers/transport-stream/next-pes-header-store.js +0 -18
  114. package/dist/containers/transport-stream/start-offset.d.ts +0 -4
  115. package/dist/containers/transport-stream/start-offset.js +0 -13
  116. package/dist/containers/wav/get-seeking-info.d.ts +0 -7
  117. package/dist/containers/wav/get-seeking-info.js +0 -20
  118. package/dist/containers/wav/parse-video-section.d.ts +0 -5
  119. package/dist/containers/wav/parse-video-section.js +0 -41
  120. package/dist/containers/webm/cues/fetch-web-cues.d.ts +0 -12
  121. package/dist/containers/webm/cues/fetch-web-cues.js +0 -32
  122. package/dist/containers/webm/cues/format-cues.d.ts +0 -8
  123. package/dist/containers/webm/cues/format-cues.js +0 -41
  124. package/dist/containers/webm/cues/get-seeking-byte.d.ts +0 -14
  125. package/dist/containers/webm/cues/get-seeking-byte.js +0 -91
  126. package/dist/containers/webm/fetch-web-cues.d.ts +0 -12
  127. package/dist/containers/webm/fetch-web-cues.js +0 -29
  128. package/dist/containers/webm/get-seeking-byte.d.ts +0 -14
  129. package/dist/containers/webm/get-seeking-byte.js +0 -91
  130. package/dist/containers/webm/get-seeking-info.d.ts +0 -3
  131. package/dist/containers/webm/get-seeking-info.js +0 -17
  132. package/dist/containers/webm/seek/get-seeking-info.d.ts +0 -3
  133. package/dist/containers/webm/seek/get-seeking-info.js +0 -17
  134. package/dist/emitter.d.ts +0 -33
  135. package/dist/emitter.js +0 -65
  136. package/dist/get-sample-positions-from-lpcm.d.ts +0 -3
  137. package/dist/get-sample-positions-from-lpcm.js +0 -46
  138. package/dist/get-seeking-info.js +0 -35
  139. package/dist/media-parser-controller.d.ts +0 -21
  140. package/dist/media-parser-controller.js +0 -38
  141. package/dist/pause-signal.d.ts +0 -11
  142. package/dist/pause-signal.js +0 -38
  143. package/dist/readers/state/aac-state.d.ts +0 -13
  144. package/dist/readers/state/aac-state.js +0 -17
  145. package/dist/readers/state/can-skip-tracks.d.ts +0 -16
  146. package/dist/readers/state/can-skip-tracks.js +0 -60
  147. package/dist/readers/state/current-reader.d.ts +0 -6
  148. package/dist/readers/state/current-reader.js +0 -13
  149. package/dist/readers/state/emitted-fields.d.ts +0 -1
  150. package/dist/readers/state/emitted-fields.js +0 -37
  151. package/dist/readers/state/flac-state.d.ts +0 -4
  152. package/dist/readers/state/flac-state.js +0 -13
  153. package/dist/readers/state/has-tracks-section.d.ts +0 -14
  154. package/dist/readers/state/has-tracks-section.js +0 -37
  155. package/dist/readers/state/images.d.ts +0 -9
  156. package/dist/readers/state/images.js +0 -14
  157. package/dist/readers/state/iso-base-media/cached-sample-positions.d.ts +0 -12
  158. package/dist/readers/state/iso-base-media/cached-sample-positions.js +0 -46
  159. package/dist/readers/state/iso-base-media/iso-state.d.ts +0 -24
  160. package/dist/readers/state/iso-base-media/iso-state.js +0 -20
  161. package/dist/readers/state/iso-base-media/lazy-mfra-load.d.ts +0 -13
  162. package/dist/readers/state/iso-base-media/lazy-mfra-load.js +0 -29
  163. package/dist/readers/state/iso-base-media/moov-box.d.ts +0 -5
  164. package/dist/readers/state/iso-base-media/moov-box.js +0 -13
  165. package/dist/readers/state/keyframes.d.ts +0 -6
  166. package/dist/readers/state/keyframes.js +0 -15
  167. package/dist/readers/state/m3u-state.d.ts +0 -44
  168. package/dist/readers/state/m3u-state.js +0 -124
  169. package/dist/readers/state/may-skip-video-data.d.ts +0 -4
  170. package/dist/readers/state/may-skip-video-data.js +0 -18
  171. package/dist/readers/state/mp3.d.ts +0 -15
  172. package/dist/readers/state/mp3.js +0 -19
  173. package/dist/readers/state/need-samples-for-fields.d.ts +0 -6
  174. package/dist/readers/state/need-samples-for-fields.js +0 -39
  175. package/dist/readers/state/parser-state.d.ts +0 -252
  176. package/dist/readers/state/parser-state.js +0 -124
  177. package/dist/readers/state/riff.d.ts +0 -10
  178. package/dist/readers/state/riff.js +0 -32
  179. package/dist/readers/state/sample-callbacks.d.ts +0 -44
  180. package/dist/readers/state/sample-callbacks.js +0 -118
  181. package/dist/readers/state/seek-infinite-loop.d.ts +0 -5
  182. package/dist/readers/state/seek-infinite-loop.js +0 -22
  183. package/dist/readers/state/slow-duration-fps.d.ts +0 -11
  184. package/dist/readers/state/slow-duration-fps.js +0 -86
  185. package/dist/readers/state/structure.d.ts +0 -15
  186. package/dist/readers/state/structure.js +0 -78
  187. package/dist/readers/state/timings.d.ts +0 -8
  188. package/dist/readers/state/timings.js +0 -13
  189. package/dist/readers/state/transport-stream/last-emitted-sample.d.ts +0 -6
  190. package/dist/readers/state/transport-stream/last-emitted-sample.js +0 -16
  191. package/dist/readers/state/transport-stream/next-pes-header-store.d.ts +0 -6
  192. package/dist/readers/state/transport-stream/next-pes-header-store.js +0 -18
  193. package/dist/readers/state/transport-stream/start-offset.d.ts +0 -4
  194. package/dist/readers/state/transport-stream/start-offset.js +0 -13
  195. package/dist/readers/state/transport-stream/transport-stream.d.ts +0 -19
  196. package/dist/readers/state/transport-stream/transport-stream.js +0 -25
  197. package/dist/readers/state/video-section.d.ts +0 -33
  198. package/dist/readers/state/video-section.js +0 -65
  199. package/dist/readers/state/webm.d.ts +0 -28
  200. package/dist/readers/state/webm.js +0 -109
  201. package/dist/seek-signal.d.ts +0 -19
  202. package/dist/seek-signal.js +0 -24
  203. package/dist/seeking-info.d.ts +0 -31
  204. package/dist/server-worker.module.d.ts +0 -2
  205. package/dist/server-worker.module.js +0 -12
  206. package/dist/state/matroska/lazy-seek-fetch.d.ts +0 -1
  207. package/dist/state/matroska/lazy-seek-fetch.js +0 -5
  208. package/dist/state/matroska.d.ts +0 -0
  209. package/dist/state/matroska.js +0 -1
  210. package/dist/state/slow-duration-fps.d.ts +0 -11
  211. package/dist/state/slow-duration-fps.js +0 -86
  212. package/dist/state/transport-stream/start-offset.d.ts +0 -5
  213. package/dist/state/transport-stream/start-offset.js +0 -13
  214. package/dist/state/transport-stream.d.ts +0 -8
  215. package/dist/state/transport-stream.js +0 -11
  216. package/dist/state/uml.d.ts +0 -32
  217. package/dist/state/uml.js +0 -52
  218. package/dist/state/webm.d.ts +0 -30
  219. package/dist/state/webm.js +0 -109
  220. package/dist/state/work-on-seek-request-options.d.ts +0 -3
  221. package/dist/state/work-on-seek-request-options.js +0 -26
  222. package/dist/worker.module.d.ts +0 -4
  223. package/dist/worker.module.js +0 -12
  224. /package/dist/{seeking-info.js → seeking-hints.js} +0 -0
  225. /package/dist/worker/{forward-controller.d.ts → forward-controller-to-worker.d.ts} +0 -0
@@ -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[];
@@ -61,15 +61,12 @@ const getSamplesFromTraf = (trafSegment, moofOffset) => {
61
61
  return samples;
62
62
  };
63
63
  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) => {
64
+ const mapped = moofBox.trafBoxes.map((traf) => {
69
65
  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
- : [];
66
+ if (!tfhdBox || tfhdBox.trackId !== trackId) {
67
+ return [];
68
+ }
69
+ return getSamplesFromTraf(traf, moofBox.offset);
73
70
  });
74
71
  return mapped.flat(1);
75
72
  };
@@ -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;
@@ -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']>>;
@@ -6,6 +6,7 @@ const log_1 = require("../../log");
6
6
  const lazyCuesFetch = ({ controller, logLevel, readerInterface, src, }) => {
7
7
  let prom = null;
8
8
  let sOffset = null;
9
+ let result = null;
9
10
  const triggerLoad = (position, segmentOffset) => {
10
11
  if (prom) {
11
12
  return prom;
@@ -23,6 +24,7 @@ const lazyCuesFetch = ({ controller, logLevel, readerInterface, src, }) => {
23
24
  src,
24
25
  }).then((cues) => {
25
26
  log_1.Log.verbose(logLevel, 'Cues loaded');
27
+ result = cues;
26
28
  return cues;
27
29
  });
28
30
  return prom;
@@ -43,9 +45,28 @@ const lazyCuesFetch = ({ controller, logLevel, readerInterface, src, }) => {
43
45
  segmentOffset: sOffset,
44
46
  };
45
47
  };
48
+ const getIfAlreadyLoaded = () => {
49
+ if (result) {
50
+ if (!sOffset) {
51
+ throw new Error('Segment offset not set');
52
+ }
53
+ return {
54
+ cues: result,
55
+ segmentOffset: sOffset,
56
+ };
57
+ }
58
+ return null;
59
+ };
60
+ const setFromSeekingHints = (hints) => {
61
+ var _a, _b, _c, _d;
62
+ result = (_b = (_a = hints.loadedCues) === null || _a === void 0 ? void 0 : _a.cues) !== null && _b !== void 0 ? _b : null;
63
+ sOffset = (_d = (_c = hints.loadedCues) === null || _c === void 0 ? void 0 : _c.segmentOffset) !== null && _d !== void 0 ? _d : null;
64
+ };
46
65
  return {
47
66
  triggerLoad,
48
67
  getLoadedCues,
68
+ getIfAlreadyLoaded,
69
+ setFromSeekingHints,
49
70
  };
50
71
  };
51
72
  exports.lazyCuesFetch = lazyCuesFetch;
@@ -28,11 +28,18 @@ export declare const webmState: ({ controller, logLevel, readerInterface, src, }
28
28
  cues: import("../../containers/webm/seek/format-cues").MatroskaCue[];
29
29
  segmentOffset: number;
30
30
  } | null>;
31
+ getIfAlreadyLoaded: () => {
32
+ cues: import("../../containers/webm/seek/format-cues").MatroskaCue[];
33
+ segmentOffset: number;
34
+ } | null;
35
+ setFromSeekingHints: (hints: import("../../seeking-hints").WebmSeekingHints) => void;
31
36
  };
32
37
  onTrackEntrySegment: OnTrackEntrySegment;
33
38
  getTrackInfoByNumber: (id: number) => TrackInfo;
34
39
  setTimestampOffset: (byteOffset: number, timestamp: number) => void;
35
40
  getTimestampOffsetForByteOffset: (byteOffset: number) => number | undefined;
41
+ getTimeStampMapForSeekingHints: () => Map<number, number>;
42
+ setTimeStampMapForSeekingHints: (newTimestampMap: Map<number, number>) => void;
36
43
  getTimescale: () => number;
37
44
  setTimescale: (newTimescale: number) => void;
38
45
  addSegment: (seg: Omit<SegmentSection, "index">) => void;
@@ -24,7 +24,7 @@ const webmState = ({ controller, logLevel, readerInterface, src, }) => {
24
24
  trackTimescale: (_a = trackTimescale === null || trackTimescale === void 0 ? void 0 : trackTimescale.value) !== null && _a !== void 0 ? _a : null,
25
25
  };
26
26
  };
27
- const timestampMap = new Map();
27
+ let timestampMap = new Map();
28
28
  const getTimestampOffsetForByteOffset = (byteOffset) => {
29
29
  const entries = Array.from(timestampMap.entries());
30
30
  const sortedByByteOffset = entries
@@ -71,12 +71,20 @@ const webmState = ({ controller, logLevel, readerInterface, src, }) => {
71
71
  readerInterface,
72
72
  src,
73
73
  });
74
+ const getTimeStampMapForSeekingHints = () => {
75
+ return timestampMap;
76
+ };
77
+ const setTimeStampMapForSeekingHints = (newTimestampMap) => {
78
+ timestampMap = newTimestampMap;
79
+ };
74
80
  return {
75
81
  cues,
76
82
  onTrackEntrySegment,
77
83
  getTrackInfoByNumber: (id) => trackEntries[id],
78
84
  setTimestampOffset,
79
85
  getTimestampOffsetForByteOffset,
86
+ getTimeStampMapForSeekingHints,
87
+ setTimeStampMapForSeekingHints,
80
88
  getTimescale,
81
89
  setTimescale,
82
90
  addSegment: (seg) => {