@remotion/media-parser 4.0.231 → 4.0.233

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 (115) hide show
  1. package/dist/add-avc-profile-to-track.d.ts +3 -0
  2. package/dist/add-avc-profile-to-track.js +35 -0
  3. package/dist/add-new-matroska-tracks.d.ts +6 -1
  4. package/dist/add-new-matroska-tracks.js +16 -1
  5. package/dist/boxes/avc/parse-avc.d.ts +18 -0
  6. package/dist/boxes/avc/parse-avc.js +96 -0
  7. package/dist/boxes/iso-base-media/esds/decoder-specific-config.d.ts +1 -2
  8. package/dist/boxes/iso-base-media/esds/decoder-specific-config.js +1 -5
  9. package/dist/boxes/iso-base-media/esds/esds-descriptors.d.ts +2 -4
  10. package/dist/boxes/iso-base-media/esds/esds-descriptors.js +3 -4
  11. package/dist/boxes/iso-base-media/esds/esds.d.ts +1 -3
  12. package/dist/boxes/iso-base-media/esds/esds.js +2 -2
  13. package/dist/boxes/iso-base-media/get-sample-positions-from-track.js +7 -1
  14. package/dist/boxes/iso-base-media/make-track.js +3 -3
  15. package/dist/boxes/iso-base-media/mdat/mdat.d.ts +2 -2
  16. package/dist/boxes/iso-base-media/mdat/mdat.js +5 -2
  17. package/dist/boxes/iso-base-media/moov/moov.js +2 -2
  18. package/dist/boxes/iso-base-media/process-box.d.ts +5 -5
  19. package/dist/boxes/iso-base-media/process-box.js +38 -38
  20. package/dist/boxes/iso-base-media/stsd/mebx.js +2 -2
  21. package/dist/boxes/iso-base-media/stsd/samples.d.ts +2 -2
  22. package/dist/boxes/iso-base-media/stsd/samples.js +15 -14
  23. package/dist/boxes/iso-base-media/trak/trak.js +2 -2
  24. package/dist/boxes/iso-base-media/traversal.d.ts +1 -1
  25. package/dist/boxes/riff/expect-riff-box.d.ts +16 -0
  26. package/dist/boxes/riff/expect-riff-box.js +49 -0
  27. package/dist/boxes/riff/get-tracks-from-avi.d.ts +21 -0
  28. package/dist/boxes/riff/get-tracks-from-avi.js +108 -0
  29. package/dist/boxes/riff/is-movi.d.ts +2 -0
  30. package/dist/boxes/riff/is-movi.js +12 -0
  31. package/dist/boxes/riff/parse-avih.d.ts +6 -0
  32. package/dist/boxes/riff/parse-avih.js +32 -0
  33. package/dist/boxes/riff/parse-box.d.ts +13 -0
  34. package/dist/boxes/riff/parse-box.js +113 -0
  35. package/dist/boxes/riff/parse-fmt-box.d.ts +7 -0
  36. package/dist/boxes/riff/parse-fmt-box.js +33 -0
  37. package/dist/boxes/riff/parse-list-box.d.ts +8 -0
  38. package/dist/boxes/riff/parse-list-box.js +30 -0
  39. package/dist/boxes/riff/parse-movi.d.ts +17 -0
  40. package/dist/boxes/riff/parse-movi.js +122 -0
  41. package/dist/boxes/riff/parse-riff-box.d.ts +10 -0
  42. package/dist/boxes/riff/parse-riff-box.js +33 -0
  43. package/dist/boxes/riff/parse-strf.d.ts +7 -0
  44. package/dist/boxes/riff/parse-strf.js +67 -0
  45. package/dist/boxes/riff/parse-strh.d.ts +6 -0
  46. package/dist/boxes/riff/parse-strh.js +46 -0
  47. package/dist/boxes/riff/riff-box.d.ts +81 -0
  48. package/dist/boxes/riff/riff-box.js +2 -0
  49. package/dist/boxes/riff/strf.d.ts +7 -0
  50. package/dist/boxes/riff/strf.js +67 -0
  51. package/dist/boxes/riff/timescale.d.ts +1 -0
  52. package/dist/boxes/riff/timescale.js +4 -0
  53. package/dist/boxes/riff/traversal.d.ts +8 -0
  54. package/dist/boxes/riff/traversal.js +36 -0
  55. package/dist/boxes/webm/parse-ebml.js +2 -2
  56. package/dist/boxes/webm/parse-webm-header.d.ts +2 -2
  57. package/dist/boxes/webm/parse-webm-header.js +7 -7
  58. package/dist/boxes/webm/traversal.d.ts +2 -2
  59. package/dist/buffer-iterator.d.ts +6 -1
  60. package/dist/buffer-iterator.js +24 -5
  61. package/dist/create/event-emitter.d.ts +31 -0
  62. package/dist/create/event-emitter.js +25 -0
  63. package/dist/create/iso-base-media/create-iso-base-media.d.ts +1 -1
  64. package/dist/create/iso-base-media/create-iso-base-media.js +3 -5
  65. package/dist/create/matroska/cluster.js +1 -1
  66. package/dist/create/matroska/create-matroska-media.d.ts +1 -1
  67. package/dist/create/matroska/create-matroska-media.js +7 -14
  68. package/dist/create/media-fn.d.ts +2 -1
  69. package/dist/create/mp3/create-mp3.d.ts +2 -0
  70. package/dist/create/mp3/create-mp3.js +49 -0
  71. package/dist/create/progress-tracker.d.ts +7 -0
  72. package/dist/create/progress-tracker.js +43 -0
  73. package/dist/create/wav/create-wav.d.ts +2 -0
  74. package/dist/create/wav/create-wav.js +110 -0
  75. package/dist/create/with-resolvers.d.ts +10 -0
  76. package/dist/create/with-resolvers.js +28 -0
  77. package/dist/emit-available-info.d.ts +2 -2
  78. package/dist/emit-available-info.js +17 -6
  79. package/dist/esm/from-node.mjs +2 -1
  80. package/dist/esm/index.mjs +1828 -605
  81. package/dist/get-audio-codec.d.ts +4 -3
  82. package/dist/get-audio-codec.js +17 -3
  83. package/dist/get-container.d.ts +3 -3
  84. package/dist/get-container.js +9 -7
  85. package/dist/get-dimensions.d.ts +3 -3
  86. package/dist/get-duration.d.ts +3 -3
  87. package/dist/get-duration.js +32 -14
  88. package/dist/get-fps.d.ts +3 -3
  89. package/dist/get-fps.js +31 -4
  90. package/dist/get-is-hdr.d.ts +4 -0
  91. package/dist/get-is-hdr.js +18 -0
  92. package/dist/get-sample-positions-from-lpcm.d.ts +3 -0
  93. package/dist/get-sample-positions-from-lpcm.js +46 -0
  94. package/dist/get-tracks.d.ts +7 -10
  95. package/dist/get-tracks.js +55 -27
  96. package/dist/get-video-codec.d.ts +5 -4
  97. package/dist/get-video-codec.js +47 -13
  98. package/dist/has-all-info.d.ts +2 -2
  99. package/dist/has-all-info.js +10 -5
  100. package/dist/index.d.ts +23 -3
  101. package/dist/index.js +9 -0
  102. package/dist/options.d.ts +16 -9
  103. package/dist/parse-media.js +3 -1
  104. package/dist/parse-result.d.ts +20 -6
  105. package/dist/parse-video.d.ts +2 -2
  106. package/dist/parse-video.js +5 -16
  107. package/dist/parser-context.d.ts +1 -0
  108. package/dist/parser-state.d.ts +11 -0
  109. package/dist/parser-state.js +30 -0
  110. package/dist/readers/from-node.js +2 -1
  111. package/dist/register-track.d.ts +13 -0
  112. package/dist/register-track.js +25 -0
  113. package/dist/version.d.ts +1 -1
  114. package/dist/version.js +1 -1
  115. package/package.json +3 -3
@@ -6,12 +6,14 @@ const get_container_1 = require("./get-container");
6
6
  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
+ const get_is_hdr_1 = require("./get-is-hdr");
9
10
  const get_tracks_1 = require("./get-tracks");
10
11
  const get_video_codec_1 = require("./get-video-codec");
11
12
  const getAvailableInfo = (options, parseResult, state) => {
12
13
  const keys = Object.entries(options).filter(([, value]) => value);
13
- const infos = keys.map(([key]) => {
14
- if (key === 'boxes') {
14
+ const infos = keys.map(([_key]) => {
15
+ const key = _key;
16
+ if (key === 'structure') {
15
17
  return Boolean(parseResult && parseResult.status === 'done');
16
18
  }
17
19
  if (key === 'durationInSeconds') {
@@ -25,14 +27,17 @@ const getAvailableInfo = (options, parseResult, state) => {
25
27
  if (key === 'fps') {
26
28
  return Boolean(parseResult && (0, get_fps_1.hasFps)(parseResult.segments));
27
29
  }
30
+ if (key === 'isHdr') {
31
+ return Boolean(parseResult && (0, get_is_hdr_1.hasHdr)(parseResult.segments, state));
32
+ }
28
33
  if (key === 'videoCodec') {
29
- return Boolean(parseResult && (0, get_video_codec_1.hasVideoCodec)(parseResult.segments));
34
+ return Boolean(parseResult && (0, get_video_codec_1.hasVideoCodec)(parseResult.segments, state));
30
35
  }
31
36
  if (key === 'audioCodec') {
32
- return Boolean(parseResult && (0, get_audio_codec_1.hasAudioCodec)(parseResult.segments));
37
+ return Boolean(parseResult && (0, get_audio_codec_1.hasAudioCodec)(parseResult.segments, state));
33
38
  }
34
39
  if (key === 'tracks') {
35
- return Boolean(parseResult && (0, get_tracks_1.hasTracks)(parseResult.segments));
40
+ return Boolean(parseResult && (0, get_tracks_1.hasTracks)(parseResult.segments, state));
36
41
  }
37
42
  if (key === 'internalStats') {
38
43
  return false;
package/dist/index.d.ts CHANGED
@@ -1,3 +1,5 @@
1
+ import { IoEventEmitter } from './create/event-emitter';
2
+ import type { ProgressTracker } from './create/progress-tracker';
1
3
  import type { LogLevel } from './log';
2
4
  export { WriterInterface } from './writers/writer';
3
5
  export { AudioTrack, MediaParserAudioCodec, MediaParserVideoCodec, OtherTrack, Track, VideoTrack, VideoTrackColorParams, } from './get-tracks';
@@ -7,10 +9,10 @@ export { AudioOrVideoSample, OnAudioSample, OnAudioTrack, OnVideoSample, OnVideo
7
9
  export type { MediaFn } from './create/media-fn';
8
10
  export { Dimensions } from './get-dimensions';
9
11
  export type { ReaderInterface } from './readers/reader';
10
- export type { LogLevel };
11
12
  export declare const MediaParserInternals: {
12
- createMatroskaMedia: ({ writer, onBytesProgress, onMillisecondsProgress, filename, logLevel, }: import("./create/media-fn").MediaFnGeneratorInput) => Promise<import("./create/media-fn").MediaFn>;
13
- createIsoBaseMedia: ({ writer, onBytesProgress, onMillisecondsProgress, logLevel, filename, }: import("./create/media-fn").MediaFnGeneratorInput) => Promise<import("./create/media-fn").MediaFn>;
13
+ createMatroskaMedia: ({ writer, onBytesProgress, onMillisecondsProgress, filename, logLevel, progressTracker, }: import("./create/media-fn").MediaFnGeneratorInput) => Promise<import("./create/media-fn").MediaFn>;
14
+ createIsoBaseMedia: ({ writer, onBytesProgress, onMillisecondsProgress, logLevel, filename, progressTracker, }: import("./create/media-fn").MediaFnGeneratorInput) => Promise<import("./create/media-fn").MediaFn>;
15
+ createWav: ({ filename, logLevel, onBytesProgress, onMillisecondsProgress, writer, progressTracker, }: import("./create/media-fn").MediaFnGeneratorInput) => Promise<import("./create/media-fn").MediaFn>;
14
16
  Log: {
15
17
  trace: (logLevel: LogLevel, ...args: Parameters<typeof console.log>) => void;
16
18
  verbose: (logLevel: LogLevel, ...args: Parameters<typeof console.log>) => void;
@@ -18,5 +20,23 @@ export declare const MediaParserInternals: {
18
20
  warn: (logLevel: LogLevel, ...args: Parameters<typeof console.log>) => void;
19
21
  error: (...args: Parameters<typeof console.log>) => void;
20
22
  };
23
+ IoEventEmitter: typeof IoEventEmitter;
24
+ makeProgressTracker: () => {
25
+ registerTrack: (trackNumber: number) => void;
26
+ getSmallestProgress: () => number;
27
+ updateTrackProgress: (trackNumber: number, progress: number) => void;
28
+ waitForProgress: () => Promise<void>;
29
+ };
30
+ withResolvers: <T>() => {
31
+ promise: Promise<T>;
32
+ resolve: (value: T | PromiseLike<T>) => void;
33
+ reject: (reason?: any) => void;
34
+ };
35
+ withResolversAndWaitForReturn: <T>() => {
36
+ getPromiseToImmediatelyReturn: () => Promise<T>;
37
+ reject: (reason: unknown) => void;
38
+ resolve: (value: T | PromiseLike<T>) => void;
39
+ };
21
40
  };
41
+ export type { IoEventEmitter, LogLevel, ProgressTracker };
22
42
  export { VERSION } from './version';
package/dist/index.js CHANGED
@@ -1,15 +1,24 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.VERSION = exports.MediaParserInternals = exports.parseMedia = void 0;
4
+ const event_emitter_1 = require("./create/event-emitter");
4
5
  const create_iso_base_media_1 = require("./create/iso-base-media/create-iso-base-media");
5
6
  const create_matroska_media_1 = require("./create/matroska/create-matroska-media");
7
+ const progress_tracker_1 = require("./create/progress-tracker");
8
+ const create_wav_1 = require("./create/wav/create-wav");
9
+ const with_resolvers_1 = require("./create/with-resolvers");
6
10
  const log_1 = require("./log");
7
11
  var parse_media_1 = require("./parse-media");
8
12
  Object.defineProperty(exports, "parseMedia", { enumerable: true, get: function () { return parse_media_1.parseMedia; } });
9
13
  exports.MediaParserInternals = {
10
14
  createMatroskaMedia: create_matroska_media_1.createMatroskaMedia,
11
15
  createIsoBaseMedia: create_iso_base_media_1.createIsoBaseMedia,
16
+ createWav: create_wav_1.createWav,
12
17
  Log: log_1.Log,
18
+ IoEventEmitter: event_emitter_1.IoEventEmitter,
19
+ makeProgressTracker: progress_tracker_1.makeProgressTracker,
20
+ withResolvers: with_resolvers_1.withResolvers,
21
+ withResolversAndWaitForReturn: with_resolvers_1.withResolversAndWaitForReturn,
13
22
  };
14
23
  var version_1 = require("./version");
15
24
  Object.defineProperty(exports, "VERSION", { enumerable: true, get: function () { return version_1.VERSION; } });
package/dist/options.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import type { Dimensions } from './get-dimensions';
2
2
  import type { AudioTrack, MediaParserAudioCodec, MediaParserVideoCodec, VideoTrack } from './get-tracks';
3
3
  import type { LogLevel } from './log';
4
- import type { AnySegment } from './parse-result';
4
+ import type { Structure } from './parse-result';
5
5
  import type { InternalStats } from './parser-state';
6
6
  import type { ReaderInterface } from './readers/reader';
7
7
  import type { OnAudioTrack, OnVideoTrack } from './webcodec-sample-types';
@@ -9,7 +9,7 @@ export type KnownAudioCodecs = 'aac' | 'mp3' | 'aiff' | 'opus' | 'pcm' | 'vorbis
9
9
  export type ParseMediaFields = {
10
10
  dimensions: boolean;
11
11
  durationInSeconds: boolean;
12
- boxes: boolean;
12
+ structure: boolean;
13
13
  fps: boolean;
14
14
  videoCodec: boolean;
15
15
  audioCodec: boolean;
@@ -20,11 +20,12 @@ export type ParseMediaFields = {
20
20
  size: boolean;
21
21
  name: boolean;
22
22
  container: boolean;
23
+ isHdr: boolean;
23
24
  };
24
25
  export type AllParseMediaFields = {
25
26
  dimensions: true;
26
27
  durationInSeconds: true;
27
- boxes: true;
28
+ structure: true;
28
29
  fps: true;
29
30
  videoCodec: true;
30
31
  audioCodec: true;
@@ -35,11 +36,12 @@ export type AllParseMediaFields = {
35
36
  size: true;
36
37
  name: true;
37
38
  container: true;
39
+ isHdr: true;
38
40
  };
39
41
  export type Options<Fields extends ParseMediaFields> = {
40
42
  dimensions?: Fields['dimensions'];
41
43
  durationInSeconds?: Fields['durationInSeconds'];
42
- boxes?: Fields['boxes'];
44
+ structure?: Fields['structure'];
43
45
  fps?: Fields['fps'];
44
46
  videoCodec?: Fields['videoCodec'];
45
47
  audioCodec?: Fields['audioCodec'];
@@ -50,18 +52,19 @@ export type Options<Fields extends ParseMediaFields> = {
50
52
  size?: Fields['size'];
51
53
  name?: Fields['name'];
52
54
  container?: Fields['container'];
55
+ isHdr?: Fields['isHdr'];
53
56
  };
54
57
  export type TracksField = {
55
58
  videoTracks: VideoTrack[];
56
59
  audioTracks: AudioTrack[];
57
60
  };
58
- export type ParseMediaContainer = 'mp4' | 'webm';
61
+ export type ParseMediaContainer = 'mp4' | 'webm' | 'avi';
59
62
  export type ParseMediaCallbacks<Fields extends Options<ParseMediaFields>> = (Fields['dimensions'] extends true ? {
60
63
  onDimensions?: (dimensions: Dimensions) => void;
61
64
  } : {}) & (Fields['durationInSeconds'] extends true ? {
62
65
  onDurationInSeconds?: (durationInSeconds: number | null) => void;
63
- } : {}) & (Fields['boxes'] extends true ? {
64
- onBoxes?: (boxes: AnySegment[]) => void;
66
+ } : {}) & (Fields['structure'] extends true ? {
67
+ onStructure?: (structure: Structure) => void;
65
68
  } : {}) & (Fields['fps'] extends true ? {
66
69
  onFps?: (fps: number | null) => void;
67
70
  } : {}) & (Fields['videoCodec'] extends true ? {
@@ -74,6 +77,8 @@ export type ParseMediaCallbacks<Fields extends Options<ParseMediaFields>> = (Fie
74
77
  onRotation?: (rotation: number | null) => void;
75
78
  } : {}) & (Fields['unrotatedDimensions'] extends true ? {
76
79
  onUnrotatedDimensions?: (dimensions: Dimensions) => void;
80
+ } : {}) & (Fields['isHdr'] extends true ? {
81
+ onIsHdr?: (isHdr: boolean) => void;
77
82
  } : {}) & (Fields['internalStats'] extends true ? {
78
83
  onInternalStats?: (stats: InternalStats) => void;
79
84
  } : {}) & (Fields['size'] extends true ? {
@@ -87,8 +92,8 @@ export type ParseMediaResult<Fields extends Options<ParseMediaFields>> = (Fields
87
92
  dimensions: Dimensions;
88
93
  } : {}) & (Fields['durationInSeconds'] extends true ? {
89
94
  durationInSeconds: number | null;
90
- } : {}) & (Fields['boxes'] extends true ? {
91
- boxes: AnySegment[];
95
+ } : {}) & (Fields['structure'] extends true ? {
96
+ structure: Structure;
92
97
  } : {}) & (Fields['fps'] extends true ? {
93
98
  fps: number | null;
94
99
  } : {}) & (Fields['videoCodec'] extends true ? {
@@ -99,6 +104,8 @@ export type ParseMediaResult<Fields extends Options<ParseMediaFields>> = (Fields
99
104
  rotation: number | null;
100
105
  } : {}) & (Fields['unrotatedDimensions'] extends true ? {
101
106
  unrotatedDimensions: Dimensions;
107
+ } : {}) & (Fields['isHdr'] extends true ? {
108
+ isHdr: boolean;
102
109
  } : {}) & (Fields['internalStats'] extends true ? {
103
110
  internalStats: InternalStats;
104
111
  } : {}) & (Fields['size'] extends true ? {
@@ -24,6 +24,7 @@ const parseMedia = async ({ src, fields, reader: readerInterface = from_fetch_1.
24
24
  const moreFields = more;
25
25
  let iterator = null;
26
26
  let parseResult = null;
27
+ // TODO: Should be possible to skip if `null` is returned
27
28
  const canSkipVideoData = !onVideoTrack && !onAudioTrack;
28
29
  if (canSkipVideoData) {
29
30
  log_1.Log.verbose(logLevel, 'Only parsing metadata, because no onVideoTrack and onAudioTrack callbacks were passed.');
@@ -40,6 +41,7 @@ const parseMedia = async ({ src, fields, reader: readerInterface = from_fetch_1.
40
41
  typeof process.env !== 'undefined' &&
41
42
  process.env.KEEP_SAMPLES === 'true'),
42
43
  supportsContentRange,
44
+ nextTrackIndex: 0,
43
45
  };
44
46
  const hasAllInfo = () => {
45
47
  if (parseResult === null) {
@@ -97,7 +99,7 @@ const parseMedia = async ({ src, fields, reader: readerInterface = from_fetch_1.
97
99
  }));
98
100
  triggerInfoEmit();
99
101
  if (parseResult && parseResult.status === 'incomplete') {
100
- log_1.Log.verbose(logLevel, 'Continuing parsing of file, currently at position', iterator.counter.getOffset(), (0, has_all_info_1.getAvailableInfo)(fields !== null && fields !== void 0 ? fields : {}, parseResult, state));
102
+ log_1.Log.verbose(logLevel, 'Continuing parsing of file, currently at position', iterator.counter.getOffset());
101
103
  parseResult = await parseResult.continueParsing();
102
104
  }
103
105
  else {
@@ -25,24 +25,38 @@ import type { TkhdBox } from './boxes/iso-base-media/tkhd';
25
25
  import type { TrakBox } from './boxes/iso-base-media/trak/trak';
26
26
  import type { TrunBox } from './boxes/iso-base-media/trun';
27
27
  import type { VoidBox } from './boxes/iso-base-media/void-box';
28
+ import type { RiffBox } from './boxes/riff/riff-box';
28
29
  import type { MatroskaSegment } from './boxes/webm/segments';
29
30
  export interface RegularBox extends BaseBox {
30
31
  boxType: string;
31
32
  boxSize: number;
32
- children: AnySegment[];
33
+ children: IsoBaseMediaBox[];
33
34
  offset: number;
34
35
  type: 'regular-box';
35
36
  }
36
37
  export type IsoBaseMediaBox = RegularBox | FtypBox | MvhdBox | TkhdBox | StsdBox | MebxBox | KeysBox | MoovBox | TrakBox | SttsBox | MdhdBox | EsdsBox | MdatBox | StszBox | StcoBox | StscBox | AvccBox | HvccBox | VoidBox | StssBox | PaspBox | CttsBox | Av1CBox | TrunBox | ColorParameterBox | TfdtBox | TfhdBox;
37
- export type AnySegment = MatroskaSegment | IsoBaseMediaBox;
38
- export type ParseResult = {
38
+ export type AnySegment = MatroskaSegment | IsoBaseMediaBox | RiffBox;
39
+ export type IsoBaseMediaStructure = {
40
+ type: 'iso-base-media';
41
+ boxes: IsoBaseMediaBox[];
42
+ };
43
+ export type RiffStructure = {
44
+ type: 'riff';
45
+ boxes: RiffBox[];
46
+ };
47
+ export type MatroskaStructure = {
48
+ type: 'matroska';
49
+ boxes: MatroskaSegment[];
50
+ };
51
+ export type Structure = IsoBaseMediaStructure | RiffStructure | MatroskaStructure;
52
+ export type ParseResult<TStructure extends Structure> = {
39
53
  status: 'done';
40
- segments: AnySegment[];
54
+ segments: TStructure;
41
55
  } | {
42
56
  status: 'incomplete';
43
- segments: AnySegment[];
57
+ segments: TStructure;
44
58
  skipTo: number | null;
45
- continueParsing: () => Promise<ParseResult>;
59
+ continueParsing: () => Promise<ParseResult<TStructure>>;
46
60
  };
47
61
  export type MatroskaParseResult = {
48
62
  status: 'done';
@@ -1,6 +1,6 @@
1
1
  import type { BufferIterator } from './buffer-iterator';
2
2
  import { type LogLevel } from './log';
3
- import type { IsoBaseMediaBox, ParseResult } from './parse-result';
3
+ import type { IsoBaseMediaBox, ParseResult, Structure } from './parse-result';
4
4
  import type { ParserContext } from './parser-context';
5
5
  export type PartialMdatBox = {
6
6
  type: 'partial-mdat-box';
@@ -20,4 +20,4 @@ export declare const parseVideo: ({ iterator, options, signal, logLevel, }: {
20
20
  options: ParserContext;
21
21
  signal: AbortSignal | null;
22
22
  logLevel: LogLevel;
23
- }) => Promise<ParseResult>;
23
+ }) => Promise<ParseResult<Structure>>;
@@ -2,30 +2,19 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.parseVideo = void 0;
4
4
  const process_box_1 = require("./boxes/iso-base-media/process-box");
5
+ const parse_box_1 = require("./boxes/riff/parse-box");
5
6
  const parse_webm_header_1 = require("./boxes/webm/parse-webm-header");
6
7
  const log_1 = require("./log");
7
8
  const parseVideo = ({ iterator, options, signal, logLevel, }) => {
8
9
  if (iterator.bytesRemaining() === 0) {
9
- return Promise.resolve({
10
- status: 'incomplete',
11
- segments: [],
12
- continueParsing: () => {
13
- return (0, exports.parseVideo)({
14
- iterator,
15
- options,
16
- signal,
17
- logLevel,
18
- });
19
- },
20
- skipTo: null,
21
- });
10
+ return Promise.reject(new Error('no bytes'));
22
11
  }
23
12
  if (iterator.isRiff()) {
24
- throw new Error('AVI files are not yet supported');
13
+ return Promise.resolve((0, parse_box_1.parseRiff)({ iterator, options }));
25
14
  }
26
15
  if (iterator.isIsoBaseMedia()) {
27
16
  log_1.Log.verbose(logLevel, 'Detected ISO Base Media container');
28
- return (0, process_box_1.parseBoxes)({
17
+ return (0, process_box_1.parseIsoBaseMediaBoxes)({
29
18
  iterator,
30
19
  maxBytes: Infinity,
31
20
  allowIncompleteBoxes: true,
@@ -38,7 +27,7 @@ const parseVideo = ({ iterator, options, signal, logLevel, }) => {
38
27
  }
39
28
  if (iterator.isWebm()) {
40
29
  log_1.Log.verbose(logLevel, 'Detected Matroska container');
41
- return Promise.resolve((0, parse_webm_header_1.parseWebm)(iterator, options));
30
+ return (0, parse_webm_header_1.parseWebm)(iterator, options);
42
31
  }
43
32
  if (iterator.isMp3()) {
44
33
  return Promise.reject(new Error('MP3 files are not yet supported'));
@@ -7,4 +7,5 @@ export type ParserContext = {
7
7
  parserState: ParserState;
8
8
  nullifySamples: boolean;
9
9
  supportsContentRange: boolean;
10
+ nextTrackIndex: number;
10
11
  };
@@ -1,13 +1,21 @@
1
+ import type { AvcPPs, AvcProfileInfo } from './boxes/avc/parse-avc';
1
2
  import type { OnTrackEntrySegment } from './boxes/webm/segments';
2
3
  import type { TrackInfo } from './boxes/webm/segments/track-entry';
3
4
  import type { AudioOrVideoSample, OnAudioSample, OnVideoSample } from './webcodec-sample-types';
4
5
  export type InternalStats = {};
6
+ export type SpsAndPps = {
7
+ sps: AvcProfileInfo;
8
+ pps: AvcPPs;
9
+ };
10
+ type AvcProfileInfoCallback = (profile: SpsAndPps) => Promise<void>;
5
11
  export declare const makeParserState: ({ hasAudioCallbacks, hasVideoCallbacks, signal, }: {
6
12
  hasAudioCallbacks: boolean;
7
13
  hasVideoCallbacks: boolean;
8
14
  signal: AbortSignal | undefined;
9
15
  }) => {
10
16
  onTrackEntrySegment: OnTrackEntrySegment;
17
+ onProfile: (profile: SpsAndPps) => Promise<void>;
18
+ registerOnAvcProfileCallback: (callback: AvcProfileInfoCallback) => void;
11
19
  getTrackInfoByNumber: (id: number) => TrackInfo;
12
20
  registerVideoSampleCallback: (id: number, callback: OnVideoSample | null) => Promise<void>;
13
21
  setTimestampOffset: (byteOffset: number, timestamp: number) => void;
@@ -18,5 +26,8 @@ export declare const makeParserState: ({ hasAudioCallbacks, hasVideoCallbacks, s
18
26
  getInternalStats: () => {};
19
27
  getTimescale: () => number;
20
28
  setTimescale: (newTimescale: number) => void;
29
+ getSamplesForTrack: (trackId: number) => number;
30
+ getAvcProfile: () => SpsAndPps | null;
21
31
  };
22
32
  export type ParserState = ReturnType<typeof makeParserState>;
33
+ export {};
@@ -59,8 +59,23 @@ const makeParserState = ({ hasAudioCallbacks, hasVideoCallbacks, signal, }) => {
59
59
  }
60
60
  return timestampMap.get(byteOffset);
61
61
  };
62
+ const samplesForTrack = {};
63
+ const profileCallbacks = [];
64
+ const registerOnAvcProfileCallback = (callback) => {
65
+ profileCallbacks.push(callback);
66
+ };
67
+ let avcProfile = null;
68
+ const onProfile = async (profile) => {
69
+ avcProfile = profile;
70
+ for (const callback of profileCallbacks) {
71
+ await callback(profile);
72
+ }
73
+ profileCallbacks.length = 0;
74
+ };
62
75
  return {
63
76
  onTrackEntrySegment,
77
+ onProfile,
78
+ registerOnAvcProfileCallback,
64
79
  getTrackInfoByNumber: (id) => trackEntries[id],
65
80
  registerVideoSampleCallback: async (id, callback) => {
66
81
  var _a;
@@ -94,6 +109,10 @@ const makeParserState = ({ hasAudioCallbacks, hasVideoCallbacks, signal, }) => {
94
109
  if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
95
110
  throw new Error('Aborted');
96
111
  }
112
+ if (typeof samplesForTrack[trackId] === 'undefined') {
113
+ samplesForTrack[trackId] = 0;
114
+ }
115
+ samplesForTrack[trackId]++;
97
116
  const callback = audioSampleCallbacks[trackId];
98
117
  if (callback) {
99
118
  await callback(audioSample);
@@ -111,6 +130,10 @@ const makeParserState = ({ hasAudioCallbacks, hasVideoCallbacks, signal, }) => {
111
130
  if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
112
131
  throw new Error('Aborted');
113
132
  }
133
+ if (typeof samplesForTrack[trackId] === 'undefined') {
134
+ samplesForTrack[trackId] = 0;
135
+ }
136
+ samplesForTrack[trackId]++;
114
137
  const callback = videoSampleCallbacks[trackId];
115
138
  if (callback) {
116
139
  await callback(videoSample);
@@ -127,6 +150,13 @@ const makeParserState = ({ hasAudioCallbacks, hasVideoCallbacks, signal, }) => {
127
150
  getInternalStats: () => ({}),
128
151
  getTimescale,
129
152
  setTimescale,
153
+ getSamplesForTrack: (trackId) => {
154
+ var _a;
155
+ return (_a = samplesForTrack[trackId]) !== null && _a !== void 0 ? _a : 0;
156
+ },
157
+ getAvcProfile: () => {
158
+ return avcProfile;
159
+ },
130
160
  };
131
161
  };
132
162
  exports.makeParserState = makeParserState;
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.nodeReader = void 0;
4
4
  const fs_1 = require("fs");
5
5
  const promises_1 = require("node:fs/promises");
6
+ const path_1 = require("path");
6
7
  const stream_1 = require("stream");
7
8
  exports.nodeReader = {
8
9
  read: async (src, range, signal) => {
@@ -37,7 +38,7 @@ exports.nodeReader = {
37
38
  },
38
39
  },
39
40
  contentLength: stats.size,
40
- name: src.split('/').pop(),
41
+ name: src.split(path_1.sep).pop(),
41
42
  supportsContentRange: true,
42
43
  };
43
44
  },
@@ -0,0 +1,13 @@
1
+ import type { Track, VideoTrack } from './get-tracks';
2
+ import type { ParserContext } from './parser-context';
3
+ import type { ParserState } from './parser-state';
4
+ export declare const registerTrack: ({ state, options, track, }: {
5
+ state: ParserState;
6
+ options: ParserContext;
7
+ track: Track;
8
+ }) => Promise<void>;
9
+ export declare const registerVideoTrackWhenProfileIsAvailable: ({ options, state, track, }: {
10
+ state: ParserState;
11
+ options: ParserContext;
12
+ track: VideoTrack;
13
+ }) => void;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerVideoTrackWhenProfileIsAvailable = exports.registerTrack = void 0;
4
+ const add_avc_profile_to_track_1 = require("./add-avc-profile-to-track");
5
+ const registerTrack = async ({ state, options, track, }) => {
6
+ if (track.type === 'video' && options.onVideoTrack) {
7
+ const callback = await options.onVideoTrack(track);
8
+ await state.registerVideoSampleCallback(track.trackId, callback !== null && callback !== void 0 ? callback : null);
9
+ }
10
+ if (track.type === 'audio' && options.onAudioTrack) {
11
+ const callback = await options.onAudioTrack(track);
12
+ await state.registerAudioSampleCallback(track.trackId, callback !== null && callback !== void 0 ? callback : null);
13
+ }
14
+ };
15
+ exports.registerTrack = registerTrack;
16
+ const registerVideoTrackWhenProfileIsAvailable = ({ options, state, track, }) => {
17
+ state.registerOnAvcProfileCallback(async (profile) => {
18
+ await (0, exports.registerTrack)({
19
+ options,
20
+ state,
21
+ track: (0, add_avc_profile_to_track_1.addAvcProfileToTrack)(track, profile),
22
+ });
23
+ });
24
+ };
25
+ exports.registerVideoTrackWhenProfileIsAvailable = registerVideoTrackWhenProfileIsAvailable;
package/dist/version.d.ts CHANGED
@@ -1 +1 @@
1
- export declare const VERSION = "4.0.231";
1
+ export declare const VERSION = "4.0.233";
package/dist/version.js CHANGED
@@ -2,4 +2,4 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.VERSION = void 0;
4
4
  // Automatically generated on publish
5
- exports.VERSION = '4.0.231';
5
+ exports.VERSION = '4.0.233';
package/package.json CHANGED
@@ -3,14 +3,14 @@
3
3
  "url": "https://github.com/remotion-dev/remotion/tree/main/packages/media-parser"
4
4
  },
5
5
  "name": "@remotion/media-parser",
6
- "version": "4.0.231",
6
+ "version": "4.0.233",
7
7
  "main": "dist/index.js",
8
8
  "sideEffects": false,
9
9
  "devDependencies": {
10
10
  "@types/wicg-file-system-access": "2023.10.5",
11
11
  "eslint": "9.14.0",
12
- "@remotion/example-videos": "4.0.231",
13
- "@remotion/eslint-config-internal": "4.0.231"
12
+ "@remotion/example-videos": "4.0.233",
13
+ "@remotion/eslint-config-internal": "4.0.233"
14
14
  },
15
15
  "publishConfig": {
16
16
  "access": "public"