@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;
@@ -631,7 +609,7 @@ var performedSeeksStats = () => {
631
609
 
632
610
  // src/controller/seek-signal.ts
633
611
  var makeSeekSignal = (emitter) => {
634
- let seek;
612
+ let seek = null;
635
613
  return {
636
614
  seek: (seekRequest) => {
637
615
  seek = seekRequest;
@@ -642,7 +620,7 @@ var makeSeekSignal = (emitter) => {
642
620
  },
643
621
  clearSeekIfStillSame(previousSeek) {
644
622
  if (seek === previousSeek) {
645
- seek = undefined;
623
+ seek = null;
646
624
  return { hasChanged: false };
647
625
  }
648
626
  return { hasChanged: true };
@@ -746,10 +724,10 @@ var getM3uStreams = ({
746
724
  }
747
725
  boxes.push({
748
726
  src: readerInterface.createAdjacentFileSource(next.value, originalSrc),
749
- averageBandwidth: str.averageBandwidth,
750
- bandwidth: str.bandwidth,
727
+ averageBandwidthInBitsPerSec: str.averageBandwidthInBitsPerSec,
728
+ bandwidthInBitsPerSec: str.bandwidthInBitsPerSec,
751
729
  codecs: str.codecs,
752
- resolution: str.resolution,
730
+ dimensions: str.dimensions,
753
731
  associatedPlaylists
754
732
  });
755
733
  }
@@ -758,11 +736,11 @@ var getM3uStreams = ({
758
736
  return null;
759
737
  }
760
738
  const sorted = boxes.slice().sort((a, b) => {
761
- const aResolution = a.resolution ? a.resolution.width * a.resolution.height : 0;
762
- const bResolution = b.resolution ? b.resolution.width * b.resolution.height : 0;
739
+ const aResolution = a.dimensions ? a.dimensions.width * a.dimensions.height : 0;
740
+ const bResolution = b.dimensions ? b.dimensions.width * b.dimensions.height : 0;
763
741
  if (aResolution === bResolution) {
764
- const bandwidthA = a.averageBandwidth ?? a.bandwidth ?? 0;
765
- const bandwidthB = b.averageBandwidth ?? b.bandwidth ?? 0;
742
+ const bandwidthA = a.averageBandwidthInBitsPerSec ?? a.bandwidthInBitsPerSec ?? 0;
743
+ const bandwidthB = b.averageBandwidthInBitsPerSec ?? b.bandwidthInBitsPerSec ?? 0;
766
744
  return bandwidthB - bandwidthA;
767
745
  }
768
746
  return bResolution - aResolution;
@@ -982,6 +960,16 @@ var getTfraBoxes = (structure) => {
982
960
  }
983
961
  return getTfraBoxesFromMfraBoxChildren(mfraBox.children);
984
962
  };
963
+ var getTrakBoxByTrackId = (moovBox, trackId) => {
964
+ const trakBoxes = getTraks(moovBox);
965
+ return trakBoxes.find((t) => {
966
+ const tkhd = getTkhdBox(t);
967
+ if (!tkhd) {
968
+ return false;
969
+ }
970
+ return tkhd.trackId === trackId;
971
+ }) ?? null;
972
+ };
985
973
 
986
974
  // src/containers/riff/traversal.ts
987
975
  var isRiffAvi = (structure) => {
@@ -1311,13 +1299,61 @@ var getDisplayAspectRatio = ({
1311
1299
 
1312
1300
  // src/containers/avc/color.ts
1313
1301
  var getMatrixCoefficientsFromIndex = (index) => {
1314
- return index === 1 ? "bt709" : index === 5 ? "bt470bg" : index === 6 ? "smpte170m" : index === 9 ? "bt2020" : null;
1302
+ if (index === 0) {
1303
+ return "rgb";
1304
+ }
1305
+ if (index === 1) {
1306
+ return "bt709";
1307
+ }
1308
+ if (index === 5) {
1309
+ return "bt470bg";
1310
+ }
1311
+ if (index === 6) {
1312
+ return "smpte170m";
1313
+ }
1314
+ if (index === 9) {
1315
+ return "bt2020-ncl";
1316
+ }
1317
+ return null;
1315
1318
  };
1316
1319
  var getTransferCharacteristicsFromIndex = (index) => {
1317
- return index === 1 ? "bt709" : index === 6 ? "smpte170m" : index === 13 ? "iec61966-2-1" : index === 18 ? "arib-std-b67" : null;
1320
+ if (index === 1) {
1321
+ return "bt709";
1322
+ }
1323
+ if (index === 6) {
1324
+ return "smpte170m";
1325
+ }
1326
+ if (index === 8) {
1327
+ return "linear";
1328
+ }
1329
+ if (index === 13) {
1330
+ return "iec61966-2-1";
1331
+ }
1332
+ if (index === 16) {
1333
+ return "pq";
1334
+ }
1335
+ if (index === 18) {
1336
+ return "hlg";
1337
+ }
1338
+ return null;
1318
1339
  };
1319
1340
  var getPrimariesFromIndex = (index) => {
1320
- return index === 1 ? "bt709" : index === 5 ? "bt470bg" : index === 6 ? "smpte170m" : index === 9 ? "bt2020" : null;
1341
+ if (index === 1) {
1342
+ return "bt709";
1343
+ }
1344
+ if (index === 5) {
1345
+ return "bt470bg";
1346
+ }
1347
+ if (index === 6) {
1348
+ return "smpte170m";
1349
+ }
1350
+ if (index === 9) {
1351
+ return "bt2020";
1352
+ }
1353
+ if (index === 12) {
1354
+ return "smpte432";
1355
+ }
1356
+ return null;
1321
1357
  };
1322
1358
 
1323
1359
  // src/containers/webm/segments/all-segments.ts
@@ -2061,10 +2097,6 @@ var isMp3 = (data) => {
2061
2097
  const subarray = data.subarray(0, 4);
2062
2098
  return matchesPattern(mpegPattern)(subarray) || matchesPattern(mpegPattern2)(subarray) || matchesPattern(id3v4Pattern)(subarray) || matchesPattern(id3v3Pattern)(subarray) || matchesPattern(id3v2Pattern)(subarray);
2063
2099
  };
2064
- var isGif = (data) => {
2065
- const gifPattern = new Uint8Array([71, 73, 70, 56]);
2066
- return matchesPattern(gifPattern)(data.subarray(0, 4));
2067
- };
2068
2100
  var isAac = (data) => {
2069
2101
  const aacPattern = new Uint8Array([255, 241]);
2070
2102
  return matchesPattern(aacPattern)(data.subarray(0, 2));
@@ -2097,6 +2129,21 @@ var isBmp = (data) => {
2097
2129
  return null;
2098
2130
  };
2099
2131
 
2132
+ // src/file-types/gif.ts
2133
+ var getGifDimensions = (data) => {
2134
+ const view = new DataView(data.buffer, data.byteOffset);
2135
+ const width = view.getUint16(6, true);
2136
+ const height = view.getUint16(8, true);
2137
+ return { width, height };
2138
+ };
2139
+ var isGif = (data) => {
2140
+ const gifPattern = new Uint8Array([71, 73, 70, 56]);
2141
+ if (matchesPattern(gifPattern)(data.subarray(0, 4))) {
2142
+ return { type: "gif", dimensions: getGifDimensions(data) };
2143
+ }
2144
+ return null;
2145
+ };
2146
+
2100
2147
  // src/file-types/jpeg.ts
2101
2148
  function getJpegDimensions(data) {
2102
2149
  let offset = 0;
@@ -2242,8 +2289,9 @@ var detectFileType = (data) => {
2242
2289
  if (isMp3(data)) {
2243
2290
  return { type: "mp3" };
2244
2291
  }
2245
- if (isGif(data)) {
2246
- return { type: "gif" };
2292
+ const gif = isGif(data);
2293
+ if (gif) {
2294
+ return gif;
2247
2295
  }
2248
2296
  const png = isPng(data);
2249
2297
  if (png) {
@@ -2878,7 +2926,7 @@ var parseAv1PrivateData = (data, colrAtom) => {
2878
2926
  // src/get-video-codec.ts
2879
2927
  var getVideoCodec = (state) => {
2880
2928
  const track = getTracks(state, true);
2881
- return track.videoTracks[0]?.codecWithoutConfig ?? null;
2929
+ return track.find((t) => t.type === "video")?.codecEnum ?? null;
2882
2930
  };
2883
2931
  var hasVideoCodec = (state) => {
2884
2932
  return getHasTracks(state, true);
@@ -2892,13 +2940,13 @@ var getVideoPrivateData = (trakBox) => {
2892
2940
  return null;
2893
2941
  }
2894
2942
  if (avccBox) {
2895
- return avccBox.privateData;
2943
+ return { type: "avc-sps-pps", data: avccBox.privateData };
2896
2944
  }
2897
2945
  if (hvccBox) {
2898
- return hvccBox.privateData;
2946
+ return { type: "hvcc-data", data: hvccBox.privateData };
2899
2947
  }
2900
2948
  if (av1cBox) {
2901
- return av1cBox.privateData;
2949
+ return { type: "av1c-data", data: av1cBox.privateData };
2902
2950
  }
2903
2951
  return null;
2904
2952
  };
@@ -2916,9 +2964,9 @@ var getIsoBmColrConfig = (trakBox) => {
2916
2964
  }
2917
2965
  return {
2918
2966
  fullRange: colrAtom.fullRangeFlag,
2919
- matrixCoefficients: getMatrixCoefficientsFromIndex(colrAtom.matrixIndex),
2967
+ matrix: getMatrixCoefficientsFromIndex(colrAtom.matrixIndex),
2920
2968
  primaries: getPrimariesFromIndex(colrAtom.primaries),
2921
- transferCharacteristics: getTransferCharacteristicsFromIndex(colrAtom.transfer)
2969
+ transfer: getTransferCharacteristicsFromIndex(colrAtom.transfer)
2922
2970
  };
2923
2971
  };
2924
2972
  var getVideoCodecString = (trakBox) => {
@@ -2942,6 +2990,16 @@ var getVideoCodecString = (trakBox) => {
2942
2990
  return videoSample.format;
2943
2991
  };
2944
2992
 
2993
+ // src/containers/iso-base-media/color-to-webcodecs-colors.ts
2994
+ var mediaParserAdvancedColorToWebCodecsColor = (color2) => {
2995
+ return {
2996
+ transfer: color2.transfer,
2997
+ matrix: color2.matrix,
2998
+ primaries: color2.primaries,
2999
+ fullRange: color2.fullRange
3000
+ };
3001
+ };
3002
+
2945
3003
  // src/aac-codecprivate.ts
2946
3004
  var getSampleRateFromSampleFrequencyIndex = (samplingFrequencyIndex) => {
2947
3005
  switch (samplingFrequencyIndex) {
@@ -3101,16 +3159,27 @@ var getActualDecoderParameters = ({
3101
3159
  sampleRate
3102
3160
  }) => {
3103
3161
  if (audioCodec !== "aac") {
3104
- return { numberOfChannels, sampleRate, codecPrivate: codecPrivate2 };
3162
+ return {
3163
+ numberOfChannels,
3164
+ sampleRate,
3165
+ codecPrivate: codecPrivate2
3166
+ };
3105
3167
  }
3106
3168
  if (codecPrivate2 === null) {
3107
3169
  return { numberOfChannels, sampleRate, codecPrivate: codecPrivate2 };
3108
3170
  }
3109
- const parsed = parseAacCodecPrivate(codecPrivate2);
3171
+ if (codecPrivate2.type !== "aac-config") {
3172
+ throw new Error("Expected AAC codec private data");
3173
+ }
3174
+ const parsed = parseAacCodecPrivate(codecPrivate2.data);
3175
+ const actual = createAacCodecPrivate({
3176
+ ...parsed,
3177
+ codecPrivate: codecPrivate2.data
3178
+ });
3110
3179
  return {
3111
3180
  numberOfChannels: parsed.channelConfiguration,
3112
3181
  sampleRate: parsed.sampleRate,
3113
- codecPrivate: createAacCodecPrivate({ ...parsed, codecPrivate: codecPrivate2 })
3182
+ codecPrivate: { type: "aac-config", data: actual }
3114
3183
  };
3115
3184
  };
3116
3185
 
@@ -3180,10 +3249,10 @@ var makeBaseMediaTrack = (trakBox) => {
3180
3249
  }
3181
3250
  const { codecString, description } = getAudioCodecStringFromTrak(trakBox);
3182
3251
  const codecPrivate2 = getCodecPrivateFromTrak(trakBox) ?? description ?? null;
3183
- const codecWithoutConfig = getAudioCodecFromTrack(trakBox);
3252
+ const codecEnum = getAudioCodecFromTrack(trakBox);
3184
3253
  const actual = getActualDecoderParameters({
3185
- audioCodec: codecWithoutConfig,
3186
- codecPrivate: codecPrivate2,
3254
+ audioCodec: codecEnum,
3255
+ codecPrivate: codecPrivate2 ?? null,
3187
3256
  numberOfChannels,
3188
3257
  sampleRate
3189
3258
  });
@@ -3194,10 +3263,9 @@ var makeBaseMediaTrack = (trakBox) => {
3194
3263
  codec: codecString,
3195
3264
  numberOfChannels: actual.numberOfChannels,
3196
3265
  sampleRate: actual.sampleRate,
3197
- description: actual.codecPrivate ?? undefined,
3198
- trakBox,
3199
- codecPrivate: actual.codecPrivate,
3200
- codecWithoutConfig
3266
+ description: actual.codecPrivate?.data ?? undefined,
3267
+ codecData: actual.codecPrivate,
3268
+ codecEnum
3201
3269
  };
3202
3270
  }
3203
3271
  if (!trakBoxContainsVideo(trakBox)) {
@@ -3227,6 +3295,12 @@ var makeBaseMediaTrack = (trakBox) => {
3227
3295
  throw new Error("Could not find video codec");
3228
3296
  }
3229
3297
  const privateData = getVideoPrivateData(trakBox);
3298
+ const advancedColor = getIsoBmColrConfig(trakBox) ?? {
3299
+ fullRange: null,
3300
+ matrix: null,
3301
+ primaries: null,
3302
+ transfer: null
3303
+ };
3230
3304
  const track = {
3231
3305
  m3uStreamFormat: null,
3232
3306
  type: "video",
@@ -3242,15 +3316,10 @@ var makeBaseMediaTrack = (trakBox) => {
3242
3316
  displayAspectWidth,
3243
3317
  displayAspectHeight,
3244
3318
  rotation,
3245
- trakBox,
3246
- codecPrivate: privateData,
3247
- color: getIsoBmColrConfig(trakBox) ?? {
3248
- fullRange: null,
3249
- matrixCoefficients: null,
3250
- primaries: null,
3251
- transferCharacteristics: null
3252
- },
3253
- codecWithoutConfig: getVideoCodecFromIsoTrak(trakBox),
3319
+ codecData: privateData,
3320
+ colorSpace: mediaParserAdvancedColorToWebCodecsColor(advancedColor),
3321
+ advancedColor,
3322
+ codecEnum: getVideoCodecFromIsoTrak(trakBox),
3254
3323
  fps: getFpsFromMp4TrakBox(trakBox)
3255
3324
  };
3256
3325
  return track;
@@ -3321,7 +3390,8 @@ var addAvcProfileToTrack = (track, avc1Profile) => {
3321
3390
  return {
3322
3391
  ...track,
3323
3392
  codec: getCodecStringFromSpsAndPps(avc1Profile.sps),
3324
- codecPrivate: createSpsPpsData(avc1Profile)
3393
+ codecData: { type: "avc-sps-pps", data: createSpsPpsData(avc1Profile) },
3394
+ description: undefined
3325
3395
  };
3326
3396
  };
3327
3397
 
@@ -3347,14 +3417,13 @@ var makeAviAudioTrack = ({
3347
3417
  return {
3348
3418
  type: "audio",
3349
3419
  codec: "mp4a.40.2",
3350
- codecPrivate: new Uint8Array([18, 16]),
3351
- codecWithoutConfig: "aac",
3420
+ codecData: { type: "aac-config", data: new Uint8Array([18, 16]) },
3421
+ codecEnum: "aac",
3352
3422
  description: new Uint8Array([18, 16]),
3353
3423
  numberOfChannels: strf.numberOfChannels,
3354
3424
  sampleRate: strf.sampleRate,
3355
3425
  timescale: MEDIA_PARSER_RIFF_TIMESCALE,
3356
- trackId: index,
3357
- trakBox: null
3426
+ trackId: index
3358
3427
  };
3359
3428
  };
3360
3429
  var makeAviVideoTrack = ({
@@ -3366,9 +3435,9 @@ var makeAviVideoTrack = ({
3366
3435
  throw new Error(`Unsupported video codec ${strh.handler}`);
3367
3436
  }
3368
3437
  return {
3369
- codecPrivate: null,
3438
+ codecData: null,
3370
3439
  codec: TO_BE_OVERRIDDEN_LATER,
3371
- codecWithoutConfig: "h264",
3440
+ codecEnum: "h264",
3372
3441
  codedHeight: strf.height,
3373
3442
  codedWidth: strf.width,
3374
3443
  width: strf.width,
@@ -3379,14 +3448,19 @@ var makeAviVideoTrack = ({
3379
3448
  description: undefined,
3380
3449
  m3uStreamFormat: null,
3381
3450
  trackId: index,
3382
- color: {
3451
+ colorSpace: {
3383
3452
  fullRange: null,
3384
- matrixCoefficients: null,
3453
+ matrix: null,
3385
3454
  primaries: null,
3386
- transferCharacteristics: null
3455
+ transfer: null
3456
+ },
3457
+ advancedColor: {
3458
+ fullRange: null,
3459
+ matrix: null,
3460
+ primaries: null,
3461
+ transfer: null
3387
3462
  },
3388
3463
  displayAspectWidth: strf.width,
3389
- trakBox: null,
3390
3464
  rotation: 0,
3391
3465
  sampleAspectRatio: {
3392
3466
  numerator: 1,
@@ -3396,9 +3470,7 @@ var makeAviVideoTrack = ({
3396
3470
  };
3397
3471
  };
3398
3472
  var getTracksFromAvi = (structure, state) => {
3399
- const videoTracks = [];
3400
- const audioTracks = [];
3401
- const otherTracks = [];
3473
+ const tracks2 = [];
3402
3474
  const boxes = getStrlBoxes(structure);
3403
3475
  let i = 0;
3404
3476
  for (const box of boxes) {
@@ -3408,22 +3480,22 @@ var getTracksFromAvi = (structure, state) => {
3408
3480
  }
3409
3481
  const { strf } = strh;
3410
3482
  if (strf.type === "strf-box-video") {
3411
- videoTracks.push(addAvcProfileToTrack(makeAviVideoTrack({ strh, strf, index: i }), state.riff.getAvcProfile()));
3483
+ tracks2.push(addAvcProfileToTrack(makeAviVideoTrack({ strh, strf, index: i }), state.riff.getAvcProfile()));
3412
3484
  } else if (strh.fccType === "auds") {
3413
- audioTracks.push(makeAviAudioTrack({ strf, index: i }));
3485
+ tracks2.push(makeAviAudioTrack({ strf, index: i }));
3414
3486
  } else {
3415
3487
  throw new Error(`Unsupported track type ${strh.fccType}`);
3416
3488
  }
3417
3489
  i++;
3418
3490
  }
3419
- return { audioTracks, otherTracks, videoTracks };
3491
+ return tracks2;
3420
3492
  };
3421
3493
  var hasAllTracksFromAvi = (state) => {
3422
3494
  try {
3423
3495
  const structure = state.structure.getRiffStructure();
3424
3496
  const numberOfTracks = getNumberOfTracks(structure);
3425
3497
  const tracks2 = getTracksFromAvi(structure, state);
3426
- return tracks2.videoTracks.length + tracks2.audioTracks.length + tracks2.otherTracks.length === numberOfTracks && !tracks2.videoTracks.find((t) => t.codec === TO_BE_OVERRIDDEN_LATER);
3498
+ return tracks2.length === numberOfTracks && !tracks2.find((t) => t.type === "video" && t.codec === TO_BE_OVERRIDDEN_LATER);
3427
3499
  } catch {
3428
3500
  return false;
3429
3501
  }
@@ -3476,11 +3548,7 @@ var getTracksFromTransportStream = (parserState) => {
3476
3548
  if (mapped.length !== filterStreamsBySupportedTypes(programMapTable.streams).length) {
3477
3549
  throw new Error("Not all tracks found");
3478
3550
  }
3479
- return {
3480
- videoTracks: mapped.filter((track) => track.type === "video"),
3481
- audioTracks: mapped.filter((track) => track.type === "audio"),
3482
- otherTracks: []
3483
- };
3551
+ return mapped;
3484
3552
  };
3485
3553
  var hasAllTracksFromTransportStream = (parserState) => {
3486
3554
  try {
@@ -3527,7 +3595,7 @@ var getHvc1CodecString = (data) => {
3527
3595
 
3528
3596
  // src/containers/webm/traversal.ts
3529
3597
  var getMainSegment = (segments) => {
3530
- return segments.find((s) => s.type === "Segment");
3598
+ return segments.find((s) => s.type === "Segment") ?? null;
3531
3599
  };
3532
3600
  var getTrackCodec = (track) => {
3533
3601
  const child = track.value.find((b) => b.type === "CodecID");
@@ -3742,9 +3810,9 @@ var parseColorSegment = (colourSegment) => {
3742
3810
  const primaries2 = getPrimariesSegment(colourSegment);
3743
3811
  const range2 = getRangeSegment(colourSegment);
3744
3812
  return {
3745
- transferCharacteristics: transferCharacteristics2 ? transferCharacteristics2.value.value === 1 ? "bt709" : transferCharacteristics2.value.value === 6 ? "smpte170m" : transferCharacteristics2.value.value === 13 ? "iec61966-2-1" : null : null,
3746
- matrixCoefficients: matrixCoefficients2 ? matrixCoefficients2.value.value === 1 ? "bt709" : matrixCoefficients2.value.value === 6 ? "smpte170m" : matrixCoefficients2.value.value === 5 ? "bt470bg" : null : null,
3747
- primaries: primaries2 ? primaries2.value.value === 1 ? "bt709" : primaries2.value.value === 6 ? "smpte170m" : primaries2.value.value === 5 ? "bt470bg" : null : null,
3813
+ transfer: transferCharacteristics2 ? getTransferCharacteristicsFromIndex(transferCharacteristics2.value.value) : null,
3814
+ matrix: matrixCoefficients2 ? getMatrixCoefficientsFromIndex(matrixCoefficients2.value.value) : null,
3815
+ primaries: primaries2 ? getPrimariesFromIndex(primaries2.value.value) : null,
3748
3816
  fullRange: transferCharacteristics2?.value.value && matrixCoefficients2?.value.value ? null : range2 ? Boolean(range2?.value.value) : null
3749
3817
  };
3750
3818
  };
@@ -3847,7 +3915,7 @@ var getDescription = (track) => {
3847
3915
  }
3848
3916
  return;
3849
3917
  };
3850
- var getMatroskaVideoCodecWithoutConfigString = ({
3918
+ var getMatroskaVideoCodecEnum = ({
3851
3919
  codecSegment: codec
3852
3920
  }) => {
3853
3921
  if (codec.value === "V_VP8") {
@@ -3902,7 +3970,7 @@ var getMatroskaVideoCodecString = ({
3902
3970
  }
3903
3971
  throw new Error(`Unknown codec: ${codec.value}`);
3904
3972
  };
3905
- var getMatroskaAudioCodecWithoutConfigString = ({
3973
+ var getMatroskaAudioCodecEnum = ({
3906
3974
  track
3907
3975
  }) => {
3908
3976
  const codec = getCodecSegment(track);
@@ -4007,6 +4075,28 @@ var getTrack = ({
4007
4075
  if (!codecString) {
4008
4076
  return null;
4009
4077
  }
4078
+ const codecEnum = getMatroskaVideoCodecEnum({
4079
+ codecSegment: codec
4080
+ });
4081
+ const codecData = codecPrivate2 === null ? null : codecEnum === "h264" ? { type: "avc-sps-pps", data: codecPrivate2 } : codecEnum === "av1" ? {
4082
+ type: "av1c-data",
4083
+ data: codecPrivate2
4084
+ } : codecEnum === "h265" ? {
4085
+ type: "hvcc-data",
4086
+ data: codecPrivate2
4087
+ } : codecEnum === "vp8" ? {
4088
+ type: "unknown-data",
4089
+ data: codecPrivate2
4090
+ } : codecEnum === "vp9" ? {
4091
+ type: "unknown-data",
4092
+ data: codecPrivate2
4093
+ } : null;
4094
+ const advancedColor = colour ? parseColorSegment(colour) : {
4095
+ fullRange: null,
4096
+ matrix: null,
4097
+ primaries: null,
4098
+ transfer: null
4099
+ };
4010
4100
  return {
4011
4101
  m3uStreamFormat: null,
4012
4102
  type: "video",
@@ -4025,17 +4115,10 @@ var getTrack = ({
4025
4115
  displayAspectHeight: displayHeight2 ? displayHeight2.value.value : height.value.value,
4026
4116
  displayAspectWidth: displayWidth2 ? displayWidth2.value.value : width.value.value,
4027
4117
  rotation: 0,
4028
- trakBox: null,
4029
- codecPrivate: codecPrivate2,
4030
- color: colour ? parseColorSegment(colour) : {
4031
- fullRange: null,
4032
- matrixCoefficients: null,
4033
- primaries: null,
4034
- transferCharacteristics: null
4035
- },
4036
- codecWithoutConfig: getMatroskaVideoCodecWithoutConfigString({
4037
- codecSegment: codec
4038
- }),
4118
+ codecData,
4119
+ colorSpace: mediaParserAdvancedColorToWebCodecsColor(advancedColor),
4120
+ advancedColor,
4121
+ codecEnum,
4039
4122
  fps: null
4040
4123
  };
4041
4124
  }
@@ -4046,17 +4129,17 @@ var getTrack = ({
4046
4129
  if (sampleRate === null) {
4047
4130
  throw new Error("Could not find sample rate or number of channels");
4048
4131
  }
4132
+ const codecString = getMatroskaAudioCodecString(track);
4049
4133
  return {
4050
4134
  type: "audio",
4051
4135
  trackId,
4052
- codec: getMatroskaAudioCodecString(track),
4136
+ codec: codecString,
4053
4137
  timescale,
4054
4138
  numberOfChannels,
4055
4139
  sampleRate,
4056
4140
  description: getAudioDescription(track),
4057
- trakBox: null,
4058
- codecPrivate: codecPrivate2,
4059
- codecWithoutConfig: getMatroskaAudioCodecWithoutConfigString({
4141
+ codecData: codecPrivate2 ? codecString === "opus" ? { type: "ogg-identification", data: codecPrivate2 } : { type: "unknown-data", data: codecPrivate2 } : null,
4142
+ codecEnum: getMatroskaAudioCodecEnum({
4060
4143
  track
4061
4144
  })
4062
4145
  };
@@ -4169,51 +4252,23 @@ var getHasTracks = (state, mayUsePrecomputed) => {
4169
4252
  throw new Error("Unknown container " + structure);
4170
4253
  };
4171
4254
  var getCategorizedTracksFromMatroska = (state) => {
4172
- const videoTracks = [];
4173
- const audioTracks = [];
4174
- const otherTracks = [];
4175
4255
  const { resolved } = getTracksFromMatroska({
4176
4256
  structureState: state.structure,
4177
4257
  webmState: state.webm
4178
4258
  });
4179
- for (const track of resolved) {
4180
- if (track.type === "video") {
4181
- videoTracks.push(track);
4182
- } else if (track.type === "audio") {
4183
- audioTracks.push(track);
4184
- } else if (track.type === "other") {
4185
- otherTracks.push(track);
4186
- }
4187
- }
4188
- return {
4189
- videoTracks,
4190
- audioTracks,
4191
- otherTracks
4192
- };
4259
+ return resolved;
4193
4260
  };
4194
4261
  var getTracksFromMoovBox = (moovBox) => {
4195
- const videoTracks = [];
4196
- const audioTracks = [];
4197
- const otherTracks = [];
4262
+ const mediaParserTracks = [];
4198
4263
  const tracks2 = getTraks(moovBox);
4199
4264
  for (const trakBox of tracks2) {
4200
4265
  const track = makeBaseMediaTrack(trakBox);
4201
4266
  if (!track) {
4202
4267
  continue;
4203
4268
  }
4204
- if (track.type === "video") {
4205
- videoTracks.push(track);
4206
- } else if (track.type === "audio") {
4207
- audioTracks.push(track);
4208
- } else if (track.type === "other") {
4209
- otherTracks.push(track);
4210
- }
4269
+ mediaParserTracks.push(track);
4211
4270
  }
4212
- return {
4213
- videoTracks,
4214
- audioTracks,
4215
- otherTracks
4216
- };
4271
+ return mediaParserTracks;
4217
4272
  };
4218
4273
  var getTracksFromIsoBaseMedia = ({
4219
4274
  mayUsePrecomputed,
@@ -4228,11 +4283,7 @@ var getTracksFromIsoBaseMedia = ({
4228
4283
  mayUsePrecomputed
4229
4284
  });
4230
4285
  if (!moovBox) {
4231
- return {
4232
- videoTracks: [],
4233
- audioTracks: [],
4234
- otherTracks: []
4235
- };
4286
+ return [];
4236
4287
  }
4237
4288
  return getTracksFromMoovBox(moovBox);
4238
4289
  };
@@ -4241,11 +4292,7 @@ var defaultGetTracks = (parserState) => {
4241
4292
  if (tracks2.length === 0) {
4242
4293
  throw new Error("No tracks found");
4243
4294
  }
4244
- return {
4245
- audioTracks: tracks2.filter((t) => t.type === "audio"),
4246
- otherTracks: [],
4247
- videoTracks: tracks2.filter((t) => t.type === "video")
4248
- };
4295
+ return tracks2;
4249
4296
  };
4250
4297
  var getTracks = (state, mayUsePrecomputed) => {
4251
4298
  const structure = state.structure.getStructure();
@@ -4275,16 +4322,15 @@ var getTracks = (state, mayUsePrecomputed) => {
4275
4322
  // src/get-audio-codec.ts
4276
4323
  var getAudioCodec = (parserState) => {
4277
4324
  const tracks2 = getTracks(parserState, true);
4278
- const allTracks = tracks2.audioTracks.length + tracks2.otherTracks.length + tracks2.videoTracks.length;
4279
- if (allTracks === 0) {
4325
+ if (tracks2.length === 0) {
4280
4326
  throw new Error("No tracks yet");
4281
4327
  }
4282
- const audioTrack = tracks2.audioTracks[0];
4328
+ const audioTrack = tracks2.find((t) => t.type === "audio");
4283
4329
  if (!audioTrack) {
4284
4330
  return null;
4285
4331
  }
4286
4332
  if (audioTrack.type === "audio") {
4287
- return audioTrack.codecWithoutConfig;
4333
+ return audioTrack.codecEnum;
4288
4334
  }
4289
4335
  return null;
4290
4336
  };
@@ -4341,7 +4387,7 @@ var getCodecPrivateFromTrak = (trakBox) => {
4341
4387
  if (!mp4a) {
4342
4388
  return null;
4343
4389
  }
4344
- return mp4a.asBytes;
4390
+ return { type: "aac-config", data: mp4a.asBytes };
4345
4391
  };
4346
4392
  var onSample = (sample, children) => {
4347
4393
  const child = children.find((c) => c.type === "esds-box");
@@ -4422,19 +4468,19 @@ var getAudioCodecStringFromTrak = (trak) => {
4422
4468
  if (codec.format === "lpcm") {
4423
4469
  return {
4424
4470
  codecString: "pcm-s16",
4425
- description: codec.description
4471
+ description: codec.description ? { type: "unknown-data", data: codec.description } : undefined
4426
4472
  };
4427
4473
  }
4428
4474
  if (codec.format === "twos") {
4429
4475
  return {
4430
4476
  codecString: "pcm-s16",
4431
- description: codec.description
4477
+ description: codec.description ? { type: "unknown-data", data: codec.description } : undefined
4432
4478
  };
4433
4479
  }
4434
4480
  if (codec.format === "in24") {
4435
4481
  return {
4436
4482
  codecString: "pcm-s24",
4437
- description: codec.description
4483
+ description: codec.description ? { type: "unknown-data", data: codec.description } : undefined
4438
4484
  };
4439
4485
  }
4440
4486
  const codecStringWithoutMp3Exception = [
@@ -4442,10 +4488,31 @@ var getAudioCodecStringFromTrak = (trak) => {
4442
4488
  codec.primarySpecificator ? codec.primarySpecificator.toString(16) : null,
4443
4489
  codec.secondarySpecificator ? codec.secondarySpecificator.toString().padStart(2, "0") : null
4444
4490
  ].filter(Boolean).join(".");
4445
- const codecString = codecStringWithoutMp3Exception === "mp4a.6b" ? "mp3" : codecStringWithoutMp3Exception;
4491
+ const codecString = codecStringWithoutMp3Exception.toLowerCase() === "mp4a.6b" || codecStringWithoutMp3Exception.toLowerCase() === "mp4a.69" ? "mp3" : codecStringWithoutMp3Exception;
4492
+ if (codecString === "mp3") {
4493
+ return {
4494
+ codecString,
4495
+ description: codec.description ? {
4496
+ type: "unknown-data",
4497
+ data: codec.description
4498
+ } : undefined
4499
+ };
4500
+ }
4501
+ if (codecString.startsWith("mp4a.")) {
4502
+ return {
4503
+ codecString,
4504
+ description: codec.description ? {
4505
+ type: "aac-config",
4506
+ data: codec.description
4507
+ } : undefined
4508
+ };
4509
+ }
4446
4510
  return {
4447
4511
  codecString,
4448
- description: codec.description
4512
+ description: codec.description ? {
4513
+ type: "unknown-data",
4514
+ data: codec.description
4515
+ } : undefined
4449
4516
  };
4450
4517
  };
4451
4518
  var getAudioCodecFromAudioCodecInfo = (codec) => {
@@ -4537,11 +4604,14 @@ var getDimensions = (state) => {
4537
4604
  if (structure && isAudioStructure(structure)) {
4538
4605
  return null;
4539
4606
  }
4540
- const { videoTracks } = getTracks(state, true);
4541
- if (!videoTracks.length) {
4607
+ const tracks2 = getTracks(state, true);
4608
+ if (!tracks2.length) {
4609
+ return null;
4610
+ }
4611
+ const firstVideoTrack = tracks2.find((t) => t.type === "video");
4612
+ if (!firstVideoTrack) {
4542
4613
  return null;
4543
4614
  }
4544
- const firstVideoTrack = videoTracks[0];
4545
4615
  return {
4546
4616
  width: firstVideoTrack.width,
4547
4617
  height: firstVideoTrack.height,
@@ -5125,15 +5195,14 @@ var getDurationFromIsoBaseMedia = (parserState) => {
5125
5195
  return mvhdBox.durationInSeconds;
5126
5196
  }
5127
5197
  const tracks2 = getTracks(parserState, true);
5128
- const allTracks = [
5129
- ...tracks2.videoTracks,
5130
- ...tracks2.audioTracks,
5131
- ...tracks2.otherTracks
5132
- ];
5133
- const allSamples = allTracks.map((t) => {
5198
+ const allSamples = tracks2.map((t) => {
5134
5199
  const { timescale: ts } = t;
5200
+ const trakBox = getTrakBoxByTrackId(moovBox, t.trackId);
5201
+ if (!trakBox) {
5202
+ return null;
5203
+ }
5135
5204
  const { samplePositions, isComplete } = getSamplePositionsFromTrack({
5136
- trakBox: t.trakBox,
5205
+ trakBox,
5137
5206
  moofBoxes,
5138
5207
  moofComplete: areSamplesComplete({ moofBoxes, tfraBoxes })
5139
5208
  });
@@ -5203,11 +5272,11 @@ var hasSlowDuration = (parserState) => {
5203
5272
 
5204
5273
  // src/get-is-hdr.ts
5205
5274
  var isVideoTrackHdr = (track) => {
5206
- return track.color.matrixCoefficients === "bt2020" && track.color.transferCharacteristics === "arib-std-b67" && track.color.primaries === "bt2020";
5275
+ return track.advancedColor.matrix === "bt2020-ncl" && (track.advancedColor.transfer === "hlg" || track.advancedColor.transfer === "pq") && track.advancedColor.primaries === "bt2020";
5207
5276
  };
5208
5277
  var getIsHdr = (state) => {
5209
- const { videoTracks } = getTracks(state, true);
5210
- return videoTracks.some((track) => isVideoTrackHdr(track));
5278
+ const tracks2 = getTracks(state, true);
5279
+ return tracks2.some((track) => track.type === "video" && isVideoTrackHdr(track));
5211
5280
  };
5212
5281
  var hasHdr = (state) => {
5213
5282
  return getHasTracks(state, true);
@@ -5215,19 +5284,28 @@ var hasHdr = (state) => {
5215
5284
 
5216
5285
  // src/containers/iso-base-media/get-keyframes.ts
5217
5286
  var getKeyframesFromIsoBaseMedia = (state) => {
5218
- const { videoTracks } = getTracksFromIsoBaseMedia({
5287
+ const tracks2 = getTracksFromIsoBaseMedia({
5219
5288
  isoState: state.iso,
5220
5289
  m3uPlaylistContext: state.m3uPlaylistContext,
5221
5290
  structure: state.structure,
5222
5291
  mayUsePrecomputed: true
5223
5292
  });
5293
+ const videoTracks = tracks2.filter((t) => t.type === "video");
5224
5294
  const structure = state.structure.getIsoStructure();
5225
5295
  const moofBoxes = getMoofBoxes(structure.boxes);
5226
5296
  const tfraBoxes = getTfraBoxes(structure.boxes);
5297
+ const moov = getMoovFromFromIsoStructure(structure);
5298
+ if (!moov) {
5299
+ return [];
5300
+ }
5227
5301
  const allSamples = videoTracks.map((t) => {
5228
5302
  const { timescale: ts } = t;
5303
+ const trakBox = getTrakBoxByTrackId(moov, t.trackId);
5304
+ if (!trakBox) {
5305
+ return [];
5306
+ }
5229
5307
  const { samplePositions, isComplete } = getSamplePositionsFromTrack({
5230
- trakBox: t.trakBox,
5308
+ trakBox,
5231
5309
  moofBoxes,
5232
5310
  moofComplete: areSamplesComplete({
5233
5311
  moofBoxes,
@@ -5515,7 +5593,7 @@ var hasMetadata = (structure) => {
5515
5593
  if (structure.type === "wav") {
5516
5594
  return getMetadataFromWav(structure) !== null;
5517
5595
  }
5518
- if (structure.type === "m3u" || structure.type === "transport-stream") {
5596
+ if (structure.type === "m3u" || structure.type === "transport-stream" || structure.type === "aac") {
5519
5597
  return true;
5520
5598
  }
5521
5599
  if (structure.type === "flac") {
@@ -5530,9 +5608,6 @@ var hasMetadata = (structure) => {
5530
5608
  if (structure.type === "riff") {
5531
5609
  return false;
5532
5610
  }
5533
- if (structure.type === "aac") {
5534
- return true;
5535
- }
5536
5611
  throw new Error("Unknown container " + structure);
5537
5612
  };
5538
5613
 
@@ -5680,10 +5755,18 @@ var findKeyframeBeforeTime = ({
5680
5755
 
5681
5756
  // src/containers/iso-base-media/find-track-to-seek.ts
5682
5757
  var findAnyTrackWithSamplePositions = (allTracks, struc) => {
5758
+ const moov = getMoovFromFromIsoStructure(struc);
5759
+ if (!moov) {
5760
+ return null;
5761
+ }
5683
5762
  for (const track of allTracks) {
5684
5763
  if (track.type === "video" || track.type === "audio") {
5764
+ const trakBox = getTrakBoxByTrackId(moov, track.trackId);
5765
+ if (!trakBox) {
5766
+ continue;
5767
+ }
5685
5768
  const { samplePositions } = getSamplePositionsFromTrack({
5686
- trakBox: track.trakBox,
5769
+ trakBox,
5687
5770
  moofBoxes: getMoofBoxes(struc.boxes),
5688
5771
  moofComplete: areSamplesComplete({
5689
5772
  moofBoxes: getMoofBoxes(struc.boxes),
@@ -5704,8 +5787,16 @@ var findTrackToSeek = (allTracks, structure) => {
5704
5787
  if (!firstVideoTrack) {
5705
5788
  return findAnyTrackWithSamplePositions(allTracks, struc);
5706
5789
  }
5790
+ const moov = getMoovFromFromIsoStructure(struc);
5791
+ if (!moov) {
5792
+ return null;
5793
+ }
5794
+ const trakBox = getTrakBoxByTrackId(moov, firstVideoTrack.trackId);
5795
+ if (!trakBox) {
5796
+ return null;
5797
+ }
5707
5798
  const { samplePositions } = getSamplePositionsFromTrack({
5708
- trakBox: firstVideoTrack.trakBox,
5799
+ trakBox,
5709
5800
  moofBoxes: getMoofBoxes(struc.boxes),
5710
5801
  moofComplete: areSamplesComplete({
5711
5802
  moofBoxes: getMoofBoxes(struc.boxes),
@@ -5838,15 +5929,30 @@ var getSeekingByteFromFragmentedMp4 = async ({
5838
5929
  logLevel,
5839
5930
  currentPosition,
5840
5931
  isoState,
5841
- allTracks,
5842
- isLastChunkInPlaylist
5932
+ tracks: tracks2,
5933
+ isLastChunkInPlaylist,
5934
+ structure,
5935
+ mp4HeaderSegment
5843
5936
  }) => {
5844
- const firstVideoTrack = allTracks.find((t) => t.type === "video");
5845
- const firstTrack = firstVideoTrack ?? allTracks.find((t) => t.type === "audio");
5937
+ const firstVideoTrack = tracks2.find((t) => t.type === "video");
5938
+ const firstTrack = firstVideoTrack ?? tracks2.find((t) => t.type === "audio");
5846
5939
  if (!firstTrack) {
5847
5940
  throw new Error("no video and no audio tracks");
5848
5941
  }
5849
- const tkhdBox = getTkhdBox(firstTrack.trakBox);
5942
+ const moov = getMoovBoxFromState({
5943
+ structureState: structure,
5944
+ isoState,
5945
+ mp4HeaderSegment,
5946
+ mayUsePrecomputed: true
5947
+ });
5948
+ if (!moov) {
5949
+ throw new Error("No moov atom found");
5950
+ }
5951
+ const trakBox = getTrakBoxByTrackId(moov, firstTrack.trackId);
5952
+ if (!trakBox) {
5953
+ throw new Error("No trak box found");
5954
+ }
5955
+ const tkhdBox = getTkhdBox(trakBox);
5850
5956
  if (!tkhdBox) {
5851
5957
  throw new Error("Expected tkhd box in trak box");
5852
5958
  }
@@ -5934,11 +6040,6 @@ var getSeekingByteFromIsoBaseMedia = ({
5934
6040
  structure,
5935
6041
  mayUsePrecomputed: false
5936
6042
  });
5937
- const allTracks = [
5938
- ...tracks2.videoTracks,
5939
- ...tracks2.audioTracks,
5940
- ...tracks2.otherTracks
5941
- ];
5942
6043
  const hasMoov = Boolean(getMoovBoxFromState({
5943
6044
  structureState: structure,
5944
6045
  isoState,
@@ -5958,11 +6059,13 @@ var getSeekingByteFromIsoBaseMedia = ({
5958
6059
  logLevel,
5959
6060
  currentPosition,
5960
6061
  isoState,
5961
- allTracks,
5962
- isLastChunkInPlaylist: m3uPlaylistContext?.isLastChunkInPlaylist ?? false
6062
+ tracks: tracks2,
6063
+ isLastChunkInPlaylist: m3uPlaylistContext?.isLastChunkInPlaylist ?? false,
6064
+ structure,
6065
+ mp4HeaderSegment: m3uPlaylistContext?.mp4HeaderSegment ?? null
5963
6066
  });
5964
6067
  }
5965
- const trackWithSamplePositions = findTrackToSeek(allTracks, structure);
6068
+ const trackWithSamplePositions = findTrackToSeek(tracks2, structure);
5966
6069
  if (!trackWithSamplePositions) {
5967
6070
  return Promise.resolve({
5968
6071
  type: "valid-but-must-wait"
@@ -6571,8 +6674,8 @@ var getVideoColorFromSps = (sps) => {
6571
6674
  const transferCharacteristics2 = sps.vui_parameters?.transfer_characteristics;
6572
6675
  const colorPrimaries = sps.vui_parameters?.colour_primaries;
6573
6676
  return {
6574
- matrixCoefficients: matrixCoefficients2 ? getMatrixCoefficientsFromIndex(matrixCoefficients2) : null,
6575
- transferCharacteristics: transferCharacteristics2 ? getTransferCharacteristicsFromIndex(transferCharacteristics2) : null,
6677
+ matrix: matrixCoefficients2 ? getMatrixCoefficientsFromIndex(matrixCoefficients2) : null,
6678
+ transfer: transferCharacteristics2 ? getTransferCharacteristicsFromIndex(transferCharacteristics2) : null,
6576
6679
  primaries: colorPrimaries ? getPrimariesFromIndex(colorPrimaries) : null,
6577
6680
  fullRange: sps.vui_parameters?.video_full_range_flag ?? null
6578
6681
  };
@@ -6851,6 +6954,8 @@ var handleAvcPacket = async ({
6851
6954
  trackId: programId,
6852
6955
  newOffset: startOffset
6853
6956
  });
6957
+ const codecPrivate2 = createSpsPpsData(spsAndPps);
6958
+ const advancedColor = getVideoColorFromSps(spsAndPps.sps.spsData);
6854
6959
  const track = {
6855
6960
  m3uStreamFormat: null,
6856
6961
  rotation: 0,
@@ -6858,7 +6963,7 @@ var handleAvcPacket = async ({
6858
6963
  type: "video",
6859
6964
  timescale: MPEG_TIMESCALE,
6860
6965
  codec: getCodecStringFromSpsAndPps(spsAndPps.sps),
6861
- codecPrivate: createSpsPpsData(spsAndPps),
6966
+ codecData: { type: "avc-sps-pps", data: codecPrivate2 },
6862
6967
  fps: null,
6863
6968
  codedWidth: dimensions.width,
6864
6969
  codedHeight: dimensions.height,
@@ -6866,14 +6971,14 @@ var handleAvcPacket = async ({
6866
6971
  width: dimensions.width,
6867
6972
  displayAspectWidth: dimensions.width,
6868
6973
  displayAspectHeight: dimensions.height,
6869
- trakBox: null,
6870
- codecWithoutConfig: "h264",
6974
+ codecEnum: "h264",
6871
6975
  description: undefined,
6872
6976
  sampleAspectRatio: {
6873
6977
  denominator: sampleAspectRatio.height,
6874
6978
  numerator: sampleAspectRatio.width
6875
6979
  },
6876
- color: getVideoColorFromSps(spsAndPps.sps.spsData)
6980
+ colorSpace: mediaParserAdvancedColorToWebCodecsColor(advancedColor),
6981
+ advancedColor
6877
6982
  };
6878
6983
  await registerVideoTrack({
6879
6984
  track,
@@ -7388,7 +7493,7 @@ var fieldsNeedSamplesMap = {
7388
7493
  name: false,
7389
7494
  rotation: false,
7390
7495
  size: false,
7391
- structure: false,
7496
+ slowStructure: false,
7392
7497
  tracks: false,
7393
7498
  unrotatedDimensions: false,
7394
7499
  videoCodec: false,
@@ -7591,49 +7696,46 @@ var turnSeekIntoByte = async ({
7591
7696
  type: "valid-but-must-wait"
7592
7697
  };
7593
7698
  }
7594
- if (seek2.type === "keyframe-before-time") {
7595
- if (seek2.timeInSeconds < 0) {
7596
- throw new Error(`Cannot seek to a negative time: ${JSON.stringify(seek2)}`);
7597
- }
7598
- const seekingHints = getSeekingHints({
7599
- riffState,
7600
- samplesObserved,
7601
- structureState,
7602
- mediaSectionState: mediaSectionState2,
7603
- isoState,
7604
- transportStream,
7605
- tracksState,
7606
- keyframesState: keyframes,
7607
- webmState,
7608
- flacState,
7609
- mp3State,
7610
- contentLength,
7611
- aacState,
7612
- m3uPlaylistContext
7613
- });
7614
- if (!seekingHints) {
7615
- Log.trace(logLevel, "No seeking info, cannot seek yet");
7616
- return {
7617
- type: "valid-but-must-wait"
7618
- };
7619
- }
7620
- const seekingByte = await getSeekingByte({
7621
- info: seekingHints,
7622
- time: seek2.timeInSeconds,
7623
- logLevel,
7624
- currentPosition: iterator.counter.getOffset(),
7625
- isoState,
7626
- transportStream,
7627
- webmState,
7628
- mediaSection: mediaSectionState2,
7629
- m3uPlaylistContext,
7630
- structure: structureState,
7631
- riffState,
7632
- m3uState
7633
- });
7634
- return seekingByte;
7699
+ if (seek2 < 0) {
7700
+ throw new Error(`Cannot seek to a negative time: ${JSON.stringify(seek2)}`);
7701
+ }
7702
+ const seekingHints = getSeekingHints({
7703
+ riffState,
7704
+ samplesObserved,
7705
+ structureState,
7706
+ mediaSectionState: mediaSectionState2,
7707
+ isoState,
7708
+ transportStream,
7709
+ tracksState,
7710
+ keyframesState: keyframes,
7711
+ webmState,
7712
+ flacState,
7713
+ mp3State,
7714
+ contentLength,
7715
+ aacState,
7716
+ m3uPlaylistContext
7717
+ });
7718
+ if (!seekingHints) {
7719
+ Log.trace(logLevel, "No seeking info, cannot seek yet");
7720
+ return {
7721
+ type: "valid-but-must-wait"
7722
+ };
7635
7723
  }
7636
- throw new Error(`Cannot process seek request for ${seek2}: ${JSON.stringify(seek2)}`);
7724
+ const seekingByte = await getSeekingByte({
7725
+ info: seekingHints,
7726
+ time: seek2,
7727
+ logLevel,
7728
+ currentPosition: iterator.counter.getOffset(),
7729
+ isoState,
7730
+ transportStream,
7731
+ webmState,
7732
+ mediaSection: mediaSectionState2,
7733
+ m3uPlaylistContext,
7734
+ structure: structureState,
7735
+ riffState,
7736
+ m3uState
7737
+ });
7738
+ return seekingByte;
7637
7739
  };
7638
7740
  var getWorkOnSeekRequestOptions = (state) => {
7639
7741
  return {
@@ -7695,7 +7797,7 @@ var workOnSeekRequest = async (options) => {
7695
7797
  m3uState
7696
7798
  } = options;
7697
7799
  const seek2 = controller._internals.seekSignal.getSeek();
7698
- if (!seek2) {
7800
+ if (seek2 === null) {
7699
7801
  return;
7700
7802
  }
7701
7803
  Log.trace(logLevel, `Has seek request for ${src}: ${JSON.stringify(seek2)}`);
@@ -7788,13 +7890,13 @@ var emitAvailableInfo = async ({
7788
7890
  } = state;
7789
7891
  for (const key of keys) {
7790
7892
  await workOnSeekRequest(getWorkOnSeekRequestOptions(state));
7791
- if (key === "structure") {
7792
- if (hasInfo.structure && !emittedFields.structure) {
7793
- await callbackFunctions.onStructure?.(state.structure.getStructure());
7794
- if (fieldsInReturnValue.structure) {
7795
- returnValue.structure = state.structure.getStructure();
7893
+ if (key === "slowStructure") {
7894
+ if (hasInfo.slowStructure && !emittedFields.slowStructure) {
7895
+ await callbackFunctions.onSlowStructure?.(state.structure.getStructure());
7896
+ if (fieldsInReturnValue.slowStructure) {
7897
+ returnValue.slowStructure = state.structure.getStructure();
7796
7898
  }
7797
- emittedFields.structure = true;
7899
+ emittedFields.slowStructure = true;
7798
7900
  }
7799
7901
  continue;
7800
7902
  }
@@ -7922,10 +8024,10 @@ var emitAvailableInfo = async ({
7922
8024
  }
7923
8025
  if (key === "tracks") {
7924
8026
  if (!emittedFields.tracks && hasInfo.tracks) {
7925
- const { videoTracks, audioTracks } = getTracks(state, true);
7926
- await callbackFunctions.onTracks?.({ videoTracks, audioTracks });
8027
+ const tracks2 = getTracks(state, true);
8028
+ await callbackFunctions.onTracks?.(tracks2);
7927
8029
  if (fieldsInReturnValue.tracks) {
7928
- returnValue.tracks = { videoTracks, audioTracks };
8030
+ returnValue.tracks = tracks2;
7929
8031
  }
7930
8032
  emittedFields.tracks = true;
7931
8033
  }
@@ -8126,12 +8228,29 @@ var getHasCallbacks = (state) => {
8126
8228
  const hasAllTracksAndNoCallbacks = !state.callbacks.tracks.hasAllTracks() || Object.values(state.callbacks.videoSampleCallbacks).length > 0 || Object.values(state.callbacks.audioSampleCallbacks).length > 0;
8127
8229
  return hasAllTracksAndNoCallbacks;
8128
8230
  };
8231
+ var missesMatroskaTracks = (state) => {
8232
+ const struct = state.structure.getStructureOrNull();
8233
+ if (struct === null) {
8234
+ return false;
8235
+ }
8236
+ if (struct.type !== "matroska") {
8237
+ return false;
8238
+ }
8239
+ const mainSegment = getMainSegment(struct.boxes);
8240
+ if (mainSegment === null) {
8241
+ return false;
8242
+ }
8243
+ return getTracksFromMatroska({
8244
+ structureState: state.structure,
8245
+ webmState: state.webm
8246
+ }).missingInfo.length > 0;
8247
+ };
8129
8248
  var maySkipVideoData = ({ state }) => {
8130
8249
  const hasCallbacks = getHasCallbacks(state);
8131
8250
  return !hasCallbacks && !needsToIterateOverSamples({
8132
8251
  emittedFields: state.emittedFields,
8133
8252
  fields: state.fields
8134
- });
8253
+ }) && !missesMatroskaTracks(state);
8135
8254
  };
8136
8255
  var maySkipOverSamplesInTheMiddle = ({
8137
8256
  state
@@ -8151,7 +8270,7 @@ var getAvailableInfo = ({
8151
8270
  const structure = state.structure.getStructureOrNull();
8152
8271
  const infos = keys.map(([_key]) => {
8153
8272
  const key = _key;
8154
- if (key === "structure") {
8273
+ if (key === "slowStructure") {
8155
8274
  return false;
8156
8275
  }
8157
8276
  if (key === "durationInSeconds") {
@@ -8350,14 +8469,13 @@ var parseAac = async (state) => {
8350
8469
  container: "aac",
8351
8470
  track: {
8352
8471
  codec: mapAudioObjectTypeToCodecString(audioObjectType),
8353
- codecWithoutConfig: "aac",
8354
- codecPrivate: codecPrivate2,
8472
+ codecEnum: "aac",
8473
+ codecData: { type: "aac-config", data: codecPrivate2 },
8355
8474
  description: codecPrivate2,
8356
8475
  numberOfChannels: channelConfiguration,
8357
8476
  sampleRate,
8358
8477
  timescale: 1e6,
8359
8478
  trackId: 0,
8360
- trakBox: null,
8361
8479
  type: "audio"
8362
8480
  },
8363
8481
  registerAudioSampleCallback: state.callbacks.registerAudioSampleCallback,
@@ -8754,13 +8872,12 @@ var parseStreamInfo = async ({
8754
8872
  codec: "flac",
8755
8873
  type: "audio",
8756
8874
  description: asUint8Array,
8757
- codecPrivate: asUint8Array,
8758
- codecWithoutConfig: "flac",
8875
+ codecData: { type: "flac-description", data: asUint8Array },
8876
+ codecEnum: "flac",
8759
8877
  numberOfChannels: channels2,
8760
8878
  sampleRate,
8761
8879
  timescale: 1e6,
8762
- trackId: 0,
8763
- trakBox: null
8880
+ trackId: 0
8764
8881
  },
8765
8882
  registerAudioSampleCallback: state.callbacks.registerAudioSampleCallback,
8766
8883
  tracks: state.callbacks.tracks,
@@ -8842,11 +8959,6 @@ var calculateFlatSamples = ({
8842
8959
  mediaSectionStart
8843
8960
  }) => {
8844
8961
  const tracks2 = getTracks(state, true);
8845
- const allTracks = [
8846
- ...tracks2.videoTracks,
8847
- ...tracks2.audioTracks,
8848
- ...tracks2.otherTracks
8849
- ];
8850
8962
  const moofBoxes = getMoofBoxes(state.structure.getIsoStructure().boxes);
8851
8963
  const tfraBoxes = deduplicateTfraBoxesByOffset([
8852
8964
  ...state.iso.tfra.getTfraBoxes(),
@@ -8857,9 +8969,22 @@ var calculateFlatSamples = ({
8857
8969
  if (moofBoxes.length > 0 && !relevantMoofBox) {
8858
8970
  throw new Error("No relevant moof box found");
8859
8971
  }
8860
- const flatSamples = allTracks.map((track) => {
8972
+ const moov = getMoovBoxFromState({
8973
+ structureState: state.structure,
8974
+ isoState: state.iso,
8975
+ mp4HeaderSegment: state.m3uPlaylistContext?.mp4HeaderSegment ?? null,
8976
+ mayUsePrecomputed: true
8977
+ });
8978
+ if (!moov) {
8979
+ throw new Error("No moov box found");
8980
+ }
8981
+ const flatSamples = tracks2.map((track) => {
8982
+ const trakBox = getTrakBoxByTrackId(moov, track.trackId);
8983
+ if (!trakBox) {
8984
+ throw new Error("No trak box found");
8985
+ }
8861
8986
  const { samplePositions } = getSamplePositionsFromTrack({
8862
- trakBox: track.trakBox,
8987
+ trakBox,
8863
8988
  moofBoxes: relevantMoofBox ? [relevantMoofBox] : [],
8864
8989
  moofComplete
8865
8990
  });
@@ -8927,7 +9052,7 @@ var needsTracksForField = ({
8927
9052
  }
8928
9053
  return true;
8929
9054
  }
8930
- 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") {
9055
+ 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") {
8931
9056
  return true;
8932
9057
  }
8933
9058
  if (field === "container" || field === "internalStats" || field === "mimeType" || field === "name" || field === "size") {
@@ -11038,7 +11163,7 @@ var getMoovAtom = async ({
11038
11163
  const boxes = [];
11039
11164
  const canSkipTracksState = makeCanSkipTracksState({
11040
11165
  hasAudioTrackHandlers: false,
11041
- fields: { structure: true },
11166
+ fields: { slowStructure: true },
11042
11167
  hasVideoTrackHandlers: false,
11043
11168
  structure: structureState()
11044
11169
  });
@@ -11413,10 +11538,10 @@ var parseStreamInf = (str) => {
11413
11538
  }
11414
11539
  return {
11415
11540
  type: "m3u-stream-info",
11416
- averageBandwidth: map["AVERAGE-BANDWIDTH"] ? parseInt(map["AVERAGE-BANDWIDTH"], 10) : null,
11417
- bandwidth: map.BANDWIDTH ? parseInt(map.BANDWIDTH, 10) : null,
11541
+ averageBandwidthInBitsPerSec: map["AVERAGE-BANDWIDTH"] ? parseInt(map["AVERAGE-BANDWIDTH"], 10) : null,
11542
+ bandwidthInBitsPerSec: map.BANDWIDTH ? parseInt(map.BANDWIDTH, 10) : null,
11418
11543
  codecs: map.CODECS ? map.CODECS.split(",") : null,
11419
- resolution: map.RESOLUTION ? {
11544
+ dimensions: map.RESOLUTION ? {
11420
11545
  width: parseInt(map.RESOLUTION.split("x")[0], 10),
11421
11546
  height: parseInt(map.RESOLUTION.split("x")[1], 10)
11422
11547
  } : null,
@@ -11631,7 +11756,7 @@ var afterManifestFetch = async ({
11631
11756
  throw new Error("No streams found");
11632
11757
  }
11633
11758
  const selectedPlaylist = await selectStream({ streams, fn: selectM3uStreamFn });
11634
- if (!selectedPlaylist.resolution) {
11759
+ if (!selectedPlaylist.dimensions) {
11635
11760
  throw new Error("Stream does not have a resolution");
11636
11761
  }
11637
11762
  m3uState.setSelectedMainPlaylist({
@@ -11736,7 +11861,7 @@ var parseMedia = (options) => {
11736
11861
  onSlowKeyframes: options.onSlowKeyframes ?? null,
11737
11862
  onSlowNumberOfFrames: options.onSlowNumberOfFrames ?? null,
11738
11863
  onSlowVideoBitrate: options.onSlowVideoBitrate ?? null,
11739
- onStructure: options.onStructure ?? null,
11864
+ onSlowStructure: options.onSlowStructure ?? null,
11740
11865
  onM3uStreams: options.onM3uStreams ?? null,
11741
11866
  onTracks: options.onTracks ?? null,
11742
11867
  onUnrotatedDimensions: options.onUnrotatedDimensions ?? null,
@@ -11778,16 +11903,10 @@ var considerSeekBasedOnChunk = async ({
11778
11903
  const timestamp = Math.min(sample.dts / sample.timescale, sample.cts / sample.timescale);
11779
11904
  if (timestamp > pendingSeek.targetTime && chunkIndex !== null && chunkIndex > 0) {
11780
11905
  m3uState.setNextSeekShouldSubtractChunks(playlistUrl, subtractChunks + 1);
11781
- parentController.seek({
11782
- type: "keyframe-before-time",
11783
- timeInSeconds: pendingSeek.targetTime
11784
- });
11906
+ parentController.seek(pendingSeek.targetTime);
11785
11907
  return;
11786
11908
  }
11787
- childController.seek({
11788
- type: "keyframe-before-time",
11789
- timeInSeconds: pendingSeek.targetTime
11790
- });
11909
+ childController.seek(pendingSeek.targetTime);
11791
11910
  m3uState.setNextSeekShouldSubtractChunks(playlistUrl, 0);
11792
11911
  m3uState.setSeekToSecondsToProcess(playlistUrl, null);
11793
11912
  };
@@ -11965,7 +12084,7 @@ var processM3uChunk = ({
11965
12084
  childController.pause();
11966
12085
  currentPromise.resolver(makeContinuationFn());
11967
12086
  },
11968
- fields: chunk.isHeader ? { structure: true } : undefined,
12087
+ fields: chunk.isHeader ? { slowStructure: true } : undefined,
11969
12088
  onTracks: () => {
11970
12089
  if (!state.m3u.hasEmittedDoneWithTracks(playlistUrl)) {
11971
12090
  state.m3u.setHasEmittedDoneWithTracks(playlistUrl);
@@ -12063,10 +12182,10 @@ var processM3uChunk = ({
12063
12182
  }
12064
12183
  });
12065
12184
  if (chunk.isHeader) {
12066
- if (data.structure.type !== "iso-base-media") {
12185
+ if (data.slowStructure.type !== "iso-base-media") {
12067
12186
  throw new Error("Expected an mp4 file");
12068
12187
  }
12069
- state.m3u.setMp4HeaderSegment(playlistUrl, data.structure);
12188
+ state.m3u.setMp4HeaderSegment(playlistUrl, data.slowStructure);
12070
12189
  }
12071
12190
  } catch (e) {
12072
12191
  currentPromise.rejector(e);
@@ -12640,14 +12759,13 @@ var parseMpegHeader = async ({
12640
12759
  track: {
12641
12760
  type: "audio",
12642
12761
  codec: "mp3",
12643
- codecPrivate: null,
12644
- codecWithoutConfig: "mp3",
12762
+ codecData: null,
12763
+ codecEnum: "mp3",
12645
12764
  description: undefined,
12646
12765
  numberOfChannels,
12647
12766
  sampleRate,
12648
12767
  timescale: 1e6,
12649
- trackId: 0,
12650
- trakBox: null
12768
+ trackId: 0
12651
12769
  },
12652
12770
  registerAudioSampleCallback: state.callbacks.registerAudioSampleCallback,
12653
12771
  tracks: state.callbacks.tracks,
@@ -13233,7 +13351,7 @@ var parseMediaSection = async (state) => {
13233
13351
  state
13234
13352
  });
13235
13353
  const tracks2 = getTracks(state, false);
13236
- if (!tracks2.videoTracks.some((t) => t.codec === TO_BE_OVERRIDDEN_LATER) && !state.callbacks.tracks.getIsDone()) {
13354
+ if (!tracks2.some((t) => t.type === "video" && t.codec === TO_BE_OVERRIDDEN_LATER) && !state.callbacks.tracks.getIsDone()) {
13237
13355
  state.callbacks.tracks.setIsDone(state.logLevel);
13238
13356
  }
13239
13357
  };
@@ -13613,13 +13731,12 @@ var handleAacPacket = async ({
13613
13731
  });
13614
13732
  const track = {
13615
13733
  type: "audio",
13616
- codecPrivate: codecPrivate2,
13734
+ codecData: { type: "aac-config", data: codecPrivate2 },
13617
13735
  trackId: programId,
13618
- trakBox: null,
13619
13736
  timescale: MPEG_TIMESCALE,
13620
- codecWithoutConfig: "aac",
13737
+ codecEnum: "aac",
13621
13738
  codec: mapAudioObjectTypeToCodecString(audioObjectType),
13622
- description: undefined,
13739
+ description: codecPrivate2,
13623
13740
  numberOfChannels: channelConfiguration,
13624
13741
  sampleRate
13625
13742
  };
@@ -14122,14 +14239,13 @@ var parseFmt = async ({
14122
14239
  track: {
14123
14240
  type: "audio",
14124
14241
  codec: format,
14125
- codecPrivate: null,
14242
+ codecData: null,
14126
14243
  description: undefined,
14127
- codecWithoutConfig: format,
14244
+ codecEnum: format,
14128
14245
  numberOfChannels,
14129
14246
  sampleRate,
14130
14247
  timescale: 1e6,
14131
- trackId: 0,
14132
- trakBox: null
14248
+ trackId: 0
14133
14249
  },
14134
14250
  container: "wav",
14135
14251
  registerAudioSampleCallback: state.callbacks.registerAudioSampleCallback,
@@ -14732,7 +14848,7 @@ var expectSegment = async ({
14732
14848
  }
14733
14849
  statesForProcessing.webmState.addCluster({
14734
14850
  start: offset,
14735
- size,
14851
+ size: size + (offsetAfterVInt - offset),
14736
14852
  segment: isInsideSegment.index
14737
14853
  });
14738
14854
  const newSegment = {
@@ -14822,6 +14938,9 @@ var parseWebm = async (state) => {
14822
14938
  return null;
14823
14939
  }
14824
14940
  if (isInsideCluster) {
14941
+ if (maySkipVideoData({ state })) {
14942
+ return makeSkip(Math.min(state.contentLength, isInsideCluster.size + isInsideCluster.start));
14943
+ }
14825
14944
  const segments = structure.boxes.filter((box) => box.type === "Segment");
14826
14945
  const segment = segments[isInsideCluster.segment];
14827
14946
  if (!segment) {
@@ -14866,7 +14985,7 @@ var initVideo = async ({ state }) => {
14866
14985
  throw new Error("No moov box found");
14867
14986
  }
14868
14987
  const tracks2 = getTracksFromMoovBox(moovAtom);
14869
- for (const track of tracks2.videoTracks) {
14988
+ for (const track of tracks2.filter((t) => t.type === "video")) {
14870
14989
  await registerVideoTrack({
14871
14990
  track,
14872
14991
  container: "mp4",
@@ -14876,7 +14995,7 @@ var initVideo = async ({ state }) => {
14876
14995
  tracks: state.callbacks.tracks
14877
14996
  });
14878
14997
  }
14879
- for (const track of tracks2.audioTracks) {
14998
+ for (const track of tracks2.filter((t) => t.type === "audio")) {
14880
14999
  await registerAudioTrack({
14881
15000
  track,
14882
15001
  container: "mp4",
@@ -14964,14 +15083,6 @@ var initVideo = async ({ state }) => {
14964
15083
  });
14965
15084
  return;
14966
15085
  }
14967
- if (fileType.type === "gif") {
14968
- return Promise.reject(new IsAGifError({
14969
- message: "GIF files are not yet supported",
14970
- mimeType,
14971
- sizeInBytes: contentLength,
14972
- fileName: name
14973
- }));
14974
- }
14975
15086
  if (fileType.type === "pdf") {
14976
15087
  return Promise.reject(new IsAPdfError({
14977
15088
  message: "GIF files are not supported",
@@ -14980,7 +15091,7 @@ var initVideo = async ({ state }) => {
14980
15091
  fileName: name
14981
15092
  }));
14982
15093
  }
14983
- if (fileType.type === "bmp" || fileType.type === "jpeg" || fileType.type === "png" || fileType.type === "webp") {
15094
+ if (fileType.type === "bmp" || fileType.type === "jpeg" || fileType.type === "png" || fileType.type === "webp" || fileType.type === "gif") {
14984
15095
  return Promise.reject(new IsAnImageError({
14985
15096
  message: "Image files are not supported",
14986
15097
  imageType: fileType.type,
@@ -15153,10 +15264,10 @@ var parseLoop = async ({
15153
15264
  }
15154
15265
  }
15155
15266
  state.samplesObserved.setLastSampleObserved();
15156
- if (state.controller._internals.seekSignal.getSeek()) {
15267
+ if (state.controller._internals.seekSignal.getSeek() !== null) {
15157
15268
  Log.verbose(state.logLevel, "Reached end of samples, but there is a pending seek. Trying to seek...");
15158
15269
  await workOnSeekRequest(getWorkOnSeekRequestOptions(state));
15159
- if (state.controller._internals.seekSignal.getSeek()) {
15270
+ if (state.controller._internals.seekSignal.getSeek() !== null) {
15160
15271
  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.");
15161
15272
  }
15162
15273
  await parseLoop({
@@ -15256,7 +15367,7 @@ var getFieldsFromCallback = ({
15256
15367
  name: Boolean(callbacks.onName),
15257
15368
  rotation: Boolean(callbacks.onRotation),
15258
15369
  size: Boolean(callbacks.onSize),
15259
- structure: Boolean(callbacks.onStructure),
15370
+ slowStructure: Boolean(callbacks.onSlowStructure),
15260
15371
  tracks: Boolean(callbacks.onTracks),
15261
15372
  unrotatedDimensions: Boolean(callbacks.onUnrotatedDimensions),
15262
15373
  videoCodec: Boolean(callbacks.onVideoCodec),
@@ -15339,7 +15450,7 @@ var emittedState = () => {
15339
15450
  name: false,
15340
15451
  rotation: false,
15341
15452
  size: false,
15342
- structure: false,
15453
+ slowStructure: false,
15343
15454
  tracks: false,
15344
15455
  videoCodec: false,
15345
15456
  unrotatedDimensions: false,
@@ -16092,7 +16203,7 @@ var webmState = ({
16092
16203
  },
16093
16204
  isInsideCluster: (offset) => {
16094
16205
  for (const cluster of clusters) {
16095
- if (offset >= cluster.start && offset <= cluster.start + cluster.size) {
16206
+ if (offset >= cluster.start && offset < cluster.start + cluster.size) {
16096
16207
  return cluster;
16097
16208
  }
16098
16209
  }
@@ -16391,7 +16502,7 @@ var callbacksState = ({
16391
16502
  const callback = audioSampleCallbacks[trackId];
16392
16503
  if (audioSample.data.length > 0) {
16393
16504
  if (callback) {
16394
- if (seekSignal.getSeek()) {
16505
+ if (seekSignal.getSeek() !== null) {
16395
16506
  Log.trace(logLevel, "Not emitting sample because seek is processing");
16396
16507
  } else {
16397
16508
  await callback(audioSample);
@@ -16409,7 +16520,7 @@ var callbacksState = ({
16409
16520
  if (videoSample.data.length > 0) {
16410
16521
  const callback = videoSampleCallbacks[trackId];
16411
16522
  if (callback) {
16412
- if (seekSignal.getSeek()) {
16523
+ if (seekSignal.getSeek() !== null) {
16413
16524
  Log.trace(logLevel, "Not emitting sample because seek is processing");
16414
16525
  } else {
16415
16526
  await callback(videoSample);
@@ -16950,7 +17061,7 @@ var internalParseMedia = async function({
16950
17061
  if (state.errored) {
16951
17062
  throw state.errored;
16952
17063
  }
16953
- if (state.controller._internals.seekSignal.getSeek()) {
17064
+ if (state.controller._internals.seekSignal.getSeek() !== null) {
16954
17065
  throw new Error("Should not finish while a seek is pending");
16955
17066
  }
16956
17067
  return state.returnValue;
@@ -17001,17 +17112,6 @@ var serializeError = ({
17001
17112
  logLevel,
17002
17113
  seekingHints
17003
17114
  }) => {
17004
- if (error instanceof IsAGifError) {
17005
- return {
17006
- type: "response-error",
17007
- errorName: "IsAGifError",
17008
- errorMessage: error.message,
17009
- errorStack: error.stack ?? "",
17010
- mimeType: error.mimeType,
17011
- sizeInBytes: error.sizeInBytes,
17012
- fileName: error.fileName
17013
- };
17014
- }
17015
17115
  if (error instanceof IsAnImageError) {
17016
17116
  return {
17017
17117
  type: "response-error",
@@ -17136,7 +17236,7 @@ var startParsing = async (message, reader) => {
17136
17236
  postSlowFps,
17137
17237
  postSlowDurationInSeconds,
17138
17238
  postSlowVideoBitrate,
17139
- postStructure,
17239
+ postSlowStructure,
17140
17240
  postTracks,
17141
17241
  postUnrotatedDimensions,
17142
17242
  postVideoCodec,
@@ -17299,9 +17399,9 @@ var startParsing = async (message, reader) => {
17299
17399
  value: videoBitrate
17300
17400
  });
17301
17401
  } : null,
17302
- onStructure: postStructure ? async (structure) => {
17402
+ onSlowStructure: postSlowStructure ? async (structure) => {
17303
17403
  await executeCallback({
17304
- callbackType: "structure",
17404
+ callbackType: "slow-structure",
17305
17405
  value: structure
17306
17406
  });
17307
17407
  } : null,
@@ -17370,7 +17470,7 @@ var startParsing = async (message, reader) => {
17370
17470
  }
17371
17471
  return async (sample) => {
17372
17472
  await executeCallback({
17373
- callbackType: "on-audio-video-sample",
17473
+ callbackType: "on-audio-sample",
17374
17474
  value: sample,
17375
17475
  trackId: params.track.trackId
17376
17476
  });
@@ -17389,7 +17489,7 @@ var startParsing = async (message, reader) => {
17389
17489
  }
17390
17490
  return async (sample) => {
17391
17491
  await executeCallback({
17392
- callbackType: "on-audio-video-sample",
17492
+ callbackType: "on-video-sample",
17393
17493
  value: sample,
17394
17494
  trackId: params.track.trackId
17395
17495
  });