@remotion/media-parser 4.0.240 → 4.0.242

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (186) hide show
  1. package/dist/add-avc-profile-to-track.js +2 -2
  2. package/dist/boxes/avc/codec-private.d.ts +1 -1
  3. package/dist/boxes/avc/codec-private.js +2 -2
  4. package/dist/boxes/avc/create-sps-pps-data.d.ts +2 -0
  5. package/dist/boxes/avc/create-sps-pps-data.js +28 -0
  6. package/dist/boxes/iso-base-media/get-keyframes.d.ts +3 -0
  7. package/dist/boxes/iso-base-media/get-keyframes.js +30 -0
  8. package/dist/boxes/iso-base-media/mdat/mdat.d.ts +3 -3
  9. package/dist/boxes/iso-base-media/mdat/mdat.js +9 -5
  10. package/dist/boxes/iso-base-media/moov/moov.d.ts +3 -3
  11. package/dist/boxes/iso-base-media/moov/moov.js +5 -4
  12. package/dist/boxes/iso-base-media/process-box.d.ts +9 -9
  13. package/dist/boxes/iso-base-media/process-box.js +48 -56
  14. package/dist/boxes/iso-base-media/stsd/mebx.d.ts +3 -3
  15. package/dist/boxes/iso-base-media/stsd/mebx.js +5 -4
  16. package/dist/boxes/iso-base-media/stsd/samples.d.ts +5 -5
  17. package/dist/boxes/iso-base-media/stsd/samples.js +19 -16
  18. package/dist/boxes/iso-base-media/stsd/stsd.d.ts +3 -3
  19. package/dist/boxes/iso-base-media/stsd/stsd.js +2 -2
  20. package/dist/boxes/iso-base-media/trak/trak.d.ts +3 -3
  21. package/dist/boxes/iso-base-media/trak/trak.js +7 -6
  22. package/dist/boxes/riff/expect-riff-box.d.ts +3 -3
  23. package/dist/boxes/riff/expect-riff-box.js +5 -5
  24. package/dist/boxes/riff/get-tracks-from-avi.js +1 -1
  25. package/dist/boxes/riff/parse-box.d.ts +7 -7
  26. package/dist/boxes/riff/parse-box.js +29 -24
  27. package/dist/boxes/riff/parse-list-box.d.ts +3 -3
  28. package/dist/boxes/riff/parse-list-box.js +2 -2
  29. package/dist/boxes/riff/parse-movi.d.ts +5 -5
  30. package/dist/boxes/riff/parse-movi.js +35 -20
  31. package/dist/boxes/riff/parse-riff-box.d.ts +3 -3
  32. package/dist/boxes/riff/parse-riff-box.js +2 -2
  33. package/dist/boxes/transport-stream/adts-header.d.ts +1 -1
  34. package/dist/boxes/transport-stream/discard-rest-of-packet.d.ts +1 -1
  35. package/dist/boxes/transport-stream/get-tracks.js +1 -1
  36. package/dist/boxes/transport-stream/handle-aac-packet.d.ts +4 -3
  37. package/dist/boxes/transport-stream/handle-aac-packet.js +6 -4
  38. package/dist/boxes/transport-stream/handle-avc-packet.d.ts +4 -3
  39. package/dist/boxes/transport-stream/handle-avc-packet.js +8 -6
  40. package/dist/boxes/transport-stream/parse-packet.d.ts +3 -3
  41. package/dist/boxes/transport-stream/parse-packet.js +2 -2
  42. package/dist/boxes/transport-stream/parse-stream-packet.d.ts +3 -3
  43. package/dist/boxes/transport-stream/parse-stream-packet.js +14 -7
  44. package/dist/boxes/transport-stream/parse-transport-stream.d.ts +5 -6
  45. package/dist/boxes/transport-stream/parse-transport-stream.js +10 -9
  46. package/dist/boxes/transport-stream/process-stream-buffers.d.ts +6 -5
  47. package/dist/boxes/transport-stream/process-stream-buffers.js +18 -8
  48. package/dist/boxes/webm/ebml.d.ts +1 -1
  49. package/dist/boxes/webm/get-sample-from-block.d.ts +2 -2
  50. package/dist/boxes/webm/get-sample-from-block.js +8 -4
  51. package/dist/boxes/webm/make-header.d.ts +3 -3
  52. package/dist/boxes/webm/parse-ebml.d.ts +4 -4
  53. package/dist/boxes/webm/parse-ebml.js +18 -18
  54. package/dist/boxes/webm/parse-webm-header.d.ts +5 -5
  55. package/dist/boxes/webm/parse-webm-header.js +6 -5
  56. package/dist/boxes/webm/segments/parse-children.d.ts +5 -5
  57. package/dist/boxes/webm/segments/parse-children.js +12 -13
  58. package/dist/boxes/webm/segments.d.ts +3 -3
  59. package/dist/boxes/webm/segments.js +13 -13
  60. package/dist/buffer-iterator.d.ts +2 -6
  61. package/dist/buffer-iterator.js +4 -29
  62. package/dist/convert-audio-or-video-sample.js +2 -0
  63. package/dist/create/iso-base-media/codec-specific/avc1.d.ts +1 -1
  64. package/dist/create/iso-base-media/codec-specific/create-codec-specific-data.d.ts +1 -1
  65. package/dist/create/iso-base-media/codec-specific/mp4a.d.ts +1 -1
  66. package/dist/create/iso-base-media/create-colr.d.ts +1 -1
  67. package/dist/create/iso-base-media/create-ftyp.d.ts +2 -2
  68. package/dist/create/iso-base-media/create-ilst.d.ts +1 -1
  69. package/dist/create/iso-base-media/create-mdia.d.ts +1 -1
  70. package/dist/create/iso-base-media/create-moov.d.ts +1 -1
  71. package/dist/create/iso-base-media/create-mvhd.d.ts +1 -1
  72. package/dist/create/iso-base-media/create-trak.d.ts +1 -1
  73. package/dist/create/iso-base-media/create-udta.d.ts +1 -1
  74. package/dist/create/iso-base-media/create-url.d.ts +1 -1
  75. package/dist/create/iso-base-media/ilst/create-cmt.d.ts +1 -1
  76. package/dist/create/iso-base-media/ilst/create-too.d.ts +1 -1
  77. package/dist/create/iso-base-media/mdia/create-mdhd.d.ts +1 -1
  78. package/dist/create/iso-base-media/mp4-header.d.ts +1 -1
  79. package/dist/create/iso-base-media/primitives.d.ts +13 -13
  80. package/dist/create/iso-base-media/serialize-track.d.ts +1 -1
  81. package/dist/create/iso-base-media/trak/create-tkhd.d.ts +2 -2
  82. package/dist/create/iso-base-media/trak/mdia/create-minf.d.ts +1 -1
  83. package/dist/create/iso-base-media/trak/mdia/minf/create-dinf.d.ts +1 -1
  84. package/dist/create/iso-base-media/trak/mdia/minf/create-smhd.d.ts +1 -1
  85. package/dist/create/iso-base-media/trak/mdia/minf/create-stbl.d.ts +1 -1
  86. package/dist/create/iso-base-media/trak/mdia/minf/create-vmhd.d.ts +1 -1
  87. package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-ctts.d.ts +1 -1
  88. package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-stco.d.ts +1 -1
  89. package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-stsc.d.ts +1 -1
  90. package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-stss.d.ts +1 -1
  91. package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-stsz.d.ts +1 -1
  92. package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-stts.d.ts +1 -1
  93. package/dist/create/iso-base-media/trak/mdia/minf/stbl/stsd/create-avc1.d.ts +1 -1
  94. package/dist/create/iso-base-media/trak/mdia/minf/stbl/stsd/create-avcc.d.ts +1 -1
  95. package/dist/create/iso-base-media/trak/mdia/minf/stbl/stsd/create-pasp.d.ts +1 -1
  96. package/dist/create/iso-base-media/udta/create-meta.d.ts +1 -1
  97. package/dist/create/iso-base-media/udta/meta/create-hdlr.d.ts +1 -1
  98. package/dist/create/matroska/cluster-segment.d.ts +1 -1
  99. package/dist/emit-available-info.d.ts +6 -4
  100. package/dist/emit-available-info.js +231 -79
  101. package/dist/errors/detect-file-type.d.ts +1 -0
  102. package/dist/errors/detect-file-type.js +88 -0
  103. package/dist/errors/file-types.d.ts +1 -0
  104. package/dist/errors/file-types.js +88 -0
  105. package/dist/errors.d.ts +68 -0
  106. package/dist/errors.js +71 -0
  107. package/dist/esm/from-fetch.mjs +1 -0
  108. package/dist/esm/from-node.mjs +1 -0
  109. package/dist/esm/from-web-file.mjs +2 -1
  110. package/dist/esm/index.mjs +1457 -542
  111. package/dist/file-types/bmp.d.ts +6 -0
  112. package/dist/file-types/bmp.js +23 -0
  113. package/dist/file-types/detect-file-type.d.ts +42 -0
  114. package/dist/file-types/detect-file-type.js +59 -0
  115. package/dist/file-types/get-jpeg-dimensions.d.ts +4 -0
  116. package/dist/file-types/get-jpeg-dimensions.js +32 -0
  117. package/dist/file-types/index.d.ts +2 -0
  118. package/dist/file-types/index.js +57 -0
  119. package/dist/file-types/jpeg.d.ts +12 -0
  120. package/dist/file-types/jpeg.js +44 -0
  121. package/dist/file-types/pdf.d.ts +4 -0
  122. package/dist/file-types/pdf.js +12 -0
  123. package/dist/file-types/png.d.ts +10 -0
  124. package/dist/file-types/png.js +32 -0
  125. package/dist/file-types/webp.d.ts +6 -0
  126. package/dist/file-types/webp.js +69 -0
  127. package/dist/file-types.d.ts +1 -0
  128. package/dist/file-types.js +88 -0
  129. package/dist/get-audio-codec.d.ts +1 -1
  130. package/dist/get-duration.d.ts +1 -0
  131. package/dist/get-duration.js +14 -1
  132. package/dist/get-fields-from-callbacks.d.ts +5 -0
  133. package/dist/get-fields-from-callbacks.js +32 -0
  134. package/dist/get-fps.d.ts +1 -0
  135. package/dist/get-fps.js +17 -12
  136. package/dist/get-keyframes.d.ts +5 -0
  137. package/dist/get-keyframes.js +20 -0
  138. package/dist/get-tracks.d.ts +7 -1
  139. package/dist/get-tracks.js +15 -10
  140. package/dist/has-all-info.d.ts +5 -4
  141. package/dist/has-all-info.js +31 -5
  142. package/dist/index.d.ts +2 -0
  143. package/dist/index.js +7 -1
  144. package/dist/may-skip-video-data/may-skip-video-data.d.ts +4 -0
  145. package/dist/may-skip-video-data/may-skip-video-data.js +14 -0
  146. package/dist/may-skip-video-data/need-samples-for-fields.d.ts +5 -0
  147. package/dist/may-skip-video-data/need-samples-for-fields.js +33 -0
  148. package/dist/options.d.ts +68 -53
  149. package/dist/parse-media.js +42 -31
  150. package/dist/parse-result.d.ts +2 -4
  151. package/dist/parse-video.d.ts +8 -5
  152. package/dist/parse-video.js +94 -17
  153. package/dist/probing/detect-file-type.d.ts +1 -0
  154. package/dist/probing/detect-file-type.js +88 -0
  155. package/dist/probing/get-jpeg-dimensions.d.ts +4 -0
  156. package/dist/probing/get-jpeg-dimensions.js +32 -0
  157. package/dist/readers/from-fetch.js +1 -0
  158. package/dist/readers/from-node.js +1 -0
  159. package/dist/readers/from-web-file.js +1 -0
  160. package/dist/readers/reader.d.ts +1 -0
  161. package/dist/register-track.d.ts +5 -5
  162. package/dist/register-track.js +12 -12
  163. package/dist/state/can-skip-tracks.js +6 -0
  164. package/dist/state/emitted-fields.d.ts +2 -0
  165. package/dist/state/emitted-fields.js +31 -0
  166. package/dist/state/has-tracks-section.d.ts +1 -0
  167. package/dist/state/keyframes.d.ts +6 -0
  168. package/dist/state/keyframes.js +15 -0
  169. package/dist/state/parser-state.d.ts +60 -29
  170. package/dist/state/parser-state.js +32 -150
  171. package/dist/state/riff.d.ts +10 -0
  172. package/dist/state/riff.js +32 -0
  173. package/dist/state/sample-callbacks.d.ts +31 -0
  174. package/dist/state/sample-callbacks.js +96 -0
  175. package/dist/state/slow-duration-fps.d.ts +8 -0
  176. package/dist/state/slow-duration-fps.js +36 -0
  177. package/dist/state/structure.d.ts +7 -0
  178. package/dist/state/structure.js +21 -0
  179. package/dist/state/tracks-and-samples.d.ts +0 -0
  180. package/dist/state/tracks-and-samples.js +1 -0
  181. package/dist/state/webm.d.ts +11 -0
  182. package/dist/state/webm.js +67 -0
  183. package/dist/version.d.ts +1 -1
  184. package/dist/version.js +1 -1
  185. package/dist/webcodec-sample-types.d.ts +2 -0
  186. package/package.json +3 -3
@@ -1,9 +1,7 @@
1
1
  import type { AvcPPs, AvcProfileInfo } from '../boxes/avc/parse-avc';
2
- import type { OnTrackEntrySegment } from '../boxes/webm/segments';
3
- import type { TrackInfo } from '../boxes/webm/segments/track-entry';
4
2
  import type { BufferIterator } from '../buffer-iterator';
5
3
  import type { Options, ParseMediaFields } from '../options';
6
- import type { AudioOrVideoSample, OnAudioSample, OnVideoSample } from '../webcodec-sample-types';
4
+ import type { OnAudioTrack, OnVideoTrack } from '../webcodec-sample-types';
7
5
  export type InternalStats = {
8
6
  skippedBytes: number;
9
7
  finalCursorOffset: number;
@@ -12,42 +10,75 @@ export type SpsAndPps = {
12
10
  sps: AvcProfileInfo;
13
11
  pps: AvcPPs;
14
12
  };
15
- type AvcProfileInfoCallback = (profile: SpsAndPps) => Promise<void>;
16
- export declare const makeParserState: ({ hasAudioTrackHandlers, hasVideoTrackHandlers, signal, getIterator, fields, }: {
13
+ export declare const makeParserState: ({ hasAudioTrackHandlers, hasVideoTrackHandlers, signal, getIterator, fields, nullifySamples, onAudioTrack, onVideoTrack, supportsContentRange, }: {
17
14
  hasAudioTrackHandlers: boolean;
18
15
  hasVideoTrackHandlers: boolean;
19
16
  signal: AbortSignal | undefined;
20
17
  getIterator: () => BufferIterator | null;
21
18
  fields: Options<ParseMediaFields>;
19
+ nullifySamples: boolean;
20
+ supportsContentRange: boolean;
21
+ onAudioTrack: OnAudioTrack | null;
22
+ onVideoTrack: OnVideoTrack | null;
22
23
  }) => {
23
- onTrackEntrySegment: OnTrackEntrySegment;
24
- onProfile: (profile: SpsAndPps) => Promise<void>;
25
- registerOnAvcProfileCallback: (callback: AvcProfileInfoCallback) => void;
26
- getTrackInfoByNumber: (id: number) => TrackInfo;
27
- registerVideoSampleCallback: (id: number, callback: OnVideoSample | null) => Promise<void>;
28
- setTimestampOffset: (byteOffset: number, timestamp: number) => void;
29
- getTimestampOffsetForByteOffset: (byteOffset: number) => number | undefined;
30
- registerAudioSampleCallback: (id: number, callback: OnAudioSample | null) => Promise<void>;
31
- onAudioSample: (trackId: number, audioSample: AudioOrVideoSample) => Promise<void>;
32
- onVideoSample: (trackId: number, videoSample: AudioOrVideoSample) => Promise<void>;
33
- getTimescale: () => number;
34
- setTimescale: (newTimescale: number) => void;
35
- getSamplesForTrack: (trackId: number) => number;
36
- getAvcProfile: () => SpsAndPps | null;
24
+ riff: {
25
+ getAvcProfile: () => SpsAndPps | null;
26
+ onProfile: (profile: SpsAndPps) => Promise<void>;
27
+ registerOnAvcProfileCallback: (callback: (profile: SpsAndPps) => Promise<void>) => void;
28
+ getNextTrackIndex: () => number;
29
+ incrementNextTrackIndex: () => void;
30
+ };
31
+ callbacks: {
32
+ registerVideoSampleCallback: (id: number, callback: import("../webcodec-sample-types").OnVideoSample | null) => Promise<void>;
33
+ onAudioSample: (trackId: number, audioSample: import("../webcodec-sample-types").AudioOrVideoSample) => Promise<void>;
34
+ getSamplesForTrack: (trackId: number) => number;
35
+ onVideoSample: (trackId: number, videoSample: import("../webcodec-sample-types").AudioOrVideoSample) => Promise<void>;
36
+ canSkipTracksState: {
37
+ canSkipTracks: () => boolean;
38
+ };
39
+ registerAudioSampleCallback: (id: number, callback: import("../webcodec-sample-types").OnAudioSample | null) => Promise<void>;
40
+ tracks: {
41
+ hasAllTracks: () => boolean;
42
+ setIsDone: () => void;
43
+ addTrack: (track: import("..").Track) => void;
44
+ getTracks: () => import("..").Track[];
45
+ ensureHasTracksAtEnd: () => void;
46
+ };
47
+ audioSampleCallbacks: Record<number, import("../webcodec-sample-types").OnAudioSample>;
48
+ videoSampleCallbacks: Record<number, import("../webcodec-sample-types").OnVideoSample>;
49
+ };
37
50
  getInternalStats: () => InternalStats;
38
51
  getSkipBytes: () => number;
39
52
  increaseSkippedBytes: (bytes: number) => void;
40
- maySkipVideoData: () => boolean;
41
- tracks: {
42
- hasAllTracks: () => boolean;
43
- setIsDone: () => void;
44
- addTrack: (track: import("..").Track) => void;
45
- getTracks: () => import("..").Track[];
46
- ensureHasTracksAtEnd: () => void;
53
+ keyframes: {
54
+ addKeyframe: (keyframe: import("../options").MediaParserKeyframe) => void;
55
+ getKeyframes: () => import("../options").MediaParserKeyframe[];
56
+ };
57
+ structure: {
58
+ getStructureOrNull: () => import("../parse-result").Structure | null;
59
+ getStructure: () => import("../parse-result").Structure;
60
+ setStructure: (value: import("../parse-result").Structure) => void;
61
+ };
62
+ nullifySamples: boolean;
63
+ onAudioTrack: OnAudioTrack | null;
64
+ onVideoTrack: OnVideoTrack | null;
65
+ supportsContentRange: boolean;
66
+ webm: {
67
+ onTrackEntrySegment: import("../boxes/webm/segments").OnTrackEntrySegment;
68
+ getTrackInfoByNumber: (id: number) => import("../boxes/webm/segments/track-entry").TrackInfo;
69
+ setTimestampOffset: (byteOffset: number, timestamp: number) => void;
70
+ getTimestampOffsetForByteOffset: (byteOffset: number) => number | undefined;
71
+ timescale: null;
72
+ getTimescale: () => number;
73
+ setTimescale: (newTimescale: number) => void;
47
74
  };
48
- canSkipTracksState: {
49
- canSkipTracks: () => boolean;
75
+ emittedFields: import("../options").AllOptions<ParseMediaFields>;
76
+ fields: Partial<import("../options").AllOptions<ParseMediaFields>>;
77
+ slowDurationAndFps: {
78
+ addSample: (videoSample: import("../webcodec-sample-types").AudioOrVideoSample) => void;
79
+ getSlowDurationInSeconds: () => number;
80
+ getFps: () => number;
81
+ getSlowNumberOfFrames: () => number;
50
82
  };
51
83
  };
52
84
  export type ParserState = ReturnType<typeof makeParserState>;
53
- export {};
@@ -1,154 +1,33 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.makeParserState = void 0;
4
- const traversal_1 = require("../boxes/webm/traversal");
5
- const can_skip_tracks_1 = require("./can-skip-tracks");
6
- const has_tracks_section_1 = require("./has-tracks-section");
7
- const makeParserState = ({ hasAudioTrackHandlers, hasVideoTrackHandlers, signal, getIterator, fields, }) => {
8
- const trackEntries = {};
9
- const onTrackEntrySegment = (trackEntry) => {
10
- var _a;
11
- const trackId = (0, traversal_1.getTrackId)(trackEntry);
12
- if (!trackId) {
13
- throw new Error('Expected track id');
14
- }
15
- if (trackEntries[trackId]) {
16
- return;
17
- }
18
- const codec = (0, traversal_1.getTrackCodec)(trackEntry);
19
- if (!codec) {
20
- throw new Error('Expected codec');
21
- }
22
- const trackTimescale = (0, traversal_1.getTrackTimestampScale)(trackEntry);
23
- trackEntries[trackId] = {
24
- codec: codec.value,
25
- trackTimescale: (_a = trackTimescale === null || trackTimescale === void 0 ? void 0 : trackTimescale.value) !== null && _a !== void 0 ? _a : null,
26
- };
27
- };
28
- const videoSampleCallbacks = {};
29
- const audioSampleCallbacks = {};
30
- const queuedAudioSamples = {};
31
- const queuedVideoSamples = {};
32
- let timescale = null;
4
+ const emitted_fields_1 = require("./emitted-fields");
5
+ const keyframes_1 = require("./keyframes");
6
+ const riff_1 = require("./riff");
7
+ const sample_callbacks_1 = require("./sample-callbacks");
8
+ const slow_duration_fps_1 = require("./slow-duration-fps");
9
+ const structure_1 = require("./structure");
10
+ const webm_1 = require("./webm");
11
+ const makeParserState = ({ hasAudioTrackHandlers, hasVideoTrackHandlers, signal, getIterator, fields, nullifySamples, onAudioTrack, onVideoTrack, supportsContentRange, }) => {
33
12
  let skippedBytes = 0;
34
- const getTimescale = () => {
35
- // https://www.matroska.org/technical/notes.html
36
- // When using the default value of TimestampScale of “1,000,000”, one Segment Tick represents one millisecond.
37
- if (timescale === null) {
38
- return 1000000;
39
- }
40
- return timescale;
41
- };
42
13
  const increaseSkippedBytes = (bytes) => {
43
14
  skippedBytes += bytes;
44
15
  };
45
- const setTimescale = (newTimescale) => {
46
- timescale = newTimescale;
47
- };
48
- const timestampMap = new Map();
49
- const setTimestampOffset = (byteOffset, timestamp) => {
50
- timestampMap.set(byteOffset, timestamp);
51
- };
52
- const getTimestampOffsetForByteOffset = (byteOffset) => {
53
- const entries = Array.from(timestampMap.entries());
54
- const sortedByByteOffset = entries
55
- .sort((a, b) => {
56
- return a[0] - b[0];
57
- })
58
- .reverse();
59
- for (const [offset, timestamp] of sortedByByteOffset) {
60
- if (offset >= byteOffset) {
61
- continue;
62
- }
63
- return timestamp;
64
- }
65
- return timestampMap.get(byteOffset);
66
- };
67
- const samplesForTrack = {};
68
- const profileCallbacks = [];
69
- const registerOnAvcProfileCallback = (callback) => {
70
- profileCallbacks.push(callback);
71
- };
72
- let avcProfile = null;
73
- const onProfile = async (profile) => {
74
- avcProfile = profile;
75
- for (const callback of profileCallbacks) {
76
- await callback(profile);
77
- }
78
- profileCallbacks.length = 0;
79
- };
80
- const canSkipTracksState = (0, can_skip_tracks_1.makeCanSkipTracksState)({
81
- hasAudioTrackHandlers,
82
- fields,
83
- hasVideoTrackHandlers,
84
- });
85
- const tracksState = (0, has_tracks_section_1.makeTracksSectionState)(canSkipTracksState);
16
+ const structure = (0, structure_1.structureState)();
17
+ const keyframes = (0, keyframes_1.keyframesState)();
18
+ const emittedFields = (0, emitted_fields_1.emittedState)();
19
+ const slowDurationAndFps = (0, slow_duration_fps_1.slowDurationAndFpsState)();
86
20
  return {
87
- onTrackEntrySegment,
88
- onProfile,
89
- registerOnAvcProfileCallback,
90
- getTrackInfoByNumber: (id) => trackEntries[id],
91
- registerVideoSampleCallback: async (id, callback) => {
92
- var _a;
93
- if (callback === null) {
94
- delete videoSampleCallbacks[id];
95
- return;
96
- }
97
- videoSampleCallbacks[id] = callback;
98
- for (const queued of (_a = queuedVideoSamples[id]) !== null && _a !== void 0 ? _a : []) {
99
- await callback(queued);
100
- }
101
- queuedVideoSamples[id] = [];
102
- },
103
- setTimestampOffset,
104
- getTimestampOffsetForByteOffset,
105
- registerAudioSampleCallback: async (id, callback) => {
106
- var _a;
107
- if (callback === null) {
108
- delete audioSampleCallbacks[id];
109
- return;
110
- }
111
- audioSampleCallbacks[id] = callback;
112
- for (const queued of (_a = queuedAudioSamples[id]) !== null && _a !== void 0 ? _a : []) {
113
- await callback(queued);
114
- }
115
- queuedAudioSamples[id] = [];
116
- },
117
- onAudioSample: async (trackId, audioSample) => {
118
- if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
119
- throw new Error('Aborted');
120
- }
121
- if (typeof samplesForTrack[trackId] === 'undefined') {
122
- samplesForTrack[trackId] = 0;
123
- }
124
- samplesForTrack[trackId]++;
125
- const callback = audioSampleCallbacks[trackId];
126
- if (callback) {
127
- await callback(audioSample);
128
- }
129
- },
130
- onVideoSample: async (trackId, videoSample) => {
131
- if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
132
- throw new Error('Aborted');
133
- }
134
- if (typeof samplesForTrack[trackId] === 'undefined') {
135
- samplesForTrack[trackId] = 0;
136
- }
137
- samplesForTrack[trackId]++;
138
- const callback = videoSampleCallbacks[trackId];
139
- if (callback) {
140
- await callback(videoSample);
141
- }
142
- },
143
- getTimescale,
144
- setTimescale,
145
- getSamplesForTrack: (trackId) => {
146
- var _a;
147
- return (_a = samplesForTrack[trackId]) !== null && _a !== void 0 ? _a : 0;
148
- },
149
- getAvcProfile: () => {
150
- return avcProfile;
151
- },
21
+ riff: (0, riff_1.riffSpecificState)(),
22
+ callbacks: (0, sample_callbacks_1.sampleCallback)({
23
+ signal,
24
+ hasAudioTrackHandlers,
25
+ hasVideoTrackHandlers,
26
+ fields,
27
+ keyframes,
28
+ emittedFields,
29
+ slowDurationAndFpsState: slowDurationAndFps,
30
+ }),
152
31
  getInternalStats: () => {
153
32
  var _a, _b;
154
33
  return ({
@@ -158,13 +37,16 @@ const makeParserState = ({ hasAudioTrackHandlers, hasVideoTrackHandlers, signal,
158
37
  },
159
38
  getSkipBytes: () => skippedBytes,
160
39
  increaseSkippedBytes,
161
- maySkipVideoData: () => {
162
- return (tracksState.hasAllTracks() &&
163
- Object.values(videoSampleCallbacks).length === 0 &&
164
- Object.values(audioSampleCallbacks).length === 0);
165
- },
166
- tracks: tracksState,
167
- canSkipTracksState,
40
+ keyframes,
41
+ structure,
42
+ nullifySamples,
43
+ onAudioTrack,
44
+ onVideoTrack,
45
+ supportsContentRange,
46
+ webm: (0, webm_1.webmState)(),
47
+ emittedFields,
48
+ fields,
49
+ slowDurationAndFps,
168
50
  };
169
51
  };
170
52
  exports.makeParserState = makeParserState;
@@ -0,0 +1,10 @@
1
+ import type { SpsAndPps } from './parser-state';
2
+ type AvcProfileInfoCallback = (profile: SpsAndPps) => Promise<void>;
3
+ export declare const riffSpecificState: () => {
4
+ getAvcProfile: () => SpsAndPps | null;
5
+ onProfile: (profile: SpsAndPps) => Promise<void>;
6
+ registerOnAvcProfileCallback: (callback: AvcProfileInfoCallback) => void;
7
+ getNextTrackIndex: () => number;
8
+ incrementNextTrackIndex: () => void;
9
+ };
10
+ export {};
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.riffSpecificState = void 0;
4
+ const riffSpecificState = () => {
5
+ let avcProfile = null;
6
+ let nextTrackIndex = 0;
7
+ const profileCallbacks = [];
8
+ const registerOnAvcProfileCallback = (callback) => {
9
+ profileCallbacks.push(callback);
10
+ };
11
+ const onProfile = async (profile) => {
12
+ avcProfile = profile;
13
+ for (const callback of profileCallbacks) {
14
+ await callback(profile);
15
+ }
16
+ profileCallbacks.length = 0;
17
+ };
18
+ return {
19
+ getAvcProfile: () => {
20
+ return avcProfile;
21
+ },
22
+ onProfile,
23
+ registerOnAvcProfileCallback,
24
+ getNextTrackIndex: () => {
25
+ return nextTrackIndex;
26
+ },
27
+ incrementNextTrackIndex: () => {
28
+ nextTrackIndex++;
29
+ },
30
+ };
31
+ };
32
+ exports.riffSpecificState = riffSpecificState;
@@ -0,0 +1,31 @@
1
+ import type { AllOptions, Options, ParseMediaFields } from '../options';
2
+ import type { AudioOrVideoSample, OnAudioSample, OnVideoSample } from '../webcodec-sample-types';
3
+ import { type KeyframesState } from './keyframes';
4
+ import type { SlowDurationAndFpsState } from './slow-duration-fps';
5
+ export declare const sampleCallback: ({ signal, hasAudioTrackHandlers, hasVideoTrackHandlers, fields, keyframes, emittedFields, slowDurationAndFpsState, }: {
6
+ signal: AbortSignal | undefined;
7
+ hasAudioTrackHandlers: boolean;
8
+ hasVideoTrackHandlers: boolean;
9
+ fields: Options<ParseMediaFields>;
10
+ keyframes: KeyframesState;
11
+ emittedFields: AllOptions<ParseMediaFields>;
12
+ slowDurationAndFpsState: SlowDurationAndFpsState;
13
+ }) => {
14
+ registerVideoSampleCallback: (id: number, callback: OnVideoSample | null) => Promise<void>;
15
+ onAudioSample: (trackId: number, audioSample: AudioOrVideoSample) => Promise<void>;
16
+ getSamplesForTrack: (trackId: number) => number;
17
+ onVideoSample: (trackId: number, videoSample: AudioOrVideoSample) => Promise<void>;
18
+ canSkipTracksState: {
19
+ canSkipTracks: () => boolean;
20
+ };
21
+ registerAudioSampleCallback: (id: number, callback: OnAudioSample | null) => Promise<void>;
22
+ tracks: {
23
+ hasAllTracks: () => boolean;
24
+ setIsDone: () => void;
25
+ addTrack: (track: import("..").Track) => void;
26
+ getTracks: () => import("..").Track[];
27
+ ensureHasTracksAtEnd: () => void;
28
+ };
29
+ audioSampleCallbacks: Record<number, OnAudioSample>;
30
+ videoSampleCallbacks: Record<number, OnVideoSample>;
31
+ };
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sampleCallback = void 0;
4
+ const need_samples_for_fields_1 = require("../may-skip-video-data/need-samples-for-fields");
5
+ const can_skip_tracks_1 = require("./can-skip-tracks");
6
+ const has_tracks_section_1 = require("./has-tracks-section");
7
+ const sampleCallback = ({ signal, hasAudioTrackHandlers, hasVideoTrackHandlers, fields, keyframes, emittedFields, slowDurationAndFpsState, }) => {
8
+ const videoSampleCallbacks = {};
9
+ const audioSampleCallbacks = {};
10
+ const queuedAudioSamples = {};
11
+ const queuedVideoSamples = {};
12
+ const canSkipTracksState = (0, can_skip_tracks_1.makeCanSkipTracksState)({
13
+ hasAudioTrackHandlers,
14
+ fields,
15
+ hasVideoTrackHandlers,
16
+ });
17
+ const tracksState = (0, has_tracks_section_1.makeTracksSectionState)(canSkipTracksState);
18
+ const samplesForTrack = {};
19
+ return {
20
+ registerVideoSampleCallback: async (id, callback) => {
21
+ var _a;
22
+ if (callback === null) {
23
+ delete videoSampleCallbacks[id];
24
+ return;
25
+ }
26
+ videoSampleCallbacks[id] = callback;
27
+ for (const queued of (_a = queuedVideoSamples[id]) !== null && _a !== void 0 ? _a : []) {
28
+ await callback(queued);
29
+ }
30
+ queuedVideoSamples[id] = [];
31
+ },
32
+ onAudioSample: async (trackId, audioSample) => {
33
+ if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
34
+ throw new Error('Aborted');
35
+ }
36
+ if (typeof samplesForTrack[trackId] === 'undefined') {
37
+ samplesForTrack[trackId] = 0;
38
+ }
39
+ samplesForTrack[trackId]++;
40
+ const callback = audioSampleCallbacks[trackId];
41
+ if (callback) {
42
+ await callback(audioSample);
43
+ }
44
+ },
45
+ getSamplesForTrack: (trackId) => {
46
+ var _a;
47
+ return (_a = samplesForTrack[trackId]) !== null && _a !== void 0 ? _a : 0;
48
+ },
49
+ onVideoSample: async (trackId, videoSample) => {
50
+ if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
51
+ throw new Error('Aborted');
52
+ }
53
+ if (typeof samplesForTrack[trackId] === 'undefined') {
54
+ samplesForTrack[trackId] = 0;
55
+ }
56
+ samplesForTrack[trackId]++;
57
+ const callback = videoSampleCallbacks[trackId];
58
+ // If we emit samples with data 0, Chrome will fail
59
+ if (callback && videoSample.data.length > 0) {
60
+ await callback(videoSample);
61
+ }
62
+ if ((0, need_samples_for_fields_1.needsToIterateOverSamples)({
63
+ fields,
64
+ emittedFields,
65
+ })) {
66
+ if (fields.slowKeyframes && videoSample.type === 'key') {
67
+ keyframes.addKeyframe({
68
+ trackId,
69
+ decodingTimeInSeconds: videoSample.dts / videoSample.timescale,
70
+ positionInBytes: videoSample.offset,
71
+ presentationTimeInSeconds: videoSample.cts / videoSample.timescale,
72
+ sizeInBytes: videoSample.data.length,
73
+ });
74
+ }
75
+ slowDurationAndFpsState.addSample(videoSample);
76
+ }
77
+ },
78
+ canSkipTracksState,
79
+ registerAudioSampleCallback: async (id, callback) => {
80
+ var _a;
81
+ if (callback === null) {
82
+ delete audioSampleCallbacks[id];
83
+ return;
84
+ }
85
+ audioSampleCallbacks[id] = callback;
86
+ for (const queued of (_a = queuedAudioSamples[id]) !== null && _a !== void 0 ? _a : []) {
87
+ await callback(queued);
88
+ }
89
+ queuedAudioSamples[id] = [];
90
+ },
91
+ tracks: tracksState,
92
+ audioSampleCallbacks,
93
+ videoSampleCallbacks,
94
+ };
95
+ };
96
+ exports.sampleCallback = sampleCallback;
@@ -0,0 +1,8 @@
1
+ import type { AudioOrVideoSample } from '../webcodec-sample-types';
2
+ export declare const slowDurationAndFpsState: () => {
3
+ addSample: (videoSample: AudioOrVideoSample) => void;
4
+ getSlowDurationInSeconds: () => number;
5
+ getFps: () => number;
6
+ getSlowNumberOfFrames: () => number;
7
+ };
8
+ export type SlowDurationAndFpsState = ReturnType<typeof slowDurationAndFpsState>;
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.slowDurationAndFpsState = void 0;
4
+ const slowDurationAndFpsState = () => {
5
+ let smallestSample;
6
+ let largestSample;
7
+ let samples = 0;
8
+ const getSlowDurationInSeconds = () => {
9
+ if (smallestSample !== undefined && largestSample !== undefined) {
10
+ const startingTimestampDifference = largestSample - smallestSample;
11
+ const timeBetweenSamples = startingTimestampDifference / (samples - 1);
12
+ return timeBetweenSamples * samples;
13
+ }
14
+ throw new Error('No samples');
15
+ };
16
+ return {
17
+ addSample: (videoSample) => {
18
+ samples++;
19
+ const presentationTimeInSeconds = videoSample.cts / videoSample.timescale;
20
+ if (largestSample === undefined ||
21
+ presentationTimeInSeconds > largestSample) {
22
+ largestSample = presentationTimeInSeconds;
23
+ }
24
+ if (smallestSample === undefined ||
25
+ presentationTimeInSeconds < smallestSample) {
26
+ smallestSample = presentationTimeInSeconds;
27
+ }
28
+ },
29
+ getSlowDurationInSeconds,
30
+ getFps: () => {
31
+ return samples / getSlowDurationInSeconds();
32
+ },
33
+ getSlowNumberOfFrames: () => samples,
34
+ };
35
+ };
36
+ exports.slowDurationAndFpsState = slowDurationAndFpsState;
@@ -0,0 +1,7 @@
1
+ import type { Structure } from '../parse-result';
2
+ export declare const structureState: () => {
3
+ getStructureOrNull: () => Structure | null;
4
+ getStructure: () => Structure;
5
+ setStructure: (value: Structure) => void;
6
+ };
7
+ export type StructureState = ReturnType<typeof structureState>;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.structureState = void 0;
4
+ const structureState = () => {
5
+ let structure = null;
6
+ return {
7
+ getStructureOrNull: () => {
8
+ return structure;
9
+ },
10
+ getStructure: () => {
11
+ if (structure === null) {
12
+ throw new Error('Expected structure');
13
+ }
14
+ return structure;
15
+ },
16
+ setStructure: (value) => {
17
+ structure = value;
18
+ },
19
+ };
20
+ };
21
+ exports.structureState = structureState;
File without changes
@@ -0,0 +1 @@
1
+ "use strict";
@@ -0,0 +1,11 @@
1
+ import type { OnTrackEntrySegment } from '../boxes/webm/segments';
2
+ import type { TrackInfo } from '../boxes/webm/segments/track-entry';
3
+ export declare const webmState: () => {
4
+ onTrackEntrySegment: OnTrackEntrySegment;
5
+ getTrackInfoByNumber: (id: number) => TrackInfo;
6
+ setTimestampOffset: (byteOffset: number, timestamp: number) => void;
7
+ getTimestampOffsetForByteOffset: (byteOffset: number) => number | undefined;
8
+ timescale: null;
9
+ getTimescale: () => number;
10
+ setTimescale: (newTimescale: number) => void;
11
+ };
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.webmState = void 0;
4
+ const traversal_1 = require("../boxes/webm/traversal");
5
+ const webmState = () => {
6
+ const trackEntries = {};
7
+ const onTrackEntrySegment = (trackEntry) => {
8
+ var _a;
9
+ const trackId = (0, traversal_1.getTrackId)(trackEntry);
10
+ if (!trackId) {
11
+ throw new Error('Expected track id');
12
+ }
13
+ if (trackEntries[trackId]) {
14
+ return;
15
+ }
16
+ const codec = (0, traversal_1.getTrackCodec)(trackEntry);
17
+ if (!codec) {
18
+ throw new Error('Expected codec');
19
+ }
20
+ const trackTimescale = (0, traversal_1.getTrackTimestampScale)(trackEntry);
21
+ trackEntries[trackId] = {
22
+ codec: codec.value,
23
+ trackTimescale: (_a = trackTimescale === null || trackTimescale === void 0 ? void 0 : trackTimescale.value) !== null && _a !== void 0 ? _a : null,
24
+ };
25
+ };
26
+ const timestampMap = new Map();
27
+ const getTimestampOffsetForByteOffset = (byteOffset) => {
28
+ const entries = Array.from(timestampMap.entries());
29
+ const sortedByByteOffset = entries
30
+ .sort((a, b) => {
31
+ return a[0] - b[0];
32
+ })
33
+ .reverse();
34
+ for (const [offset, timestamp] of sortedByByteOffset) {
35
+ if (offset >= byteOffset) {
36
+ continue;
37
+ }
38
+ return timestamp;
39
+ }
40
+ return timestampMap.get(byteOffset);
41
+ };
42
+ const setTimestampOffset = (byteOffset, timestamp) => {
43
+ timestampMap.set(byteOffset, timestamp);
44
+ };
45
+ let timescale = null;
46
+ const setTimescale = (newTimescale) => {
47
+ timescale = newTimescale;
48
+ };
49
+ const getTimescale = () => {
50
+ // https://www.matroska.org/technical/notes.html
51
+ // When using the default value of TimestampScale of “1,000,000”, one Segment Tick represents one millisecond.
52
+ if (timescale === null) {
53
+ return 1000000;
54
+ }
55
+ return timescale;
56
+ };
57
+ return {
58
+ onTrackEntrySegment,
59
+ getTrackInfoByNumber: (id) => trackEntries[id],
60
+ setTimestampOffset,
61
+ getTimestampOffsetForByteOffset,
62
+ timescale,
63
+ getTimescale,
64
+ setTimescale,
65
+ };
66
+ };
67
+ exports.webmState = webmState;
package/dist/version.d.ts CHANGED
@@ -1 +1 @@
1
- export declare const VERSION = "4.0.240";
1
+ export declare const VERSION = "4.0.242";
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.240';
5
+ exports.VERSION = '4.0.242';