@remotion/webcodecs 4.0.252 → 4.0.254

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.
@@ -1,5 +1,6 @@
1
1
  import type { AudioOrVideoSample, AudioTrack, LogLevel } from '@remotion/media-parser';
2
2
  import type { ProgressTracker } from './create/progress-tracker';
3
+ import type { WebCodecsController } from './webcodecs-controller';
3
4
  export type WebCodecsAudioDecoder = {
4
5
  processSample: (audioSample: AudioOrVideoSample) => Promise<void>;
5
6
  waitForFinish: () => Promise<void>;
@@ -9,10 +10,10 @@ export type WebCodecsAudioDecoder = {
9
10
  export type CreateAudioDecoderInit = {
10
11
  onFrame: (frame: AudioData) => Promise<void>;
11
12
  onError: (error: DOMException) => void;
12
- signal: AbortSignal;
13
+ controller: WebCodecsController;
13
14
  config: AudioDecoderConfig;
14
15
  logLevel: LogLevel;
15
16
  track: AudioTrack;
16
17
  progressTracker: ProgressTracker;
17
18
  };
18
- export declare const createAudioDecoder: ({ onFrame, onError, signal, config, logLevel, track, progressTracker, }: CreateAudioDecoderInit) => WebCodecsAudioDecoder;
19
+ export declare const createAudioDecoder: ({ onFrame, onError, controller, config, logLevel, track, progressTracker, }: CreateAudioDecoderInit) => WebCodecsAudioDecoder;
@@ -3,8 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createAudioDecoder = void 0;
4
4
  const get_wave_audio_decoder_1 = require("./get-wave-audio-decoder");
5
5
  const io_synchronizer_1 = require("./io-manager/io-synchronizer");
6
- const createAudioDecoder = ({ onFrame, onError, signal, config, logLevel, track, progressTracker, }) => {
7
- if (signal.aborted) {
6
+ const createAudioDecoder = ({ onFrame, onError, controller, config, logLevel, track, progressTracker, }) => {
7
+ if (controller._internals.signal.aborted) {
8
8
  throw new Error('Not creating audio decoder, already aborted');
9
9
  }
10
10
  if (config.codec === 'pcm-s16') {
@@ -23,17 +23,19 @@ const createAudioDecoder = ({ onFrame, onError, signal, config, logLevel, track,
23
23
  const abortHandler = () => {
24
24
  frame.close();
25
25
  };
26
- signal.addEventListener('abort', abortHandler, { once: true });
26
+ controller._internals.signal.addEventListener('abort', abortHandler, {
27
+ once: true,
28
+ });
27
29
  outputQueue = outputQueue
28
30
  .then(() => {
29
- if (signal.aborted) {
31
+ if (controller._internals.signal.aborted) {
30
32
  return;
31
33
  }
32
34
  return onFrame(frame);
33
35
  })
34
36
  .then(() => {
35
37
  ioSynchronizer.onProcessed();
36
- signal.removeEventListener('abort', abortHandler);
38
+ controller._internals.signal.removeEventListener('abort', abortHandler);
37
39
  return Promise.resolve();
38
40
  })
39
41
  .catch((err) => {
@@ -47,7 +49,7 @@ const createAudioDecoder = ({ onFrame, onError, signal, config, logLevel, track,
47
49
  });
48
50
  const close = () => {
49
51
  // eslint-disable-next-line @typescript-eslint/no-use-before-define
50
- signal.removeEventListener('abort', onAbort);
52
+ controller._internals.signal.removeEventListener('abort', onAbort);
51
53
  if (audioDecoder.state === 'closed') {
52
54
  return;
53
55
  }
@@ -56,7 +58,7 @@ const createAudioDecoder = ({ onFrame, onError, signal, config, logLevel, track,
56
58
  const onAbort = () => {
57
59
  close();
58
60
  };
59
- signal.addEventListener('abort', onAbort);
61
+ controller._internals.signal.addEventListener('abort', onAbort);
60
62
  audioDecoder.configure(config);
61
63
  const processSample = async (audioSample) => {
62
64
  var _a, _b;
@@ -68,7 +70,7 @@ const createAudioDecoder = ({ onFrame, onError, signal, config, logLevel, track,
68
70
  unemitted: 20,
69
71
  unprocessed: 20,
70
72
  minimumProgress: audioSample.timestamp - 10000000,
71
- signal,
73
+ controller,
72
74
  });
73
75
  // Don't flush, it messes up the audio
74
76
  const chunk = new EncodedAudioChunk(audioSample);
@@ -88,7 +90,7 @@ const createAudioDecoder = ({ onFrame, onError, signal, config, logLevel, track,
88
90
  }
89
91
  catch (_a) { }
90
92
  await queue;
91
- await ioSynchronizer.waitForFinish(signal);
93
+ await ioSynchronizer.waitForFinish(controller);
92
94
  await outputQueue;
93
95
  },
94
96
  close,
@@ -1,6 +1,7 @@
1
- import type { LogLevel } from '@remotion/media-parser';
1
+ import { type LogLevel } from '@remotion/media-parser';
2
2
  import type { ProgressTracker } from './create/progress-tracker';
3
3
  import type { ConvertMediaAudioCodec } from './get-available-audio-codecs';
4
+ import type { WebCodecsController } from './webcodecs-controller';
4
5
  export type WebCodecsAudioEncoder = {
5
6
  encodeFrame: (audioData: AudioData) => Promise<void>;
6
7
  waitForFinish: () => Promise<void>;
@@ -11,10 +12,10 @@ export type AudioEncoderInit = {
11
12
  onChunk: (chunk: EncodedAudioChunk) => Promise<void>;
12
13
  onError: (error: DOMException) => void;
13
14
  codec: ConvertMediaAudioCodec;
14
- signal: AbortSignal;
15
+ controller: WebCodecsController;
15
16
  config: AudioEncoderConfig;
16
17
  logLevel: LogLevel;
17
18
  onNewAudioSampleRate: (sampleRate: number) => void;
18
19
  progressTracker: ProgressTracker;
19
20
  };
20
- export declare const createAudioEncoder: ({ onChunk, onError, codec, signal, config: audioEncoderConfig, logLevel, onNewAudioSampleRate, progressTracker, }: AudioEncoderInit) => WebCodecsAudioEncoder;
21
+ export declare const createAudioEncoder: ({ onChunk, onError, codec, controller, config: audioEncoderConfig, logLevel, onNewAudioSampleRate, progressTracker, }: AudioEncoderInit) => WebCodecsAudioEncoder;
@@ -1,14 +1,15 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createAudioEncoder = void 0;
4
+ const media_parser_1 = require("@remotion/media-parser");
4
5
  const io_synchronizer_1 = require("./io-manager/io-synchronizer");
5
6
  const wav_audio_encoder_1 = require("./wav-audio-encoder");
6
- const createAudioEncoder = ({ onChunk, onError, codec, signal, config: audioEncoderConfig, logLevel, onNewAudioSampleRate, progressTracker, }) => {
7
- if (signal.aborted) {
8
- throw new Error('Not creating audio encoder, already aborted');
7
+ const createAudioEncoder = ({ onChunk, onError, codec, controller, config: audioEncoderConfig, logLevel, onNewAudioSampleRate, progressTracker, }) => {
8
+ if (controller._internals.signal.aborted) {
9
+ throw new media_parser_1.MediaParserAbortError('Not creating audio encoder, already aborted');
9
10
  }
10
11
  if (codec === 'wav') {
11
- return (0, wav_audio_encoder_1.getWaveAudioEncoder)({ onChunk, signal });
12
+ return (0, wav_audio_encoder_1.getWaveAudioEncoder)({ onChunk, controller });
12
13
  }
13
14
  const ioSynchronizer = (0, io_synchronizer_1.makeIoSynchronizer)({
14
15
  logLevel,
@@ -21,7 +22,7 @@ const createAudioEncoder = ({ onChunk, onError, codec, signal, config: audioEnco
21
22
  ioSynchronizer.onOutput(chunk.timestamp);
22
23
  prom = prom
23
24
  .then(() => {
24
- if (signal.aborted) {
25
+ if (controller._internals.signal.aborted) {
25
26
  return;
26
27
  }
27
28
  return onChunk(chunk);
@@ -40,7 +41,7 @@ const createAudioEncoder = ({ onChunk, onError, codec, signal, config: audioEnco
40
41
  });
41
42
  const close = () => {
42
43
  // eslint-disable-next-line @typescript-eslint/no-use-before-define
43
- signal.removeEventListener('abort', onAbort);
44
+ controller._internals.signal.removeEventListener('abort', onAbort);
44
45
  if (encoder.state === 'closed') {
45
46
  return;
46
47
  }
@@ -49,7 +50,7 @@ const createAudioEncoder = ({ onChunk, onError, codec, signal, config: audioEnco
49
50
  const onAbort = () => {
50
51
  close();
51
52
  };
52
- signal.addEventListener('abort', onAbort);
53
+ controller._internals.signal.addEventListener('abort', onAbort);
53
54
  if (codec !== 'opus' && codec !== 'aac') {
54
55
  throw new Error('Only `codec: "opus"` and `codec: "aac"` is supported currently');
55
56
  }
@@ -63,7 +64,7 @@ const createAudioEncoder = ({ onChunk, onError, codec, signal, config: audioEnco
63
64
  unemitted: 20,
64
65
  unprocessed: 20,
65
66
  minimumProgress: audioData.timestamp - 10000000,
66
- signal,
67
+ controller,
67
68
  });
68
69
  // @ts-expect-error - can have changed in the meanwhile
69
70
  if (encoder.state === 'closed') {
@@ -92,7 +93,7 @@ const createAudioEncoder = ({ onChunk, onError, codec, signal, config: audioEnco
92
93
  },
93
94
  waitForFinish: async () => {
94
95
  await encoder.flush();
95
- await ioSynchronizer.waitForFinish(signal);
96
+ await ioSynchronizer.waitForFinish(controller);
96
97
  await prom;
97
98
  },
98
99
  close,
@@ -0,0 +1,16 @@
1
+ import type { ParseMediaController } from '@remotion/media-parser';
2
+ export type WebCodecsController = {
3
+ abort: (reason?: any) => void;
4
+ pause: ParseMediaController['pause'];
5
+ resume: ParseMediaController['resume'];
6
+ addEventListener: ParseMediaController['addEventListener'];
7
+ removeEventListener: ParseMediaController['removeEventListener'];
8
+ /**
9
+ * @deprecated Not public API
10
+ */
11
+ _internals: {
12
+ signal: AbortSignal;
13
+ checkForAbortAndPause: ParseMediaController['_internals']['checkForAbortAndPause'];
14
+ };
15
+ };
16
+ export declare const webcodecsController: () => WebCodecsController;
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.webcodecsController = void 0;
4
+ const media_parser_1 = require("@remotion/media-parser");
5
+ const webcodecsController = () => {
6
+ const controller = (0, media_parser_1.mediaParserController)();
7
+ return {
8
+ abort: controller.abort,
9
+ pause: controller.pause,
10
+ resume: controller.resume,
11
+ addEventListener: controller.addEventListener,
12
+ removeEventListener: controller.removeEventListener,
13
+ _internals: controller._internals,
14
+ };
15
+ };
16
+ exports.webcodecsController = webcodecsController;
@@ -10,6 +10,7 @@ import { type ConvertMediaVideoCodec } from './get-available-video-codecs';
10
10
  import { type ConvertMediaOnAudioTrackHandler } from './on-audio-track-handler';
11
11
  import { type ConvertMediaOnVideoTrackHandler } from './on-video-track-handler';
12
12
  import type { ResizeOperation } from './resizing/mode';
13
+ import { type WebCodecsController } from './webcodecs-controller';
13
14
  export type ConvertMediaProgress = {
14
15
  decodedVideoFrames: number;
15
16
  decodedAudioFrames: number;
@@ -34,7 +35,7 @@ export type ConvertMediaOnAudioData = (options: {
34
35
  audioData: AudioData;
35
36
  track: AudioTrack;
36
37
  }) => Promise<AudioData> | AudioData;
37
- export declare const convertMedia: <F extends Options<ParseMediaFields>>({ src, onVideoFrame, onAudioData, onProgress: onProgressDoNotCallDirectly, audioCodec, container, videoCodec, signal: userPassedAbortSignal, onAudioTrack: userAudioResolver, onVideoTrack: userVideoResolver, reader, fields, logLevel, writer, progressIntervalInMs, rotate, apiKey, resize, ...more }: {
38
+ export declare const convertMedia: <F extends Options<ParseMediaFields>>({ src, onVideoFrame, onAudioData, onProgress: onProgressDoNotCallDirectly, audioCodec, container, videoCodec, controller, onAudioTrack: userAudioResolver, onVideoTrack: userVideoResolver, reader, fields, logLevel, writer, progressIntervalInMs, rotate, apiKey, resize, onAudioCodec, onContainer, onDimensions, onDurationInSeconds, onFps, onImages, onInternalStats, onIsHdr, onKeyframes, onLocation, onMetadata, onMimeType, onName, onNumberOfAudioChannels, onRotation, onSampleRate, onSize, onSlowAudioBitrate, onSlowDurationInSeconds, onSlowFps, onSlowKeyframes, onSlowNumberOfFrames, onSlowVideoBitrate, onStructure, onTracks, onUnrotatedDimensions, onVideoCodec, ...more }: {
38
39
  src: ParseMediaOptions<F>["src"];
39
40
  container: ConvertMediaContainer;
40
41
  onVideoFrame?: ConvertMediaOnVideoFrame;
@@ -42,7 +43,7 @@ export declare const convertMedia: <F extends Options<ParseMediaFields>>({ src,
42
43
  onProgress?: ConvertMediaOnProgress;
43
44
  videoCodec?: ConvertMediaVideoCodec;
44
45
  audioCodec?: ConvertMediaAudioCodec;
45
- signal?: AbortSignal;
46
+ controller?: WebCodecsController;
46
47
  onAudioTrack?: ConvertMediaOnAudioTrackHandler;
47
48
  onVideoTrack?: ConvertMediaOnVideoTrackHandler;
48
49
  reader?: ParseMediaOptions<F>["reader"];
@@ -3,17 +3,14 @@
3
3
  * Copyright (c) 2025 Remotion AG
4
4
  * For licensing, see: https://remotion.dev/docs/webcodecs#license
5
5
  */
6
- var __importDefault = (this && this.__importDefault) || function (mod) {
7
- return (mod && mod.__esModule) ? mod : { "default": mod };
8
- };
9
6
  Object.defineProperty(exports, "__esModule", { value: true });
10
7
  exports.convertMedia = void 0;
11
8
  const media_parser_1 = require("@remotion/media-parser");
9
+ const fetch_1 = require("@remotion/media-parser/fetch");
12
10
  const auto_select_writer_1 = require("./auto-select-writer");
13
11
  const calculate_progress_1 = require("./calculate-progress");
14
12
  const progress_tracker_1 = require("./create/progress-tracker");
15
13
  const with_resolvers_1 = require("./create/with-resolvers");
16
- const error_cause_1 = __importDefault(require("./error-cause"));
17
14
  const generate_output_filename_1 = require("./generate-output-filename");
18
15
  const get_available_containers_1 = require("./get-available-containers");
19
16
  const get_available_video_codecs_1 = require("./get-available-video-codecs");
@@ -23,34 +20,34 @@ const on_video_track_1 = require("./on-video-track");
23
20
  const select_container_creator_1 = require("./select-container-creator");
24
21
  const send_telemetry_event_1 = require("./send-telemetry-event");
25
22
  const throttled_state_update_1 = require("./throttled-state-update");
26
- const convertMedia = async function ({ src, onVideoFrame, onAudioData, onProgress: onProgressDoNotCallDirectly, audioCodec, container, videoCodec, signal: userPassedAbortSignal, onAudioTrack: userAudioResolver, onVideoTrack: userVideoResolver, reader, fields, logLevel = 'info', writer, progressIntervalInMs, rotate, apiKey, resize, ...more }) {
23
+ const webcodecs_controller_1 = require("./webcodecs-controller");
24
+ const convertMedia = async function ({ src, onVideoFrame, onAudioData, onProgress: onProgressDoNotCallDirectly, audioCodec, container, videoCodec, controller = (0, webcodecs_controller_1.webcodecsController)(), onAudioTrack: userAudioResolver, onVideoTrack: userVideoResolver, reader, fields, logLevel = 'info', writer, progressIntervalInMs, rotate, apiKey, resize, onAudioCodec, onContainer, onDimensions, onDurationInSeconds, onFps, onImages, onInternalStats, onIsHdr, onKeyframes, onLocation, onMetadata, onMimeType, onName, onNumberOfAudioChannels, onRotation, onSampleRate, onSize, onSlowAudioBitrate, onSlowDurationInSeconds, onSlowFps, onSlowKeyframes, onSlowNumberOfFrames, onSlowVideoBitrate, onStructure, onTracks, onUnrotatedDimensions, onVideoCodec, ...more }) {
27
25
  var _a, _b;
28
- if (userPassedAbortSignal === null || userPassedAbortSignal === void 0 ? void 0 : userPassedAbortSignal.aborted) {
29
- return Promise.reject(new error_cause_1.default('Aborted'));
26
+ if (controller._internals.signal.aborted) {
27
+ return Promise.reject(new media_parser_1.MediaParserAbortError('Aborted'));
30
28
  }
31
- if (container !== 'webm' && get_available_containers_1.availableContainers.indexOf(container) === -1) {
29
+ if (get_available_containers_1.availableContainers.indexOf(container) === -1) {
32
30
  return Promise.reject(new TypeError(`Only the following values for "container" are supported currently: ${JSON.stringify(get_available_containers_1.availableContainers)}`));
33
31
  }
34
32
  if (videoCodec && get_available_video_codecs_1.availableVideoCodecs.indexOf(videoCodec) === -1) {
35
33
  return Promise.reject(new TypeError(`Only the following values for "videoCodec" are supported currently: ${JSON.stringify(get_available_video_codecs_1.availableVideoCodecs)}`));
36
34
  }
37
35
  const { resolve, reject, getPromiseToImmediatelyReturn } = (0, with_resolvers_1.withResolversAndWaitForReturn)();
38
- const controller = new AbortController();
39
36
  const abortConversion = (errCause) => {
40
37
  reject(errCause);
41
- if (!controller.signal.aborted) {
38
+ if (!controller._internals.signal.aborted) {
42
39
  controller.abort();
43
40
  }
44
41
  };
45
42
  const onUserAbort = () => {
46
- abortConversion(new error_cause_1.default('Conversion aborted by user'));
43
+ abortConversion(new media_parser_1.MediaParserAbortError('Conversion aborted by user'));
47
44
  };
48
- userPassedAbortSignal === null || userPassedAbortSignal === void 0 ? void 0 : userPassedAbortSignal.addEventListener('abort', onUserAbort);
45
+ controller._internals.signal.addEventListener('abort', onUserAbort);
49
46
  const creator = (0, select_container_creator_1.selectContainerCreator)(container);
50
47
  const throttledState = (0, throttled_state_update_1.throttledStateUpdate)({
51
48
  updateFn: onProgressDoNotCallDirectly !== null && onProgressDoNotCallDirectly !== void 0 ? onProgressDoNotCallDirectly : null,
52
49
  everyMilliseconds: progressIntervalInMs !== null && progressIntervalInMs !== void 0 ? progressIntervalInMs : 100,
53
- signal: controller.signal,
50
+ signal: controller._internals.signal,
54
51
  });
55
52
  const progressTracker = (0, progress_tracker_1.makeProgressTracker)();
56
53
  const state = await creator({
@@ -110,17 +107,17 @@ const convertMedia = async function ({ src, onVideoFrame, onAudioData, onProgres
110
107
  progressTracker,
111
108
  onAudioData: onAudioData !== null && onAudioData !== void 0 ? onAudioData : null,
112
109
  });
113
- (0, media_parser_1.parseMedia)({
110
+ media_parser_1.MediaParserInternals.internalParseMedia({
114
111
  logLevel,
115
112
  src,
116
113
  onVideoTrack,
117
114
  onAudioTrack,
118
- signal: controller.signal,
115
+ controller,
119
116
  fields: {
120
117
  ...fields,
121
118
  durationInSeconds: true,
122
119
  },
123
- reader,
120
+ reader: reader !== null && reader !== void 0 ? reader : fetch_1.fetchReader,
124
121
  ...more,
125
122
  onDurationInSeconds: (durationInSeconds) => {
126
123
  var _a;
@@ -143,6 +140,39 @@ const convertMedia = async function ({ src, onVideoFrame, onAudioData, onProgres
143
140
  };
144
141
  });
145
142
  },
143
+ acknowledgeRemotionLicense: true,
144
+ mode: 'query',
145
+ onDiscardedData: null,
146
+ onError: () => ({ action: 'fail' }),
147
+ onParseProgress: null,
148
+ progressIntervalInMs: null,
149
+ onAudioCodec: onAudioCodec !== null && onAudioCodec !== void 0 ? onAudioCodec : null,
150
+ onContainer: onContainer !== null && onContainer !== void 0 ? onContainer : null,
151
+ onDimensions: onDimensions !== null && onDimensions !== void 0 ? onDimensions : null,
152
+ onFps: onFps !== null && onFps !== void 0 ? onFps : null,
153
+ onImages: onImages !== null && onImages !== void 0 ? onImages : null,
154
+ onInternalStats: onInternalStats !== null && onInternalStats !== void 0 ? onInternalStats : null,
155
+ onIsHdr: onIsHdr !== null && onIsHdr !== void 0 ? onIsHdr : null,
156
+ onKeyframes: onKeyframes !== null && onKeyframes !== void 0 ? onKeyframes : null,
157
+ onLocation: onLocation !== null && onLocation !== void 0 ? onLocation : null,
158
+ onMetadata: onMetadata !== null && onMetadata !== void 0 ? onMetadata : null,
159
+ onMimeType: onMimeType !== null && onMimeType !== void 0 ? onMimeType : null,
160
+ onName: onName !== null && onName !== void 0 ? onName : null,
161
+ onNumberOfAudioChannels: onNumberOfAudioChannels !== null && onNumberOfAudioChannels !== void 0 ? onNumberOfAudioChannels : null,
162
+ onRotation: onRotation !== null && onRotation !== void 0 ? onRotation : null,
163
+ onSampleRate: onSampleRate !== null && onSampleRate !== void 0 ? onSampleRate : null,
164
+ onSize: onSize !== null && onSize !== void 0 ? onSize : null,
165
+ onSlowAudioBitrate: onSlowAudioBitrate !== null && onSlowAudioBitrate !== void 0 ? onSlowAudioBitrate : null,
166
+ onSlowDurationInSeconds: onSlowDurationInSeconds !== null && onSlowDurationInSeconds !== void 0 ? onSlowDurationInSeconds : null,
167
+ onSlowFps: onSlowFps !== null && onSlowFps !== void 0 ? onSlowFps : null,
168
+ onSlowKeyframes: onSlowKeyframes !== null && onSlowKeyframes !== void 0 ? onSlowKeyframes : null,
169
+ onSlowNumberOfFrames: onSlowNumberOfFrames !== null && onSlowNumberOfFrames !== void 0 ? onSlowNumberOfFrames : null,
170
+ onSlowVideoBitrate: onSlowVideoBitrate !== null && onSlowVideoBitrate !== void 0 ? onSlowVideoBitrate : null,
171
+ onStructure: onStructure !== null && onStructure !== void 0 ? onStructure : null,
172
+ onTracks: onTracks !== null && onTracks !== void 0 ? onTracks : null,
173
+ onUnrotatedDimensions: onUnrotatedDimensions !== null && onUnrotatedDimensions !== void 0 ? onUnrotatedDimensions : null,
174
+ onVideoCodec: onVideoCodec !== null && onVideoCodec !== void 0 ? onVideoCodec : null,
175
+ apiName: 'convertMedia()',
146
176
  })
147
177
  .then(() => {
148
178
  return state.waitForFinish();
@@ -169,7 +199,7 @@ const convertMedia = async function ({ src, onVideoFrame, onAudioData, onProgres
169
199
  throttledState.stopAndGetLastProgress();
170
200
  });
171
201
  return getPromiseToImmediatelyReturn().finally(() => {
172
- userPassedAbortSignal === null || userPassedAbortSignal === void 0 ? void 0 : userPassedAbortSignal.removeEventListener('abort', onUserAbort);
202
+ controller._internals.signal.removeEventListener('abort', onUserAbort);
173
203
  });
174
204
  };
175
205
  exports.convertMedia = convertMedia;
@@ -19,7 +19,7 @@ export type EbmlParsedOrUint8Array<T extends Ebml> = {
19
19
  value: EbmlValueOrUint8Array<T>;
20
20
  minVintWidth: number | null;
21
21
  };
22
- export declare const measureEBMLVarInt: (value: number) => 2 | 1 | 6 | 5 | 3 | 4;
22
+ export declare const measureEBMLVarInt: (value: number) => 2 | 1 | 4 | 3 | 5 | 6;
23
23
  export declare const getVariableInt: (value: number, minWidth: number | null) => Uint8Array;
24
24
  export declare const makeMatroskaBytes: (fields: PossibleEbmlOrUint8Array) => BytesAndOffset;
25
25
  export type PossibleEbmlOrUint8Array = Prettify<{
@@ -0,0 +1,20 @@
1
+ type MediaParserEventMap = {
2
+ pause: undefined;
3
+ resume: undefined;
4
+ };
5
+ export type MediaParserEventTypes = keyof MediaParserEventMap;
6
+ export type CallbackListener<T extends MediaParserEventTypes> = (data: {
7
+ detail: MediaParserEventMap[T];
8
+ }) => void;
9
+ type MediaParserListeners = {
10
+ [EventType in MediaParserEventTypes]: CallbackListener<EventType>[];
11
+ };
12
+ export declare class MediaParserEmitter {
13
+ listeners: MediaParserListeners;
14
+ addEventListener<Q extends MediaParserEventTypes>(name: Q, callback: CallbackListener<Q>): void;
15
+ removeEventListener<Q extends MediaParserEventTypes>(name: Q, callback: CallbackListener<Q>): void;
16
+ private dispatchEvent;
17
+ dispatchPause: () => void;
18
+ dispatchResume: () => void;
19
+ }
20
+ export {};
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MediaParserEmitter = void 0;
4
+ class MediaParserEmitter {
5
+ constructor() {
6
+ this.listeners = {
7
+ pause: [],
8
+ resume: [],
9
+ };
10
+ this.dispatchPause = () => {
11
+ this.dispatchEvent('pause', undefined);
12
+ };
13
+ this.dispatchResume = () => {
14
+ this.dispatchEvent('resume', undefined);
15
+ };
16
+ }
17
+ addEventListener(name, callback) {
18
+ this.listeners[name].push(callback);
19
+ }
20
+ removeEventListener(name, callback) {
21
+ this.listeners[name] = this.listeners[name].filter((l) => l !== callback);
22
+ }
23
+ dispatchEvent(dispatchName, context) {
24
+ this.listeners[dispatchName].forEach((callback) => {
25
+ callback({ detail: context });
26
+ });
27
+ }
28
+ }
29
+ exports.MediaParserEmitter = MediaParserEmitter;