@remotion/webcodecs 4.0.332 → 4.0.333

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.
@@ -18,11 +18,11 @@ export type CreateAudioDecoderInit = {
18
18
  config: AudioDecoderConfig;
19
19
  logLevel: MediaParserLogLevel;
20
20
  };
21
- export declare const internalCreateAudioDecoder: ({ onFrame, onError, controller, config, logLevel, }: CreateAudioDecoderInit) => WebCodecsAudioDecoder;
21
+ export declare const internalCreateAudioDecoder: ({ onFrame, onError, controller, config, logLevel, }: CreateAudioDecoderInit) => Promise<WebCodecsAudioDecoder>;
22
22
  export declare const createAudioDecoder: ({ track, onFrame, onError, controller, logLevel, }: {
23
23
  track: AudioDecoderConfig;
24
24
  onFrame: (frame: AudioData) => Promise<void> | void;
25
25
  onError: (error: Error) => void;
26
26
  controller?: WebCodecsController | null;
27
27
  logLevel?: MediaParserLogLevel;
28
- }) => WebCodecsAudioDecoder;
28
+ }) => Promise<WebCodecsAudioDecoder>;
@@ -4,7 +4,8 @@ exports.createAudioDecoder = exports.internalCreateAudioDecoder = void 0;
4
4
  const flush_pending_1 = require("./flush-pending");
5
5
  const get_wave_audio_decoder_1 = require("./get-wave-audio-decoder");
6
6
  const io_synchronizer_1 = require("./io-manager/io-synchronizer");
7
- const internalCreateAudioDecoder = ({ onFrame, onError, controller, config, logLevel, }) => {
7
+ const undecodable_error_1 = require("./undecodable-error");
8
+ const internalCreateAudioDecoder = async ({ onFrame, onError, controller, config, logLevel, }) => {
8
9
  if (controller &&
9
10
  controller._internals._mediaParserController._internals.signal.aborted) {
10
11
  throw new Error('Not creating audio decoder, already aborted');
@@ -57,6 +58,13 @@ const internalCreateAudioDecoder = ({ onFrame, onError, controller, config, logL
57
58
  if (controller) {
58
59
  controller._internals._mediaParserController._internals.signal.addEventListener('abort', onAbort);
59
60
  }
61
+ const isConfigSupported = await AudioDecoder.isConfigSupported(config);
62
+ if (!isConfigSupported) {
63
+ throw new undecodable_error_1.AudioUndecodableError({
64
+ message: 'Audio cannot be decoded by this browser',
65
+ config,
66
+ });
67
+ }
60
68
  audioDecoder.configure(config);
61
69
  const decode = async (audioSample) => {
62
70
  if (audioDecoder.state === 'closed') {
@@ -17,11 +17,11 @@ export declare const internalCreateVideoDecoder: ({ onFrame, onError, controller
17
17
  controller: WebCodecsController | null;
18
18
  config: VideoDecoderConfig;
19
19
  logLevel: MediaParserLogLevel;
20
- }) => WebCodecsVideoDecoder;
20
+ }) => Promise<WebCodecsVideoDecoder>;
21
21
  export declare const createVideoDecoder: ({ onFrame, onError, controller, track, logLevel, }: {
22
22
  track: VideoDecoderConfig;
23
23
  onFrame: (frame: VideoFrame) => Promise<void> | void;
24
24
  onError: (error: Error) => void;
25
25
  controller?: WebCodecsController;
26
26
  logLevel?: MediaParserLogLevel;
27
- }) => WebCodecsVideoDecoder;
27
+ }) => Promise<WebCodecsVideoDecoder>;
@@ -3,7 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createVideoDecoder = exports.internalCreateVideoDecoder = void 0;
4
4
  const flush_pending_1 = require("./flush-pending");
5
5
  const io_synchronizer_1 = require("./io-manager/io-synchronizer");
6
- const internalCreateVideoDecoder = ({ onFrame, onError, controller, config, logLevel, }) => {
6
+ const undecodable_error_1 = require("./undecodable-error");
7
+ const internalCreateVideoDecoder = async ({ onFrame, onError, controller, config, logLevel, }) => {
7
8
  if (controller &&
8
9
  controller._internals._mediaParserController._internals.signal.aborted) {
9
10
  throw new Error('Not creating audio decoder, already aborted');
@@ -46,6 +47,13 @@ const internalCreateVideoDecoder = ({ onFrame, onError, controller, config, logL
46
47
  if (controller) {
47
48
  controller._internals._mediaParserController._internals.signal.addEventListener('abort', onAbort);
48
49
  }
50
+ const isConfigSupported = await VideoDecoder.isConfigSupported(config);
51
+ if (!isConfigSupported) {
52
+ throw new undecodable_error_1.VideoUndecodableError({
53
+ message: 'Video cannot be decoded by this browser',
54
+ config,
55
+ });
56
+ }
49
57
  videoDecoder.configure(config);
50
58
  const decode = async (sample) => {
51
59
  if (videoDecoder.state === 'closed') {
@@ -23,7 +23,8 @@ const defaultOnVideoTrackHandler = async ({ track, defaultVideoCodec, logLevel,
23
23
  return Promise.resolve({
24
24
  type: 'reencode',
25
25
  videoCodec: defaultVideoCodec,
26
- rotate: rotate - track.rotation,
26
+ // By default, will remove rotation when re-encoding
27
+ rotate: undefined,
27
28
  resize: resizeOperation,
28
29
  });
29
30
  }
@@ -4264,8 +4264,39 @@ var getWaveAudioDecoder = ({
4264
4264
  };
4265
4265
  };
4266
4266
 
4267
+ // src/undecodable-error.ts
4268
+ class VideoUndecodableError extends Error {
4269
+ config;
4270
+ constructor({
4271
+ message,
4272
+ config
4273
+ }) {
4274
+ super(message);
4275
+ this.name = "VideoUndecodableError";
4276
+ this.config = config;
4277
+ if (Error.captureStackTrace) {
4278
+ Error.captureStackTrace(this, VideoUndecodableError);
4279
+ }
4280
+ }
4281
+ }
4282
+
4283
+ class AudioUndecodableError extends Error {
4284
+ config;
4285
+ constructor({
4286
+ message,
4287
+ config
4288
+ }) {
4289
+ super(message);
4290
+ this.name = "AudioUndecodableError";
4291
+ this.config = config;
4292
+ if (Error.captureStackTrace) {
4293
+ Error.captureStackTrace(this, AudioUndecodableError);
4294
+ }
4295
+ }
4296
+ }
4297
+
4267
4298
  // src/create-audio-decoder.ts
4268
- var internalCreateAudioDecoder = ({
4299
+ var internalCreateAudioDecoder = async ({
4269
4300
  onFrame,
4270
4301
  onError,
4271
4302
  controller,
@@ -4320,6 +4351,13 @@ var internalCreateAudioDecoder = ({
4320
4351
  if (controller) {
4321
4352
  controller._internals._mediaParserController._internals.signal.addEventListener("abort", onAbort);
4322
4353
  }
4354
+ const isConfigSupported = await AudioDecoder.isConfigSupported(config);
4355
+ if (!isConfigSupported) {
4356
+ throw new AudioUndecodableError({
4357
+ message: "Audio cannot be decoded by this browser",
4358
+ config
4359
+ });
4360
+ }
4323
4361
  audioDecoder.configure(config);
4324
4362
  const decode = async (audioSample) => {
4325
4363
  if (audioDecoder.state === "closed") {
@@ -4558,7 +4596,7 @@ var reencodeAudioTrack = async ({
4558
4596
  newAudioData.close();
4559
4597
  }
4560
4598
  });
4561
- const audioDecoder = internalCreateAudioDecoder({
4599
+ const audioDecoder = await internalCreateAudioDecoder({
4562
4600
  onFrame: async (audioData) => {
4563
4601
  await controller._internals._mediaParserController._internals.checkForAbortAndPause();
4564
4602
  await audioProcessingQueue.ioSynchronizer.waitForQueueSize(10);
@@ -4711,7 +4749,7 @@ var defaultOnVideoTrackHandler = async ({
4711
4749
  return Promise.resolve({
4712
4750
  type: "reencode",
4713
4751
  videoCodec: defaultVideoCodec,
4714
- rotate: rotate - track.rotation,
4752
+ rotate: undefined,
4715
4753
  resize: resizeOperation
4716
4754
  });
4717
4755
  }
@@ -4741,7 +4779,7 @@ var arrayBufferToUint8Array = (buffer) => {
4741
4779
  };
4742
4780
 
4743
4781
  // src/create-video-decoder.ts
4744
- var internalCreateVideoDecoder = ({
4782
+ var internalCreateVideoDecoder = async ({
4745
4783
  onFrame,
4746
4784
  onError,
4747
4785
  controller,
@@ -4786,6 +4824,13 @@ var internalCreateVideoDecoder = ({
4786
4824
  if (controller) {
4787
4825
  controller._internals._mediaParserController._internals.signal.addEventListener("abort", onAbort);
4788
4826
  }
4827
+ const isConfigSupported = await VideoDecoder.isConfigSupported(config);
4828
+ if (!isConfigSupported) {
4829
+ throw new VideoUndecodableError({
4830
+ message: "Video cannot be decoded by this browser",
4831
+ config
4832
+ });
4833
+ }
4789
4834
  videoDecoder.configure(config);
4790
4835
  const decode = async (sample) => {
4791
4836
  if (videoDecoder.state === "closed") {
@@ -5183,7 +5228,7 @@ var reencodeVideoTrack = async ({
5183
5228
  videoProcessingQueue.input(frame);
5184
5229
  }
5185
5230
  });
5186
- const videoDecoder = createVideoDecoder({
5231
+ const videoDecoder = await createVideoDecoder({
5187
5232
  track: videoDecoderConfig,
5188
5233
  onFrame: async (frame) => {
5189
5234
  await frameSorter.waitUntilProcessed();
@@ -5652,7 +5697,7 @@ var internalExtractFrames = ({
5652
5697
  throw new Error("expected at least one timestamp to extract but found zero");
5653
5698
  }
5654
5699
  controller.seek(timestampTargets[0]);
5655
- const decoder = createVideoDecoder({
5700
+ const decoder = await createVideoDecoder({
5656
5701
  onFrame: (frame) => {
5657
5702
  Log.trace(logLevel, "Received frame with timestamp", frame.timestamp);
5658
5703
  if (expectedFrames.length === 0) {
@@ -5844,11 +5889,11 @@ var getPartialAudioData = async ({
5844
5889
  acknowledgeRemotionLicense: true,
5845
5890
  src,
5846
5891
  controller,
5847
- onAudioTrack: ({ track }) => {
5892
+ onAudioTrack: async ({ track }) => {
5848
5893
  if (signal.aborted) {
5849
5894
  return null;
5850
5895
  }
5851
- const audioDecoder = createAudioDecoder({
5896
+ const audioDecoder = await createAudioDecoder({
5852
5897
  track,
5853
5898
  onFrame: (sample) => {
5854
5899
  if (signal.aborted) {
@@ -5948,5 +5993,7 @@ export {
5948
5993
  canReencodeAudioTrack,
5949
5994
  canCopyVideoTrack,
5950
5995
  canCopyAudioTrack,
5951
- WebCodecsInternals
5996
+ WebCodecsInternals,
5997
+ VideoUndecodableError,
5998
+ AudioUndecodableError
5952
5999
  };
@@ -231,8 +231,39 @@ var makeIoSynchronizer = ({
231
231
  };
232
232
  };
233
233
 
234
+ // src/undecodable-error.ts
235
+ class VideoUndecodableError extends Error {
236
+ config;
237
+ constructor({
238
+ message,
239
+ config
240
+ }) {
241
+ super(message);
242
+ this.name = "VideoUndecodableError";
243
+ this.config = config;
244
+ if (Error.captureStackTrace) {
245
+ Error.captureStackTrace(this, VideoUndecodableError);
246
+ }
247
+ }
248
+ }
249
+
250
+ class AudioUndecodableError extends Error {
251
+ config;
252
+ constructor({
253
+ message,
254
+ config
255
+ }) {
256
+ super(message);
257
+ this.name = "AudioUndecodableError";
258
+ this.config = config;
259
+ if (Error.captureStackTrace) {
260
+ Error.captureStackTrace(this, AudioUndecodableError);
261
+ }
262
+ }
263
+ }
264
+
234
265
  // src/create-video-decoder.ts
235
- var internalCreateVideoDecoder = ({
266
+ var internalCreateVideoDecoder = async ({
236
267
  onFrame,
237
268
  onError,
238
269
  controller,
@@ -277,6 +308,13 @@ var internalCreateVideoDecoder = ({
277
308
  if (controller) {
278
309
  controller._internals._mediaParserController._internals.signal.addEventListener("abort", onAbort);
279
310
  }
311
+ const isConfigSupported = await VideoDecoder.isConfigSupported(config);
312
+ if (!isConfigSupported) {
313
+ throw new VideoUndecodableError({
314
+ message: "Video cannot be decoded by this browser",
315
+ config
316
+ });
317
+ }
280
318
  videoDecoder.configure(config);
281
319
  const decode = async (sample) => {
282
320
  if (videoDecoder.state === "closed") {
@@ -387,7 +425,7 @@ var internalExtractFrames = ({
387
425
  throw new Error("expected at least one timestamp to extract but found zero");
388
426
  }
389
427
  controller.seek(timestampTargets[0]);
390
- const decoder = createVideoDecoder({
428
+ const decoder = await createVideoDecoder({
391
429
  onFrame: (frame) => {
392
430
  Log.trace(logLevel, "Received frame with timestamp", frame.timestamp);
393
431
  if (expectedFrames.length === 0) {
@@ -69,11 +69,11 @@ const getPartialAudioData = async ({ src, fromSeconds, toSeconds, channelIndex,
69
69
  acknowledgeRemotionLicense: true,
70
70
  src,
71
71
  controller,
72
- onAudioTrack: ({ track }) => {
72
+ onAudioTrack: async ({ track }) => {
73
73
  if (signal.aborted) {
74
74
  return null;
75
75
  }
76
- const audioDecoder = (0, create_audio_decoder_1.createAudioDecoder)({
76
+ const audioDecoder = await (0, create_audio_decoder_1.createAudioDecoder)({
77
77
  track,
78
78
  onFrame: (sample) => {
79
79
  if (signal.aborted) {
package/dist/index.d.ts CHANGED
@@ -28,6 +28,7 @@ export type { AudioOperation, ConvertMediaOnAudioTrackHandler, } from './on-audi
28
28
  export type { ConvertMediaOnVideoTrackHandler, VideoOperation, } from './on-video-track-handler';
29
29
  export type { ResizeOperation } from './resizing/mode';
30
30
  export { rotateAndResizeVideoFrame } from './rotate-and-resize-video-frame';
31
+ export { AudioUndecodableError, VideoUndecodableError, } from './undecodable-error';
31
32
  export { createVideoEncoder } from './video-encoder';
32
33
  export type { WebCodecsVideoEncoder } from './video-encoder';
33
34
  export { webcodecsController } from './webcodecs-controller';
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.WebCodecsInternals = exports.webcodecsController = exports.createVideoEncoder = exports.rotateAndResizeVideoFrame = exports.getPartialAudioData = exports.getDefaultVideoCodec = exports.getDefaultAudioCodec = exports.getAvailableVideoCodecs = exports.getAvailableContainers = exports.getAvailableAudioCodecs = exports.extractFrames = exports.defaultOnVideoTrackHandler = exports.defaultOnAudioTrackHandler = exports.createVideoDecoder = exports.createAudioDecoder = exports.convertMedia = exports.convertAudioData = exports.canReencodeVideoTrack = exports.canReencodeAudioTrack = exports.canCopyVideoTrack = exports.canCopyAudioTrack = exports.createAudioEncoder = void 0;
3
+ exports.WebCodecsInternals = exports.webcodecsController = exports.createVideoEncoder = exports.VideoUndecodableError = exports.AudioUndecodableError = exports.rotateAndResizeVideoFrame = exports.getPartialAudioData = exports.getDefaultVideoCodec = exports.getDefaultAudioCodec = exports.getAvailableVideoCodecs = exports.getAvailableContainers = exports.getAvailableAudioCodecs = exports.extractFrames = exports.defaultOnVideoTrackHandler = exports.defaultOnAudioTrackHandler = exports.createVideoDecoder = exports.createAudioDecoder = exports.convertMedia = exports.convertAudioData = exports.canReencodeVideoTrack = exports.canReencodeAudioTrack = exports.canCopyVideoTrack = exports.canCopyAudioTrack = exports.createAudioEncoder = void 0;
4
4
  const rotate_and_resize_video_frame_1 = require("./rotate-and-resize-video-frame");
5
5
  const rotation_1 = require("./rotation");
6
6
  const set_remotion_imported_1 = require("./set-remotion-imported");
@@ -42,6 +42,9 @@ var get_partial_audio_data_1 = require("./get-partial-audio-data");
42
42
  Object.defineProperty(exports, "getPartialAudioData", { enumerable: true, get: function () { return get_partial_audio_data_1.getPartialAudioData; } });
43
43
  var rotate_and_resize_video_frame_2 = require("./rotate-and-resize-video-frame");
44
44
  Object.defineProperty(exports, "rotateAndResizeVideoFrame", { enumerable: true, get: function () { return rotate_and_resize_video_frame_2.rotateAndResizeVideoFrame; } });
45
+ var undecodable_error_1 = require("./undecodable-error");
46
+ Object.defineProperty(exports, "AudioUndecodableError", { enumerable: true, get: function () { return undecodable_error_1.AudioUndecodableError; } });
47
+ Object.defineProperty(exports, "VideoUndecodableError", { enumerable: true, get: function () { return undecodable_error_1.VideoUndecodableError; } });
45
48
  var video_encoder_1 = require("./video-encoder");
46
49
  Object.defineProperty(exports, "createVideoEncoder", { enumerable: true, get: function () { return video_encoder_1.createVideoEncoder; } });
47
50
  var webcodecs_controller_1 = require("./webcodecs-controller");
@@ -38,7 +38,7 @@ const internalExtractFrames = ({ src, onFrame, signal, timestampsInSeconds, ackn
38
38
  throw new Error('expected at least one timestamp to extract but found zero');
39
39
  }
40
40
  controller.seek(timestampTargets[0]);
41
- const decoder = (0, create_video_decoder_1.createVideoDecoder)({
41
+ const decoder = await (0, create_video_decoder_1.createVideoDecoder)({
42
42
  onFrame: (frame) => {
43
43
  log_1.Log.trace(logLevel, 'Received frame with timestamp', frame.timestamp);
44
44
  if (expectedFrames.length === 0) {
@@ -129,7 +129,7 @@ const reencodeAudioTrack = async ({ audioOperation, track, logLevel, abortConver
129
129
  newAudioData.close();
130
130
  },
131
131
  });
132
- const audioDecoder = (0, create_audio_decoder_1.internalCreateAudioDecoder)({
132
+ const audioDecoder = await (0, create_audio_decoder_1.internalCreateAudioDecoder)({
133
133
  onFrame: async (audioData) => {
134
134
  await controller._internals._mediaParserController._internals.checkForAbortAndPause();
135
135
  await audioProcessingQueue.ioSynchronizer.waitForQueueSize(10);
@@ -111,7 +111,7 @@ const reencodeVideoTrack = async ({ videoOperation, rotate, track, logLevel, abo
111
111
  videoProcessingQueue.input(frame);
112
112
  },
113
113
  });
114
- const videoDecoder = (0, create_video_decoder_1.createVideoDecoder)({
114
+ const videoDecoder = await (0, create_video_decoder_1.createVideoDecoder)({
115
115
  track: videoDecoderConfig,
116
116
  onFrame: async (frame) => {
117
117
  await frameSorter.waitUntilProcessed();
@@ -0,0 +1,14 @@
1
+ export declare class VideoUndecodableError extends Error {
2
+ config: VideoDecoderConfig;
3
+ constructor({ message, config, }: {
4
+ message: string;
5
+ config: VideoDecoderConfig;
6
+ });
7
+ }
8
+ export declare class AudioUndecodableError extends Error {
9
+ config: AudioDecoderConfig;
10
+ constructor({ message, config, }: {
11
+ message: string;
12
+ config: AudioDecoderConfig;
13
+ });
14
+ }
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AudioUndecodableError = exports.VideoUndecodableError = void 0;
4
+ class VideoUndecodableError extends Error {
5
+ constructor({ message, config, }) {
6
+ super(message);
7
+ this.name = 'VideoUndecodableError';
8
+ this.config = config;
9
+ if (Error.captureStackTrace) {
10
+ Error.captureStackTrace(this, VideoUndecodableError);
11
+ }
12
+ }
13
+ }
14
+ exports.VideoUndecodableError = VideoUndecodableError;
15
+ class AudioUndecodableError extends Error {
16
+ constructor({ message, config, }) {
17
+ super(message);
18
+ this.name = 'AudioUndecodableError';
19
+ this.config = config;
20
+ if (Error.captureStackTrace) {
21
+ Error.captureStackTrace(this, AudioUndecodableError);
22
+ }
23
+ }
24
+ }
25
+ exports.AudioUndecodableError = AudioUndecodableError;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remotion/webcodecs",
3
- "version": "4.0.332",
3
+ "version": "4.0.333",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "module": "dist/esm/index.mjs",
@@ -19,8 +19,8 @@
19
19
  "author": "Jonny Burger <jonny@remotion.dev>",
20
20
  "license": "Remotion License (See https://remotion.dev/docs/webcodecs#license)",
21
21
  "dependencies": {
22
- "@remotion/media-parser": "4.0.332",
23
- "@remotion/licensing": "4.0.332"
22
+ "@remotion/licensing": "4.0.333",
23
+ "@remotion/media-parser": "4.0.333"
24
24
  },
25
25
  "peerDependencies": {},
26
26
  "devDependencies": {
@@ -29,8 +29,8 @@
29
29
  "vite": "5.4.19",
30
30
  "@playwright/test": "1.51.1",
31
31
  "eslint": "9.19.0",
32
- "@remotion/example-videos": "4.0.332",
33
- "@remotion/eslint-config-internal": "4.0.332"
32
+ "@remotion/eslint-config-internal": "4.0.333",
33
+ "@remotion/example-videos": "4.0.333"
34
34
  },
35
35
  "keywords": [],
36
36
  "publishConfig": {