@remotion/media-parser 4.0.251 → 4.0.253

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 (148) hide show
  1. package/dist/aac-codecprivate.d.ts +2 -1
  2. package/dist/aac-codecprivate.js +28 -7
  3. package/dist/abort.d.ts +1 -0
  4. package/dist/abort.js +7 -0
  5. package/dist/buffer-iterator.d.ts +5 -1
  6. package/dist/buffer-iterator.js +5 -5
  7. package/dist/containers/aac/parse-aac.js +3 -2
  8. package/dist/containers/flac/get-channel-count.d.ts +1 -1
  9. package/dist/containers/flac/get-duration-from-flac.js +1 -4
  10. package/dist/containers/flac/get-sample-rate.js +1 -1
  11. package/dist/containers/flac/parse-flac-frame.js +3 -9
  12. package/dist/containers/flac/parse-flac.js +2 -7
  13. package/dist/containers/flac/parse-header.js +2 -2
  14. package/dist/containers/flac/parse-metadata.js +2 -2
  15. package/dist/containers/flac/parse-streaminfo.js +3 -3
  16. package/dist/containers/flac/parse-unknown-block.js +2 -2
  17. package/dist/containers/iso-base-media/base-media-box.d.ts +1 -4
  18. package/dist/containers/iso-base-media/get-actual-number-of-channels.js +1 -1
  19. package/dist/containers/iso-base-media/get-children.js +2 -2
  20. package/dist/containers/iso-base-media/get-keyframes.d.ts +2 -2
  21. package/dist/containers/iso-base-media/get-keyframes.js +8 -4
  22. package/dist/containers/iso-base-media/get-moov-atom.d.ts +6 -0
  23. package/dist/containers/iso-base-media/get-moov-atom.js +73 -0
  24. package/dist/containers/iso-base-media/get-sample-positions-from-track.d.ts +4 -1
  25. package/dist/containers/iso-base-media/get-sample-positions-from-track.js +7 -3
  26. package/dist/containers/iso-base-media/get-video-codec-from-iso-track.js +1 -1
  27. package/dist/containers/iso-base-media/mdat/mdat.d.ts +2 -1
  28. package/dist/containers/iso-base-media/mdat/mdat.js +16 -11
  29. package/dist/containers/iso-base-media/parse-boxes.js +4 -26
  30. package/dist/containers/iso-base-media/process-box.js +50 -163
  31. package/dist/containers/iso-base-media/stsd/samples.js +1 -0
  32. package/dist/containers/iso-base-media/traversal.d.ts +3 -2
  33. package/dist/containers/iso-base-media/traversal.js +11 -10
  34. package/dist/containers/mp3/get-duration.js +0 -3
  35. package/dist/containers/mp3/id3.js +1 -1
  36. package/dist/containers/mp3/parse-mp3.js +4 -12
  37. package/dist/containers/mp3/parse-mpeg-header.js +1 -1
  38. package/dist/containers/riff/expect-riff-box.d.ts +1 -2
  39. package/dist/containers/riff/expect-riff-box.js +4 -14
  40. package/dist/containers/riff/get-tracks-from-avi.js +1 -1
  41. package/dist/containers/riff/parse-list-box.js +3 -5
  42. package/dist/containers/riff/parse-movi.d.ts +2 -4
  43. package/dist/containers/riff/parse-movi.js +9 -27
  44. package/dist/containers/riff/parse-riff-body.js +17 -11
  45. package/dist/containers/riff/parse-riff-header.js +2 -7
  46. package/dist/containers/riff/parse-video-section.d.ts +1 -1
  47. package/dist/containers/riff/parse-video-section.js +5 -7
  48. package/dist/containers/transport-stream/adts-header.js +1 -0
  49. package/dist/containers/transport-stream/get-tracks.js +1 -1
  50. package/dist/containers/transport-stream/parse-packet.js +1 -1
  51. package/dist/containers/transport-stream/parse-transport-stream.js +3 -10
  52. package/dist/containers/transport-stream/process-stream-buffers.js +1 -1
  53. package/dist/containers/wav/get-duration-from-wav.js +1 -4
  54. package/dist/containers/wav/parse-data.js +6 -6
  55. package/dist/containers/wav/parse-fmt.js +2 -2
  56. package/dist/containers/wav/parse-header.js +2 -2
  57. package/dist/containers/wav/parse-id3.js +2 -4
  58. package/dist/containers/wav/parse-list.js +2 -2
  59. package/dist/containers/wav/parse-video-section.js +2 -5
  60. package/dist/containers/webm/av1-codec-private.js +1 -1
  61. package/dist/containers/webm/parse-ebml.js +1 -1
  62. package/dist/containers/webm/parse-webm-header.js +3 -10
  63. package/dist/controller.d.ts +17 -0
  64. package/dist/controller.js +31 -0
  65. package/dist/download-and-parse-media.d.ts +2 -0
  66. package/dist/download-and-parse-media.js +72 -0
  67. package/dist/emit-available-info.d.ts +2 -3
  68. package/dist/emit-available-info.js +36 -36
  69. package/dist/emitter.d.ts +20 -0
  70. package/dist/emitter.js +29 -0
  71. package/dist/errors.d.ts +4 -0
  72. package/dist/errors.js +13 -1
  73. package/dist/esm/from-fetch.mjs +134 -8
  74. package/dist/esm/from-node.mjs +8 -8
  75. package/dist/esm/from-web-file.mjs +14 -14
  76. package/dist/esm/index.mjs +3051 -2836
  77. package/dist/esm/node.mjs +113 -0
  78. package/dist/get-audio-codec.js +3 -0
  79. package/dist/get-dimensions.js +2 -2
  80. package/dist/get-duration.js +8 -8
  81. package/dist/get-fps.d.ts +4 -4
  82. package/dist/get-fps.js +16 -11
  83. package/dist/get-keyframes.d.ts +1 -2
  84. package/dist/get-keyframes.js +4 -3
  85. package/dist/get-location.d.ts +2 -2
  86. package/dist/get-location.js +2 -2
  87. package/dist/get-tracks.d.ts +3 -5
  88. package/dist/get-tracks.js +8 -14
  89. package/dist/has-all-info.js +3 -3
  90. package/dist/index.d.ts +132 -104
  91. package/dist/index.js +9 -1
  92. package/dist/init-video.d.ts +1 -1
  93. package/dist/init-video.js +8 -8
  94. package/dist/internal-parse-media.d.ts +2 -0
  95. package/dist/internal-parse-media.js +231 -0
  96. package/dist/make-hvc1-codec-strings.js +4 -4
  97. package/dist/media-parser-controller.d.ts +17 -0
  98. package/dist/media-parser-controller.js +31 -0
  99. package/dist/metadata/get-metadata.d.ts +2 -1
  100. package/dist/metadata/get-metadata.js +3 -2
  101. package/dist/metadata/metadata-from-iso.d.ts +2 -2
  102. package/dist/metadata/metadata-from-iso.js +2 -2
  103. package/dist/options.d.ts +60 -34
  104. package/dist/parse-and-download-media.d.ts +2 -0
  105. package/dist/parse-and-download-media.js +57 -0
  106. package/dist/parse-media.js +8 -202
  107. package/dist/parse-result.d.ts +2 -6
  108. package/dist/pause-signal.d.ts +11 -0
  109. package/dist/pause-signal.js +38 -0
  110. package/dist/perform-seek.d.ts +5 -8
  111. package/dist/perform-seek.js +17 -9
  112. package/dist/readers/from-fetch.js +11 -8
  113. package/dist/readers/from-node.js +8 -8
  114. package/dist/readers/from-web-file.js +16 -16
  115. package/dist/readers/reader.d.ts +8 -2
  116. package/dist/register-track.js +5 -0
  117. package/dist/remotion-license-acknowledge.d.ts +6 -0
  118. package/dist/remotion-license-acknowledge.js +17 -0
  119. package/dist/run-parse-iteration.d.ts +1 -1
  120. package/dist/run-parse-iteration.js +2 -2
  121. package/dist/skip.d.ts +5 -0
  122. package/dist/skip.js +8 -0
  123. package/dist/state/has-tracks-section.d.ts +3 -1
  124. package/dist/state/has-tracks-section.js +7 -1
  125. package/dist/state/iso-base-media/cached-sample-positions.d.ts +2 -2
  126. package/dist/state/iso-base-media/cached-sample-positions.js +12 -6
  127. package/dist/state/iso-base-media/iso-state.d.ts +6 -4
  128. package/dist/state/iso-base-media/iso-state.js +2 -5
  129. package/dist/state/iso-base-media/moov-box.d.ts +5 -0
  130. package/dist/state/iso-base-media/moov-box.js +13 -0
  131. package/dist/state/last-eventloop-break.d.ts +4 -0
  132. package/dist/state/last-eventloop-break.js +18 -0
  133. package/dist/state/parser-state.d.ts +124 -102
  134. package/dist/state/parser-state.js +22 -4
  135. package/dist/state/sample-callbacks.d.ts +5 -3
  136. package/dist/state/sample-callbacks.js +3 -3
  137. package/dist/state/structure.d.ts +7 -0
  138. package/dist/state/structure.js +56 -6
  139. package/dist/throttled-progress.d.ts +3 -2
  140. package/dist/throttled-progress.js +3 -3
  141. package/dist/version.d.ts +1 -1
  142. package/dist/version.js +1 -1
  143. package/dist/writers/node.d.ts +4 -0
  144. package/dist/writers/node.js +81 -0
  145. package/dist/writers/writer.d.ts +17 -0
  146. package/dist/writers/writer.js +2 -0
  147. package/package.json +12 -9
  148. package/LICENSE.md +0 -49
@@ -1,7 +1,9 @@
1
- import type { BufferIterator } from '../buffer-iterator';
1
+ import { type BufferIterator } from '../buffer-iterator';
2
2
  import type { AvcPPs, AvcProfileInfo } from '../containers/avc/parse-avc';
3
- import type { LogLevel } from '../log';
4
- import type { Options, ParseMediaFields } from '../options';
3
+ import { type LogLevel } from '../log';
4
+ import type { MediaParserController } from '../media-parser-controller';
5
+ import type { OnDiscardedData, Options, ParseMediaFields, ParseMediaMode, ParseMediaSrc } from '../options';
6
+ import type { ReaderInterface } from '../readers/reader';
5
7
  import type { OnAudioTrack, OnVideoTrack } from '../webcodec-sample-types';
6
8
  export type InternalStats = {
7
9
  skippedBytes: number;
@@ -11,112 +13,22 @@ export type SpsAndPps = {
11
13
  sps: AvcProfileInfo;
12
14
  pps: AvcPPs;
13
15
  };
14
- export declare const makeParserState: ({ hasAudioTrackHandlers, hasVideoTrackHandlers, signal, iterator, fields, onAudioTrack, onVideoTrack, supportsContentRange, contentLength, logLevel, }: {
16
+ export declare const makeParserState: ({ hasAudioTrackHandlers, hasVideoTrackHandlers, controller, fields, onAudioTrack, onVideoTrack, contentLength, logLevel, mode, src, readerInterface, onDiscardedData, }: {
15
17
  hasAudioTrackHandlers: boolean;
16
18
  hasVideoTrackHandlers: boolean;
17
- signal: AbortSignal | undefined;
18
- iterator: BufferIterator;
19
+ controller: MediaParserController;
19
20
  fields: Options<ParseMediaFields>;
20
- supportsContentRange: boolean;
21
21
  onAudioTrack: OnAudioTrack | null;
22
22
  onVideoTrack: OnVideoTrack | null;
23
- contentLength: number | null;
23
+ contentLength: number;
24
24
  logLevel: LogLevel;
25
+ mode: ParseMediaMode;
26
+ src: ParseMediaSrc;
27
+ readerInterface: ReaderInterface;
28
+ onDiscardedData: OnDiscardedData | null;
25
29
  }) => {
26
- riff: {
27
- getAvcProfile: () => SpsAndPps | null;
28
- onProfile: (profile: SpsAndPps) => Promise<void>;
29
- registerOnAvcProfileCallback: (callback: (profile: SpsAndPps) => Promise<void>) => void;
30
- getNextTrackIndex: () => number;
31
- incrementNextTrackIndex: () => void;
32
- };
33
- transportStream: {
34
- nextPesHeaderStore: {
35
- setNextPesHeader: (pesHeader: import("../containers/transport-stream/parse-pes").PacketPes) => void;
36
- getNextPesHeader: () => import("../containers/transport-stream/parse-pes").PacketPes;
37
- };
38
- streamBuffers: Map<number, import("../containers/transport-stream/process-stream-buffers").TransportStreamPacketBuffer>;
39
- };
40
- webm: {
41
- onTrackEntrySegment: import("../containers/webm/segments").OnTrackEntrySegment;
42
- getTrackInfoByNumber: (id: number) => import("../containers/webm/segments/track-entry").TrackInfo;
43
- setTimestampOffset: (byteOffset: number, timestamp: number) => void;
44
- getTimestampOffsetForByteOffset: (byteOffset: number) => number | undefined;
45
- timescale: null;
46
- getTimescale: () => number;
47
- setTimescale: (newTimescale: number) => void;
48
- addSegment: (seg: Omit<import("./webm").SegmentSection, "index">) => void;
49
- addCluster: (cluster: import("./webm").ClusterSection) => void;
50
- isInsideSegment: (iterator: BufferIterator) => import("./webm").SegmentSection | null;
51
- isInsideCluster: (iterator: BufferIterator) => import("./webm").ClusterSection | null;
52
- };
53
- iso: {
54
- getShouldReturnToVideoSectionAfterEnd: () => boolean;
55
- setShouldReturnToVideoSectionAfterEnd: (value: boolean) => void;
56
- flatSamples: {
57
- getSamples: () => import("./iso-base-media/cached-sample-positions").FlatSample[] | null;
58
- setSamples: (samples: import("./iso-base-media/cached-sample-positions").FlatSample[]) => void;
59
- };
60
- };
61
- mp3Info: {
62
- getMp3Info: () => import("./mp3").Mp3Info | null;
63
- setMp3Info: (info: import("./mp3").Mp3Info) => void;
64
- };
65
- aac: {
66
- addSample: ({ offset, size }: {
67
- offset: number;
68
- size: number;
69
- }) => {
70
- offset: number;
71
- index: number;
72
- size: number;
73
- };
74
- getSamples: () => {
75
- offset: number;
76
- index: number;
77
- size: number;
78
- }[];
79
- };
80
- flac: {
81
- setBlockingBitStrategy: (strategy: number) => void;
82
- getBlockingBitStrategy: () => number | undefined;
83
- };
84
- callbacks: {
85
- registerVideoSampleCallback: (id: number, callback: import("../webcodec-sample-types").OnVideoSample | null) => Promise<void>;
86
- onAudioSample: (trackId: number, audioSample: import("../webcodec-sample-types").AudioOrVideoSample) => Promise<void>;
87
- getSamplesForTrack: (trackId: number) => number;
88
- onVideoSample: (trackId: number, videoSample: import("../webcodec-sample-types").AudioOrVideoSample) => Promise<void>;
89
- canSkipTracksState: {
90
- canSkipTracks: () => boolean;
91
- };
92
- registerAudioSampleCallback: (id: number, callback: import("../webcodec-sample-types").OnAudioSample | null) => Promise<void>;
93
- tracks: {
94
- hasAllTracks: () => boolean;
95
- setIsDone: () => void;
96
- addTrack: (track: import("..").Track) => void;
97
- getTracks: () => import("..").Track[];
98
- ensureHasTracksAtEnd: (fields: Options<ParseMediaFields>) => void;
99
- };
100
- audioSampleCallbacks: Record<number, import("../webcodec-sample-types").OnAudioSample>;
101
- videoSampleCallbacks: Record<number, import("../webcodec-sample-types").OnVideoSample>;
102
- hasAudioTrackHandlers: boolean;
103
- hasVideoTrackHandlers: boolean;
104
- };
105
- getInternalStats: () => InternalStats;
106
- getSkipBytes: () => number;
107
- increaseSkippedBytes: (bytes: number) => void;
108
- keyframes: {
109
- addKeyframe: (keyframe: import("../options").MediaParserKeyframe) => void;
110
- getKeyframes: () => import("../options").MediaParserKeyframe[];
111
- };
112
- structure: {
113
- getStructureOrNull: () => import("../parse-result").Structure | null;
114
- getStructure: () => import("../parse-result").Structure;
115
- setStructure: (value: import("../parse-result").Structure) => void;
116
- };
117
30
  onAudioTrack: OnAudioTrack | null;
118
31
  onVideoTrack: OnVideoTrack | null;
119
- supportsContentRange: boolean;
120
32
  emittedFields: import("../options").AllOptions<ParseMediaFields>;
121
33
  fields: Partial<import("../options").AllOptions<ParseMediaFields>>;
122
34
  slowDurationAndFps: {
@@ -128,7 +40,7 @@ export declare const makeParserState: ({ hasAudioTrackHandlers, hasVideoTrackHan
128
40
  getAudioBitrate: () => number | null;
129
41
  getVideoBitrate: () => number | null;
130
42
  };
131
- contentLength: number | null;
43
+ contentLength: number;
132
44
  images: {
133
45
  images: import("./images").MediaParserEmbeddedImage[];
134
46
  addImage: (image: import("./images").MediaParserEmbeddedImage) => void;
@@ -156,7 +68,10 @@ export declare const makeParserState: ({ hasAudioTrackHandlers, hasVideoTrackHan
156
68
  getBits: (bits: number) => number;
157
69
  bytesRemaining: () => number;
158
70
  leb128: () => number;
159
- removeBytesRead: (force: boolean) => number | undefined;
71
+ removeBytesRead: (force: boolean, mode: ParseMediaMode) => {
72
+ bytesRemoved: number;
73
+ removedData: Uint8Array | null;
74
+ };
160
75
  discard: (length: number) => void;
161
76
  getEightByteNumber: (littleEndian?: boolean) => number;
162
77
  getFourByteNumber: () => number;
@@ -203,5 +118,112 @@ export declare const makeParserState: ({ hasAudioTrackHandlers, hasVideoTrackHan
203
118
  };
204
119
  getFlacCodecNumber: () => number;
205
120
  };
121
+ controller: MediaParserController;
122
+ mode: ParseMediaMode;
123
+ eventLoop: {
124
+ eventLoopBreakIfNeeded: () => Promise<void>;
125
+ };
126
+ src: ParseMediaSrc;
127
+ readerInterface: ReaderInterface;
128
+ discardReadBytes: (force: boolean) => Promise<void>;
129
+ getStructureOrNull: () => import("../parse-result").Structure | null;
130
+ getStructure: () => import("../parse-result").Structure;
131
+ setStructure: (value: import("../parse-result").Structure) => void;
132
+ getFlacStructure: () => import("../containers/flac/types").FlacStructure;
133
+ getIsoStructure: () => import("../parse-result").IsoBaseMediaStructure;
134
+ getMp3Structure: () => import("../parse-result").Mp3Structure;
135
+ getRiffStructure: () => import("../containers/riff/riff-box").RiffStructure;
136
+ getTsStructure: () => import("../parse-result").TransportStreamStructure;
137
+ getWavStructure: () => import("../containers/wav/types").WavStructure;
138
+ getMatroskaStructure: () => import("../parse-result").MatroskaStructure;
139
+ riff: {
140
+ getAvcProfile: () => SpsAndPps | null;
141
+ onProfile: (profile: SpsAndPps) => Promise<void>;
142
+ registerOnAvcProfileCallback: (callback: (profile: SpsAndPps) => Promise<void>) => void;
143
+ getNextTrackIndex: () => number;
144
+ incrementNextTrackIndex: () => void;
145
+ };
146
+ transportStream: {
147
+ nextPesHeaderStore: {
148
+ setNextPesHeader: (pesHeader: import("../containers/transport-stream/parse-pes").PacketPes) => void;
149
+ getNextPesHeader: () => import("../containers/transport-stream/parse-pes").PacketPes;
150
+ };
151
+ streamBuffers: Map<number, import("../containers/transport-stream/process-stream-buffers").TransportStreamPacketBuffer>;
152
+ };
153
+ webm: {
154
+ onTrackEntrySegment: import("../containers/webm/segments").OnTrackEntrySegment;
155
+ getTrackInfoByNumber: (id: number) => import("../containers/webm/segments/track-entry").TrackInfo;
156
+ setTimestampOffset: (byteOffset: number, timestamp: number) => void;
157
+ getTimestampOffsetForByteOffset: (byteOffset: number) => number | undefined;
158
+ timescale: null;
159
+ getTimescale: () => number;
160
+ setTimescale: (newTimescale: number) => void;
161
+ addSegment: (seg: Omit<import("./webm").SegmentSection, "index">) => void;
162
+ addCluster: (cluster: import("./webm").ClusterSection) => void;
163
+ isInsideSegment: (iterator: BufferIterator) => import("./webm").SegmentSection | null;
164
+ isInsideCluster: (iterator: BufferIterator) => import("./webm").ClusterSection | null;
165
+ };
166
+ iso: {
167
+ flatSamples: {
168
+ getSamples: (mdatStart: number) => import("./iso-base-media/cached-sample-positions").FlatSample[] | null;
169
+ setSamples: (mdatStart: number, samples: import("./iso-base-media/cached-sample-positions").FlatSample[]) => void;
170
+ };
171
+ moov: {
172
+ setMoovBox: (moov: import("../containers/iso-base-media/moov/moov").MoovBox) => void;
173
+ getMoovBox: () => import("../containers/iso-base-media/moov/moov").MoovBox | null;
174
+ };
175
+ };
176
+ mp3Info: {
177
+ getMp3Info: () => import("./mp3").Mp3Info | null;
178
+ setMp3Info: (info: import("./mp3").Mp3Info) => void;
179
+ };
180
+ aac: {
181
+ addSample: ({ offset, size }: {
182
+ offset: number;
183
+ size: number;
184
+ }) => {
185
+ offset: number;
186
+ index: number;
187
+ size: number;
188
+ };
189
+ getSamples: () => {
190
+ offset: number;
191
+ index: number;
192
+ size: number;
193
+ }[];
194
+ };
195
+ flac: {
196
+ setBlockingBitStrategy: (strategy: number) => void;
197
+ getBlockingBitStrategy: () => number | undefined;
198
+ };
199
+ callbacks: {
200
+ registerVideoSampleCallback: (id: number, callback: import("../webcodec-sample-types").OnVideoSample | null) => Promise<void>;
201
+ onAudioSample: (trackId: number, audioSample: import("../webcodec-sample-types").AudioOrVideoSample) => Promise<void>;
202
+ getSamplesForTrack: (trackId: number) => number;
203
+ onVideoSample: (trackId: number, videoSample: import("../webcodec-sample-types").AudioOrVideoSample) => Promise<void>;
204
+ canSkipTracksState: {
205
+ canSkipTracks: () => boolean;
206
+ };
207
+ registerAudioSampleCallback: (id: number, callback: import("../webcodec-sample-types").OnAudioSample | null) => Promise<void>;
208
+ tracks: {
209
+ hasAllTracks: () => boolean;
210
+ getIsDone: () => boolean;
211
+ setIsDone: (logLevel: LogLevel) => void;
212
+ addTrack: (track: import("..").Track) => void;
213
+ getTracks: () => import("..").Track[];
214
+ ensureHasTracksAtEnd: (fields: Options<ParseMediaFields>) => void;
215
+ };
216
+ audioSampleCallbacks: Record<number, import("../webcodec-sample-types").OnAudioSample>;
217
+ videoSampleCallbacks: Record<number, import("../webcodec-sample-types").OnVideoSample>;
218
+ hasAudioTrackHandlers: boolean;
219
+ hasVideoTrackHandlers: boolean;
220
+ };
221
+ getInternalStats: () => InternalStats;
222
+ getSkipBytes: () => number;
223
+ increaseSkippedBytes: (bytes: number) => void;
224
+ keyframes: {
225
+ addKeyframe: (keyframe: import("../options").MediaParserKeyframe) => void;
226
+ getKeyframes: () => import("../options").MediaParserKeyframe[];
227
+ };
206
228
  };
207
229
  export type ParserState = ReturnType<typeof makeParserState>;
@@ -1,12 +1,15 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.makeParserState = void 0;
4
+ const buffer_iterator_1 = require("../buffer-iterator");
5
+ const log_1 = require("../log");
4
6
  const aac_state_1 = require("./aac-state");
5
7
  const emitted_fields_1 = require("./emitted-fields");
6
8
  const flac_state_1 = require("./flac-state");
7
9
  const images_1 = require("./images");
8
10
  const iso_state_1 = require("./iso-base-media/iso-state");
9
11
  const keyframes_1 = require("./keyframes");
12
+ const last_eventloop_break_1 = require("./last-eventloop-break");
10
13
  const mp3_1 = require("./mp3");
11
14
  const riff_1 = require("./riff");
12
15
  const sample_callbacks_1 = require("./sample-callbacks");
@@ -15,8 +18,9 @@ const structure_1 = require("./structure");
15
18
  const transport_stream_1 = require("./transport-stream");
16
19
  const video_section_1 = require("./video-section");
17
20
  const webm_1 = require("./webm");
18
- const makeParserState = ({ hasAudioTrackHandlers, hasVideoTrackHandlers, signal, iterator, fields, onAudioTrack, onVideoTrack, supportsContentRange, contentLength, logLevel, }) => {
21
+ const makeParserState = ({ hasAudioTrackHandlers, hasVideoTrackHandlers, controller, fields, onAudioTrack, onVideoTrack, contentLength, logLevel, mode, src, readerInterface, onDiscardedData, }) => {
19
22
  let skippedBytes = 0;
23
+ const iterator = (0, buffer_iterator_1.getArrayBufferIterator)(new Uint8Array([]), contentLength);
20
24
  const increaseSkippedBytes = (bytes) => {
21
25
  skippedBytes += bytes;
22
26
  };
@@ -26,6 +30,15 @@ const makeParserState = ({ hasAudioTrackHandlers, hasVideoTrackHandlers, signal,
26
30
  const slowDurationAndFps = (0, slow_duration_fps_1.slowDurationAndFpsState)();
27
31
  const mp3Info = (0, mp3_1.makeMp3State)();
28
32
  const images = (0, images_1.imagesState)();
33
+ const discardReadBytes = async (force) => {
34
+ const { bytesRemoved, removedData } = iterator.removeBytesRead(force, mode);
35
+ if (bytesRemoved) {
36
+ log_1.Log.verbose(logLevel, `Freed ${bytesRemoved} bytes`);
37
+ }
38
+ if (removedData && onDiscardedData) {
39
+ await onDiscardedData(removedData);
40
+ }
41
+ };
29
42
  return {
30
43
  riff: (0, riff_1.riffSpecificState)(),
31
44
  transportStream: (0, transport_stream_1.transportStreamState)(),
@@ -35,7 +48,7 @@ const makeParserState = ({ hasAudioTrackHandlers, hasVideoTrackHandlers, signal,
35
48
  aac: (0, aac_state_1.aacState)(),
36
49
  flac: (0, flac_state_1.flacState)(),
37
50
  callbacks: (0, sample_callbacks_1.sampleCallback)({
38
- signal,
51
+ controller,
39
52
  hasAudioTrackHandlers,
40
53
  hasVideoTrackHandlers,
41
54
  fields,
@@ -54,10 +67,9 @@ const makeParserState = ({ hasAudioTrackHandlers, hasVideoTrackHandlers, signal,
54
67
  getSkipBytes: () => skippedBytes,
55
68
  increaseSkippedBytes,
56
69
  keyframes,
57
- structure,
70
+ ...structure,
58
71
  onAudioTrack,
59
72
  onVideoTrack,
60
- supportsContentRange,
61
73
  emittedFields,
62
74
  fields,
63
75
  slowDurationAndFps,
@@ -66,6 +78,12 @@ const makeParserState = ({ hasAudioTrackHandlers, hasVideoTrackHandlers, signal,
66
78
  videoSection: (0, video_section_1.videoSectionState)(),
67
79
  logLevel,
68
80
  iterator,
81
+ controller,
82
+ mode,
83
+ eventLoop: (0, last_eventloop_break_1.eventLoopState)(logLevel),
84
+ src,
85
+ readerInterface,
86
+ discardReadBytes,
69
87
  };
70
88
  };
71
89
  exports.makeParserState = makeParserState;
@@ -1,10 +1,11 @@
1
+ import type { MediaParserController } from '../media-parser-controller';
1
2
  import type { AllOptions, Options, ParseMediaFields } from '../options';
2
3
  import type { AudioOrVideoSample, OnAudioSample, OnVideoSample } from '../webcodec-sample-types';
3
4
  import { type KeyframesState } from './keyframes';
4
5
  import type { SlowDurationAndFpsState } from './slow-duration-fps';
5
6
  import type { StructureState } from './structure';
6
- export declare const sampleCallback: ({ signal, hasAudioTrackHandlers, hasVideoTrackHandlers, fields, keyframes, emittedFields, slowDurationAndFpsState, structure, }: {
7
- signal: AbortSignal | undefined;
7
+ export declare const sampleCallback: ({ controller, hasAudioTrackHandlers, hasVideoTrackHandlers, fields, keyframes, emittedFields, slowDurationAndFpsState, structure, }: {
8
+ controller: MediaParserController;
8
9
  hasAudioTrackHandlers: boolean;
9
10
  hasVideoTrackHandlers: boolean;
10
11
  fields: Options<ParseMediaFields>;
@@ -23,7 +24,8 @@ export declare const sampleCallback: ({ signal, hasAudioTrackHandlers, hasVideoT
23
24
  registerAudioSampleCallback: (id: number, callback: OnAudioSample | null) => Promise<void>;
24
25
  tracks: {
25
26
  hasAllTracks: () => boolean;
26
- setIsDone: () => void;
27
+ getIsDone: () => boolean;
28
+ setIsDone: (logLevel: import("..").LogLevel) => void;
27
29
  addTrack: (track: import("..").Track) => void;
28
30
  getTracks: () => import("..").Track[];
29
31
  ensureHasTracksAtEnd: (fields: Options<ParseMediaFields>) => void;
@@ -4,7 +4,7 @@ exports.sampleCallback = void 0;
4
4
  const can_skip_tracks_1 = require("./can-skip-tracks");
5
5
  const has_tracks_section_1 = require("./has-tracks-section");
6
6
  const need_samples_for_fields_1 = require("./need-samples-for-fields");
7
- const sampleCallback = ({ signal, hasAudioTrackHandlers, hasVideoTrackHandlers, fields, keyframes, emittedFields, slowDurationAndFpsState, structure, }) => {
7
+ const sampleCallback = ({ controller, hasAudioTrackHandlers, hasVideoTrackHandlers, fields, keyframes, emittedFields, slowDurationAndFpsState, structure, }) => {
8
8
  const videoSampleCallbacks = {};
9
9
  const audioSampleCallbacks = {};
10
10
  const queuedAudioSamples = {};
@@ -31,7 +31,7 @@ const sampleCallback = ({ signal, hasAudioTrackHandlers, hasVideoTrackHandlers,
31
31
  queuedVideoSamples[id] = [];
32
32
  },
33
33
  onAudioSample: async (trackId, audioSample) => {
34
- if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
34
+ if (controller._internals.signal.aborted) {
35
35
  throw new Error('Aborted');
36
36
  }
37
37
  if (typeof samplesForTrack[trackId] === 'undefined') {
@@ -54,7 +54,7 @@ const sampleCallback = ({ signal, hasAudioTrackHandlers, hasVideoTrackHandlers,
54
54
  return (_a = samplesForTrack[trackId]) !== null && _a !== void 0 ? _a : 0;
55
55
  },
56
56
  onVideoSample: async (trackId, videoSample) => {
57
- if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
57
+ if (controller._internals.signal.aborted) {
58
58
  throw new Error('Aborted');
59
59
  }
60
60
  if (typeof samplesForTrack[trackId] === 'undefined') {
@@ -3,5 +3,12 @@ export declare const structureState: () => {
3
3
  getStructureOrNull: () => Structure | null;
4
4
  getStructure: () => Structure;
5
5
  setStructure: (value: Structure) => void;
6
+ getFlacStructure: () => import("../containers/flac/types").FlacStructure;
7
+ getIsoStructure: () => import("../parse-result").IsoBaseMediaStructure;
8
+ getMp3Structure: () => import("../parse-result").Mp3Structure;
9
+ getRiffStructure: () => import("../containers/riff/riff-box").RiffStructure;
10
+ getTsStructure: () => import("../parse-result").TransportStreamStructure;
11
+ getWavStructure: () => import("../containers/wav/types").WavStructure;
12
+ getMatroskaStructure: () => import("../parse-result").MatroskaStructure;
6
13
  };
7
14
  export type StructureState = ReturnType<typeof structureState>;
@@ -3,19 +3,69 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.structureState = void 0;
4
4
  const structureState = () => {
5
5
  let structure = null;
6
+ const getStructure = () => {
7
+ if (structure === null) {
8
+ throw new Error('Expected structure');
9
+ }
10
+ return structure;
11
+ };
6
12
  return {
7
13
  getStructureOrNull: () => {
8
14
  return structure;
9
15
  },
10
- getStructure: () => {
11
- if (structure === null) {
12
- throw new Error('Expected structure');
13
- }
14
- return structure;
15
- },
16
+ getStructure,
16
17
  setStructure: (value) => {
17
18
  structure = value;
18
19
  },
20
+ getFlacStructure: () => {
21
+ const struc = getStructure();
22
+ if (struc.type !== 'flac') {
23
+ throw new Error('Invalid structure type');
24
+ }
25
+ return struc;
26
+ },
27
+ getIsoStructure: () => {
28
+ const struc = getStructure();
29
+ if (struc.type !== 'iso-base-media') {
30
+ throw new Error('Invalid structure type');
31
+ }
32
+ return struc;
33
+ },
34
+ getMp3Structure: () => {
35
+ const struc = getStructure();
36
+ if (struc.type !== 'mp3') {
37
+ throw new Error('Invalid structure type');
38
+ }
39
+ return struc;
40
+ },
41
+ getRiffStructure: () => {
42
+ const struc = getStructure();
43
+ if (struc.type !== 'riff') {
44
+ throw new Error('Invalid structure type');
45
+ }
46
+ return struc;
47
+ },
48
+ getTsStructure: () => {
49
+ const struc = getStructure();
50
+ if (struc.type !== 'transport-stream') {
51
+ throw new Error('Invalid structure type');
52
+ }
53
+ return struc;
54
+ },
55
+ getWavStructure: () => {
56
+ const struc = getStructure();
57
+ if (struc.type !== 'wav') {
58
+ throw new Error('Invalid structure type');
59
+ }
60
+ return struc;
61
+ },
62
+ getMatroskaStructure: () => {
63
+ const struc = getStructure();
64
+ if (struc.type !== 'matroska') {
65
+ throw new Error('Invalid structure type');
66
+ }
67
+ return struc;
68
+ },
19
69
  };
20
70
  };
21
71
  exports.structureState = structureState;
@@ -1,3 +1,4 @@
1
+ import type { MediaParserController } from './media-parser-controller';
1
2
  import type { ParseMediaOnProgress, ParseMediaProgress } from './options';
2
3
  type ReturnType = {
3
4
  get: () => ParseMediaProgress;
@@ -5,10 +6,10 @@ type ReturnType = {
5
6
  stopAndGetLastProgress: () => void;
6
7
  };
7
8
  export type ParseMediaProgressFn = (state: (prevState: ParseMediaProgress) => ParseMediaProgress) => void;
8
- export declare const throttledStateUpdate: ({ updateFn, everyMilliseconds, signal, }: {
9
+ export declare const throttledStateUpdate: ({ updateFn, everyMilliseconds, controller, }: {
9
10
  updateFn: ParseMediaOnProgress | null;
10
11
  everyMilliseconds: number;
11
- signal: AbortSignal | undefined;
12
+ controller: MediaParserController;
12
13
  totalBytes: number | null;
13
14
  }) => ReturnType;
14
15
  export {};
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.throttledStateUpdate = void 0;
4
- const throttledStateUpdate = ({ updateFn, everyMilliseconds, signal, }) => {
4
+ const throttledStateUpdate = ({ updateFn, everyMilliseconds, controller, }) => {
5
5
  let currentState = {
6
6
  bytes: 0,
7
7
  percentage: null,
@@ -28,7 +28,7 @@ const throttledStateUpdate = ({ updateFn, everyMilliseconds, signal, }) => {
28
28
  const onAbort = () => {
29
29
  clearInterval(interval);
30
30
  };
31
- signal === null || signal === void 0 ? void 0 : signal.addEventListener('abort', onAbort, { once: true });
31
+ controller._internals.signal.addEventListener('abort', onAbort, { once: true });
32
32
  return {
33
33
  get: () => currentState,
34
34
  update: (fn) => {
@@ -36,7 +36,7 @@ const throttledStateUpdate = ({ updateFn, everyMilliseconds, signal, }) => {
36
36
  },
37
37
  stopAndGetLastProgress: () => {
38
38
  clearInterval(interval);
39
- signal === null || signal === void 0 ? void 0 : signal.removeEventListener('abort', onAbort);
39
+ controller._internals.signal.removeEventListener('abort', onAbort);
40
40
  return currentState;
41
41
  },
42
42
  };
package/dist/version.d.ts CHANGED
@@ -1 +1 @@
1
- export declare const VERSION = "4.0.251";
1
+ export declare const VERSION = "4.0.253";
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.251';
5
+ exports.VERSION = '4.0.253';
@@ -0,0 +1,4 @@
1
+ import type { CreateContent } from './writer';
2
+ export declare const nodeWriter: (path: string) => {
3
+ createContent: CreateContent;
4
+ };
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.nodeWriter = void 0;
7
+ const node_fs_1 = __importDefault(require("node:fs"));
8
+ const log_1 = require("../log");
9
+ const createContent = (filename) => {
10
+ return async ({ logLevel }) => {
11
+ let writPromise = Promise.resolve();
12
+ const remove = async () => {
13
+ log_1.Log.verbose(logLevel, 'Removing file', filename);
14
+ await node_fs_1.default.promises.unlink(filename).catch(() => { });
15
+ };
16
+ await remove();
17
+ if (!node_fs_1.default.existsSync(filename)) {
18
+ log_1.Log.verbose(logLevel, 'Creating file', filename);
19
+ node_fs_1.default.writeFileSync(filename, '');
20
+ }
21
+ const writeStream = node_fs_1.default.openSync(filename, 'w');
22
+ let written = 0;
23
+ const write = async (data) => {
24
+ await new Promise((resolve, reject) => {
25
+ node_fs_1.default.write(writeStream, data, 0, data.length, undefined, (err) => {
26
+ if (err) {
27
+ reject(err);
28
+ return;
29
+ }
30
+ log_1.Log.verbose(logLevel, 'Wrote', data.length, 'bytes to', filename);
31
+ resolve();
32
+ });
33
+ });
34
+ written += data.byteLength;
35
+ };
36
+ const updateDataAt = (position, data) => {
37
+ return new Promise((resolve, reject) => {
38
+ node_fs_1.default.write(writeStream, data, 0, data.length, position, (err) => {
39
+ if (err) {
40
+ reject(err);
41
+ return;
42
+ }
43
+ log_1.Log.verbose(logLevel, 'Wrote', data.length, 'bytes to', filename, 'at position', position);
44
+ resolve();
45
+ });
46
+ });
47
+ };
48
+ const writer = {
49
+ write: (arr) => {
50
+ writPromise = writPromise.then(() => write(arr));
51
+ return writPromise;
52
+ },
53
+ updateDataAt: (position, data) => {
54
+ writPromise = writPromise.then(() => updateDataAt(position, data));
55
+ return writPromise;
56
+ },
57
+ getWrittenByteCount: () => written,
58
+ remove,
59
+ finish: async () => {
60
+ await writPromise;
61
+ try {
62
+ log_1.Log.verbose(logLevel, 'Closing file', filename);
63
+ node_fs_1.default.closeSync(writeStream);
64
+ return Promise.resolve();
65
+ }
66
+ catch (e) {
67
+ return Promise.reject(e);
68
+ }
69
+ },
70
+ getBlob: async () => {
71
+ const file = await node_fs_1.default.promises.readFile(filename);
72
+ return new Blob([file]);
73
+ },
74
+ };
75
+ return writer;
76
+ };
77
+ };
78
+ const nodeWriter = (path) => {
79
+ return { createContent: createContent(path) };
80
+ };
81
+ exports.nodeWriter = nodeWriter;
@@ -0,0 +1,17 @@
1
+ import type { LogLevel } from '../log';
2
+ export type Writer = {
3
+ write: (arr: Uint8Array) => Promise<void>;
4
+ finish: () => Promise<void>;
5
+ getWrittenByteCount: () => number;
6
+ updateDataAt: (position: number, data: Uint8Array) => Promise<void>;
7
+ remove: () => Promise<void>;
8
+ getBlob: () => Promise<Blob>;
9
+ };
10
+ export type CreateContent = (options: {
11
+ filename: string;
12
+ mimeType: string;
13
+ logLevel: LogLevel;
14
+ }) => Promise<Writer>;
15
+ export type WriterInterface = {
16
+ createContent: CreateContent;
17
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });