@remotion/media-parser 4.0.310 → 4.0.312

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 (34) hide show
  1. package/dist/containers/aac/get-seeking-byte.js +5 -1
  2. package/dist/containers/flac/get-seeking-byte.d.ts +2 -1
  3. package/dist/containers/flac/get-seeking-byte.js +1 -1
  4. package/dist/containers/iso-base-media/find-keyframe-before-time.d.ts +1 -1
  5. package/dist/containers/iso-base-media/find-keyframe-before-time.js +1 -1
  6. package/dist/containers/iso-base-media/get-seeking-byte-from-fragmented-mp4.js +3 -1
  7. package/dist/containers/iso-base-media/get-seeking-byte.js +3 -1
  8. package/dist/containers/m3u/get-seeking-byte.js +2 -0
  9. package/dist/containers/mp3/get-seeking-byte.js +4 -1
  10. package/dist/containers/riff/get-seeking-byte.js +3 -0
  11. package/dist/containers/wav/get-seeking-byte.js +1 -0
  12. package/dist/containers/wav/parse-list.js +4 -3
  13. package/dist/containers/webm/seek/get-seeking-byte.js +21 -6
  14. package/dist/controller/media-parser-controller.d.ts +3 -0
  15. package/dist/controller/media-parser-controller.js +15 -0
  16. package/dist/esm/index.mjs +226 -131
  17. package/dist/esm/server-worker.mjs +20 -1
  18. package/dist/esm/worker-server-entry.mjs +248 -130
  19. package/dist/esm/worker-web-entry.mjs +248 -130
  20. package/dist/esm/worker.mjs +31 -1
  21. package/dist/get-seeking-byte.js +13 -2
  22. package/dist/index.cjs +54 -0
  23. package/dist/index.d.ts +1 -0
  24. package/dist/internal-parse-media.js +25 -0
  25. package/dist/parse-media-on-worker-entry.js +19 -1
  26. package/dist/version.d.ts +1 -1
  27. package/dist/version.js +1 -1
  28. package/dist/webcodec-sample-types.d.ts +2 -2
  29. package/dist/work-on-seek-request.d.ts +22 -0
  30. package/dist/work-on-seek-request.js +3 -2
  31. package/dist/worker/forward-controller-to-worker.js +18 -0
  32. package/dist/worker/serialize-error.js +14 -4
  33. package/dist/worker/worker-types.d.ts +17 -3
  34. package/package.json +3 -3
@@ -11,6 +11,7 @@ const remotion_license_acknowledge_1 = require("./remotion-license-acknowledge")
11
11
  const set_seeking_hints_1 = require("./set-seeking-hints");
12
12
  const parser_state_1 = require("./state/parser-state");
13
13
  const throttled_progress_1 = require("./throttled-progress");
14
+ const work_on_seek_request_1 = require("./work-on-seek-request");
14
15
  const internalParseMedia = async function ({ src, fields: _fieldsInReturnValue, reader: readerInterface, onAudioTrack, onVideoTrack, controller = (0, media_parser_controller_1.mediaParserController)(), logLevel, onParseProgress: onParseProgressDoNotCallDirectly, progressIntervalInMs, mode, onDiscardedData, onError, acknowledgeRemotionLicense, apiName, selectM3uStream: selectM3uStreamFn, selectM3uAssociatedPlaylists: selectM3uAssociatedPlaylistsFn, m3uPlaylistContext, makeSamplesStartAtZero, seekingHints, ...more }) {
15
16
  var _a;
16
17
  if (!src) {
@@ -82,6 +83,30 @@ const internalParseMedia = async function ({ src, fields: _fieldsInReturnValue,
82
83
  contentLength: state.contentLength,
83
84
  aacState: state.aac,
84
85
  })));
86
+ controller._internals.attachSimulateSeekResolution((seek) => {
87
+ const { aacState, avcState, flacState, isoState, iterator, keyframes, m3uState, mediaSection, mp3State, riffState, samplesObserved, structureState, tracksState, transportStream, webmState, } = (0, work_on_seek_request_1.getWorkOnSeekRequestOptions)(state);
88
+ return (0, work_on_seek_request_1.turnSeekIntoByte)({
89
+ aacState,
90
+ seek,
91
+ avcState,
92
+ contentLength,
93
+ flacState,
94
+ isoState,
95
+ iterator,
96
+ keyframes,
97
+ logLevel,
98
+ m3uPlaylistContext,
99
+ m3uState,
100
+ mediaSectionState: mediaSection,
101
+ mp3State,
102
+ riffState,
103
+ samplesObserved,
104
+ structureState,
105
+ tracksState,
106
+ transportStream,
107
+ webmState,
108
+ });
109
+ });
85
110
  if (!hasAudioTrackHandlers &&
86
111
  !hasVideoTrackHandlers &&
87
112
  Object.values(state.fields).every((v) => !v) &&
@@ -43,7 +43,8 @@ payload) => {
43
43
  postM3uAssociatedPlaylistsSelection: Boolean(selectM3uAssociatedPlaylists),
44
44
  postOnAudioTrack: Boolean(onAudioTrack),
45
45
  postOnVideoTrack: Boolean(onVideoTrack),
46
- src,
46
+ // URL cannot be serialized, so we convert it to a string
47
+ src: src instanceof URL ? src.toString() : src,
47
48
  };
48
49
  };
49
50
  const post = (worker, payload) => {
@@ -83,6 +84,14 @@ const parseMediaOnWorkerImplementation = async ({ controller, reader, ...params
83
84
  seekingHintPromises.push(prom);
84
85
  return prom.promise;
85
86
  });
87
+ const simulateSeekPromises = {};
88
+ controller === null || controller === void 0 ? void 0 : controller._internals.attachSimulateSeekResolution((seek) => {
89
+ const prom = (0, with_resolvers_1.withResolvers)();
90
+ const nonce = String(Math.random());
91
+ post(worker, { type: 'request-simulate-seek', payload: seek, nonce });
92
+ simulateSeekPromises[nonce] = prom;
93
+ return prom.promise;
94
+ });
86
95
  const callbacks = {};
87
96
  function onMessage(message) {
88
97
  const data = message.data;
@@ -312,6 +321,15 @@ const parseMediaOnWorkerImplementation = async ({ controller, reader, ...params
312
321
  firstPromise.resolve(data.payload);
313
322
  return;
314
323
  }
324
+ if (data.type === 'response-simulate-seek') {
325
+ const prom = simulateSeekPromises[data.nonce];
326
+ if (!prom) {
327
+ throw new Error('No simulate seek promise found');
328
+ }
329
+ prom.resolve(data.payload);
330
+ delete simulateSeekPromises[data.nonce];
331
+ return;
332
+ }
315
333
  throw new Error(`Unknown response type: ${JSON.stringify(data)}`);
316
334
  }
317
335
  worker.addEventListener('message', onMessage);
package/dist/version.d.ts CHANGED
@@ -1 +1 @@
1
- export declare const VERSION = "4.0.310";
1
+ export declare const VERSION = "4.0.312";
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.310';
5
+ exports.VERSION = '4.0.312';
@@ -1,7 +1,7 @@
1
1
  import type { MediaParserAudioTrack, MediaParserVideoTrack } from './get-tracks';
2
2
  import type { MediaParserContainer } from './options';
3
- export type MediaParserOnAudioSample = (sample: MediaParserAudioSample) => void | Promise<void> | OnTrackDoneCallback | Promise<OnTrackDoneCallback>;
4
- export type MediaParserOnVideoSample = (sample: MediaParserVideoSample) => void | Promise<void> | OnTrackDoneCallback | Promise<OnTrackDoneCallback>;
3
+ export type MediaParserOnAudioSample = (sample: MediaParserAudioSample) => void | Promise<OnTrackDoneCallback | void> | Promise<void> | OnTrackDoneCallback;
4
+ export type MediaParserOnVideoSample = (sample: MediaParserVideoSample) => void | Promise<OnTrackDoneCallback | void> | Promise<void> | OnTrackDoneCallback;
5
5
  export type OnTrackDoneCallback = () => void | Promise<void>;
6
6
  export type MediaParserOnAudioTrackParams = {
7
7
  track: MediaParserAudioTrack;
@@ -22,6 +22,27 @@ import type { SeekInfiniteLoop } from './state/seek-infinite-loop';
22
22
  import type { StructureState } from './state/structure';
23
23
  import type { TransportStreamState } from './state/transport-stream/transport-stream';
24
24
  import { type MediaSectionState } from './state/video-section';
25
+ export declare const turnSeekIntoByte: ({ seek, mediaSectionState, logLevel, iterator, structureState, m3uPlaylistContext, isoState, transportStream, tracksState, webmState, keyframes, flacState, samplesObserved, riffState, mp3State, contentLength, aacState, m3uState, avcState, }: {
26
+ seek: number;
27
+ mediaSectionState: MediaSectionState;
28
+ logLevel: MediaParserLogLevel;
29
+ iterator: BufferIterator;
30
+ structureState: StructureState;
31
+ m3uPlaylistContext: M3uPlaylistContext | null;
32
+ isoState: IsoBaseMediaState;
33
+ transportStream: TransportStreamState;
34
+ tracksState: TracksState;
35
+ webmState: WebmState;
36
+ keyframes: KeyframesState;
37
+ flacState: FlacState;
38
+ samplesObserved: SamplesObservedState;
39
+ riffState: RiffState;
40
+ mp3State: Mp3State;
41
+ aacState: AacState;
42
+ contentLength: number;
43
+ m3uState: M3uState;
44
+ avcState: AvcState;
45
+ }) => Promise<SeekResolution>;
25
46
  export type WorkOnSeekRequestOptions = {
26
47
  logLevel: MediaParserLogLevel;
27
48
  controller: MediaParserController;
@@ -63,4 +84,5 @@ export type SeekResolution = {
63
84
  } | {
64
85
  type: 'do-seek';
65
86
  byte: number;
87
+ timeInSeconds: number;
66
88
  };
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.workOnSeekRequest = exports.getWorkOnSeekRequestOptions = void 0;
3
+ exports.workOnSeekRequest = exports.getWorkOnSeekRequestOptions = exports.turnSeekIntoByte = void 0;
4
4
  const get_seeking_byte_1 = require("./get-seeking-byte");
5
5
  const get_seeking_hints_1 = require("./get-seeking-hints");
6
6
  const log_1 = require("./log");
@@ -55,6 +55,7 @@ const turnSeekIntoByte = async ({ seek, mediaSectionState, logLevel, iterator, s
55
55
  });
56
56
  return seekingByte;
57
57
  };
58
+ exports.turnSeekIntoByte = turnSeekIntoByte;
58
59
  const getWorkOnSeekRequestOptions = (state) => {
59
60
  return {
60
61
  logLevel: state.logLevel,
@@ -94,7 +95,7 @@ const workOnSeekRequest = async (options) => {
94
95
  return;
95
96
  }
96
97
  log_1.Log.trace(logLevel, `Has seek request for ${src}: ${JSON.stringify(seek)}`);
97
- const resolution = await turnSeekIntoByte({
98
+ const resolution = await (0, exports.turnSeekIntoByte)({
98
99
  seek,
99
100
  mediaSectionState: mediaSection,
100
101
  logLevel,
@@ -29,6 +29,24 @@ const forwardMediaParserControllerToWorker = (controller) => {
29
29
  });
30
30
  return;
31
31
  }
32
+ if (message.type === 'request-simulate-seek') {
33
+ controller
34
+ .simulateSeek(message.payload)
35
+ .then((resolution) => {
36
+ postMessage({
37
+ type: 'response-simulate-seek',
38
+ nonce: message.nonce,
39
+ payload: resolution,
40
+ });
41
+ })
42
+ .catch((err) => {
43
+ postMessage({
44
+ type: 'response-error',
45
+ payload: err,
46
+ });
47
+ });
48
+ return;
49
+ }
32
50
  if (message.type === 'request-resume') {
33
51
  controller.resume();
34
52
  return;
@@ -4,7 +4,7 @@ exports.deserializeError = exports.serializeError = void 0;
4
4
  const errors_1 = require("../errors");
5
5
  const log_1 = require("../log");
6
6
  const serializeError = ({ error, logLevel, seekingHints, }) => {
7
- var _a, _b, _c, _d, _e, _f;
7
+ var _a, _b, _c, _d, _e, _f, _g;
8
8
  if (error instanceof errors_1.IsAnImageError) {
9
9
  return {
10
10
  type: 'response-error',
@@ -38,12 +38,20 @@ const serializeError = ({ error, logLevel, seekingHints, }) => {
38
38
  seekingHints,
39
39
  };
40
40
  }
41
+ if (error instanceof TypeError) {
42
+ return {
43
+ type: 'response-error',
44
+ errorName: 'TypeError',
45
+ errorMessage: error.message,
46
+ errorStack: (_d = error.stack) !== null && _d !== void 0 ? _d : '',
47
+ };
48
+ }
41
49
  if (error.name === 'AbortError') {
42
50
  return {
43
51
  type: 'response-error',
44
52
  errorName: 'AbortError',
45
53
  errorMessage: error.message,
46
- errorStack: (_d = error.stack) !== null && _d !== void 0 ? _d : '',
54
+ errorStack: (_e = error.stack) !== null && _e !== void 0 ? _e : '',
47
55
  };
48
56
  }
49
57
  if (error.name === 'NotReadableError') {
@@ -51,7 +59,7 @@ const serializeError = ({ error, logLevel, seekingHints, }) => {
51
59
  type: 'response-error',
52
60
  errorName: 'NotReadableError',
53
61
  errorMessage: error.message,
54
- errorStack: (_e = error.stack) !== null && _e !== void 0 ? _e : '',
62
+ errorStack: (_f = error.stack) !== null && _f !== void 0 ? _f : '',
55
63
  };
56
64
  }
57
65
  if (error.name !== 'Error') {
@@ -61,7 +69,7 @@ const serializeError = ({ error, logLevel, seekingHints, }) => {
61
69
  type: 'response-error',
62
70
  errorName: 'Error',
63
71
  errorMessage: error.message,
64
- errorStack: (_f = error.stack) !== null && _f !== void 0 ? _f : '',
72
+ errorStack: (_g = error.stack) !== null && _g !== void 0 ? _g : '',
65
73
  };
66
74
  };
67
75
  exports.serializeError = serializeError;
@@ -99,6 +107,8 @@ const deserializeError = (error) => {
99
107
  // TODO: Document 2GB limit
100
108
  case 'NotReadableError':
101
109
  return new Error(error.errorMessage);
110
+ case 'TypeError':
111
+ return new TypeError(error.errorMessage);
102
112
  default:
103
113
  throw new Error(`Unknown error name: ${error}`);
104
114
  }
@@ -12,6 +12,7 @@ import type { SeekingHints } from '../seeking-hints';
12
12
  import type { MediaParserEmbeddedImage } from '../state/images';
13
13
  import type { InternalStats } from '../state/parser-state';
14
14
  import type { MediaParserAudioSample, MediaParserOnAudioTrackParams, MediaParserOnVideoTrackParams, MediaParserVideoSample } from '../webcodec-sample-types';
15
+ import type { SeekResolution } from '../work-on-seek-request';
15
16
  export type ParseMediaOnWorkerPayload = {
16
17
  type: 'request-worker';
17
18
  src: ParseMediaSrc;
@@ -63,6 +64,11 @@ type RequestResume = {
63
64
  type RequestGetSeekingHints = {
64
65
  type: 'request-get-seeking-hints';
65
66
  };
67
+ type RequestSimulateSeek = {
68
+ type: 'request-simulate-seek';
69
+ payload: number;
70
+ nonce: string;
71
+ };
66
72
  type RequestAbort = {
67
73
  type: 'request-abort';
68
74
  };
@@ -75,6 +81,11 @@ type ResponseGetSeekingHints = {
75
81
  type: 'response-get-seeking-hints';
76
82
  payload: SeekingHints;
77
83
  };
84
+ type ResponseSimulateSeek = {
85
+ type: 'response-simulate-seek';
86
+ nonce: string;
87
+ payload: SeekResolution;
88
+ };
78
89
  type BaseError = {
79
90
  errorStack: string;
80
91
  errorMessage: string;
@@ -88,6 +99,9 @@ type GenericError = BaseError & {
88
99
  type NotReadableError = BaseError & {
89
100
  errorName: 'NotReadableError';
90
101
  };
102
+ type TypeError = BaseError & {
103
+ errorName: 'TypeError';
104
+ };
91
105
  type IsAnImageError = BaseError & {
92
106
  errorName: 'IsAnImageError';
93
107
  imageType: ImageType;
@@ -112,7 +126,7 @@ type MediaParserAbortError = BaseError & {
112
126
  errorName: 'MediaParserAbortError';
113
127
  seekingHints: SeekingHints | null;
114
128
  };
115
- type AnyError = GenericError | IsAnImageError | IsAPdfError | IsAnUnsupportedFileTypeError | MediaParserAbortError | AbortError | NotReadableError;
129
+ type AnyError = GenericError | IsAnImageError | IsAPdfError | IsAnUnsupportedFileTypeError | MediaParserAbortError | AbortError | NotReadableError | TypeError;
116
130
  export type ResponseError = {
117
131
  type: 'response-error';
118
132
  } & AnyError;
@@ -258,6 +272,6 @@ export type SignalErrorInCallback = {
258
272
  type: 'signal-error-in-callback';
259
273
  nonce: string;
260
274
  };
261
- export type WorkerRequestPayload = ParseMediaOnWorkerPayload | RequestResume | RequestPause | RequestAbort | RequestSeek | RequestGetSeekingHints | AcknowledgeCallback | SignalErrorInCallback;
262
- export type WorkerResponsePayload = ResponseDone | ResponseError | ResponseOnCallbackRequest | ResponseGetSeekingHints;
275
+ export type WorkerRequestPayload = ParseMediaOnWorkerPayload | RequestResume | RequestPause | RequestAbort | RequestSeek | RequestGetSeekingHints | RequestSimulateSeek | AcknowledgeCallback | SignalErrorInCallback;
276
+ export type WorkerResponsePayload = ResponseDone | ResponseError | ResponseOnCallbackRequest | ResponseGetSeekingHints | ResponseSimulateSeek;
263
277
  export {};
package/package.json CHANGED
@@ -3,15 +3,15 @@
3
3
  "url": "https://github.com/remotion-dev/remotion/tree/main/packages/media-parser"
4
4
  },
5
5
  "name": "@remotion/media-parser",
6
- "version": "4.0.310",
6
+ "version": "4.0.312",
7
7
  "main": "dist/index.js",
8
8
  "sideEffects": false,
9
9
  "devDependencies": {
10
10
  "@types/wicg-file-system-access": "2023.10.5",
11
11
  "eslint": "9.19.0",
12
12
  "@types/bun": "1.2.8",
13
- "@remotion/example-videos": "4.0.310",
14
- "@remotion/eslint-config-internal": "4.0.310"
13
+ "@remotion/eslint-config-internal": "4.0.312",
14
+ "@remotion/example-videos": "4.0.312"
15
15
  },
16
16
  "publishConfig": {
17
17
  "access": "public"