@remotion/media-parser 4.0.280 → 4.0.284

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (269) hide show
  1. package/dist/check-if-done.js +1 -1
  2. package/dist/containers/aac/parse-aac.js +21 -12
  3. package/dist/containers/flac/get-channel-count.d.ts +1 -1
  4. package/dist/containers/flac/get-duration-from-flac.js +1 -1
  5. package/dist/containers/flac/get-sample-rate.js +1 -1
  6. package/dist/containers/flac/parse-flac-frame.js +18 -13
  7. package/dist/containers/flac/parse-flac.js +3 -3
  8. package/dist/containers/flac/parse-header.js +1 -1
  9. package/dist/containers/flac/parse-metadata.js +1 -1
  10. package/dist/containers/flac/parse-streaminfo.js +7 -2
  11. package/dist/containers/flac/parse-unknown-block.js +1 -1
  12. package/dist/containers/iso-base-media/base-media-box.d.ts +2 -1
  13. package/dist/containers/iso-base-media/collect-sample-positions-from-moof-boxes.d.ts +11 -0
  14. package/dist/containers/iso-base-media/collect-sample-positions-from-moof-boxes.js +13 -0
  15. package/dist/containers/iso-base-media/collect-sample-positions-from-trak.d.ts +2 -0
  16. package/dist/containers/iso-base-media/collect-sample-positions-from-trak.js +46 -0
  17. package/dist/containers/iso-base-media/find-keyframe-before-time.d.ts +10 -0
  18. package/dist/containers/iso-base-media/find-keyframe-before-time.js +28 -0
  19. package/dist/containers/iso-base-media/get-children.d.ts +7 -3
  20. package/dist/containers/iso-base-media/get-children.js +7 -3
  21. package/dist/containers/iso-base-media/get-keyframes.js +9 -4
  22. package/dist/containers/iso-base-media/get-mfra-atom.d.ts +9 -0
  23. package/dist/containers/iso-base-media/get-mfra-atom.js +12 -0
  24. package/dist/containers/iso-base-media/get-mfra-seeking-box.d.ts +13 -0
  25. package/dist/containers/iso-base-media/get-mfra-seeking-box.js +32 -0
  26. package/dist/containers/iso-base-media/get-moov-atom.js +58 -42
  27. package/dist/containers/iso-base-media/get-sample-position-bounds.d.ts +5 -0
  28. package/dist/containers/iso-base-media/get-sample-position-bounds.js +19 -0
  29. package/dist/containers/iso-base-media/get-sample-positions-from-track.d.ts +7 -2
  30. package/dist/containers/iso-base-media/get-sample-positions-from-track.js +18 -48
  31. package/dist/containers/iso-base-media/get-seeking-from-mp4.d.ts +11 -5
  32. package/dist/containers/iso-base-media/get-seeking-from-mp4.js +100 -36
  33. package/dist/containers/iso-base-media/get-seeking-info-from-mp4.d.ts +11 -0
  34. package/dist/containers/iso-base-media/get-seeking-info-from-mp4.js +25 -0
  35. package/dist/containers/iso-base-media/mdat/mdat.js +42 -26
  36. package/dist/containers/iso-base-media/mfra/find-best-segment-from-tfra.d.ts +11 -0
  37. package/dist/containers/iso-base-media/mfra/find-best-segment-from-tfra.js +27 -0
  38. package/dist/containers/iso-base-media/mfra/get-mfra-atom.d.ts +81 -0
  39. package/dist/containers/iso-base-media/mfra/get-mfra-atom.js +23 -0
  40. package/dist/containers/iso-base-media/mfra/get-mfro-atom.d.ts +9 -0
  41. package/dist/containers/iso-base-media/mfra/get-mfro-atom.js +38 -0
  42. package/dist/containers/iso-base-media/mfra/mfra.d.ts +2 -0
  43. package/dist/containers/iso-base-media/mfra/mfra.js +11 -0
  44. package/dist/containers/iso-base-media/mfra/tfra.d.ts +19 -0
  45. package/dist/containers/iso-base-media/mfra/tfra.js +100 -0
  46. package/dist/containers/iso-base-media/moov/moov.d.ts +7 -3
  47. package/dist/containers/iso-base-media/moov/moov.js +4 -2
  48. package/dist/containers/iso-base-media/parse-boxes.js +20 -4
  49. package/dist/containers/iso-base-media/process-box.d.ts +26 -2
  50. package/dist/containers/iso-base-media/process-box.js +54 -15
  51. package/dist/containers/iso-base-media/stsd/mebx.d.ts +5 -3
  52. package/dist/containers/iso-base-media/stsd/mebx.js +6 -4
  53. package/dist/containers/iso-base-media/stsd/samples.d.ts +8 -5
  54. package/dist/containers/iso-base-media/stsd/samples.js +16 -9
  55. package/dist/containers/iso-base-media/stsd/stsd.d.ts +5 -3
  56. package/dist/containers/iso-base-media/stsd/stsd.js +3 -3
  57. package/dist/containers/iso-base-media/trak/trak.d.ts +5 -3
  58. package/dist/containers/iso-base-media/trak/trak.js +4 -2
  59. package/dist/containers/iso-base-media/traversal.d.ts +9 -2
  60. package/dist/containers/iso-base-media/traversal.js +15 -7
  61. package/dist/containers/m3u/get-duration-from-m3u.js +1 -1
  62. package/dist/containers/m3u/get-streams.js +1 -1
  63. package/dist/containers/m3u/iterate-over-segment-files.d.ts +1 -1
  64. package/dist/containers/m3u/iterate-over-segment-files.js +3 -2
  65. package/dist/containers/m3u/parse-m3u.js +1 -1
  66. package/dist/containers/m3u/run-over-m3u.js +11 -2
  67. package/dist/containers/mp3/id3.js +1 -1
  68. package/dist/containers/mp3/parse-mpeg-header.js +8 -2
  69. package/dist/containers/riff/expect-riff-box.js +7 -2
  70. package/dist/containers/riff/get-tracks-from-avi.js +1 -1
  71. package/dist/containers/riff/parse-movi.js +35 -26
  72. package/dist/containers/riff/parse-riff-body.js +13 -5
  73. package/dist/containers/riff/parse-riff-header.js +1 -1
  74. package/dist/containers/riff/parse-video-section.d.ts +1 -1
  75. package/dist/containers/riff/parse-video-section.js +3 -3
  76. package/dist/containers/transport-stream/get-tracks.js +1 -1
  77. package/dist/containers/transport-stream/handle-aac-packet.js +12 -3
  78. package/dist/containers/transport-stream/handle-avc-packet.js +16 -3
  79. package/dist/containers/transport-stream/parse-packet.js +1 -1
  80. package/dist/containers/transport-stream/parse-transport-stream.js +1 -1
  81. package/dist/containers/transport-stream/process-audio.d.ts +21 -0
  82. package/dist/containers/transport-stream/process-audio.js +54 -0
  83. package/dist/containers/transport-stream/process-sample-if-possible.d.ts +2 -0
  84. package/dist/containers/transport-stream/process-sample-if-possible.js +62 -0
  85. package/dist/containers/transport-stream/process-video.d.ts +20 -0
  86. package/dist/containers/transport-stream/process-video.js +39 -0
  87. package/dist/containers/transport-stream/start-offset.d.ts +4 -0
  88. package/dist/containers/transport-stream/start-offset.js +13 -0
  89. package/dist/containers/wav/get-duration-from-wav.js +1 -1
  90. package/dist/containers/wav/get-seeking-byte.d.ts +7 -0
  91. package/dist/containers/wav/get-seeking-byte.js +15 -0
  92. package/dist/containers/wav/get-seeking-info.d.ts +7 -0
  93. package/dist/containers/wav/get-seeking-info.js +20 -0
  94. package/dist/containers/wav/parse-data.js +2 -2
  95. package/dist/containers/wav/parse-fmt.js +7 -2
  96. package/dist/containers/wav/parse-header.js +1 -1
  97. package/dist/containers/wav/parse-id3.js +1 -1
  98. package/dist/containers/wav/parse-list.js +1 -1
  99. package/dist/containers/wav/parse-media-section.d.ts +5 -0
  100. package/dist/containers/wav/parse-media-section.js +44 -0
  101. package/dist/containers/wav/parse-video-section.js +7 -5
  102. package/dist/containers/wav/parse-wav.js +4 -4
  103. package/dist/containers/webm/get-ready-tracks.js +2 -2
  104. package/dist/containers/webm/parse-ebml.js +17 -5
  105. package/dist/containers/webm/parse-webm-header.js +1 -1
  106. package/dist/controller/emitter.d.ts +33 -0
  107. package/dist/controller/emitter.js +66 -0
  108. package/dist/controller/media-parser-controller.d.ts +23 -0
  109. package/dist/controller/media-parser-controller.js +41 -0
  110. package/dist/controller/pause-signal.d.ts +11 -0
  111. package/dist/controller/pause-signal.js +38 -0
  112. package/dist/controller/performed-seeks-stats.d.ts +11 -0
  113. package/dist/controller/performed-seeks-stats.js +21 -0
  114. package/dist/controller/seek-signal.d.ts +19 -0
  115. package/dist/controller/seek-signal.js +24 -0
  116. package/dist/convert-audio-or-video-sample.d.ts +4 -1
  117. package/dist/convert-audio-or-video-sample.js +19 -6
  118. package/dist/disallow-forward-seek-if-samples-are-needed.d.ts +6 -0
  119. package/dist/disallow-forward-seek-if-samples-are-needed.js +14 -0
  120. package/dist/emit-audio-sample.d.ts +8 -5
  121. package/dist/emit-audio-sample.js +6 -6
  122. package/dist/emit-available-info.js +6 -6
  123. package/dist/emitter.d.ts +9 -0
  124. package/dist/emitter.js +35 -3
  125. package/dist/esm/index.mjs +5698 -4585
  126. package/dist/esm/server-worker.mjs +464 -0
  127. package/dist/esm/worker-server-entry.mjs +6554 -5438
  128. package/dist/esm/worker-web-entry.mjs +5498 -4382
  129. package/dist/esm/worker.mjs +26 -12
  130. package/dist/forward-controller.d.ts +1 -1
  131. package/dist/get-dimensions.js +2 -2
  132. package/dist/get-duration.js +21 -31
  133. package/dist/get-fps.js +7 -3
  134. package/dist/get-keyframes.js +2 -2
  135. package/dist/get-seeking-info.d.ts +19 -3
  136. package/dist/get-seeking-info.js +33 -7
  137. package/dist/get-tracks.js +12 -4
  138. package/dist/has-all-info.js +1 -1
  139. package/dist/index.d.ts +154 -135
  140. package/dist/index.js +3 -1
  141. package/dist/init-video.js +21 -12
  142. package/dist/internal-parse-media.js +6 -2
  143. package/dist/media-parser-controller.d.ts +2 -1
  144. package/dist/media-parser-controller.js +3 -2
  145. package/dist/metadata/get-metadata.js +1 -1
  146. package/dist/metadata/metadata-from-iso.js +5 -1
  147. package/dist/options.d.ts +1 -1
  148. package/dist/parse-loop.js +17 -4
  149. package/dist/parse-media-on-worker-entry.js +10 -6
  150. package/dist/perform-seek.d.ts +23 -3
  151. package/dist/perform-seek.js +44 -8
  152. package/dist/readers/reader.d.ts +1 -1
  153. package/dist/readers/state/aac-state.d.ts +13 -0
  154. package/dist/readers/state/aac-state.js +17 -0
  155. package/dist/readers/state/can-skip-tracks.d.ts +16 -0
  156. package/dist/readers/state/can-skip-tracks.js +60 -0
  157. package/dist/readers/state/current-reader.d.ts +6 -0
  158. package/dist/readers/state/current-reader.js +13 -0
  159. package/dist/readers/state/emitted-fields.d.ts +1 -0
  160. package/dist/readers/state/emitted-fields.js +37 -0
  161. package/dist/readers/state/flac-state.d.ts +4 -0
  162. package/dist/readers/state/flac-state.js +13 -0
  163. package/dist/readers/state/has-tracks-section.d.ts +14 -0
  164. package/dist/readers/state/has-tracks-section.js +37 -0
  165. package/dist/readers/state/images.d.ts +9 -0
  166. package/dist/readers/state/images.js +14 -0
  167. package/dist/readers/state/iso-base-media/cached-sample-positions.d.ts +12 -0
  168. package/dist/readers/state/iso-base-media/cached-sample-positions.js +46 -0
  169. package/dist/readers/state/iso-base-media/iso-state.d.ts +24 -0
  170. package/dist/readers/state/iso-base-media/iso-state.js +20 -0
  171. package/dist/readers/state/iso-base-media/lazy-mfra-load.d.ts +13 -0
  172. package/dist/readers/state/iso-base-media/lazy-mfra-load.js +29 -0
  173. package/dist/readers/state/iso-base-media/moov-box.d.ts +5 -0
  174. package/dist/readers/state/iso-base-media/moov-box.js +13 -0
  175. package/dist/readers/state/keyframes.d.ts +6 -0
  176. package/dist/readers/state/keyframes.js +15 -0
  177. package/dist/readers/state/m3u-state.d.ts +44 -0
  178. package/dist/readers/state/m3u-state.js +124 -0
  179. package/dist/readers/state/may-skip-video-data.d.ts +4 -0
  180. package/dist/readers/state/may-skip-video-data.js +18 -0
  181. package/dist/readers/state/mp3.d.ts +15 -0
  182. package/dist/readers/state/mp3.js +19 -0
  183. package/dist/readers/state/need-samples-for-fields.d.ts +6 -0
  184. package/dist/readers/state/need-samples-for-fields.js +39 -0
  185. package/dist/readers/state/parser-state.d.ts +252 -0
  186. package/dist/readers/state/parser-state.js +124 -0
  187. package/dist/readers/state/riff.d.ts +10 -0
  188. package/dist/readers/state/riff.js +32 -0
  189. package/dist/readers/state/sample-callbacks.d.ts +44 -0
  190. package/dist/readers/state/sample-callbacks.js +118 -0
  191. package/dist/readers/state/seek-infinite-loop.d.ts +5 -0
  192. package/dist/readers/state/seek-infinite-loop.js +22 -0
  193. package/dist/readers/state/slow-duration-fps.d.ts +11 -0
  194. package/dist/readers/state/slow-duration-fps.js +86 -0
  195. package/dist/readers/state/structure.d.ts +15 -0
  196. package/dist/readers/state/structure.js +78 -0
  197. package/dist/readers/state/timings.d.ts +8 -0
  198. package/dist/readers/state/timings.js +13 -0
  199. package/dist/readers/state/transport-stream/last-emitted-sample.d.ts +6 -0
  200. package/dist/readers/state/transport-stream/last-emitted-sample.js +16 -0
  201. package/dist/readers/state/transport-stream/next-pes-header-store.d.ts +6 -0
  202. package/dist/readers/state/transport-stream/next-pes-header-store.js +18 -0
  203. package/dist/readers/state/transport-stream/start-offset.d.ts +4 -0
  204. package/dist/readers/state/transport-stream/start-offset.js +13 -0
  205. package/dist/readers/state/transport-stream/transport-stream.d.ts +19 -0
  206. package/dist/readers/state/transport-stream/transport-stream.js +25 -0
  207. package/dist/readers/state/video-section.d.ts +33 -0
  208. package/dist/readers/state/video-section.js +65 -0
  209. package/dist/readers/state/webm.d.ts +28 -0
  210. package/dist/readers/state/webm.js +109 -0
  211. package/dist/register-track.d.ts +17 -4
  212. package/dist/register-track.js +31 -17
  213. package/dist/run-parse-iteration.js +1 -1
  214. package/dist/seek-backwards.d.ts +15 -2
  215. package/dist/seek-backwards.js +7 -8
  216. package/dist/seek-forwards.d.ts +19 -2
  217. package/dist/seek-forwards.js +19 -12
  218. package/dist/seek-signal.d.ts +3 -6
  219. package/dist/seek-signal.js +4 -6
  220. package/dist/seeking-info.d.ts +11 -1
  221. package/dist/server-worker.d.ts +3 -0
  222. package/dist/server-worker.js +7 -0
  223. package/dist/server-worker.module.d.ts +2 -0
  224. package/dist/server-worker.module.js +12 -0
  225. package/dist/state/current-reader.d.ts +6 -0
  226. package/dist/state/current-reader.js +13 -0
  227. package/dist/state/iso-base-media/cached-sample-positions.d.ts +1 -1
  228. package/dist/state/iso-base-media/cached-sample-positions.js +7 -9
  229. package/dist/state/iso-base-media/iso-state.d.ts +15 -1
  230. package/dist/state/iso-base-media/iso-state.js +9 -1
  231. package/dist/state/iso-base-media/lazy-mfra-load.d.ts +14 -0
  232. package/dist/state/iso-base-media/lazy-mfra-load.js +29 -0
  233. package/dist/state/need-samples-for-fields.d.ts +1 -0
  234. package/dist/state/need-samples-for-fields.js +3 -3
  235. package/dist/state/parser-state.d.ts +146 -130
  236. package/dist/state/parser-state.js +15 -4
  237. package/dist/state/sample-callbacks.d.ts +3 -2
  238. package/dist/state/sample-callbacks.js +2 -4
  239. package/dist/state/seek-infinite-loop.d.ts +5 -0
  240. package/dist/state/seek-infinite-loop.js +22 -0
  241. package/dist/state/transport-stream/last-emitted-sample.d.ts +6 -0
  242. package/dist/state/transport-stream/last-emitted-sample.js +16 -0
  243. package/dist/state/transport-stream/next-pes-header-store.d.ts +6 -0
  244. package/dist/state/transport-stream/next-pes-header-store.js +18 -0
  245. package/dist/state/transport-stream/start-offset.d.ts +4 -0
  246. package/dist/state/transport-stream/start-offset.js +13 -0
  247. package/dist/state/transport-stream/transport-stream.d.ts +19 -0
  248. package/dist/state/transport-stream/transport-stream.js +24 -0
  249. package/dist/state/uml.d.ts +32 -0
  250. package/dist/state/uml.js +52 -0
  251. package/dist/state/video-section.d.ts +24 -6
  252. package/dist/state/video-section.js +51 -22
  253. package/dist/state/work-on-seek-request-options.d.ts +3 -0
  254. package/dist/state/work-on-seek-request-options.js +26 -0
  255. package/dist/throttled-progress.d.ts +1 -1
  256. package/dist/version.d.ts +1 -1
  257. package/dist/version.js +1 -1
  258. package/dist/with-resolvers.d.ts +5 -0
  259. package/dist/with-resolvers.js +13 -0
  260. package/dist/work-on-seek-request.d.ts +42 -1
  261. package/dist/work-on-seek-request.js +104 -15
  262. package/dist/worker/forward-controller.d.ts +1 -1
  263. package/dist/worker/forward-controller.js +4 -0
  264. package/dist/worker/worker-types.d.ts +6 -1
  265. package/dist/worker-server.js +3 -2
  266. package/dist/worker.js +1 -5
  267. package/dist/worker.module.d.ts +4 -0
  268. package/dist/worker.module.js +12 -0
  269. package/package.json +12 -3
@@ -1,3 +1,14 @@
1
+ // src/with-resolvers.ts
2
+ var withResolvers = function() {
3
+ let resolve;
4
+ let reject;
5
+ const promise = new Promise((res, rej) => {
6
+ resolve = res;
7
+ reject = rej;
8
+ });
9
+ return { promise, resolve, reject };
10
+ };
11
+
1
12
  // src/errors.ts
2
13
  class IsAGifError extends Error {
3
14
  mimeType;
@@ -219,16 +230,12 @@ var convertToWorkerPayload = (payload) => {
219
230
  var post = (worker, payload) => {
220
231
  worker.postMessage(payload);
221
232
  };
222
- var parseMediaOnWorkerImplementation = async ({ controller, reader, ...params }, workerUrlEntry, apiName) => {
223
- if (typeof Worker === "undefined") {
224
- throw new Error('"Worker" is not available. Cannot call workerClient()');
225
- }
233
+ var parseMediaOnWorkerImplementation = async ({ controller, reader, ...params }, worker, apiName) => {
226
234
  if (reader) {
227
235
  throw new Error(`\`reader\` should not be provided to \`${apiName}\`. If you want to use it in the browser, use parseMediaOnWorker(). If you also want to read files from the file system, use parseMediaOnServerWorker().`);
228
236
  }
229
- const worker = new Worker(workerUrlEntry);
230
237
  post(worker, convertToWorkerPayload(params));
231
- const { promise, resolve, reject } = Promise.withResolvers();
238
+ const { promise, resolve, reject } = withResolvers();
232
239
  const onAbort = () => {
233
240
  post(worker, { type: "request-abort" });
234
241
  };
@@ -238,6 +245,10 @@ var parseMediaOnWorkerImplementation = async ({ controller, reader, ...params },
238
245
  const onPause = () => {
239
246
  post(worker, { type: "request-pause" });
240
247
  };
248
+ const onSeek = ({ detail: { seek } }) => {
249
+ post(worker, { type: "request-seek", payload: seek });
250
+ controller?._internals.seekSignal.clearSeekIfStillSame(seek);
251
+ };
241
252
  const callbacks = {};
242
253
  function onMessage(message) {
243
254
  const data = message.data;
@@ -425,13 +436,16 @@ var parseMediaOnWorkerImplementation = async ({ controller, reader, ...params },
425
436
  controller?.addEventListener("abort", onAbort);
426
437
  controller?.addEventListener("resume", onResume);
427
438
  controller?.addEventListener("pause", onPause);
439
+ controller?.addEventListener("seek", onSeek);
428
440
  function cleanup() {
429
441
  worker.removeEventListener("message", onMessage);
430
442
  controller?.removeEventListener("abort", onAbort);
431
443
  controller?.removeEventListener("resume", onResume);
432
444
  controller?.removeEventListener("pause", onPause);
445
+ controller?.removeEventListener("seek", onSeek);
433
446
  worker.terminate();
434
447
  }
448
+ controller?._internals.markAsReadyToEmitEvents();
435
449
  const val = await promise;
436
450
  cleanup();
437
451
  return val;
@@ -439,12 +453,12 @@ var parseMediaOnWorkerImplementation = async ({ controller, reader, ...params },
439
453
 
440
454
  // src/worker.module.ts
441
455
  var parseMediaOnWebWorker = (params) => {
442
- return parseMediaOnWorkerImplementation(params, new URL("./worker-web-entry", import.meta.url), "parseMediaOnWebWorker");
443
- };
444
- var parseMediaOnServerWorker = (params) => {
445
- return parseMediaOnWorkerImplementation(params, new URL("./worker-server-entry", import.meta.url), "parseMediaOnServerWorker");
456
+ if (typeof Worker === "undefined") {
457
+ throw new Error('"Worker" is not available. Cannot call parseMediaOnWebWorker()');
458
+ }
459
+ const worker = new Worker(new URL("./worker-web-entry", import.meta.url));
460
+ return parseMediaOnWorkerImplementation(params, worker, "parseMediaOnWebWorker");
446
461
  };
447
462
  export {
448
- parseMediaOnWebWorker,
449
- parseMediaOnServerWorker
463
+ parseMediaOnWebWorker
450
464
  };
@@ -1,4 +1,4 @@
1
- import type { MediaParserController } from './media-parser-controller';
1
+ import type { MediaParserController } from './controller/media-parser-controller';
2
2
  export declare const forwardMediaParserController: ({ parentController, childController, }: {
3
3
  parentController: MediaParserController;
4
4
  childController: MediaParserController;
@@ -4,7 +4,7 @@ exports.hasDimensions = exports.getDimensions = void 0;
4
4
  const get_tracks_1 = require("./get-tracks");
5
5
  const is_audio_structure_1 = require("./is-audio-structure");
6
6
  const getDimensions = (state) => {
7
- const structure = state.getStructureOrNull();
7
+ const structure = state.structure.getStructureOrNull();
8
8
  if (structure && (0, is_audio_structure_1.isAudioStructure)(structure)) {
9
9
  return null;
10
10
  }
@@ -23,7 +23,7 @@ const getDimensions = (state) => {
23
23
  };
24
24
  exports.getDimensions = getDimensions;
25
25
  const hasDimensions = (state) => {
26
- const structure = state.getStructureOrNull();
26
+ const structure = state.structure.getStructureOrNull();
27
27
  if (structure && (0, is_audio_structure_1.isAudioStructure)(structure)) {
28
28
  return true;
29
29
  }
@@ -38,35 +38,18 @@ const isMatroska = (boxes) => {
38
38
  return matroskaBox;
39
39
  };
40
40
  exports.isMatroska = isMatroska;
41
- const isoHasDuration = (parserState) => {
42
- const structure = parserState.getIsoStructure();
43
- const moovBox = (0, traversal_1.getMoovBoxFromState)(parserState);
44
- if (!moovBox) {
45
- return false;
46
- }
47
- const mvhdBox = (0, traversal_1.getMvhdBox)(moovBox);
48
- if (!mvhdBox) {
49
- return false;
50
- }
51
- if (mvhdBox.type !== 'mvhd-box') {
52
- throw new Error('Expected mvhd-box');
53
- }
54
- if (mvhdBox.durationInSeconds > 0) {
55
- return true;
56
- }
57
- // Checking if this is a fragmented mp4
58
- const moofBoxes = (0, traversal_1.getMoofBoxes)(structure.boxes);
59
- const hasMvex = moovBox.children.some((b) => b.type === 'regular-box' && b.boxType === 'mvex');
60
- const isFragmented = moofBoxes.length > 0 || hasMvex;
61
- return !isFragmented;
62
- };
63
41
  const getDurationFromIsoBaseMedia = (parserState) => {
64
- const structure = parserState.getIsoStructure();
65
- const moovBox = (0, traversal_1.getMoovBoxFromState)(parserState);
42
+ const structure = parserState.structure.getIsoStructure();
43
+ const moovBox = (0, traversal_1.getMoovBoxFromState)({
44
+ structureState: parserState.structure,
45
+ isoState: parserState.iso,
46
+ mp4HeaderSegment: parserState.mp4HeaderSegment,
47
+ });
66
48
  if (!moovBox) {
67
49
  return null;
68
50
  }
69
51
  const moofBoxes = (0, traversal_1.getMoofBoxes)(structure.boxes);
52
+ const tfraBoxes = (0, traversal_1.getTfraBoxes)(structure);
70
53
  const mvhdBox = (0, traversal_1.getMvhdBox)(moovBox);
71
54
  if (!mvhdBox) {
72
55
  return null;
@@ -85,18 +68,28 @@ const getDurationFromIsoBaseMedia = (parserState) => {
85
68
  ];
86
69
  const allSamples = allTracks.map((t) => {
87
70
  const { timescale: ts } = t;
88
- const samplePositions = (0, get_sample_positions_from_track_1.getSamplePositionsFromTrack)({
71
+ const { samplePositions, isComplete } = (0, get_sample_positions_from_track_1.getSamplePositionsFromTrack)({
89
72
  trakBox: t.trakBox,
90
73
  moofBoxes,
74
+ tfraBoxes,
91
75
  });
76
+ if (!isComplete) {
77
+ return null;
78
+ }
79
+ if (samplePositions.length === 0) {
80
+ return null;
81
+ }
92
82
  const highest = samplePositions === null || samplePositions === void 0 ? void 0 : samplePositions.map((sp) => (sp.cts + sp.duration) / ts).reduce((a, b) => Math.max(a, b), 0);
93
83
  return highest !== null && highest !== void 0 ? highest : 0;
94
84
  });
95
- const highestTimestamp = Math.max(...allSamples);
85
+ if (allSamples.every((s) => s === null)) {
86
+ return null;
87
+ }
88
+ const highestTimestamp = Math.max(...allSamples.filter((s) => s !== null));
96
89
  return highestTimestamp;
97
90
  };
98
91
  const getDuration = (parserState) => {
99
- const structure = parserState.getStructure();
92
+ const structure = parserState.structure.getStructure();
100
93
  if (structure.type === 'matroska') {
101
94
  return getDurationFromMatroska(structure.boxes);
102
95
  }
@@ -130,13 +123,10 @@ exports.getDuration = getDuration;
130
123
  // `duration` just grabs from metadata, and otherwise returns null
131
124
  // Therefore just checking if we have tracks
132
125
  const hasDuration = (parserState) => {
133
- const structure = parserState.getStructureOrNull();
126
+ const structure = parserState.structure.getStructureOrNull();
134
127
  if (structure === null) {
135
128
  return false;
136
129
  }
137
- if (structure.type === 'iso-base-media') {
138
- return isoHasDuration(parserState);
139
- }
140
130
  return (0, get_tracks_1.getHasTracks)(parserState);
141
131
  };
142
132
  exports.hasDuration = hasDuration;
package/dist/get-fps.js CHANGED
@@ -65,7 +65,11 @@ const getFpsFromMp4TrakBox = (trakBox) => {
65
65
  };
66
66
  exports.getFpsFromMp4TrakBox = getFpsFromMp4TrakBox;
67
67
  const getFpsFromIsoMaseMedia = (state) => {
68
- const moovBox = (0, traversal_1.getMoovBoxFromState)(state);
68
+ const moovBox = (0, traversal_1.getMoovBoxFromState)({
69
+ structureState: state.structure,
70
+ isoState: state.iso,
71
+ mp4HeaderSegment: state.mp4HeaderSegment,
72
+ });
69
73
  if (!moovBox) {
70
74
  return null;
71
75
  }
@@ -91,7 +95,7 @@ const getFpsFromAvi = (structure) => {
91
95
  return null;
92
96
  };
93
97
  const getFps = (state) => {
94
- const segments = state.getStructure();
98
+ const segments = state.structure.getStructure();
95
99
  if (segments.type === 'iso-base-media') {
96
100
  return getFpsFromIsoMaseMedia(state);
97
101
  }
@@ -133,7 +137,7 @@ const hasFps = (state) => {
133
137
  // Not bothering to parse
134
138
  // Users should use `slowFps` field
135
139
  // same goes for audio
136
- const structure = state.getStructure();
140
+ const structure = state.structure.getStructure();
137
141
  if ((0, is_audio_structure_1.isAudioStructure)(structure)) {
138
142
  return true;
139
143
  }
@@ -4,7 +4,7 @@ exports.hasKeyframes = exports.getKeyframes = void 0;
4
4
  const get_keyframes_1 = require("./containers/iso-base-media/get-keyframes");
5
5
  const get_tracks_1 = require("./get-tracks");
6
6
  const getKeyframes = (state) => {
7
- const structure = state.getStructure();
7
+ const structure = state.structure.getStructure();
8
8
  if (structure.type === 'iso-base-media') {
9
9
  return (0, get_keyframes_1.getKeyframesFromIsoBaseMedia)(state);
10
10
  }
@@ -12,7 +12,7 @@ const getKeyframes = (state) => {
12
12
  };
13
13
  exports.getKeyframes = getKeyframes;
14
14
  const hasKeyframes = (parserState) => {
15
- const structure = parserState.getStructure();
15
+ const structure = parserState.structure.getStructure();
16
16
  if (structure.type === 'iso-base-media') {
17
17
  return (0, get_tracks_1.getHasTracks)(parserState);
18
18
  }
@@ -1,4 +1,20 @@
1
+ import type { LogLevel } from './log';
2
+ import type { IsoBaseMediaStructure } from './parse-result';
1
3
  import type { SeekingInfo } from './seeking-info';
2
- import type { ParserState } from './state/parser-state';
3
- export declare const getSeekingInfo: (state: ParserState) => SeekingInfo | null;
4
- export declare const getSeekingByte: (info: SeekingInfo, time: number) => number;
4
+ import type { IsoBaseMediaState } from './state/iso-base-media/iso-state';
5
+ import type { StructureState } from './state/structure';
6
+ import type { MediaSectionState } from './state/video-section';
7
+ import type { SeekResolution } from './work-on-seek-request';
8
+ export declare const getSeekingInfo: ({ structureState, mp4HeaderSegment, mediaSectionState, isoState, }: {
9
+ structureState: StructureState;
10
+ mp4HeaderSegment: IsoBaseMediaStructure | null;
11
+ mediaSectionState: MediaSectionState;
12
+ isoState: IsoBaseMediaState;
13
+ }) => SeekingInfo | null;
14
+ export declare const getSeekingByte: ({ info, time, logLevel, currentPosition, isoState, }: {
15
+ info: SeekingInfo;
16
+ time: number;
17
+ logLevel: LogLevel;
18
+ currentPosition: number;
19
+ isoState: IsoBaseMediaState;
20
+ }) => Promise<SeekResolution>;
@@ -2,21 +2,47 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getSeekingByte = exports.getSeekingInfo = void 0;
4
4
  const get_seeking_from_mp4_1 = require("./containers/iso-base-media/get-seeking-from-mp4");
5
- const getSeekingInfo = (state) => {
6
- const structure = state.getStructureOrNull();
5
+ const get_seeking_info_from_mp4_1 = require("./containers/iso-base-media/get-seeking-info-from-mp4");
6
+ const get_seeking_byte_1 = require("./containers/wav/get-seeking-byte");
7
+ const get_seeking_info_1 = require("./containers/wav/get-seeking-info");
8
+ const getSeekingInfo = ({ structureState, mp4HeaderSegment, mediaSectionState, isoState, }) => {
9
+ const structure = structureState.getStructureOrNull();
7
10
  if (!structure) {
8
11
  return null;
9
12
  }
10
13
  if (structure.type === 'iso-base-media') {
11
- return (0, get_seeking_from_mp4_1.getSeekingInfoFromMp4)(state);
14
+ return (0, get_seeking_info_from_mp4_1.getSeekingInfoFromMp4)({
15
+ structureState,
16
+ isoState,
17
+ mp4HeaderSegment,
18
+ mediaSectionState,
19
+ });
12
20
  }
13
- return null;
21
+ if (structure.type === 'wav') {
22
+ return (0, get_seeking_info_1.getSeekingInfoFromWav)({
23
+ structure,
24
+ mediaSectionState,
25
+ });
26
+ }
27
+ throw new Error(`Seeking is not supported for this format: ${structure.type}`);
14
28
  };
15
29
  exports.getSeekingInfo = getSeekingInfo;
16
- const getSeekingByte = (info, time) => {
30
+ const getSeekingByte = ({ info, time, logLevel, currentPosition, isoState, }) => {
17
31
  if (info.type === 'iso-base-media-seeking-info') {
18
- return (0, get_seeking_from_mp4_1.getSeekingByteFromIsoBaseMedia)(info, time).offset;
32
+ return (0, get_seeking_from_mp4_1.getSeekingByteFromIsoBaseMedia)({
33
+ info,
34
+ time,
35
+ logLevel,
36
+ currentPosition,
37
+ isoState,
38
+ });
39
+ }
40
+ if (info.type === 'wav-seeking-info') {
41
+ return (0, get_seeking_byte_1.getSeekingByteFromWav)({
42
+ info,
43
+ time,
44
+ });
19
45
  }
20
- throw new Error(`Unknown seeking info type: ${info.type}`);
46
+ throw new Error(`Unknown seeking info type: ${info}`);
21
47
  };
22
48
  exports.getSeekingByte = getSeekingByte;
@@ -15,11 +15,15 @@ const getNumberOfTracks = (moovBox) => {
15
15
  };
16
16
  exports.getNumberOfTracks = getNumberOfTracks;
17
17
  const isoBaseMediaHasTracks = (state) => {
18
- return Boolean((0, traversal_1.getMoovBoxFromState)(state));
18
+ return Boolean((0, traversal_1.getMoovBoxFromState)({
19
+ structureState: state.structure,
20
+ isoState: state.iso,
21
+ mp4HeaderSegment: state.mp4HeaderSegment,
22
+ }));
19
23
  };
20
24
  exports.isoBaseMediaHasTracks = isoBaseMediaHasTracks;
21
25
  const getHasTracks = (state) => {
22
- const structure = state.getStructure();
26
+ const structure = state.structure.getStructure();
23
27
  if (structure.type === 'matroska') {
24
28
  return (0, get_ready_tracks_1.matroskaHasTracks)(state);
25
29
  }
@@ -102,7 +106,11 @@ const getTracksFromMoovBox = (moovBox) => {
102
106
  };
103
107
  exports.getTracksFromMoovBox = getTracksFromMoovBox;
104
108
  const getTracksFromIsoBaseMedia = (state) => {
105
- const moovBox = (0, traversal_1.getMoovBoxFromState)(state);
109
+ const moovBox = (0, traversal_1.getMoovBoxFromState)({
110
+ structureState: state.structure,
111
+ isoState: state.iso,
112
+ mp4HeaderSegment: state.mp4HeaderSegment,
113
+ });
106
114
  if (!moovBox) {
107
115
  return {
108
116
  videoTracks: [],
@@ -136,7 +144,7 @@ const defaultHasallTracks = (parserState) => {
136
144
  };
137
145
  exports.defaultHasallTracks = defaultHasallTracks;
138
146
  const getTracks = (state) => {
139
- const structure = state.getStructure();
147
+ const structure = state.structure.getStructure();
140
148
  if (structure.type === 'matroska') {
141
149
  return getCategorizedTracksFromMatroska(state);
142
150
  }
@@ -17,7 +17,7 @@ const get_metadata_1 = require("./metadata/get-metadata");
17
17
  const may_skip_video_data_1 = require("./state/may-skip-video-data");
18
18
  const getAvailableInfo = ({ state, }) => {
19
19
  const keys = Object.entries(state.fields).filter(([, value]) => value);
20
- const structure = state.getStructureOrNull();
20
+ const structure = state.structure.getStructureOrNull();
21
21
  const infos = keys.map(([_key]) => {
22
22
  const key = _key;
23
23
  if (key === 'structure') {