@remotion/media-parser 4.0.229 → 4.0.231

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 (182) 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 -7
  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 +4 -2
  31. package/dist/boxes/webm/make-track.js +1 -0
  32. package/dist/boxes/webm/parse-webm-header.js +23 -4
  33. package/dist/boxes/webm/segments/parse-children.d.ts +12 -7
  34. package/dist/boxes/webm/segments/parse-children.js +67 -57
  35. package/dist/boxes/webm/segments.d.ts +8 -3
  36. package/dist/boxes/webm/segments.js +70 -39
  37. package/dist/buffer-iterator.d.ts +1 -1
  38. package/dist/buffer-iterator.js +1 -8
  39. package/dist/create/iso-base-media/codec-specific/avc1.d.ts +2 -0
  40. package/dist/create/iso-base-media/codec-specific/avc1.js +48 -0
  41. package/dist/create/iso-base-media/codec-specific/create-codec-specific-data.d.ts +22 -0
  42. package/dist/create/iso-base-media/codec-specific/create-codec-specific-data.js +36 -0
  43. package/dist/create/iso-base-media/codec-specific/mp4a.d.ts +2 -0
  44. package/dist/create/iso-base-media/codec-specific/mp4a.js +90 -0
  45. package/dist/create/iso-base-media/create-colr.d.ts +6 -0
  46. package/dist/create/iso-base-media/create-colr.js +26 -0
  47. package/dist/create/iso-base-media/create-ftyp.d.ts +10 -0
  48. package/dist/create/iso-base-media/create-ftyp.js +22 -0
  49. package/dist/create/iso-base-media/create-ilst.d.ts +1 -0
  50. package/dist/create/iso-base-media/create-ilst.js +14 -0
  51. package/dist/create/iso-base-media/create-iso-base-media.d.ts +2 -0
  52. package/dist/create/iso-base-media/create-iso-base-media.js +167 -0
  53. package/dist/create/iso-base-media/create-mdia.d.ts +5 -0
  54. package/dist/create/iso-base-media/create-mdia.js +18 -0
  55. package/dist/create/iso-base-media/create-moov.d.ts +5 -0
  56. package/dist/create/iso-base-media/create-moov.js +18 -0
  57. package/dist/create/iso-base-media/create-mvhd.d.ts +10 -0
  58. package/dist/create/iso-base-media/create-mvhd.js +48 -0
  59. package/dist/create/iso-base-media/create-trak.d.ts +4 -0
  60. package/dist/create/iso-base-media/create-trak.js +17 -0
  61. package/dist/create/iso-base-media/create-udta.d.ts +1 -0
  62. package/dist/create/iso-base-media/create-udta.js +14 -0
  63. package/dist/create/iso-base-media/create-url.d.ts +1 -0
  64. package/dist/create/iso-base-media/create-url.js +16 -0
  65. package/dist/create/iso-base-media/example-stts.d.ts +3 -0
  66. package/dist/create/iso-base-media/example-stts.js +2797 -0
  67. package/dist/create/iso-base-media/ilst/create-cmt.d.ts +1 -0
  68. package/dist/create/iso-base-media/ilst/create-cmt.js +26 -0
  69. package/dist/create/iso-base-media/ilst/create-too.d.ts +1 -0
  70. package/dist/create/iso-base-media/ilst/create-too.js +27 -0
  71. package/dist/create/iso-base-media/mdia/create-mdhd.d.ts +6 -0
  72. package/dist/create/iso-base-media/mdia/create-mdhd.js +33 -0
  73. package/dist/create/iso-base-media/mp4-header.d.ts +6 -0
  74. package/dist/create/iso-base-media/mp4-header.js +47 -0
  75. package/dist/create/iso-base-media/primitives.d.ts +15 -0
  76. package/dist/create/iso-base-media/primitives.js +133 -0
  77. package/dist/create/iso-base-media/serialize-track.d.ts +9 -0
  78. package/dist/create/iso-base-media/serialize-track.js +63 -0
  79. package/dist/create/iso-base-media/trak/create-tkhd.d.ts +27 -0
  80. package/dist/create/iso-base-media/trak/create-tkhd.js +97 -0
  81. package/dist/create/iso-base-media/trak/mdia/create-minf.d.ts +4 -0
  82. package/dist/create/iso-base-media/trak/mdia/create-minf.js +19 -0
  83. package/dist/create/iso-base-media/trak/mdia/minf/create-dinf.d.ts +1 -0
  84. package/dist/create/iso-base-media/trak/mdia/minf/create-dinf.js +22 -0
  85. package/dist/create/iso-base-media/trak/mdia/minf/create-smhd.d.ts +1 -0
  86. package/dist/create/iso-base-media/trak/mdia/minf/create-smhd.js +20 -0
  87. package/dist/create/iso-base-media/trak/mdia/minf/create-stbl.d.ts +6 -0
  88. package/dist/create/iso-base-media/trak/mdia/minf/create-stbl.js +35 -0
  89. package/dist/create/iso-base-media/trak/mdia/minf/create-vmhd.d.ts +1 -0
  90. package/dist/create/iso-base-media/trak/mdia/minf/create-vmhd.js +20 -0
  91. package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-ctts.d.ts +2 -0
  92. package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-ctts.js +45 -0
  93. package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-stco.d.ts +2 -0
  94. package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-stco.js +28 -0
  95. package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-stsc.d.ts +2 -0
  96. package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-stsc.js +56 -0
  97. package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-stss.d.ts +2 -0
  98. package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-stss.js +23 -0
  99. package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-stsz.d.ts +2 -0
  100. package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-stsz.js +25 -0
  101. package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-stts.d.ts +2 -0
  102. package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-stts.js +48 -0
  103. package/dist/create/iso-base-media/trak/mdia/minf/stbl/stsd/create-avc1.d.ts +1 -0
  104. package/dist/create/iso-base-media/trak/mdia/minf/stbl/stsd/create-avc1.js +20 -0
  105. package/dist/create/iso-base-media/trak/mdia/minf/stbl/stsd/create-avcc.d.ts +1 -0
  106. package/dist/create/iso-base-media/trak/mdia/minf/stbl/stsd/create-avcc.js +16 -0
  107. package/dist/create/iso-base-media/trak/mdia/minf/stbl/stsd/create-pasp.d.ts +1 -0
  108. package/dist/create/iso-base-media/trak/mdia/minf/stbl/stsd/create-pasp.js +13 -0
  109. package/dist/create/iso-base-media/udta/create-meta.d.ts +4 -0
  110. package/dist/create/iso-base-media/udta/create-meta.js +20 -0
  111. package/dist/create/iso-base-media/udta/meta/create-hdlr.d.ts +1 -0
  112. package/dist/create/iso-base-media/udta/meta/create-hdlr.js +32 -0
  113. package/dist/create/make-track-info.d.ts +20 -0
  114. package/dist/create/make-track-info.js +2 -0
  115. package/dist/create/{cluster-segment.d.ts → matroska/cluster-segment.d.ts} +1 -1
  116. package/dist/create/{cluster-segment.js → matroska/cluster-segment.js} +2 -2
  117. package/dist/create/{cluster.d.ts → matroska/cluster.d.ts} +12 -5
  118. package/dist/create/{cluster.js → matroska/cluster.js} +23 -20
  119. package/dist/create/matroska/create-matroska-media.d.ts +2 -0
  120. package/dist/create/{create-media.js → matroska/create-matroska-media.js} +49 -25
  121. package/dist/create/matroska/make-duration-with-padding.d.ts +1 -0
  122. package/dist/create/{make-duration-with-padding.js → matroska/make-duration-with-padding.js} +1 -1
  123. package/dist/create/{matroska-cues.d.ts → matroska/matroska-cues.d.ts} +1 -1
  124. package/dist/create/{matroska-cues.js → matroska/matroska-cues.js} +1 -1
  125. package/dist/create/matroska/matroska-header.d.ts +1 -0
  126. package/dist/create/{matroska-header.js → matroska/matroska-header.js} +1 -1
  127. package/dist/create/{matroska-info.d.ts → matroska/matroska-info.d.ts} +1 -1
  128. package/dist/create/{matroska-info.js → matroska/matroska-info.js} +1 -1
  129. package/dist/create/matroska/matroska-seek.d.ts +6 -0
  130. package/dist/create/{matroska-seek.js → matroska/matroska-seek.js} +1 -1
  131. package/dist/create/{matroska-segment.d.ts → matroska/matroska-segment.d.ts} +1 -1
  132. package/dist/create/{matroska-segment.js → matroska/matroska-segment.js} +1 -1
  133. package/dist/create/matroska/matroska-trackentry.d.ts +10 -0
  134. package/dist/create/{matroska-trackentry.js → matroska/matroska-trackentry.js} +9 -3
  135. package/dist/create/{create-media.d.ts → media-fn.d.ts} +17 -4
  136. package/dist/create/media-fn.js +2 -0
  137. package/dist/create/timescale.d.ts +1 -1
  138. package/dist/create/timescale.js +2 -2
  139. package/dist/emit-available-info.d.ts +1 -1
  140. package/dist/emit-available-info.js +23 -10
  141. package/dist/esm/buffer.mjs +3 -3
  142. package/dist/esm/index.mjs +2104 -735
  143. package/dist/esm/web-fs.mjs +2 -2
  144. package/dist/get-audio-codec.d.ts +2 -1
  145. package/dist/get-audio-codec.js +29 -10
  146. package/dist/get-duration.d.ts +5 -0
  147. package/dist/get-duration.js +7 -3
  148. package/dist/get-fps.d.ts +1 -0
  149. package/dist/get-fps.js +24 -13
  150. package/dist/get-sample-positions.d.ts +1 -0
  151. package/dist/get-sample-positions.js +1 -0
  152. package/dist/get-tracks.d.ts +1 -0
  153. package/dist/get-video-codec.d.ts +2 -2
  154. package/dist/get-video-codec.js +6 -6
  155. package/dist/has-all-info.d.ts +1 -1
  156. package/dist/has-all-info.js +8 -8
  157. package/dist/index.d.ts +6 -8
  158. package/dist/index.js +7 -3
  159. package/dist/options.d.ts +10 -1
  160. package/dist/parse-media.js +42 -14
  161. package/dist/parse-result.d.ts +15 -0
  162. package/dist/parse-video.d.ts +3 -1
  163. package/dist/parse-video.js +6 -14
  164. package/dist/parser-state.d.ts +3 -3
  165. package/dist/readers/reader.d.ts +2 -2
  166. package/dist/samples-from-moof.js +1 -0
  167. package/dist/version.d.ts +1 -0
  168. package/dist/version.js +5 -0
  169. package/dist/webcodec-sample-types.d.ts +7 -20
  170. package/dist/writers/buffer-implementation/writer.d.ts +2 -2
  171. package/dist/writers/buffer-implementation/writer.js +3 -3
  172. package/dist/writers/web-fs.js +2 -3
  173. package/dist/writers/writer.d.ts +5 -3
  174. package/package.json +3 -3
  175. package/dist/create/make-duration-with-padding.d.ts +0 -1
  176. package/dist/create/matroska-header.d.ts +0 -1
  177. package/dist/create/matroska-seek.d.ts +0 -6
  178. package/dist/create/matroska-trackentry.d.ts +0 -27
  179. package/dist/create/polyfill-audio-sample.d.ts +0 -3
  180. package/dist/create/polyfill-audio-sample.js +0 -15
  181. package/dist/writers/buffer-implementation/multi-buffer.d.ts +0 -0
  182. package/dist/writers/buffer-implementation/multi-buffer.js +0 -1
@@ -1,7 +1,7 @@
1
1
  // src/writers/web-fs.ts
2
- var createContent = async () => {
2
+ var createContent = async ({ filename }) => {
3
3
  const directoryHandle = await navigator.storage.getDirectory();
4
- const filename = `media-parser-${Math.random().toString().replace("0.", "")}.webm`;
4
+ directoryHandle.removeEntry(filename);
5
5
  const fileHandle = await directoryHandle.getFileHandle(filename, {
6
6
  create: true
7
7
  });
@@ -4,13 +4,14 @@ import { type MediaParserAudioCodec } from './get-tracks';
4
4
  import type { AnySegment } from './parse-result';
5
5
  import type { ParserState } from './parser-state';
6
6
  export declare const getAudioCodec: (boxes: AnySegment[], parserState: ParserState) => MediaParserAudioCodec | null;
7
- export declare const hasAudioCodec: (boxes: AnySegment[], state: ParserState) => boolean;
7
+ export declare const hasAudioCodec: (boxes: AnySegment[]) => boolean;
8
8
  type AudioCodecInfo = {
9
9
  format: string;
10
10
  primarySpecificator: number | null;
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");
@@ -22,13 +22,8 @@ const getAudioCodec = (boxes, parserState) => {
22
22
  return null;
23
23
  };
24
24
  exports.getAudioCodec = getAudioCodec;
25
- const hasAudioCodec = (boxes, state) => {
26
- try {
27
- return (0, exports.getAudioCodec)(boxes, state) !== null;
28
- }
29
- catch (_a) {
30
- return false;
31
- }
25
+ const hasAudioCodec = (boxes) => {
26
+ return (0, get_tracks_1.hasTracks)(boxes);
32
27
  };
33
28
  exports.hasAudioCodec = hasAudioCodec;
34
29
  const getCodecSpecificatorFromEsdsBox = ({ child, }) => {
@@ -47,10 +42,10 @@ const getCodecSpecificatorFromEsdsBox = ({ child, }) => {
47
42
  };
48
43
  }
49
44
  const audioSpecificConfig = descriptor.decoderSpecificConfigs.find((d) => {
50
- return d.type === 'audio-specific-config' ? d : null;
45
+ return d.type === 'mp4a-specific-config' ? d : null;
51
46
  });
52
47
  if (!audioSpecificConfig ||
53
- audioSpecificConfig.type !== 'audio-specific-config') {
48
+ audioSpecificConfig.type !== 'mp4a-specific-config') {
54
49
  throw new Error('No audio-specific-config');
55
50
  }
56
51
  return {
@@ -59,6 +54,30 @@ const getCodecSpecificatorFromEsdsBox = ({ child, }) => {
59
54
  description: audioSpecificConfig.asBytes,
60
55
  };
61
56
  };
57
+ const getCodecPrivateFromTrak = (trakBox) => {
58
+ const stsdBox = (0, traversal_1.getStsdBox)(trakBox);
59
+ if (!stsdBox) {
60
+ return null;
61
+ }
62
+ const audioSample = stsdBox.samples.find((s) => s.type === 'audio');
63
+ if (!audioSample || audioSample.type !== 'audio') {
64
+ return null;
65
+ }
66
+ const esds = audioSample.children.find((b) => b.type === 'esds-box');
67
+ if (!esds || esds.type !== 'esds-box') {
68
+ return null;
69
+ }
70
+ const decoderConfigDescriptor = esds.descriptors.find((d) => d.type === 'decoder-config-descriptor');
71
+ if (!decoderConfigDescriptor) {
72
+ return null;
73
+ }
74
+ const mp4a = decoderConfigDescriptor.decoderSpecificConfigs.find((d) => d.type === 'mp4a-specific-config');
75
+ if (!mp4a) {
76
+ return null;
77
+ }
78
+ return mp4a.asBytes;
79
+ };
80
+ exports.getCodecPrivateFromTrak = getCodecPrivateFromTrak;
62
81
  const onSample = (sample, children) => {
63
82
  const child = children.find((c) => c.type === 'esds-box');
64
83
  if (child && child.type === 'esds-box') {
@@ -1,4 +1,9 @@
1
1
  import type { AnySegment } from './parse-result';
2
2
  import type { ParserState } from './parser-state';
3
+ export declare const isMatroska: (boxes: AnySegment[]) => {
4
+ type: "Segment";
5
+ value: import("./boxes/webm/segments/all-segments").PossibleEbml[];
6
+ minVintWidth: number | null;
7
+ } | undefined;
3
8
  export declare const getDuration: (boxes: AnySegment[], parserState: ParserState) => number | null;
4
9
  export declare const hasDuration: (boxes: AnySegment[], parserState: ParserState) => boolean;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.hasDuration = exports.getDuration = void 0;
3
+ exports.hasDuration = exports.getDuration = exports.isMatroska = void 0;
4
4
  const get_sample_positions_from_track_1 = require("./boxes/iso-base-media/get-sample-positions-from-track");
5
5
  const traversal_1 = require("./boxes/iso-base-media/traversal");
6
6
  const get_tracks_1 = require("./get-tracks");
@@ -28,9 +28,13 @@ const getDurationFromMatroska = (segments) => {
28
28
  }
29
29
  return (duration.value.value / timestampScale.value.value) * 1000;
30
30
  };
31
- const getDuration = (boxes, parserState) => {
31
+ const isMatroska = (boxes) => {
32
32
  const matroskaBox = boxes.find((b) => b.type === 'Segment');
33
- if (matroskaBox) {
33
+ return matroskaBox;
34
+ };
35
+ exports.isMatroska = isMatroska;
36
+ const getDuration = (boxes, parserState) => {
37
+ if ((0, exports.isMatroska)(boxes)) {
34
38
  return getDurationFromMatroska(boxes);
35
39
  }
36
40
  const moovBox = (0, traversal_1.getMoovBox)(boxes);
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,7 +1,8 @@
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
+ const get_duration_1 = require("./get-duration");
5
6
  const calculateFps = ({ sttsBox, timeScale, durationInSamples, }) => {
6
7
  let totalSamples = 0;
7
8
  for (const sample of sttsBox.sampleDistribution) {
@@ -43,21 +44,12 @@ const getTimescaleAndDuration = (trakBox) => {
43
44
  return null;
44
45
  };
45
46
  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);
47
+ const getFpsFromMp4TrakBox = (trakBox) => {
48
+ const timescaleAndDuration = (0, exports.getTimescaleAndDuration)(trakBox);
57
49
  if (!timescaleAndDuration) {
58
50
  return null;
59
51
  }
60
- const sttsBox = (0, traversal_1.getSttsBox)(trackBox);
52
+ const sttsBox = (0, traversal_1.getSttsBox)(trakBox);
61
53
  if (!sttsBox) {
62
54
  return null;
63
55
  }
@@ -67,9 +59,28 @@ const getFps = (segments) => {
67
59
  durationInSamples: timescaleAndDuration.duration,
68
60
  });
69
61
  };
62
+ exports.getFpsFromMp4TrakBox = getFpsFromMp4TrakBox;
63
+ const getFps = (segments) => {
64
+ const moovBox = (0, traversal_1.getMoovBox)(segments);
65
+ if (!moovBox) {
66
+ return null;
67
+ }
68
+ const trackBoxes = (0, traversal_1.getTraks)(moovBox);
69
+ const trackBox = trackBoxes.find(exports.trakBoxContainsVideo);
70
+ if (!trackBox) {
71
+ return null;
72
+ }
73
+ return (0, exports.getFpsFromMp4TrakBox)(trackBox);
74
+ };
70
75
  exports.getFps = getFps;
71
76
  const hasFps = (boxes) => {
72
77
  try {
78
+ // Matroska has no FPS metadata
79
+ // Not bothering to parse
80
+ // Idea: `guaranteedFps` field
81
+ if ((0, get_duration_1.isMatroska)(boxes)) {
82
+ return true;
83
+ }
73
84
  return (0, exports.getFps)(boxes) !== null;
74
85
  }
75
86
  catch (_a) {
@@ -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';
@@ -1,7 +1,7 @@
1
1
  import type { TrakBox } from './boxes/iso-base-media/trak/trak';
2
- import type { MediaParserVideoCodec, VideoTrackColorParams } from './get-tracks';
2
+ import { type MediaParserVideoCodec, type VideoTrackColorParams } from './get-tracks';
3
3
  import type { AnySegment } from './parse-result';
4
- export declare const getVideoCodecFromIsoTrak: (trakBox: TrakBox) => "h264" | "av1" | "h265" | "prores";
4
+ export declare const getVideoCodecFromIsoTrak: (trakBox: TrakBox) => "h265" | "h264" | "av1" | "prores";
5
5
  export declare const getVideoCodec: (boxes: AnySegment[]) => MediaParserVideoCodec | null;
6
6
  export declare const hasVideoCodec: (boxes: AnySegment[]) => boolean;
7
7
  export declare const getVideoPrivateData: (trakBox: TrakBox) => Uint8Array | null;
@@ -5,6 +5,7 @@ const traversal_1 = require("./boxes/iso-base-media/traversal");
5
5
  const av1_codec_private_1 = require("./boxes/webm/av1-codec-private");
6
6
  const get_fps_1 = require("./get-fps");
7
7
  const get_sample_aspect_ratio_1 = require("./get-sample-aspect-ratio");
8
+ const get_tracks_1 = require("./get-tracks");
8
9
  const getVideoCodecFromIsoTrak = (trakBox) => {
9
10
  const stsdBox = (0, traversal_1.getStsdBox)(trakBox);
10
11
  if (stsdBox && stsdBox.type === 'stsd-box') {
@@ -98,12 +99,7 @@ const getVideoCodec = (boxes) => {
98
99
  };
99
100
  exports.getVideoCodec = getVideoCodec;
100
101
  const hasVideoCodec = (boxes) => {
101
- try {
102
- return (0, exports.getVideoCodec)(boxes) !== null;
103
- }
104
- catch (_a) {
105
- return false;
106
- }
102
+ return (0, get_tracks_1.hasTracks)(boxes);
107
103
  };
108
104
  exports.hasVideoCodec = hasVideoCodec;
109
105
  const getVideoPrivateData = (trakBox) => {
@@ -135,6 +131,10 @@ const getIsoBmColrConfig = (trakBox) => {
135
131
  if (!colrAtom) {
136
132
  return null;
137
133
  }
134
+ // TODO: Not doing anything with a in ICC color profile yet
135
+ if (colrAtom.colorType !== 'transfer-characteristics') {
136
+ return null;
137
+ }
138
138
  // https://github.com/bbc/qtff-parameter-editor
139
139
  return {
140
140
  fullRange: colrAtom.fullRangeFlag,
@@ -1,4 +1,4 @@
1
1
  import type { Options, ParseMediaFields } from './options';
2
2
  import type { ParseResult } from './parse-result';
3
3
  import type { ParserState } from './parser-state';
4
- export declare const getAvailableInfo: (options: Options<ParseMediaFields>, parseResult: ParseResult, state: ParserState) => Record<keyof Options<ParseMediaFields>, boolean>;
4
+ export declare const getAvailableInfo: (options: Options<ParseMediaFields>, parseResult: ParseResult | null, state: ParserState) => Record<keyof Options<ParseMediaFields>, boolean>;
@@ -12,27 +12,27 @@ const getAvailableInfo = (options, parseResult, state) => {
12
12
  const keys = Object.entries(options).filter(([, value]) => value);
13
13
  const infos = keys.map(([key]) => {
14
14
  if (key === 'boxes') {
15
- return parseResult.status === 'done';
15
+ return Boolean(parseResult && parseResult.status === 'done');
16
16
  }
17
17
  if (key === 'durationInSeconds') {
18
- return (0, get_duration_1.hasDuration)(parseResult.segments, state);
18
+ return Boolean(parseResult && (0, get_duration_1.hasDuration)(parseResult.segments, state));
19
19
  }
20
20
  if (key === 'dimensions' ||
21
21
  key === 'rotation' ||
22
22
  key === 'unrotatedDimensions') {
23
- return (0, get_dimensions_1.hasDimensions)(parseResult.segments, state);
23
+ return Boolean(parseResult && (0, get_dimensions_1.hasDimensions)(parseResult.segments, state));
24
24
  }
25
25
  if (key === 'fps') {
26
- return (0, get_fps_1.hasFps)(parseResult.segments);
26
+ return Boolean(parseResult && (0, get_fps_1.hasFps)(parseResult.segments));
27
27
  }
28
28
  if (key === 'videoCodec') {
29
- return (0, get_video_codec_1.hasVideoCodec)(parseResult.segments);
29
+ return Boolean(parseResult && (0, get_video_codec_1.hasVideoCodec)(parseResult.segments));
30
30
  }
31
31
  if (key === 'audioCodec') {
32
- return (0, get_audio_codec_1.hasAudioCodec)(parseResult.segments, state);
32
+ return Boolean(parseResult && (0, get_audio_codec_1.hasAudioCodec)(parseResult.segments));
33
33
  }
34
34
  if (key === 'tracks') {
35
- return (0, get_tracks_1.hasTracks)(parseResult.segments);
35
+ return Boolean(parseResult && (0, get_tracks_1.hasTracks)(parseResult.segments));
36
36
  }
37
37
  if (key === 'internalStats') {
38
38
  return false;
@@ -44,7 +44,7 @@ const getAvailableInfo = (options, parseResult, state) => {
44
44
  return true;
45
45
  }
46
46
  if (key === 'container') {
47
- return (0, get_container_1.hasContainer)(parseResult.segments);
47
+ return Boolean(parseResult && (0, get_container_1.hasContainer)(parseResult.segments));
48
48
  }
49
49
  throw new Error(`Unknown key: ${key}`);
50
50
  });
package/dist/index.d.ts CHANGED
@@ -1,19 +1,16 @@
1
1
  import type { LogLevel } from './log';
2
2
  export { WriterInterface } from './writers/writer';
3
3
  export { AudioTrack, MediaParserAudioCodec, MediaParserVideoCodec, OtherTrack, Track, VideoTrack, VideoTrackColorParams, } from './get-tracks';
4
- export type { Options, ParseMediaContainer, ParseMediaDynamicOptions, ParseMediaFields, ParseMediaOptions, ParseMediaResult, TracksField, } from './options';
4
+ export type { Options, ParseMediaContainer, ParseMediaDynamicOptions, ParseMediaFields, ParseMediaOnProgress, ParseMediaOptions, ParseMediaProgress, ParseMediaResult, TracksField, } from './options';
5
5
  export { parseMedia } from './parse-media';
6
- export { AudioOrVideoSample, 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, 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>;
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;
@@ -22,3 +19,4 @@ export declare const MediaParserInternals: {
22
19
  error: (...args: Parameters<typeof console.log>) => void;
23
20
  };
24
21
  };
22
+ export { VERSION } from './version';
package/dist/index.js CHANGED
@@ -1,11 +1,15 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.MediaParserInternals = exports.parseMedia = void 0;
4
- const create_media_1 = require("./create/create-media");
3
+ exports.VERSION = exports.MediaParserInternals = exports.parseMedia = void 0;
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
  };
14
+ var version_1 = require("./version");
15
+ Object.defineProperty(exports, "VERSION", { enumerable: true, get: function () { return version_1.VERSION; } });
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';
@@ -110,11 +111,19 @@ export type ParseMediaResult<Fields extends Options<ParseMediaFields>> = (Fields
110
111
  export type ParseMediaDynamicOptions<F extends Options<ParseMediaFields>> = {
111
112
  fields?: F;
112
113
  } & ParseMediaCallbacks<F>;
114
+ export type ParseMediaProgress = {
115
+ bytes: number;
116
+ percentage: number | null;
117
+ totalBytes: number | null;
118
+ };
119
+ export type ParseMediaOnProgress = (progress: ParseMediaProgress) => void | Promise<void>;
113
120
  export type ParseMediaOptions<F extends Options<ParseMediaFields>> = {
114
- src: string | File;
121
+ src: string | Blob;
115
122
  reader?: ReaderInterface;
116
123
  onAudioTrack?: OnAudioTrack;
117
124
  onVideoTrack?: OnVideoTrack;
118
125
  signal?: AbortSignal;
126
+ logLevel?: LogLevel;
127
+ onParseProgress?: ParseMediaOnProgress;
119
128
  } & ParseMediaDynamicOptions<F>;
120
129
  export type ParseMedia = <F extends Options<ParseMediaFields>>(options: ParseMediaOptions<F>) => Promise<ParseMediaResult<F>>;
@@ -4,10 +4,11 @@ exports.parseMedia = void 0;
4
4
  const buffer_iterator_1 = require("./buffer-iterator");
5
5
  const emit_available_info_1 = require("./emit-available-info");
6
6
  const has_all_info_1 = require("./has-all-info");
7
+ const log_1 = require("./log");
7
8
  const parse_video_1 = require("./parse-video");
8
9
  const parser_state_1 = require("./parser-state");
9
10
  const from_fetch_1 = require("./readers/from-fetch");
10
- const parseMedia = async ({ src, fields, reader: readerInterface = from_fetch_1.fetchReader, onAudioTrack, onVideoTrack, signal, ...more }) => {
11
+ const parseMedia = async ({ src, fields, reader: readerInterface = from_fetch_1.fetchReader, onAudioTrack, onVideoTrack, signal, logLevel = 'info', onParseProgress, ...more }) => {
11
12
  const state = (0, parser_state_1.makeParserState)({
12
13
  hasAudioCallbacks: onAudioTrack !== null,
13
14
  hasVideoCallbacks: onVideoTrack !== null,
@@ -23,8 +24,15 @@ const parseMedia = async ({ src, fields, reader: readerInterface = from_fetch_1.
23
24
  const moreFields = more;
24
25
  let iterator = null;
25
26
  let parseResult = null;
27
+ const canSkipVideoData = !onVideoTrack && !onAudioTrack;
28
+ if (canSkipVideoData) {
29
+ log_1.Log.verbose(logLevel, 'Only parsing metadata, because no onVideoTrack and onAudioTrack callbacks were passed.');
30
+ }
31
+ else {
32
+ log_1.Log.verbose(logLevel, 'Parsing video data, because onVideoTrack/onAudioTrack callbacks were passed.');
33
+ }
26
34
  const options = {
27
- canSkipVideoData: !(onAudioTrack || onVideoTrack),
35
+ canSkipVideoData,
28
36
  onAudioTrack: onAudioTrack !== null && onAudioTrack !== void 0 ? onAudioTrack : null,
29
37
  onVideoTrack: onVideoTrack !== null && onVideoTrack !== void 0 ? onVideoTrack : null,
30
38
  parserState: state,
@@ -33,6 +41,26 @@ const parseMedia = async ({ src, fields, reader: readerInterface = from_fetch_1.
33
41
  process.env.KEEP_SAMPLES === 'true'),
34
42
  supportsContentRange,
35
43
  };
44
+ const hasAllInfo = () => {
45
+ if (parseResult === null) {
46
+ return false;
47
+ }
48
+ const availableInfo = (0, has_all_info_1.getAvailableInfo)(fields !== null && fields !== void 0 ? fields : {}, parseResult, state);
49
+ return Object.values(availableInfo).every(Boolean);
50
+ };
51
+ const triggerInfoEmit = () => {
52
+ const availableInfo = (0, has_all_info_1.getAvailableInfo)(fields !== null && fields !== void 0 ? fields : {}, parseResult, state);
53
+ (0, emit_available_info_1.emitAvailableInfo)({
54
+ hasInfo: availableInfo,
55
+ moreFields,
56
+ parseResult,
57
+ state,
58
+ returnValue,
59
+ contentLength,
60
+ name,
61
+ });
62
+ };
63
+ triggerInfoEmit();
36
64
  while (parseResult === null || parseResult.status === 'incomplete') {
37
65
  if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
38
66
  throw new Error('Aborted');
@@ -60,7 +88,16 @@ const parseMedia = async ({ src, fields, reader: readerInterface = from_fetch_1.
60
88
  if (!iterator) {
61
89
  throw new Error('Unexpected null');
62
90
  }
91
+ await (onParseProgress === null || onParseProgress === void 0 ? void 0 : onParseProgress({
92
+ bytes: iterator.counter.getOffset(),
93
+ percentage: contentLength
94
+ ? iterator.counter.getOffset() / contentLength
95
+ : null,
96
+ totalBytes: contentLength,
97
+ }));
98
+ triggerInfoEmit();
63
99
  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));
64
101
  parseResult = await parseResult.continueParsing();
65
102
  }
66
103
  else {
@@ -68,22 +105,12 @@ const parseMedia = async ({ src, fields, reader: readerInterface = from_fetch_1.
68
105
  iterator,
69
106
  options,
70
107
  signal: signal !== null && signal !== void 0 ? signal : null,
108
+ logLevel,
71
109
  });
72
110
  }
73
- const availableInfo = (0, has_all_info_1.getAvailableInfo)(fields !== null && fields !== void 0 ? fields : {}, parseResult, state);
74
- const hasAllInfo = Object.values(availableInfo).every(Boolean);
75
- (0, emit_available_info_1.emitAvailableInfo)({
76
- hasInfo: availableInfo,
77
- moreFields,
78
- parseResult,
79
- state,
80
- returnValue,
81
- contentLength,
82
- name,
83
- });
84
111
  // TODO Better: Check if no active listeners are registered
85
112
  // Also maybe check for canSkipVideoData
86
- if (hasAllInfo && !onVideoTrack && !onAudioTrack) {
113
+ if (hasAllInfo() && !onVideoTrack && !onAudioTrack) {
87
114
  break;
88
115
  }
89
116
  if (parseResult &&
@@ -98,6 +125,7 @@ const parseMedia = async ({ src, fields, reader: readerInterface = from_fetch_1.
98
125
  iterator.skipTo(parseResult.skipTo, true);
99
126
  }
100
127
  }
128
+ log_1.Log.verbose(logLevel, 'Finished parsing file');
101
129
  // Force assign
102
130
  (0, emit_available_info_1.emitAvailableInfo)({
103
131
  hasInfo: Object.keys(fields !== null && fields !== void 0 ? fields : {}).reduce((acc, key) => {
@@ -44,3 +44,18 @@ export type ParseResult = {
44
44
  skipTo: number | null;
45
45
  continueParsing: () => Promise<ParseResult>;
46
46
  };
47
+ export type MatroskaParseResult = {
48
+ status: 'done';
49
+ } | {
50
+ status: 'incomplete';
51
+ skipTo: number | null;
52
+ continueParsing: () => Promise<MatroskaParseResult>;
53
+ };
54
+ export type ExpectSegmentParseResult = {
55
+ status: 'done';
56
+ segment: MatroskaSegment;
57
+ } | {
58
+ status: 'incomplete';
59
+ segment: MatroskaSegment | null;
60
+ continueParsing: () => Promise<ExpectSegmentParseResult>;
61
+ };
@@ -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,8 @@ 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 log_1 = require("./log");
7
+ const parseVideo = ({ iterator, options, signal, logLevel, }) => {
7
8
  if (iterator.bytesRemaining() === 0) {
8
9
  return Promise.resolve({
9
10
  status: 'incomplete',
@@ -13,6 +14,7 @@ const parseVideo = ({ iterator, options, signal, }) => {
13
14
  iterator,
14
15
  options,
15
16
  signal,
17
+ logLevel,
16
18
  });
17
19
  },
18
20
  skipTo: null,
@@ -20,20 +22,9 @@ const parseVideo = ({ iterator, options, signal, }) => {
20
22
  }
21
23
  if (iterator.isRiff()) {
22
24
  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
25
  }
36
26
  if (iterator.isIsoBaseMedia()) {
27
+ log_1.Log.verbose(logLevel, 'Detected ISO Base Media container');
37
28
  return (0, process_box_1.parseBoxes)({
38
29
  iterator,
39
30
  maxBytes: Infinity,
@@ -41,11 +32,12 @@ const parseVideo = ({ iterator, options, signal, }) => {
41
32
  initialBoxes: [],
42
33
  options,
43
34
  continueMdat: false,
44
- littleEndian: false,
45
35
  signal,
36
+ logLevel,
46
37
  });
47
38
  }
48
39
  if (iterator.isWebm()) {
40
+ log_1.Log.verbose(logLevel, 'Detected Matroska container');
49
41
  return Promise.resolve((0, parse_webm_header_1.parseWebm)(iterator, options));
50
42
  }
51
43
  if (iterator.isMp3()) {
@@ -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;
@@ -8,8 +8,8 @@ type ReadResult = {
8
8
  name: string;
9
9
  supportsContentRange: boolean;
10
10
  };
11
- type ReadContent = (src: string | File, range: [number, number] | number | null, signal: AbortSignal | undefined) => Promise<ReadResult>;
12
- type GetLength = (src: string | File) => Promise<number>;
11
+ type ReadContent = (src: string | Blob, range: [number, number] | number | null, signal: AbortSignal | undefined) => Promise<ReadResult>;
12
+ type GetLength = (src: string | Blob) => Promise<number>;
13
13
  export type ReaderInterface = {
14
14
  read: ReadContent;
15
15
  getLength: GetLength;
@@ -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;
@@ -0,0 +1 @@
1
+ export declare const VERSION = "4.0.231";