@remotion/media-parser 4.0.240 → 4.0.242

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 (186) hide show
  1. package/dist/add-avc-profile-to-track.js +2 -2
  2. package/dist/boxes/avc/codec-private.d.ts +1 -1
  3. package/dist/boxes/avc/codec-private.js +2 -2
  4. package/dist/boxes/avc/create-sps-pps-data.d.ts +2 -0
  5. package/dist/boxes/avc/create-sps-pps-data.js +28 -0
  6. package/dist/boxes/iso-base-media/get-keyframes.d.ts +3 -0
  7. package/dist/boxes/iso-base-media/get-keyframes.js +30 -0
  8. package/dist/boxes/iso-base-media/mdat/mdat.d.ts +3 -3
  9. package/dist/boxes/iso-base-media/mdat/mdat.js +9 -5
  10. package/dist/boxes/iso-base-media/moov/moov.d.ts +3 -3
  11. package/dist/boxes/iso-base-media/moov/moov.js +5 -4
  12. package/dist/boxes/iso-base-media/process-box.d.ts +9 -9
  13. package/dist/boxes/iso-base-media/process-box.js +48 -56
  14. package/dist/boxes/iso-base-media/stsd/mebx.d.ts +3 -3
  15. package/dist/boxes/iso-base-media/stsd/mebx.js +5 -4
  16. package/dist/boxes/iso-base-media/stsd/samples.d.ts +5 -5
  17. package/dist/boxes/iso-base-media/stsd/samples.js +19 -16
  18. package/dist/boxes/iso-base-media/stsd/stsd.d.ts +3 -3
  19. package/dist/boxes/iso-base-media/stsd/stsd.js +2 -2
  20. package/dist/boxes/iso-base-media/trak/trak.d.ts +3 -3
  21. package/dist/boxes/iso-base-media/trak/trak.js +7 -6
  22. package/dist/boxes/riff/expect-riff-box.d.ts +3 -3
  23. package/dist/boxes/riff/expect-riff-box.js +5 -5
  24. package/dist/boxes/riff/get-tracks-from-avi.js +1 -1
  25. package/dist/boxes/riff/parse-box.d.ts +7 -7
  26. package/dist/boxes/riff/parse-box.js +29 -24
  27. package/dist/boxes/riff/parse-list-box.d.ts +3 -3
  28. package/dist/boxes/riff/parse-list-box.js +2 -2
  29. package/dist/boxes/riff/parse-movi.d.ts +5 -5
  30. package/dist/boxes/riff/parse-movi.js +35 -20
  31. package/dist/boxes/riff/parse-riff-box.d.ts +3 -3
  32. package/dist/boxes/riff/parse-riff-box.js +2 -2
  33. package/dist/boxes/transport-stream/adts-header.d.ts +1 -1
  34. package/dist/boxes/transport-stream/discard-rest-of-packet.d.ts +1 -1
  35. package/dist/boxes/transport-stream/get-tracks.js +1 -1
  36. package/dist/boxes/transport-stream/handle-aac-packet.d.ts +4 -3
  37. package/dist/boxes/transport-stream/handle-aac-packet.js +6 -4
  38. package/dist/boxes/transport-stream/handle-avc-packet.d.ts +4 -3
  39. package/dist/boxes/transport-stream/handle-avc-packet.js +8 -6
  40. package/dist/boxes/transport-stream/parse-packet.d.ts +3 -3
  41. package/dist/boxes/transport-stream/parse-packet.js +2 -2
  42. package/dist/boxes/transport-stream/parse-stream-packet.d.ts +3 -3
  43. package/dist/boxes/transport-stream/parse-stream-packet.js +14 -7
  44. package/dist/boxes/transport-stream/parse-transport-stream.d.ts +5 -6
  45. package/dist/boxes/transport-stream/parse-transport-stream.js +10 -9
  46. package/dist/boxes/transport-stream/process-stream-buffers.d.ts +6 -5
  47. package/dist/boxes/transport-stream/process-stream-buffers.js +18 -8
  48. package/dist/boxes/webm/ebml.d.ts +1 -1
  49. package/dist/boxes/webm/get-sample-from-block.d.ts +2 -2
  50. package/dist/boxes/webm/get-sample-from-block.js +8 -4
  51. package/dist/boxes/webm/make-header.d.ts +3 -3
  52. package/dist/boxes/webm/parse-ebml.d.ts +4 -4
  53. package/dist/boxes/webm/parse-ebml.js +18 -18
  54. package/dist/boxes/webm/parse-webm-header.d.ts +5 -5
  55. package/dist/boxes/webm/parse-webm-header.js +6 -5
  56. package/dist/boxes/webm/segments/parse-children.d.ts +5 -5
  57. package/dist/boxes/webm/segments/parse-children.js +12 -13
  58. package/dist/boxes/webm/segments.d.ts +3 -3
  59. package/dist/boxes/webm/segments.js +13 -13
  60. package/dist/buffer-iterator.d.ts +2 -6
  61. package/dist/buffer-iterator.js +4 -29
  62. package/dist/convert-audio-or-video-sample.js +2 -0
  63. package/dist/create/iso-base-media/codec-specific/avc1.d.ts +1 -1
  64. package/dist/create/iso-base-media/codec-specific/create-codec-specific-data.d.ts +1 -1
  65. package/dist/create/iso-base-media/codec-specific/mp4a.d.ts +1 -1
  66. package/dist/create/iso-base-media/create-colr.d.ts +1 -1
  67. package/dist/create/iso-base-media/create-ftyp.d.ts +2 -2
  68. package/dist/create/iso-base-media/create-ilst.d.ts +1 -1
  69. package/dist/create/iso-base-media/create-mdia.d.ts +1 -1
  70. package/dist/create/iso-base-media/create-moov.d.ts +1 -1
  71. package/dist/create/iso-base-media/create-mvhd.d.ts +1 -1
  72. package/dist/create/iso-base-media/create-trak.d.ts +1 -1
  73. package/dist/create/iso-base-media/create-udta.d.ts +1 -1
  74. package/dist/create/iso-base-media/create-url.d.ts +1 -1
  75. package/dist/create/iso-base-media/ilst/create-cmt.d.ts +1 -1
  76. package/dist/create/iso-base-media/ilst/create-too.d.ts +1 -1
  77. package/dist/create/iso-base-media/mdia/create-mdhd.d.ts +1 -1
  78. package/dist/create/iso-base-media/mp4-header.d.ts +1 -1
  79. package/dist/create/iso-base-media/primitives.d.ts +13 -13
  80. package/dist/create/iso-base-media/serialize-track.d.ts +1 -1
  81. package/dist/create/iso-base-media/trak/create-tkhd.d.ts +2 -2
  82. package/dist/create/iso-base-media/trak/mdia/create-minf.d.ts +1 -1
  83. package/dist/create/iso-base-media/trak/mdia/minf/create-dinf.d.ts +1 -1
  84. package/dist/create/iso-base-media/trak/mdia/minf/create-smhd.d.ts +1 -1
  85. package/dist/create/iso-base-media/trak/mdia/minf/create-stbl.d.ts +1 -1
  86. package/dist/create/iso-base-media/trak/mdia/minf/create-vmhd.d.ts +1 -1
  87. package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-ctts.d.ts +1 -1
  88. package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-stco.d.ts +1 -1
  89. package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-stsc.d.ts +1 -1
  90. package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-stss.d.ts +1 -1
  91. package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-stsz.d.ts +1 -1
  92. package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-stts.d.ts +1 -1
  93. package/dist/create/iso-base-media/trak/mdia/minf/stbl/stsd/create-avc1.d.ts +1 -1
  94. package/dist/create/iso-base-media/trak/mdia/minf/stbl/stsd/create-avcc.d.ts +1 -1
  95. package/dist/create/iso-base-media/trak/mdia/minf/stbl/stsd/create-pasp.d.ts +1 -1
  96. package/dist/create/iso-base-media/udta/create-meta.d.ts +1 -1
  97. package/dist/create/iso-base-media/udta/meta/create-hdlr.d.ts +1 -1
  98. package/dist/create/matroska/cluster-segment.d.ts +1 -1
  99. package/dist/emit-available-info.d.ts +6 -4
  100. package/dist/emit-available-info.js +231 -79
  101. package/dist/errors/detect-file-type.d.ts +1 -0
  102. package/dist/errors/detect-file-type.js +88 -0
  103. package/dist/errors/file-types.d.ts +1 -0
  104. package/dist/errors/file-types.js +88 -0
  105. package/dist/errors.d.ts +68 -0
  106. package/dist/errors.js +71 -0
  107. package/dist/esm/from-fetch.mjs +1 -0
  108. package/dist/esm/from-node.mjs +1 -0
  109. package/dist/esm/from-web-file.mjs +2 -1
  110. package/dist/esm/index.mjs +1457 -542
  111. package/dist/file-types/bmp.d.ts +6 -0
  112. package/dist/file-types/bmp.js +23 -0
  113. package/dist/file-types/detect-file-type.d.ts +42 -0
  114. package/dist/file-types/detect-file-type.js +59 -0
  115. package/dist/file-types/get-jpeg-dimensions.d.ts +4 -0
  116. package/dist/file-types/get-jpeg-dimensions.js +32 -0
  117. package/dist/file-types/index.d.ts +2 -0
  118. package/dist/file-types/index.js +57 -0
  119. package/dist/file-types/jpeg.d.ts +12 -0
  120. package/dist/file-types/jpeg.js +44 -0
  121. package/dist/file-types/pdf.d.ts +4 -0
  122. package/dist/file-types/pdf.js +12 -0
  123. package/dist/file-types/png.d.ts +10 -0
  124. package/dist/file-types/png.js +32 -0
  125. package/dist/file-types/webp.d.ts +6 -0
  126. package/dist/file-types/webp.js +69 -0
  127. package/dist/file-types.d.ts +1 -0
  128. package/dist/file-types.js +88 -0
  129. package/dist/get-audio-codec.d.ts +1 -1
  130. package/dist/get-duration.d.ts +1 -0
  131. package/dist/get-duration.js +14 -1
  132. package/dist/get-fields-from-callbacks.d.ts +5 -0
  133. package/dist/get-fields-from-callbacks.js +32 -0
  134. package/dist/get-fps.d.ts +1 -0
  135. package/dist/get-fps.js +17 -12
  136. package/dist/get-keyframes.d.ts +5 -0
  137. package/dist/get-keyframes.js +20 -0
  138. package/dist/get-tracks.d.ts +7 -1
  139. package/dist/get-tracks.js +15 -10
  140. package/dist/has-all-info.d.ts +5 -4
  141. package/dist/has-all-info.js +31 -5
  142. package/dist/index.d.ts +2 -0
  143. package/dist/index.js +7 -1
  144. package/dist/may-skip-video-data/may-skip-video-data.d.ts +4 -0
  145. package/dist/may-skip-video-data/may-skip-video-data.js +14 -0
  146. package/dist/may-skip-video-data/need-samples-for-fields.d.ts +5 -0
  147. package/dist/may-skip-video-data/need-samples-for-fields.js +33 -0
  148. package/dist/options.d.ts +68 -53
  149. package/dist/parse-media.js +42 -31
  150. package/dist/parse-result.d.ts +2 -4
  151. package/dist/parse-video.d.ts +8 -5
  152. package/dist/parse-video.js +94 -17
  153. package/dist/probing/detect-file-type.d.ts +1 -0
  154. package/dist/probing/detect-file-type.js +88 -0
  155. package/dist/probing/get-jpeg-dimensions.d.ts +4 -0
  156. package/dist/probing/get-jpeg-dimensions.js +32 -0
  157. package/dist/readers/from-fetch.js +1 -0
  158. package/dist/readers/from-node.js +1 -0
  159. package/dist/readers/from-web-file.js +1 -0
  160. package/dist/readers/reader.d.ts +1 -0
  161. package/dist/register-track.d.ts +5 -5
  162. package/dist/register-track.js +12 -12
  163. package/dist/state/can-skip-tracks.js +6 -0
  164. package/dist/state/emitted-fields.d.ts +2 -0
  165. package/dist/state/emitted-fields.js +31 -0
  166. package/dist/state/has-tracks-section.d.ts +1 -0
  167. package/dist/state/keyframes.d.ts +6 -0
  168. package/dist/state/keyframes.js +15 -0
  169. package/dist/state/parser-state.d.ts +60 -29
  170. package/dist/state/parser-state.js +32 -150
  171. package/dist/state/riff.d.ts +10 -0
  172. package/dist/state/riff.js +32 -0
  173. package/dist/state/sample-callbacks.d.ts +31 -0
  174. package/dist/state/sample-callbacks.js +96 -0
  175. package/dist/state/slow-duration-fps.d.ts +8 -0
  176. package/dist/state/slow-duration-fps.js +36 -0
  177. package/dist/state/structure.d.ts +7 -0
  178. package/dist/state/structure.js +21 -0
  179. package/dist/state/tracks-and-samples.d.ts +0 -0
  180. package/dist/state/tracks-and-samples.js +1 -0
  181. package/dist/state/webm.d.ts +11 -0
  182. package/dist/state/webm.js +67 -0
  183. package/dist/version.d.ts +1 -1
  184. package/dist/version.js +1 -1
  185. package/dist/webcodec-sample-types.d.ts +2 -0
  186. package/package.json +3 -3
package/dist/get-fps.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.hasFps = exports.getFps = exports.getFpsFromMp4TrakBox = exports.getTimescaleAndDuration = exports.trakBoxContainsVideo = exports.trakBoxContainsAudio = void 0;
3
+ exports.hasFps = exports.hasFpsSuitedForSlowFps = exports.getFps = exports.getFpsFromMp4TrakBox = exports.getTimescaleAndDuration = exports.trakBoxContainsVideo = exports.trakBoxContainsAudio = void 0;
4
4
  const traversal_1 = require("./boxes/iso-base-media/traversal");
5
5
  const traversal_2 = require("./boxes/riff/traversal");
6
6
  const calculateFps = ({ sttsBox, timeScale, durationInSamples, }) => {
@@ -93,31 +93,36 @@ const getFps = (segments) => {
93
93
  if (segments.type === 'riff') {
94
94
  return getFpsFromAvi(segments);
95
95
  }
96
- // TODO: Matroska doesn't have fps
96
+ // People need to get it from slowFps
97
97
  if (segments.type === 'matroska') {
98
98
  return null;
99
99
  }
100
+ // People need to get it from slowFps
100
101
  if (segments.type === 'transport-stream') {
101
102
  return null;
102
103
  }
103
104
  throw new Error('Cannot get fps, not implemented');
104
105
  };
105
106
  exports.getFps = getFps;
106
- const hasFps = (boxes) => {
107
+ const hasFpsSuitedForSlowFps = (boxes) => {
107
108
  try {
108
- // Matroska and Transport stream has no FPS metadata
109
- // Not bothering to parse
110
- // Idea: `guaranteedFps` field
111
- if (boxes.type === 'matroska') {
112
- return true;
113
- }
114
- if (boxes.type === 'transport-stream') {
115
- return true;
116
- }
117
109
  return (0, exports.getFps)(boxes) !== null;
118
110
  }
119
111
  catch (_a) {
120
112
  return false;
121
113
  }
122
114
  };
115
+ exports.hasFpsSuitedForSlowFps = hasFpsSuitedForSlowFps;
116
+ const hasFps = (boxes) => {
117
+ // Matroska and Transport stream has no FPS metadata
118
+ // Not bothering to parse
119
+ // Users should use `slowFps` field
120
+ if (boxes.type === 'matroska') {
121
+ return true;
122
+ }
123
+ if (boxes.type === 'transport-stream') {
124
+ return true;
125
+ }
126
+ return (0, exports.hasFpsSuitedForSlowFps)(boxes);
127
+ };
123
128
  exports.hasFps = hasFps;
@@ -0,0 +1,5 @@
1
+ import type { MediaParserKeyframe } from './options';
2
+ import type { Structure } from './parse-result';
3
+ import type { ParserState } from './state/parser-state';
4
+ export declare const getKeyframes: (structure: Structure) => MediaParserKeyframe[] | null;
5
+ export declare const hasKeyframes: (structure: Structure, parserState: ParserState) => boolean;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.hasKeyframes = exports.getKeyframes = void 0;
4
+ const get_keyframes_1 = require("./boxes/iso-base-media/get-keyframes");
5
+ const get_tracks_1 = require("./get-tracks");
6
+ const getKeyframes = (structure) => {
7
+ if (structure.type === 'iso-base-media') {
8
+ return (0, get_keyframes_1.getKeyframesFromIsoBaseMedia)(structure);
9
+ }
10
+ return null;
11
+ };
12
+ exports.getKeyframes = getKeyframes;
13
+ const hasKeyframes = (structure, parserState) => {
14
+ if (structure.type === 'iso-base-media') {
15
+ return (0, get_tracks_1.hasTracks)(structure, parserState);
16
+ }
17
+ // Has, but will be null
18
+ return true;
19
+ };
20
+ exports.hasKeyframes = hasKeyframes;
@@ -2,7 +2,7 @@ import type { MatrixCoefficients, Primaries, TransferCharacteristics } from './b
2
2
  import type { MoovBox } from './boxes/iso-base-media/moov/moov';
3
3
  import type { TrakBox } from './boxes/iso-base-media/trak/trak';
4
4
  import type { AllTracks } from './boxes/riff/get-tracks-from-avi';
5
- import type { Structure } from './parse-result';
5
+ import type { IsoBaseMediaBox, IsoBaseMediaStructure, Structure } from './parse-result';
6
6
  import type { ParserState } from './state/parser-state';
7
7
  type SampleAspectRatio = {
8
8
  numerator: number;
@@ -56,6 +56,12 @@ export type OtherTrack = {
56
56
  };
57
57
  export type Track = VideoTrack | AudioTrack | OtherTrack;
58
58
  export declare const getNumberOfTracks: (moovBox: MoovBox) => number;
59
+ export declare const isoBaseMediaHasTracks: (structure: IsoBaseMediaStructure) => boolean;
59
60
  export declare const hasTracks: (structure: Structure, state: ParserState) => boolean;
61
+ export declare const getTracksFromIsoBaseMedia: (segments: IsoBaseMediaBox[]) => {
62
+ videoTracks: VideoTrack[];
63
+ audioTracks: AudioTrack[];
64
+ otherTracks: OtherTrack[];
65
+ };
60
66
  export declare const getTracks: (segments: Structure, state: ParserState) => AllTracks;
61
67
  export {};
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getTracks = exports.hasTracks = exports.getNumberOfTracks = void 0;
3
+ exports.getTracks = exports.getTracksFromIsoBaseMedia = exports.hasTracks = 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
6
  const get_tracks_from_avi_1 = require("./boxes/riff/get-tracks-from-avi");
@@ -15,6 +15,16 @@ const getNumberOfTracks = (moovBox) => {
15
15
  return mvHdBox.nextTrackId - 1;
16
16
  };
17
17
  exports.getNumberOfTracks = getNumberOfTracks;
18
+ const isoBaseMediaHasTracks = (structure) => {
19
+ const moovBox = (0, traversal_1.getMoovBox)(structure.boxes);
20
+ if (!moovBox) {
21
+ return false;
22
+ }
23
+ const numberOfTracks = (0, exports.getNumberOfTracks)(moovBox);
24
+ const tracks = (0, traversal_1.getTraks)(moovBox);
25
+ return tracks.length === numberOfTracks;
26
+ };
27
+ exports.isoBaseMediaHasTracks = isoBaseMediaHasTracks;
18
28
  const hasTracks = (structure, state) => {
19
29
  if (structure.type === 'matroska') {
20
30
  const mainSegment = (0, traversal_2.getMainSegment)(structure.boxes);
@@ -24,13 +34,7 @@ const hasTracks = (structure, state) => {
24
34
  return (0, traversal_2.getTracksSegment)(mainSegment) !== null;
25
35
  }
26
36
  if (structure.type === 'iso-base-media') {
27
- const moovBox = (0, traversal_1.getMoovBox)(structure.boxes);
28
- if (!moovBox) {
29
- return false;
30
- }
31
- const numberOfTracks = (0, exports.getNumberOfTracks)(moovBox);
32
- const tracks = (0, traversal_1.getTraks)(moovBox);
33
- return tracks.length === numberOfTracks;
37
+ return (0, exports.isoBaseMediaHasTracks)(structure);
34
38
  }
35
39
  if (structure.type === 'riff') {
36
40
  return (0, get_tracks_from_avi_1.hasAllTracksFromAvi)(structure, state);
@@ -49,7 +53,7 @@ const getTracksFromMa = (segments, state) => {
49
53
  if (!mainSegment) {
50
54
  throw new Error('No main segment found');
51
55
  }
52
- const matroskaTracks = (0, get_ready_tracks_1.getTracksFromMatroska)(mainSegment, state.getTimescale());
56
+ const matroskaTracks = (0, get_ready_tracks_1.getTracksFromMatroska)(mainSegment, state.webm.getTimescale());
53
57
  for (const track of matroskaTracks) {
54
58
  if (track.type === 'video') {
55
59
  videoTracks.push(track);
@@ -101,12 +105,13 @@ const getTracksFromIsoBaseMedia = (segments) => {
101
105
  otherTracks,
102
106
  };
103
107
  };
108
+ exports.getTracksFromIsoBaseMedia = getTracksFromIsoBaseMedia;
104
109
  const getTracks = (segments, state) => {
105
110
  if (segments.type === 'matroska') {
106
111
  return getTracksFromMa(segments.boxes, state);
107
112
  }
108
113
  if (segments.type === 'iso-base-media') {
109
- return getTracksFromIsoBaseMedia(segments.boxes);
114
+ return (0, exports.getTracksFromIsoBaseMedia)(segments.boxes);
110
115
  }
111
116
  if (segments.type === 'riff') {
112
117
  return (0, get_tracks_from_avi_1.getTracksFromAvi)(segments, state);
@@ -1,9 +1,10 @@
1
1
  import type { Options, ParseMediaFields } from './options';
2
- import type { Structure } from './parse-result';
3
2
  import type { ParserState } from './state/parser-state';
4
- export declare const getAvailableInfo: (options: Options<ParseMediaFields>, structure: Structure | null, state: ParserState) => Record<keyof Options<ParseMediaFields>, boolean>;
5
- export declare const hasAllInfo: ({ fields, state, structure, }: {
6
- structure: Structure | null;
3
+ export declare const getAvailableInfo: ({ fieldsToFetch, state, }: {
4
+ fieldsToFetch: Options<ParseMediaFields>;
5
+ state: ParserState;
6
+ }) => Record<keyof Options<ParseMediaFields>, boolean>;
7
+ export declare const hasAllInfo: ({ fields, state, }: {
7
8
  fields: Options<ParseMediaFields>;
8
9
  state: ParserState;
9
10
  }) => boolean;
@@ -7,10 +7,13 @@ const get_dimensions_1 = require("./get-dimensions");
7
7
  const get_duration_1 = require("./get-duration");
8
8
  const get_fps_1 = require("./get-fps");
9
9
  const get_is_hdr_1 = require("./get-is-hdr");
10
+ const get_keyframes_1 = require("./get-keyframes");
10
11
  const get_tracks_1 = require("./get-tracks");
11
12
  const get_video_codec_1 = require("./get-video-codec");
12
- const getAvailableInfo = (options, structure, state) => {
13
- const keys = Object.entries(options).filter(([, value]) => value);
13
+ const may_skip_video_data_1 = require("./may-skip-video-data/may-skip-video-data");
14
+ const getAvailableInfo = ({ fieldsToFetch, state, }) => {
15
+ const keys = Object.entries(fieldsToFetch).filter(([, value]) => value);
16
+ const structure = state.structure.getStructureOrNull();
14
17
  const infos = keys.map(([_key]) => {
15
18
  const key = _key;
16
19
  if (key === 'structure') {
@@ -19,6 +22,9 @@ const getAvailableInfo = (options, structure, state) => {
19
22
  if (key === 'durationInSeconds') {
20
23
  return Boolean(structure && (0, get_duration_1.hasDuration)(structure, state));
21
24
  }
25
+ if (key === 'slowDurationInSeconds') {
26
+ return Boolean(structure && (0, get_duration_1.hasSlowDuration)(structure, state));
27
+ }
22
28
  if (key === 'dimensions' ||
23
29
  key === 'rotation' ||
24
30
  key === 'unrotatedDimensions') {
@@ -27,6 +33,10 @@ const getAvailableInfo = (options, structure, state) => {
27
33
  if (key === 'fps') {
28
34
  return Boolean(structure && (0, get_fps_1.hasFps)(structure));
29
35
  }
36
+ if (key === 'slowFps') {
37
+ // In case FPS is available an non-null, it also works for `slowFps`
38
+ return Boolean(structure && (0, get_fps_1.hasFpsSuitedForSlowFps)(structure));
39
+ }
30
40
  if (key === 'isHdr') {
31
41
  return Boolean(structure && (0, get_is_hdr_1.hasHdr)(structure, state));
32
42
  }
@@ -39,12 +49,18 @@ const getAvailableInfo = (options, structure, state) => {
39
49
  if (key === 'tracks') {
40
50
  return Boolean(structure && (0, get_tracks_1.hasTracks)(structure, state));
41
51
  }
52
+ if (key === 'keyframes') {
53
+ return Boolean(structure && (0, get_keyframes_1.hasKeyframes)(structure, state));
54
+ }
42
55
  if (key === 'internalStats') {
43
56
  return true;
44
57
  }
45
58
  if (key === 'size') {
46
59
  return true;
47
60
  }
61
+ if (key === 'mimeType') {
62
+ return true;
63
+ }
48
64
  if (key === 'name') {
49
65
  return true;
50
66
  }
@@ -54,6 +70,12 @@ const getAvailableInfo = (options, structure, state) => {
54
70
  if (key === 'metadata' || key === 'location') {
55
71
  return false;
56
72
  }
73
+ if (key === 'slowKeyframes') {
74
+ return false;
75
+ }
76
+ if (key === 'slowNumberOfFrames') {
77
+ return false;
78
+ }
57
79
  throw new Error(`Unknown key: ${key}`);
58
80
  });
59
81
  const entries = [];
@@ -64,9 +86,13 @@ const getAvailableInfo = (options, structure, state) => {
64
86
  return Object.fromEntries(entries);
65
87
  };
66
88
  exports.getAvailableInfo = getAvailableInfo;
67
- const hasAllInfo = ({ fields, state, structure, }) => {
68
- const availableInfo = (0, exports.getAvailableInfo)(fields !== null && fields !== void 0 ? fields : {}, structure, state);
89
+ const hasAllInfo = ({ fields, state, }) => {
90
+ const availableInfo = (0, exports.getAvailableInfo)({
91
+ fieldsToFetch: fields !== null && fields !== void 0 ? fields : {},
92
+ state,
93
+ });
69
94
  return (Object.values(availableInfo).every(Boolean) &&
70
- (state.maySkipVideoData() || state.canSkipTracksState.canSkipTracks()));
95
+ ((0, may_skip_video_data_1.maySkipVideoData)({ state }) ||
96
+ state.callbacks.canSkipTracksState.canSkipTracks()));
71
97
  };
72
98
  exports.hasAllInfo = hasAllInfo;
package/dist/index.d.ts CHANGED
@@ -1,7 +1,9 @@
1
1
  import { IoEventEmitter } from './create/event-emitter';
2
2
  import type { ProgressTracker } from './create/progress-tracker';
3
3
  import type { LogLevel } from './log';
4
+ export { IsAGifError, IsAnImageError, IsAnUnsupportedAudioTypeError, IsAnUnsupportedFileTypeError, IsAPdfError, } from './errors';
4
5
  export { MetadataEntry } from './metadata/get-metadata';
6
+ export { MediaParserKeyframe } from './options';
5
7
  export { WriterInterface } from './writers/writer';
6
8
  export { AudioTrack, MediaParserAudioCodec, MediaParserVideoCodec, OtherTrack, Track, VideoTrack, VideoTrackColorParams, } from './get-tracks';
7
9
  export type { Options, ParseMediaContainer, ParseMediaDynamicOptions, ParseMediaFields, ParseMediaOnProgress, ParseMediaOptions, ParseMediaProgress, ParseMediaResult, TracksField, } from './options';
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.VERSION = exports.MediaParserInternals = exports.parseMedia = void 0;
3
+ exports.VERSION = exports.MediaParserInternals = exports.parseMedia = exports.IsAPdfError = exports.IsAnUnsupportedFileTypeError = exports.IsAnUnsupportedAudioTypeError = exports.IsAnImageError = exports.IsAGifError = void 0;
4
4
  const aac_codecprivate_1 = require("./aac-codecprivate");
5
5
  const event_emitter_1 = require("./create/event-emitter");
6
6
  const create_iso_base_media_1 = require("./create/iso-base-media/create-iso-base-media");
@@ -9,6 +9,12 @@ const progress_tracker_1 = require("./create/progress-tracker");
9
9
  const create_wav_1 = require("./create/wav/create-wav");
10
10
  const with_resolvers_1 = require("./create/with-resolvers");
11
11
  const log_1 = require("./log");
12
+ var errors_1 = require("./errors");
13
+ Object.defineProperty(exports, "IsAGifError", { enumerable: true, get: function () { return errors_1.IsAGifError; } });
14
+ Object.defineProperty(exports, "IsAnImageError", { enumerable: true, get: function () { return errors_1.IsAnImageError; } });
15
+ Object.defineProperty(exports, "IsAnUnsupportedAudioTypeError", { enumerable: true, get: function () { return errors_1.IsAnUnsupportedAudioTypeError; } });
16
+ Object.defineProperty(exports, "IsAnUnsupportedFileTypeError", { enumerable: true, get: function () { return errors_1.IsAnUnsupportedFileTypeError; } });
17
+ Object.defineProperty(exports, "IsAPdfError", { enumerable: true, get: function () { return errors_1.IsAPdfError; } });
12
18
  var parse_media_1 = require("./parse-media");
13
19
  Object.defineProperty(exports, "parseMedia", { enumerable: true, get: function () { return parse_media_1.parseMedia; } });
14
20
  exports.MediaParserInternals = {
@@ -0,0 +1,4 @@
1
+ import type { ParserState } from '../state/parser-state';
2
+ export declare const maySkipVideoData: ({ state }: {
3
+ state: ParserState;
4
+ }) => boolean;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.maySkipVideoData = void 0;
4
+ const need_samples_for_fields_1 = require("./need-samples-for-fields");
5
+ const maySkipVideoData = ({ state }) => {
6
+ return (state.callbacks.tracks.hasAllTracks() &&
7
+ Object.values(state.callbacks.videoSampleCallbacks).length === 0 &&
8
+ Object.values(state.callbacks.audioSampleCallbacks).length === 0 &&
9
+ !(0, need_samples_for_fields_1.needsToIterateOverSamples)({
10
+ emittedFields: state.emittedFields,
11
+ fields: state.fields,
12
+ }));
13
+ };
14
+ exports.maySkipVideoData = maySkipVideoData;
@@ -0,0 +1,5 @@
1
+ import type { AllOptions, Options, ParseMediaFields } from '../options';
2
+ export declare const needsToIterateOverSamples: ({ fields, emittedFields, }: {
3
+ fields: Options<ParseMediaFields>;
4
+ emittedFields: AllOptions<ParseMediaFields>;
5
+ }) => boolean;
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.needsToIterateOverSamples = void 0;
4
+ const needsSamples = {
5
+ slowDurationInSeconds: true,
6
+ slowFps: true,
7
+ slowKeyframes: true,
8
+ slowNumberOfFrames: true,
9
+ audioCodec: false,
10
+ container: false,
11
+ dimensions: false,
12
+ durationInSeconds: false,
13
+ fps: false,
14
+ internalStats: false,
15
+ isHdr: false,
16
+ name: false,
17
+ rotation: false,
18
+ size: false,
19
+ structure: false,
20
+ tracks: false,
21
+ unrotatedDimensions: false,
22
+ videoCodec: false,
23
+ metadata: false,
24
+ location: false,
25
+ mimeType: false,
26
+ keyframes: false,
27
+ };
28
+ const needsToIterateOverSamples = ({ fields, emittedFields, }) => {
29
+ const keys = Object.keys(fields !== null && fields !== void 0 ? fields : {});
30
+ const selectedKeys = keys.filter((k) => fields[k]);
31
+ return selectedKeys.some((k) => needsSamples[k] && !emittedFields[k]);
32
+ };
33
+ exports.needsToIterateOverSamples = needsToIterateOverSamples;
package/dist/options.d.ts CHANGED
@@ -11,8 +11,10 @@ export type KnownAudioCodecs = 'aac' | 'mp3' | 'aiff' | 'opus' | 'pcm' | 'vorbis
11
11
  export type ParseMediaFields = {
12
12
  dimensions: boolean;
13
13
  durationInSeconds: boolean;
14
+ slowDurationInSeconds: boolean;
14
15
  structure: boolean;
15
16
  fps: boolean;
17
+ slowFps: boolean;
16
18
  videoCodec: boolean;
17
19
  audioCodec: boolean;
18
20
  tracks: boolean;
@@ -25,10 +27,17 @@ export type ParseMediaFields = {
25
27
  isHdr: boolean;
26
28
  metadata: boolean;
27
29
  location: boolean;
30
+ mimeType: boolean;
31
+ keyframes: boolean;
32
+ slowKeyframes: boolean;
33
+ slowNumberOfFrames: boolean;
28
34
  };
29
35
  export type AllParseMediaFields = {
30
36
  dimensions: true;
31
37
  durationInSeconds: true;
38
+ slowDurationInSeconds: true;
39
+ slowNumberOfFrames: true;
40
+ slowFps: true;
32
41
  structure: true;
33
42
  fps: true;
34
43
  videoCodec: true;
@@ -43,95 +52,101 @@ export type AllParseMediaFields = {
43
52
  isHdr: true;
44
53
  metadata: true;
45
54
  location: true;
55
+ mimeType: true;
56
+ keyframes: true;
57
+ slowKeyframes: true;
46
58
  };
47
- export type Options<Fields extends ParseMediaFields> = {
48
- dimensions?: Fields['dimensions'];
49
- durationInSeconds?: Fields['durationInSeconds'];
50
- structure?: Fields['structure'];
51
- fps?: Fields['fps'];
52
- videoCodec?: Fields['videoCodec'];
53
- audioCodec?: Fields['audioCodec'];
54
- tracks?: Fields['tracks'];
55
- rotation?: Fields['rotation'];
56
- unrotatedDimensions?: Fields['unrotatedDimensions'];
57
- internalStats?: Fields['internalStats'];
58
- size?: Fields['size'];
59
- name?: Fields['name'];
60
- container?: Fields['container'];
61
- isHdr?: Fields['isHdr'];
62
- metadata?: Fields['metadata'];
63
- location?: Fields['location'];
59
+ export type AllOptions<Fields extends ParseMediaFields> = {
60
+ dimensions: Fields['dimensions'];
61
+ durationInSeconds: Fields['durationInSeconds'];
62
+ slowDurationInSeconds: Fields['slowDurationInSeconds'];
63
+ slowFps: Fields['slowFps'];
64
+ structure: Fields['structure'];
65
+ fps: Fields['fps'];
66
+ videoCodec: Fields['videoCodec'];
67
+ audioCodec: Fields['audioCodec'];
68
+ tracks: Fields['tracks'];
69
+ rotation: Fields['rotation'];
70
+ unrotatedDimensions: Fields['unrotatedDimensions'];
71
+ internalStats: Fields['internalStats'];
72
+ size: Fields['size'];
73
+ name: Fields['name'];
74
+ container: Fields['container'];
75
+ isHdr: Fields['isHdr'];
76
+ metadata: Fields['metadata'];
77
+ location: Fields['location'];
78
+ mimeType: Fields['mimeType'];
79
+ keyframes: Fields['keyframes'];
80
+ slowKeyframes: Fields['slowKeyframes'];
81
+ slowNumberOfFrames: Fields['slowNumberOfFrames'];
64
82
  };
83
+ export type Options<Fields extends ParseMediaFields> = Partial<AllOptions<Fields>>;
65
84
  export type TracksField = {
66
85
  videoTracks: VideoTrack[];
67
86
  audioTracks: AudioTrack[];
68
87
  };
69
88
  export type ParseMediaContainer = 'mp4' | 'webm' | 'avi' | 'transport-stream';
70
- export type ParseMediaCallbacks<Fields extends Options<ParseMediaFields>> = (Fields['dimensions'] extends true ? {
89
+ export type MediaParserKeyframe = {
90
+ positionInBytes: number;
91
+ sizeInBytes: number;
92
+ presentationTimeInSeconds: number;
93
+ decodingTimeInSeconds: number;
94
+ trackId: number;
95
+ };
96
+ export interface ParseMediaCallbacks {
71
97
  onDimensions?: (dimensions: Dimensions) => void;
72
- } : {}) & (Fields['durationInSeconds'] extends true ? {
73
98
  onDurationInSeconds?: (durationInSeconds: number | null) => void;
74
- } : {}) & (Fields['structure'] extends true ? {
99
+ onSlowDurationInSeconds?: (durationInSeconds: number) => void;
100
+ onSlowFps?: (fps: number) => void;
75
101
  onStructure?: (structure: Structure) => void;
76
- } : {}) & (Fields['fps'] extends true ? {
77
102
  onFps?: (fps: number | null) => void;
78
- } : {}) & (Fields['videoCodec'] extends true ? {
79
103
  onVideoCodec?: (codec: MediaParserVideoCodec | null) => void;
80
- } : {}) & (Fields['audioCodec'] extends true ? {
81
104
  onAudioCodec?: (codec: MediaParserAudioCodec | null) => void;
82
- } : {}) & (Fields['tracks'] extends true ? {
83
105
  onTracks?: (tracks: TracksField) => void;
84
- } : {}) & (Fields['rotation'] extends true ? {
85
106
  onRotation?: (rotation: number | null) => void;
86
- } : {}) & (Fields['metadata'] extends true ? {
87
- onMetadata?: (metadata: MetadataEntry[]) => void;
88
- } : {}) & (Fields['location'] extends true ? {
89
- onLocation?: (location: MediaParserLocation | null) => void;
90
- } : {}) & (Fields['unrotatedDimensions'] extends true ? {
91
107
  onUnrotatedDimensions?: (dimensions: Dimensions) => void;
92
- } : {}) & (Fields['isHdr'] extends true ? {
93
- onIsHdr?: (isHdr: boolean) => void;
94
- } : {}) & (Fields['size'] extends true ? {
108
+ onInternalStats?: (internalStats: InternalStats) => void;
95
109
  onSize?: (size: number | null) => void;
96
- } : {}) & (Fields['name'] extends true ? {
97
110
  onName?: (name: string) => void;
98
- } : {}) & (Fields['container'] extends true ? {
99
111
  onContainer?: (container: ParseMediaContainer) => void;
100
- } : {});
101
- export type ParseMediaResult<Fields extends Options<ParseMediaFields>> = (Fields['dimensions'] extends true ? {
112
+ onIsHdr?: (isHdr: boolean) => void;
113
+ onMetadata?: (metadata: MetadataEntry[]) => void;
114
+ onLocation?: (location: MediaParserLocation | null) => void;
115
+ onMimeType?: (mimeType: string | null) => void;
116
+ onKeyframes?: (keyframes: MediaParserKeyframe[] | null) => void;
117
+ onSlowKeyframes?: (keyframes: MediaParserKeyframe[]) => void;
118
+ onSlowNumberOfFrames?: (samples: number) => void;
119
+ }
120
+ export interface ParseMediaData {
102
121
  dimensions: Dimensions;
103
- } : {}) & (Fields['durationInSeconds'] extends true ? {
104
122
  durationInSeconds: number | null;
105
- } : {}) & (Fields['structure'] extends true ? {
123
+ slowDurationInSeconds: number;
124
+ slowFps: number;
106
125
  structure: Structure;
107
- } : {}) & (Fields['fps'] extends true ? {
108
126
  fps: number | null;
109
- } : {}) & (Fields['videoCodec'] extends true ? {
110
127
  videoCodec: MediaParserVideoCodec | null;
111
- } : {}) & (Fields['audioCodec'] extends true ? {
112
128
  audioCodec: MediaParserAudioCodec | null;
113
- } : {}) & (Fields['tracks'] extends true ? TracksField : {}) & (Fields['rotation'] extends true ? {
129
+ tracks: TracksField;
114
130
  rotation: number | null;
115
- } : {}) & (Fields['unrotatedDimensions'] extends true ? {
116
131
  unrotatedDimensions: Dimensions;
117
- } : {}) & (Fields['isHdr'] extends true ? {
118
132
  isHdr: boolean;
119
- } : {}) & (Fields['internalStats'] extends true ? {
120
133
  internalStats: InternalStats;
121
- } : {}) & (Fields['size'] extends true ? {
122
134
  size: number | null;
123
- } : {}) & (Fields['name'] extends true ? {
124
135
  name: string;
125
- } : {}) & (Fields['metadata'] extends true ? {
126
136
  metadata: MetadataEntry[];
127
- } : {}) & (Fields['location'] extends true ? {
128
137
  location: MediaParserLocation | null;
129
- } : {}) & (Fields['container'] extends true ? {
130
138
  container: ParseMediaContainer;
131
- } : {});
139
+ mimeType: string | null;
140
+ keyframes: MediaParserKeyframe[] | null;
141
+ slowKeyframes: MediaParserKeyframe[];
142
+ slowNumberOfFrames: number;
143
+ }
144
+ export type ParseMediaResult<T extends Partial<ParseMediaFields>> = {
145
+ [K in keyof T]: T[K] extends true ? K extends keyof ParseMediaData ? ParseMediaData[K] : never : never;
146
+ };
132
147
  export type ParseMediaDynamicOptions<F extends Options<ParseMediaFields>> = {
133
148
  fields?: F;
134
- } & ParseMediaCallbacks<F>;
149
+ } & ParseMediaCallbacks;
135
150
  export type ParseMediaProgress = {
136
151
  bytes: number;
137
152
  percentage: number | null;