@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
@@ -1117,6 +1117,40 @@ var detectFileType = (data) => {
1117
1117
  return { type: "unknown" };
1118
1118
  };
1119
1119
 
1120
+ // src/log.ts
1121
+ var logLevels = ["trace", "verbose", "info", "warn", "error"];
1122
+ var getNumberForLogLevel = (level) => {
1123
+ return logLevels.indexOf(level);
1124
+ };
1125
+ var isEqualOrBelowLogLevel = (currentLevel, level) => {
1126
+ return getNumberForLogLevel(currentLevel) <= getNumberForLogLevel(level);
1127
+ };
1128
+ var Log = {
1129
+ trace: (logLevel, ...args) => {
1130
+ if (isEqualOrBelowLogLevel(logLevel, "trace")) {
1131
+ return console.log(...args);
1132
+ }
1133
+ },
1134
+ verbose: (logLevel, ...args) => {
1135
+ if (isEqualOrBelowLogLevel(logLevel, "verbose")) {
1136
+ return console.log(...args);
1137
+ }
1138
+ },
1139
+ info: (logLevel, ...args) => {
1140
+ if (isEqualOrBelowLogLevel(logLevel, "info")) {
1141
+ return console.log(...args);
1142
+ }
1143
+ },
1144
+ warn: (logLevel, ...args) => {
1145
+ if (isEqualOrBelowLogLevel(logLevel, "warn")) {
1146
+ return console.warn(...args);
1147
+ }
1148
+ },
1149
+ error: (...args) => {
1150
+ return console.error(...args);
1151
+ }
1152
+ };
1153
+
1120
1154
  // src/iterator/buffer-manager.ts
1121
1155
  var bufferManager = ({
1122
1156
  initialData,
@@ -1320,8 +1354,7 @@ var getArrayBufferIterator = (initialData, maxBytes) => {
1320
1354
  };
1321
1355
  const getPaddedFourByteNumber = () => {
1322
1356
  let lastInt = 128;
1323
- while (lastInt = getUint8(), lastInt === 128) {
1324
- }
1357
+ while (lastInt = getUint8(), lastInt === 128) {}
1325
1358
  return lastInt;
1326
1359
  };
1327
1360
  const getUint32 = () => {
@@ -1389,11 +1422,11 @@ var getArrayBufferIterator = (initialData, maxBytes) => {
1389
1422
  return (1 << zerosCount) - 1 + suffix;
1390
1423
  };
1391
1424
  const peekB = (length) => {
1392
- console.log([...getSlice(length)].map((b) => b.toString(16).padStart(2, "0")));
1425
+ Log.info("info", [...getSlice(length)].map((b) => b.toString(16).padStart(2, "0")));
1393
1426
  counter.decrement(length);
1394
1427
  };
1395
1428
  const peekD = (length) => {
1396
- console.log([...getSlice(length)].map((b) => b));
1429
+ Log.info("info", [...getSlice(length)].map((b) => b.toString(16).padStart(2, "0")));
1397
1430
  counter.decrement(length);
1398
1431
  };
1399
1432
  const leb128 = () => {
@@ -1731,40 +1764,6 @@ var parseMvhd = ({
1731
1764
  };
1732
1765
  };
1733
1766
 
1734
- // src/log.ts
1735
- var logLevels = ["trace", "verbose", "info", "warn", "error"];
1736
- var getNumberForLogLevel = (level) => {
1737
- return logLevels.indexOf(level);
1738
- };
1739
- var isEqualOrBelowLogLevel = (currentLevel, level) => {
1740
- return getNumberForLogLevel(currentLevel) <= getNumberForLogLevel(level);
1741
- };
1742
- var Log = {
1743
- trace: (logLevel, ...args) => {
1744
- if (isEqualOrBelowLogLevel(logLevel, "trace")) {
1745
- return console.log(...args);
1746
- }
1747
- },
1748
- verbose: (logLevel, ...args) => {
1749
- if (isEqualOrBelowLogLevel(logLevel, "verbose")) {
1750
- return console.log(...args);
1751
- }
1752
- },
1753
- info: (logLevel, ...args) => {
1754
- if (isEqualOrBelowLogLevel(logLevel, "info")) {
1755
- return console.log(...args);
1756
- }
1757
- },
1758
- warn: (logLevel, ...args) => {
1759
- if (isEqualOrBelowLogLevel(logLevel, "warn")) {
1760
- return console.warn(...args);
1761
- }
1762
- },
1763
- error: (...args) => {
1764
- return console.error(...args);
1765
- }
1766
- };
1767
-
1768
1767
  // src/containers/avc/codec-string.ts
1769
1768
  var getCodecStringFromSpsAndPps = (sps) => {
1770
1769
  return `avc1.${sps.spsData.profile.toString(16).padStart(2, "0")}${sps.spsData.compatibility.toString(16).padStart(2, "0")}${sps.spsData.level.toString(16).padStart(2, "0")}`;
@@ -2038,6 +2037,29 @@ var parseEsds = ({
2038
2037
  };
2039
2038
  };
2040
2039
 
2040
+ // src/state/iso-base-media/precomputed-moof.ts
2041
+ var precomputedMoofState = () => {
2042
+ let moofBoxes = [];
2043
+ return {
2044
+ getMoofBoxes: () => moofBoxes,
2045
+ setMoofBoxes: (boxes) => {
2046
+ moofBoxes = boxes;
2047
+ }
2048
+ };
2049
+ };
2050
+ var toMoofBox = (box) => {
2051
+ if (box.type !== "regular-box") {
2052
+ throw new Error("expected regular bpx");
2053
+ }
2054
+ return {
2055
+ offset: box.offset,
2056
+ trafBoxes: box.children.filter((c) => c.type === "regular-box" && c.boxType === "traf")
2057
+ };
2058
+ };
2059
+ var deduplicateMoofBoxesByOffset = (moofBoxes) => {
2060
+ return moofBoxes.filter((m, i, arr) => i === arr.findIndex((t) => t.offset === m.offset));
2061
+ };
2062
+
2041
2063
  // src/containers/iso-base-media/traversal.ts
2042
2064
  var getMoovFromFromIsoStructure = (structure) => {
2043
2065
  const moovBox = structure.boxes.find((s) => s.type === "moov-box");
@@ -2049,11 +2071,12 @@ var getMoovFromFromIsoStructure = (structure) => {
2049
2071
  var getMoovBoxFromState = ({
2050
2072
  structureState,
2051
2073
  isoState,
2052
- mp4HeaderSegment
2074
+ mp4HeaderSegment,
2075
+ mayUsePrecomputed
2053
2076
  }) => {
2054
- const got = isoState.moov.getMoovBox();
2055
- if (got) {
2056
- return got;
2077
+ const got = isoState.moov.getMoovBoxAndPrecomputed();
2078
+ if (got && (mayUsePrecomputed || !got.precomputed)) {
2079
+ return got.moovBox;
2057
2080
  }
2058
2081
  if (mp4HeaderSegment) {
2059
2082
  return getMoovFromFromIsoStructure(mp4HeaderSegment);
@@ -2063,7 +2086,7 @@ var getMoovBoxFromState = ({
2063
2086
  };
2064
2087
  var getMoofBoxes = (main) => {
2065
2088
  const moofBoxes = main.filter((s) => s.type === "regular-box" && s.boxType === "moof");
2066
- return moofBoxes;
2089
+ return moofBoxes.map((m) => toMoofBox(m));
2067
2090
  };
2068
2091
  var getMvhdBox = (moovBox) => {
2069
2092
  const mvHdBox = moovBox.children.find((s) => s.type === "mvhd-box");
@@ -2335,7 +2358,8 @@ var getFpsFromIsoMaseMedia = (state) => {
2335
2358
  const moovBox = getMoovBoxFromState({
2336
2359
  structureState: state.structure,
2337
2360
  isoState: state.iso,
2338
- mp4HeaderSegment: state.mp4HeaderSegment
2361
+ mp4HeaderSegment: state.mp4HeaderSegment,
2362
+ mayUsePrecomputed: true
2339
2363
  });
2340
2364
  if (!moovBox) {
2341
2365
  return null;
@@ -3270,14 +3294,15 @@ var matroskaHasTracks = ({
3270
3294
  };
3271
3295
 
3272
3296
  // src/get-tracks.ts
3273
- var isoBaseMediaHasTracks = (state) => {
3297
+ var isoBaseMediaHasTracks = (state, mayUsePrecomputed) => {
3274
3298
  return Boolean(getMoovBoxFromState({
3275
3299
  structureState: state.structure,
3276
3300
  isoState: state.iso,
3277
- mp4HeaderSegment: state.mp4HeaderSegment
3301
+ mp4HeaderSegment: state.mp4HeaderSegment,
3302
+ mayUsePrecomputed
3278
3303
  }));
3279
3304
  };
3280
- var getHasTracks = (state) => {
3305
+ var getHasTracks = (state, mayUsePrecomputed) => {
3281
3306
  const structure = state.structure.getStructure();
3282
3307
  if (structure.type === "matroska") {
3283
3308
  return matroskaHasTracks({
@@ -3286,7 +3311,7 @@ var getHasTracks = (state) => {
3286
3311
  });
3287
3312
  }
3288
3313
  if (structure.type === "iso-base-media") {
3289
- return isoBaseMediaHasTracks(state);
3314
+ return isoBaseMediaHasTracks(state, mayUsePrecomputed);
3290
3315
  }
3291
3316
  if (structure.type === "riff") {
3292
3317
  return hasAllTracksFromAvi(state);
@@ -3358,11 +3383,12 @@ var getTracksFromMoovBox = (moovBox) => {
3358
3383
  otherTracks
3359
3384
  };
3360
3385
  };
3361
- var getTracksFromIsoBaseMedia = (state) => {
3386
+ var getTracksFromIsoBaseMedia = (state, mayUsePrecomputed) => {
3362
3387
  const moovBox = getMoovBoxFromState({
3363
3388
  structureState: state.structure,
3364
3389
  isoState: state.iso,
3365
- mp4HeaderSegment: state.mp4HeaderSegment
3390
+ mp4HeaderSegment: state.mp4HeaderSegment,
3391
+ mayUsePrecomputed
3366
3392
  });
3367
3393
  if (!moovBox) {
3368
3394
  return {
@@ -3384,13 +3410,13 @@ var defaultGetTracks = (parserState) => {
3384
3410
  videoTracks: tracks2.filter((t) => t.type === "video")
3385
3411
  };
3386
3412
  };
3387
- var getTracks = (state) => {
3413
+ var getTracks = (state, mayUsePrecomputed) => {
3388
3414
  const structure = state.structure.getStructure();
3389
3415
  if (structure.type === "matroska") {
3390
3416
  return getCategorizedTracksFromMatroska(state);
3391
3417
  }
3392
3418
  if (structure.type === "iso-base-media") {
3393
- return getTracksFromIsoBaseMedia(state);
3419
+ return getTracksFromIsoBaseMedia(state, mayUsePrecomputed);
3394
3420
  }
3395
3421
  if (structure.type === "riff") {
3396
3422
  return getTracksFromAvi(structure, state);
@@ -3406,7 +3432,7 @@ var getTracks = (state) => {
3406
3432
 
3407
3433
  // src/get-audio-codec.ts
3408
3434
  var getAudioCodec = (parserState) => {
3409
- const tracks2 = getTracks(parserState);
3435
+ const tracks2 = getTracks(parserState, true);
3410
3436
  const allTracks = tracks2.audioTracks.length + tracks2.otherTracks.length + tracks2.videoTracks.length;
3411
3437
  if (allTracks === 0) {
3412
3438
  throw new Error("No tracks yet");
@@ -3421,7 +3447,7 @@ var getAudioCodec = (parserState) => {
3421
3447
  return null;
3422
3448
  };
3423
3449
  var hasAudioCodec = (state) => {
3424
- return getHasTracks(state);
3450
+ return getHasTracks(state, true);
3425
3451
  };
3426
3452
  var getCodecSpecificatorFromEsdsBox = ({
3427
3453
  child
@@ -3753,11 +3779,11 @@ var getPrimariesFromIndex = (index) => {
3753
3779
 
3754
3780
  // src/get-video-codec.ts
3755
3781
  var getVideoCodec = (state) => {
3756
- const track = getTracks(state);
3782
+ const track = getTracks(state, true);
3757
3783
  return track.videoTracks[0]?.codecWithoutConfig ?? null;
3758
3784
  };
3759
3785
  var hasVideoCodec = (state) => {
3760
- return getHasTracks(state);
3786
+ return getHasTracks(state, true);
3761
3787
  };
3762
3788
  var getVideoPrivateData = (trakBox) => {
3763
3789
  const videoSample = getStsdVideoConfig(trakBox);
@@ -5122,7 +5148,7 @@ var processBox = async ({
5122
5148
  iterator.discard(boxSize - 8);
5123
5149
  return null;
5124
5150
  }
5125
- if (isoState && isoState.moov.getMoovBox()) {
5151
+ if (isoState && isoState.moov.getMoovBoxAndPrecomputed() && !isoState.moov.getMoovBoxAndPrecomputed()?.precomputed) {
5126
5152
  Log.verbose(logLevel, "Moov box already parsed, skipping");
5127
5153
  iterator.discard(boxSize - 8);
5128
5154
  return null;
@@ -6376,6 +6402,19 @@ var mediaParserController = () => {
6376
6402
  }
6377
6403
  await pauseSignal.waitUntilResume();
6378
6404
  };
6405
+ let seekingHintResolution = null;
6406
+ const getSeekingHints = () => {
6407
+ if (!seekingHintResolution) {
6408
+ throw new Error("The mediaParserController() was not yet used in a parseMedia() call");
6409
+ }
6410
+ return seekingHintResolution();
6411
+ };
6412
+ const attachSeekingHintResolution = (callback) => {
6413
+ if (seekingHintResolution) {
6414
+ throw new Error("The mediaParserController() was used in multiple parseMedia() calls. Create a separate controller for each call.");
6415
+ }
6416
+ seekingHintResolution = callback;
6417
+ };
6379
6418
  return {
6380
6419
  abort: (reason) => {
6381
6420
  abortController.abort(reason);
@@ -6386,12 +6425,14 @@ var mediaParserController = () => {
6386
6425
  resume: pauseSignal.resume,
6387
6426
  addEventListener: emitter.addEventListener,
6388
6427
  removeEventListener: emitter.removeEventListener,
6428
+ getSeekingHints,
6389
6429
  _internals: {
6390
6430
  signal: abortController.signal,
6391
6431
  checkForAbortAndPause,
6392
6432
  seekSignal,
6393
6433
  markAsReadyToEmitEvents: emitter.markAsReady,
6394
- performedSeeksSignal
6434
+ performedSeeksSignal,
6435
+ attachSeekingHintResolution
6395
6436
  }
6396
6437
  };
6397
6438
  };
@@ -6521,7 +6562,7 @@ var getDimensions = (state) => {
6521
6562
  if (structure && isAudioStructure(structure)) {
6522
6563
  return null;
6523
6564
  }
6524
- const { videoTracks } = getTracks(state);
6565
+ const { videoTracks } = getTracks(state, true);
6525
6566
  if (!videoTracks.length) {
6526
6567
  return null;
6527
6568
  }
@@ -6614,13 +6655,12 @@ var getSamplesFromMoof = ({
6614
6655
  moofBox,
6615
6656
  trackId
6616
6657
  }) => {
6617
- if (moofBox.type !== "regular-box") {
6618
- throw new Error("Expected moof-box");
6619
- }
6620
- const trafs = moofBox.children.filter((c) => c.type === "regular-box" && c.boxType === "traf");
6621
- const mapped = trafs.map((traf) => {
6658
+ const mapped = moofBox.trafBoxes.map((traf) => {
6622
6659
  const tfhdBox = getTfhdBox(traf);
6623
- return tfhdBox?.trackId === trackId ? getSamplesFromTraf(traf, moofBox.offset) : [];
6660
+ if (!tfhdBox || tfhdBox.trackId !== trackId) {
6661
+ return [];
6662
+ }
6663
+ return getSamplesFromTraf(traf, moofBox.offset);
6624
6664
  });
6625
6665
  return mapped.flat(1);
6626
6666
  };
@@ -6632,10 +6672,13 @@ var collectSamplePositionsFromMoofBoxes = ({
6632
6672
  tkhdBox
6633
6673
  }) => {
6634
6674
  const isComplete = tfraBoxes.length > 0 && tfraBoxes.every((t) => t.entries.length === moofBoxes.length);
6635
- const samplePositions_ = moofBoxes.map((m) => {
6636
- return getSamplesFromMoof({ moofBox: m, trackId: tkhdBox.trackId });
6675
+ const samplePositions = moofBoxes.map((m) => {
6676
+ return getSamplesFromMoof({
6677
+ moofBox: m,
6678
+ trackId: tkhdBox.trackId
6679
+ });
6637
6680
  });
6638
- return { samplePositions: samplePositions_, isComplete };
6681
+ return { samplePositions, isComplete };
6639
6682
  };
6640
6683
 
6641
6684
  // src/get-sample-positions.ts
@@ -7003,7 +7046,8 @@ var getDurationFromIsoBaseMedia = (parserState) => {
7003
7046
  const moovBox = getMoovBoxFromState({
7004
7047
  structureState: parserState.structure,
7005
7048
  isoState: parserState.iso,
7006
- mp4HeaderSegment: parserState.mp4HeaderSegment
7049
+ mp4HeaderSegment: parserState.mp4HeaderSegment,
7050
+ mayUsePrecomputed: true
7007
7051
  });
7008
7052
  if (!moovBox) {
7009
7053
  return null;
@@ -7020,7 +7064,7 @@ var getDurationFromIsoBaseMedia = (parserState) => {
7020
7064
  if (mvhdBox.durationInSeconds > 0) {
7021
7065
  return mvhdBox.durationInSeconds;
7022
7066
  }
7023
- const tracks2 = getTracks(parserState);
7067
+ const tracks2 = getTracks(parserState, true);
7024
7068
  const allTracks = [
7025
7069
  ...tracks2.videoTracks,
7026
7070
  ...tracks2.audioTracks,
@@ -7084,7 +7128,7 @@ var hasDuration = (parserState) => {
7084
7128
  if (structure === null) {
7085
7129
  return false;
7086
7130
  }
7087
- return getHasTracks(parserState);
7131
+ return getHasTracks(parserState, true);
7088
7132
  };
7089
7133
  var hasSlowDuration = (parserState) => {
7090
7134
  try {
@@ -7099,16 +7143,16 @@ var isVideoTrackHdr = (track) => {
7099
7143
  return track.color.matrixCoefficients === "bt2020" && track.color.transferCharacteristics === "arib-std-b67" && track.color.primaries === "bt2020";
7100
7144
  };
7101
7145
  var getIsHdr = (state) => {
7102
- const { videoTracks } = getTracks(state);
7146
+ const { videoTracks } = getTracks(state, true);
7103
7147
  return videoTracks.some((track) => isVideoTrackHdr(track));
7104
7148
  };
7105
7149
  var hasHdr = (state) => {
7106
- return getHasTracks(state);
7150
+ return getHasTracks(state, true);
7107
7151
  };
7108
7152
 
7109
7153
  // src/containers/iso-base-media/get-keyframes.ts
7110
7154
  var getKeyframesFromIsoBaseMedia = (state) => {
7111
- const { videoTracks } = getTracksFromIsoBaseMedia(state);
7155
+ const { videoTracks } = getTracksFromIsoBaseMedia(state, true);
7112
7156
  const structure = state.structure.getIsoStructure();
7113
7157
  const moofBoxes = getMoofBoxes(structure.boxes);
7114
7158
  const tfraBoxes = getTfraBoxes(structure);
@@ -7149,7 +7193,7 @@ var getKeyframes = (state) => {
7149
7193
  var hasKeyframes = (parserState) => {
7150
7194
  const structure = parserState.structure.getStructure();
7151
7195
  if (structure.type === "iso-base-media") {
7152
- return getHasTracks(parserState);
7196
+ return getHasTracks(parserState, true);
7153
7197
  }
7154
7198
  return true;
7155
7199
  };
@@ -7262,7 +7306,8 @@ var getMetadataFromIsoBase = (state) => {
7262
7306
  const moov = getMoovBoxFromState({
7263
7307
  structureState: state.structure,
7264
7308
  isoState: state.iso,
7265
- mp4HeaderSegment: state.mp4HeaderSegment
7309
+ mp4HeaderSegment: state.mp4HeaderSegment,
7310
+ mayUsePrecomputed: true
7266
7311
  });
7267
7312
  if (!moov) {
7268
7313
  return [];
@@ -7615,13 +7660,15 @@ var findBestSegmentFromTfra = ({
7615
7660
  };
7616
7661
  };
7617
7662
 
7618
- // src/containers/iso-base-media/get-seeking-from-mp4.ts
7663
+ // src/containers/iso-base-media/get-seeking-byte.ts
7619
7664
  var getSeekingByteFromIsoBaseMedia = async ({
7620
7665
  info,
7621
7666
  time,
7622
7667
  logLevel,
7623
7668
  currentPosition,
7624
- isoState
7669
+ isoState,
7670
+ mp4HeaderSegment,
7671
+ structure
7625
7672
  }) => {
7626
7673
  const tracks2 = getTracksFromMoovBox(info.moovBox);
7627
7674
  const allTracks = [
@@ -7629,6 +7676,18 @@ var getSeekingByteFromIsoBaseMedia = async ({
7629
7676
  ...tracks2.audioTracks,
7630
7677
  ...tracks2.otherTracks
7631
7678
  ];
7679
+ const hasMoov = Boolean(getMoovBoxFromState({
7680
+ mp4HeaderSegment,
7681
+ structureState: structure,
7682
+ isoState,
7683
+ mayUsePrecomputed: false
7684
+ }));
7685
+ if (!hasMoov) {
7686
+ Log.trace(logLevel, "No moov box found, must wait");
7687
+ return {
7688
+ type: "valid-but-must-wait"
7689
+ };
7690
+ }
7632
7691
  const firstVideoTrack = allTracks.find((t) => t.type === "video");
7633
7692
  if (!firstVideoTrack) {
7634
7693
  throw new Error("No video track found");
@@ -7664,7 +7723,7 @@ var getSeekingByteFromIsoBaseMedia = async ({
7664
7723
  }
7665
7724
  }
7666
7725
  }
7667
- const atom = await isoState.mfra.triggerLoad();
7726
+ const atom = await (info.mfraAlreadyLoaded ? Promise.resolve(info.mfraAlreadyLoaded) : isoState.mfra.triggerLoad());
7668
7727
  if (atom) {
7669
7728
  const moofOffset = findBestSegmentFromTfra({
7670
7729
  mfra: atom,
@@ -7735,12 +7794,12 @@ var getSeekingByteFromWav = ({
7735
7794
  time
7736
7795
  }) => {
7737
7796
  const bytesPerSecond = info.sampleRate * info.blockAlign;
7738
- const durationInSeconds = info.mediaSections.size / bytesPerSecond;
7797
+ const durationInSeconds = info.mediaSection.size / bytesPerSecond;
7739
7798
  const timeRoundedDown = Math.floor(Math.min(time, durationInSeconds - 0.0000001) * WAVE_SAMPLES_PER_SECOND) / WAVE_SAMPLES_PER_SECOND;
7740
7799
  const byteOffset = bytesPerSecond * timeRoundedDown;
7741
7800
  return Promise.resolve({
7742
7801
  type: "do-seek",
7743
- byte: byteOffset + info.mediaSections.start
7802
+ byte: byteOffset + info.mediaSection.start
7744
7803
  });
7745
7804
  };
7746
7805
 
@@ -7801,8 +7860,7 @@ var getSeekingByteFromMatroska = async ({
7801
7860
  webmState,
7802
7861
  info,
7803
7862
  logLevel,
7804
- mediaSection,
7805
- keyframes
7863
+ mediaSection
7806
7864
  }) => {
7807
7865
  if (!info.track) {
7808
7866
  Log.trace(logLevel, "No video track found, cannot seek yet");
@@ -7810,9 +7868,9 @@ var getSeekingByteFromMatroska = async ({
7810
7868
  type: "valid-but-must-wait"
7811
7869
  };
7812
7870
  }
7813
- const cuesResponse = await webmState.cues.getLoadedCues();
7871
+ const cuesResponse = info.loadedCues ?? await webmState.cues.getLoadedCues();
7814
7872
  const byteFromObservedKeyframe = findKeyframeBeforeTime2({
7815
- keyframes: keyframes.getKeyframes(),
7873
+ keyframes: info.keyframes,
7816
7874
  time
7817
7875
  });
7818
7876
  const byteFromCues = getByteFromCues({
@@ -7948,7 +8006,10 @@ var handleAvcPacket = async ({
7948
8006
  const dimensions = getDimensionsFromSps(spsAndPps.sps.spsData);
7949
8007
  const sampleAspectRatio = getSampleAspectRatioFromSps(spsAndPps.sps.spsData);
7950
8008
  const startOffset = makeSamplesStartAtZero ? Math.min(streamBuffer.pesHeader.pts, streamBuffer.pesHeader.dts ?? Infinity) : 0;
7951
- transportStream.startOffset.setOffset(programId, startOffset);
8009
+ transportStream.startOffset.setOffset({
8010
+ trackId: programId,
8011
+ newOffset: startOffset
8012
+ });
7952
8013
  const track = {
7953
8014
  m3uStreamFormat: null,
7954
8015
  rotation: 0,
@@ -8012,20 +8073,30 @@ var handleAvcPacket = async ({
8012
8073
  var makeObservedPesHeader = () => {
8013
8074
  const pesHeaders = [];
8014
8075
  const confirmedAsKeyframe = [];
8076
+ const addPesHeader = (pesHeader) => {
8077
+ if (pesHeaders.find((p) => p.offset === pesHeader.offset)) {
8078
+ return;
8079
+ }
8080
+ pesHeaders.push(pesHeader);
8081
+ };
8082
+ const markPtsAsKeyframe = (pts) => {
8083
+ confirmedAsKeyframe.push(pts);
8084
+ };
8085
+ const getPesKeyframeHeaders = () => {
8086
+ return pesHeaders.filter((p) => confirmedAsKeyframe.includes(p.pts));
8087
+ };
8088
+ const setPesKeyframesFromSeekingHints = (hints) => {
8089
+ for (const pesHeader of hints.observedPesHeaders) {
8090
+ addPesHeader(pesHeader);
8091
+ markPtsAsKeyframe(pesHeader.pts);
8092
+ }
8093
+ };
8015
8094
  const state = {
8016
8095
  pesHeaders,
8017
- addPesHeader: (pesHeader) => {
8018
- if (pesHeaders.find((p) => p.offset === pesHeader.offset)) {
8019
- return;
8020
- }
8021
- pesHeaders.push(pesHeader);
8022
- },
8023
- markPtsAsKeyframe: (pts) => {
8024
- confirmedAsKeyframe.push(pts);
8025
- },
8026
- getPesKeyframeHeaders: () => {
8027
- return pesHeaders.filter((p) => confirmedAsKeyframe.includes(p.pts));
8028
- }
8096
+ addPesHeader,
8097
+ markPtsAsKeyframe,
8098
+ getPesKeyframeHeaders,
8099
+ setPesKeyframesFromSeekingHints
8029
8100
  };
8030
8101
  return state;
8031
8102
  };
@@ -8047,34 +8118,36 @@ var getSeekingByte = ({
8047
8118
  transportStream,
8048
8119
  webmState,
8049
8120
  mediaSection,
8050
- keyframes
8121
+ mp4HeaderSegment,
8122
+ structure
8051
8123
  }) => {
8052
- if (info.type === "iso-base-media-seeking-info") {
8124
+ if (info.type === "iso-base-media-seeking-hints") {
8053
8125
  return getSeekingByteFromIsoBaseMedia({
8054
8126
  info,
8055
8127
  time,
8056
8128
  logLevel,
8057
8129
  currentPosition,
8058
- isoState
8130
+ isoState,
8131
+ mp4HeaderSegment,
8132
+ structure
8059
8133
  });
8060
8134
  }
8061
- if (info.type === "wav-seeking-info") {
8135
+ if (info.type === "wav-seeking-hints") {
8062
8136
  return getSeekingByteFromWav({
8063
8137
  info,
8064
8138
  time
8065
8139
  });
8066
8140
  }
8067
- if (info.type === "webm-seeking-info") {
8141
+ if (info.type === "webm-seeking-hints") {
8068
8142
  return getSeekingByteFromMatroska({
8069
8143
  info,
8070
8144
  time,
8071
8145
  webmState,
8072
8146
  logLevel,
8073
- mediaSection,
8074
- keyframes
8147
+ mediaSection
8075
8148
  });
8076
8149
  }
8077
- if (info.type === "transport-stream-seeking-info") {
8150
+ if (info.type === "transport-stream-seeking-hints") {
8078
8151
  const lastKeyframeBeforeTimeInSeconds = getLastKeyFrameBeforeTimeInSeconds({
8079
8152
  observedPesHeaders: info.observedPesHeaders,
8080
8153
  timeInSeconds: time,
@@ -8090,8 +8163,22 @@ var getSeekingByte = ({
8090
8163
  throw new Error(`Unknown seeking info type: ${info}`);
8091
8164
  };
8092
8165
 
8093
- // src/containers/iso-base-media/get-seeking-info-from-mp4.ts
8094
- var getSeekingInfoFromMp4 = ({
8166
+ // src/state/iso-base-media/precomputed-tfra.ts
8167
+ var precomputedTfraState = () => {
8168
+ let tfraBoxes = [];
8169
+ return {
8170
+ getTfraBoxes: () => tfraBoxes,
8171
+ setTfraBoxes: (boxes) => {
8172
+ tfraBoxes = boxes;
8173
+ }
8174
+ };
8175
+ };
8176
+ var deduplicateTfraBoxesByOffset = (tfraBoxes) => {
8177
+ return tfraBoxes.filter((m, i, arr) => i === arr.findIndex((t) => t.offset === m.offset));
8178
+ };
8179
+
8180
+ // src/containers/iso-base-media/seeking-hints.ts
8181
+ var getSeekingHintsFromMp4 = ({
8095
8182
  structureState,
8096
8183
  isoState,
8097
8184
  mp4HeaderSegment,
@@ -8101,37 +8188,65 @@ var getSeekingInfoFromMp4 = ({
8101
8188
  const moovAtom = getMoovBoxFromState({
8102
8189
  isoState,
8103
8190
  mp4HeaderSegment,
8104
- structureState
8191
+ structureState,
8192
+ mayUsePrecomputed: true
8105
8193
  });
8106
- const moofBoxes = getMoofBoxes(structure.boxes);
8107
- const tfraBoxes = getTfraBoxes(structure);
8194
+ const moofBoxes = deduplicateMoofBoxesByOffset([
8195
+ ...isoState.moof.getMoofBoxes(),
8196
+ ...getMoofBoxes(structure.boxes)
8197
+ ]);
8198
+ const tfraBoxes = deduplicateTfraBoxesByOffset([
8199
+ ...isoState.tfra.getTfraBoxes(),
8200
+ ...getTfraBoxes(structure)
8201
+ ]);
8108
8202
  if (!moovAtom) {
8109
8203
  return null;
8110
8204
  }
8111
8205
  return {
8112
- type: "iso-base-media-seeking-info",
8206
+ type: "iso-base-media-seeking-hints",
8113
8207
  moovBox: moovAtom,
8114
8208
  moofBoxes,
8115
8209
  tfraBoxes,
8116
- mediaSections: mediaSectionState2.getMediaSections()
8210
+ mediaSections: mediaSectionState2.getMediaSections(),
8211
+ mfraAlreadyLoaded: isoState.mfra.getIfAlreadyLoaded()
8117
8212
  };
8118
8213
  };
8214
+ var setSeekingHintsForMp4 = ({
8215
+ hints,
8216
+ state
8217
+ }) => {
8218
+ state.iso.moov.setMoovBox({
8219
+ moovBox: hints.moovBox,
8220
+ precomputed: true
8221
+ });
8222
+ };
8119
8223
 
8120
- // src/containers/transport-stream/get-seeking-info.ts
8121
- var getSeekingInfoFromTransportStream = (transportStream, tracksState) => {
8224
+ // src/containers/transport-stream/seeking-hints.ts
8225
+ var getSeekingHintsFromTransportStream = (transportStream, tracksState) => {
8122
8226
  const firstVideoTrack = tracksState.getTracks().find((t) => t.type === "video");
8123
8227
  if (!firstVideoTrack) {
8124
- throw new Error("No video track found");
8228
+ return null;
8125
8229
  }
8126
8230
  return {
8127
- type: "transport-stream-seeking-info",
8231
+ type: "transport-stream-seeking-hints",
8128
8232
  observedPesHeaders: transportStream.observedPesHeaders.getPesKeyframeHeaders(),
8129
- ptsStartOffset: transportStream.startOffset.getOffset(firstVideoTrack.trackId)
8233
+ ptsStartOffset: transportStream.startOffset.getOffset(firstVideoTrack.trackId),
8234
+ firstVideoTrackId: firstVideoTrack.trackId
8130
8235
  };
8131
8236
  };
8237
+ var setSeekingHintsForTransportStream = ({
8238
+ hints,
8239
+ state
8240
+ }) => {
8241
+ state.transportStream.observedPesHeaders.setPesKeyframesFromSeekingHints(hints);
8242
+ state.transportStream.startOffset.setOffset({
8243
+ trackId: hints.firstVideoTrackId,
8244
+ newOffset: hints.ptsStartOffset
8245
+ });
8246
+ };
8132
8247
 
8133
- // src/containers/wav/get-seeking-info.ts
8134
- var getSeekingInfoFromWav = ({
8248
+ // src/containers/wav/seeking-hints.ts
8249
+ var getSeekingHintsFromWav = ({
8135
8250
  structure,
8136
8251
  mediaSectionState: mediaSectionState2
8137
8252
  }) => {
@@ -8144,41 +8259,62 @@ var getSeekingInfoFromWav = ({
8144
8259
  return null;
8145
8260
  }
8146
8261
  return {
8147
- type: "wav-seeking-info",
8262
+ type: "wav-seeking-hints",
8148
8263
  sampleRate: fmtBox.sampleRate,
8149
8264
  blockAlign: fmtBox.blockAlign,
8150
- mediaSections: mediaSection[0]
8265
+ mediaSection: mediaSection[0]
8151
8266
  };
8152
8267
  };
8268
+ var setSeekingHintsForWav = ({
8269
+ hints,
8270
+ state
8271
+ }) => {
8272
+ state.mediaSection.addMediaSection(hints.mediaSection);
8273
+ };
8153
8274
 
8154
- // src/containers/webm/seek/get-seeking-info.ts
8155
- var getSeekingInfoFromMatroska = (tracksState) => {
8275
+ // src/containers/webm/seek/seeking-hints.ts
8276
+ var getSeekingHintsFromMatroska = (tracksState, keyframesState, webmState) => {
8156
8277
  const tracks2 = tracksState.getTracks();
8157
8278
  const firstVideoTrack = tracks2.find((track) => track.type === "video");
8279
+ const keyframes = keyframesState.getKeyframes();
8280
+ const loadedCues = webmState.cues.getIfAlreadyLoaded();
8158
8281
  return {
8159
- type: "webm-seeking-info",
8282
+ type: "webm-seeking-hints",
8160
8283
  track: firstVideoTrack ? {
8161
8284
  timescale: firstVideoTrack.timescale,
8162
8285
  trackId: firstVideoTrack.trackId
8163
- } : null
8286
+ } : null,
8287
+ keyframes,
8288
+ loadedCues,
8289
+ timestampMap: webmState.getTimeStampMapForSeekingHints()
8164
8290
  };
8165
8291
  };
8292
+ var setSeekingHintsForWebm = ({
8293
+ hints,
8294
+ state
8295
+ }) => {
8296
+ state.webm.cues.setFromSeekingHints(hints);
8297
+ state.keyframes.setFromSeekingHints(hints);
8298
+ state.webm.setTimeStampMapForSeekingHints(hints.timestampMap);
8299
+ };
8166
8300
 
8167
- // src/get-seeking-info.ts
8168
- var getSeekingInfo = ({
8301
+ // src/get-seeking-hints.ts
8302
+ var getSeekingHints = ({
8169
8303
  structureState,
8170
8304
  mp4HeaderSegment,
8171
8305
  mediaSectionState: mediaSectionState2,
8172
8306
  isoState,
8173
8307
  transportStream,
8174
- tracksState
8308
+ tracksState,
8309
+ keyframesState,
8310
+ webmState
8175
8311
  }) => {
8176
8312
  const structure = structureState.getStructureOrNull();
8177
8313
  if (!structure) {
8178
8314
  return null;
8179
8315
  }
8180
8316
  if (structure.type === "iso-base-media") {
8181
- return getSeekingInfoFromMp4({
8317
+ return getSeekingHintsFromMp4({
8182
8318
  structureState,
8183
8319
  isoState,
8184
8320
  mp4HeaderSegment,
@@ -8186,16 +8322,16 @@ var getSeekingInfo = ({
8186
8322
  });
8187
8323
  }
8188
8324
  if (structure.type === "wav") {
8189
- return getSeekingInfoFromWav({
8325
+ return getSeekingHintsFromWav({
8190
8326
  structure,
8191
8327
  mediaSectionState: mediaSectionState2
8192
8328
  });
8193
8329
  }
8194
8330
  if (structure.type === "matroska") {
8195
- return getSeekingInfoFromMatroska(tracksState);
8331
+ return getSeekingHintsFromMatroska(tracksState, keyframesState, webmState);
8196
8332
  }
8197
8333
  if (structure.type === "transport-stream") {
8198
- return getSeekingInfoFromTransportStream(transportStream, tracksState);
8334
+ return getSeekingHintsFromTransportStream(transportStream, tracksState);
8199
8335
  }
8200
8336
  throw new Error(`Seeking is not supported for this format: ${structure.type}`);
8201
8337
  };
@@ -8424,22 +8560,24 @@ var turnSeekIntoByte = async ({
8424
8560
  if (seek2.timeInSeconds < 0) {
8425
8561
  throw new Error(`Cannot seek to a negative time: ${JSON.stringify(seek2)}`);
8426
8562
  }
8427
- const seekingInfo = getSeekingInfo({
8563
+ const seekingHints = getSeekingHints({
8428
8564
  structureState,
8429
8565
  mp4HeaderSegment,
8430
8566
  mediaSectionState: mediaSectionState2,
8431
8567
  isoState,
8432
8568
  transportStream,
8433
- tracksState
8569
+ tracksState,
8570
+ keyframesState: keyframes,
8571
+ webmState
8434
8572
  });
8435
- if (!seekingInfo) {
8573
+ if (!seekingHints) {
8436
8574
  Log.trace(logLevel, "No seeking info, cannot seek yet");
8437
8575
  return {
8438
8576
  type: "valid-but-must-wait"
8439
8577
  };
8440
8578
  }
8441
8579
  const seekingByte = await getSeekingByte({
8442
- info: seekingInfo,
8580
+ info: seekingHints,
8443
8581
  time: seek2.timeInSeconds,
8444
8582
  logLevel,
8445
8583
  currentPosition: iterator.counter.getOffset(),
@@ -8447,7 +8585,8 @@ var turnSeekIntoByte = async ({
8447
8585
  transportStream,
8448
8586
  webmState,
8449
8587
  mediaSection: mediaSectionState2,
8450
- keyframes
8588
+ mp4HeaderSegment,
8589
+ structure: structureState
8451
8590
  });
8452
8591
  return seekingByte;
8453
8592
  }
@@ -8723,7 +8862,7 @@ var emitAvailableInfo = async ({
8723
8862
  }
8724
8863
  if (key === "tracks") {
8725
8864
  if (!emittedFields.tracks && hasInfo.tracks) {
8726
- const { videoTracks, audioTracks } = getTracks(state);
8865
+ const { videoTracks, audioTracks } = getTracks(state, true);
8727
8866
  await callbackFunctions.onTracks?.({ videoTracks, audioTracks });
8728
8867
  if (fieldsInReturnValue.tracks) {
8729
8868
  returnValue.tracks = { videoTracks, audioTracks };
@@ -8965,7 +9104,7 @@ var getAvailableInfo = ({
8965
9104
  return Boolean(structure && hasAudioCodec(state));
8966
9105
  }
8967
9106
  if (key === "tracks") {
8968
- return Boolean(structure && getHasTracks(state));
9107
+ return Boolean(structure && getHasTracks(state, true));
8969
9108
  }
8970
9109
  if (key === "keyframes") {
8971
9110
  return Boolean(structure && hasKeyframes(state));
@@ -9600,7 +9739,7 @@ var parseFlac = ({
9600
9739
 
9601
9740
  // src/state/iso-base-media/cached-sample-positions.ts
9602
9741
  var calculateFlatSamples = (state) => {
9603
- const tracks2 = getTracks(state);
9742
+ const tracks2 = getTracks(state, true);
9604
9743
  const allTracks = [
9605
9744
  ...tracks2.videoTracks,
9606
9745
  ...tracks2.audioTracks,
@@ -9693,7 +9832,9 @@ var makeTracksSectionState = (canSkipTracksState, src) => {
9693
9832
  addTrack: (track) => {
9694
9833
  tracks2.push(track);
9695
9834
  },
9696
- getTracks: () => tracks2,
9835
+ getTracks: () => {
9836
+ return tracks2;
9837
+ },
9697
9838
  ensureHasTracksAtEnd: (fields) => {
9698
9839
  if (canSkipTracksState.canSkipTracks()) {
9699
9840
  return;
@@ -9889,13 +10030,16 @@ var parseMdatSection = async (state) => {
9889
10030
  if (maySkipVideoData({ state })) {
9890
10031
  return makeSkip(endOfMdat);
9891
10032
  }
9892
- const alreadyHas = getHasTracks(state);
9893
- if (!alreadyHas) {
10033
+ const alreadyHasMoov = getHasTracks(state, true);
10034
+ if (!alreadyHasMoov) {
9894
10035
  const moov = await getMoovAtom({
9895
10036
  endOfMdat,
9896
10037
  state
9897
10038
  });
9898
- state.iso.moov.setMoovBox(moov);
10039
+ state.iso.moov.setMoovBox({
10040
+ moovBox: moov,
10041
+ precomputed: false
10042
+ });
9899
10043
  state.callbacks.tracks.setIsDone(state.logLevel);
9900
10044
  state.structure.getIsoStructure().boxes.push(moov);
9901
10045
  return parseMdatSection(state);
@@ -10341,8 +10485,8 @@ var parseM3uManifest = ({
10341
10485
  return Promise.resolve(null);
10342
10486
  };
10343
10487
 
10344
- // src/forward-controller.ts
10345
- var forwardMediaParserController = ({
10488
+ // src/forward-controller-pause-resume-abort.ts
10489
+ var forwardMediaParserControllerPauseResume = ({
10346
10490
  parentController,
10347
10491
  childController
10348
10492
  }) => {
@@ -10511,8 +10655,7 @@ var fetchReadContent = async ({
10511
10655
  });
10512
10656
  if (controller) {
10513
10657
  controller._internals.signal.addEventListener("abort", () => {
10514
- reader.reader.cancel().catch(() => {
10515
- });
10658
+ reader.reader.cancel().catch(() => {});
10516
10659
  }, { once: true });
10517
10660
  }
10518
10661
  return {
@@ -10660,7 +10803,8 @@ var parseMedia = (options) => {
10660
10803
  onError: () => ({ action: "fail" }),
10661
10804
  acknowledgeRemotionLicense: Boolean(options.acknowledgeRemotionLicense),
10662
10805
  apiName: "parseMedia()",
10663
- makeSamplesStartAtZero: options.makeSamplesStartAtZero ?? true
10806
+ makeSamplesStartAtZero: options.makeSamplesStartAtZero ?? true,
10807
+ seekingHints: options.seekingHints ?? null
10664
10808
  });
10665
10809
  };
10666
10810
 
@@ -10702,28 +10846,29 @@ var iteratorOverSegmentFiles = async ({
10702
10846
  const playlist = getPlaylist(structure, playlistUrl);
10703
10847
  const chunks = getChunks(playlist);
10704
10848
  let resolver = onInitialProgress;
10705
- let rejector = (_e) => {
10706
- };
10707
- const childController = mediaParserController();
10708
- const forwarded = forwardMediaParserController({
10709
- childController,
10710
- parentController
10711
- });
10712
- const makeContinuationFn = () => {
10713
- return {
10714
- continue() {
10715
- const { promise, reject, resolve } = withResolvers();
10716
- resolver = resolve;
10717
- rejector = reject;
10718
- childController.resume();
10719
- return promise;
10720
- },
10721
- abort() {
10722
- childController.abort();
10723
- }
10724
- };
10725
- };
10849
+ let rejector = (_e) => {};
10726
10850
  for (const chunk of chunks) {
10851
+ resolver = onInitialProgress;
10852
+ rejector = (_e) => {};
10853
+ const childController = mediaParserController();
10854
+ const forwarded = forwardMediaParserControllerPauseResume({
10855
+ childController,
10856
+ parentController
10857
+ });
10858
+ const makeContinuationFn = () => {
10859
+ return {
10860
+ continue() {
10861
+ const { promise, reject, resolve } = withResolvers();
10862
+ resolver = resolve;
10863
+ rejector = reject;
10864
+ childController.resume();
10865
+ return promise;
10866
+ },
10867
+ abort() {
10868
+ childController.abort();
10869
+ }
10870
+ };
10871
+ };
10727
10872
  const isLastChunk = chunk === chunks[chunks.length - 1];
10728
10873
  await childController._internals.checkForAbortAndPause();
10729
10874
  const src = readerInterface.createAdjacentFileSource(chunk.url, playlistUrl);
@@ -11757,7 +11902,7 @@ var parseMediaSection = async (state) => {
11757
11902
  await parseMovi({
11758
11903
  state
11759
11904
  });
11760
- const tracks2 = getTracks(state);
11905
+ const tracks2 = getTracks(state, false);
11761
11906
  if (!tracks2.videoTracks.some((t) => t.codec === TO_BE_OVERRIDDEN_LATER) && !state.callbacks.tracks.getIsDone()) {
11762
11907
  state.callbacks.tracks.setIsDone(state.logLevel);
11763
11908
  }
@@ -12128,7 +12273,10 @@ var handleAacPacket = async ({
12128
12273
  });
12129
12274
  if (!isTrackRegistered) {
12130
12275
  const startOffset = makeSamplesStartAtZero ? Math.min(streamBuffer.pesHeader.pts, streamBuffer.pesHeader.dts ?? Infinity) : 0;
12131
- transportStream.startOffset.setOffset(programId, startOffset);
12276
+ transportStream.startOffset.setOffset({
12277
+ trackId: programId,
12278
+ newOffset: startOffset
12279
+ });
12132
12280
  const track = {
12133
12281
  type: "audio",
12134
12282
  codecPrivate: codecPrivate2,
@@ -13315,6 +13463,30 @@ var warnIfRemotionLicenseNotAcknowledged = ({
13315
13463
  Log.warn(logLevel, `Pass \`acknowledgeRemotionLicense: true\` to \`${apiName}\` function to make this message disappear.`);
13316
13464
  };
13317
13465
 
13466
+ // src/set-seeking-hints.ts
13467
+ var setSeekingHints = ({
13468
+ hints,
13469
+ state
13470
+ }) => {
13471
+ if (hints.type === "iso-base-media-seeking-hints") {
13472
+ setSeekingHintsForMp4({ hints, state });
13473
+ return;
13474
+ }
13475
+ if (hints.type === "wav-seeking-hints") {
13476
+ setSeekingHintsForWav({ hints, state });
13477
+ return;
13478
+ }
13479
+ if (hints.type === "transport-stream-seeking-hints") {
13480
+ setSeekingHintsForTransportStream({ hints, state });
13481
+ return;
13482
+ }
13483
+ if (hints.type === "webm-seeking-hints") {
13484
+ setSeekingHintsForWebm({ hints, state });
13485
+ return;
13486
+ }
13487
+ throw new Error(`Unknown seeking hints type: ${hints}`);
13488
+ };
13489
+
13318
13490
  // src/get-fields-from-callbacks.ts
13319
13491
  var getFieldsFromCallback = ({
13320
13492
  fields,
@@ -13545,6 +13717,7 @@ var lazyMfraLoad = ({
13545
13717
  logLevel
13546
13718
  }) => {
13547
13719
  let prom = null;
13720
+ let result = null;
13548
13721
  const triggerLoad = () => {
13549
13722
  if (prom) {
13550
13723
  return prom;
@@ -13558,12 +13731,24 @@ var lazyMfraLoad = ({
13558
13731
  logLevel
13559
13732
  }).then((boxes) => {
13560
13733
  Log.verbose(logLevel, "Lazily found mfra atom.");
13734
+ result = boxes;
13561
13735
  return boxes;
13562
13736
  });
13563
13737
  return prom;
13564
13738
  };
13739
+ const getIfAlreadyLoaded = () => {
13740
+ if (result) {
13741
+ return result;
13742
+ }
13743
+ return null;
13744
+ };
13745
+ const setFromSeekingHints = (hints) => {
13746
+ result = hints.mfraAlreadyLoaded;
13747
+ };
13565
13748
  return {
13566
- triggerLoad
13749
+ triggerLoad,
13750
+ getIfAlreadyLoaded,
13751
+ setFromSeekingHints
13567
13752
  };
13568
13753
  };
13569
13754
 
@@ -13574,7 +13759,7 @@ var moovState = () => {
13574
13759
  setMoovBox: (moov) => {
13575
13760
  moovBox = moov;
13576
13761
  },
13577
- getMoovBox: () => moovBox
13762
+ getMoovBoxAndPrecomputed: () => moovBox
13578
13763
  };
13579
13764
  };
13580
13765
 
@@ -13595,24 +13780,34 @@ var isoBaseMediaState = ({
13595
13780
  readerInterface,
13596
13781
  src,
13597
13782
  logLevel
13598
- })
13783
+ }),
13784
+ moof: precomputedMoofState(),
13785
+ tfra: precomputedTfraState()
13599
13786
  };
13600
13787
  };
13601
13788
 
13602
13789
  // src/state/keyframes.ts
13603
13790
  var keyframesState = () => {
13604
13791
  const keyframes = [];
13605
- return {
13606
- addKeyframe: (keyframe) => {
13607
- if (keyframes.find((k) => k.positionInBytes === keyframe.positionInBytes)) {
13608
- return;
13609
- }
13610
- keyframes.push(keyframe);
13611
- },
13612
- getKeyframes: () => {
13613
- return keyframes;
13792
+ const addKeyframe = (keyframe) => {
13793
+ if (keyframes.find((k) => k.positionInBytes === keyframe.positionInBytes)) {
13794
+ return;
13795
+ }
13796
+ keyframes.push(keyframe);
13797
+ };
13798
+ const getKeyframes2 = () => {
13799
+ return keyframes;
13800
+ };
13801
+ const setFromSeekingHints = (hints) => {
13802
+ for (const keyframe of hints.keyframes) {
13803
+ addKeyframe(keyframe);
13614
13804
  }
13615
13805
  };
13806
+ return {
13807
+ addKeyframe,
13808
+ getKeyframes: getKeyframes2,
13809
+ setFromSeekingHints
13810
+ };
13616
13811
  };
13617
13812
 
13618
13813
  // src/containers/m3u/sample-sorter.ts
@@ -13888,6 +14083,7 @@ var lazyCuesFetch = ({
13888
14083
  }) => {
13889
14084
  let prom = null;
13890
14085
  let sOffset = null;
14086
+ let result = null;
13891
14087
  const triggerLoad = (position, segmentOffset) => {
13892
14088
  if (prom) {
13893
14089
  return prom;
@@ -13905,6 +14101,7 @@ var lazyCuesFetch = ({
13905
14101
  src
13906
14102
  }).then((cues) => {
13907
14103
  Log.verbose(logLevel, "Cues loaded");
14104
+ result = cues;
13908
14105
  return cues;
13909
14106
  });
13910
14107
  return prom;
@@ -13925,9 +14122,27 @@ var lazyCuesFetch = ({
13925
14122
  segmentOffset: sOffset
13926
14123
  };
13927
14124
  };
14125
+ const getIfAlreadyLoaded = () => {
14126
+ if (result) {
14127
+ if (!sOffset) {
14128
+ throw new Error("Segment offset not set");
14129
+ }
14130
+ return {
14131
+ cues: result,
14132
+ segmentOffset: sOffset
14133
+ };
14134
+ }
14135
+ return null;
14136
+ };
14137
+ const setFromSeekingHints = (hints) => {
14138
+ result = hints.loadedCues?.cues ?? null;
14139
+ sOffset = hints.loadedCues?.segmentOffset ?? null;
14140
+ };
13928
14141
  return {
13929
14142
  triggerLoad,
13930
- getLoadedCues
14143
+ getLoadedCues,
14144
+ getIfAlreadyLoaded,
14145
+ setFromSeekingHints
13931
14146
  };
13932
14147
  };
13933
14148
 
@@ -13957,7 +14172,7 @@ var webmState = ({
13957
14172
  trackTimescale: trackTimescale?.value ?? null
13958
14173
  };
13959
14174
  };
13960
- const timestampMap = new Map;
14175
+ let timestampMap = new Map;
13961
14176
  const getTimestampOffsetForByteOffset = (byteOffset) => {
13962
14177
  const entries = Array.from(timestampMap.entries());
13963
14178
  const sortedByByteOffset = entries.sort((a, b) => {
@@ -13999,12 +14214,20 @@ var webmState = ({
13999
14214
  readerInterface,
14000
14215
  src
14001
14216
  });
14217
+ const getTimeStampMapForSeekingHints = () => {
14218
+ return timestampMap;
14219
+ };
14220
+ const setTimeStampMapForSeekingHints = (newTimestampMap) => {
14221
+ timestampMap = newTimestampMap;
14222
+ };
14002
14223
  return {
14003
14224
  cues,
14004
14225
  onTrackEntrySegment,
14005
14226
  getTrackInfoByNumber: (id) => trackEntries[id],
14006
14227
  setTimestampOffset,
14007
14228
  getTimestampOffsetForByteOffset,
14229
+ getTimeStampMapForSeekingHints,
14230
+ setTimeStampMapForSeekingHints,
14008
14231
  getTimescale,
14009
14232
  setTimescale,
14010
14233
  addSegment: (seg) => {
@@ -14234,9 +14457,6 @@ var samplesObservedState = () => {
14234
14457
  const timeBetweenSamplesAudio = startingTimestampDifferenceAudio / (audioSamples.size - 1);
14235
14458
  audioDuration = timeBetweenSamplesAudio * audioSamples.size;
14236
14459
  }
14237
- if (videoDuration === null && audioDuration === null) {
14238
- throw new Error("No samples");
14239
- }
14240
14460
  return Math.max(videoDuration ?? 0, audioDuration ?? 0);
14241
14461
  };
14242
14462
  const addVideoSample = (videoSample) => {
@@ -14368,7 +14588,7 @@ var ptsStartOffsetStore = () => {
14368
14588
  const offsets = {};
14369
14589
  return {
14370
14590
  getOffset: (trackId) => offsets[trackId] || 0,
14371
- setOffset: (trackId, newOffset) => {
14591
+ setOffset: ({ newOffset, trackId }) => {
14372
14592
  offsets[trackId] = newOffset;
14373
14593
  }
14374
14594
  };
@@ -14529,8 +14749,7 @@ var throttledStateUpdate = ({
14529
14749
  return {
14530
14750
  get: () => currentState,
14531
14751
  update: null,
14532
- stopAndGetLastProgress: () => {
14533
- }
14752
+ stopAndGetLastProgress: () => {}
14534
14753
  };
14535
14754
  }
14536
14755
  let lastUpdated = null;
@@ -14541,8 +14760,7 @@ var throttledStateUpdate = ({
14541
14760
  updateFn(currentState);
14542
14761
  lastUpdated = currentState;
14543
14762
  };
14544
- let cleanup = () => {
14545
- };
14763
+ let cleanup = () => {};
14546
14764
  if (everyMilliseconds > 0) {
14547
14765
  const interval = setInterval(() => {
14548
14766
  callUpdateIfChanged();
@@ -14593,6 +14811,7 @@ var internalParseMedia = async function({
14593
14811
  selectM3uAssociatedPlaylists: selectM3uAssociatedPlaylistsFn,
14594
14812
  mp4HeaderSegment,
14595
14813
  makeSamplesStartAtZero,
14814
+ seekingHints,
14596
14815
  ...more
14597
14816
  }) {
14598
14817
  controller._internals.markAsReadyToEmitEvents();
@@ -14641,6 +14860,19 @@ var internalParseMedia = async function({
14641
14860
  initialReaderInstance: readerInstance,
14642
14861
  makeSamplesStartAtZero
14643
14862
  });
14863
+ if (seekingHints) {
14864
+ setSeekingHints({ hints: seekingHints, state });
14865
+ }
14866
+ controller._internals.attachSeekingHintResolution(() => Promise.resolve(getSeekingHints({
14867
+ tracksState: state.callbacks.tracks,
14868
+ keyframesState: state.keyframes,
14869
+ webmState: state.webm,
14870
+ structureState: state.structure,
14871
+ mp4HeaderSegment: state.mp4HeaderSegment,
14872
+ mediaSectionState: state.mediaSection,
14873
+ isoState: state.iso,
14874
+ transportStream: state.transportStream
14875
+ })));
14644
14876
  if (!hasAudioTrackHandlers && !hasVideoTrackHandlers && Object.values(state.fields).every((v) => !v) && mode === "query") {
14645
14877
  Log.warn(logLevel, new Error("Warning - No `fields` and no `on*` callbacks were passed to `parseMedia()`. Specify the data you would like to retrieve."));
14646
14878
  }
@@ -14731,13 +14963,14 @@ var downloadAndParseMedia = async (options) => {
14731
14963
  },
14732
14964
  acknowledgeRemotionLicense: Boolean(options.acknowledgeRemotionLicense),
14733
14965
  apiName: "parseAndDownloadMedia()",
14734
- makeSamplesStartAtZero: options.makeSamplesStartAtZero ?? true
14966
+ makeSamplesStartAtZero: options.makeSamplesStartAtZero ?? true,
14967
+ seekingHints: options.seekingHints ?? null
14735
14968
  });
14736
14969
  await content.finish();
14737
14970
  return returnValue;
14738
14971
  };
14739
14972
  // src/version.ts
14740
- var VERSION = "4.0.286";
14973
+ var VERSION = "4.0.287";
14741
14974
 
14742
14975
  // src/index.ts
14743
14976
  var MediaParserInternals = {