@remotion/media-parser 4.0.298 → 4.0.300

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 (180) hide show
  1. package/dist/add-avc-profile-to-track.d.ts +2 -2
  2. package/dist/add-avc-profile-to-track.js +7 -1
  3. package/dist/codec-data.d.ts +29 -0
  4. package/dist/codec-data.js +2 -0
  5. package/dist/containers/aac/parse-aac.js +2 -3
  6. package/dist/containers/avc/color.d.ts +6 -6
  7. package/dist/containers/avc/color.js +53 -27
  8. package/dist/containers/avc/create-avc-decoder-configuration-record.d.ts +2 -0
  9. package/dist/containers/avc/create-avc-decoder-configuration-record.js +35 -0
  10. package/dist/containers/avc/interpret-sps.d.ts +2 -2
  11. package/dist/containers/avc/interpret-sps.js +2 -2
  12. package/dist/containers/flac/parse-streaminfo.js +2 -3
  13. package/dist/containers/iso-base-media/collect-sample-positions-from-moof-boxes.d.ts +1 -1
  14. package/dist/containers/iso-base-media/color-to-webcodecs-colors.d.ts +2 -0
  15. package/dist/containers/iso-base-media/color-to-webcodecs-colors.js +12 -0
  16. package/dist/containers/iso-base-media/find-keyframe-before-time.d.ts +2 -2
  17. package/dist/containers/iso-base-media/find-track-to-seek.d.ts +5 -5
  18. package/dist/containers/iso-base-media/find-track-to-seek.js +18 -2
  19. package/dist/containers/iso-base-media/get-actual-number-of-channels.d.ts +3 -2
  20. package/dist/containers/iso-base-media/get-actual-number-of-channels.js +14 -3
  21. package/dist/containers/iso-base-media/get-children.d.ts +2 -2
  22. package/dist/containers/iso-base-media/get-keyframes.js +11 -2
  23. package/dist/containers/iso-base-media/get-mfra-seeking-box.d.ts +4 -4
  24. package/dist/containers/iso-base-media/get-moov-atom.js +1 -1
  25. package/dist/containers/iso-base-media/get-seeking-byte-from-fragmented-mp4.d.ts +9 -5
  26. package/dist/containers/iso-base-media/get-seeking-byte-from-fragmented-mp4.js +17 -4
  27. package/dist/containers/iso-base-media/get-seeking-byte.d.ts +2 -2
  28. package/dist/containers/iso-base-media/get-seeking-byte.js +5 -8
  29. package/dist/containers/iso-base-media/make-track.d.ts +2 -2
  30. package/dist/containers/iso-base-media/make-track.js +18 -17
  31. package/dist/containers/iso-base-media/mfra/find-best-segment-from-tfra.d.ts +2 -2
  32. package/dist/containers/iso-base-media/mfra/get-mfra-atom.d.ts +4 -4
  33. package/dist/containers/iso-base-media/mfra/get-mfro-atom.d.ts +4 -4
  34. package/dist/containers/iso-base-media/moov/moov.d.ts +2 -2
  35. package/dist/containers/iso-base-media/process-box.d.ts +5 -5
  36. package/dist/containers/iso-base-media/stsd/mebx.d.ts +2 -2
  37. package/dist/containers/iso-base-media/stsd/samples.d.ts +3 -3
  38. package/dist/containers/iso-base-media/stsd/stsd.d.ts +2 -2
  39. package/dist/containers/iso-base-media/trak/trak.d.ts +2 -2
  40. package/dist/containers/iso-base-media/traversal.d.ts +1 -0
  41. package/dist/containers/iso-base-media/traversal.js +13 -1
  42. package/dist/containers/m3u/after-manifest-fetch.d.ts +6 -6
  43. package/dist/containers/m3u/after-manifest-fetch.js +1 -1
  44. package/dist/containers/m3u/fetch-m3u8-stream.d.ts +2 -2
  45. package/dist/containers/m3u/first-sample-in-m3u-chunk.d.ts +3 -3
  46. package/dist/containers/m3u/first-sample-in-m3u-chunk.js +2 -8
  47. package/dist/containers/m3u/get-seeking-byte.d.ts +3 -3
  48. package/dist/containers/m3u/get-streams.d.ts +6 -6
  49. package/dist/containers/m3u/get-streams.js +9 -9
  50. package/dist/containers/m3u/parse-stream-inf.js +3 -3
  51. package/dist/containers/m3u/process-m3u-chunk.js +3 -3
  52. package/dist/containers/m3u/run-over-m3u.d.ts +2 -2
  53. package/dist/containers/m3u/sample-sorter.d.ts +7 -7
  54. package/dist/containers/m3u/types.d.ts +3 -3
  55. package/dist/containers/mp3/parse-mpeg-header.js +2 -3
  56. package/dist/containers/mp3/seek/audio-sample-from-cbr.d.ts +2 -2
  57. package/dist/containers/riff/get-tracks-from-avi.d.ts +4 -9
  58. package/dist/containers/riff/get-tracks-from-avi.js +19 -20
  59. package/dist/containers/riff/parse-video-section.js +1 -1
  60. package/dist/containers/riff/seek/fetch-idx1.d.ts +4 -4
  61. package/dist/containers/transport-stream/get-tracks.d.ts +2 -2
  62. package/dist/containers/transport-stream/get-tracks.js +1 -5
  63. package/dist/containers/transport-stream/handle-aac-packet.d.ts +4 -4
  64. package/dist/containers/transport-stream/handle-aac-packet.js +5 -4
  65. package/dist/containers/transport-stream/handle-avc-packet.d.ts +4 -4
  66. package/dist/containers/transport-stream/handle-avc-packet.js +10 -4
  67. package/dist/containers/transport-stream/process-audio.d.ts +5 -5
  68. package/dist/containers/transport-stream/process-stream-buffers.d.ts +8 -8
  69. package/dist/containers/transport-stream/process-video.d.ts +5 -5
  70. package/dist/containers/wav/parse-fmt.js +2 -3
  71. package/dist/containers/webm/color.d.ts +2 -2
  72. package/dist/containers/webm/color.js +6 -25
  73. package/dist/containers/webm/get-ready-tracks.d.ts +3 -3
  74. package/dist/containers/webm/get-sample-from-block.d.ts +7 -7
  75. package/dist/containers/webm/make-track.d.ts +3 -3
  76. package/dist/containers/webm/make-track.js +53 -21
  77. package/dist/containers/webm/parse-webm-header.js +5 -0
  78. package/dist/containers/webm/seek/fetch-web-cues.d.ts +4 -4
  79. package/dist/containers/webm/seek/get-seeking-byte.d.ts +2 -2
  80. package/dist/containers/webm/segments.d.ts +2 -2
  81. package/dist/containers/webm/segments.js +1 -1
  82. package/dist/containers/webm/state-for-processing.d.ts +5 -5
  83. package/dist/containers/webm/traversal.js +2 -1
  84. package/dist/controller/emitter.d.ts +2 -3
  85. package/dist/controller/seek-signal.d.ts +3 -9
  86. package/dist/controller/seek-signal.js +2 -2
  87. package/dist/convert-audio-or-video-sample.d.ts +4 -4
  88. package/dist/download-and-parse-media.js +1 -1
  89. package/dist/emit-available-info.js +9 -9
  90. package/dist/errors.d.ts +4 -18
  91. package/dist/errors.js +1 -15
  92. package/dist/esm/index.mjs +654 -544
  93. package/dist/esm/node.mjs +63 -51
  94. package/dist/esm/server-worker.mjs +13 -34
  95. package/dist/esm/universal.mjs +63 -51
  96. package/dist/esm/worker-server-entry.mjs +500 -388
  97. package/dist/esm/worker-web-entry.mjs +437 -337
  98. package/dist/esm/worker.mjs +14 -35
  99. package/dist/fields.d.ts +2 -2
  100. package/dist/file-types/bmp.d.ts +2 -2
  101. package/dist/file-types/detect-file-type.d.ts +2 -1
  102. package/dist/file-types/detect-file-type.js +1 -6
  103. package/dist/file-types/gif.d.ts +2 -0
  104. package/dist/file-types/gif.js +18 -0
  105. package/dist/file-types/index.js +4 -2
  106. package/dist/file-types/png.d.ts +2 -2
  107. package/dist/file-types/webp.d.ts +2 -2
  108. package/dist/get-audio-codec.d.ts +3 -4
  109. package/dist/get-audio-codec.js +44 -23
  110. package/dist/get-dimensions.d.ts +2 -2
  111. package/dist/get-dimensions.js +6 -3
  112. package/dist/get-duration.js +6 -7
  113. package/dist/get-fields-from-callbacks.js +1 -1
  114. package/dist/get-is-hdr.js +6 -5
  115. package/dist/get-sample-aspect-ratio.d.ts +5 -5
  116. package/dist/get-seeking-byte.d.ts +2 -2
  117. package/dist/get-tracks.d.ts +34 -44
  118. package/dist/get-tracks.js +6 -46
  119. package/dist/get-video-codec.d.ts +4 -3
  120. package/dist/get-video-codec.js +6 -6
  121. package/dist/has-all-info.js +1 -1
  122. package/dist/index.d.ts +114 -55
  123. package/dist/index.js +6 -4
  124. package/dist/init-video.js +4 -11
  125. package/dist/internal-parse-media.js +1 -1
  126. package/dist/log.d.ts +6 -6
  127. package/dist/metadata/get-metadata.js +6 -4
  128. package/dist/options.d.ts +19 -23
  129. package/dist/parse-loop.js +2 -2
  130. package/dist/parse-media-on-worker-entry.js +13 -5
  131. package/dist/parse-media.js +1 -1
  132. package/dist/perform-seek.d.ts +4 -4
  133. package/dist/readers/from-fetch.d.ts +2 -2
  134. package/dist/readers/from-node.d.ts +2 -2
  135. package/dist/readers/from-node.js +64 -55
  136. package/dist/readers/from-web-file.d.ts +2 -2
  137. package/dist/readers/reader.d.ts +5 -5
  138. package/dist/readers/universal.d.ts +2 -2
  139. package/dist/readers/web.d.ts +2 -2
  140. package/dist/register-track.d.ts +12 -12
  141. package/dist/remotion-license-acknowledge.d.ts +2 -2
  142. package/dist/seek-backwards.d.ts +4 -4
  143. package/dist/seek-forwards.d.ts +4 -4
  144. package/dist/server-worker.module.d.ts +2 -0
  145. package/dist/server-worker.module.js +12 -0
  146. package/dist/state/can-skip-tracks.js +1 -1
  147. package/dist/state/emitted-fields.js +1 -1
  148. package/dist/state/has-tracks-section.d.ts +5 -5
  149. package/dist/state/iso-base-media/cached-sample-positions.d.ts +3 -3
  150. package/dist/state/iso-base-media/cached-sample-positions.js +16 -7
  151. package/dist/state/iso-base-media/iso-state.d.ts +4 -4
  152. package/dist/state/iso-base-media/lazy-mfra-load.d.ts +4 -4
  153. package/dist/state/m3u-state.d.ts +11 -11
  154. package/dist/state/matroska/lazy-cues-fetch.d.ts +4 -4
  155. package/dist/state/matroska/webm.d.ts +4 -4
  156. package/dist/state/matroska/webm.js +1 -1
  157. package/dist/state/may-skip-video-data.d.ts +1 -0
  158. package/dist/state/may-skip-video-data.js +23 -2
  159. package/dist/state/need-samples-for-fields.js +1 -1
  160. package/dist/state/parser-state.d.ts +67 -38
  161. package/dist/state/riff/lazy-idx1-fetch.d.ts +4 -4
  162. package/dist/state/riff/sample-counter.d.ts +3 -3
  163. package/dist/state/riff.d.ts +6 -6
  164. package/dist/state/sample-callbacks.d.ts +12 -12
  165. package/dist/state/sample-callbacks.js +2 -2
  166. package/dist/state/samples-observed/slow-duration-fps.d.ts +3 -3
  167. package/dist/state/transport-stream/last-emitted-sample.d.ts +3 -3
  168. package/dist/state/transport-stream/transport-stream.d.ts +2 -2
  169. package/dist/version.d.ts +1 -1
  170. package/dist/version.js +1 -1
  171. package/dist/webcodec-sample-types.d.ts +21 -10
  172. package/dist/work-on-seek-request.d.ts +4 -4
  173. package/dist/work-on-seek-request.js +40 -43
  174. package/dist/worker/serialize-error.d.ts +2 -2
  175. package/dist/worker/serialize-error.js +7 -25
  176. package/dist/worker/worker-types.d.ts +22 -24
  177. package/dist/worker-server.d.ts +2 -2
  178. package/dist/worker-server.js +5 -5
  179. package/dist/writers/writer.d.ts +2 -2
  180. package/package.json +3 -3
@@ -1,26 +1,4 @@
1
1
  // src/errors.ts
2
- class IsAGifError extends Error {
3
- mimeType;
4
- sizeInBytes;
5
- fileName;
6
- constructor({
7
- message,
8
- mimeType,
9
- sizeInBytes,
10
- fileName
11
- }) {
12
- super(message);
13
- this.name = "IsAGifError";
14
- this.fileName = "IsAGifError";
15
- this.mimeType = mimeType;
16
- this.sizeInBytes = sizeInBytes;
17
- this.fileName = fileName;
18
- if (Error.captureStackTrace) {
19
- Error.captureStackTrace(this, IsAGifError);
20
- }
21
- }
22
- }
23
-
24
2
  class IsAnImageError extends Error {
25
3
  imageType;
26
4
  dimensions;
@@ -400,67 +378,79 @@ var fetchCreateAdjacentFileSource = (relativePath, src) => {
400
378
  };
401
379
 
402
380
  // src/readers/from-node.ts
403
- import { createReadStream, promises, statSync } from "fs";
381
+ import { createReadStream, existsSync, promises, statSync } from "fs";
404
382
  import { dirname, join, relative, sep } from "path";
405
- var nodeReadContent = ({ src, range, controller }) => {
383
+ var nodeReadContent = async ({
384
+ src,
385
+ range,
386
+ controller
387
+ }) => {
406
388
  if (typeof src !== "string") {
407
389
  throw new Error("src must be a string when using `nodeReader`");
408
390
  }
391
+ await Promise.resolve();
409
392
  const ownController = new AbortController;
410
- const stream = createReadStream(src, {
411
- start: range === null ? 0 : typeof range === "number" ? range : range[0],
412
- end: range === null ? Infinity : typeof range === "number" ? Infinity : range[1]
413
- });
414
- controller._internals.signal.addEventListener("abort", () => {
415
- ownController.abort();
416
- }, { once: true });
417
- const stats = statSync(src);
418
- let readerCancelled = false;
419
- const reader = new ReadableStream({
420
- start(c) {
421
- if (readerCancelled) {
422
- return;
423
- }
424
- stream.on("data", (chunk) => {
425
- c.enqueue(chunk);
426
- });
427
- stream.on("end", () => {
393
+ try {
394
+ if (!existsSync(src)) {
395
+ throw new Error(`File does not exist: ${src}`);
396
+ }
397
+ const stream = createReadStream(src, {
398
+ start: range === null ? 0 : typeof range === "number" ? range : range[0],
399
+ end: range === null ? Infinity : typeof range === "number" ? Infinity : range[1]
400
+ });
401
+ controller._internals.signal.addEventListener("abort", () => {
402
+ ownController.abort();
403
+ }, { once: true });
404
+ const stats = statSync(src);
405
+ let readerCancelled = false;
406
+ const reader = new ReadableStream({
407
+ start(c) {
428
408
  if (readerCancelled) {
429
409
  return;
430
410
  }
431
- c.close();
432
- });
433
- stream.on("error", (err) => {
434
- c.error(err);
435
- });
436
- },
437
- cancel() {
438
- readerCancelled = true;
439
- stream.destroy();
411
+ stream.on("data", (chunk) => {
412
+ c.enqueue(chunk);
413
+ });
414
+ stream.on("end", () => {
415
+ if (readerCancelled) {
416
+ return;
417
+ }
418
+ c.close();
419
+ });
420
+ stream.on("error", (err) => {
421
+ c.error(err);
422
+ });
423
+ },
424
+ cancel() {
425
+ readerCancelled = true;
426
+ stream.destroy();
427
+ }
428
+ }).getReader();
429
+ if (controller) {
430
+ controller._internals.signal.addEventListener("abort", () => {
431
+ reader.cancel().catch(() => {});
432
+ }, { once: true });
440
433
  }
441
- }).getReader();
442
- if (controller) {
443
- controller._internals.signal.addEventListener("abort", () => {
444
- reader.cancel().catch(() => {});
445
- }, { once: true });
434
+ return Promise.resolve({
435
+ reader: {
436
+ reader,
437
+ abort: async () => {
438
+ try {
439
+ stream.destroy();
440
+ ownController.abort();
441
+ await reader.cancel();
442
+ } catch {}
443
+ }
444
+ },
445
+ contentLength: stats.size,
446
+ contentType: null,
447
+ name: src.split(sep).pop(),
448
+ supportsContentRange: true,
449
+ needsContentRange: true
450
+ });
451
+ } catch (err) {
452
+ return Promise.reject(err);
446
453
  }
447
- return Promise.resolve({
448
- reader: {
449
- reader,
450
- abort: async () => {
451
- try {
452
- stream.destroy();
453
- ownController.abort();
454
- await reader.cancel();
455
- } catch {}
456
- }
457
- },
458
- contentLength: stats.size,
459
- contentType: null,
460
- name: src.split(sep).pop(),
461
- supportsContentRange: true,
462
- needsContentRange: true
463
- });
464
454
  };
465
455
  var nodeReadWholeAsText = (src) => {
466
456
  if (typeof src !== "string") {
@@ -722,7 +712,7 @@ var performedSeeksStats = () => {
722
712
 
723
713
  // src/controller/seek-signal.ts
724
714
  var makeSeekSignal = (emitter) => {
725
- let seek;
715
+ let seek = null;
726
716
  return {
727
717
  seek: (seekRequest) => {
728
718
  seek = seekRequest;
@@ -733,7 +723,7 @@ var makeSeekSignal = (emitter) => {
733
723
  },
734
724
  clearSeekIfStillSame(previousSeek) {
735
725
  if (seek === previousSeek) {
736
- seek = undefined;
726
+ seek = null;
737
727
  return { hasChanged: false };
738
728
  }
739
729
  return { hasChanged: true };
@@ -837,10 +827,10 @@ var getM3uStreams = ({
837
827
  }
838
828
  boxes.push({
839
829
  src: readerInterface.createAdjacentFileSource(next.value, originalSrc),
840
- averageBandwidth: str.averageBandwidth,
841
- bandwidth: str.bandwidth,
830
+ averageBandwidthInBitsPerSec: str.averageBandwidthInBitsPerSec,
831
+ bandwidthInBitsPerSec: str.bandwidthInBitsPerSec,
842
832
  codecs: str.codecs,
843
- resolution: str.resolution,
833
+ dimensions: str.dimensions,
844
834
  associatedPlaylists
845
835
  });
846
836
  }
@@ -849,11 +839,11 @@ var getM3uStreams = ({
849
839
  return null;
850
840
  }
851
841
  const sorted = boxes.slice().sort((a, b) => {
852
- const aResolution = a.resolution ? a.resolution.width * a.resolution.height : 0;
853
- const bResolution = b.resolution ? b.resolution.width * b.resolution.height : 0;
842
+ const aResolution = a.dimensions ? a.dimensions.width * a.dimensions.height : 0;
843
+ const bResolution = b.dimensions ? b.dimensions.width * b.dimensions.height : 0;
854
844
  if (aResolution === bResolution) {
855
- const bandwidthA = a.averageBandwidth ?? a.bandwidth ?? 0;
856
- const bandwidthB = b.averageBandwidth ?? b.bandwidth ?? 0;
845
+ const bandwidthA = a.averageBandwidthInBitsPerSec ?? a.bandwidthInBitsPerSec ?? 0;
846
+ const bandwidthB = b.averageBandwidthInBitsPerSec ?? b.bandwidthInBitsPerSec ?? 0;
857
847
  return bandwidthB - bandwidthA;
858
848
  }
859
849
  return bResolution - aResolution;
@@ -1073,6 +1063,16 @@ var getTfraBoxes = (structure) => {
1073
1063
  }
1074
1064
  return getTfraBoxesFromMfraBoxChildren(mfraBox.children);
1075
1065
  };
1066
+ var getTrakBoxByTrackId = (moovBox, trackId) => {
1067
+ const trakBoxes = getTraks(moovBox);
1068
+ return trakBoxes.find((t) => {
1069
+ const tkhd = getTkhdBox(t);
1070
+ if (!tkhd) {
1071
+ return false;
1072
+ }
1073
+ return tkhd.trackId === trackId;
1074
+ }) ?? null;
1075
+ };
1076
1076
 
1077
1077
  // src/containers/riff/traversal.ts
1078
1078
  var isRiffAvi = (structure) => {
@@ -1402,13 +1402,61 @@ var getDisplayAspectRatio = ({
1402
1402
 
1403
1403
  // src/containers/avc/color.ts
1404
1404
  var getMatrixCoefficientsFromIndex = (index) => {
1405
- return index === 1 ? "bt709" : index === 5 ? "bt470bg" : index === 6 ? "smpte170m" : index === 9 ? "bt2020" : null;
1405
+ if (index === 0) {
1406
+ return "rgb";
1407
+ }
1408
+ if (index === 1) {
1409
+ return "bt709";
1410
+ }
1411
+ if (index === 5) {
1412
+ return "bt470bg";
1413
+ }
1414
+ if (index === 6) {
1415
+ return "smpte170m";
1416
+ }
1417
+ if (index === 9) {
1418
+ return "bt2020-ncl";
1419
+ }
1420
+ return null;
1406
1421
  };
1407
1422
  var getTransferCharacteristicsFromIndex = (index) => {
1408
- return index === 1 ? "bt709" : index === 6 ? "smpte170m" : index === 13 ? "iec61966-2-1" : index === 18 ? "arib-std-b67" : null;
1423
+ if (index === 1) {
1424
+ return "bt709";
1425
+ }
1426
+ if (index === 6) {
1427
+ return "smpte170m";
1428
+ }
1429
+ if (index === 8) {
1430
+ return "linear";
1431
+ }
1432
+ if (index === 13) {
1433
+ return "iec61966-2-1";
1434
+ }
1435
+ if (index === 16) {
1436
+ return "pq";
1437
+ }
1438
+ if (index === 18) {
1439
+ return "hlg";
1440
+ }
1441
+ return null;
1409
1442
  };
1410
1443
  var getPrimariesFromIndex = (index) => {
1411
- return index === 1 ? "bt709" : index === 5 ? "bt470bg" : index === 6 ? "smpte170m" : index === 9 ? "bt2020" : null;
1444
+ if (index === 1) {
1445
+ return "bt709";
1446
+ }
1447
+ if (index === 5) {
1448
+ return "bt470bg";
1449
+ }
1450
+ if (index === 6) {
1451
+ return "smpte170m";
1452
+ }
1453
+ if (index === 9) {
1454
+ return "bt2020";
1455
+ }
1456
+ if (index === 12) {
1457
+ return "smpte432";
1458
+ }
1459
+ return null;
1412
1460
  };
1413
1461
 
1414
1462
  // src/containers/webm/segments/all-segments.ts
@@ -2152,10 +2200,6 @@ var isMp3 = (data) => {
2152
2200
  const subarray = data.subarray(0, 4);
2153
2201
  return matchesPattern(mpegPattern)(subarray) || matchesPattern(mpegPattern2)(subarray) || matchesPattern(id3v4Pattern)(subarray) || matchesPattern(id3v3Pattern)(subarray) || matchesPattern(id3v2Pattern)(subarray);
2154
2202
  };
2155
- var isGif = (data) => {
2156
- const gifPattern = new Uint8Array([71, 73, 70, 56]);
2157
- return matchesPattern(gifPattern)(data.subarray(0, 4));
2158
- };
2159
2203
  var isAac = (data) => {
2160
2204
  const aacPattern = new Uint8Array([255, 241]);
2161
2205
  return matchesPattern(aacPattern)(data.subarray(0, 2));
@@ -2188,6 +2232,21 @@ var isBmp = (data) => {
2188
2232
  return null;
2189
2233
  };
2190
2234
 
2235
+ // src/file-types/gif.ts
2236
+ var getGifDimensions = (data) => {
2237
+ const view = new DataView(data.buffer, data.byteOffset);
2238
+ const width = view.getUint16(6, true);
2239
+ const height = view.getUint16(8, true);
2240
+ return { width, height };
2241
+ };
2242
+ var isGif = (data) => {
2243
+ const gifPattern = new Uint8Array([71, 73, 70, 56]);
2244
+ if (matchesPattern(gifPattern)(data.subarray(0, 4))) {
2245
+ return { type: "gif", dimensions: getGifDimensions(data) };
2246
+ }
2247
+ return null;
2248
+ };
2249
+
2191
2250
  // src/file-types/jpeg.ts
2192
2251
  function getJpegDimensions(data) {
2193
2252
  let offset = 0;
@@ -2333,8 +2392,9 @@ var detectFileType = (data) => {
2333
2392
  if (isMp3(data)) {
2334
2393
  return { type: "mp3" };
2335
2394
  }
2336
- if (isGif(data)) {
2337
- return { type: "gif" };
2395
+ const gif = isGif(data);
2396
+ if (gif) {
2397
+ return gif;
2338
2398
  }
2339
2399
  const png = isPng(data);
2340
2400
  if (png) {
@@ -2969,7 +3029,7 @@ var parseAv1PrivateData = (data, colrAtom) => {
2969
3029
  // src/get-video-codec.ts
2970
3030
  var getVideoCodec = (state) => {
2971
3031
  const track = getTracks(state, true);
2972
- return track.videoTracks[0]?.codecWithoutConfig ?? null;
3032
+ return track.find((t) => t.type === "video")?.codecEnum ?? null;
2973
3033
  };
2974
3034
  var hasVideoCodec = (state) => {
2975
3035
  return getHasTracks(state, true);
@@ -2983,13 +3043,13 @@ var getVideoPrivateData = (trakBox) => {
2983
3043
  return null;
2984
3044
  }
2985
3045
  if (avccBox) {
2986
- return avccBox.privateData;
3046
+ return { type: "avc-sps-pps", data: avccBox.privateData };
2987
3047
  }
2988
3048
  if (hvccBox) {
2989
- return hvccBox.privateData;
3049
+ return { type: "hvcc-data", data: hvccBox.privateData };
2990
3050
  }
2991
3051
  if (av1cBox) {
2992
- return av1cBox.privateData;
3052
+ return { type: "av1c-data", data: av1cBox.privateData };
2993
3053
  }
2994
3054
  return null;
2995
3055
  };
@@ -3007,9 +3067,9 @@ var getIsoBmColrConfig = (trakBox) => {
3007
3067
  }
3008
3068
  return {
3009
3069
  fullRange: colrAtom.fullRangeFlag,
3010
- matrixCoefficients: getMatrixCoefficientsFromIndex(colrAtom.matrixIndex),
3070
+ matrix: getMatrixCoefficientsFromIndex(colrAtom.matrixIndex),
3011
3071
  primaries: getPrimariesFromIndex(colrAtom.primaries),
3012
- transferCharacteristics: getTransferCharacteristicsFromIndex(colrAtom.transfer)
3072
+ transfer: getTransferCharacteristicsFromIndex(colrAtom.transfer)
3013
3073
  };
3014
3074
  };
3015
3075
  var getVideoCodecString = (trakBox) => {
@@ -3033,6 +3093,16 @@ var getVideoCodecString = (trakBox) => {
3033
3093
  return videoSample.format;
3034
3094
  };
3035
3095
 
3096
+ // src/containers/iso-base-media/color-to-webcodecs-colors.ts
3097
+ var mediaParserAdvancedColorToWebCodecsColor = (color2) => {
3098
+ return {
3099
+ transfer: color2.transfer,
3100
+ matrix: color2.matrix,
3101
+ primaries: color2.primaries,
3102
+ fullRange: color2.fullRange
3103
+ };
3104
+ };
3105
+
3036
3106
  // src/aac-codecprivate.ts
3037
3107
  var getSampleRateFromSampleFrequencyIndex = (samplingFrequencyIndex) => {
3038
3108
  switch (samplingFrequencyIndex) {
@@ -3192,16 +3262,27 @@ var getActualDecoderParameters = ({
3192
3262
  sampleRate
3193
3263
  }) => {
3194
3264
  if (audioCodec !== "aac") {
3195
- return { numberOfChannels, sampleRate, codecPrivate: codecPrivate2 };
3265
+ return {
3266
+ numberOfChannels,
3267
+ sampleRate,
3268
+ codecPrivate: codecPrivate2
3269
+ };
3196
3270
  }
3197
3271
  if (codecPrivate2 === null) {
3198
3272
  return { numberOfChannels, sampleRate, codecPrivate: codecPrivate2 };
3199
3273
  }
3200
- const parsed = parseAacCodecPrivate(codecPrivate2);
3274
+ if (codecPrivate2.type !== "aac-config") {
3275
+ throw new Error("Expected AAC codec private data");
3276
+ }
3277
+ const parsed = parseAacCodecPrivate(codecPrivate2.data);
3278
+ const actual = createAacCodecPrivate({
3279
+ ...parsed,
3280
+ codecPrivate: codecPrivate2.data
3281
+ });
3201
3282
  return {
3202
3283
  numberOfChannels: parsed.channelConfiguration,
3203
3284
  sampleRate: parsed.sampleRate,
3204
- codecPrivate: createAacCodecPrivate({ ...parsed, codecPrivate: codecPrivate2 })
3285
+ codecPrivate: { type: "aac-config", data: actual }
3205
3286
  };
3206
3287
  };
3207
3288
 
@@ -3271,10 +3352,10 @@ var makeBaseMediaTrack = (trakBox) => {
3271
3352
  }
3272
3353
  const { codecString, description } = getAudioCodecStringFromTrak(trakBox);
3273
3354
  const codecPrivate2 = getCodecPrivateFromTrak(trakBox) ?? description ?? null;
3274
- const codecWithoutConfig = getAudioCodecFromTrack(trakBox);
3355
+ const codecEnum = getAudioCodecFromTrack(trakBox);
3275
3356
  const actual = getActualDecoderParameters({
3276
- audioCodec: codecWithoutConfig,
3277
- codecPrivate: codecPrivate2,
3357
+ audioCodec: codecEnum,
3358
+ codecPrivate: codecPrivate2 ?? null,
3278
3359
  numberOfChannels,
3279
3360
  sampleRate
3280
3361
  });
@@ -3285,10 +3366,9 @@ var makeBaseMediaTrack = (trakBox) => {
3285
3366
  codec: codecString,
3286
3367
  numberOfChannels: actual.numberOfChannels,
3287
3368
  sampleRate: actual.sampleRate,
3288
- description: actual.codecPrivate ?? undefined,
3289
- trakBox,
3290
- codecPrivate: actual.codecPrivate,
3291
- codecWithoutConfig
3369
+ description: actual.codecPrivate?.data ?? undefined,
3370
+ codecData: actual.codecPrivate,
3371
+ codecEnum
3292
3372
  };
3293
3373
  }
3294
3374
  if (!trakBoxContainsVideo(trakBox)) {
@@ -3318,6 +3398,12 @@ var makeBaseMediaTrack = (trakBox) => {
3318
3398
  throw new Error("Could not find video codec");
3319
3399
  }
3320
3400
  const privateData = getVideoPrivateData(trakBox);
3401
+ const advancedColor = getIsoBmColrConfig(trakBox) ?? {
3402
+ fullRange: null,
3403
+ matrix: null,
3404
+ primaries: null,
3405
+ transfer: null
3406
+ };
3321
3407
  const track = {
3322
3408
  m3uStreamFormat: null,
3323
3409
  type: "video",
@@ -3333,15 +3419,10 @@ var makeBaseMediaTrack = (trakBox) => {
3333
3419
  displayAspectWidth,
3334
3420
  displayAspectHeight,
3335
3421
  rotation,
3336
- trakBox,
3337
- codecPrivate: privateData,
3338
- color: getIsoBmColrConfig(trakBox) ?? {
3339
- fullRange: null,
3340
- matrixCoefficients: null,
3341
- primaries: null,
3342
- transferCharacteristics: null
3343
- },
3344
- codecWithoutConfig: getVideoCodecFromIsoTrak(trakBox),
3422
+ codecData: privateData,
3423
+ colorSpace: mediaParserAdvancedColorToWebCodecsColor(advancedColor),
3424
+ advancedColor,
3425
+ codecEnum: getVideoCodecFromIsoTrak(trakBox),
3345
3426
  fps: getFpsFromMp4TrakBox(trakBox)
3346
3427
  };
3347
3428
  return track;
@@ -3412,7 +3493,8 @@ var addAvcProfileToTrack = (track, avc1Profile) => {
3412
3493
  return {
3413
3494
  ...track,
3414
3495
  codec: getCodecStringFromSpsAndPps(avc1Profile.sps),
3415
- codecPrivate: createSpsPpsData(avc1Profile)
3496
+ codecData: { type: "avc-sps-pps", data: createSpsPpsData(avc1Profile) },
3497
+ description: undefined
3416
3498
  };
3417
3499
  };
3418
3500
 
@@ -3438,14 +3520,13 @@ var makeAviAudioTrack = ({
3438
3520
  return {
3439
3521
  type: "audio",
3440
3522
  codec: "mp4a.40.2",
3441
- codecPrivate: new Uint8Array([18, 16]),
3442
- codecWithoutConfig: "aac",
3523
+ codecData: { type: "aac-config", data: new Uint8Array([18, 16]) },
3524
+ codecEnum: "aac",
3443
3525
  description: new Uint8Array([18, 16]),
3444
3526
  numberOfChannels: strf.numberOfChannels,
3445
3527
  sampleRate: strf.sampleRate,
3446
3528
  timescale: MEDIA_PARSER_RIFF_TIMESCALE,
3447
- trackId: index,
3448
- trakBox: null
3529
+ trackId: index
3449
3530
  };
3450
3531
  };
3451
3532
  var makeAviVideoTrack = ({
@@ -3457,9 +3538,9 @@ var makeAviVideoTrack = ({
3457
3538
  throw new Error(`Unsupported video codec ${strh.handler}`);
3458
3539
  }
3459
3540
  return {
3460
- codecPrivate: null,
3541
+ codecData: null,
3461
3542
  codec: TO_BE_OVERRIDDEN_LATER,
3462
- codecWithoutConfig: "h264",
3543
+ codecEnum: "h264",
3463
3544
  codedHeight: strf.height,
3464
3545
  codedWidth: strf.width,
3465
3546
  width: strf.width,
@@ -3470,14 +3551,19 @@ var makeAviVideoTrack = ({
3470
3551
  description: undefined,
3471
3552
  m3uStreamFormat: null,
3472
3553
  trackId: index,
3473
- color: {
3554
+ colorSpace: {
3474
3555
  fullRange: null,
3475
- matrixCoefficients: null,
3556
+ matrix: null,
3476
3557
  primaries: null,
3477
- transferCharacteristics: null
3558
+ transfer: null
3559
+ },
3560
+ advancedColor: {
3561
+ fullRange: null,
3562
+ matrix: null,
3563
+ primaries: null,
3564
+ transfer: null
3478
3565
  },
3479
3566
  displayAspectWidth: strf.width,
3480
- trakBox: null,
3481
3567
  rotation: 0,
3482
3568
  sampleAspectRatio: {
3483
3569
  numerator: 1,
@@ -3487,9 +3573,7 @@ var makeAviVideoTrack = ({
3487
3573
  };
3488
3574
  };
3489
3575
  var getTracksFromAvi = (structure, state) => {
3490
- const videoTracks = [];
3491
- const audioTracks = [];
3492
- const otherTracks = [];
3576
+ const tracks2 = [];
3493
3577
  const boxes = getStrlBoxes(structure);
3494
3578
  let i = 0;
3495
3579
  for (const box of boxes) {
@@ -3499,22 +3583,22 @@ var getTracksFromAvi = (structure, state) => {
3499
3583
  }
3500
3584
  const { strf } = strh;
3501
3585
  if (strf.type === "strf-box-video") {
3502
- videoTracks.push(addAvcProfileToTrack(makeAviVideoTrack({ strh, strf, index: i }), state.riff.getAvcProfile()));
3586
+ tracks2.push(addAvcProfileToTrack(makeAviVideoTrack({ strh, strf, index: i }), state.riff.getAvcProfile()));
3503
3587
  } else if (strh.fccType === "auds") {
3504
- audioTracks.push(makeAviAudioTrack({ strf, index: i }));
3588
+ tracks2.push(makeAviAudioTrack({ strf, index: i }));
3505
3589
  } else {
3506
3590
  throw new Error(`Unsupported track type ${strh.fccType}`);
3507
3591
  }
3508
3592
  i++;
3509
3593
  }
3510
- return { audioTracks, otherTracks, videoTracks };
3594
+ return tracks2;
3511
3595
  };
3512
3596
  var hasAllTracksFromAvi = (state) => {
3513
3597
  try {
3514
3598
  const structure = state.structure.getRiffStructure();
3515
3599
  const numberOfTracks = getNumberOfTracks(structure);
3516
3600
  const tracks2 = getTracksFromAvi(structure, state);
3517
- return tracks2.videoTracks.length + tracks2.audioTracks.length + tracks2.otherTracks.length === numberOfTracks && !tracks2.videoTracks.find((t) => t.codec === TO_BE_OVERRIDDEN_LATER);
3601
+ return tracks2.length === numberOfTracks && !tracks2.find((t) => t.type === "video" && t.codec === TO_BE_OVERRIDDEN_LATER);
3518
3602
  } catch {
3519
3603
  return false;
3520
3604
  }
@@ -3567,11 +3651,7 @@ var getTracksFromTransportStream = (parserState) => {
3567
3651
  if (mapped.length !== filterStreamsBySupportedTypes(programMapTable.streams).length) {
3568
3652
  throw new Error("Not all tracks found");
3569
3653
  }
3570
- return {
3571
- videoTracks: mapped.filter((track) => track.type === "video"),
3572
- audioTracks: mapped.filter((track) => track.type === "audio"),
3573
- otherTracks: []
3574
- };
3654
+ return mapped;
3575
3655
  };
3576
3656
  var hasAllTracksFromTransportStream = (parserState) => {
3577
3657
  try {
@@ -3618,7 +3698,7 @@ var getHvc1CodecString = (data) => {
3618
3698
 
3619
3699
  // src/containers/webm/traversal.ts
3620
3700
  var getMainSegment = (segments) => {
3621
- return segments.find((s) => s.type === "Segment");
3701
+ return segments.find((s) => s.type === "Segment") ?? null;
3622
3702
  };
3623
3703
  var getTrackCodec = (track) => {
3624
3704
  const child = track.value.find((b) => b.type === "CodecID");
@@ -3833,9 +3913,9 @@ var parseColorSegment = (colourSegment) => {
3833
3913
  const primaries2 = getPrimariesSegment(colourSegment);
3834
3914
  const range2 = getRangeSegment(colourSegment);
3835
3915
  return {
3836
- transferCharacteristics: transferCharacteristics2 ? transferCharacteristics2.value.value === 1 ? "bt709" : transferCharacteristics2.value.value === 6 ? "smpte170m" : transferCharacteristics2.value.value === 13 ? "iec61966-2-1" : null : null,
3837
- matrixCoefficients: matrixCoefficients2 ? matrixCoefficients2.value.value === 1 ? "bt709" : matrixCoefficients2.value.value === 6 ? "smpte170m" : matrixCoefficients2.value.value === 5 ? "bt470bg" : null : null,
3838
- primaries: primaries2 ? primaries2.value.value === 1 ? "bt709" : primaries2.value.value === 6 ? "smpte170m" : primaries2.value.value === 5 ? "bt470bg" : null : null,
3916
+ transfer: transferCharacteristics2 ? getTransferCharacteristicsFromIndex(transferCharacteristics2.value.value) : null,
3917
+ matrix: matrixCoefficients2 ? getMatrixCoefficientsFromIndex(matrixCoefficients2.value.value) : null,
3918
+ primaries: primaries2 ? getPrimariesFromIndex(primaries2.value.value) : null,
3839
3919
  fullRange: transferCharacteristics2?.value.value && matrixCoefficients2?.value.value ? null : range2 ? Boolean(range2?.value.value) : null
3840
3920
  };
3841
3921
  };
@@ -3938,7 +4018,7 @@ var getDescription = (track) => {
3938
4018
  }
3939
4019
  return;
3940
4020
  };
3941
- var getMatroskaVideoCodecWithoutConfigString = ({
4021
+ var getMatroskaVideoCodecEnum = ({
3942
4022
  codecSegment: codec
3943
4023
  }) => {
3944
4024
  if (codec.value === "V_VP8") {
@@ -3993,7 +4073,7 @@ var getMatroskaVideoCodecString = ({
3993
4073
  }
3994
4074
  throw new Error(`Unknown codec: ${codec.value}`);
3995
4075
  };
3996
- var getMatroskaAudioCodecWithoutConfigString = ({
4076
+ var getMatroskaAudioCodecEnum = ({
3997
4077
  track
3998
4078
  }) => {
3999
4079
  const codec = getCodecSegment(track);
@@ -4098,6 +4178,28 @@ var getTrack = ({
4098
4178
  if (!codecString) {
4099
4179
  return null;
4100
4180
  }
4181
+ const codecEnum = getMatroskaVideoCodecEnum({
4182
+ codecSegment: codec
4183
+ });
4184
+ const codecData = codecPrivate2 === null ? null : codecEnum === "h264" ? { type: "avc-sps-pps", data: codecPrivate2 } : codecEnum === "av1" ? {
4185
+ type: "av1c-data",
4186
+ data: codecPrivate2
4187
+ } : codecEnum === "h265" ? {
4188
+ type: "hvcc-data",
4189
+ data: codecPrivate2
4190
+ } : codecEnum === "vp8" ? {
4191
+ type: "unknown-data",
4192
+ data: codecPrivate2
4193
+ } : codecEnum === "vp9" ? {
4194
+ type: "unknown-data",
4195
+ data: codecPrivate2
4196
+ } : null;
4197
+ const advancedColor = colour ? parseColorSegment(colour) : {
4198
+ fullRange: null,
4199
+ matrix: null,
4200
+ primaries: null,
4201
+ transfer: null
4202
+ };
4101
4203
  return {
4102
4204
  m3uStreamFormat: null,
4103
4205
  type: "video",
@@ -4116,17 +4218,10 @@ var getTrack = ({
4116
4218
  displayAspectHeight: displayHeight2 ? displayHeight2.value.value : height.value.value,
4117
4219
  displayAspectWidth: displayWidth2 ? displayWidth2.value.value : width.value.value,
4118
4220
  rotation: 0,
4119
- trakBox: null,
4120
- codecPrivate: codecPrivate2,
4121
- color: colour ? parseColorSegment(colour) : {
4122
- fullRange: null,
4123
- matrixCoefficients: null,
4124
- primaries: null,
4125
- transferCharacteristics: null
4126
- },
4127
- codecWithoutConfig: getMatroskaVideoCodecWithoutConfigString({
4128
- codecSegment: codec
4129
- }),
4221
+ codecData,
4222
+ colorSpace: mediaParserAdvancedColorToWebCodecsColor(advancedColor),
4223
+ advancedColor,
4224
+ codecEnum,
4130
4225
  fps: null
4131
4226
  };
4132
4227
  }
@@ -4137,17 +4232,17 @@ var getTrack = ({
4137
4232
  if (sampleRate === null) {
4138
4233
  throw new Error("Could not find sample rate or number of channels");
4139
4234
  }
4235
+ const codecString = getMatroskaAudioCodecString(track);
4140
4236
  return {
4141
4237
  type: "audio",
4142
4238
  trackId,
4143
- codec: getMatroskaAudioCodecString(track),
4239
+ codec: codecString,
4144
4240
  timescale,
4145
4241
  numberOfChannels,
4146
4242
  sampleRate,
4147
4243
  description: getAudioDescription(track),
4148
- trakBox: null,
4149
- codecPrivate: codecPrivate2,
4150
- codecWithoutConfig: getMatroskaAudioCodecWithoutConfigString({
4244
+ codecData: codecPrivate2 ? codecString === "opus" ? { type: "ogg-identification", data: codecPrivate2 } : { type: "unknown-data", data: codecPrivate2 } : null,
4245
+ codecEnum: getMatroskaAudioCodecEnum({
4151
4246
  track
4152
4247
  })
4153
4248
  };
@@ -4260,51 +4355,23 @@ var getHasTracks = (state, mayUsePrecomputed) => {
4260
4355
  throw new Error("Unknown container " + structure);
4261
4356
  };
4262
4357
  var getCategorizedTracksFromMatroska = (state) => {
4263
- const videoTracks = [];
4264
- const audioTracks = [];
4265
- const otherTracks = [];
4266
4358
  const { resolved } = getTracksFromMatroska({
4267
4359
  structureState: state.structure,
4268
4360
  webmState: state.webm
4269
4361
  });
4270
- for (const track of resolved) {
4271
- if (track.type === "video") {
4272
- videoTracks.push(track);
4273
- } else if (track.type === "audio") {
4274
- audioTracks.push(track);
4275
- } else if (track.type === "other") {
4276
- otherTracks.push(track);
4277
- }
4278
- }
4279
- return {
4280
- videoTracks,
4281
- audioTracks,
4282
- otherTracks
4283
- };
4362
+ return resolved;
4284
4363
  };
4285
4364
  var getTracksFromMoovBox = (moovBox) => {
4286
- const videoTracks = [];
4287
- const audioTracks = [];
4288
- const otherTracks = [];
4365
+ const mediaParserTracks = [];
4289
4366
  const tracks2 = getTraks(moovBox);
4290
4367
  for (const trakBox of tracks2) {
4291
4368
  const track = makeBaseMediaTrack(trakBox);
4292
4369
  if (!track) {
4293
4370
  continue;
4294
4371
  }
4295
- if (track.type === "video") {
4296
- videoTracks.push(track);
4297
- } else if (track.type === "audio") {
4298
- audioTracks.push(track);
4299
- } else if (track.type === "other") {
4300
- otherTracks.push(track);
4301
- }
4372
+ mediaParserTracks.push(track);
4302
4373
  }
4303
- return {
4304
- videoTracks,
4305
- audioTracks,
4306
- otherTracks
4307
- };
4374
+ return mediaParserTracks;
4308
4375
  };
4309
4376
  var getTracksFromIsoBaseMedia = ({
4310
4377
  mayUsePrecomputed,
@@ -4319,11 +4386,7 @@ var getTracksFromIsoBaseMedia = ({
4319
4386
  mayUsePrecomputed
4320
4387
  });
4321
4388
  if (!moovBox) {
4322
- return {
4323
- videoTracks: [],
4324
- audioTracks: [],
4325
- otherTracks: []
4326
- };
4389
+ return [];
4327
4390
  }
4328
4391
  return getTracksFromMoovBox(moovBox);
4329
4392
  };
@@ -4332,11 +4395,7 @@ var defaultGetTracks = (parserState) => {
4332
4395
  if (tracks2.length === 0) {
4333
4396
  throw new Error("No tracks found");
4334
4397
  }
4335
- return {
4336
- audioTracks: tracks2.filter((t) => t.type === "audio"),
4337
- otherTracks: [],
4338
- videoTracks: tracks2.filter((t) => t.type === "video")
4339
- };
4398
+ return tracks2;
4340
4399
  };
4341
4400
  var getTracks = (state, mayUsePrecomputed) => {
4342
4401
  const structure = state.structure.getStructure();
@@ -4366,16 +4425,15 @@ var getTracks = (state, mayUsePrecomputed) => {
4366
4425
  // src/get-audio-codec.ts
4367
4426
  var getAudioCodec = (parserState) => {
4368
4427
  const tracks2 = getTracks(parserState, true);
4369
- const allTracks = tracks2.audioTracks.length + tracks2.otherTracks.length + tracks2.videoTracks.length;
4370
- if (allTracks === 0) {
4428
+ if (tracks2.length === 0) {
4371
4429
  throw new Error("No tracks yet");
4372
4430
  }
4373
- const audioTrack = tracks2.audioTracks[0];
4431
+ const audioTrack = tracks2.find((t) => t.type === "audio");
4374
4432
  if (!audioTrack) {
4375
4433
  return null;
4376
4434
  }
4377
4435
  if (audioTrack.type === "audio") {
4378
- return audioTrack.codecWithoutConfig;
4436
+ return audioTrack.codecEnum;
4379
4437
  }
4380
4438
  return null;
4381
4439
  };
@@ -4432,7 +4490,7 @@ var getCodecPrivateFromTrak = (trakBox) => {
4432
4490
  if (!mp4a) {
4433
4491
  return null;
4434
4492
  }
4435
- return mp4a.asBytes;
4493
+ return { type: "aac-config", data: mp4a.asBytes };
4436
4494
  };
4437
4495
  var onSample = (sample, children) => {
4438
4496
  const child = children.find((c) => c.type === "esds-box");
@@ -4513,19 +4571,19 @@ var getAudioCodecStringFromTrak = (trak) => {
4513
4571
  if (codec.format === "lpcm") {
4514
4572
  return {
4515
4573
  codecString: "pcm-s16",
4516
- description: codec.description
4574
+ description: codec.description ? { type: "unknown-data", data: codec.description } : undefined
4517
4575
  };
4518
4576
  }
4519
4577
  if (codec.format === "twos") {
4520
4578
  return {
4521
4579
  codecString: "pcm-s16",
4522
- description: codec.description
4580
+ description: codec.description ? { type: "unknown-data", data: codec.description } : undefined
4523
4581
  };
4524
4582
  }
4525
4583
  if (codec.format === "in24") {
4526
4584
  return {
4527
4585
  codecString: "pcm-s24",
4528
- description: codec.description
4586
+ description: codec.description ? { type: "unknown-data", data: codec.description } : undefined
4529
4587
  };
4530
4588
  }
4531
4589
  const codecStringWithoutMp3Exception = [
@@ -4533,10 +4591,31 @@ var getAudioCodecStringFromTrak = (trak) => {
4533
4591
  codec.primarySpecificator ? codec.primarySpecificator.toString(16) : null,
4534
4592
  codec.secondarySpecificator ? codec.secondarySpecificator.toString().padStart(2, "0") : null
4535
4593
  ].filter(Boolean).join(".");
4536
- const codecString = codecStringWithoutMp3Exception === "mp4a.6b" ? "mp3" : codecStringWithoutMp3Exception;
4594
+ const codecString = codecStringWithoutMp3Exception.toLowerCase() === "mp4a.6b" || codecStringWithoutMp3Exception.toLowerCase() === "mp4a.69" ? "mp3" : codecStringWithoutMp3Exception;
4595
+ if (codecString === "mp3") {
4596
+ return {
4597
+ codecString,
4598
+ description: codec.description ? {
4599
+ type: "unknown-data",
4600
+ data: codec.description
4601
+ } : undefined
4602
+ };
4603
+ }
4604
+ if (codecString.startsWith("mp4a.")) {
4605
+ return {
4606
+ codecString,
4607
+ description: codec.description ? {
4608
+ type: "aac-config",
4609
+ data: codec.description
4610
+ } : undefined
4611
+ };
4612
+ }
4537
4613
  return {
4538
4614
  codecString,
4539
- description: codec.description
4615
+ description: codec.description ? {
4616
+ type: "unknown-data",
4617
+ data: codec.description
4618
+ } : undefined
4540
4619
  };
4541
4620
  };
4542
4621
  var getAudioCodecFromAudioCodecInfo = (codec) => {
@@ -4628,11 +4707,14 @@ var getDimensions = (state) => {
4628
4707
  if (structure && isAudioStructure(structure)) {
4629
4708
  return null;
4630
4709
  }
4631
- const { videoTracks } = getTracks(state, true);
4632
- if (!videoTracks.length) {
4710
+ const tracks2 = getTracks(state, true);
4711
+ if (!tracks2.length) {
4712
+ return null;
4713
+ }
4714
+ const firstVideoTrack = tracks2.find((t) => t.type === "video");
4715
+ if (!firstVideoTrack) {
4633
4716
  return null;
4634
4717
  }
4635
- const firstVideoTrack = videoTracks[0];
4636
4718
  return {
4637
4719
  width: firstVideoTrack.width,
4638
4720
  height: firstVideoTrack.height,
@@ -5216,15 +5298,14 @@ var getDurationFromIsoBaseMedia = (parserState) => {
5216
5298
  return mvhdBox.durationInSeconds;
5217
5299
  }
5218
5300
  const tracks2 = getTracks(parserState, true);
5219
- const allTracks = [
5220
- ...tracks2.videoTracks,
5221
- ...tracks2.audioTracks,
5222
- ...tracks2.otherTracks
5223
- ];
5224
- const allSamples = allTracks.map((t) => {
5301
+ const allSamples = tracks2.map((t) => {
5225
5302
  const { timescale: ts } = t;
5303
+ const trakBox = getTrakBoxByTrackId(moovBox, t.trackId);
5304
+ if (!trakBox) {
5305
+ return null;
5306
+ }
5226
5307
  const { samplePositions, isComplete } = getSamplePositionsFromTrack({
5227
- trakBox: t.trakBox,
5308
+ trakBox,
5228
5309
  moofBoxes,
5229
5310
  moofComplete: areSamplesComplete({ moofBoxes, tfraBoxes })
5230
5311
  });
@@ -5294,11 +5375,11 @@ var hasSlowDuration = (parserState) => {
5294
5375
 
5295
5376
  // src/get-is-hdr.ts
5296
5377
  var isVideoTrackHdr = (track) => {
5297
- return track.color.matrixCoefficients === "bt2020" && track.color.transferCharacteristics === "arib-std-b67" && track.color.primaries === "bt2020";
5378
+ return track.advancedColor.matrix === "bt2020-ncl" && (track.advancedColor.transfer === "hlg" || track.advancedColor.transfer === "pq") && track.advancedColor.primaries === "bt2020";
5298
5379
  };
5299
5380
  var getIsHdr = (state) => {
5300
- const { videoTracks } = getTracks(state, true);
5301
- return videoTracks.some((track) => isVideoTrackHdr(track));
5381
+ const tracks2 = getTracks(state, true);
5382
+ return tracks2.some((track) => track.type === "video" && isVideoTrackHdr(track));
5302
5383
  };
5303
5384
  var hasHdr = (state) => {
5304
5385
  return getHasTracks(state, true);
@@ -5306,19 +5387,28 @@ var hasHdr = (state) => {
5306
5387
 
5307
5388
  // src/containers/iso-base-media/get-keyframes.ts
5308
5389
  var getKeyframesFromIsoBaseMedia = (state) => {
5309
- const { videoTracks } = getTracksFromIsoBaseMedia({
5390
+ const tracks2 = getTracksFromIsoBaseMedia({
5310
5391
  isoState: state.iso,
5311
5392
  m3uPlaylistContext: state.m3uPlaylistContext,
5312
5393
  structure: state.structure,
5313
5394
  mayUsePrecomputed: true
5314
5395
  });
5396
+ const videoTracks = tracks2.filter((t) => t.type === "video");
5315
5397
  const structure = state.structure.getIsoStructure();
5316
5398
  const moofBoxes = getMoofBoxes(structure.boxes);
5317
5399
  const tfraBoxes = getTfraBoxes(structure.boxes);
5400
+ const moov = getMoovFromFromIsoStructure(structure);
5401
+ if (!moov) {
5402
+ return [];
5403
+ }
5318
5404
  const allSamples = videoTracks.map((t) => {
5319
5405
  const { timescale: ts } = t;
5406
+ const trakBox = getTrakBoxByTrackId(moov, t.trackId);
5407
+ if (!trakBox) {
5408
+ return [];
5409
+ }
5320
5410
  const { samplePositions, isComplete } = getSamplePositionsFromTrack({
5321
- trakBox: t.trakBox,
5411
+ trakBox,
5322
5412
  moofBoxes,
5323
5413
  moofComplete: areSamplesComplete({
5324
5414
  moofBoxes,
@@ -5606,7 +5696,7 @@ var hasMetadata = (structure) => {
5606
5696
  if (structure.type === "wav") {
5607
5697
  return getMetadataFromWav(structure) !== null;
5608
5698
  }
5609
- if (structure.type === "m3u" || structure.type === "transport-stream") {
5699
+ if (structure.type === "m3u" || structure.type === "transport-stream" || structure.type === "aac") {
5610
5700
  return true;
5611
5701
  }
5612
5702
  if (structure.type === "flac") {
@@ -5621,9 +5711,6 @@ var hasMetadata = (structure) => {
5621
5711
  if (structure.type === "riff") {
5622
5712
  return false;
5623
5713
  }
5624
- if (structure.type === "aac") {
5625
- return true;
5626
- }
5627
5714
  throw new Error("Unknown container " + structure);
5628
5715
  };
5629
5716
 
@@ -5771,10 +5858,18 @@ var findKeyframeBeforeTime = ({
5771
5858
 
5772
5859
  // src/containers/iso-base-media/find-track-to-seek.ts
5773
5860
  var findAnyTrackWithSamplePositions = (allTracks, struc) => {
5861
+ const moov = getMoovFromFromIsoStructure(struc);
5862
+ if (!moov) {
5863
+ return null;
5864
+ }
5774
5865
  for (const track of allTracks) {
5775
5866
  if (track.type === "video" || track.type === "audio") {
5867
+ const trakBox = getTrakBoxByTrackId(moov, track.trackId);
5868
+ if (!trakBox) {
5869
+ continue;
5870
+ }
5776
5871
  const { samplePositions } = getSamplePositionsFromTrack({
5777
- trakBox: track.trakBox,
5872
+ trakBox,
5778
5873
  moofBoxes: getMoofBoxes(struc.boxes),
5779
5874
  moofComplete: areSamplesComplete({
5780
5875
  moofBoxes: getMoofBoxes(struc.boxes),
@@ -5795,8 +5890,16 @@ var findTrackToSeek = (allTracks, structure) => {
5795
5890
  if (!firstVideoTrack) {
5796
5891
  return findAnyTrackWithSamplePositions(allTracks, struc);
5797
5892
  }
5893
+ const moov = getMoovFromFromIsoStructure(struc);
5894
+ if (!moov) {
5895
+ return null;
5896
+ }
5897
+ const trakBox = getTrakBoxByTrackId(moov, firstVideoTrack.trackId);
5898
+ if (!trakBox) {
5899
+ return null;
5900
+ }
5798
5901
  const { samplePositions } = getSamplePositionsFromTrack({
5799
- trakBox: firstVideoTrack.trakBox,
5902
+ trakBox,
5800
5903
  moofBoxes: getMoofBoxes(struc.boxes),
5801
5904
  moofComplete: areSamplesComplete({
5802
5905
  moofBoxes: getMoofBoxes(struc.boxes),
@@ -5929,15 +6032,30 @@ var getSeekingByteFromFragmentedMp4 = async ({
5929
6032
  logLevel,
5930
6033
  currentPosition,
5931
6034
  isoState,
5932
- allTracks,
5933
- isLastChunkInPlaylist
6035
+ tracks: tracks2,
6036
+ isLastChunkInPlaylist,
6037
+ structure,
6038
+ mp4HeaderSegment
5934
6039
  }) => {
5935
- const firstVideoTrack = allTracks.find((t) => t.type === "video");
5936
- const firstTrack = firstVideoTrack ?? allTracks.find((t) => t.type === "audio");
6040
+ const firstVideoTrack = tracks2.find((t) => t.type === "video");
6041
+ const firstTrack = firstVideoTrack ?? tracks2.find((t) => t.type === "audio");
5937
6042
  if (!firstTrack) {
5938
6043
  throw new Error("no video and no audio tracks");
5939
6044
  }
5940
- const tkhdBox = getTkhdBox(firstTrack.trakBox);
6045
+ const moov = getMoovBoxFromState({
6046
+ structureState: structure,
6047
+ isoState,
6048
+ mp4HeaderSegment,
6049
+ mayUsePrecomputed: true
6050
+ });
6051
+ if (!moov) {
6052
+ throw new Error("No moov atom found");
6053
+ }
6054
+ const trakBox = getTrakBoxByTrackId(moov, firstTrack.trackId);
6055
+ if (!trakBox) {
6056
+ throw new Error("No trak box found");
6057
+ }
6058
+ const tkhdBox = getTkhdBox(trakBox);
5941
6059
  if (!tkhdBox) {
5942
6060
  throw new Error("Expected tkhd box in trak box");
5943
6061
  }
@@ -6025,11 +6143,6 @@ var getSeekingByteFromIsoBaseMedia = ({
6025
6143
  structure,
6026
6144
  mayUsePrecomputed: false
6027
6145
  });
6028
- const allTracks = [
6029
- ...tracks2.videoTracks,
6030
- ...tracks2.audioTracks,
6031
- ...tracks2.otherTracks
6032
- ];
6033
6146
  const hasMoov = Boolean(getMoovBoxFromState({
6034
6147
  structureState: structure,
6035
6148
  isoState,
@@ -6049,11 +6162,13 @@ var getSeekingByteFromIsoBaseMedia = ({
6049
6162
  logLevel,
6050
6163
  currentPosition,
6051
6164
  isoState,
6052
- allTracks,
6053
- isLastChunkInPlaylist: m3uPlaylistContext?.isLastChunkInPlaylist ?? false
6165
+ tracks: tracks2,
6166
+ isLastChunkInPlaylist: m3uPlaylistContext?.isLastChunkInPlaylist ?? false,
6167
+ structure,
6168
+ mp4HeaderSegment: m3uPlaylistContext?.mp4HeaderSegment ?? null
6054
6169
  });
6055
6170
  }
6056
- const trackWithSamplePositions = findTrackToSeek(allTracks, structure);
6171
+ const trackWithSamplePositions = findTrackToSeek(tracks2, structure);
6057
6172
  if (!trackWithSamplePositions) {
6058
6173
  return Promise.resolve({
6059
6174
  type: "valid-but-must-wait"
@@ -6662,8 +6777,8 @@ var getVideoColorFromSps = (sps) => {
6662
6777
  const transferCharacteristics2 = sps.vui_parameters?.transfer_characteristics;
6663
6778
  const colorPrimaries = sps.vui_parameters?.colour_primaries;
6664
6779
  return {
6665
- matrixCoefficients: matrixCoefficients2 ? getMatrixCoefficientsFromIndex(matrixCoefficients2) : null,
6666
- transferCharacteristics: transferCharacteristics2 ? getTransferCharacteristicsFromIndex(transferCharacteristics2) : null,
6780
+ matrix: matrixCoefficients2 ? getMatrixCoefficientsFromIndex(matrixCoefficients2) : null,
6781
+ transfer: transferCharacteristics2 ? getTransferCharacteristicsFromIndex(transferCharacteristics2) : null,
6667
6782
  primaries: colorPrimaries ? getPrimariesFromIndex(colorPrimaries) : null,
6668
6783
  fullRange: sps.vui_parameters?.video_full_range_flag ?? null
6669
6784
  };
@@ -6942,6 +7057,8 @@ var handleAvcPacket = async ({
6942
7057
  trackId: programId,
6943
7058
  newOffset: startOffset
6944
7059
  });
7060
+ const codecPrivate2 = createSpsPpsData(spsAndPps);
7061
+ const advancedColor = getVideoColorFromSps(spsAndPps.sps.spsData);
6945
7062
  const track = {
6946
7063
  m3uStreamFormat: null,
6947
7064
  rotation: 0,
@@ -6949,7 +7066,7 @@ var handleAvcPacket = async ({
6949
7066
  type: "video",
6950
7067
  timescale: MPEG_TIMESCALE,
6951
7068
  codec: getCodecStringFromSpsAndPps(spsAndPps.sps),
6952
- codecPrivate: createSpsPpsData(spsAndPps),
7069
+ codecData: { type: "avc-sps-pps", data: codecPrivate2 },
6953
7070
  fps: null,
6954
7071
  codedWidth: dimensions.width,
6955
7072
  codedHeight: dimensions.height,
@@ -6957,14 +7074,14 @@ var handleAvcPacket = async ({
6957
7074
  width: dimensions.width,
6958
7075
  displayAspectWidth: dimensions.width,
6959
7076
  displayAspectHeight: dimensions.height,
6960
- trakBox: null,
6961
- codecWithoutConfig: "h264",
7077
+ codecEnum: "h264",
6962
7078
  description: undefined,
6963
7079
  sampleAspectRatio: {
6964
7080
  denominator: sampleAspectRatio.height,
6965
7081
  numerator: sampleAspectRatio.width
6966
7082
  },
6967
- color: getVideoColorFromSps(spsAndPps.sps.spsData)
7083
+ colorSpace: mediaParserAdvancedColorToWebCodecsColor(advancedColor),
7084
+ advancedColor
6968
7085
  };
6969
7086
  await registerVideoTrack({
6970
7087
  track,
@@ -7479,7 +7596,7 @@ var fieldsNeedSamplesMap = {
7479
7596
  name: false,
7480
7597
  rotation: false,
7481
7598
  size: false,
7482
- structure: false,
7599
+ slowStructure: false,
7483
7600
  tracks: false,
7484
7601
  unrotatedDimensions: false,
7485
7602
  videoCodec: false,
@@ -7682,49 +7799,46 @@ var turnSeekIntoByte = async ({
7682
7799
  type: "valid-but-must-wait"
7683
7800
  };
7684
7801
  }
7685
- if (seek2.type === "keyframe-before-time") {
7686
- if (seek2.timeInSeconds < 0) {
7687
- throw new Error(`Cannot seek to a negative time: ${JSON.stringify(seek2)}`);
7688
- }
7689
- const seekingHints = getSeekingHints({
7690
- riffState,
7691
- samplesObserved,
7692
- structureState,
7693
- mediaSectionState: mediaSectionState2,
7694
- isoState,
7695
- transportStream,
7696
- tracksState,
7697
- keyframesState: keyframes,
7698
- webmState,
7699
- flacState,
7700
- mp3State,
7701
- contentLength,
7702
- aacState,
7703
- m3uPlaylistContext
7704
- });
7705
- if (!seekingHints) {
7706
- Log.trace(logLevel, "No seeking info, cannot seek yet");
7707
- return {
7708
- type: "valid-but-must-wait"
7709
- };
7710
- }
7711
- const seekingByte = await getSeekingByte({
7712
- info: seekingHints,
7713
- time: seek2.timeInSeconds,
7714
- logLevel,
7715
- currentPosition: iterator.counter.getOffset(),
7716
- isoState,
7717
- transportStream,
7718
- webmState,
7719
- mediaSection: mediaSectionState2,
7720
- m3uPlaylistContext,
7721
- structure: structureState,
7722
- riffState,
7723
- m3uState
7724
- });
7725
- return seekingByte;
7802
+ if (seek2 < 0) {
7803
+ throw new Error(`Cannot seek to a negative time: ${JSON.stringify(seek2)}`);
7726
7804
  }
7727
- throw new Error(`Cannot process seek request for ${seek2}: ${JSON.stringify(seek2)}`);
7805
+ const seekingHints = getSeekingHints({
7806
+ riffState,
7807
+ samplesObserved,
7808
+ structureState,
7809
+ mediaSectionState: mediaSectionState2,
7810
+ isoState,
7811
+ transportStream,
7812
+ tracksState,
7813
+ keyframesState: keyframes,
7814
+ webmState,
7815
+ flacState,
7816
+ mp3State,
7817
+ contentLength,
7818
+ aacState,
7819
+ m3uPlaylistContext
7820
+ });
7821
+ if (!seekingHints) {
7822
+ Log.trace(logLevel, "No seeking info, cannot seek yet");
7823
+ return {
7824
+ type: "valid-but-must-wait"
7825
+ };
7826
+ }
7827
+ const seekingByte = await getSeekingByte({
7828
+ info: seekingHints,
7829
+ time: seek2,
7830
+ logLevel,
7831
+ currentPosition: iterator.counter.getOffset(),
7832
+ isoState,
7833
+ transportStream,
7834
+ webmState,
7835
+ mediaSection: mediaSectionState2,
7836
+ m3uPlaylistContext,
7837
+ structure: structureState,
7838
+ riffState,
7839
+ m3uState
7840
+ });
7841
+ return seekingByte;
7728
7842
  };
7729
7843
  var getWorkOnSeekRequestOptions = (state) => {
7730
7844
  return {
@@ -7786,7 +7900,7 @@ var workOnSeekRequest = async (options) => {
7786
7900
  m3uState
7787
7901
  } = options;
7788
7902
  const seek2 = controller._internals.seekSignal.getSeek();
7789
- if (!seek2) {
7903
+ if (seek2 === null) {
7790
7904
  return;
7791
7905
  }
7792
7906
  Log.trace(logLevel, `Has seek request for ${src}: ${JSON.stringify(seek2)}`);
@@ -7879,13 +7993,13 @@ var emitAvailableInfo = async ({
7879
7993
  } = state;
7880
7994
  for (const key of keys) {
7881
7995
  await workOnSeekRequest(getWorkOnSeekRequestOptions(state));
7882
- if (key === "structure") {
7883
- if (hasInfo.structure && !emittedFields.structure) {
7884
- await callbackFunctions.onStructure?.(state.structure.getStructure());
7885
- if (fieldsInReturnValue.structure) {
7886
- returnValue.structure = state.structure.getStructure();
7996
+ if (key === "slowStructure") {
7997
+ if (hasInfo.slowStructure && !emittedFields.slowStructure) {
7998
+ await callbackFunctions.onSlowStructure?.(state.structure.getStructure());
7999
+ if (fieldsInReturnValue.slowStructure) {
8000
+ returnValue.slowStructure = state.structure.getStructure();
7887
8001
  }
7888
- emittedFields.structure = true;
8002
+ emittedFields.slowStructure = true;
7889
8003
  }
7890
8004
  continue;
7891
8005
  }
@@ -8013,10 +8127,10 @@ var emitAvailableInfo = async ({
8013
8127
  }
8014
8128
  if (key === "tracks") {
8015
8129
  if (!emittedFields.tracks && hasInfo.tracks) {
8016
- const { videoTracks, audioTracks } = getTracks(state, true);
8017
- await callbackFunctions.onTracks?.({ videoTracks, audioTracks });
8130
+ const tracks2 = getTracks(state, true);
8131
+ await callbackFunctions.onTracks?.(tracks2);
8018
8132
  if (fieldsInReturnValue.tracks) {
8019
- returnValue.tracks = { videoTracks, audioTracks };
8133
+ returnValue.tracks = tracks2;
8020
8134
  }
8021
8135
  emittedFields.tracks = true;
8022
8136
  }
@@ -8217,12 +8331,29 @@ var getHasCallbacks = (state) => {
8217
8331
  const hasAllTracksAndNoCallbacks = !state.callbacks.tracks.hasAllTracks() || Object.values(state.callbacks.videoSampleCallbacks).length > 0 || Object.values(state.callbacks.audioSampleCallbacks).length > 0;
8218
8332
  return hasAllTracksAndNoCallbacks;
8219
8333
  };
8334
+ var missesMatroskaTracks = (state) => {
8335
+ const struct = state.structure.getStructureOrNull();
8336
+ if (struct === null) {
8337
+ return false;
8338
+ }
8339
+ if (struct.type !== "matroska") {
8340
+ return false;
8341
+ }
8342
+ const mainSegment = getMainSegment(struct.boxes);
8343
+ if (mainSegment === null) {
8344
+ return false;
8345
+ }
8346
+ return getTracksFromMatroska({
8347
+ structureState: state.structure,
8348
+ webmState: state.webm
8349
+ }).missingInfo.length > 0;
8350
+ };
8220
8351
  var maySkipVideoData = ({ state }) => {
8221
8352
  const hasCallbacks = getHasCallbacks(state);
8222
8353
  return !hasCallbacks && !needsToIterateOverSamples({
8223
8354
  emittedFields: state.emittedFields,
8224
8355
  fields: state.fields
8225
- });
8356
+ }) && !missesMatroskaTracks(state);
8226
8357
  };
8227
8358
  var maySkipOverSamplesInTheMiddle = ({
8228
8359
  state
@@ -8242,7 +8373,7 @@ var getAvailableInfo = ({
8242
8373
  const structure = state.structure.getStructureOrNull();
8243
8374
  const infos = keys.map(([_key]) => {
8244
8375
  const key = _key;
8245
- if (key === "structure") {
8376
+ if (key === "slowStructure") {
8246
8377
  return false;
8247
8378
  }
8248
8379
  if (key === "durationInSeconds") {
@@ -8441,14 +8572,13 @@ var parseAac = async (state) => {
8441
8572
  container: "aac",
8442
8573
  track: {
8443
8574
  codec: mapAudioObjectTypeToCodecString(audioObjectType),
8444
- codecWithoutConfig: "aac",
8445
- codecPrivate: codecPrivate2,
8575
+ codecEnum: "aac",
8576
+ codecData: { type: "aac-config", data: codecPrivate2 },
8446
8577
  description: codecPrivate2,
8447
8578
  numberOfChannels: channelConfiguration,
8448
8579
  sampleRate,
8449
8580
  timescale: 1e6,
8450
8581
  trackId: 0,
8451
- trakBox: null,
8452
8582
  type: "audio"
8453
8583
  },
8454
8584
  registerAudioSampleCallback: state.callbacks.registerAudioSampleCallback,
@@ -8845,13 +8975,12 @@ var parseStreamInfo = async ({
8845
8975
  codec: "flac",
8846
8976
  type: "audio",
8847
8977
  description: asUint8Array,
8848
- codecPrivate: asUint8Array,
8849
- codecWithoutConfig: "flac",
8978
+ codecData: { type: "flac-description", data: asUint8Array },
8979
+ codecEnum: "flac",
8850
8980
  numberOfChannels: channels2,
8851
8981
  sampleRate,
8852
8982
  timescale: 1e6,
8853
- trackId: 0,
8854
- trakBox: null
8983
+ trackId: 0
8855
8984
  },
8856
8985
  registerAudioSampleCallback: state.callbacks.registerAudioSampleCallback,
8857
8986
  tracks: state.callbacks.tracks,
@@ -8933,11 +9062,6 @@ var calculateFlatSamples = ({
8933
9062
  mediaSectionStart
8934
9063
  }) => {
8935
9064
  const tracks2 = getTracks(state, true);
8936
- const allTracks = [
8937
- ...tracks2.videoTracks,
8938
- ...tracks2.audioTracks,
8939
- ...tracks2.otherTracks
8940
- ];
8941
9065
  const moofBoxes = getMoofBoxes(state.structure.getIsoStructure().boxes);
8942
9066
  const tfraBoxes = deduplicateTfraBoxesByOffset([
8943
9067
  ...state.iso.tfra.getTfraBoxes(),
@@ -8948,9 +9072,22 @@ var calculateFlatSamples = ({
8948
9072
  if (moofBoxes.length > 0 && !relevantMoofBox) {
8949
9073
  throw new Error("No relevant moof box found");
8950
9074
  }
8951
- const flatSamples = allTracks.map((track) => {
9075
+ const moov = getMoovBoxFromState({
9076
+ structureState: state.structure,
9077
+ isoState: state.iso,
9078
+ mp4HeaderSegment: state.m3uPlaylistContext?.mp4HeaderSegment ?? null,
9079
+ mayUsePrecomputed: true
9080
+ });
9081
+ if (!moov) {
9082
+ throw new Error("No moov box found");
9083
+ }
9084
+ const flatSamples = tracks2.map((track) => {
9085
+ const trakBox = getTrakBoxByTrackId(moov, track.trackId);
9086
+ if (!trakBox) {
9087
+ throw new Error("No trak box found");
9088
+ }
8952
9089
  const { samplePositions } = getSamplePositionsFromTrack({
8953
- trakBox: track.trakBox,
9090
+ trakBox,
8954
9091
  moofBoxes: relevantMoofBox ? [relevantMoofBox] : [],
8955
9092
  moofComplete
8956
9093
  });
@@ -9018,7 +9155,7 @@ var needsTracksForField = ({
9018
9155
  }
9019
9156
  return true;
9020
9157
  }
9021
- if (field === "audioCodec" || field === "durationInSeconds" || field === "slowDurationInSeconds" || field === "slowFps" || field === "fps" || field === "isHdr" || field === "rotation" || field === "structure" || field === "tracks" || field === "unrotatedDimensions" || field === "videoCodec" || field === "metadata" || field === "location" || field === "slowKeyframes" || field === "slowNumberOfFrames" || field === "keyframes" || field === "images" || field === "sampleRate" || field === "numberOfAudioChannels" || field === "slowAudioBitrate" || field === "slowVideoBitrate" || field === "m3uStreams") {
9158
+ if (field === "audioCodec" || field === "durationInSeconds" || field === "slowDurationInSeconds" || field === "slowFps" || field === "fps" || field === "isHdr" || field === "rotation" || field === "slowStructure" || field === "tracks" || field === "unrotatedDimensions" || field === "videoCodec" || field === "metadata" || field === "location" || field === "slowKeyframes" || field === "slowNumberOfFrames" || field === "keyframes" || field === "images" || field === "sampleRate" || field === "numberOfAudioChannels" || field === "slowAudioBitrate" || field === "slowVideoBitrate" || field === "m3uStreams") {
9022
9159
  return true;
9023
9160
  }
9024
9161
  if (field === "container" || field === "internalStats" || field === "mimeType" || field === "name" || field === "size") {
@@ -11129,7 +11266,7 @@ var getMoovAtom = async ({
11129
11266
  const boxes = [];
11130
11267
  const canSkipTracksState = makeCanSkipTracksState({
11131
11268
  hasAudioTrackHandlers: false,
11132
- fields: { structure: true },
11269
+ fields: { slowStructure: true },
11133
11270
  hasVideoTrackHandlers: false,
11134
11271
  structure: structureState()
11135
11272
  });
@@ -11504,10 +11641,10 @@ var parseStreamInf = (str) => {
11504
11641
  }
11505
11642
  return {
11506
11643
  type: "m3u-stream-info",
11507
- averageBandwidth: map["AVERAGE-BANDWIDTH"] ? parseInt(map["AVERAGE-BANDWIDTH"], 10) : null,
11508
- bandwidth: map.BANDWIDTH ? parseInt(map.BANDWIDTH, 10) : null,
11644
+ averageBandwidthInBitsPerSec: map["AVERAGE-BANDWIDTH"] ? parseInt(map["AVERAGE-BANDWIDTH"], 10) : null,
11645
+ bandwidthInBitsPerSec: map.BANDWIDTH ? parseInt(map.BANDWIDTH, 10) : null,
11509
11646
  codecs: map.CODECS ? map.CODECS.split(",") : null,
11510
- resolution: map.RESOLUTION ? {
11647
+ dimensions: map.RESOLUTION ? {
11511
11648
  width: parseInt(map.RESOLUTION.split("x")[0], 10),
11512
11649
  height: parseInt(map.RESOLUTION.split("x")[1], 10)
11513
11650
  } : null,
@@ -11722,7 +11859,7 @@ var afterManifestFetch = async ({
11722
11859
  throw new Error("No streams found");
11723
11860
  }
11724
11861
  const selectedPlaylist = await selectStream({ streams, fn: selectM3uStreamFn });
11725
- if (!selectedPlaylist.resolution) {
11862
+ if (!selectedPlaylist.dimensions) {
11726
11863
  throw new Error("Stream does not have a resolution");
11727
11864
  }
11728
11865
  m3uState.setSelectedMainPlaylist({
@@ -11855,7 +11992,7 @@ var parseMedia = (options) => {
11855
11992
  onSlowKeyframes: options.onSlowKeyframes ?? null,
11856
11993
  onSlowNumberOfFrames: options.onSlowNumberOfFrames ?? null,
11857
11994
  onSlowVideoBitrate: options.onSlowVideoBitrate ?? null,
11858
- onStructure: options.onStructure ?? null,
11995
+ onSlowStructure: options.onSlowStructure ?? null,
11859
11996
  onM3uStreams: options.onM3uStreams ?? null,
11860
11997
  onTracks: options.onTracks ?? null,
11861
11998
  onUnrotatedDimensions: options.onUnrotatedDimensions ?? null,
@@ -11897,16 +12034,10 @@ var considerSeekBasedOnChunk = async ({
11897
12034
  const timestamp = Math.min(sample.dts / sample.timescale, sample.cts / sample.timescale);
11898
12035
  if (timestamp > pendingSeek.targetTime && chunkIndex !== null && chunkIndex > 0) {
11899
12036
  m3uState.setNextSeekShouldSubtractChunks(playlistUrl, subtractChunks + 1);
11900
- parentController.seek({
11901
- type: "keyframe-before-time",
11902
- timeInSeconds: pendingSeek.targetTime
11903
- });
12037
+ parentController.seek(pendingSeek.targetTime);
11904
12038
  return;
11905
12039
  }
11906
- childController.seek({
11907
- type: "keyframe-before-time",
11908
- timeInSeconds: pendingSeek.targetTime
11909
- });
12040
+ childController.seek(pendingSeek.targetTime);
11910
12041
  m3uState.setNextSeekShouldSubtractChunks(playlistUrl, 0);
11911
12042
  m3uState.setSeekToSecondsToProcess(playlistUrl, null);
11912
12043
  };
@@ -12084,7 +12215,7 @@ var processM3uChunk = ({
12084
12215
  childController.pause();
12085
12216
  currentPromise.resolver(makeContinuationFn());
12086
12217
  },
12087
- fields: chunk.isHeader ? { structure: true } : undefined,
12218
+ fields: chunk.isHeader ? { slowStructure: true } : undefined,
12088
12219
  onTracks: () => {
12089
12220
  if (!state.m3u.hasEmittedDoneWithTracks(playlistUrl)) {
12090
12221
  state.m3u.setHasEmittedDoneWithTracks(playlistUrl);
@@ -12182,10 +12313,10 @@ var processM3uChunk = ({
12182
12313
  }
12183
12314
  });
12184
12315
  if (chunk.isHeader) {
12185
- if (data.structure.type !== "iso-base-media") {
12316
+ if (data.slowStructure.type !== "iso-base-media") {
12186
12317
  throw new Error("Expected an mp4 file");
12187
12318
  }
12188
- state.m3u.setMp4HeaderSegment(playlistUrl, data.structure);
12319
+ state.m3u.setMp4HeaderSegment(playlistUrl, data.slowStructure);
12189
12320
  }
12190
12321
  } catch (e) {
12191
12322
  currentPromise.rejector(e);
@@ -12759,14 +12890,13 @@ var parseMpegHeader = async ({
12759
12890
  track: {
12760
12891
  type: "audio",
12761
12892
  codec: "mp3",
12762
- codecPrivate: null,
12763
- codecWithoutConfig: "mp3",
12893
+ codecData: null,
12894
+ codecEnum: "mp3",
12764
12895
  description: undefined,
12765
12896
  numberOfChannels,
12766
12897
  sampleRate,
12767
12898
  timescale: 1e6,
12768
- trackId: 0,
12769
- trakBox: null
12899
+ trackId: 0
12770
12900
  },
12771
12901
  registerAudioSampleCallback: state.callbacks.registerAudioSampleCallback,
12772
12902
  tracks: state.callbacks.tracks,
@@ -13352,7 +13482,7 @@ var parseMediaSection = async (state) => {
13352
13482
  state
13353
13483
  });
13354
13484
  const tracks2 = getTracks(state, false);
13355
- if (!tracks2.videoTracks.some((t) => t.codec === TO_BE_OVERRIDDEN_LATER) && !state.callbacks.tracks.getIsDone()) {
13485
+ if (!tracks2.some((t) => t.type === "video" && t.codec === TO_BE_OVERRIDDEN_LATER) && !state.callbacks.tracks.getIsDone()) {
13356
13486
  state.callbacks.tracks.setIsDone(state.logLevel);
13357
13487
  }
13358
13488
  };
@@ -13732,13 +13862,12 @@ var handleAacPacket = async ({
13732
13862
  });
13733
13863
  const track = {
13734
13864
  type: "audio",
13735
- codecPrivate: codecPrivate2,
13865
+ codecData: { type: "aac-config", data: codecPrivate2 },
13736
13866
  trackId: programId,
13737
- trakBox: null,
13738
13867
  timescale: MPEG_TIMESCALE,
13739
- codecWithoutConfig: "aac",
13868
+ codecEnum: "aac",
13740
13869
  codec: mapAudioObjectTypeToCodecString(audioObjectType),
13741
- description: undefined,
13870
+ description: codecPrivate2,
13742
13871
  numberOfChannels: channelConfiguration,
13743
13872
  sampleRate
13744
13873
  };
@@ -14241,14 +14370,13 @@ var parseFmt = async ({
14241
14370
  track: {
14242
14371
  type: "audio",
14243
14372
  codec: format,
14244
- codecPrivate: null,
14373
+ codecData: null,
14245
14374
  description: undefined,
14246
- codecWithoutConfig: format,
14375
+ codecEnum: format,
14247
14376
  numberOfChannels,
14248
14377
  sampleRate,
14249
14378
  timescale: 1e6,
14250
- trackId: 0,
14251
- trakBox: null
14379
+ trackId: 0
14252
14380
  },
14253
14381
  container: "wav",
14254
14382
  registerAudioSampleCallback: state.callbacks.registerAudioSampleCallback,
@@ -14851,7 +14979,7 @@ var expectSegment = async ({
14851
14979
  }
14852
14980
  statesForProcessing.webmState.addCluster({
14853
14981
  start: offset,
14854
- size,
14982
+ size: size + (offsetAfterVInt - offset),
14855
14983
  segment: isInsideSegment.index
14856
14984
  });
14857
14985
  const newSegment = {
@@ -14941,6 +15069,9 @@ var parseWebm = async (state) => {
14941
15069
  return null;
14942
15070
  }
14943
15071
  if (isInsideCluster) {
15072
+ if (maySkipVideoData({ state })) {
15073
+ return makeSkip(Math.min(state.contentLength, isInsideCluster.size + isInsideCluster.start));
15074
+ }
14944
15075
  const segments = structure.boxes.filter((box) => box.type === "Segment");
14945
15076
  const segment = segments[isInsideCluster.segment];
14946
15077
  if (!segment) {
@@ -14985,7 +15116,7 @@ var initVideo = async ({ state }) => {
14985
15116
  throw new Error("No moov box found");
14986
15117
  }
14987
15118
  const tracks2 = getTracksFromMoovBox(moovAtom);
14988
- for (const track of tracks2.videoTracks) {
15119
+ for (const track of tracks2.filter((t) => t.type === "video")) {
14989
15120
  await registerVideoTrack({
14990
15121
  track,
14991
15122
  container: "mp4",
@@ -14995,7 +15126,7 @@ var initVideo = async ({ state }) => {
14995
15126
  tracks: state.callbacks.tracks
14996
15127
  });
14997
15128
  }
14998
- for (const track of tracks2.audioTracks) {
15129
+ for (const track of tracks2.filter((t) => t.type === "audio")) {
14999
15130
  await registerAudioTrack({
15000
15131
  track,
15001
15132
  container: "mp4",
@@ -15083,14 +15214,6 @@ var initVideo = async ({ state }) => {
15083
15214
  });
15084
15215
  return;
15085
15216
  }
15086
- if (fileType.type === "gif") {
15087
- return Promise.reject(new IsAGifError({
15088
- message: "GIF files are not yet supported",
15089
- mimeType,
15090
- sizeInBytes: contentLength,
15091
- fileName: name
15092
- }));
15093
- }
15094
15217
  if (fileType.type === "pdf") {
15095
15218
  return Promise.reject(new IsAPdfError({
15096
15219
  message: "GIF files are not supported",
@@ -15099,7 +15222,7 @@ var initVideo = async ({ state }) => {
15099
15222
  fileName: name
15100
15223
  }));
15101
15224
  }
15102
- if (fileType.type === "bmp" || fileType.type === "jpeg" || fileType.type === "png" || fileType.type === "webp") {
15225
+ if (fileType.type === "bmp" || fileType.type === "jpeg" || fileType.type === "png" || fileType.type === "webp" || fileType.type === "gif") {
15103
15226
  return Promise.reject(new IsAnImageError({
15104
15227
  message: "Image files are not supported",
15105
15228
  imageType: fileType.type,
@@ -15272,10 +15395,10 @@ var parseLoop = async ({
15272
15395
  }
15273
15396
  }
15274
15397
  state.samplesObserved.setLastSampleObserved();
15275
- if (state.controller._internals.seekSignal.getSeek()) {
15398
+ if (state.controller._internals.seekSignal.getSeek() !== null) {
15276
15399
  Log.verbose(state.logLevel, "Reached end of samples, but there is a pending seek. Trying to seek...");
15277
15400
  await workOnSeekRequest(getWorkOnSeekRequestOptions(state));
15278
- if (state.controller._internals.seekSignal.getSeek()) {
15401
+ if (state.controller._internals.seekSignal.getSeek() !== null) {
15279
15402
  throw new Error("Reached the end of the file even though a seek was requested. This is likely a bug in the parser. You can report this at https://remotion.dev/report and we will fix it as soon as possible.");
15280
15403
  }
15281
15404
  await parseLoop({
@@ -15375,7 +15498,7 @@ var getFieldsFromCallback = ({
15375
15498
  name: Boolean(callbacks.onName),
15376
15499
  rotation: Boolean(callbacks.onRotation),
15377
15500
  size: Boolean(callbacks.onSize),
15378
- structure: Boolean(callbacks.onStructure),
15501
+ slowStructure: Boolean(callbacks.onSlowStructure),
15379
15502
  tracks: Boolean(callbacks.onTracks),
15380
15503
  unrotatedDimensions: Boolean(callbacks.onUnrotatedDimensions),
15381
15504
  videoCodec: Boolean(callbacks.onVideoCodec),
@@ -15458,7 +15581,7 @@ var emittedState = () => {
15458
15581
  name: false,
15459
15582
  rotation: false,
15460
15583
  size: false,
15461
- structure: false,
15584
+ slowStructure: false,
15462
15585
  tracks: false,
15463
15586
  videoCodec: false,
15464
15587
  unrotatedDimensions: false,
@@ -16211,7 +16334,7 @@ var webmState = ({
16211
16334
  },
16212
16335
  isInsideCluster: (offset) => {
16213
16336
  for (const cluster of clusters) {
16214
- if (offset >= cluster.start && offset <= cluster.start + cluster.size) {
16337
+ if (offset >= cluster.start && offset < cluster.start + cluster.size) {
16215
16338
  return cluster;
16216
16339
  }
16217
16340
  }
@@ -16510,7 +16633,7 @@ var callbacksState = ({
16510
16633
  const callback = audioSampleCallbacks[trackId];
16511
16634
  if (audioSample.data.length > 0) {
16512
16635
  if (callback) {
16513
- if (seekSignal.getSeek()) {
16636
+ if (seekSignal.getSeek() !== null) {
16514
16637
  Log.trace(logLevel, "Not emitting sample because seek is processing");
16515
16638
  } else {
16516
16639
  await callback(audioSample);
@@ -16528,7 +16651,7 @@ var callbacksState = ({
16528
16651
  if (videoSample.data.length > 0) {
16529
16652
  const callback = videoSampleCallbacks[trackId];
16530
16653
  if (callback) {
16531
- if (seekSignal.getSeek()) {
16654
+ if (seekSignal.getSeek() !== null) {
16532
16655
  Log.trace(logLevel, "Not emitting sample because seek is processing");
16533
16656
  } else {
16534
16657
  await callback(videoSample);
@@ -17069,7 +17192,7 @@ var internalParseMedia = async function({
17069
17192
  if (state.errored) {
17070
17193
  throw state.errored;
17071
17194
  }
17072
- if (state.controller._internals.seekSignal.getSeek()) {
17195
+ if (state.controller._internals.seekSignal.getSeek() !== null) {
17073
17196
  throw new Error("Should not finish while a seek is pending");
17074
17197
  }
17075
17198
  return state.returnValue;
@@ -17120,17 +17243,6 @@ var serializeError = ({
17120
17243
  logLevel,
17121
17244
  seekingHints
17122
17245
  }) => {
17123
- if (error instanceof IsAGifError) {
17124
- return {
17125
- type: "response-error",
17126
- errorName: "IsAGifError",
17127
- errorMessage: error.message,
17128
- errorStack: error.stack ?? "",
17129
- mimeType: error.mimeType,
17130
- sizeInBytes: error.sizeInBytes,
17131
- fileName: error.fileName
17132
- };
17133
- }
17134
17246
  if (error instanceof IsAnImageError) {
17135
17247
  return {
17136
17248
  type: "response-error",
@@ -17255,7 +17367,7 @@ var startParsing = async (message, reader) => {
17255
17367
  postSlowFps,
17256
17368
  postSlowDurationInSeconds,
17257
17369
  postSlowVideoBitrate,
17258
- postStructure,
17370
+ postSlowStructure,
17259
17371
  postTracks,
17260
17372
  postUnrotatedDimensions,
17261
17373
  postVideoCodec,
@@ -17418,9 +17530,9 @@ var startParsing = async (message, reader) => {
17418
17530
  value: videoBitrate
17419
17531
  });
17420
17532
  } : null,
17421
- onStructure: postStructure ? async (structure) => {
17533
+ onSlowStructure: postSlowStructure ? async (structure) => {
17422
17534
  await executeCallback({
17423
- callbackType: "structure",
17535
+ callbackType: "slow-structure",
17424
17536
  value: structure
17425
17537
  });
17426
17538
  } : null,
@@ -17489,7 +17601,7 @@ var startParsing = async (message, reader) => {
17489
17601
  }
17490
17602
  return async (sample) => {
17491
17603
  await executeCallback({
17492
- callbackType: "on-audio-video-sample",
17604
+ callbackType: "on-audio-sample",
17493
17605
  value: sample,
17494
17606
  trackId: params.track.trackId
17495
17607
  });
@@ -17508,7 +17620,7 @@ var startParsing = async (message, reader) => {
17508
17620
  }
17509
17621
  return async (sample) => {
17510
17622
  await executeCallback({
17511
- callbackType: "on-audio-video-sample",
17623
+ callbackType: "on-video-sample",
17512
17624
  value: sample,
17513
17625
  trackId: params.track.trackId
17514
17626
  });