@remotion/media-parser 4.0.228 → 4.0.230

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 (165) hide show
  1. package/dist/boxes/iso-base-media/esds/decoder-specific-config.d.ts +3 -2
  2. package/dist/boxes/iso-base-media/esds/decoder-specific-config.js +7 -8
  3. package/dist/boxes/iso-base-media/esds/esds-descriptors.d.ts +4 -2
  4. package/dist/boxes/iso-base-media/esds/esds-descriptors.js +5 -4
  5. package/dist/boxes/iso-base-media/esds/esds.d.ts +3 -1
  6. package/dist/boxes/iso-base-media/esds/esds.js +2 -2
  7. package/dist/boxes/iso-base-media/make-track.js +2 -1
  8. package/dist/boxes/iso-base-media/mdat/mdat.js +13 -8
  9. package/dist/boxes/iso-base-media/moov/moov.d.ts +3 -1
  10. package/dist/boxes/iso-base-media/moov/moov.js +2 -2
  11. package/dist/boxes/iso-base-media/mvhd.js +11 -9
  12. package/dist/boxes/iso-base-media/parse-icc-profile.d.ts +36 -0
  13. package/dist/boxes/iso-base-media/parse-icc-profile.js +115 -0
  14. package/dist/boxes/iso-base-media/process-box.d.ts +5 -4
  15. package/dist/boxes/iso-base-media/process-box.js +17 -14
  16. package/dist/boxes/iso-base-media/stsd/colr.d.ts +14 -4
  17. package/dist/boxes/iso-base-media/stsd/colr.js +13 -1
  18. package/dist/boxes/iso-base-media/stsd/mebx.d.ts +1 -2
  19. package/dist/boxes/iso-base-media/stsd/mebx.js +2 -2
  20. package/dist/boxes/iso-base-media/stsd/samples.d.ts +5 -2
  21. package/dist/boxes/iso-base-media/stsd/samples.js +7 -6
  22. package/dist/boxes/iso-base-media/stsd/stsd.js +1 -0
  23. package/dist/boxes/iso-base-media/to-date.d.ts +1 -0
  24. package/dist/boxes/iso-base-media/to-date.js +9 -1
  25. package/dist/boxes/iso-base-media/trak/trak.d.ts +3 -1
  26. package/dist/boxes/iso-base-media/trak/trak.js +2 -2
  27. package/dist/boxes/webm/av1-codec-private.js +1 -1
  28. package/dist/boxes/webm/ebml.d.ts +1 -1
  29. package/dist/boxes/webm/get-sample-from-block.d.ts +4 -4
  30. package/dist/boxes/webm/get-sample-from-block.js +5 -2
  31. package/dist/boxes/webm/make-track.js +1 -0
  32. package/dist/buffer-iterator.d.ts +1 -1
  33. package/dist/buffer-iterator.js +1 -8
  34. package/dist/create/iso-base-media/codec-specific/avc1.d.ts +2 -0
  35. package/dist/create/iso-base-media/codec-specific/avc1.js +48 -0
  36. package/dist/create/iso-base-media/codec-specific/create-codec-specific-data.d.ts +22 -0
  37. package/dist/create/iso-base-media/codec-specific/create-codec-specific-data.js +36 -0
  38. package/dist/create/iso-base-media/codec-specific/mp4a.d.ts +2 -0
  39. package/dist/create/iso-base-media/codec-specific/mp4a.js +90 -0
  40. package/dist/create/iso-base-media/create-colr.d.ts +6 -0
  41. package/dist/create/iso-base-media/create-colr.js +26 -0
  42. package/dist/create/iso-base-media/create-ftyp.d.ts +10 -0
  43. package/dist/create/iso-base-media/create-ftyp.js +22 -0
  44. package/dist/create/iso-base-media/create-ilst.d.ts +1 -0
  45. package/dist/create/iso-base-media/create-ilst.js +14 -0
  46. package/dist/create/iso-base-media/create-iso-base-media.d.ts +2 -0
  47. package/dist/create/iso-base-media/create-iso-base-media.js +168 -0
  48. package/dist/create/iso-base-media/create-mdia.d.ts +5 -0
  49. package/dist/create/iso-base-media/create-mdia.js +18 -0
  50. package/dist/create/iso-base-media/create-moov.d.ts +5 -0
  51. package/dist/create/iso-base-media/create-moov.js +18 -0
  52. package/dist/create/iso-base-media/create-mvhd.d.ts +10 -0
  53. package/dist/create/iso-base-media/create-mvhd.js +48 -0
  54. package/dist/create/iso-base-media/create-trak.d.ts +4 -0
  55. package/dist/create/iso-base-media/create-trak.js +17 -0
  56. package/dist/create/iso-base-media/create-udta.d.ts +1 -0
  57. package/dist/create/iso-base-media/create-udta.js +14 -0
  58. package/dist/create/iso-base-media/create-url.d.ts +1 -0
  59. package/dist/create/iso-base-media/create-url.js +16 -0
  60. package/dist/create/iso-base-media/example-stts.d.ts +3 -0
  61. package/dist/create/iso-base-media/example-stts.js +2797 -0
  62. package/dist/create/iso-base-media/ilst/create-cmt.d.ts +1 -0
  63. package/dist/create/iso-base-media/ilst/create-cmt.js +26 -0
  64. package/dist/create/iso-base-media/ilst/create-too.d.ts +1 -0
  65. package/dist/create/iso-base-media/ilst/create-too.js +27 -0
  66. package/dist/create/iso-base-media/mdia/create-mdhd.d.ts +6 -0
  67. package/dist/create/iso-base-media/mdia/create-mdhd.js +33 -0
  68. package/dist/create/iso-base-media/mp4-header.d.ts +6 -0
  69. package/dist/create/iso-base-media/mp4-header.js +47 -0
  70. package/dist/create/iso-base-media/primitives.d.ts +15 -0
  71. package/dist/create/iso-base-media/primitives.js +133 -0
  72. package/dist/create/iso-base-media/serialize-track.d.ts +9 -0
  73. package/dist/create/iso-base-media/serialize-track.js +63 -0
  74. package/dist/create/iso-base-media/trak/create-tkhd.d.ts +27 -0
  75. package/dist/create/iso-base-media/trak/create-tkhd.js +97 -0
  76. package/dist/create/iso-base-media/trak/mdia/create-minf.d.ts +4 -0
  77. package/dist/create/iso-base-media/trak/mdia/create-minf.js +19 -0
  78. package/dist/create/iso-base-media/trak/mdia/minf/create-dinf.d.ts +1 -0
  79. package/dist/create/iso-base-media/trak/mdia/minf/create-dinf.js +22 -0
  80. package/dist/create/iso-base-media/trak/mdia/minf/create-smhd.d.ts +1 -0
  81. package/dist/create/iso-base-media/trak/mdia/minf/create-smhd.js +20 -0
  82. package/dist/create/iso-base-media/trak/mdia/minf/create-stbl.d.ts +6 -0
  83. package/dist/create/iso-base-media/trak/mdia/minf/create-stbl.js +35 -0
  84. package/dist/create/iso-base-media/trak/mdia/minf/create-vmhd.d.ts +1 -0
  85. package/dist/create/iso-base-media/trak/mdia/minf/create-vmhd.js +20 -0
  86. package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-ctts.d.ts +2 -0
  87. package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-ctts.js +45 -0
  88. package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-stco.d.ts +2 -0
  89. package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-stco.js +28 -0
  90. package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-stsc.d.ts +2 -0
  91. package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-stsc.js +56 -0
  92. package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-stss.d.ts +2 -0
  93. package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-stss.js +23 -0
  94. package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-stsz.d.ts +2 -0
  95. package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-stsz.js +25 -0
  96. package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-stts.d.ts +2 -0
  97. package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-stts.js +48 -0
  98. package/dist/create/iso-base-media/trak/mdia/minf/stbl/stsd/create-avc1.d.ts +1 -0
  99. package/dist/create/iso-base-media/trak/mdia/minf/stbl/stsd/create-avc1.js +20 -0
  100. package/dist/create/iso-base-media/trak/mdia/minf/stbl/stsd/create-avcc.d.ts +1 -0
  101. package/dist/create/iso-base-media/trak/mdia/minf/stbl/stsd/create-avcc.js +16 -0
  102. package/dist/create/iso-base-media/trak/mdia/minf/stbl/stsd/create-pasp.d.ts +1 -0
  103. package/dist/create/iso-base-media/trak/mdia/minf/stbl/stsd/create-pasp.js +13 -0
  104. package/dist/create/iso-base-media/udta/create-meta.d.ts +4 -0
  105. package/dist/create/iso-base-media/udta/create-meta.js +20 -0
  106. package/dist/create/iso-base-media/udta/meta/create-hdlr.d.ts +1 -0
  107. package/dist/create/iso-base-media/udta/meta/create-hdlr.js +32 -0
  108. package/dist/create/make-track-info.d.ts +20 -0
  109. package/dist/create/make-track-info.js +2 -0
  110. package/dist/create/{cluster-segment.d.ts → matroska/cluster-segment.d.ts} +1 -1
  111. package/dist/create/{cluster-segment.js → matroska/cluster-segment.js} +2 -2
  112. package/dist/create/matroska/cluster.d.ts +19 -0
  113. package/dist/create/matroska/cluster.js +74 -0
  114. package/dist/create/matroska/create-matroska-media.d.ts +2 -0
  115. package/dist/create/{create-media.js → matroska/create-matroska-media.js} +26 -19
  116. package/dist/create/matroska/make-duration-with-padding.d.ts +1 -0
  117. package/dist/create/{make-duration-with-padding.js → matroska/make-duration-with-padding.js} +1 -1
  118. package/dist/create/{matroska-cues.d.ts → matroska/matroska-cues.d.ts} +1 -1
  119. package/dist/create/{matroska-cues.js → matroska/matroska-cues.js} +1 -1
  120. package/dist/create/matroska/matroska-header.d.ts +1 -0
  121. package/dist/create/{matroska-header.js → matroska/matroska-header.js} +1 -1
  122. package/dist/create/{matroska-info.d.ts → matroska/matroska-info.d.ts} +1 -1
  123. package/dist/create/{matroska-info.js → matroska/matroska-info.js} +1 -1
  124. package/dist/create/matroska/matroska-seek.d.ts +6 -0
  125. package/dist/create/{matroska-seek.js → matroska/matroska-seek.js} +1 -1
  126. package/dist/create/{matroska-segment.d.ts → matroska/matroska-segment.d.ts} +1 -1
  127. package/dist/create/{matroska-segment.js → matroska/matroska-segment.js} +1 -1
  128. package/dist/create/matroska/matroska-trackentry.d.ts +10 -0
  129. package/dist/create/{matroska-trackentry.js → matroska/matroska-trackentry.js} +9 -3
  130. package/dist/create/media-fn.d.ts +31 -0
  131. package/dist/create/media-fn.js +2 -0
  132. package/dist/create/timescale.d.ts +1 -1
  133. package/dist/create/timescale.js +2 -2
  134. package/dist/esm/buffer.mjs +6 -7
  135. package/dist/esm/index.mjs +1476 -215
  136. package/dist/get-audio-codec.d.ts +1 -0
  137. package/dist/get-audio-codec.js +27 -3
  138. package/dist/get-fps.d.ts +1 -0
  139. package/dist/get-fps.js +17 -13
  140. package/dist/get-sample-positions.d.ts +1 -0
  141. package/dist/get-sample-positions.js +1 -0
  142. package/dist/get-tracks.d.ts +1 -0
  143. package/dist/get-video-codec.js +4 -0
  144. package/dist/index.d.ts +4 -7
  145. package/dist/index.js +4 -2
  146. package/dist/options.d.ts +2 -0
  147. package/dist/parse-media.js +2 -1
  148. package/dist/parse-video.d.ts +3 -1
  149. package/dist/parse-video.js +3 -14
  150. package/dist/parser-state.d.ts +3 -3
  151. package/dist/samples-from-moof.js +1 -0
  152. package/dist/webcodec-sample-types.d.ts +7 -13
  153. package/dist/writers/buffer-implementation/writer.d.ts +2 -0
  154. package/dist/writers/buffer-implementation/writer.js +54 -0
  155. package/dist/writers/buffer.js +2 -53
  156. package/dist/writers/web-fs.js +1 -0
  157. package/dist/writers/writer.d.ts +1 -1
  158. package/package.json +4 -4
  159. package/dist/create/cluster.d.ts +0 -19
  160. package/dist/create/cluster.js +0 -55
  161. package/dist/create/create-media.d.ts +0 -19
  162. package/dist/create/make-duration-with-padding.d.ts +0 -1
  163. package/dist/create/matroska-header.d.ts +0 -1
  164. package/dist/create/matroska-seek.d.ts +0 -6
  165. package/dist/create/matroska-trackentry.d.ts +0 -27
@@ -11,6 +11,7 @@ type AudioCodecInfo = {
11
11
  secondarySpecificator: number | null;
12
12
  description: Uint8Array | undefined;
13
13
  };
14
+ export declare const getCodecPrivateFromTrak: (trakBox: TrakBox) => Uint8Array | null;
14
15
  export declare const getNumberOfChannelsFromTrak: (trak: TrakBox) => number | null;
15
16
  export declare const getSampleRate: (trak: TrakBox) => number | null;
16
17
  export declare const getAudioCodecFromTrak: (trak: TrakBox) => AudioCodecInfo | null;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getAudioCodecFromTrack = exports.getAudioCodecStringFromTrak = exports.getAudioCodecFromIso = exports.getAudioCodecFromTrak = exports.getSampleRate = exports.getNumberOfChannelsFromTrak = exports.hasAudioCodec = exports.getAudioCodec = void 0;
3
+ exports.getAudioCodecFromTrack = exports.getAudioCodecStringFromTrak = exports.getAudioCodecFromIso = exports.getAudioCodecFromTrak = exports.getSampleRate = exports.getNumberOfChannelsFromTrak = exports.getCodecPrivateFromTrak = exports.hasAudioCodec = exports.getAudioCodec = void 0;
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");
@@ -47,10 +47,10 @@ const getCodecSpecificatorFromEsdsBox = ({ child, }) => {
47
47
  };
48
48
  }
49
49
  const audioSpecificConfig = descriptor.decoderSpecificConfigs.find((d) => {
50
- return d.type === 'audio-specific-config' ? d : null;
50
+ return d.type === 'mp4a-specific-config' ? d : null;
51
51
  });
52
52
  if (!audioSpecificConfig ||
53
- audioSpecificConfig.type !== 'audio-specific-config') {
53
+ audioSpecificConfig.type !== 'mp4a-specific-config') {
54
54
  throw new Error('No audio-specific-config');
55
55
  }
56
56
  return {
@@ -59,6 +59,30 @@ const getCodecSpecificatorFromEsdsBox = ({ child, }) => {
59
59
  description: audioSpecificConfig.asBytes,
60
60
  };
61
61
  };
62
+ const getCodecPrivateFromTrak = (trakBox) => {
63
+ const stsdBox = (0, traversal_1.getStsdBox)(trakBox);
64
+ if (!stsdBox) {
65
+ return null;
66
+ }
67
+ const audioSample = stsdBox.samples.find((s) => s.type === 'audio');
68
+ if (!audioSample || audioSample.type !== 'audio') {
69
+ return null;
70
+ }
71
+ const esds = audioSample.children.find((b) => b.type === 'esds-box');
72
+ if (!esds || esds.type !== 'esds-box') {
73
+ return null;
74
+ }
75
+ const decoderConfigDescriptor = esds.descriptors.find((d) => d.type === 'decoder-config-descriptor');
76
+ if (!decoderConfigDescriptor) {
77
+ return null;
78
+ }
79
+ const mp4a = decoderConfigDescriptor.decoderSpecificConfigs.find((d) => d.type === 'mp4a-specific-config');
80
+ if (!mp4a) {
81
+ return null;
82
+ }
83
+ return mp4a.asBytes;
84
+ };
85
+ exports.getCodecPrivateFromTrak = getCodecPrivateFromTrak;
62
86
  const onSample = (sample, children) => {
63
87
  const child = children.find((c) => c.type === 'esds-box');
64
88
  if (child && child.type === 'esds-box') {
package/dist/get-fps.d.ts CHANGED
@@ -7,6 +7,7 @@ type TimescaleAndDuration = {
7
7
  export declare const trakBoxContainsAudio: (trakBox: TrakBox) => boolean;
8
8
  export declare const trakBoxContainsVideo: (trakBox: TrakBox) => boolean;
9
9
  export declare const getTimescaleAndDuration: (trakBox: TrakBox) => TimescaleAndDuration | null;
10
+ export declare const getFpsFromMp4TrakBox: (trakBox: TrakBox) => number | null;
10
11
  export declare const getFps: (segments: AnySegment[]) => number | null;
11
12
  export declare const hasFps: (boxes: AnySegment[]) => boolean;
12
13
  export {};
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.getTimescaleAndDuration = exports.trakBoxContainsVideo = exports.trakBoxContainsAudio = void 0;
3
+ exports.hasFps = 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 calculateFps = ({ sttsBox, timeScale, durationInSamples, }) => {
6
6
  let totalSamples = 0;
@@ -43,21 +43,12 @@ const getTimescaleAndDuration = (trakBox) => {
43
43
  return null;
44
44
  };
45
45
  exports.getTimescaleAndDuration = getTimescaleAndDuration;
46
- const getFps = (segments) => {
47
- const moovBox = (0, traversal_1.getMoovBox)(segments);
48
- if (!moovBox) {
49
- return null;
50
- }
51
- const trackBoxes = (0, traversal_1.getTraks)(moovBox);
52
- const trackBox = trackBoxes.find(exports.trakBoxContainsVideo);
53
- if (!trackBox) {
54
- return null;
55
- }
56
- const timescaleAndDuration = (0, exports.getTimescaleAndDuration)(trackBox);
46
+ const getFpsFromMp4TrakBox = (trakBox) => {
47
+ const timescaleAndDuration = (0, exports.getTimescaleAndDuration)(trakBox);
57
48
  if (!timescaleAndDuration) {
58
49
  return null;
59
50
  }
60
- const sttsBox = (0, traversal_1.getSttsBox)(trackBox);
51
+ const sttsBox = (0, traversal_1.getSttsBox)(trakBox);
61
52
  if (!sttsBox) {
62
53
  return null;
63
54
  }
@@ -67,6 +58,19 @@ const getFps = (segments) => {
67
58
  durationInSamples: timescaleAndDuration.duration,
68
59
  });
69
60
  };
61
+ exports.getFpsFromMp4TrakBox = getFpsFromMp4TrakBox;
62
+ const getFps = (segments) => {
63
+ const moovBox = (0, traversal_1.getMoovBox)(segments);
64
+ if (!moovBox) {
65
+ return null;
66
+ }
67
+ const trackBoxes = (0, traversal_1.getTraks)(moovBox);
68
+ const trackBox = trackBoxes.find(exports.trakBoxContainsVideo);
69
+ if (!trackBox) {
70
+ return null;
71
+ }
72
+ return (0, exports.getFpsFromMp4TrakBox)(trackBox);
73
+ };
70
74
  exports.getFps = getFps;
71
75
  const hasFps = (boxes) => {
72
76
  try {
@@ -11,6 +11,7 @@ export type SamplePosition = {
11
11
  dts: number;
12
12
  cts: number;
13
13
  duration: number;
14
+ chunk: number;
14
15
  };
15
16
  export declare const getSamplePositions: ({ stcoBox, stszBox, stscBox, stssBox, sttsBox, cttsBox, }: {
16
17
  stcoBox: StcoBox;
@@ -44,6 +44,7 @@ const getSamplePositions = ({ stcoBox, stszBox, stscBox, stssBox, sttsBox, cttsB
44
44
  dts,
45
45
  cts,
46
46
  duration: delta,
47
+ chunk: i,
47
48
  });
48
49
  dts += delta;
49
50
  offsetInThisChunk += size;
@@ -32,6 +32,7 @@ export type VideoTrack = {
32
32
  trakBox: TrakBox | null;
33
33
  codecPrivate: Uint8Array | null;
34
34
  color: VideoTrackColorParams;
35
+ fps: number | null;
35
36
  };
36
37
  export type AudioTrack = {
37
38
  type: 'audio';
@@ -135,6 +135,10 @@ const getIsoBmColrConfig = (trakBox) => {
135
135
  if (!colrAtom) {
136
136
  return null;
137
137
  }
138
+ // TODO: Not doing anything with a in ICC color profile yet
139
+ if (colrAtom.colorType !== 'transfer-characteristics') {
140
+ return null;
141
+ }
138
142
  // https://github.com/bbc/qtff-parameter-editor
139
143
  return {
140
144
  fullRange: colrAtom.fullRangeFlag,
package/dist/index.d.ts CHANGED
@@ -3,17 +3,14 @@ export { WriterInterface } from './writers/writer';
3
3
  export { AudioTrack, MediaParserAudioCodec, MediaParserVideoCodec, OtherTrack, Track, VideoTrack, VideoTrackColorParams, } from './get-tracks';
4
4
  export type { Options, ParseMediaContainer, ParseMediaDynamicOptions, ParseMediaFields, ParseMediaOptions, ParseMediaResult, TracksField, } from './options';
5
5
  export { parseMedia } from './parse-media';
6
- export { AudioSample, OnAudioSample, OnAudioTrack, OnVideoSample, OnVideoTrack, VideoSample, } from './webcodec-sample-types';
7
- export type { MediaFn } from './create/create-media';
6
+ export { AudioOrVideoSample, OnAudioSample, OnAudioTrack, OnVideoSample, OnVideoTrack, } from './webcodec-sample-types';
7
+ export type { MediaFn } from './create/media-fn';
8
8
  export { Dimensions } from './get-dimensions';
9
9
  export type { ReaderInterface } from './readers/reader';
10
10
  export type { LogLevel };
11
11
  export declare const MediaParserInternals: {
12
- createMedia: ({ writer, onBytesProgress, onMillisecondsProgress, }: {
13
- writer: import("./writers/writer").WriterInterface;
14
- onBytesProgress: (totalBytes: number) => void;
15
- onMillisecondsProgress: (totalMilliseconds: number) => void;
16
- }) => Promise<import("./create/create-media").MediaFn>;
12
+ createMatroskaMedia: ({ writer, onBytesProgress, onMillisecondsProgress, }: import("./create/media-fn").MediaFnGeneratorInput) => Promise<import("./create/media-fn").MediaFn>;
13
+ createIsoBaseMedia: ({ writer, onBytesProgress, onMillisecondsProgress, logLevel, }: import("./create/media-fn").MediaFnGeneratorInput) => Promise<import("./create/media-fn").MediaFn>;
17
14
  Log: {
18
15
  trace: (logLevel: LogLevel, ...args: Parameters<typeof console.log>) => void;
19
16
  verbose: (logLevel: LogLevel, ...args: Parameters<typeof console.log>) => void;
package/dist/index.js CHANGED
@@ -1,11 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.MediaParserInternals = exports.parseMedia = void 0;
4
- const create_media_1 = require("./create/create-media");
4
+ const create_iso_base_media_1 = require("./create/iso-base-media/create-iso-base-media");
5
+ const create_matroska_media_1 = require("./create/matroska/create-matroska-media");
5
6
  const log_1 = require("./log");
6
7
  var parse_media_1 = require("./parse-media");
7
8
  Object.defineProperty(exports, "parseMedia", { enumerable: true, get: function () { return parse_media_1.parseMedia; } });
8
9
  exports.MediaParserInternals = {
9
- createMedia: create_media_1.createMedia,
10
+ createMatroskaMedia: create_matroska_media_1.createMatroskaMedia,
11
+ createIsoBaseMedia: create_iso_base_media_1.createIsoBaseMedia,
10
12
  Log: log_1.Log,
11
13
  };
package/dist/options.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import type { Dimensions } from './get-dimensions';
2
2
  import type { AudioTrack, MediaParserAudioCodec, MediaParserVideoCodec, VideoTrack } from './get-tracks';
3
+ import type { LogLevel } from './log';
3
4
  import type { AnySegment } from './parse-result';
4
5
  import type { InternalStats } from './parser-state';
5
6
  import type { ReaderInterface } from './readers/reader';
@@ -116,5 +117,6 @@ export type ParseMediaOptions<F extends Options<ParseMediaFields>> = {
116
117
  onAudioTrack?: OnAudioTrack;
117
118
  onVideoTrack?: OnVideoTrack;
118
119
  signal?: AbortSignal;
120
+ logLevel?: LogLevel;
119
121
  } & ParseMediaDynamicOptions<F>;
120
122
  export type ParseMedia = <F extends Options<ParseMediaFields>>(options: ParseMediaOptions<F>) => Promise<ParseMediaResult<F>>;
@@ -7,7 +7,7 @@ const has_all_info_1 = require("./has-all-info");
7
7
  const parse_video_1 = require("./parse-video");
8
8
  const parser_state_1 = require("./parser-state");
9
9
  const from_fetch_1 = require("./readers/from-fetch");
10
- const parseMedia = async ({ src, fields, reader: readerInterface = from_fetch_1.fetchReader, onAudioTrack, onVideoTrack, signal, ...more }) => {
10
+ const parseMedia = async ({ src, fields, reader: readerInterface = from_fetch_1.fetchReader, onAudioTrack, onVideoTrack, signal, logLevel = 'info', ...more }) => {
11
11
  const state = (0, parser_state_1.makeParserState)({
12
12
  hasAudioCallbacks: onAudioTrack !== null,
13
13
  hasVideoCallbacks: onVideoTrack !== null,
@@ -68,6 +68,7 @@ const parseMedia = async ({ src, fields, reader: readerInterface = from_fetch_1.
68
68
  iterator,
69
69
  options,
70
70
  signal: signal !== null && signal !== void 0 ? signal : null,
71
+ logLevel,
71
72
  });
72
73
  }
73
74
  const availableInfo = (0, has_all_info_1.getAvailableInfo)(fields !== null && fields !== void 0 ? fields : {}, parseResult, state);
@@ -1,4 +1,5 @@
1
1
  import type { BufferIterator } from './buffer-iterator';
2
+ import type { LogLevel } from './log';
2
3
  import type { IsoBaseMediaBox, ParseResult } from './parse-result';
3
4
  import type { ParserContext } from './parser-context';
4
5
  export type PartialMdatBox = {
@@ -14,8 +15,9 @@ export type BoxAndNext = {
14
15
  } | {
15
16
  type: 'incomplete';
16
17
  } | PartialMdatBox;
17
- export declare const parseVideo: ({ iterator, options, signal, }: {
18
+ export declare const parseVideo: ({ iterator, options, signal, logLevel, }: {
18
19
  iterator: BufferIterator;
19
20
  options: ParserContext;
20
21
  signal: AbortSignal | null;
22
+ logLevel: LogLevel;
21
23
  }) => Promise<ParseResult>;
@@ -3,7 +3,7 @@ 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
5
  const parse_webm_header_1 = require("./boxes/webm/parse-webm-header");
6
- const parseVideo = ({ iterator, options, signal, }) => {
6
+ const parseVideo = ({ iterator, options, signal, logLevel, }) => {
7
7
  if (iterator.bytesRemaining() === 0) {
8
8
  return Promise.resolve({
9
9
  status: 'incomplete',
@@ -13,6 +13,7 @@ const parseVideo = ({ iterator, options, signal, }) => {
13
13
  iterator,
14
14
  options,
15
15
  signal,
16
+ logLevel,
16
17
  });
17
18
  },
18
19
  skipTo: null,
@@ -20,18 +21,6 @@ const parseVideo = ({ iterator, options, signal, }) => {
20
21
  }
21
22
  if (iterator.isRiff()) {
22
23
  throw new Error('AVI files are not yet supported');
23
- /*
24
- iterator.discard(4);
25
- return parseBoxes({
26
- iterator,
27
- maxBytes: Infinity,
28
- allowIncompleteBoxes: true,
29
- initialBoxes: [],
30
- options,
31
- continueMdat: false,
32
- littleEndian: true,
33
- });
34
- */
35
24
  }
36
25
  if (iterator.isIsoBaseMedia()) {
37
26
  return (0, process_box_1.parseBoxes)({
@@ -41,8 +30,8 @@ const parseVideo = ({ iterator, options, signal, }) => {
41
30
  initialBoxes: [],
42
31
  options,
43
32
  continueMdat: false,
44
- littleEndian: false,
45
33
  signal,
34
+ logLevel,
46
35
  });
47
36
  }
48
37
  if (iterator.isWebm()) {
@@ -1,6 +1,6 @@
1
1
  import type { OnTrackEntrySegment } from './boxes/webm/segments';
2
2
  import type { TrackInfo } from './boxes/webm/segments/track-entry';
3
- import type { AudioSample, OnAudioSample, OnVideoSample, VideoSample } from './webcodec-sample-types';
3
+ import type { AudioOrVideoSample, OnAudioSample, OnVideoSample } from './webcodec-sample-types';
4
4
  export type InternalStats = {};
5
5
  export declare const makeParserState: ({ hasAudioCallbacks, hasVideoCallbacks, signal, }: {
6
6
  hasAudioCallbacks: boolean;
@@ -13,8 +13,8 @@ export declare const makeParserState: ({ hasAudioCallbacks, hasVideoCallbacks, s
13
13
  setTimestampOffset: (byteOffset: number, timestamp: number) => void;
14
14
  getTimestampOffsetForByteOffset: (byteOffset: number) => number | undefined;
15
15
  registerAudioSampleCallback: (id: number, callback: OnAudioSample | null) => Promise<void>;
16
- onAudioSample: (trackId: number, audioSample: AudioSample) => Promise<void>;
17
- onVideoSample: (trackId: number, videoSample: VideoSample) => Promise<void>;
16
+ onAudioSample: (trackId: number, audioSample: AudioOrVideoSample) => Promise<void>;
17
+ onVideoSample: (trackId: number, videoSample: AudioOrVideoSample) => Promise<void>;
18
18
  getInternalStats: () => {};
19
19
  getTimescale: () => number;
20
20
  setTimescale: (newTimescale: number) => void;
@@ -51,6 +51,7 @@ const getSamplesFromTraf = (trafSegment, moofOffset) => {
51
51
  duration,
52
52
  isKeyframe: keyframe,
53
53
  size,
54
+ chunk: 0,
54
55
  };
55
56
  samples.push(samplePosition);
56
57
  offset += size;
@@ -1,20 +1,14 @@
1
1
  import type { AudioTrack, VideoTrack } from './get-tracks';
2
- export type AudioSample = {
3
- data: Uint8Array;
4
- timestamp: number;
5
- trackId: number;
6
- type: 'key' | 'delta';
7
- };
8
- export type VideoSample = {
2
+ export type OnAudioSample = (sample: AudioOrVideoSample) => void | Promise<void>;
3
+ export type OnVideoSample = (sample: AudioOrVideoSample) => void | Promise<void>;
4
+ export type OnAudioTrack = (track: AudioTrack) => OnAudioSample | Promise<OnAudioSample | null> | null;
5
+ export type OnVideoTrack = (track: VideoTrack) => OnVideoSample | Promise<OnVideoSample | null> | null;
6
+ export type AudioOrVideoSample = {
9
7
  data: Uint8Array;
10
8
  timestamp: number;
11
9
  duration: number | undefined;
12
10
  trackId: number;
13
11
  type: 'key' | 'delta';
14
- cts: number | null;
15
- dts: number | null;
12
+ cts: number;
13
+ dts: number;
16
14
  };
17
- export type OnAudioSample = (sample: AudioSample) => void | Promise<void>;
18
- export type OnVideoSample = (sample: VideoSample) => void | Promise<void>;
19
- export type OnAudioTrack = (track: AudioTrack) => OnAudioSample | Promise<OnAudioSample | null> | null;
20
- export type OnVideoTrack = (track: VideoTrack) => OnVideoSample | Promise<OnVideoSample | null> | null;
@@ -0,0 +1,2 @@
1
+ import type { Writer } from '../writer';
2
+ export declare const createContent: () => Promise<Writer>;
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createContent = void 0;
4
+ const createContent = () => {
5
+ const buf = new ArrayBuffer(0, {
6
+ // TODO: Educate that the buffer is limited to 2GB
7
+ maxByteLength: 2000000000,
8
+ });
9
+ if (!buf.resize) {
10
+ throw new Error('Could not create buffer writer');
11
+ }
12
+ const write = (newData) => {
13
+ const oldLength = buf.byteLength;
14
+ const newLength = oldLength + newData.byteLength;
15
+ buf.resize(newLength);
16
+ const newArray = new Uint8Array(buf);
17
+ newArray.set(newData, oldLength);
18
+ };
19
+ const updateDataAt = (position, newData) => {
20
+ const newArray = new Uint8Array(buf);
21
+ newArray.set(newData, position);
22
+ };
23
+ let writPromise = Promise.resolve();
24
+ let removed = false;
25
+ const writer = {
26
+ write: (arr) => {
27
+ writPromise = writPromise.then(() => write(arr));
28
+ return writPromise;
29
+ },
30
+ save: () => {
31
+ if (removed) {
32
+ return Promise.reject(new Error('Already called .remove() on the result'));
33
+ }
34
+ const arr = new Uint8Array(buf);
35
+ return Promise.resolve(
36
+ // TODO: Unhardcode MIME type and file name
37
+ new File([arr.slice()], 'hi', { type: 'video/webm' }));
38
+ },
39
+ remove() {
40
+ removed = true;
41
+ return Promise.resolve();
42
+ },
43
+ getWrittenByteCount: () => buf.byteLength,
44
+ updateDataAt: (position, newData) => {
45
+ writPromise = writPromise.then(() => updateDataAt(position, newData));
46
+ return writPromise;
47
+ },
48
+ waitForFinish: async () => {
49
+ await writPromise;
50
+ },
51
+ };
52
+ return Promise.resolve(writer);
53
+ };
54
+ exports.createContent = createContent;
@@ -1,58 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.bufferWriter = void 0;
4
- const createContent = () => {
5
- const buf = new ArrayBuffer(0, {
6
- // TODO: Educate that the buffer is limited to 100MB
7
- maxByteLength: 100000000,
8
- });
9
- if (!buf.resize) {
10
- throw new Error('Could not create buffer writer');
11
- }
12
- let data = new Uint8Array(buf);
13
- const write = (newData) => {
14
- const oldLength = buf.byteLength;
15
- const newLength = oldLength + newData.byteLength;
16
- buf.resize(newLength);
17
- const newArray = new Uint8Array(buf);
18
- newArray.set(newData, oldLength);
19
- data = newArray;
20
- };
21
- const updateDataAt = (position, newData) => {
22
- const newArray = new Uint8Array(buf);
23
- newArray.set(newData, position);
24
- data = newArray;
25
- };
26
- let writPromise = Promise.resolve();
27
- let removed = false;
28
- const writer = {
29
- write: (arr) => {
30
- writPromise = writPromise.then(() => write(arr));
31
- return writPromise;
32
- },
33
- save: () => {
34
- if (removed) {
35
- return Promise.reject(new Error('Already called .remove() on the result'));
36
- }
37
- // TODO: Unhardcode name
38
- return Promise.resolve(new File([data], 'hithere', {}));
39
- },
40
- remove() {
41
- removed = true;
42
- data = new Uint8Array(0);
43
- return Promise.resolve();
44
- },
45
- getWrittenByteCount: () => buf.byteLength,
46
- updateDataAt: (position, newData) => {
47
- writPromise = writPromise.then(() => updateDataAt(position, newData));
48
- return writPromise;
49
- },
50
- waitForFinish: async () => {
51
- await writPromise;
52
- },
53
- };
54
- return Promise.resolve(writer);
55
- };
4
+ const writer_1 = require("./buffer-implementation/writer");
56
5
  exports.bufferWriter = {
57
- createContent,
6
+ createContent: writer_1.createContent,
58
7
  };
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.canUseWebFsWriter = exports.webFsWriter = void 0;
4
4
  const createContent = async () => {
5
5
  const directoryHandle = await navigator.storage.getDirectory();
6
+ // TODO: Unhardcode WebM
6
7
  const filename = `media-parser-${Math.random().toString().replace('0.', '')}.webm`;
7
8
  const fileHandle = await directoryHandle.getFileHandle(filename, {
8
9
  create: true,
@@ -1,6 +1,6 @@
1
1
  export type Writer = {
2
2
  write: (arr: Uint8Array) => Promise<void>;
3
- save: () => Promise<File>;
3
+ save: () => Promise<File | Blob>;
4
4
  getWrittenByteCount: () => number;
5
5
  updateDataAt: (position: number, data: Uint8Array) => Promise<void>;
6
6
  waitForFinish: () => Promise<void>;
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.228",
6
+ "version": "4.0.230",
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/renderer": "4.0.228",
13
- "@remotion/eslint-config-internal": "4.0.228"
12
+ "@remotion/example-videos": "4.0.230",
13
+ "@remotion/eslint-config-internal": "4.0.230"
14
14
  },
15
15
  "publishConfig": {
16
16
  "access": "public"
@@ -77,7 +77,7 @@
77
77
  }
78
78
  },
79
79
  "author": "Jonny Burger <jonny@remotion.dev>",
80
- "license": "SEE LICENSE IN LICENSE.md",
80
+ "license": "Remotion License https://remotion.dev/license",
81
81
  "keywords": [
82
82
  "remotion",
83
83
  "ffmpeg",
@@ -1,19 +0,0 @@
1
- import type { Writer } from '../writers/writer';
2
- export type AudioOrVideoSample = {
3
- timestamp: number;
4
- type: 'key' | 'delta';
5
- copyTo(destination: AllowSharedBufferSource): void;
6
- byteLength: number;
7
- duration: number | null;
8
- };
9
- export declare const timestampToClusterTimestamp: (timestamp: number) => number;
10
- export declare const makeCluster: (w: Writer, timestamp: number) => Promise<{
11
- addSample: (chunk: AudioOrVideoSample, trackNumber: number) => Promise<{
12
- timecodeRelativeToCluster: number;
13
- }>;
14
- shouldMakeNewCluster: ({ isVideo, keyframe, newT, }: {
15
- newT: number;
16
- keyframe: boolean;
17
- isVideo: boolean;
18
- }) => boolean;
19
- }>;
@@ -1,55 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.makeCluster = exports.timestampToClusterTimestamp = void 0;
4
- const ebml_1 = require("../boxes/webm/ebml");
5
- const make_header_1 = require("../boxes/webm/make-header");
6
- const all_segments_1 = require("../boxes/webm/segments/all-segments");
7
- const cluster_segment_1 = require("./cluster-segment");
8
- const timescale_1 = require("./timescale");
9
- const maxClusterTimestamp = 2 ** 15;
10
- const timestampToClusterTimestamp = (timestamp) => {
11
- return Math.round((timestamp / timescale_1.CREATE_TIME_SCALE) * 1000);
12
- };
13
- exports.timestampToClusterTimestamp = timestampToClusterTimestamp;
14
- const makeCluster = async (w, timestamp) => {
15
- const cluster = (0, cluster_segment_1.createClusterSegment)((0, exports.timestampToClusterTimestamp)(timestamp));
16
- const clusterVIntPosition = w.getWrittenByteCount() +
17
- cluster.offsets.offset +
18
- (0, make_header_1.matroskaToHex)(all_segments_1.matroskaElements.Cluster).byteLength;
19
- let clusterSize = cluster.bytes.byteLength -
20
- (0, make_header_1.matroskaToHex)(all_segments_1.matroskaElements.Cluster).byteLength -
21
- cluster_segment_1.CLUSTER_MIN_VINT_WIDTH;
22
- await w.write(cluster.bytes);
23
- const addSample = async (chunk, trackNumber) => {
24
- const arr = new Uint8Array(chunk.byteLength);
25
- chunk.copyTo(arr);
26
- const timecodeRelativeToCluster = (0, exports.timestampToClusterTimestamp)(chunk.timestamp) -
27
- (0, exports.timestampToClusterTimestamp)(timestamp);
28
- if (timecodeRelativeToCluster < 0) {
29
- throw new Error(`timecodeRelativeToCluster is negative (track ${trackNumber})`);
30
- }
31
- if (timecodeRelativeToCluster > maxClusterTimestamp) {
32
- throw new Error(`timecodeRelativeToCluster is too big: ${timecodeRelativeToCluster} > ${maxClusterTimestamp}`);
33
- }
34
- const keyframe = chunk.type === 'key';
35
- const simpleBlock = (0, cluster_segment_1.makeSimpleBlock)({
36
- bytes: arr,
37
- invisible: false,
38
- keyframe,
39
- lacing: 0,
40
- trackNumber,
41
- timecodeRelativeToCluster,
42
- });
43
- clusterSize += simpleBlock.byteLength;
44
- await w.updateDataAt(clusterVIntPosition, (0, ebml_1.getVariableInt)(clusterSize, cluster_segment_1.CLUSTER_MIN_VINT_WIDTH));
45
- await w.write(simpleBlock);
46
- return { timecodeRelativeToCluster };
47
- };
48
- const shouldMakeNewCluster = ({ isVideo, keyframe, newT, }) => {
49
- const newTimestamp = (0, exports.timestampToClusterTimestamp)(newT);
50
- const oldTimestamp = (0, exports.timestampToClusterTimestamp)(timestamp);
51
- return newTimestamp - oldTimestamp >= 2000 && keyframe && isVideo;
52
- };
53
- return { addSample, shouldMakeNewCluster };
54
- };
55
- exports.makeCluster = makeCluster;
@@ -1,19 +0,0 @@
1
- import type { WriterInterface } from '../writers/writer';
2
- import type { AudioOrVideoSample } from './cluster';
3
- import type { MakeTrackAudio, MakeTrackVideo } from './matroska-trackentry';
4
- export type MediaFn = {
5
- save: () => Promise<File>;
6
- remove: () => Promise<void>;
7
- addSample: (chunk: AudioOrVideoSample, trackNumber: number, isVideo: boolean) => Promise<void>;
8
- updateDuration: (duration: number) => Promise<void>;
9
- addTrack: (track: Omit<MakeTrackAudio, 'trackNumber'> | Omit<MakeTrackVideo, 'trackNumber'>) => Promise<{
10
- trackNumber: number;
11
- }>;
12
- addWaitForFinishPromise: (promise: () => Promise<void>) => void;
13
- waitForFinish: () => Promise<void>;
14
- };
15
- export declare const createMedia: ({ writer, onBytesProgress, onMillisecondsProgress, }: {
16
- writer: WriterInterface;
17
- onBytesProgress: (totalBytes: number) => void;
18
- onMillisecondsProgress: (totalMilliseconds: number) => void;
19
- }) => Promise<MediaFn>;
@@ -1 +0,0 @@
1
- export declare const makeDurationWithPadding: (newDuration: number) => import("../boxes/webm/segments/all-segments").BytesAndOffset;
@@ -1 +0,0 @@
1
- export declare const makeMatroskaHeader: () => import("../boxes/webm/segments/all-segments").BytesAndOffset;
@@ -1,6 +0,0 @@
1
- import type { MatroskaElement } from '../boxes/webm/segments/all-segments';
2
- export type Seek = {
3
- hexString: MatroskaElement;
4
- byte: number;
5
- };
6
- export declare const createMatroskaSeekHead: (seeks: Seek[]) => import("../boxes/webm/segments/all-segments").BytesAndOffset[];