@remotion/webcodecs 4.0.306 → 4.0.308

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.
@@ -28,14 +28,23 @@ const getBytesPerSample = (sampleFormat) => {
28
28
  }
29
29
  throw new Error(`Unsupported sample format: ${sampleFormat}`);
30
30
  };
31
+ const getAudioData = (audioSample) => {
32
+ if (audioSample instanceof EncodedAudioChunk) {
33
+ const data = new Uint8Array(audioSample.byteLength);
34
+ audioSample.copyTo(data);
35
+ return data;
36
+ }
37
+ return audioSample.data;
38
+ };
31
39
  const getWaveAudioDecoder = ({ onFrame, config, sampleFormat, ioSynchronizer, onError, }) => {
32
40
  const processSample = async (audioSample) => {
33
41
  const bytesPerSample = getBytesPerSample(sampleFormat);
42
+ const data = getAudioData(audioSample);
34
43
  const audioData = new AudioData({
35
- data: audioSample.data,
44
+ data,
36
45
  format: sampleFormat,
37
46
  numberOfChannels: config.numberOfChannels,
38
- numberOfFrames: audioSample.data.byteLength / bytesPerSample / config.numberOfChannels,
47
+ numberOfFrames: data.byteLength / bytesPerSample / config.numberOfChannels,
39
48
  sampleRate: config.sampleRate,
40
49
  timestamp: audioSample.timestamp,
41
50
  });
@@ -52,11 +61,11 @@ const getWaveAudioDecoder = ({ onFrame, config, sampleFormat, ioSynchronizer, on
52
61
  return Promise.resolve();
53
62
  },
54
63
  decode(audioSample) {
55
- processSample(audioSample);
64
+ return processSample(audioSample);
56
65
  },
57
66
  flush: () => Promise.resolve(),
58
- waitForFinish: () => Promise.resolve(),
59
67
  waitForQueueToBeLessThan: ioSynchronizer.waitForQueueSize,
68
+ reset: () => { },
60
69
  };
61
70
  };
62
71
  exports.getWaveAudioDecoder = getWaveAudioDecoder;
package/dist/index.d.ts CHANGED
@@ -1,5 +1,3 @@
1
- export { createAudioDecoder } from './audio-decoder';
2
- export type { WebCodecsAudioDecoder } from './audio-decoder';
3
1
  export { createAudioEncoder } from './audio-encoder';
4
2
  export type { WebCodecsAudioEncoder } from './audio-encoder';
5
3
  export { canCopyAudioTrack } from './can-copy-audio-track';
@@ -9,6 +7,10 @@ export { canReencodeVideoTrack } from './can-reencode-video-track';
9
7
  export { convertAudioData, ConvertAudioDataOptions } from './convert-audiodata';
10
8
  export { convertMedia } from './convert-media';
11
9
  export type { ConvertMediaOnAudioData, ConvertMediaOnProgress, ConvertMediaOnVideoFrame, ConvertMediaProgress, ConvertMediaResult, } from './convert-media';
10
+ export { createAudioDecoder } from './create-audio-decoder';
11
+ export type { WebCodecsAudioDecoder } from './create-audio-decoder';
12
+ export { createVideoDecoder } from './create-video-decoder';
13
+ export type { WebCodecsVideoDecoder } from './create-video-decoder';
12
14
  export { defaultOnAudioTrackHandler } from './default-on-audio-track-handler';
13
15
  export { defaultOnVideoTrackHandler } from './default-on-video-track-handler';
14
16
  export { getAvailableAudioCodecs } from './get-available-audio-codecs';
@@ -22,8 +24,6 @@ export { getDefaultVideoCodec } from './get-default-video-codec';
22
24
  export type { AudioOperation, ConvertMediaOnAudioTrackHandler, } from './on-audio-track-handler';
23
25
  export type { ConvertMediaOnVideoTrackHandler, VideoOperation, } from './on-video-track-handler';
24
26
  export type { ResizeOperation } from './resizing/mode';
25
- export { createVideoDecoder } from './video-decoder';
26
- export type { WebCodecsVideoDecoder } from './video-decoder';
27
27
  export { createVideoEncoder } from './video-encoder';
28
28
  export type { WebCodecsVideoEncoder } from './video-encoder';
29
29
  export { webcodecsController } from './webcodecs-controller';
package/dist/index.js CHANGED
@@ -1,11 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.WebCodecsInternals = exports.webcodecsController = exports.createVideoEncoder = exports.createVideoDecoder = exports.getDefaultVideoCodec = exports.getDefaultAudioCodec = exports.getAvailableVideoCodecs = exports.getAvailableContainers = exports.getAvailableAudioCodecs = exports.defaultOnVideoTrackHandler = exports.defaultOnAudioTrackHandler = exports.convertMedia = exports.convertAudioData = exports.canReencodeVideoTrack = exports.canReencodeAudioTrack = exports.canCopyVideoTrack = exports.canCopyAudioTrack = exports.createAudioEncoder = exports.createAudioDecoder = void 0;
3
+ exports.WebCodecsInternals = exports.webcodecsController = exports.createVideoEncoder = exports.getDefaultVideoCodec = exports.getDefaultAudioCodec = exports.getAvailableVideoCodecs = exports.getAvailableContainers = exports.getAvailableAudioCodecs = 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");
7
- var audio_decoder_1 = require("./audio-decoder");
8
- Object.defineProperty(exports, "createAudioDecoder", { enumerable: true, get: function () { return audio_decoder_1.createAudioDecoder; } });
9
7
  var audio_encoder_1 = require("./audio-encoder");
10
8
  Object.defineProperty(exports, "createAudioEncoder", { enumerable: true, get: function () { return audio_encoder_1.createAudioEncoder; } });
11
9
  var can_copy_audio_track_1 = require("./can-copy-audio-track");
@@ -20,6 +18,10 @@ var convert_audiodata_1 = require("./convert-audiodata");
20
18
  Object.defineProperty(exports, "convertAudioData", { enumerable: true, get: function () { return convert_audiodata_1.convertAudioData; } });
21
19
  var convert_media_1 = require("./convert-media");
22
20
  Object.defineProperty(exports, "convertMedia", { enumerable: true, get: function () { return convert_media_1.convertMedia; } });
21
+ var create_audio_decoder_1 = require("./create-audio-decoder");
22
+ Object.defineProperty(exports, "createAudioDecoder", { enumerable: true, get: function () { return create_audio_decoder_1.createAudioDecoder; } });
23
+ var create_video_decoder_1 = require("./create-video-decoder");
24
+ Object.defineProperty(exports, "createVideoDecoder", { enumerable: true, get: function () { return create_video_decoder_1.createVideoDecoder; } });
23
25
  var default_on_audio_track_handler_1 = require("./default-on-audio-track-handler");
24
26
  Object.defineProperty(exports, "defaultOnAudioTrackHandler", { enumerable: true, get: function () { return default_on_audio_track_handler_1.defaultOnAudioTrackHandler; } });
25
27
  var default_on_video_track_handler_1 = require("./default-on-video-track-handler");
@@ -34,8 +36,6 @@ var get_default_audio_codec_1 = require("./get-default-audio-codec");
34
36
  Object.defineProperty(exports, "getDefaultAudioCodec", { enumerable: true, get: function () { return get_default_audio_codec_1.getDefaultAudioCodec; } });
35
37
  var get_default_video_codec_1 = require("./get-default-video-codec");
36
38
  Object.defineProperty(exports, "getDefaultVideoCodec", { enumerable: true, get: function () { return get_default_video_codec_1.getDefaultVideoCodec; } });
37
- var video_decoder_1 = require("./video-decoder");
38
- Object.defineProperty(exports, "createVideoDecoder", { enumerable: true, get: function () { return video_decoder_1.createVideoDecoder; } });
39
39
  var video_encoder_1 = require("./video-encoder");
40
40
  Object.defineProperty(exports, "createVideoEncoder", { enumerable: true, get: function () { return video_encoder_1.createVideoEncoder; } });
41
41
  var webcodecs_controller_1 = require("./webcodecs-controller");
@@ -7,7 +7,6 @@ export declare const makeIoSynchronizer: ({ logLevel, label, controller, }: {
7
7
  }) => {
8
8
  inputItem: (timestamp: number) => void;
9
9
  onOutput: (timestamp: number) => void;
10
- waitForFinish: () => Promise<void>;
11
10
  waitForQueueSize: (queueSize: number) => Promise<void>;
12
11
  };
13
12
  export type IoSynchronizer = ReturnType<typeof makeIoSynchronizer>;
@@ -80,13 +80,9 @@ const makeIoSynchronizer = ({ logLevel, label, controller, }) => {
80
80
  controller._internals._mediaParserController._internals.signal.removeEventListener('abort', clear);
81
81
  }
82
82
  };
83
- const waitForFinish = async () => {
84
- await waitForQueueSize(0);
85
- };
86
83
  return {
87
84
  inputItem,
88
85
  onOutput,
89
- waitForFinish,
90
86
  waitForQueueSize,
91
87
  };
92
88
  };
@@ -0,0 +1,11 @@
1
+ import type { MediaParserAudioCodec, MediaParserVideoCodec } from '@remotion/media-parser';
2
+ import type { ConvertMediaAudioCodec } from './get-available-audio-codecs';
3
+ import type { ConvertMediaVideoCodec } from './get-available-video-codecs';
4
+ export declare const isSameVideoCodec: ({ inputVideoCodec, outputCodec, }: {
5
+ inputVideoCodec: MediaParserVideoCodec;
6
+ outputCodec: ConvertMediaVideoCodec;
7
+ }) => boolean;
8
+ export declare const isSameAudioCodec: ({ inputAudioCodec, outputCodec, }: {
9
+ inputAudioCodec: MediaParserAudioCodec;
10
+ outputCodec: ConvertMediaAudioCodec;
11
+ }) => boolean;
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isSameAudioCodec = exports.isSameVideoCodec = void 0;
4
+ const isSameVideoCodec = ({ inputVideoCodec, outputCodec, }) => {
5
+ if (outputCodec === 'h264') {
6
+ return inputVideoCodec === 'h264';
7
+ }
8
+ if (outputCodec === 'h265') {
9
+ return inputVideoCodec === 'h265';
10
+ }
11
+ if (outputCodec === 'vp8') {
12
+ return inputVideoCodec === 'vp8';
13
+ }
14
+ if (outputCodec === 'vp9') {
15
+ return inputVideoCodec === 'vp9';
16
+ }
17
+ throw new Error(`Unsupported output codec: ${outputCodec}`);
18
+ };
19
+ exports.isSameVideoCodec = isSameVideoCodec;
20
+ const isSameAudioCodec = ({ inputAudioCodec, outputCodec, }) => {
21
+ if (outputCodec === 'aac') {
22
+ return inputAudioCodec === 'aac';
23
+ }
24
+ if (outputCodec === 'opus') {
25
+ return inputAudioCodec === 'opus';
26
+ }
27
+ if (outputCodec === 'wav') {
28
+ return (inputAudioCodec === 'pcm-f32' ||
29
+ inputAudioCodec === 'pcm-s16' ||
30
+ inputAudioCodec === 'pcm-s24' ||
31
+ inputAudioCodec === 'pcm-s32' ||
32
+ inputAudioCodec === 'pcm-u8');
33
+ }
34
+ throw new Error(`Unsupported output codec: ${outputCodec}`);
35
+ };
36
+ exports.isSameAudioCodec = isSameAudioCodec;
@@ -11,6 +11,7 @@ const makeAudioTrackHandler = ({ state, defaultAudioCodec: audioCodec, controlle
11
11
  inputCodec: track.codecEnum,
12
12
  outputContainer,
13
13
  inputContainer,
14
+ outputAudioCodec: audioCodec,
14
15
  });
15
16
  const audioOperation = await (onAudioTrack ?? default_on_audio_track_handler_1.defaultOnAudioTrackHandler)({
16
17
  defaultAudioCodec: audioCodec ?? (0, get_default_audio_codec_1.getDefaultAudioCodec)({ container: outputContainer }),
@@ -16,6 +16,7 @@ const makeVideoTrackHandler = ({ state, onVideoFrame, onMediaStateUpdate, abortC
16
16
  rotationToApply: rotate,
17
17
  inputTrack: track,
18
18
  resizeOperation,
19
+ outputVideoCodec: defaultVideoCodec,
19
20
  });
20
21
  const videoOperation = await (onVideoTrack ?? default_on_video_track_handler_1.defaultOnVideoTrackHandler)({
21
22
  track,
@@ -12,7 +12,6 @@ export declare function processingQueue<T extends Processable>({ onOutput, logLe
12
12
  ioSynchronizer: {
13
13
  inputItem: (timestamp: number) => void;
14
14
  onOutput: (timestamp: number) => void;
15
- waitForFinish: () => Promise<void>;
16
15
  waitForQueueSize: (queueSize: number) => Promise<void>;
17
16
  };
18
17
  };
@@ -2,11 +2,11 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.reencodeAudioTrack = void 0;
4
4
  const media_parser_1 = require("@remotion/media-parser");
5
- const audio_decoder_1 = require("./audio-decoder");
6
5
  const audio_decoder_config_1 = require("./audio-decoder-config");
7
6
  const audio_encoder_1 = require("./audio-encoder");
8
7
  const audio_encoder_config_1 = require("./audio-encoder-config");
9
8
  const convert_encoded_chunk_1 = require("./convert-encoded-chunk");
9
+ const create_audio_decoder_1 = require("./create-audio-decoder");
10
10
  const log_1 = require("./log");
11
11
  const processing_queue_1 = require("./processing-queue");
12
12
  const reencodeAudioTrack = async ({ audioOperation, track, logLevel, abortConversion, state, controller, onMediaStateUpdate, onAudioData, progressTracker, }) => {
@@ -129,7 +129,7 @@ const reencodeAudioTrack = async ({ audioOperation, track, logLevel, abortConver
129
129
  newAudioData.close();
130
130
  },
131
131
  });
132
- const audioDecoder = (0, audio_decoder_1.internalCreateAudioDecoder)({
132
+ const audioDecoder = (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);
@@ -145,10 +145,10 @@ const reencodeAudioTrack = async ({ audioOperation, track, logLevel, abortConver
145
145
  logLevel,
146
146
  });
147
147
  state.addWaitForFinishPromise(async () => {
148
- await audioDecoder.waitForFinish();
148
+ await audioDecoder.waitForQueueToBeLessThan(0);
149
149
  log_1.Log.verbose(logLevel, 'Audio decoder finished');
150
150
  audioDecoder.close();
151
- await audioProcessingQueue.ioSynchronizer.waitForFinish();
151
+ await audioProcessingQueue.ioSynchronizer.waitForQueueSize(0);
152
152
  log_1.Log.verbose(logLevel, 'Audio processing queue finished');
153
153
  await audioEncoder.waitForFinish();
154
154
  log_1.Log.verbose(logLevel, 'Audio encoder finished');
@@ -3,12 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.reencodeVideoTrack = void 0;
4
4
  const arraybuffer_to_uint8_array_1 = require("./arraybuffer-to-uint8-array");
5
5
  const convert_encoded_chunk_1 = require("./convert-encoded-chunk");
6
+ const create_video_decoder_1 = require("./create-video-decoder");
6
7
  const log_1 = require("./log");
7
8
  const on_frame_1 = require("./on-frame");
8
9
  const processing_queue_1 = require("./processing-queue");
9
10
  const rotation_1 = require("./rotation");
10
11
  const sort_video_frames_1 = require("./sort-video-frames");
11
- const video_decoder_1 = require("./video-decoder");
12
12
  const video_decoder_config_1 = require("./video-decoder-config");
13
13
  const video_encoder_1 = require("./video-encoder");
14
14
  const video_encoder_config_1 = require("./video-encoder-config");
@@ -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, video_decoder_1.createVideoDecoder)({
114
+ const videoDecoder = (0, create_video_decoder_1.createVideoDecoder)({
115
115
  track: videoDecoderConfig,
116
116
  onFrame: async (frame) => {
117
117
  await frameSorter.waitUntilProcessed();
@@ -127,12 +127,12 @@ const reencodeVideoTrack = async ({ videoOperation, rotate, track, logLevel, abo
127
127
  });
128
128
  state.addWaitForFinishPromise(async () => {
129
129
  log_1.Log.verbose(logLevel, 'Waiting for video decoder to finish');
130
- await videoDecoder.waitForFinish();
130
+ await videoDecoder.waitForQueueToBeLessThan(0);
131
131
  videoDecoder.close();
132
132
  log_1.Log.verbose(logLevel, 'Video decoder finished. Waiting for encoder to finish');
133
133
  await frameSorter.flush();
134
134
  log_1.Log.verbose(logLevel, 'Frame sorter flushed');
135
- await videoProcessingQueue.ioSynchronizer.waitForFinish();
135
+ await videoProcessingQueue.ioSynchronizer.waitForQueueSize(0);
136
136
  log_1.Log.verbose(logLevel, 'Video processing queue finished');
137
137
  await videoEncoder.waitForFinish();
138
138
  videoEncoder.close();
@@ -66,7 +66,7 @@ const createVideoEncoder = ({ onChunk, onError, controller, config, logLevel, ou
66
66
  },
67
67
  waitForFinish: async () => {
68
68
  await encoder.flush();
69
- await ioSynchronizer.waitForFinish();
69
+ await ioSynchronizer.waitForQueueSize(0);
70
70
  },
71
71
  close,
72
72
  flush: async () => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remotion/webcodecs",
3
- "version": "4.0.306",
3
+ "version": "4.0.308",
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.306",
23
- "@remotion/licensing": "4.0.306"
22
+ "@remotion/media-parser": "4.0.308",
23
+ "@remotion/licensing": "4.0.308"
24
24
  },
25
25
  "peerDependencies": {},
26
26
  "devDependencies": {
@@ -28,8 +28,8 @@
28
28
  "playwright": "1.51.1",
29
29
  "@playwright/test": "1.51.1",
30
30
  "eslint": "9.19.0",
31
- "@remotion/example-videos": "4.0.306",
32
- "@remotion/eslint-config-internal": "4.0.306"
31
+ "@remotion/example-videos": "4.0.308",
32
+ "@remotion/eslint-config-internal": "4.0.308"
33
33
  },
34
34
  "keywords": [],
35
35
  "publishConfig": {
@@ -1,2 +0,0 @@
1
- import type { ConvertMediaContainer } from './get-available-containers';
2
- export declare const createMedia: (container: ConvertMediaContainer) => ({ writer, onBytesProgress, onMillisecondsProgress, logLevel, filename, progressTracker, expectedDurationInSeconds, expectedFrameRate, }: import("./create/media-fn").MediaFnGeneratorInput) => Promise<import("./create/media-fn").MediaFn>;
@@ -1,19 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createMedia = void 0;
4
- const create_iso_base_media_1 = require("./create/iso-base-media/create-iso-base-media");
5
- const create_matroska_media_1 = require("./create/matroska/create-matroska-media");
6
- const create_wav_1 = require("./create/wav/create-wav");
7
- const createMedia = (container) => {
8
- if (container === 'mp4') {
9
- return create_iso_base_media_1.createIsoBaseMedia;
10
- }
11
- if (container === 'wav') {
12
- return create_wav_1.createWav;
13
- }
14
- if (container === 'webm') {
15
- return create_matroska_media_1.createMatroskaMedia;
16
- }
17
- throw new Error(`Unsupported container: ${container}`);
18
- };
19
- exports.createMedia = createMedia;