@remotion/media-parser 4.0.248 → 4.0.250

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 (162) hide show
  1. package/dist/boxes/avc/key.d.ts +1 -1
  2. package/dist/boxes/iso-base-media/continue-mdat-routine.d.ts +14 -0
  3. package/dist/boxes/iso-base-media/continue-mdat-routine.js +74 -0
  4. package/dist/boxes/iso-base-media/get-children.d.ts +8 -0
  5. package/dist/boxes/iso-base-media/get-children.js +23 -0
  6. package/dist/boxes/iso-base-media/mdat/mdat.d.ts +3 -22
  7. package/dist/boxes/iso-base-media/mdat/mdat.js +80 -121
  8. package/dist/boxes/iso-base-media/moov/moov.d.ts +1 -6
  9. package/dist/boxes/iso-base-media/moov/moov.js +5 -15
  10. package/dist/boxes/iso-base-media/parse-all-children.d.ts +8 -0
  11. package/dist/boxes/iso-base-media/parse-all-children.js +20 -0
  12. package/dist/boxes/iso-base-media/parse-boxes.d.ts +7 -0
  13. package/dist/boxes/iso-base-media/parse-boxes.js +46 -0
  14. package/dist/boxes/iso-base-media/parse-mdat-partially.d.ts +9 -0
  15. package/dist/boxes/iso-base-media/parse-mdat-partially.js +24 -0
  16. package/dist/boxes/iso-base-media/process-box.d.ts +2 -29
  17. package/dist/boxes/iso-base-media/process-box.js +56 -367
  18. package/dist/boxes/iso-base-media/stsd/mebx.d.ts +1 -4
  19. package/dist/boxes/iso-base-media/stsd/mebx.js +5 -15
  20. package/dist/boxes/iso-base-media/stsd/samples.d.ts +4 -12
  21. package/dist/boxes/iso-base-media/stsd/samples.js +24 -70
  22. package/dist/boxes/iso-base-media/stsd/stsd.d.ts +1 -4
  23. package/dist/boxes/iso-base-media/stsd/stsd.js +2 -5
  24. package/dist/boxes/iso-base-media/trak/trak.d.ts +1 -6
  25. package/dist/boxes/iso-base-media/trak/trak.js +5 -15
  26. package/dist/boxes/iso-base-media/traversal.d.ts +0 -2
  27. package/dist/boxes/iso-base-media/traversal.js +1 -12
  28. package/dist/boxes/mp3/get-duration.d.ts +2 -0
  29. package/dist/boxes/mp3/get-duration.js +30 -0
  30. package/dist/boxes/mp3/get-frame-length.d.ts +13 -0
  31. package/dist/boxes/mp3/get-frame-length.js +33 -0
  32. package/dist/boxes/mp3/get-metadata-from-mp3.d.ts +3 -0
  33. package/dist/boxes/mp3/get-metadata-from-mp3.js +8 -0
  34. package/dist/boxes/mp3/get-tracks-from-mp3.d.ts +4 -0
  35. package/dist/boxes/mp3/get-tracks-from-mp3.js +25 -0
  36. package/dist/boxes/mp3/id3-v1.d.ts +2 -0
  37. package/dist/boxes/mp3/id3-v1.js +12 -0
  38. package/dist/boxes/mp3/id3-v2.d.ts +0 -0
  39. package/dist/boxes/mp3/id3-v2.js +1 -0
  40. package/dist/boxes/mp3/id3.d.ts +6 -0
  41. package/dist/boxes/mp3/id3.js +80 -0
  42. package/dist/boxes/mp3/parse-mp3.d.ts +7 -0
  43. package/dist/boxes/mp3/parse-mp3.js +41 -0
  44. package/dist/boxes/mp3/parse-mpeg-header.d.ts +6 -0
  45. package/dist/boxes/mp3/parse-mpeg-header.js +274 -0
  46. package/dist/boxes/mp3/samples-per-mpeg-file.d.ts +4 -0
  47. package/dist/boxes/mp3/samples-per-mpeg-file.js +26 -0
  48. package/dist/boxes/riff/continue-after-riff-result.d.ts +13 -0
  49. package/dist/boxes/riff/continue-after-riff-result.js +34 -0
  50. package/dist/boxes/riff/expect-riff-box.d.ts +1 -7
  51. package/dist/boxes/riff/expect-riff-box.js +47 -24
  52. package/dist/boxes/riff/get-tracks-from-avi.d.ts +1 -1
  53. package/dist/boxes/riff/get-tracks-from-avi.js +6 -10
  54. package/dist/boxes/riff/parse-box.d.ts +1 -7
  55. package/dist/boxes/riff/parse-box.js +4 -120
  56. package/dist/boxes/riff/parse-fmt-box.d.ts +3 -2
  57. package/dist/boxes/riff/parse-fmt-box.js +7 -5
  58. package/dist/boxes/riff/parse-list-box.js +15 -14
  59. package/dist/boxes/riff/parse-movi.d.ts +2 -5
  60. package/dist/boxes/riff/parse-movi.js +34 -56
  61. package/dist/boxes/riff/parse-riff-body.d.ts +7 -0
  62. package/dist/boxes/riff/parse-riff-body.js +25 -0
  63. package/dist/boxes/riff/parse-riff-box.d.ts +1 -2
  64. package/dist/boxes/riff/parse-riff-box.js +2 -6
  65. package/dist/boxes/riff/parse-riff-header.d.ts +7 -0
  66. package/dist/boxes/riff/parse-riff-header.js +23 -0
  67. package/dist/boxes/riff/parse-riff.d.ts +7 -0
  68. package/dist/boxes/riff/parse-riff.js +15 -0
  69. package/dist/boxes/riff/parse-strf.d.ts +4 -4
  70. package/dist/boxes/riff/parse-strf.js +4 -8
  71. package/dist/boxes/riff/parse-strh.js +11 -0
  72. package/dist/boxes/riff/parse-video-section.d.ts +6 -0
  73. package/dist/boxes/riff/parse-video-section.js +20 -0
  74. package/dist/boxes/riff/riff-box.d.ts +4 -5
  75. package/dist/boxes/riff/traversal.d.ts +1 -2
  76. package/dist/boxes/riff/traversal.js +1 -6
  77. package/dist/boxes/transport-stream/get-tracks.d.ts +2 -3
  78. package/dist/boxes/transport-stream/get-tracks.js +4 -3
  79. package/dist/boxes/transport-stream/parse-packet.d.ts +1 -7
  80. package/dist/boxes/transport-stream/parse-packet.js +3 -4
  81. package/dist/boxes/transport-stream/parse-stream-packet.d.ts +1 -5
  82. package/dist/boxes/transport-stream/parse-stream-packet.js +10 -12
  83. package/dist/boxes/transport-stream/parse-transport-stream.d.ts +1 -7
  84. package/dist/boxes/transport-stream/parse-transport-stream.js +19 -49
  85. package/dist/boxes/transport-stream/process-stream-buffers.d.ts +1 -2
  86. package/dist/boxes/transport-stream/process-stream-buffers.js +3 -3
  87. package/dist/boxes/webm/parse-ebml.js +3 -0
  88. package/dist/boxes/webm/parse-webm-header.d.ts +2 -4
  89. package/dist/boxes/webm/parse-webm-header.js +41 -25
  90. package/dist/boxes/webm/segments/parse-children.d.ts +2 -16
  91. package/dist/boxes/webm/segments/parse-children.js +7 -130
  92. package/dist/boxes/webm/segments.d.ts +4 -8
  93. package/dist/boxes/webm/segments.js +41 -123
  94. package/dist/buffer-iterator.d.ts +6 -3
  95. package/dist/buffer-iterator.js +27 -16
  96. package/dist/bun-reader.d.ts +1 -0
  97. package/dist/bun-reader.js +17 -0
  98. package/dist/continue-mdat-routine.d.ts +17 -0
  99. package/dist/continue-mdat-routine.js +92 -0
  100. package/dist/emit-available-info.js +42 -28
  101. package/dist/esm/from-node.mjs +8 -9
  102. package/dist/esm/index.mjs +5133 -5085
  103. package/dist/file-types/detect-file-type.js +6 -2
  104. package/dist/get-audio-codec.d.ts +1 -1
  105. package/dist/get-audio-codec.js +3 -3
  106. package/dist/get-container.js +5 -1
  107. package/dist/get-dimensions.d.ts +1 -1
  108. package/dist/get-dimensions.js +4 -1
  109. package/dist/get-duration.js +6 -2
  110. package/dist/get-fields-from-callbacks.js +1 -0
  111. package/dist/get-fps.js +3 -0
  112. package/dist/get-is-hdr.d.ts +1 -1
  113. package/dist/get-is-hdr.js +3 -3
  114. package/dist/get-keyframes.js +1 -1
  115. package/dist/get-tracks.d.ts +2 -2
  116. package/dist/get-tracks.js +23 -15
  117. package/dist/get-video-codec.d.ts +1 -1
  118. package/dist/get-video-codec.js +3 -3
  119. package/dist/has-all-info.js +4 -3
  120. package/dist/index.d.ts +65 -21
  121. package/dist/index.js +1 -1
  122. package/dist/may-skip-video-data/may-skip-video-data.js +6 -2
  123. package/dist/may-skip-video-data/need-samples-for-fields.js +1 -0
  124. package/dist/metadata/get-metadata.d.ts +1 -0
  125. package/dist/metadata/get-metadata.js +16 -1
  126. package/dist/options.d.ts +12 -5
  127. package/dist/parse-media.js +88 -68
  128. package/dist/parse-result.d.ts +17 -19
  129. package/dist/parse-video.d.ts +3 -17
  130. package/dist/parse-video.js +52 -40
  131. package/dist/readers/from-node.js +7 -8
  132. package/dist/state/can-skip-tracks.d.ts +8 -1
  133. package/dist/state/can-skip-tracks.js +38 -26
  134. package/dist/state/emitted-fields.js +1 -0
  135. package/dist/state/images.d.ts +9 -0
  136. package/dist/state/images.js +14 -0
  137. package/dist/state/iso-base-media/cached-sample-positions.d.ts +15 -0
  138. package/dist/state/iso-base-media/cached-sample-positions.js +42 -0
  139. package/dist/state/iso-base-media/iso-state.d.ts +8 -0
  140. package/dist/state/iso-base-media/iso-state.js +15 -0
  141. package/dist/state/iso-state.d.ts +4 -0
  142. package/dist/state/iso-state.js +13 -0
  143. package/dist/state/mp3.d.ts +11 -0
  144. package/dist/state/mp3.js +13 -0
  145. package/dist/state/parser-state.d.ts +57 -11
  146. package/dist/state/parser-state.js +17 -2
  147. package/dist/state/sample-callbacks.d.ts +5 -1
  148. package/dist/state/sample-callbacks.js +8 -2
  149. package/dist/state/slow-duration-fps.d.ts +2 -1
  150. package/dist/state/slow-duration-fps.js +52 -18
  151. package/dist/state/transport-stream.d.ts +8 -0
  152. package/dist/state/transport-stream.js +11 -0
  153. package/dist/state/video-section.d.ts +16 -0
  154. package/dist/state/video-section.js +37 -0
  155. package/dist/state/webm.d.ts +15 -0
  156. package/dist/state/webm.js +32 -0
  157. package/dist/throttled-progress.d.ts +14 -0
  158. package/dist/throttled-progress.js +44 -0
  159. package/dist/version.d.ts +1 -1
  160. package/dist/version.js +1 -1
  161. package/package.json +3 -3
  162. package/test.json +663 -0
@@ -43,10 +43,14 @@ const isTransportStream = (data) => {
43
43
  exports.isTransportStream = isTransportStream;
44
44
  const isMp3 = (data) => {
45
45
  const mpegPattern = new Uint8Array([0xff, 0xf3, 0xe4, 0x64]);
46
- const id3Pattern = new Uint8Array([73, 68, 51, 3]);
46
+ const id3v4Pattern = new Uint8Array([0x49, 0x44, 0x33, 4]);
47
+ const id3v3Pattern = new Uint8Array([0x49, 0x44, 0x33, 3]);
48
+ const id3v2Pattern = new Uint8Array([0x49, 0x44, 0x33, 2]);
47
49
  const subarray = data.subarray(0, 4);
48
50
  return ((0, exports.matchesPattern)(mpegPattern)(subarray) ||
49
- (0, exports.matchesPattern)(id3Pattern)(subarray));
51
+ (0, exports.matchesPattern)(id3v4Pattern)(subarray) ||
52
+ (0, exports.matchesPattern)(id3v3Pattern)(subarray) ||
53
+ (0, exports.matchesPattern)(id3v2Pattern)(subarray));
50
54
  };
51
55
  exports.isMp3 = isMp3;
52
56
  const isGif = (data) => {
@@ -3,7 +3,7 @@ import type { TrakBox } from './boxes/iso-base-media/trak/trak';
3
3
  import { type MediaParserAudioCodec } from './get-tracks';
4
4
  import type { Structure } from './parse-result';
5
5
  import type { ParserState } from './state/parser-state';
6
- export declare const getAudioCodec: (boxes: Structure, parserState: ParserState) => MediaParserAudioCodec | null;
6
+ export declare const getAudioCodec: (parserState: ParserState) => MediaParserAudioCodec | null;
7
7
  export declare const hasAudioCodec: (boxes: Structure, state: ParserState) => boolean;
8
8
  type AudioCodecInfo = {
9
9
  format: string;
@@ -4,8 +4,8 @@ exports.getAudioCodecFromTrack = exports.getAudioCodecStringFromTrak = exports.g
4
4
  const traversal_1 = require("./boxes/iso-base-media/traversal");
5
5
  const get_fps_1 = require("./get-fps");
6
6
  const get_tracks_1 = require("./get-tracks");
7
- const getAudioCodec = (boxes, parserState) => {
8
- const tracks = (0, get_tracks_1.getTracks)(boxes, parserState);
7
+ const getAudioCodec = (parserState) => {
8
+ const tracks = (0, get_tracks_1.getTracks)(parserState);
9
9
  const allTracks = tracks.audioTracks.length +
10
10
  tracks.otherTracks.length +
11
11
  tracks.videoTracks.length;
@@ -23,7 +23,7 @@ const getAudioCodec = (boxes, parserState) => {
23
23
  };
24
24
  exports.getAudioCodec = getAudioCodec;
25
25
  const hasAudioCodec = (boxes, state) => {
26
- return (0, get_tracks_1.hasTracks)(boxes, state);
26
+ return (0, get_tracks_1.getHasTracks)(boxes, state);
27
27
  };
28
28
  exports.hasAudioCodec = hasAudioCodec;
29
29
  const getCodecSpecificatorFromEsdsBox = ({ child, }) => {
@@ -12,12 +12,16 @@ const getContainer = (segments) => {
12
12
  if (segments.type === 'transport-stream') {
13
13
  return 'transport-stream';
14
14
  }
15
+ if (segments.type === 'mp3') {
16
+ return 'mp3';
17
+ }
15
18
  if (segments.type === 'riff') {
16
19
  if ((0, traversal_1.isRiffAvi)(segments)) {
17
20
  return 'avi';
18
21
  }
22
+ throw new Error('Unknown RIFF container ' + segments.type);
19
23
  }
20
- throw new Error('Unknown container');
24
+ throw new Error('Unknown container ' + segments);
21
25
  };
22
26
  exports.getContainer = getContainer;
23
27
  const hasContainer = (boxes) => {
@@ -9,5 +9,5 @@ export type ExpandedDimensions = Dimensions & {
9
9
  unrotatedWidth: number;
10
10
  unrotatedHeight: number;
11
11
  };
12
- export declare const getDimensions: (boxes: Structure, state: ParserState) => ExpandedDimensions;
12
+ export declare const getDimensions: (boxes: Structure, state: ParserState) => ExpandedDimensions | null;
13
13
  export declare const hasDimensions: (boxes: Structure, state: ParserState) => boolean;
@@ -3,8 +3,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.hasDimensions = exports.getDimensions = void 0;
4
4
  const get_tracks_1 = require("./get-tracks");
5
5
  const getDimensions = (boxes, state) => {
6
- const { videoTracks } = (0, get_tracks_1.getTracks)(boxes, state);
6
+ const { videoTracks } = (0, get_tracks_1.getTracks)(state);
7
7
  if (!videoTracks.length) {
8
+ if (boxes.type === 'mp3') {
9
+ return null;
10
+ }
8
11
  throw new Error('Expected video track');
9
12
  }
10
13
  const firstVideoTrack = videoTracks[0];
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.hasSlowDuration = exports.hasDuration = exports.getDuration = exports.isMatroska = void 0;
4
4
  const get_sample_positions_from_track_1 = require("./boxes/iso-base-media/get-sample-positions-from-track");
5
5
  const traversal_1 = require("./boxes/iso-base-media/traversal");
6
+ const get_duration_1 = require("./boxes/mp3/get-duration");
6
7
  const traversal_2 = require("./boxes/riff/traversal");
7
8
  const get_tracks_1 = require("./get-tracks");
8
9
  const getDurationFromMatroska = (segments) => {
@@ -50,7 +51,7 @@ const getDurationFromIsoBaseMedia = (structure, parserState) => {
50
51
  if (mvhdBox.durationInSeconds > 0) {
51
52
  return mvhdBox.durationInSeconds;
52
53
  }
53
- const tracks = (0, get_tracks_1.getTracks)(structure, parserState);
54
+ const tracks = (0, get_tracks_1.getTracks)(parserState);
54
55
  const allTracks = [
55
56
  ...tracks.videoTracks,
56
57
  ...tracks.audioTracks,
@@ -92,13 +93,16 @@ const getDuration = (structure, parserState) => {
92
93
  if (structure.type === 'transport-stream') {
93
94
  return null;
94
95
  }
96
+ if (structure.type === 'mp3') {
97
+ return (0, get_duration_1.getDurationFromMp3)(parserState);
98
+ }
95
99
  throw new Error('Has no duration ' + structure);
96
100
  };
97
101
  exports.getDuration = getDuration;
98
102
  // `duration` just grabs from metadata, and otherwise returns null
99
103
  // Therefore just checking if we have tracks
100
104
  const hasDuration = (structure, parserState) => {
101
- return (0, get_tracks_1.hasTracks)(structure, parserState);
105
+ return (0, get_tracks_1.getHasTracks)(structure, parserState);
102
106
  };
103
107
  exports.hasDuration = hasDuration;
104
108
  // `slowDuration` does through everything, and therefore is false
@@ -25,6 +25,7 @@ const getFieldsFromCallback = ({ fields, callbacks, }) => {
25
25
  slowFps: Boolean(callbacks.onSlowFps),
26
26
  slowNumberOfFrames: Boolean(callbacks.onSlowNumberOfFrames),
27
27
  keyframes: Boolean(callbacks.onKeyframes),
28
+ images: Boolean(callbacks.onImages),
28
29
  ...fields,
29
30
  };
30
31
  return newFields;
package/dist/get-fps.js CHANGED
@@ -101,6 +101,9 @@ const getFps = (segments) => {
101
101
  if (segments.type === 'transport-stream') {
102
102
  return null;
103
103
  }
104
+ if (segments.type === 'mp3') {
105
+ return null;
106
+ }
104
107
  throw new Error('Cannot get fps, not implemented');
105
108
  };
106
109
  exports.getFps = getFps;
@@ -1,4 +1,4 @@
1
1
  import type { Structure } from './parse-result';
2
2
  import type { ParserState } from './state/parser-state';
3
- export declare const getIsHdr: (boxes: Structure, state: ParserState) => boolean;
3
+ export declare const getIsHdr: (state: ParserState) => boolean;
4
4
  export declare const hasHdr: (boxes: Structure, state: ParserState) => boolean;
@@ -7,12 +7,12 @@ const isVideoTrackHdr = (track) => {
7
7
  track.color.transferCharacteristics === 'arib-std-b67' &&
8
8
  track.color.primaries === 'bt2020');
9
9
  };
10
- const getIsHdr = (boxes, state) => {
11
- const { videoTracks } = (0, get_tracks_1.getTracks)(boxes, state);
10
+ const getIsHdr = (state) => {
11
+ const { videoTracks } = (0, get_tracks_1.getTracks)(state);
12
12
  return videoTracks.some((track) => isVideoTrackHdr(track));
13
13
  };
14
14
  exports.getIsHdr = getIsHdr;
15
15
  const hasHdr = (boxes, state) => {
16
- return (0, get_tracks_1.hasTracks)(boxes, state);
16
+ return (0, get_tracks_1.getHasTracks)(boxes, state);
17
17
  };
18
18
  exports.hasHdr = hasHdr;
@@ -12,7 +12,7 @@ const getKeyframes = (structure) => {
12
12
  exports.getKeyframes = getKeyframes;
13
13
  const hasKeyframes = (structure, parserState) => {
14
14
  if (structure.type === 'iso-base-media') {
15
- return (0, get_tracks_1.hasTracks)(structure, parserState);
15
+ return (0, get_tracks_1.getHasTracks)(structure, parserState);
16
16
  }
17
17
  // Has, but will be null
18
18
  return true;
@@ -57,11 +57,11 @@ export type OtherTrack = {
57
57
  export type Track = VideoTrack | AudioTrack | OtherTrack;
58
58
  export declare const getNumberOfTracks: (moovBox: MoovBox) => number;
59
59
  export declare const isoBaseMediaHasTracks: (structure: IsoBaseMediaStructure) => boolean;
60
- export declare const hasTracks: (structure: Structure, state: ParserState) => boolean;
60
+ export declare const getHasTracks: (structure: Structure, state: ParserState) => boolean;
61
61
  export declare const getTracksFromIsoBaseMedia: (segments: IsoBaseMediaBox[]) => {
62
62
  videoTracks: VideoTrack[];
63
63
  audioTracks: AudioTrack[];
64
64
  otherTracks: OtherTrack[];
65
65
  };
66
- export declare const getTracks: (segments: Structure, state: ParserState) => AllTracks;
66
+ export declare const getTracks: (state: ParserState) => AllTracks;
67
67
  export {};
@@ -1,8 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getTracks = exports.getTracksFromIsoBaseMedia = exports.hasTracks = exports.isoBaseMediaHasTracks = exports.getNumberOfTracks = void 0;
3
+ exports.getTracks = exports.getTracksFromIsoBaseMedia = exports.getHasTracks = exports.isoBaseMediaHasTracks = exports.getNumberOfTracks = void 0;
4
4
  const make_track_1 = require("./boxes/iso-base-media/make-track");
5
5
  const traversal_1 = require("./boxes/iso-base-media/traversal");
6
+ const get_tracks_from_mp3_1 = require("./boxes/mp3/get-tracks-from-mp3");
6
7
  const get_tracks_from_avi_1 = require("./boxes/riff/get-tracks-from-avi");
7
8
  const get_tracks_1 = require("./boxes/transport-stream/get-tracks");
8
9
  const get_ready_tracks_1 = require("./boxes/webm/get-ready-tracks");
@@ -25,7 +26,7 @@ const isoBaseMediaHasTracks = (structure) => {
25
26
  return tracks.length === numberOfTracks;
26
27
  };
27
28
  exports.isoBaseMediaHasTracks = isoBaseMediaHasTracks;
28
- const hasTracks = (structure, state) => {
29
+ const getHasTracks = (structure, state) => {
29
30
  if (structure.type === 'matroska') {
30
31
  const mainSegment = (0, traversal_2.getMainSegment)(structure.boxes);
31
32
  if (!mainSegment) {
@@ -37,14 +38,17 @@ const hasTracks = (structure, state) => {
37
38
  return (0, exports.isoBaseMediaHasTracks)(structure);
38
39
  }
39
40
  if (structure.type === 'riff') {
40
- return (0, get_tracks_from_avi_1.hasAllTracksFromAvi)(structure, state);
41
+ return (0, get_tracks_from_avi_1.hasAllTracksFromAvi)(state);
41
42
  }
42
43
  if (structure.type === 'transport-stream') {
43
- return (0, get_tracks_1.hasAllTracksFromTransportStream)(structure, state);
44
+ return (0, get_tracks_1.hasAllTracksFromTransportStream)(state);
45
+ }
46
+ if (structure.type === 'mp3') {
47
+ return state.callbacks.tracks.getTracks().length > 0;
44
48
  }
45
49
  throw new Error('Unknown container ' + structure);
46
50
  };
47
- exports.hasTracks = hasTracks;
51
+ exports.getHasTracks = getHasTracks;
48
52
  const getTracksFromMa = (segments, state) => {
49
53
  const videoTracks = [];
50
54
  const audioTracks = [];
@@ -106,19 +110,23 @@ const getTracksFromIsoBaseMedia = (segments) => {
106
110
  };
107
111
  };
108
112
  exports.getTracksFromIsoBaseMedia = getTracksFromIsoBaseMedia;
109
- const getTracks = (segments, state) => {
110
- if (segments.type === 'matroska') {
111
- return getTracksFromMa(segments.boxes, state);
113
+ const getTracks = (state) => {
114
+ const structure = state.structure.getStructure();
115
+ if (structure.type === 'matroska') {
116
+ return getTracksFromMa(structure.boxes, state);
117
+ }
118
+ if (structure.type === 'iso-base-media') {
119
+ return (0, exports.getTracksFromIsoBaseMedia)(structure.boxes);
112
120
  }
113
- if (segments.type === 'iso-base-media') {
114
- return (0, exports.getTracksFromIsoBaseMedia)(segments.boxes);
121
+ if (structure.type === 'riff') {
122
+ return (0, get_tracks_from_avi_1.getTracksFromAvi)(structure, state);
115
123
  }
116
- if (segments.type === 'riff') {
117
- return (0, get_tracks_from_avi_1.getTracksFromAvi)(segments, state);
124
+ if (structure.type === 'transport-stream') {
125
+ return (0, get_tracks_1.getTracksFromTransportStream)(state);
118
126
  }
119
- if (segments.type === 'transport-stream') {
120
- return (0, get_tracks_1.getTracksFromTransportStream)(segments, state);
127
+ if (structure.type === 'mp3') {
128
+ return (0, get_tracks_from_mp3_1.getTracksFromMp3)(state);
121
129
  }
122
- throw new Error(`Unknown container${segments}`);
130
+ throw new Error(`Unknown container${structure}`);
123
131
  };
124
132
  exports.getTracks = getTracks;
@@ -2,7 +2,7 @@ import type { TrakBox } from './boxes/iso-base-media/trak/trak';
2
2
  import { type MediaParserVideoCodec, type VideoTrackColorParams } from './get-tracks';
3
3
  import type { Structure } from './parse-result';
4
4
  import type { ParserState } from './state/parser-state';
5
- export declare const getVideoCodec: (boxes: Structure, state: ParserState) => MediaParserVideoCodec | null;
5
+ export declare const getVideoCodec: (state: ParserState) => MediaParserVideoCodec | null;
6
6
  export declare const hasVideoCodec: (boxes: Structure, state: ParserState) => boolean;
7
7
  export declare const getVideoPrivateData: (trakBox: TrakBox) => Uint8Array | null;
8
8
  export declare const getIsoBmColrConfig: (trakBox: TrakBox) => VideoTrackColorParams | null;
@@ -5,14 +5,14 @@ const color_1 = require("./boxes/avc/color");
5
5
  const av1_codec_private_1 = require("./boxes/webm/av1-codec-private");
6
6
  const get_sample_aspect_ratio_1 = require("./get-sample-aspect-ratio");
7
7
  const get_tracks_1 = require("./get-tracks");
8
- const getVideoCodec = (boxes, state) => {
8
+ const getVideoCodec = (state) => {
9
9
  var _a, _b;
10
- const track = (0, get_tracks_1.getTracks)(boxes, state);
10
+ const track = (0, get_tracks_1.getTracks)(state);
11
11
  return (_b = (_a = track.videoTracks[0]) === null || _a === void 0 ? void 0 : _a.codecWithoutConfig) !== null && _b !== void 0 ? _b : null;
12
12
  };
13
13
  exports.getVideoCodec = getVideoCodec;
14
14
  const hasVideoCodec = (boxes, state) => {
15
- return (0, get_tracks_1.hasTracks)(boxes, state);
15
+ return (0, get_tracks_1.getHasTracks)(boxes, state);
16
16
  };
17
17
  exports.hasVideoCodec = hasVideoCodec;
18
18
  const getVideoPrivateData = (trakBox) => {
@@ -11,6 +11,7 @@ const get_keyframes_1 = require("./get-keyframes");
11
11
  const get_tracks_1 = require("./get-tracks");
12
12
  const get_video_codec_1 = require("./get-video-codec");
13
13
  const may_skip_video_data_1 = require("./may-skip-video-data/may-skip-video-data");
14
+ const get_metadata_1 = require("./metadata/get-metadata");
14
15
  const getAvailableInfo = ({ fieldsToFetch, state, }) => {
15
16
  const keys = Object.entries(fieldsToFetch).filter(([, value]) => value);
16
17
  const structure = state.structure.getStructureOrNull();
@@ -47,7 +48,7 @@ const getAvailableInfo = ({ fieldsToFetch, state, }) => {
47
48
  return Boolean(structure && (0, get_audio_codec_1.hasAudioCodec)(structure, state));
48
49
  }
49
50
  if (key === 'tracks') {
50
- return Boolean(structure && (0, get_tracks_1.hasTracks)(structure, state));
51
+ return Boolean(structure && (0, get_tracks_1.getHasTracks)(structure, state));
51
52
  }
52
53
  if (key === 'keyframes') {
53
54
  return Boolean(structure && (0, get_keyframes_1.hasKeyframes)(structure, state));
@@ -67,8 +68,8 @@ const getAvailableInfo = ({ fieldsToFetch, state, }) => {
67
68
  if (key === 'container') {
68
69
  return Boolean(structure && (0, get_container_1.hasContainer)(structure));
69
70
  }
70
- if (key === 'metadata' || key === 'location') {
71
- return false;
71
+ if (key === 'metadata' || key === 'location' || key === 'images') {
72
+ return Boolean(structure && (0, get_metadata_1.hasMetadata)(structure));
72
73
  }
73
74
  if (key === 'slowKeyframes') {
74
75
  return false;
package/dist/index.d.ts CHANGED
@@ -5,6 +5,7 @@ export { IsAGifError, IsAnImageError, IsAnUnsupportedAudioTypeError, IsAnUnsuppo
5
5
  export type { SamplePosition } from './get-sample-positions';
6
6
  export { MetadataEntry } from './metadata/get-metadata';
7
7
  export { MediaParserKeyframe } from './options';
8
+ export type { MediaParserEmbeddedImage } from './state/images';
8
9
  export { AudioTrack, MediaParserAudioCodec, MediaParserVideoCodec, OtherTrack, Track, VideoTrack, VideoTrackColorParams, } from './get-tracks';
9
10
  export type { Options, ParseMediaContainer, ParseMediaDynamicOptions, ParseMediaFields, ParseMediaOnProgress, ParseMediaOptions, ParseMediaProgress, ParseMediaResult, TracksField, } from './options';
10
11
  export { parseMedia } from './parse-media';
@@ -664,7 +665,6 @@ export declare const MediaParserInternals: {
664
665
  peekB: (length: number) => void;
665
666
  peekD: (length: number) => void;
666
667
  getBits: (bits: number) => number;
667
- byteLength: () => number;
668
668
  bytesRemaining: () => number;
669
669
  leb128: () => number;
670
670
  removeBytesRead: () => void;
@@ -694,6 +694,9 @@ export declare const MediaParserInternals: {
694
694
  getPascalString: () => number[];
695
695
  getUint(length: number): number;
696
696
  getByteString(length: number, trimTrailingZeroes: boolean): string;
697
+ planBytes: (size: number) => {
698
+ discardRest: () => Uint8Array;
699
+ };
697
700
  getFloat64: () => number;
698
701
  readUntilNullTerminator: () => string;
699
702
  getFloat32: () => number;
@@ -701,23 +704,22 @@ export declare const MediaParserInternals: {
701
704
  getInt32Le: () => number;
702
705
  getInt32: () => number;
703
706
  destroy: () => void;
704
- disallowDiscard: () => void;
705
- allowDiscard: () => void;
706
707
  startBox: (size: number) => {
707
708
  discardRest: () => void;
708
709
  expectNoMoreBytes: () => void;
709
710
  };
710
711
  readExpGolomb: () => number;
712
+ startCheckpoint: () => {
713
+ returnToCheckpoint: () => void;
714
+ };
711
715
  };
712
- parseStsd: ({ iterator, offset, size, state, signal, fields, }: {
716
+ parseStsd: ({ iterator, offset, size, state, }: {
713
717
  iterator: import("./buffer-iterator").BufferIterator;
714
718
  offset: number;
715
719
  size: number;
716
720
  state: import("./state/parser-state").ParserState;
717
- signal: AbortSignal | null;
718
- fields: import("./options").Options<import("./options").ParseMediaFields>;
719
721
  }) => Promise<import("./boxes/iso-base-media/stsd/stsd").StsdBox>;
720
- makeParserState: ({ hasAudioTrackHandlers, hasVideoTrackHandlers, signal, getIterator, fields, onAudioTrack, onVideoTrack, supportsContentRange, }: {
722
+ makeParserState: ({ hasAudioTrackHandlers, hasVideoTrackHandlers, signal, getIterator, fields, onAudioTrack, onVideoTrack, supportsContentRange, contentLength, logLevel, }: {
721
723
  hasAudioTrackHandlers: boolean;
722
724
  hasVideoTrackHandlers: boolean;
723
725
  signal: AbortSignal | undefined;
@@ -726,6 +728,8 @@ export declare const MediaParserInternals: {
726
728
  supportsContentRange: boolean;
727
729
  onAudioTrack: import("./webcodec-sample-types").OnAudioTrack | null;
728
730
  onVideoTrack: import("./webcodec-sample-types").OnVideoTrack | null;
731
+ contentLength: number | null;
732
+ logLevel: LogLevel;
729
733
  }) => {
730
734
  riff: {
731
735
  getAvcProfile: () => import("./state/parser-state").SpsAndPps | null;
@@ -734,6 +738,38 @@ export declare const MediaParserInternals: {
734
738
  getNextTrackIndex: () => number;
735
739
  incrementNextTrackIndex: () => void;
736
740
  };
741
+ transportStream: {
742
+ nextPesHeaderStore: {
743
+ setNextPesHeader: (pesHeader: import("./boxes/transport-stream/parse-pes").PacketPes) => void;
744
+ getNextPesHeader: () => import("./boxes/transport-stream/parse-pes").PacketPes;
745
+ };
746
+ streamBuffers: Map<number, import("./boxes/transport-stream/process-stream-buffers").TransportStreamPacketBuffer>;
747
+ };
748
+ webm: {
749
+ onTrackEntrySegment: import("./boxes/webm/segments").OnTrackEntrySegment;
750
+ getTrackInfoByNumber: (id: number) => import("./boxes/webm/segments/track-entry").TrackInfo;
751
+ setTimestampOffset: (byteOffset: number, timestamp: number) => void;
752
+ getTimestampOffsetForByteOffset: (byteOffset: number) => number | undefined;
753
+ timescale: null;
754
+ getTimescale: () => number;
755
+ setTimescale: (newTimescale: number) => void;
756
+ addSegment: (seg: Omit<import("./state/webm").SegmentSection, "index">) => void;
757
+ addCluster: (cluster: import("./state/webm").ClusterSection) => void;
758
+ isInsideSegment: (iterator: import("./buffer-iterator").BufferIterator) => import("./state/webm").SegmentSection | null;
759
+ isInsideCluster: (iterator: import("./buffer-iterator").BufferIterator) => import("./state/webm").ClusterSection | null;
760
+ };
761
+ iso: {
762
+ getShouldReturnToVideoSectionAfterEnd: () => boolean;
763
+ setShouldReturnToVideoSectionAfterEnd: (value: boolean) => void;
764
+ flatSamples: {
765
+ getSamples: () => import("./state/iso-base-media/cached-sample-positions").FlatSample[] | null;
766
+ setSamples: (samples: import("./state/iso-base-media/cached-sample-positions").FlatSample[]) => void;
767
+ };
768
+ };
769
+ mp3Info: {
770
+ getMp3Info: () => import("./state/mp3").Mp3Info | null;
771
+ setMp3Info: (info: import("./state/mp3").Mp3Info) => void;
772
+ };
737
773
  callbacks: {
738
774
  registerVideoSampleCallback: (id: number, callback: import("./webcodec-sample-types").OnVideoSample | null) => Promise<void>;
739
775
  onAudioSample: (trackId: number, audioSample: import("./webcodec-sample-types").AudioOrVideoSample) => Promise<void>;
@@ -752,6 +788,8 @@ export declare const MediaParserInternals: {
752
788
  };
753
789
  audioSampleCallbacks: Record<number, import("./webcodec-sample-types").OnAudioSample>;
754
790
  videoSampleCallbacks: Record<number, import("./webcodec-sample-types").OnVideoSample>;
791
+ hasAudioTrackHandlers: boolean;
792
+ hasVideoTrackHandlers: boolean;
755
793
  };
756
794
  getInternalStats: () => import("./state/parser-state").InternalStats;
757
795
  getSkipBytes: () => number;
@@ -768,30 +806,36 @@ export declare const MediaParserInternals: {
768
806
  onAudioTrack: import("./webcodec-sample-types").OnAudioTrack | null;
769
807
  onVideoTrack: import("./webcodec-sample-types").OnVideoTrack | null;
770
808
  supportsContentRange: boolean;
771
- webm: {
772
- onTrackEntrySegment: import("./boxes/webm/segments").OnTrackEntrySegment;
773
- getTrackInfoByNumber: (id: number) => import("./boxes/webm/segments/track-entry").TrackInfo;
774
- setTimestampOffset: (byteOffset: number, timestamp: number) => void;
775
- getTimestampOffsetForByteOffset: (byteOffset: number) => number | undefined;
776
- timescale: null;
777
- getTimescale: () => number;
778
- setTimescale: (newTimescale: number) => void;
779
- };
780
809
  emittedFields: import("./options").AllOptions<import("./options").ParseMediaFields>;
781
810
  fields: Partial<import("./options").AllOptions<import("./options").ParseMediaFields>>;
782
811
  slowDurationAndFps: {
783
- addSample: (videoSample: import("./webcodec-sample-types").AudioOrVideoSample) => void;
812
+ addVideoSample: (videoSample: import("./webcodec-sample-types").AudioOrVideoSample) => void;
813
+ addAudioSample: (audioSample: import("./webcodec-sample-types").AudioOrVideoSample) => void;
784
814
  getSlowDurationInSeconds: () => number;
785
815
  getFps: () => number;
786
816
  getSlowNumberOfFrames: () => number;
787
817
  };
818
+ contentLength: number | null;
819
+ images: {
820
+ images: import("./state/images").MediaParserEmbeddedImage[];
821
+ addImage: (image: import("./state/images").MediaParserEmbeddedImage) => void;
822
+ };
823
+ videoSection: {
824
+ setVideoSection: (section: {
825
+ start: number;
826
+ size: number;
827
+ }) => void;
828
+ getVideoSection: () => {
829
+ start: number;
830
+ size: number;
831
+ };
832
+ isInVideoSectionState: (iterator: import("./buffer-iterator").BufferIterator) => "no-section-defined" | "in-section" | "outside-section";
833
+ };
834
+ logLevel: "trace" | "verbose" | "info" | "warn" | "error";
788
835
  };
789
- processSample: ({ iterator, state: options, signal, logLevel, fields, }: {
836
+ processSample: ({ iterator, state, }: {
790
837
  iterator: import("./buffer-iterator").BufferIterator;
791
838
  state: import("./state/parser-state").ParserState;
792
- signal: AbortSignal | null;
793
- logLevel: LogLevel;
794
- fields: import("./options").Options<import("./options").ParseMediaFields>;
795
839
  }) => Promise<{
796
840
  sample: import("./boxes/iso-base-media/stsd/samples").Sample | null;
797
841
  }>;
package/dist/index.js CHANGED
@@ -29,7 +29,7 @@ exports.MediaParserInternals = {
29
29
  getArrayBufferIterator: buffer_iterator_1.getArrayBufferIterator,
30
30
  parseStsd: stsd_1.parseStsd,
31
31
  makeParserState: parser_state_1.makeParserState,
32
- processSample: samples_1.processSample,
32
+ processSample: samples_1.processIsoFormatBox,
33
33
  parseFtyp: ftyp_1.parseFtyp,
34
34
  parseEbml: parse_ebml_1.parseEbml,
35
35
  parseMvhd: mvhd_1.parseMvhd,
@@ -3,9 +3,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.maySkipVideoData = void 0;
4
4
  const need_samples_for_fields_1 = require("./need-samples-for-fields");
5
5
  const maySkipVideoData = ({ state }) => {
6
- return (state.callbacks.tracks.hasAllTracks() &&
6
+ const hasAllTracksAndNoCallbacks = state.callbacks.tracks.hasAllTracks() &&
7
7
  Object.values(state.callbacks.videoSampleCallbacks).length === 0 &&
8
- Object.values(state.callbacks.audioSampleCallbacks).length === 0 &&
8
+ Object.values(state.callbacks.audioSampleCallbacks).length === 0;
9
+ const hasNoTrackHandlers = !state.callbacks.hasAudioTrackHandlers &&
10
+ !state.callbacks.hasVideoTrackHandlers;
11
+ const noCallbacksNeeded = hasNoTrackHandlers || hasAllTracksAndNoCallbacks;
12
+ return (noCallbacksNeeded &&
9
13
  !(0, need_samples_for_fields_1.needsToIterateOverSamples)({
10
14
  emittedFields: state.emittedFields,
11
15
  fields: state.fields,
@@ -24,6 +24,7 @@ const needsSamples = {
24
24
  location: false,
25
25
  mimeType: false,
26
26
  keyframes: false,
27
+ images: false,
27
28
  };
28
29
  const needsToIterateOverSamples = ({ fields, emittedFields, }) => {
29
30
  const keys = Object.keys(fields !== null && fields !== void 0 ? fields : {});
@@ -5,3 +5,4 @@ export type MetadataEntry = {
5
5
  trackId: number | null;
6
6
  };
7
7
  export declare const getMetadata: (structure: Structure) => MetadataEntry[];
8
+ export declare const hasMetadata: (structure: Structure) => boolean;
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getMetadata = void 0;
3
+ exports.hasMetadata = exports.getMetadata = void 0;
4
+ const get_metadata_from_mp3_1 = require("../boxes/mp3/get-metadata-from-mp3");
4
5
  const metadata_from_iso_1 = require("./metadata-from-iso");
5
6
  const metadata_from_matroska_1 = require("./metadata-from-matroska");
6
7
  const metadata_from_riff_1 = require("./metadata-from-riff");
@@ -14,6 +15,20 @@ const getMetadata = (structure) => {
14
15
  if (structure.type === 'transport-stream') {
15
16
  return [];
16
17
  }
18
+ if (structure.type === 'mp3') {
19
+ const tags = (0, get_metadata_from_mp3_1.getMetadataFromMp3)(structure);
20
+ if (tags === null) {
21
+ throw new Error('Failed to get metadata from mp3');
22
+ }
23
+ return tags;
24
+ }
17
25
  return (0, metadata_from_iso_1.getMetadataFromIsoBase)(structure);
18
26
  };
19
27
  exports.getMetadata = getMetadata;
28
+ const hasMetadata = (structure) => {
29
+ if (structure.type === 'mp3') {
30
+ return (0, get_metadata_from_mp3_1.getMetadataFromMp3)(structure) !== null;
31
+ }
32
+ return false;
33
+ };
34
+ exports.hasMetadata = hasMetadata;